Currently, we bind those directives with the last symbol, so if none
has been defined, this would lead to a crash of the compiler.
<rdar://problem/
15939159>
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206236
91177308-0d34-0410-b5e6-
96231b3b80d8
}
void MCStreamer::RecordProcStart(MCDwarfFrameInfo &Frame) {
+ // Report an error if we haven't seen a symbol yet where we'd bind
+ // .cfi_startproc.
+ if (!LastSymbol)
+ report_fatal_error("No symbol to start a frame");
Frame.Function = LastSymbol;
// We need to create a local symbol to avoid relocations.
Frame.Begin = getContext().CreateTempSymbol();
# RUN: llvm-mc < %s -triple=armv7-linux-gnueabi -filetype=obj -o - \
# RUN: | llvm-dwarfdump - | FileCheck %s
+_proc:
.cfi_sections .debug_frame
.cfi_startproc
bx lr
--- /dev/null
+# RUN: not llvm-mc -triple=x86_64-apple-macosx10.8 -filetype=obj -o %t %s 2>&1 | FileCheck %s
+# Check that the cfi_startproc is declared after the beginning of
+# a procedure, otherwise it will reference an invalid symbol for
+# emitting the relocation.
+# <rdar://problem/15939159>
+
+# CHECK: No symbol to start a frame
+.text
+.cfi_startproc
+.globl _someFunction
+_someFunction:
+.cfi_def_cfa_offset 16
+.cfi_offset %rbp, -16
+.cfi_def_cfa_register rbp
+ ret
+.cfi_endproc
// Make sure MC can handle file level .cfi_startproc and .cfi_endproc that creates
// an empty frame.
// rdar://10017184
+_proc:
.cfi_startproc
.cfi_endproc
# RUN: llvm-mc -triple=powerpc64le-unknown-linux-gnu -filetype=obj -relocation-model=pic %s | \
# RUN: llvm-readobj -s -sr -sd | FileCheck %s -check-prefix=PIC -check-prefix=PIC-LE
+_proc:
.cfi_startproc
nop
.cfi_endproc