diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp index bc900ca6e94..4e79cfa3fcf 100644 --- a/lib/MC/MCDwarf.cpp +++ b/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/lib/Target/X86/X86FrameLowering.cpp b/lib/Target/X86/X86FrameLowering.cpp index 136a7e1d19b..f180cc0ad98 100644 --- a/lib/Target/X86/X86FrameLowering.cpp +++ b/lib/Target/X86/X86FrameLowering.cpp @@ -1059,13 +1059,21 @@ getCompactUnwindEncoding(ArrayRef 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; }