From 8a272f00a0eb100a1d1527eb895ba6cf5074045a Mon Sep 17 00:00:00 2001 From: Tim Northover Date: Sat, 29 Mar 2014 08:22:20 +0000 Subject: [PATCH] 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 --- include/llvm/MC/MCValue.h | 19 +++++++++++++++---- lib/MC/MCValue.cpp | 5 +++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/include/llvm/MC/MCValue.h b/include/llvm/MC/MCValue.h index a4e73011148..f4ea5113f42 100644 --- a/include/llvm/MC/MCValue.h +++ b/include/llvm/MC/MCValue.h @@ -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; } diff --git a/lib/MC/MCValue.cpp b/lib/MC/MCValue.cpp index 4393777211e..68ecffbeab1 100644 --- a/lib/MC/MCValue.cpp +++ b/lib/MC/MCValue.cpp @@ -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()) { -- 2.11.0