diff options
author | Bill Wendling <isanbard@gmail.com> | 2013-09-09 19:48:37 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2013-09-09 19:48:37 +0000 |
commit | da11df0c22f5d0ba2e2be3ae4a7076c806233db8 (patch) | |
tree | 5c6b6d725fd502b9d691276ef457b0f0aa67f9a8 /lib/MC | |
parent | 2c9905a1f3bcf22cc2f93332cc8411d11798ba07 (diff) | |
download | llvm-da11df0c22f5d0ba2e2be3ae4a7076c806233db8.tar.gz llvm-da11df0c22f5d0ba2e2be3ae4a7076c806233db8.tar.bz2 llvm-da11df0c22f5d0ba2e2be3ae4a7076c806233db8.tar.xz |
Call generateCompactUnwindEncodings() right before we need to output the frame information.
There are more than one paths to where the frame information is emitted. Place
the call to generateCompactUnwindEncodings() into the method which outputs the
frame information, thus ensuring that the encoding is there for every path. This
involved threading the MCAsmBackend object through to this method.
<rdar://problem/13623355>
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190335 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC')
-rw-r--r-- | lib/MC/MCAsmStreamer.cpp | 3 | ||||
-rw-r--r-- | lib/MC/MCDwarf.cpp | 7 | ||||
-rw-r--r-- | lib/MC/MCELFStreamer.cpp | 2 | ||||
-rw-r--r-- | lib/MC/MCMachOStreamer.cpp | 3 | ||||
-rw-r--r-- | lib/MC/MCStreamer.cpp | 14 |
5 files changed, 15 insertions, 14 deletions
diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 60d72abbcb..c612a23f95 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 a5528a2d42..f47553204b 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 4661d503c3..a04352a8b2 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<LocalCommon>::const_iterator i = LocalCommons.begin(), e = LocalCommons.end(); diff --git a/lib/MC/MCMachOStreamer.cpp b/lib/MC/MCMachOStreamer.cpp index f914f62c2f..e628461f1d 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 806bec9896..c16670ad7c 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<MCDwarfFrameInfo>::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() { |