/// a memory access references the functions stack frame (e.g., a spill slot),
/// below the stack frame (e.g., argument space), or constant pool.
class PseudoSourceValue {
+public:
+ enum PSVKind { Stack, GOT, JumpTable, ConstantPool, FixedStack, MipsPSV };
+
private:
+ PSVKind Kind;
+
friend class MachineMemOperand; // For printCustom().
/// Implement printing for PseudoSourceValue. This is called from
virtual void printCustom(raw_ostream &O) const;
public:
- /// Whether this is a FixedStackPseudoSourceValue.
- bool IsFixed;
-
- explicit PseudoSourceValue(bool IsFixed = false);
+ explicit PseudoSourceValue(PSVKind Kind);
virtual ~PseudoSourceValue();
+ PSVKind kind() const { return Kind; }
+
+ bool isStack() const { return Kind == Stack; }
+ bool isGOT() const { return Kind == GOT; }
+ bool isConstantPool() const { return Kind == ConstantPool; }
+ bool isJumpTable() const { return Kind == JumpTable; }
+
/// Test whether the memory pointed to by this PseudoSourceValue has a
/// constant value.
virtual bool isConstant(const MachineFrameInfo *) const;
public:
explicit FixedStackPseudoSourceValue(int FI)
- : PseudoSourceValue(true), FI(FI) {}
+ : PseudoSourceValue(FixedStack), FI(FI) {}
static inline bool classof(const PseudoSourceValue *V) {
- return V->IsFixed == true;
+ return V->kind() == FixedStack;
}
bool isConstant(const MachineFrameInfo *MFI) const override;
namespace {
struct PSVGlobalsTy {
// PseudoSourceValues are immutable so don't need locking.
- const PseudoSourceValue PSVs[4];
+ const PseudoSourceValue StackPSV, GOTPSV, JumpTablePSV, ConstantPoolPSV;
sys::Mutex Lock; // Guards FSValues, but not the values inside it.
std::map<int, const PseudoSourceValue *> FSValues;
- PSVGlobalsTy() : PSVs() {}
+ PSVGlobalsTy()
+ : StackPSV(PseudoSourceValue::Stack), GOTPSV(PseudoSourceValue::GOT),
+ JumpTablePSV(PseudoSourceValue::JumpTable),
+ ConstantPoolPSV(PseudoSourceValue::ConstantPool) {}
~PSVGlobalsTy() {
for (std::map<int, const PseudoSourceValue *>::iterator
I = FSValues.begin(),
} // anonymous namespace
const PseudoSourceValue *PseudoSourceValue::getStack() {
- return &PSVGlobals->PSVs[0];
+ return &PSVGlobals->StackPSV;
}
const PseudoSourceValue *PseudoSourceValue::getGOT() {
- return &PSVGlobals->PSVs[1];
+ return &PSVGlobals->GOTPSV;
}
const PseudoSourceValue *PseudoSourceValue::getJumpTable() {
- return &PSVGlobals->PSVs[2];
+ return &PSVGlobals->JumpTablePSV;
}
const PseudoSourceValue *PseudoSourceValue::getConstantPool() {
- return &PSVGlobals->PSVs[3];
+ return &PSVGlobals->ConstantPoolPSV;
}
-static const char *const PSVNames[] = {"Stack", "GOT", "JumpTable",
- "ConstantPool"};
+static const char *const PSVNames[] = {
+ "Stack", "GOT", "JumpTable", "ConstantPool", "FixedStack", "MipsCallEntry"};
-PseudoSourceValue::PseudoSourceValue(bool IsFixed) : IsFixed(IsFixed) {}
+PseudoSourceValue::PseudoSourceValue(PSVKind Kind) : Kind(Kind) {}
PseudoSourceValue::~PseudoSourceValue() {}
void PseudoSourceValue::printCustom(raw_ostream &O) const {
- O << PSVNames[this - PSVGlobals->PSVs];
+ O << PSVNames[Kind];
}
const PseudoSourceValue *PseudoSourceValue::getFixedStack(int FI) {
}
bool PseudoSourceValue::isConstant(const MachineFrameInfo *) const {
- if (this == getStack())
+ if (isStack())
return false;
- if (this == getGOT() || this == getConstantPool() || this == getJumpTable())
+ if (isGOT() || isConstantPool() || isJumpTable())
return true;
llvm_unreachable("Unknown PseudoSourceValue!");
}
-bool PseudoSourceValue::isAliased(const MachineFrameInfo *MFI) const {
- if (this == getStack() || this == getGOT() || this == getConstantPool() ||
- this == getJumpTable())
+bool PseudoSourceValue::isAliased(const MachineFrameInfo *) const {
+ if (isStack() || isGOT() || isConstantPool() || isJumpTable())
return false;
llvm_unreachable("Unknown PseudoSourceValue!");
}
-bool PseudoSourceValue::mayAlias(const MachineFrameInfo *MFI) const {
- if (this == getGOT() || this == getConstantPool() || this == getJumpTable())
+bool PseudoSourceValue::mayAlias(const MachineFrameInfo *) const {
+ if (isGOT() || isConstantPool() || isJumpTable())
return false;
return true;
}