Reset the CFA offset at the start of every FDE.

This fixes PR21515.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@233120 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola
2015-03-24 21:47:31 +00:00
parent 4b8dfba3a1
commit 45eaa023df
2 changed files with 26 additions and 6 deletions

View File

@@ -999,11 +999,13 @@ static void EmitPersonality(MCStreamer &streamer, const MCSymbol &symbol,
namespace { namespace {
class FrameEmitterImpl { class FrameEmitterImpl {
int CFAOffset; int CFAOffset;
int InitialCFAOffset;
bool IsEH; bool IsEH;
const MCSymbol *SectionStart; const MCSymbol *SectionStart;
public: public:
FrameEmitterImpl(bool isEH) FrameEmitterImpl(bool isEH)
: CFAOffset(0), IsEH(isEH), SectionStart(nullptr) {} : CFAOffset(0), InitialCFAOffset(0), IsEH(isEH), SectionStart(nullptr) {
}
void setSectionStart(const MCSymbol *Label) { SectionStart = Label; } void setSectionStart(const MCSymbol *Label) { SectionStart = Label; }
@@ -1345,6 +1347,8 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(MCObjectStreamer &streamer,
EmitCFIInstructions(streamer, Instructions, nullptr); EmitCFIInstructions(streamer, Instructions, nullptr);
} }
InitialCFAOffset = CFAOffset;
// Padding // Padding
streamer.EmitValueToAlignment(IsEH ? 4 : MAI->getPointerSize()); streamer.EmitValueToAlignment(IsEH ? 4 : MAI->getPointerSize());
@@ -1360,6 +1364,8 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCObjectStreamer &streamer,
MCSymbol *fdeEnd = context.CreateTempSymbol(); MCSymbol *fdeEnd = context.CreateTempSymbol();
const MCObjectFileInfo *MOFI = context.getObjectFileInfo(); const MCObjectFileInfo *MOFI = context.getObjectFileInfo();
CFAOffset = InitialCFAOffset;
// Length // Length
const MCExpr *Length = MakeStartMinusEndExpr(streamer, *fdeStart, *fdeEnd, 0); const MCExpr *Length = MakeStartMinusEndExpr(streamer, *fdeStart, *fdeEnd, 0);
emitAbsValue(streamer, Length, 4); emitAbsValue(streamer, Length, 4);

View File

@@ -11,6 +11,16 @@ f:
ret ret
.cfi_endproc .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: Section {
// CHECK: Index: 4 // CHECK: Index: 4
// CHECK-NEXT: Name: .eh_frame // CHECK-NEXT: Name: .eh_frame
@@ -20,7 +30,7 @@ f:
// CHECK-NEXT: ] // CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x0 // CHECK-NEXT: Address: 0x0
// CHECK-NEXT: Offset: 0x50 // CHECK-NEXT: Offset: 0x50
// CHECK-NEXT: Size: 56 // CHECK-NEXT: Size: 96
// CHECK-NEXT: Link: 0 // CHECK-NEXT: Link: 0
// CHECK-NEXT: Info: 0 // CHECK-NEXT: Info: 0
// CHECK-NEXT: AddressAlignment: 8 // CHECK-NEXT: AddressAlignment: 8
@@ -29,9 +39,11 @@ f:
// CHECK-NEXT: ] // CHECK-NEXT: ]
// CHECK-NEXT: SectionData ( // CHECK-NEXT: SectionData (
// CHECK-NEXT: 0000: 14000000 00000000 037A5200 01781001 // 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: 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: } // CHECK-NEXT: }
// CHECK-NEXT: Section { // CHECK-NEXT: Section {
@@ -41,13 +53,15 @@ f:
// CHECK-NEXT: Flags [ // CHECK-NEXT: Flags [
// CHECK-NEXT: ] // CHECK-NEXT: ]
// CHECK-NEXT: Address: 0x0 // CHECK-NEXT: Address: 0x0
// CHECK-NEXT: Offset: 0x3A0 // CHECK-NEXT: Offset: 0x3C8
// CHECK-NEXT: Size: 24 // CHECK-NEXT: Size: 72
// CHECK-NEXT: Link: 7 // CHECK-NEXT: Link: 7
// CHECK-NEXT: Info: 4 // CHECK-NEXT: Info: 4
// CHECK-NEXT: AddressAlignment: 8 // CHECK-NEXT: AddressAlignment: 8
// CHECK-NEXT: EntrySize: 24 // CHECK-NEXT: EntrySize: 24
// CHECK-NEXT: Relocations [ // CHECK-NEXT: Relocations [
// CHECK-NEXT: 0x20 R_X86_64_PC32 .text 0x0 // 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-NEXT: ]
// CHECK: } // CHECK: }