//===-- 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/MachineFrameInfo.h" #include "llvm/CodeGen/PseudoSourceValue.h" #include "llvm/DerivedTypes.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/raw_ostream.h" #include using namespace llvm; static ManagedStatic PSVs; const PseudoSourceValue *PseudoSourceValue::getStack() { return &(*PSVs)[0]; } const PseudoSourceValue *PseudoSourceValue::getGOT() { return &(*PSVs)[1]; } const PseudoSourceValue *PseudoSourceValue::getJumpTable() { return &(*PSVs)[2]; } const PseudoSourceValue *PseudoSourceValue::getConstantPool() { return &(*PSVs)[3]; } static const char *const PSVNames[] = { "Stack", "GOT", "JumpTable", "ConstantPool" }; PseudoSourceValue::PseudoSourceValue() : Value(PointerType::getUnqual(Type::Int8Ty), PseudoSourceValueVal) {} void PseudoSourceValue::print(raw_ostream &OS) const { OS << PSVNames[this - *PSVs]; } namespace { /// FixedStackPseudoSourceValue - A specialized PseudoSourceValue /// for holding FixedStack values, which must include a frame /// index. class VISIBILITY_HIDDEN FixedStackPseudoSourceValue : public PseudoSourceValue { const int FI; public: explicit FixedStackPseudoSourceValue(int fi) : FI(fi) {} virtual bool isConstant(const MachineFrameInfo *MFI) const; virtual void print(std::ostream &OS) const { OS << "FixedStack" << FI; } virtual void print(raw_ostream &OS) const { OS << "FixedStack" << FI; } }; } static ManagedStatic > FSValues; const PseudoSourceValue *PseudoSourceValue::getFixedStack(int FI) { const PseudoSourceValue *&V = (*FSValues)[FI]; if (!V) V = new FixedStackPseudoSourceValue(FI); return V; } bool PseudoSourceValue::isConstant(const MachineFrameInfo *) const { if (this == getStack()) return false; if (this == getGOT() || this == getConstantPool() || this == getJumpTable()) return true; assert(0 && "Unknown PseudoSourceValue!"); return false; } bool FixedStackPseudoSourceValue::isConstant(const MachineFrameInfo *MFI) const{ return MFI && MFI->isImmutableObjectIndex(FI); }