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; }
EmitCFIInstructions(streamer, Instructions, nullptr);
}
+ InitialCFAOffset = CFAOffset;
+
// Padding
streamer.EmitValueToAlignment(IsEH ? 4 : MAI->getPointerSize());
MCSymbol *fdeEnd = context.CreateTempSymbol();
const MCObjectFileInfo *MOFI = context.getObjectFileInfo();
+ CFAOffset = InitialCFAOffset;
+
// Length
const MCExpr *Length = MakeStartMinusEndExpr(streamer, *fdeStart, *fdeEnd, 0);
emitAbsValue(streamer, Length, 4);
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
// 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
// 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 {
// 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: }