diff options
| -rw-r--r-- | llvm/lib/MC/MCAssembler.cpp | 7 | ||||
| -rw-r--r-- | llvm/lib/MC/MCMachOStreamer.cpp | 15 | 
2 files changed, 20 insertions, 2 deletions
diff --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp index b2c4112f484..c9748344944 100644 --- a/llvm/lib/MC/MCAssembler.cpp +++ b/llvm/lib/MC/MCAssembler.cpp @@ -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 bool isVirtualSection(const MCSection &Section) {  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;    } diff --git a/llvm/lib/MC/MCMachOStreamer.cpp b/llvm/lib/MC/MCMachOStreamer.cpp index 1801170ea03..0c9627d2127 100644 --- a/llvm/lib/MC/MCMachOStreamer.cpp +++ b/llvm/lib/MC/MCMachOStreamer.cpp @@ -382,12 +382,23 @@ void MCMachOStreamer::EmitInstruction(const MCInst &Inst) {    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() {  | 

