Skip to content

Commit 0cd7942

Browse files
authored
[llvm-dwarfdump] Fix parsing DW_CFA_AARCH64_negate_ra_state (#84128)
The saved state of the AARCH64_DWARF_PAUTH_RA_STATE register was not updated, so `llvm-dwarfdump` continued to dump it as `reg34=1` even if the correct value is `0`: ``` > llvm-dwarfdump -v test.o ... 0000002c 00000024 00000030 FDE cie=00000000 pc=00000030...00000064 Format: DWARF32 DW_CFA_advance_loc: 4 DW_CFA_AARCH64_negate_ra_state: DW_CFA_advance_loc: 4 DW_CFA_def_cfa_offset: +16 DW_CFA_offset: W30 -16 DW_CFA_remember_state: DW_CFA_advance_loc: 16 DW_CFA_def_cfa_offset: +0 DW_CFA_advance_loc: 4 DW_CFA_AARCH64_negate_ra_state: DW_CFA_restore: W30 DW_CFA_advance_loc: 4 DW_CFA_restore_state: DW_CFA_advance_loc: 12 DW_CFA_def_cfa_offset: +0 DW_CFA_advance_loc: 4 DW_CFA_AARCH64_negate_ra_state: DW_CFA_restore: W30 DW_CFA_nop: 0x30: CFA=WSP 0x34: CFA=WSP: reg34=1 0x38: CFA=WSP+16: W30=[CFA-16], reg34=1 0x48: CFA=WSP: W30=[CFA-16], reg34=1 0x4c: CFA=WSP: reg34=1 <--- should be '=0' 0x50: CFA=WSP+16: W30=[CFA-16], reg34=1 0x5c: CFA=WSP: W30=[CFA-16], reg34=1 0x60: CFA=WSP: reg34=1 <--- should be '=0' ```
1 parent fcd2d48 commit 0cd7942

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

llvm/lib/DebugInfo/DWARF/DWARFDebugFrame.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,8 @@ Error UnwindTable::parseRows(const CFIProgram &CFIP, UnwindRow &Row,
630630
if (LRLoc->getLocation() == UnwindLocation::Constant) {
631631
// Toggle the constant value from 0 to 1 or 1 to 0.
632632
LRLoc->setConstant(LRLoc->getConstant() ^ 1);
633+
Row.getRegisterLocations().setRegisterLocation(
634+
AArch64DWARFPAuthRaState, *LRLoc);
633635
} else {
634636
return createStringError(
635637
errc::invalid_argument,

llvm/test/CodeGen/AArch64/sign-return-address-cfi-negate-ra-state.ll

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,10 @@ attributes #0 = { "sign-return-address"="all" }
213213
; CHECK-DUMP-NOT: DW_CFA_remember_state
214214
; CHECK-DUMP-NOT: DW_CFA_restore_state
215215

216+
; CHECK-DUMP: CFA=WSP{{$}}
217+
; CHECK-DUMP: reg34=1
218+
; CHECK-DUMP-NOT: reg34=0
219+
216220
; baz_async
217221
; CHECK-DUMP-LABEL: FDE
218222
; CHECK-DUMP: Format: DWARF32
@@ -222,9 +226,24 @@ attributes #0 = { "sign-return-address"="all" }
222226
; CHECK-DUMP: DW_CFA_restore_state:
223227
; CHECK-DUMP: DW_CFA_AARCH64_negate_ra_state:
224228

229+
; CHECK-DUMP: CFA=WSP{{$}}
230+
;; First DW_CFA_AARCH64_negate_ra_state:
231+
; CHECK-DUMP: reg34=1
232+
;; Second DW_CFA_AARCH64_negate_ra_state:
233+
; CHECK-DUMP: reg34=0
234+
;; DW_CFA_restore_state:
235+
; CHECK-DUMP: reg34=1
236+
;; Third DW_CFA_AARCH64_negate_ra_state:
237+
; CHECK-DUMP: reg34=0
238+
; CHECK-DUMP-NOT: reg34=
239+
225240
; baz_sync
226241
; CHECK-DUMP-LABEL: FDE
227242
; CHECK-DUMP: DW_CFA_AARCH64_negate_ra_state:
228243
; CHECK-DUMP-NOT: DW_CFA_AARCH64_negate_ra_state
229244
; CHECK-DUMP-NOT: DW_CFA_remember_state
230245
; CHECK-DUMP-NOT: DW_CFA_restore_state
246+
247+
; CHECK-DUMP: CFA=WSP{{$}}
248+
; CHECK-DUMP: reg34=1
249+
; CHECK-DUMP-NOT: reg34=0

0 commit comments

Comments
 (0)