diff options
author | Bill Wendling <isanbard@gmail.com> | 2011-07-13 00:49:09 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2011-07-13 00:49:09 +0000 |
commit | ee6e776be2e4f68606378906e8079a9dfda5a47b (patch) | |
tree | 6bb7c2f4f8fe02ba07fc4a3d6a32d3e836d5ad57 | |
parent | 4c9c3ee08a40bced1e276371bc77c9b9478867ef (diff) | |
download | bcm5719-llvm-ee6e776be2e4f68606378906e8079a9dfda5a47b.tar.gz bcm5719-llvm-ee6e776be2e4f68606378906e8079a9dfda5a47b.zip |
Don't emit the FDE end label if the last thing emitted was a compact unwind and
not the FDE
llvm-svn: 135020
-rw-r--r-- | llvm/lib/MC/MCDwarf.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86FrameLowering.cpp | 22 |
2 files changed, 18 insertions, 8 deletions
diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp index bc900ca6e94..4e79cfa3fcf 100644 --- a/llvm/lib/MC/MCDwarf.cpp +++ b/llvm/lib/MC/MCDwarf.cpp @@ -1018,8 +1018,10 @@ void MCDwarfFrameEmitter::Emit(MCStreamer &Streamer, for (unsigned i = 0, n = Streamer.getNumFrameInfos(); i < n; ++i) { const MCDwarfFrameInfo &Frame = Streamer.getFrameInfo(i); if (IsEH && AsmInfo.getCompactUnwindSection() && - Emitter.EmitCompactUnwind(Streamer, Frame)) + Emitter.EmitCompactUnwind(Streamer, Frame)) { + FDEEnd = NULL; continue; + } CIEKey Key(Frame.Personality, Frame.PersonalityEncoding, Frame.LsdaEncoding); diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp index 136a7e1d19b..f180cc0ad98 100644 --- a/llvm/lib/Target/X86/X86FrameLowering.cpp +++ b/llvm/lib/Target/X86/X86FrameLowering.cpp @@ -1059,13 +1059,21 @@ getCompactUnwindEncoding(ArrayRef<MCCFIInstruction> Instrs, const bool IsRelative = (Operation == MCCFIInstruction::RelMove); if (Dst.isReg() && Dst.getReg() == MachineLocation::VirtualFP) { - if (Src.getReg() == MachineLocation::VirtualFP) { - // DW_CFA_def_cfa_offset - if (IsRelative) - CFAOffset += Src.getOffset(); - else - CFAOffset -= Src.getOffset(); - } // else DW_CFA_def_cfa + if (Src.getReg() != MachineLocation::VirtualFP) { + // DW_CFA_def_cfa + assert(FramePointerReg == -1 &&"Defining more than one frame pointer?"); + FramePointerReg = Src.getReg(); + if (TRI->getLLVMRegNum(FramePointerReg, IsEH) != X86::EBP && + TRI->getLLVMRegNum(FramePointerReg, IsEH) != X86::RBP) + // The frame pointer isn't EBP/RBP. Cannot make unwind information + // compact. + return 0; + } // else DW_CFA_def_cfa_offset + + if (IsRelative) + CFAOffset += Src.getOffset(); + else + CFAOffset -= Src.getOffset(); continue; } |