Index: llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp =================================================================== --- llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp +++ llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp @@ -621,7 +621,8 @@ 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; } Index: llvm/test/MC/AArch64/arm64-compact-unwind-fallback.s =================================================================== --- llvm/test/MC/AArch64/arm64-compact-unwind-fallback.s +++ llvm/test/MC/AArch64/arm64-compact-unwind-fallback.s @@ -5,11 +5,21 @@ // 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