X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FCodeGen%2FPseudoSourceValue.cpp;h=da54c69e36c616bff9685d71086b3d3f58e192e0;hb=fb62ba2fd3f0858fbc4c982211d112a1e93f683c;hp=e74479e7a18886e0bd0b10ecfa07a766a16b8620;hpb=bf125583f8bd8196a34921276add7f304b7c1433;p=oota-llvm.git diff --git a/lib/CodeGen/PseudoSourceValue.cpp b/lib/CodeGen/PseudoSourceValue.cpp index e74479e7a18..da54c69e36c 100644 --- a/lib/CodeGen/PseudoSourceValue.cpp +++ b/lib/CodeGen/PseudoSourceValue.cpp @@ -11,87 +11,134 @@ // //===----------------------------------------------------------------------===// -#include "llvm/CodeGen/MachineFrameInfo.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/CodeGen/PseudoSourceValue.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Support/Compiler.h" +#include "llvm/CodeGen/MachineFrameInfo.h" +#include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/LLVMContext.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ManagedStatic.h" +#include "llvm/Support/Mutex.h" #include "llvm/Support/raw_ostream.h" #include using namespace llvm; -static ManagedStatic PSVs; +static const char *const PSVNames[] = { + "Stack", "GOT", "JumpTable", "ConstantPool", "FixedStack", + "GlobalValueCallEntry", "ExternalSymbolCallEntry"}; -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]; } +PseudoSourceValue::PseudoSourceValue(PSVKind Kind) : Kind(Kind) {} -static const char *const PSVNames[] = { - "Stack", - "GOT", - "JumpTable", - "ConstantPool" -}; - -// FIXME: THIS IS A HACK!!!! -// Eventually these should be uniqued on LLVMContext rather than in a managed -// static. For now, we can safely use the global context for the time being to -// squeak by. -PseudoSourceValue::PseudoSourceValue() : - Value(Type::getInt8PtrTy(getGlobalContext()), - PseudoSourceValueVal) {} +PseudoSourceValue::~PseudoSourceValue() {} void PseudoSourceValue::printCustom(raw_ostream &O) const { - O << PSVNames[this - *PSVs]; + O << PSVNames[Kind]; } -namespace { - /// StackObjectPseudoSourceValue - A specialized PseudoSourceValue - /// for holding StackObject values, which must include a frame - /// index. - class VISIBILITY_HIDDEN StackObjectPseudoSourceValue - : public PseudoSourceValue { - const int FI; - public: - explicit StackObjectPseudoSourceValue(int fi) : FI(fi) {} +bool PseudoSourceValue::isConstant(const MachineFrameInfo *) const { + if (isStack()) + return false; + if (isGOT() || isConstantPool() || isJumpTable()) + return true; + llvm_unreachable("Unknown PseudoSourceValue!"); +} - virtual bool isConstant(const MachineFrameInfo *MFI) const; +bool PseudoSourceValue::isAliased(const MachineFrameInfo *) const { + if (isStack() || isGOT() || isConstantPool() || isJumpTable()) + return false; + llvm_unreachable("Unknown PseudoSourceValue!"); +} - virtual void printCustom(raw_ostream &OS) const { - if (FI < 0) - OS << "Fixed"; - OS << "StackObject" << FI; - } - }; +bool PseudoSourceValue::mayAlias(const MachineFrameInfo *) const { + if (isGOT() || isConstantPool() || isJumpTable()) + return false; + return true; } -static ManagedStatic > FSValues; +bool FixedStackPseudoSourceValue::isConstant( + const MachineFrameInfo *MFI) const { + return MFI && MFI->isImmutableObjectIndex(FI); +} -const PseudoSourceValue *PseudoSourceValue::getStackObject(int FI) { - const PseudoSourceValue *&V = (*FSValues)[FI]; - if (!V) - V = new StackObjectPseudoSourceValue(FI); - return V; +bool FixedStackPseudoSourceValue::isAliased(const MachineFrameInfo *MFI) const { + if (!MFI) + return true; + return MFI->isAliasedObjectIndex(FI); } -bool PseudoSourceValue::isConstant(const MachineFrameInfo *) const { - if (this == getStack()) - return false; - if (this == getGOT() || - this == getConstantPool() || - this == getJumpTable()) +bool FixedStackPseudoSourceValue::mayAlias(const MachineFrameInfo *MFI) const { + if (!MFI) return true; - llvm_unreachable("Unknown PseudoSourceValue!"); + // 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) + : PseudoSourceValue(Kind) {} + +bool CallEntryPseudoSourceValue::isConstant(const MachineFrameInfo *) const { return false; } -bool -StackObjectPseudoSourceValue::isConstant(const MachineFrameInfo *MFI) const { - return MFI && MFI->isImmutableObjectIndex(FI); +bool CallEntryPseudoSourceValue::isAliased(const MachineFrameInfo *) const { + return false; +} + +bool CallEntryPseudoSourceValue::mayAlias(const MachineFrameInfo *) const { + return false; +} + +GlobalValuePseudoSourceValue::GlobalValuePseudoSourceValue( + const GlobalValue *GV) + : CallEntryPseudoSourceValue(GlobalValueCallEntry), GV(GV) {} + +ExternalSymbolPseudoSourceValue::ExternalSymbolPseudoSourceValue(const char *ES) + : CallEntryPseudoSourceValue(ExternalSymbolCallEntry), ES(ES) {} + +PseudoSourceValueManager::PseudoSourceValueManager() + : StackPSV(PseudoSourceValue::Stack), GOTPSV(PseudoSourceValue::GOT), + JumpTablePSV(PseudoSourceValue::JumpTable), + ConstantPoolPSV(PseudoSourceValue::ConstantPool) {} + +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 &V = FSValues[FI]; + if (!V) + V = llvm::make_unique(FI); + return V.get(); +} + +const PseudoSourceValue * +PseudoSourceValueManager::getGlobalValueCallEntry(const GlobalValue *GV) { + std::unique_ptr &E = + GlobalCallEntries[GV]; + if (!E) + E = llvm::make_unique(GV); + return E.get(); +} + +const PseudoSourceValue * +PseudoSourceValueManager::getExternalSymbolCallEntry(const char *ES) { + std::unique_ptr &E = + ExternalCallEntries[ES]; + if (!E) + E = llvm::make_unique(ES); + return E.get(); }