From: Momchil Velikov Date: Wed, 23 Mar 2022 14:54:06 +0000 (+0000) Subject: [AArch64] Fallback to DWARF when trying to emit compact unwind info with multiple... X-Git-Tag: upstream/15.0.7~12606 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a6d238536d95e5c9c49ef2acf1916c95ab087240;p=platform%2Fupstream%2Fllvm.git [AArch64] Fallback to DWARF when trying to emit compact unwind info with multiple CFA offset adjustments 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 --- diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp index 83d33ac..85b2212 100644 --- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp +++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp @@ -621,7 +621,8 @@ public: 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; } diff --git a/llvm/test/MC/AArch64/arm64-compact-unwind-fallback.s b/llvm/test/MC/AArch64/arm64-compact-unwind-fallback.s index f4bb914..12525b7 100644 --- a/llvm/test/MC/AArch64/arm64-compact-unwind-fallback.s +++ b/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