1 //===-- llvm/CodeGen/PseudoSourceValue.cpp ----------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements the PseudoSourceValue class. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/CodeGen/MachineFrameInfo.h" 15 #include "llvm/CodeGen/PseudoSourceValue.h" 16 #include "llvm/DerivedTypes.h" 17 #include "llvm/Support/Compiler.h" 18 #include "llvm/Support/ErrorHandling.h" 19 #include "llvm/Support/ManagedStatic.h" 20 #include "llvm/Support/raw_ostream.h" 21 #include <map> 22 using namespace llvm; 23 24 static ManagedStatic<PseudoSourceValue[4]> PSVs; 25 26 const PseudoSourceValue *PseudoSourceValue::getStack() 27 { return &(*PSVs)[0]; } 28 const PseudoSourceValue *PseudoSourceValue::getGOT() 29 { return &(*PSVs)[1]; } 30 const PseudoSourceValue *PseudoSourceValue::getJumpTable() 31 { return &(*PSVs)[2]; } 32 const PseudoSourceValue *PseudoSourceValue::getConstantPool() 33 { return &(*PSVs)[3]; } 34 35 static const char *const PSVNames[] = { 36 "Stack", 37 "GOT", 38 "JumpTable", 39 "ConstantPool" 40 }; 41 42 // FIXME: THIS IS A HACK!!!! 43 // Eventually these should be uniqued on LLVMContext rather than in a managed 44 // static. For now, we can safely use the global context for the time being to 45 // squeak by. 46 PseudoSourceValue::PseudoSourceValue() : 47 Value(PointerType::getUnqual(Type::getInt8Ty(getGlobalContext())), 48 PseudoSourceValueVal) {} 49 50 void PseudoSourceValue::dump() const { 51 print(errs()); errs() << '\n'; 52 } 53 54 void PseudoSourceValue::print(raw_ostream &OS) const { 55 OS << PSVNames[this - *PSVs]; 56 } 57 58 namespace { 59 /// FixedStackPseudoSourceValue - A specialized PseudoSourceValue 60 /// for holding FixedStack values, which must include a frame 61 /// index. 62 class VISIBILITY_HIDDEN FixedStackPseudoSourceValue 63 : public PseudoSourceValue { 64 const int FI; 65 public: 66 explicit FixedStackPseudoSourceValue(int fi) : FI(fi) {} 67 68 virtual bool isConstant(const MachineFrameInfo *MFI) const; 69 70 virtual void print(raw_ostream &OS) const { 71 OS << "FixedStack" << FI; 72 } 73 }; 74 } 75 76 static ManagedStatic<std::map<int, const PseudoSourceValue *> > FSValues; 77 78 const PseudoSourceValue *PseudoSourceValue::getFixedStack(int FI) { 79 const PseudoSourceValue *&V = (*FSValues)[FI]; 80 if (!V) 81 V = new FixedStackPseudoSourceValue(FI); 82 return V; 83 } 84 85 bool PseudoSourceValue::isConstant(const MachineFrameInfo *) const { 86 if (this == getStack()) 87 return false; 88 if (this == getGOT() || 89 this == getConstantPool() || 90 this == getJumpTable()) 91 return true; 92 llvm_unreachable("Unknown PseudoSourceValue!"); 93 return false; 94 } 95 96 bool FixedStackPseudoSourceValue::isConstant(const MachineFrameInfo *MFI) const{ 97 return MFI && MFI->isImmutableObjectIndex(FI); 98 } 99