MC: add a RefKind field to MCValue

This is principally to allow neater mapping of fixups to relocations
in ARM64 ELF. Without this, there isn't enough information available
to GetRelocType, leading to many more fixup_arm64_... enumerators.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205085 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Tim Northover 2014-03-29 08:22:20 +00:00
parent 1330ee3189
commit 8a272f00a0
2 changed files with 20 additions and 4 deletions

View File

@ -24,9 +24,16 @@ class MCSymbol;
class MCSymbolRefExpr;
class raw_ostream;
/// MCValue - This represents an "assembler immediate". In its most general
/// form, this can hold "SymbolA - SymbolB + imm64". Not all targets supports
/// relocations of this general form, but we need to represent this anyway.
/// MCValue - This represents an "assembler immediate". In its most
/// general form, this can hold ":Kind:(SymbolA - SymbolB + imm64)".
/// Not all targets supports relocations of this general form, but we
/// need to represent this anyway.
///
/// In general both SymbolA and SymbolB will also have a modifier
/// analogous to the top-level Kind. Current targets are not expected
/// to make use of both though. The choice comes down to whether
/// relocation modifiers apply to the closest symbol or the whole
/// expression.
///
/// In the general form, SymbolB can only be defined if SymbolA is, and both
/// must be in the same (non-external) section. The latter constraint is not
@ -37,11 +44,13 @@ class raw_ostream;
class MCValue {
const MCSymbolRefExpr *SymA, *SymB;
int64_t Cst;
uint32_t RefKind;
public:
int64_t getConstant() const { return Cst; }
const MCSymbolRefExpr *getSymA() const { return SymA; }
const MCSymbolRefExpr *getSymB() const { return SymB; }
uint32_t getRefKind() const { return RefKind; }
/// isAbsolute - Is this an absolute (as opposed to relocatable) value.
bool isAbsolute() const { return !SymA && !SymB; }
@ -53,12 +62,13 @@ public:
void dump() const;
static MCValue get(const MCSymbolRefExpr *SymA, const MCSymbolRefExpr *SymB=0,
int64_t Val = 0) {
int64_t Val = 0, uint32_t RefKind = 0) {
MCValue R;
assert((!SymB || SymA) && "Invalid relocatable MCValue!");
R.Cst = Val;
R.SymA = SymA;
R.SymB = SymB;
R.RefKind = RefKind;
return R;
}
@ -67,6 +77,7 @@ public:
R.Cst = Val;
R.SymA = 0;
R.SymB = 0;
R.RefKind = 0;
return R;
}

View File

@ -20,6 +20,11 @@ void MCValue::print(raw_ostream &OS, const MCAsmInfo *MAI) const {
return;
}
// FIXME: prints as a number, which isn't ideal. But the meaning will be
// target-specific anyway.
if (getRefKind())
OS << ':' << getRefKind() << ':';
getSymA()->print(OS);
if (getSymB()) {