MC: Switch MCFixup to just hold an MCExpr pointer instead of index into the
authorDaniel Dunbar <daniel@zuster.org>
Wed, 10 Feb 2010 04:47:08 +0000 (04:47 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 10 Feb 2010 04:47:08 +0000 (04:47 +0000)
MCInst it came from.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95767 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCFixup.h
lib/MC/MCAsmStreamer.cpp
lib/Target/X86/X86CodeEmitter.cpp

index 6763c054c05316d0e9f5e4438e50a9fc607d1572..f325d65500107fc541b61b9d0ff2f9e8ebe056e4 100644 (file)
@@ -13,6 +13,7 @@
 #include <cassert>
 
 namespace llvm {
+class MCExpr;
 
 // Private constants, do not use.
 //
@@ -25,10 +26,8 @@ namespace llvm {
 // end up needing more bits for target dependent kinds.
 enum {
   MCFIXUP_NUM_GENERIC_KINDS = 128,
-  MCFIXUP_NUM_KIND_BITS = 8,
-  MCFIXUP_NUM_OPINDEX_BITS = 8,
-  MCFIXUP_NUM_OFFSET_BITS = (32 - MCFIXUP_NUM_OPINDEX_BITS -
-                             MCFIXUP_NUM_OPINDEX_BITS)
+  MCFIXUP_NUM_KIND_BITS = 16,
+  MCFIXUP_NUM_OFFSET_BITS = (32 - MCFIXUP_NUM_KIND_BITS)
 };
 
 /// MCFixupKind - Extensible enumeration to represent the type of a fixup.
@@ -60,34 +59,36 @@ enum MCFixupKind {
 class MCFixup {
   static const unsigned MaxOffset = 1 << MCFIXUP_NUM_KIND_BITS;
 
+  /// The value to put into the fixup location. The exact interpretation of the
+  /// expression is target dependent, usually it will one of the operands to an
+  /// instruction or an assembler directive.
+  const MCExpr *Value;
+
   /// The byte index of start of the relocation inside the encoded instruction.
   unsigned Offset : MCFIXUP_NUM_OFFSET_BITS;
 
-  /// The index of the operand to encode into the instruction.
-  unsigned OpIndex : MCFIXUP_NUM_OPINDEX_BITS;
-
   /// The target dependent kind of fixup item this is. The kind is used to
   /// determine how the operand value should be encoded into the instruction.
   unsigned Kind : MCFIXUP_NUM_KIND_BITS;
 
 public:
-  static MCFixup Create(unsigned Offset, unsigned OpIndex, MCFixupKind Kind) {
+  static MCFixup Create(unsigned Offset, const MCExpr *Value,
+                        MCFixupKind Kind) {
     MCFixup FI;
+    FI.Value = Value;
     FI.Offset = Offset;
-    FI.OpIndex = OpIndex;
     FI.Kind = unsigned(Kind);
 
     assert(Offset == FI.getOffset() && "Offset out of range!");
-    assert(OpIndex == FI.getOpIndex() && "Operand index out of range!");
     assert(Kind == FI.getKind() && "Kind out of range!");
     return FI;
   }
 
-  unsigned getOffset() const { return Offset; }
+  MCFixupKind getKind() const { return MCFixupKind(Kind); }
 
-  unsigned getOpIndex() const { return OpIndex; }
+  unsigned getOffset() const { return Offset; }
 
-  MCFixupKind getKind() const { return MCFixupKind(Kind); }
+  const MCExpr *getValue() const { return Value; }
 };
 
 } // End llvm namespace
index 3e3d1e59ed3fde070ed092e290d15ae030ea9dfc..828377f42cc9c6217fff631b029296ab985384e0 100644 (file)
@@ -601,7 +601,7 @@ void MCAsmStreamer::AddEncodingComment(const MCInst &Inst) {
     MCFixup &F = Fixups[i];
     MCFixupKindInfo &Info = Emitter->getFixupKindInfo(F.getKind());
     OS << "  fixup " << char('A' + i) << " - " << "offset: " << F.getOffset()
-       << ", op: " << F.getOpIndex() << ", kind: " << Info.Name << "\n";
+       << ", value: " << *F.getValue() << ", kind: " << Info.Name << "\n";
   }
 }
 
index ae035640df0ad2e07bf0c91680309aa4c873f597..f0bceb1483f4cbd4eda410b5e366065e8f990bf7 100644 (file)
@@ -878,12 +878,14 @@ void Emitter<CodeEmitter>::emitInstruction(const MachineInstr &MI,
 namespace {
 class MCSingleInstructionCodeEmitter : public MachineCodeEmitter {
   uint8_t Data[256];
+  const MCInst *CurrentInst;
   SmallVectorImpl<MCFixup> *FixupList;
 
 public:
-  MCSingleInstructionCodeEmitter() { reset(0); }
+  MCSingleInstructionCodeEmitter() { reset(0, 0); }
 
-  void reset(SmallVectorImpl<MCFixup> *Fixups) {
+  void reset(const MCInst *Inst, SmallVectorImpl<MCFixup> *Fixups) {
+    CurrentInst = Inst;
     FixupList = Fixups;
     BufferBegin = Data;
     BufferEnd = array_endof(Data);
@@ -915,7 +917,9 @@ public:
       OpIndex = MR.getJumpTableIndex();
     }
 
-    FixupList->push_back(MCFixup::Create(Offset, OpIndex,
+    MCOperand Op = CurrentInst->getOperand(OpIndex);
+    assert(Op.isExpr() && "FIXME: Not yet implemented!");
+    FixupList->push_back(MCFixup::Create(Offset, Op.getExpr(),
                                      MCFixupKind(FirstTargetFixupKind + Kind)));
   }
   virtual void setModuleInfo(MachineModuleInfo* Info) {}
@@ -1163,7 +1167,7 @@ public:
       Instr->dump();
     }
 
-    InstrEmitter->reset(&Fixups);
+    InstrEmitter->reset(&MI, &Fixups);
     if (OK)
       Emit->emitInstruction(*Instr, &Desc);
     OS << InstrEmitter->str();