diff options
author | Michael J. Spencer <bigcheesegs@gmail.com> | 2013-01-03 01:09:22 +0000 |
---|---|---|
committer | Michael J. Spencer <bigcheesegs@gmail.com> | 2013-01-03 01:09:22 +0000 |
commit | f94cfb65f5b34cdb1bf9b7d59a1c1a65413a1920 (patch) | |
tree | 769ac8cdb806faabab990da2f3b03287ed2a218e /lib | |
parent | e4159491a7d94f87f99fb99a15c76d5d7b26851c (diff) |
[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
Diffstat (limited to 'lib')
-rw-r--r-- | lib/MC/WinCOFFStreamer.cpp | 36 |
1 files changed, 14 insertions, 22 deletions
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<MCFixup, 4> 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(); |