[MC] Emit an error if cfi_startproc is used before a symbol is defined.
authorQuentin Colombet <qcolombet@apple.com>
Tue, 15 Apr 2014 01:17:45 +0000 (01:17 +0000)
committerQuentin Colombet <qcolombet@apple.com>
Tue, 15 Apr 2014 01:17:45 +0000 (01:17 +0000)
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

lib/MC/MCStreamer.cpp
test/MC/ARM/dwarf-cfi-initial-state.s
test/MC/AsmParser/cfi-invalid-startproc.s [new file with mode: 0644]
test/MC/MachO/debug_frame.s
test/MC/PowerPC/ppc64-initial-cfa.s

index 17e0541b225cdc03a637aeeb7eab2ca251a4a49c..f85f7d3210c9e61945b0fb33e87bd9aff65f63db 100644 (file)
@@ -278,6 +278,10 @@ void MCStreamer::EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) {
 }
 
 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();
index 2d638e9c4b28e8951322f40ab742595a2ad60ce1..0d1c08af7282efd52653466520f2aaca8bbd86e3 100644 (file)
@@ -1,6 +1,7 @@
 # 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
diff --git a/test/MC/AsmParser/cfi-invalid-startproc.s b/test/MC/AsmParser/cfi-invalid-startproc.s
new file mode 100644 (file)
index 0000000..57ded13
--- /dev/null
@@ -0,0 +1,16 @@
+# 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
index 20bfd8dde2e7c95b71c397ee42edce31383167b6..247347d252a7e1cd38aefe2e07df6cde704a9e73 100644 (file)
@@ -3,6 +3,7 @@
 // Make sure MC can handle file level .cfi_startproc and .cfi_endproc that creates
 // an empty frame.
 // rdar://10017184
+_proc:
 .cfi_startproc
 .cfi_endproc
 
index b890b30ba034124f9db501f060067a050c6eeba0..ca97e1b96b07299e7c9f84e9ea787d8769277497 100644 (file)
@@ -7,6 +7,7 @@
 # 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