Instead of asserting, fallback to emitting DWARF unwind info when an
attempt is made to output compact unwind info for a function with
multiple adjustments to the CFA offset.
Multiple adjustments of SP are common and with instruction precise
unwind tables these may translate into multiple `.cfi_def_cfa_offset`
directives.
Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=1302998
Reviewed By: dmgreen
Differential Revision: https://reviews.llvm.org/D121017
break;
}
case MCCFIInstruction::OpDefCfaOffset: {
- assert(StackSize == 0 && "We already have the CFA offset!");
+ if (StackSize != 0)
+ return CU::UNWIND_ARM64_MODE_DWARF;
StackSize = std::abs(Inst.getOffset());
break;
}
// CHECK: Contents of __compact_unwind section:
// CHECK: compact encoding: 0x03000000
+// CHECK: compact encoding: 0x03000000
// CHECK: .eh_frame contents:
// CHECK: DW_CFA_def_cfa: reg1 +32
-_cfi_dwarf:
+// DW_CFA_def_cfa_offset: +32
+// DW_CFA_def_cfa_offset: +64
+
+_cfi_dwarf0:
.cfi_startproc
.cfi_def_cfa x1, 32;
.cfi_endproc
+
+_cfi_dwarf1:
+ .cfi_startproc
+ .cfi_def_cfa_offset 32
+ .cfi_def_cfa_offset 64
+ .cfi_endproc