[llvm-commits] [llvm] r96095 - in /llvm/trunk/lib/MC: MCAssembler.cpp MCMachOStreamer.cpp

Daniel Dunbar daniel at zuster.org
Sat Feb 13 01:29:02 PST 2010


Author: ddunbar
Date: Sat Feb 13 03:29:02 2010
New Revision: 96095

URL: http://llvm.org/viewvc/llvm-project?rev=96095&view=rev
Log:
MC/Mach-O: Start emitting fixups/relocations for instructions.

Modified:
    llvm/trunk/lib/MC/MCAssembler.cpp
    llvm/trunk/lib/MC/MCMachOStreamer.cpp

Modified: llvm/trunk/lib/MC/MCAssembler.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAssembler.cpp?rev=96095&r1=96094&r2=96095&view=diff

==============================================================================
--- llvm/trunk/lib/MC/MCAssembler.cpp (original)
+++ llvm/trunk/lib/MC/MCAssembler.cpp Sat Feb 13 03:29:02 2010
@@ -23,6 +23,10 @@
 #include "llvm/Support/MachO.h"
 #include "llvm/Support/raw_ostream.h"
 #include "llvm/Support/Debug.h"
+
+// FIXME: Gross.
+#include "../Target/X86/X86FixupKinds.h"
+
 #include <vector>
 using namespace llvm;
 
@@ -50,8 +54,11 @@
 static unsigned getFixupKindLog2Size(MCFixupKind Kind) {
   switch (Kind) {
   default: llvm_unreachable("invalid fixup kind!");
+  case X86::reloc_pcrel_1byte:
   case FK_Data_1: return 0;
   case FK_Data_2: return 1;
+  case X86::reloc_pcrel_4byte:
+  case X86::reloc_riprel_4byte:
   case FK_Data_4: return 2;
   case FK_Data_8: return 3;
   }

Modified: llvm/trunk/lib/MC/MCMachOStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCMachOStreamer.cpp?rev=96095&r1=96094&r2=96095&view=diff

==============================================================================
--- llvm/trunk/lib/MC/MCMachOStreamer.cpp (original)
+++ llvm/trunk/lib/MC/MCMachOStreamer.cpp Sat Feb 13 03:29:02 2010
@@ -382,12 +382,23 @@
 
   CurSectionData->setHasInstructions(true);
 
-  // FIXME: Relocations!
   SmallVector<MCFixup, 4> Fixups;
   SmallString<256> Code;
   raw_svector_ostream VecOS(Code);
   Emitter->EncodeInstruction(Inst, VecOS, Fixups);
-  EmitBytes(VecOS.str(), 0);
+  VecOS.flush();
+
+  // Add the fixups and data.
+  MCDataFragment *DF = dyn_cast_or_null<MCDataFragment>(getCurrentFragment());
+  if (!DF)
+    DF = new MCDataFragment(CurSectionData);
+  for (unsigned i = 0, e = Fixups.size(); i != e; ++i) {
+    MCFixup &F = Fixups[i];
+    DF->getFixups().push_back(MCAsmFixup(DF->getContents().size()+F.getOffset(),
+                                         *F.getValue(),
+                                         F.getKind()));
+  }
+  DF->getContents().append(Code.begin(), Code.end());
 }
 
 void MCMachOStreamer::Finish() {





More information about the llvm-commits mailing list