Message ID | 20240918140535.1538392-1-matthieu.longo@arm.com |
---|---|
Headers | show |
Series | dwarf2: add hooks for architecture-specific CFIs | expand |
Matthieu Longo <matthieu.longo@arm.com> writes: > Architecture-specific CFI directives are currently declared an processed among others architecture-independent CFI directives in gcc/dwarf2* files. This approach creates confusion, specifically in the case of DWARF instructions in the vendor space and using the same instruction code. > Such a clash currently happen between DW_CFA_GNU_window_save (used on SPARC) and DW_CFA_AARCH64_negate_ra_state (used on AArch64), and both having the same instruction code 0x2d. Then AArch64 compilers generates a SPARC CFI directive (.cfi_window_save) instead of .cfi_negate_ra_state, contrarily to what is expected in [1]. The series LGTM, thanks. OK for trunk if there are no objections before Monday. Richard > 1. Rename REG_CFA_TOGGLE_RA_MANGLE to REG_CFA_NEGATE_RA_STATE > > This patch renames: > - dwarf2out_frame_debug_cfa_toggle_ra_mangle to dwarf2out_frame_debug_cfa_negate_ra_state, > - REG_CFA_TOGGLE_RA_MANGLE to REG_CFA_NEGATE_RA_STATE, > as the naming was misleading. > The word "toggle" suggested a binary state, whereas this register stores the mangling state (that can be more than 2 states) for the return address on AArch64. > > 2. dwarf2: add hooks for architecture-specific CFIs > > This refactoring does not solve completely the problem, but improve the situation by moving some of the processing of those directives (more specifically their output in the assembly) to the backend via 2 target hooks: > - DW_CFI_OPRND1_DESC: parse the first operand of the directive (if any). > - OUTPUT_CFI_DIRECTIVE: output the CFI directive as a string. > Only AArch64's and SPARC's backend are impacted. > > 3. aarch64 testsuite: explain expectections for pr94515* > PR94515's tests in AArch64 G++ testsuite were lacking documentation. They are now thoroughly documented. > > 4. dwarf2: store the RA state in CFI row > > On AArch64, the RA state informs the unwinder whether the return address is mangled and how, or not. This information is encoded in a boolean in the CFI row. This binary approach prevents from expressing more complex configuration, as it is the case with PAuth_LR introduced in Armv9.5-A. > This patch addresses this limitation by replacing the boolean by an enum. > > > References: > [1] DWARF for the Arm 64-bit Architecture (AArch64) --> https://github.com/ARM-software/abi-aa/blob/main/aadwarf64/aadwarf64.rst > > ### Diff between revisions 1 & 2 > > patch 1: no change. > patch 2: > - fix issue with default hook signature for new hooks. > - code style formatting. > - change targetm.dw_cfi_oprnd1_desc signature to match the one of dw_cfi_oprnd2_desc. > patch 3: > - add comments suggested by Richard Sandiford in test case gcc/testsuite/g++.target > /aarch64/pr94515-2.C. > patch 4: > - code style formatting. > > ## Testing > > Built for target aarch64-unknown-linux-gnu and ran GCC's & G++'s testsuites for AArch64. > Built GCC stage 1 for target sparc64-unknown-linux-gnu. > > > Ok for master? I don't have commit access so I need someone to commit on my behalf. > > Regards, > Matthieu. > > Matthieu Longo (4): > Rename REG_CFA_TOGGLE_RA_MANGLE to REG_CFA_NEGATE_RA_STATE > dwarf2: add hooks for architecture-specific CFIs > aarch64 testsuite: explain expectections for pr94515* tests > dwarf2: store the RA state in CFI row > > gcc/combine-stack-adj.cc | 2 +- > gcc/config/aarch64/aarch64.cc | 37 +++++++++++- > gcc/config/sparc/sparc.cc | 35 ++++++++++++ > gcc/coretypes.h | 6 ++ > gcc/doc/tm.texi | 16 +++++- > gcc/doc/tm.texi.in | 5 +- > gcc/dwarf2cfi.cc | 59 ++++++++++---------- > gcc/dwarf2out.cc | 13 +++-- > gcc/dwarf2out.h | 11 ++-- > gcc/hooks.cc | 14 +++++ > gcc/hooks.h | 3 + > gcc/reg-notes.def | 8 +-- > gcc/target.def | 20 +++++++ > gcc/testsuite/g++.target/aarch64/pr94515-1.C | 14 ++++- > gcc/testsuite/g++.target/aarch64/pr94515-2.C | 41 +++++++++++--- > include/dwarf2.h | 5 ++ > libffi/include/ffi_cfi.h | 2 + > libgcc/config/aarch64/aarch64-asm.h | 4 +- > libitm/config/aarch64/sjlj.S | 10 ++-- > 19 files changed, 239 insertions(+), 66 deletions(-)