[llvm-commits] [llvm] r95709 - /llvm/trunk/lib/Target/X86/X86CodeEmitter.cpp

Daniel Dunbar daniel at zuster.org
Tue Feb 9 15:00:03 PST 2010


Author: ddunbar
Date: Tue Feb  9 17:00:03 2010
New Revision: 95709

URL: http://llvm.org/viewvc/llvm-project?rev=95709&view=rev
Log:
MC/X86: Add a dummy implementation of MCFixup generation for hacky X86 MCCodeEmitter.

Modified:
    llvm/trunk/lib/Target/X86/X86CodeEmitter.cpp

Modified: llvm/trunk/lib/Target/X86/X86CodeEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86CodeEmitter.cpp?rev=95709&r1=95708&r2=95709&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/X86CodeEmitter.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86CodeEmitter.cpp Tue Feb  9 17:00:03 2010
@@ -647,6 +647,12 @@
       emitExternalSymbolAddress(MO.getSymbolName(), X86::reloc_pcrel_word);
       break;
     }
+
+    // FIXME: Only used by hackish MCCodeEmitter, remove when dead.
+    if (MO.isJTI()) {
+      emitJumpTableAddress(MO.getIndex(), X86::reloc_pcrel_word);
+      break;
+    }
     
     assert(MO.isImm() && "Unknown RawFrm operand!");
     if (Opcode == X86::CALLpcrel32 || Opcode == X86::CALL64pcrel32) {
@@ -872,11 +878,13 @@
 namespace {
 class MCSingleInstructionCodeEmitter : public MachineCodeEmitter {
   uint8_t Data[256];
+  SmallVectorImpl<MCFixup> *FixupList;
 
 public:
-  MCSingleInstructionCodeEmitter() { reset(); }
+  MCSingleInstructionCodeEmitter() { reset(0); }
 
-  void reset() { 
+  void reset(SmallVectorImpl<MCFixup> *Fixups) {
+    FixupList = Fixups;
     BufferBegin = Data;
     BufferEnd = array_endof(Data);
     CurBufferPtr = Data;
@@ -889,23 +897,50 @@
 
   virtual void startFunction(MachineFunction &F) {}
   virtual bool finishFunction(MachineFunction &F) { return false; }
-  virtual void emitLabel(uint64_t LabelID) {}
   virtual void StartMachineBasicBlock(MachineBasicBlock *MBB) {}
   virtual bool earlyResolveAddresses() const { return false; }
-  virtual void addRelocation(const MachineRelocation &MR) { }
+  virtual void addRelocation(const MachineRelocation &MR) {
+    unsigned Offset = 0, OpIndex = 0, Kind = MR.getRelocationType();
+
+    // This form is only used in one case, for branches.
+    if (MR.isBasicBlock()) {
+      Offset = unsigned(MR.getMachineCodeOffset());
+      OpIndex = 0;
+    } else {
+      assert(MR.isJumpTableIndex() && "Unexpected relocation!");
+
+      Offset = unsigned(MR.getMachineCodeOffset());
+
+      // The operand index is encoded as the first byte of the fake operand.
+      OpIndex = MR.getJumpTableIndex();
+    }
+
+    FixupList->push_back(MCFixup::Create(Offset, OpIndex,
+                                     MCFixupKind(FirstTargetFixupKind + Kind)));
+  }
+  virtual void setModuleInfo(MachineModuleInfo* Info) {}
+
+  // Interface functions which should never get called in our usage.
+
+  virtual void emitLabel(uint64_t LabelID) {
+    assert(0 && "Unexpected code emitter call!");
+  }
   virtual uintptr_t getConstantPoolEntryAddress(unsigned Index) const {
+    assert(0 && "Unexpected code emitter call!");
     return 0;
   }
   virtual uintptr_t getJumpTableEntryAddress(unsigned Index) const {
+    assert(0 && "Unexpected code emitter call!");
     return 0;
   }
   virtual uintptr_t getMachineBasicBlockAddress(MachineBasicBlock *MBB) const {
+    assert(0 && "Unexpected code emitter call!");
     return 0;
   }
   virtual uintptr_t getLabelAddress(uint64_t LabelID) const {
+    assert(0 && "Unexpected code emitter call!");
     return 0;
   }
-  virtual void setModuleInfo(MachineModuleInfo* Info) {}
 };
 
 class X86MCCodeEmitter : public MCCodeEmitter {
@@ -993,8 +1028,9 @@
       return true;
     }
 
-    // FIXME: Relocation / fixup.
-    Instr->addOperand(MachineOperand::CreateImm(0));
+    // Fake this as an external symbol to the code emitter to add a relcoation
+    // entry we will recognize.
+    Instr->addOperand(MachineOperand::CreateJTI(Start, 0));
     return true;
   }
 
@@ -1127,7 +1163,7 @@
       Instr->dump();
     }
 
-    InstrEmitter->reset();
+    InstrEmitter->reset(&Fixups);
     if (OK)
       Emit->emitInstruction(*Instr, &Desc);
     OS << InstrEmitter->str();





More information about the llvm-commits mailing list