[llvm-commits] [llvm] r138504 - in /llvm/trunk: lib/MC/MCDwarf.cpp lib/MC/MCStreamer.cpp test/MC/MachO/debug_frame.s

Evan Cheng evan.cheng at apple.com
Wed Aug 24 15:31:37 PDT 2011


Author: evancheng
Date: Wed Aug 24 17:31:37 2011
New Revision: 138504

URL: http://llvm.org/viewvc/llvm-project?rev=138504&view=rev
Log:
Some autoconf tests use module level inline asm to test compiler's handling of
.cfi_startproc. e.g. libffi:

 $ cat confopt.c 
asm (".cfi_startproc\n\t.cfi_endproc");

int main () { return 0; }

Teach MC / dwarf emission to handle these cfi directives which essentially
create an empty frame.

rdar://10017184

Modified:
    llvm/trunk/lib/MC/MCDwarf.cpp
    llvm/trunk/lib/MC/MCStreamer.cpp
    llvm/trunk/test/MC/MachO/debug_frame.s

Modified: llvm/trunk/lib/MC/MCDwarf.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCDwarf.cpp?rev=138504&r1=138503&r2=138504&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCDwarf.cpp (original)
+++ llvm/trunk/lib/MC/MCDwarf.cpp Wed Aug 24 17:31:37 2011
@@ -895,7 +895,7 @@
   const MCObjectFileInfo *MOFI = context.getObjectFileInfo();
   bool verboseAsm = streamer.isVerboseAsm();
 
-  if (!MOFI->isFunctionEHFrameSymbolPrivate() && IsEH) {
+  if (IsEH && frame.Function && !MOFI->isFunctionEHFrameSymbolPrivate()) {
     MCSymbol *EHSym =
       context.GetOrCreateSymbol(frame.Function->getName() + Twine(".eh"));
     streamer.EmitEHSymAttributes(frame.Function, EHSym);

Modified: llvm/trunk/lib/MC/MCStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCStreamer.cpp?rev=138504&r1=138503&r2=138504&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCStreamer.cpp (original)
+++ llvm/trunk/lib/MC/MCStreamer.cpp Wed Aug 24 17:31:37 2011
@@ -190,14 +190,14 @@
   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
   if (CurFrame && !CurFrame->End)
     report_fatal_error("Starting a frame before finishing the previous one!");
-  MCDwarfFrameInfo Frame;
 
+  MCDwarfFrameInfo Frame;
   Frame.Function = LastSymbol;
 
   // If the function is externally visible, we need to create a local
   // symbol to avoid relocations.
   StringRef Prefix = getContext().getAsmInfo().getPrivateGlobalPrefix();
-  if (LastSymbol->getName().startswith(Prefix)) {
+  if (LastSymbol && LastSymbol->getName().startswith(Prefix)) {
     Frame.Begin = LastSymbol;
   } else {
     Frame.Begin = getContext().CreateTempSymbol();

Modified: llvm/trunk/test/MC/MachO/debug_frame.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/debug_frame.s?rev=138504&r1=138503&r2=138504&view=diff
==============================================================================
--- llvm/trunk/test/MC/MachO/debug_frame.s (original)
+++ llvm/trunk/test/MC/MachO/debug_frame.s Wed Aug 24 17:31:37 2011
@@ -1,5 +1,11 @@
 // RUN: llvm-mc -triple i386-apple-darwin %s -filetype=obj -o - | macho-dump | FileCheck %s
 
+// Make sure MC can handle file level .cfi_startproc and .cfi_endproc that creates
+// an empty frame.
+// rdar://10017184
+.cfi_startproc
+.cfi_endproc
+
 // Check that we don't produce a relocation for the CIE pointer and therefore
 // we have only one relocation in __debug_frame.
 
@@ -22,17 +28,20 @@
 // CHECK:       (('section_name', '__debug_frame\x00\x00\x00')
 // CHECK-NEXT:   ('segment_name', '__DWARF\x00\x00\x00\x00\x00\x00\x00\x00\x00')
 // CHECK-NEXT:   ('address', 8)
-// CHECK-NEXT:   ('size', 36)
+// CHECK-NEXT:   ('size', 52)
 // CHECK-NEXT:   ('offset', 332)
 // CHECK-NEXT:   ('alignment', 2)
-// CHECK-NEXT:   ('reloc_offset', 368)
-// CHECK-NEXT:   ('num_reloc', 1)
+// CHECK-NEXT:   ('reloc_offset', 384)
+// CHECK-NEXT:   ('num_reloc', 2)
 // CHECK-NEXT:   ('flags', 0x2000000)
 // CHECK-NEXT:   ('reserved1', 0)
 // CHECK-NEXT:   ('reserved2', 0)
 // CHECK-NEXT:  ),
 // CHECK-NEXT: ('_relocations', [
 // CHECK-NEXT:   # Relocation 0
+// CHECK-NEXT:   (('word-0', 0x2c),
+// CHECK-NEXT:    ('word-1', 0x4000001)),
+// CHECK-NEXT:   # Relocation 1
 // CHECK-NEXT:   (('word-0', 0x1c),
 // CHECK-NEXT:    ('word-1', 0x4000001)),
 // CHECK-NEXT: ])





More information about the llvm-commits mailing list