diff options
Diffstat (limited to 'lib/CodeGen/PseudoSourceValue.cpp')
| -rw-r--r-- | lib/CodeGen/PseudoSourceValue.cpp | 92 | 
1 files changed, 92 insertions, 0 deletions
diff --git a/lib/CodeGen/PseudoSourceValue.cpp b/lib/CodeGen/PseudoSourceValue.cpp new file mode 100644 index 000000000000..b4c20e6bfd31 --- /dev/null +++ b/lib/CodeGen/PseudoSourceValue.cpp @@ -0,0 +1,92 @@ +//===-- 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 <map> +using namespace llvm; + +static ManagedStatic<PseudoSourceValue[4]> 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::dump() const { +  print(errs()); errs() << '\n'; +} + +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(raw_ostream &OS) const { +      OS << "FixedStack" << FI; +    } +  }; +} + +static ManagedStatic<std::map<int, const PseudoSourceValue *> > 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); +}  | 
