Don't emit the FDE end label if the last thing emitted was a compact unwind and
authorBill Wendling <isanbard@gmail.com>
Wed, 13 Jul 2011 00:49:09 +0000 (00:49 +0000)
committerBill Wendling <isanbard@gmail.com>
Wed, 13 Jul 2011 00:49:09 +0000 (00:49 +0000)
not the FDE

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135020 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/MCDwarf.cpp
lib/Target/X86/X86FrameLowering.cpp

index bc900ca6e949d3c00d16a01a6c14cddae47e6df0..4e79cfa3fcf3502921a4343e0f13c5c16acfefd5 100644 (file)
@@ -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);
index 136a7e1d19b337b7f2a8c3a1abc85bf1b2d19684..f180cc0ad981733292d9ba1544954e7a934c1fd0 100644 (file)
@@ -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;
     }