From f94cfb65f5b34cdb1bf9b7d59a1c1a65413a1920 Mon Sep 17 00:00:00 2001 From: "Michael J. Spencer" Date: Thu, 3 Jan 2013 01:09:22 +0000 Subject: [MC][COFF] Switch the COFF streamer over to using the MCObjectStreamer version of EmitInstruction. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171437 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/WinCOFFStreamer.cpp | 36 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 22 deletions(-) (limited to 'lib/MC/WinCOFFStreamer.cpp') diff --git a/lib/MC/WinCOFFStreamer.cpp b/lib/MC/WinCOFFStreamer.cpp index d12201a6ca..5489ef8d89 100644 --- a/lib/MC/WinCOFFStreamer.cpp +++ b/lib/MC/WinCOFFStreamer.cpp @@ -72,16 +72,25 @@ public: virtual void EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment); virtual void EmitFileDirective(StringRef Filename); - virtual void EmitInstruction(const MCInst &Instruction); virtual void EmitWin64EHHandlerData(); virtual void FinishImpl(); private: - virtual void EmitInstToFragment(const MCInst &Inst) { - llvm_unreachable("Not used by WinCOFF."); - } virtual void EmitInstToData(const MCInst &Inst) { - llvm_unreachable("Not used by WinCOFF."); + MCDataFragment *DF = getOrCreateDataFragment(); + + SmallVector Fixups; + SmallString<256> Code; + raw_svector_ostream VecOS(Code); + getAssembler().getEmitter().EncodeInstruction(Inst, VecOS, Fixups); + VecOS.flush(); + + // Add the fixups and data. + for (unsigned i = 0, e = Fixups.size(); i != e; ++i) { + Fixups[i].setOffset(Fixups[i].getOffset() + DF->getContents().size()); + DF->getFixups().push_back(Fixups[i]); + } + DF->getContents().append(Code.begin(), Code.end()); } void SetSection(StringRef Section, @@ -116,7 +125,6 @@ private: SectionKind::getBSS()); EmitCodeAlignment(4, 0); } - }; } // end anonymous namespace. @@ -334,22 +342,6 @@ void WinCOFFStreamer::EmitFileDirective(StringRef Filename) { // info will be a much large effort. } -void WinCOFFStreamer::EmitInstruction(const MCInst &Instruction) { - for (unsigned i = 0, e = Instruction.getNumOperands(); i != e; ++i) - if (Instruction.getOperand(i).isExpr()) - AddValueSymbols(Instruction.getOperand(i).getExpr()); - - getCurrentSectionData()->setHasInstructions(true); - - MCInstFragment *Fragment = - new MCInstFragment(Instruction, getCurrentSectionData()); - - raw_svector_ostream VecOS(Fragment->getContents()); - - getAssembler().getEmitter().EncodeInstruction(Instruction, VecOS, - Fragment->getFixups()); -} - void WinCOFFStreamer::EmitWin64EHHandlerData() { MCStreamer::EmitWin64EHHandlerData(); -- cgit v1.2.3