]> granicus.if.org Git - llvm/commitdiff
X86: loosen an overly aggressive MachO assertion
authorSaleem Abdulrasool <compnerd@compnerd.org>
Tue, 20 Sep 2016 17:05:04 +0000 (17:05 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Tue, 20 Sep 2016 17:05:04 +0000 (17:05 +0000)
We would assert that the FP setup CFI used esp/rsp always.  This held up in
practice when the code was generated from IR.  However, with the integrated
assembler, it is possible to have the input be user specified assembly.  In such
a case, we cannot assume that the function implementation has a compact unwind
representation.  Loosen the assertion into a check and bail if we cannot
represent the frame pointer in the compact unwinding.

Addresses PR30453!

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

lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
test/MC/X86/fp-setup-macho.s [new file with mode: 0644]

index 524b48b9aab36a210c6ef3514a4cde9da1a633e1..1bde4bcfa29f6099de0673aad2b212ed46db14d9 100644 (file)
@@ -546,8 +546,12 @@ protected:
         //     .cfi_def_cfa_register %rbp
         //
         HasFP = true;
-        assert(MRI.getLLVMRegNum(Inst.getRegister(), true) ==
-               (Is64Bit ? X86::RBP : X86::EBP) && "Invalid frame pointer!");
+
+        // If the frame pointer is other than esp/rsp, we do not have a way to
+        // generate a compact unwinding representation, so bail out.
+        if (MRI.getLLVMRegNum(Inst.getRegister(), true) !=
+            (Is64Bit ? X86::RBP : X86::EBP))
+          return 0;
 
         // Reset the counts.
         memset(SavedRegs, 0, sizeof(SavedRegs));
diff --git a/test/MC/X86/fp-setup-macho.s b/test/MC/X86/fp-setup-macho.s
new file mode 100644 (file)
index 0000000..aaae07a
--- /dev/null
@@ -0,0 +1,11 @@
+// RUN: llvm-mc -triple x86_64-apple-macho -filetype obj -o - %s | llvm-readobj -sections | FileCheck %s
+
+_label:
+       .cfi_startproc
+       .cfi_def_cfa_register rsp
+       .cfi_endproc
+
+// CHECK: Section {
+// CHECK:   Name: __eh_frame
+// CHECK: }
+