Some autoconf tests use module level inline asm to test compiler's handling of
authorEvan Cheng <evan.cheng@apple.com>
Wed, 24 Aug 2011 22:31:37 +0000 (22:31 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 24 Aug 2011 22:31:37 +0000 (22:31 +0000)
.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

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

lib/MC/MCDwarf.cpp
lib/MC/MCStreamer.cpp
test/MC/MachO/debug_frame.s

index 06ce502d572aef2a8b820eb75dc3a5e38b45c31d..b57fd9a13bdc9413bd5cdf0aa4fee8baf31c9551 100644 (file)
@@ -895,7 +895,7 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer,
   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);
index 5295d0f58f3aa8edec725ef3e87a451c2b169ba7..7e3d7a6886e3b051bbcf152fee9143f8b9b66e19 100644 (file)
@@ -190,14 +190,14 @@ void MCStreamer::EmitCFIStartProc() {
   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();
index 47264ef87991e0ac51bb7d7ba7935df600bf0242..20bfd8dde2e7c95b71c397ee42edce31383167b6 100644 (file)
@@ -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 @@ Ltext_end:
 // 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: ])