mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
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:
parent
1330ee3189
commit
8a272f00a0
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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()) {
|
||||
|
Loading…
Reference in New Issue
Block a user