Reset the CFA offset at the start of every FDE.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 24 Mar 2015 21:47:31 +0000 (21:47 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 24 Mar 2015 21:47:31 +0000 (21:47 +0000)
This fixes PR21515.

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

lib/MC/MCDwarf.cpp
test/MC/ELF/cfi-adjust-cfa-offset.s

index 24cdaeff49454b456847f0a3597a595a21b1fb98..87e7ed17e325a50d8fd7795c12e23350c03e582c 100644 (file)
@@ -999,11 +999,13 @@ static void EmitPersonality(MCStreamer &streamer, const MCSymbol &symbol,
 namespace {
   class FrameEmitterImpl {
     int CFAOffset;
+    int InitialCFAOffset;
     bool IsEH;
     const MCSymbol *SectionStart;
   public:
     FrameEmitterImpl(bool isEH)
-        : CFAOffset(0), IsEH(isEH), SectionStart(nullptr) {}
+        : CFAOffset(0), InitialCFAOffset(0), IsEH(isEH), SectionStart(nullptr) {
+    }
 
     void setSectionStart(const MCSymbol *Label) { SectionStart = Label; }
 
@@ -1345,6 +1347,8 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(MCObjectStreamer &streamer,
     EmitCFIInstructions(streamer, Instructions, nullptr);
   }
 
+  InitialCFAOffset = CFAOffset;
+
   // Padding
   streamer.EmitValueToAlignment(IsEH ? 4 : MAI->getPointerSize());
 
@@ -1360,6 +1364,8 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCObjectStreamer &streamer,
   MCSymbol *fdeEnd = context.CreateTempSymbol();
   const MCObjectFileInfo *MOFI = context.getObjectFileInfo();
 
+  CFAOffset = InitialCFAOffset;
+
   // Length
   const MCExpr *Length = MakeStartMinusEndExpr(streamer, *fdeStart, *fdeEnd, 0);
   emitAbsValue(streamer, Length, 4);
index 9d639f70d8ddb9ed12b08f1b26ff26a00960256d..200f897d2e15d47bc61636539a894f198e54b624 100644 (file)
@@ -11,6 +11,16 @@ f:
        ret
        .cfi_endproc
 
+        .cfi_startproc
+       nop
+       .cfi_adjust_cfa_offset 4
+       .cfi_endproc
+
+        .cfi_startproc
+       nop
+       .cfi_adjust_cfa_offset 4
+       .cfi_endproc
+
 // CHECK:        Section {
 // CHECK:          Index: 4
 // CHECK-NEXT:     Name: .eh_frame
@@ -20,7 +30,7 @@ f:
 // CHECK-NEXT:     ]
 // CHECK-NEXT:     Address: 0x0
 // CHECK-NEXT:     Offset: 0x50
-// CHECK-NEXT:     Size: 56
+// CHECK-NEXT:     Size: 96
 // CHECK-NEXT:     Link: 0
 // CHECK-NEXT:     Info: 0
 // CHECK-NEXT:     AddressAlignment: 8
@@ -29,9 +39,11 @@ f:
 // CHECK-NEXT:     ]
 // CHECK-NEXT:     SectionData (
 // CHECK-NEXT:       0000: 14000000 00000000 037A5200 01781001
-// CHECK-NEXT:       0010: 1B0C0708 90010000 1C000000 1C000000
+// CHECK-NEXT:       0010: 1B0C0708 90010000 18000000 1C000000
 // CHECK-NEXT:       0020: 00000000 0A000000 00440E10 410E1444
-// CHECK-NEXT:       0030: 0E080000 00000000
+// CHECK-NEXT:       0030: 0E080000 10000000 38000000 00000000
+// CHECK-NEXT:       0040: 01000000 00410E0C 14000000 4C000000
+// CHECK-NEXT:       0050: 00000000 01000000 00410E0C 00000000
 // CHECK-NEXT:     )
 // CHECK-NEXT:   }
 // CHECK-NEXT:   Section {
@@ -41,13 +53,15 @@ f:
 // CHECK-NEXT:     Flags [
 // CHECK-NEXT:     ]
 // CHECK-NEXT:     Address: 0x0
-// CHECK-NEXT:     Offset: 0x3A0
-// CHECK-NEXT:     Size: 24
+// CHECK-NEXT:     Offset: 0x3C8
+// CHECK-NEXT:     Size: 72
 // CHECK-NEXT:     Link: 7
 // CHECK-NEXT:     Info: 4
 // CHECK-NEXT:     AddressAlignment: 8
 // CHECK-NEXT:     EntrySize: 24
 // CHECK-NEXT:     Relocations [
 // CHECK-NEXT:       0x20 R_X86_64_PC32 .text 0x0
+// CHECK-NEXT:       0x3C R_X86_64_PC32 .text 0x
+// CHECK-NEXT:       0x50 R_X86_64_PC32 .text 0x
 // CHECK-NEXT:     ]
 // CHECK:        }