diff --git a/include/llvm/MC/MCDwarf.h b/include/llvm/MC/MCDwarf.h index c671dd9fbbc..7a06cc07622 100644 --- a/include/llvm/MC/MCDwarf.h +++ b/include/llvm/MC/MCDwarf.h @@ -23,6 +23,7 @@ #include namespace llvm { +class MCAsmBackend; class MCContext; class MCSection; class MCStreamer; @@ -449,7 +450,8 @@ public: // // This emits the frame info section. // - static void Emit(MCStreamer &streamer, bool usingCFI, bool isEH); + static void Emit(MCStreamer &streamer, MCAsmBackend *MAB, + bool usingCFI, bool isEH); static void EmitAdvanceLoc(MCStreamer &Streamer, uint64_t AddrDelta); static void EncodeAdvanceLoc(MCContext &Context, uint64_t AddrDelta, raw_ostream &OS); diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index c849e597b6b..cd297a4d9da 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -104,7 +104,7 @@ protected: virtual void EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame); void RecordProcEnd(MCDwarfFrameInfo &Frame); virtual void EmitCFIEndProcImpl(MCDwarfFrameInfo &CurFrame); - void EmitFrames(bool usingCFI); + void EmitFrames(MCAsmBackend *MAB, bool usingCFI); MCWin64EHUnwindInfo *getCurrentW64UnwindInfo() { return CurrentW64UnwindInfo; @@ -134,7 +134,7 @@ public: return *W64UnwindInfos[i]; } - void generateCompactUnwindEncodings(MCAsmBackend &MAB); + void generateCompactUnwindEncodings(MCAsmBackend *MAB); /// @name Assembly File Formatting. /// @{ diff --git a/lib/CodeGen/LLVMTargetMachine.cpp b/lib/CodeGen/LLVMTargetMachine.cpp index 6fd68ee7750..5699511a4de 100644 --- a/lib/CodeGen/LLVMTargetMachine.cpp +++ b/lib/CodeGen/LLVMTargetMachine.cpp @@ -175,12 +175,11 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM, // Create a code emitter if asked to show the encoding. MCCodeEmitter *MCE = 0; - MCAsmBackend *MAB = 0; - if (ShowMCEncoding) { + if (ShowMCEncoding) MCE = getTarget().createMCCodeEmitter(MII, MRI, STI, *Context); - MAB = getTarget().createMCAsmBackend(MRI, getTargetTriple(), TargetCPU); - } + MCAsmBackend *MAB = getTarget().createMCAsmBackend(MRI, getTargetTriple(), + TargetCPU); MCStreamer *S = getTarget().createAsmStreamer(*Context, Out, getVerboseAsm(), hasMCUseLoc(), diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 60d72abbcb8..c612a23f953 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -1421,8 +1421,9 @@ void MCAsmStreamer::FinishImpl() { MCGenDwarfInfo::Emit(this, LineSectionSymbol); if (!UseCFI) - EmitFrames(false); + EmitFrames(AsmBackend.get(), false); } + MCStreamer *llvm::createAsmStreamer(MCContext &Context, formatted_raw_ostream &OS, bool isVerboseAsm, bool useLoc, diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp index a5528a2d42f..f47553204b2 100644 --- a/lib/MC/MCDwarf.cpp +++ b/lib/MC/MCDwarf.cpp @@ -1415,9 +1415,10 @@ namespace llvm { }; } -void MCDwarfFrameEmitter::Emit(MCStreamer &Streamer, - bool UsingCFI, - bool IsEH) { +void MCDwarfFrameEmitter::Emit(MCStreamer &Streamer, MCAsmBackend *MAB, + bool UsingCFI, bool IsEH) { + Streamer.generateCompactUnwindEncodings(MAB); + MCContext &Context = Streamer.getContext(); const MCObjectFileInfo *MOFI = Context.getObjectFileInfo(); FrameEmitterImpl Emitter(UsingCFI, IsEH); diff --git a/lib/MC/MCELFStreamer.cpp b/lib/MC/MCELFStreamer.cpp index 4661d503c37..a04352a8b28 100644 --- a/lib/MC/MCELFStreamer.cpp +++ b/lib/MC/MCELFStreamer.cpp @@ -528,7 +528,7 @@ void MCELFStreamer::EmitBundleUnlock() { } void MCELFStreamer::FinishImpl() { - EmitFrames(true); + EmitFrames(NULL, true); for (std::vector::const_iterator i = LocalCommons.begin(), e = LocalCommons.end(); diff --git a/lib/MC/MCMachOStreamer.cpp b/lib/MC/MCMachOStreamer.cpp index f914f62c2f7..e628461f1d6 100644 --- a/lib/MC/MCMachOStreamer.cpp +++ b/lib/MC/MCMachOStreamer.cpp @@ -396,8 +396,7 @@ void MCMachOStreamer::EmitInstToData(const MCInst &Inst) { } void MCMachOStreamer::FinishImpl() { - generateCompactUnwindEncodings(getAssembler().getBackend()); - EmitFrames(true); + EmitFrames(&getAssembler().getBackend(), true); // We have to set the fragment atom associations so we can relax properly for // Mach-O. diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 806bec98968..c16670ad7ca 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -73,12 +73,12 @@ raw_ostream &MCStreamer::GetCommentOS() { return nulls(); } -void MCStreamer::generateCompactUnwindEncodings(MCAsmBackend &MAB) { +void MCStreamer::generateCompactUnwindEncodings(MCAsmBackend *MAB) { + if (!MAB) return; for (std::vector::iterator I = FrameInfos.begin(), E = FrameInfos.end(); I != E; ++I) - if (!I->CompactUnwindEncoding) - I->CompactUnwindEncoding = - MAB.generateCompactUnwindEncoding(I->Instructions); + I->CompactUnwindEncoding = + MAB->generateCompactUnwindEncoding(I->Instructions); } void MCStreamer::EmitDwarfSetLineAddr(int64_t LineDelta, @@ -604,15 +604,15 @@ void MCStreamer::EmitRawText(const Twine &T) { EmitRawText(Str.str()); } -void MCStreamer::EmitFrames(bool usingCFI) { +void MCStreamer::EmitFrames(MCAsmBackend *MAB, bool usingCFI) { if (!getNumFrameInfos()) return; if (EmitEHFrame) - MCDwarfFrameEmitter::Emit(*this, usingCFI, true); + MCDwarfFrameEmitter::Emit(*this, MAB, usingCFI, true); if (EmitDebugFrame) - MCDwarfFrameEmitter::Emit(*this, usingCFI, false); + MCDwarfFrameEmitter::Emit(*this, MAB, usingCFI, false); } void MCStreamer::EmitW64Tables() {