| //===-- llvm/CodeGen/PseudoSourceValue.cpp ----------------------*- C++ -*-===// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file is distributed under the University of Illinois Open Source | 
 | // License. See LICENSE.TXT for details. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | // | 
 | // This file implements the PseudoSourceValue class. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #include "llvm/CodeGen/PseudoSourceValue.h" | 
 | #include "llvm/ADT/STLExtras.h" | 
 | #include "llvm/CodeGen/MachineFrameInfo.h" | 
 | #include "llvm/CodeGen/TargetInstrInfo.h" | 
 | #include "llvm/IR/DerivedTypes.h" | 
 | #include "llvm/IR/LLVMContext.h" | 
 | #include "llvm/Support/ErrorHandling.h" | 
 | #include "llvm/Support/raw_ostream.h" | 
 | using namespace llvm; | 
 |  | 
 | static const char *const PSVNames[] = { | 
 |     "Stack", "GOT", "JumpTable", "ConstantPool", "FixedStack", | 
 |     "GlobalValueCallEntry", "ExternalSymbolCallEntry"}; | 
 |  | 
 | PseudoSourceValue::PseudoSourceValue(PSVKind Kind, const TargetInstrInfo &TII) | 
 |     : Kind(Kind) { | 
 |   AddressSpace = TII.getAddressSpaceForPseudoSourceKind(Kind); | 
 | } | 
 |  | 
 |  | 
 | PseudoSourceValue::~PseudoSourceValue() {} | 
 |  | 
 | void PseudoSourceValue::printCustom(raw_ostream &O) const { | 
 |   if (Kind < TargetCustom) | 
 |     O << PSVNames[Kind]; | 
 |   else | 
 |     O << "TargetCustom" << Kind; | 
 | } | 
 |  | 
 | bool PseudoSourceValue::isConstant(const MachineFrameInfo *) const { | 
 |   if (isStack()) | 
 |     return false; | 
 |   if (isGOT() || isConstantPool() || isJumpTable()) | 
 |     return true; | 
 |   llvm_unreachable("Unknown PseudoSourceValue!"); | 
 | } | 
 |  | 
 | bool PseudoSourceValue::isAliased(const MachineFrameInfo *) const { | 
 |   if (isStack() || isGOT() || isConstantPool() || isJumpTable()) | 
 |     return false; | 
 |   llvm_unreachable("Unknown PseudoSourceValue!"); | 
 | } | 
 |  | 
 | bool PseudoSourceValue::mayAlias(const MachineFrameInfo *) const { | 
 |   return !(isGOT() || isConstantPool() || isJumpTable()); | 
 | } | 
 |  | 
 | bool FixedStackPseudoSourceValue::isConstant( | 
 |     const MachineFrameInfo *MFI) const { | 
 |   return MFI && MFI->isImmutableObjectIndex(FI); | 
 | } | 
 |  | 
 | bool FixedStackPseudoSourceValue::isAliased(const MachineFrameInfo *MFI) const { | 
 |   if (!MFI) | 
 |     return true; | 
 |   return MFI->isAliasedObjectIndex(FI); | 
 | } | 
 |  | 
 | bool FixedStackPseudoSourceValue::mayAlias(const MachineFrameInfo *MFI) const { | 
 |   if (!MFI) | 
 |     return true; | 
 |   // Spill slots will not alias any LLVM IR value. | 
 |   return !MFI->isSpillSlotObjectIndex(FI); | 
 | } | 
 |  | 
 | void FixedStackPseudoSourceValue::printCustom(raw_ostream &OS) const { | 
 |   OS << "FixedStack" << FI; | 
 | } | 
 |  | 
 | CallEntryPseudoSourceValue::CallEntryPseudoSourceValue( | 
 |     PSVKind Kind, const TargetInstrInfo &TII) | 
 |     : PseudoSourceValue(Kind, TII) {} | 
 |  | 
 | bool CallEntryPseudoSourceValue::isConstant(const MachineFrameInfo *) const { | 
 |   return false; | 
 | } | 
 |  | 
 | bool CallEntryPseudoSourceValue::isAliased(const MachineFrameInfo *) const { | 
 |   return false; | 
 | } | 
 |  | 
 | bool CallEntryPseudoSourceValue::mayAlias(const MachineFrameInfo *) const { | 
 |   return false; | 
 | } | 
 |  | 
 | GlobalValuePseudoSourceValue::GlobalValuePseudoSourceValue( | 
 |     const GlobalValue *GV, | 
 |     const TargetInstrInfo &TII) | 
 |     : CallEntryPseudoSourceValue(GlobalValueCallEntry, TII), GV(GV) {} | 
 | ExternalSymbolPseudoSourceValue::ExternalSymbolPseudoSourceValue( | 
 |     const char *ES, const TargetInstrInfo &TII) | 
 |     : CallEntryPseudoSourceValue(ExternalSymbolCallEntry, TII), ES(ES) {} | 
 |  | 
 | PseudoSourceValueManager::PseudoSourceValueManager( | 
 |     const TargetInstrInfo &TIInfo) | 
 |     : TII(TIInfo), | 
 |       StackPSV(PseudoSourceValue::Stack, TII), | 
 |       GOTPSV(PseudoSourceValue::GOT, TII), | 
 |       JumpTablePSV(PseudoSourceValue::JumpTable, TII), | 
 |       ConstantPoolPSV(PseudoSourceValue::ConstantPool, TII) {} | 
 |  | 
 | const PseudoSourceValue *PseudoSourceValueManager::getStack() { | 
 |   return &StackPSV; | 
 | } | 
 |  | 
 | const PseudoSourceValue *PseudoSourceValueManager::getGOT() { return &GOTPSV; } | 
 |  | 
 | const PseudoSourceValue *PseudoSourceValueManager::getConstantPool() { | 
 |   return &ConstantPoolPSV; | 
 | } | 
 |  | 
 | const PseudoSourceValue *PseudoSourceValueManager::getJumpTable() { | 
 |   return &JumpTablePSV; | 
 | } | 
 |  | 
 | const PseudoSourceValue * | 
 | PseudoSourceValueManager::getFixedStack(int FI) { | 
 |   std::unique_ptr<FixedStackPseudoSourceValue> &V = FSValues[FI]; | 
 |   if (!V) | 
 |     V = llvm::make_unique<FixedStackPseudoSourceValue>(FI, TII); | 
 |   return V.get(); | 
 | } | 
 |  | 
 | const PseudoSourceValue * | 
 | PseudoSourceValueManager::getGlobalValueCallEntry(const GlobalValue *GV) { | 
 |   std::unique_ptr<const GlobalValuePseudoSourceValue> &E = | 
 |       GlobalCallEntries[GV]; | 
 |   if (!E) | 
 |     E = llvm::make_unique<GlobalValuePseudoSourceValue>(GV, TII); | 
 |   return E.get(); | 
 | } | 
 |  | 
 | const PseudoSourceValue * | 
 | PseudoSourceValueManager::getExternalSymbolCallEntry(const char *ES) { | 
 |   std::unique_ptr<const ExternalSymbolPseudoSourceValue> &E = | 
 |       ExternalCallEntries[ES]; | 
 |   if (!E) | 
 |     E = llvm::make_unique<ExternalSymbolPseudoSourceValue>(ES, TII); | 
 |   return E.get(); | 
 | } |