PseudoSourceValue.cpp revision 7afc3b7f03c1c226ad4d924b36a6d232999546e4
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/ManagedStatic.h" 19#include "llvm/Support/raw_ostream.h" 20#include <map> 21using namespace llvm; 22 23static ManagedStatic<PseudoSourceValue[4]> PSVs; 24 25const PseudoSourceValue *PseudoSourceValue::getStack() 26{ return &(*PSVs)[0]; } 27const PseudoSourceValue *PseudoSourceValue::getGOT() 28{ return &(*PSVs)[1]; } 29const PseudoSourceValue *PseudoSourceValue::getJumpTable() 30{ return &(*PSVs)[2]; } 31const PseudoSourceValue *PseudoSourceValue::getConstantPool() 32{ return &(*PSVs)[3]; } 33 34static const char *const PSVNames[] = { 35 "Stack", 36 "GOT", 37 "JumpTable", 38 "ConstantPool" 39}; 40 41PseudoSourceValue::PseudoSourceValue() : 42 Value(PointerType::getUnqual(Type::Int8Ty), PseudoSourceValueVal) {} 43 44void PseudoSourceValue::print(raw_ostream &OS) const { 45 OS << PSVNames[this - *PSVs]; 46} 47 48namespace { 49 /// FixedStackPseudoSourceValue - A specialized PseudoSourceValue 50 /// for holding FixedStack values, which must include a frame 51 /// index. 52 class VISIBILITY_HIDDEN FixedStackPseudoSourceValue 53 : public PseudoSourceValue { 54 const int FI; 55 public: 56 explicit FixedStackPseudoSourceValue(int fi) : FI(fi) {} 57 58 virtual bool isConstant(const MachineFrameInfo *MFI) const; 59 60 virtual void print(raw_ostream &OS) const { 61 OS << "FixedStack" << FI; 62 } 63 }; 64} 65 66static ManagedStatic<std::map<int, const PseudoSourceValue *> > FSValues; 67 68const PseudoSourceValue *PseudoSourceValue::getFixedStack(int FI) { 69 const PseudoSourceValue *&V = (*FSValues)[FI]; 70 if (!V) 71 V = new FixedStackPseudoSourceValue(FI); 72 return V; 73} 74 75bool PseudoSourceValue::isConstant(const MachineFrameInfo *) const { 76 if (this == getStack()) 77 return false; 78 if (this == getGOT() || 79 this == getConstantPool() || 80 this == getJumpTable()) 81 return true; 82 assert(0 && "Unknown PseudoSourceValue!"); 83 return false; 84} 85 86bool FixedStackPseudoSourceValue::isConstant(const MachineFrameInfo *MFI) const{ 87 return MFI && MFI->isImmutableObjectIndex(FI); 88} 89