From: Daniel Dunbar Date: Fri, 19 Mar 2010 10:43:18 +0000 (+0000) Subject: MC: Sink code emitter into MCAssembler. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=cf871e5abff63a53f9e97ff9e37fb7297d0cb847;p=oota-llvm.git MC: Sink code emitter into MCAssembler. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98953 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/MC/MCAssembler.h b/include/llvm/MC/MCAssembler.h index 41e751549ca..8eb8e632ad0 100644 --- a/include/llvm/MC/MCAssembler.h +++ b/include/llvm/MC/MCAssembler.h @@ -24,6 +24,7 @@ class raw_ostream; class MCAsmLayout; class MCAssembler; class MCContext; +class MCCodeEmitter; class MCExpr; class MCFragment; class MCObjectWriter; @@ -598,6 +599,8 @@ private: TargetAsmBackend &Backend; + MCCodeEmitter &Emitter; + raw_ostream &OS; iplist Sections; @@ -683,13 +686,16 @@ public: // concrete and require clients to pass in a target like object. The other // option is to make this abstract, and have targets provide concrete // implementations as we do with AsmParser. - MCAssembler(MCContext &_Context, TargetAsmBackend &_Backend, raw_ostream &OS); + MCAssembler(MCContext &_Context, TargetAsmBackend &_Backend, + MCCodeEmitter &_Emitter, raw_ostream &OS); ~MCAssembler(); MCContext &getContext() const { return Context; } TargetAsmBackend &getBackend() const { return Backend; } + MCCodeEmitter &getEmitter() const { return Emitter; } + /// Finish - Do final processing and write the object to the output stream. void Finish(); diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 6e5f73ff44c..4d8cc6a763c 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -103,8 +103,9 @@ MCSymbolData::MCSymbolData(const MCSymbol &_Symbol, MCFragment *_Fragment, /* *** */ MCAssembler::MCAssembler(MCContext &_Context, TargetAsmBackend &_Backend, - raw_ostream &_OS) - : Context(_Context), Backend(_Backend), OS(_OS), SubsectionsViaSymbols(false) + MCCodeEmitter &_Emitter, raw_ostream &_OS) + : Context(_Context), Backend(_Backend), Emitter(_Emitter), + OS(_OS), SubsectionsViaSymbols(false) { } diff --git a/lib/MC/MCMachOStreamer.cpp b/lib/MC/MCMachOStreamer.cpp index 73b1074531d..9504392bc1b 100644 --- a/lib/MC/MCMachOStreamer.cpp +++ b/lib/MC/MCMachOStreamer.cpp @@ -45,7 +45,6 @@ class MCMachOStreamer : public MCStreamer { private: MCAssembler Assembler; - MCCodeEmitter *Emitter; MCSectionData *CurSectionData; private: @@ -61,7 +60,7 @@ private: public: MCMachOStreamer(MCContext &Context, TargetAsmBackend &TAB, raw_ostream &_OS, MCCodeEmitter *_Emitter) - : MCStreamer(Context), Assembler(Context, TAB, _OS), Emitter(_Emitter), + : MCStreamer(Context), Assembler(Context, TAB, *_Emitter, _OS), CurSectionData(0) {} ~MCMachOStreamer() {} @@ -370,15 +369,12 @@ void MCMachOStreamer::EmitInstruction(const MCInst &Inst) { if (Inst.getOperand(i).isExpr()) AddValueSymbols(Inst.getOperand(i).getExpr()); - if (!Emitter) - llvm_unreachable("no code emitter available!"); - CurSectionData->setHasInstructions(true); SmallVector Fixups; SmallString<256> Code; raw_svector_ostream VecOS(Code); - Emitter->EncodeInstruction(Inst, VecOS, Fixups); + Assembler.getEmitter().EncodeInstruction(Inst, VecOS, Fixups); VecOS.flush(); // Add the fixups and data.