diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp index 24cdaeff494..87e7ed17e32 100644 --- a/lib/MC/MCDwarf.cpp +++ b/lib/MC/MCDwarf.cpp @@ -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); diff --git a/test/MC/ELF/cfi-adjust-cfa-offset.s b/test/MC/ELF/cfi-adjust-cfa-offset.s index 9d639f70d8d..200f897d2e1 100644 --- a/test/MC/ELF/cfi-adjust-cfa-offset.s +++ b/test/MC/ELF/cfi-adjust-cfa-offset.s @@ -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: }