"Fix" FDE alignment to match what gas does.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 17 Dec 2010 00:28:02 +0000 (00:28 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 17 Dec 2010 00:28:02 +0000 (00:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122006 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/MCDwarf.cpp
test/MC/ELF/cfi.s

index c1de31bf0696def3b695951b7f90caf4ff8b4480..24ddc8256381ca28c52ebe40bb62e6be7dce1567 100644 (file)
@@ -569,11 +569,9 @@ static const MCSymbol &EmitCIE(MCStreamer &streamer) {
   return *sectionStart;
 }
 
-static void EmitFDE(MCStreamer &streamer,
-                    const MCSymbol &cieStart,
-                    const MCDwarfFrameInfo &frame) {
-  MCContext &context = streamer.getContext();
-  const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
+static MCSymbol *EmitFDE(MCStreamer &streamer,
+                         const MCSymbol &cieStart,
+                         const MCDwarfFrameInfo &frame) {
   MCSymbol *fdeStart = streamer.getContext().CreateTempSymbol();
   MCSymbol *fdeEnd = streamer.getContext().CreateTempSymbol();
 
@@ -602,12 +600,22 @@ static void EmitFDE(MCStreamer &streamer,
   // Call Frame Instructions
 
   // Padding
-  streamer.EmitValueToAlignment(asmInfo.getPointerSize());
-  streamer.EmitLabel(fdeEnd);
+  streamer.EmitValueToAlignment(4);
+
+  return fdeEnd;
 }
 
 void MCDwarfFrameEmitter::Emit(MCStreamer &streamer) {
+  const MCContext &context = streamer.getContext();
+  const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
   const MCSymbol &cieStart = EmitCIE(streamer);
-  for (unsigned i = 0, n = streamer.getNumFrameInfos(); i < n; ++i)
-    EmitFDE(streamer, cieStart, streamer.getFrameInfo(i));
+  MCSymbol *fdeEnd = NULL;
+  for (unsigned i = 0, n = streamer.getNumFrameInfos(); i < n; ++i) {
+    fdeEnd = EmitFDE(streamer, cieStart, streamer.getFrameInfo(i));
+    if (i != n - 1)
+      streamer.EmitLabel(fdeEnd);
+  }
+  streamer.EmitValueToAlignment(asmInfo.getPointerSize());
+  if (fdeEnd)
+    streamer.EmitLabel(fdeEnd);
 }
index df62d7de06c22bff72818c1cdd3d2565a4bb2709..5657925ce5c8c23e0ff90ff3c7d3359f970387e8 100644 (file)
@@ -1,6 +1,11 @@
 // RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump  --dump-section-data | FileCheck %s
 
-f:
+f1:
+        .cfi_startproc
+        nop
+        .cfi_endproc
+
+f2:
         .cfi_startproc
         nop
         .cfi_endproc
@@ -11,12 +16,12 @@ f:
 // CHECK-NEXT:  ('sh_flags', 0x00000002)
 // CHECK-NEXT:  ('sh_addr', 0x00000000)
 // CHECK-NEXT:  ('sh_offset', 0x00000048)
-// CHECK-NEXT:  ('sh_size', 0x00000030)
+// CHECK-NEXT:  ('sh_size', 0x00000040)
 // CHECK-NEXT:  ('sh_link', 0x00000000)
 // CHECK-NEXT:  ('sh_info', 0x00000000)
 // CHECK-NEXT:  ('sh_addralign', 0x00000008)
 // CHECK-NEXT:  ('sh_entsize', 0x00000000)
-// CHECK-NEXT:  ('_section_data', '14000000 00000000 017a5200 01781001 1b0c0708 90010000 14000000 1c000000 00000000 01000000 00000000 00000000')
+// CHECK-NEXT:  ('_section_data', '14000000 00000000 017a5200 01781001 1b0c0708 90010000 10000000 1c000000 00000000 01000000 00000000 10000000 30000000 00000000 01000000 00000000')
 // CHECK-NEXT: ),
 
 // CHECK:      # Section 0x00000008
@@ -24,8 +29,8 @@ f:
 // CHECK-NEXT:  ('sh_type', 0x00000004)
 // CHECK-NEXT:  ('sh_flags', 0x00000000)
 // CHECK-NEXT:  ('sh_addr', 0x00000000)
-// CHECK-NEXT:  ('sh_offset', 0x00000158)
-// CHECK-NEXT:  ('sh_size', 0x00000018)
+// CHECK-NEXT:  ('sh_offset', 0x00000180)
+// CHECK-NEXT:  ('sh_size', 0x00000030)
 // CHECK-NEXT:  ('sh_link', 0x00000006)
 // CHECK-NEXT:  ('sh_info', 0x00000004)
 // CHECK-NEXT:  ('sh_addralign', 0x00000008)
@@ -33,9 +38,15 @@ f:
 // CHECK-NEXT:  ('_relocations', [
 // CHECK-NEXT:   # Relocation 0x00000000
 // CHECK-NEXT:   (('r_offset', 0x00000020)
-// CHECK-NEXT:    ('r_sym', 0x00000002)
+// CHECK-NEXT:    ('r_sym', 0x00000003)
 // CHECK-NEXT:    ('r_type', 0x00000002)
 // CHECK-NEXT:    ('r_addend', 0x00000000)
 // CHECK-NEXT:   ),
+// CHECK-NEXT:   # Relocation 0x00000001
+// CHECK-NEXT:   (('r_offset', 0x00000034)
+// CHECK-NEXT:    ('r_sym', 0x00000003)
+// CHECK-NEXT:    ('r_type', 0x00000002)
+// CHECK-NEXT:    ('r_addend', 0x00000001)
+// CHECK-NEXT:   ),
 // CHECK-NEXT:  ])
 // CHECK-NEXT: ),