mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-18 10:24:45 +00:00
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:
@@ -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);
|
||||||
|
@@ -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: }
|
||||||
|
Reference in New Issue
Block a user