[llvm] r205085 - MC: add a RefKind field to MCValue

Tim Northover tnorthover at apple.com
Sat Mar 29 01:22:21 PDT 2014


Author: tnorthover
Date: Sat Mar 29 03:22:20 2014
New Revision: 205085

URL: http://llvm.org/viewvc/llvm-project?rev=205085&view=rev
Log:
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.

Modified:
    llvm/trunk/include/llvm/MC/MCValue.h
    llvm/trunk/lib/MC/MCValue.cpp

Modified: llvm/trunk/include/llvm/MC/MCValue.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCValue.h?rev=205085&r1=205084&r2=205085&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCValue.h (original)
+++ llvm/trunk/include/llvm/MC/MCValue.h Sat Mar 29 03:22:20 2014
@@ -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;
   }
 

Modified: llvm/trunk/lib/MC/MCValue.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCValue.cpp?rev=205085&r1=205084&r2=205085&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCValue.cpp (original)
+++ llvm/trunk/lib/MC/MCValue.cpp Sat Mar 29 03:22:20 2014
@@ -20,6 +20,11 @@ void MCValue::print(raw_ostream &OS, con
     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()) {





More information about the llvm-commits mailing list