[PATCH][Binutils][GAS] arm: Add cfi expression support for ra_auth_code
Victor L. Do Nascimento
victor.donascimento@arm.com
Tue Jul 19 11:28:18 GMT 2022
Richard Earnshaw <Richard.Earnshaw@foss.arm.com> writes:
> On 18/07/2022 17:01, Victor Do Nascimento via Binutils wrote:
>> Hi all,
>> This patch extends assembler support for the use of ra_auth_code register,
>> particularly in the context of CFI directives, mapping the register to
>> the correct DWARF-2 register number.
>> Tested for arm-none-eabi.
>> Thanks,
>> Victor.
>> gas/Changelog:
>> * gas/config/tc-arm.c (tc_arm_regname_to_dw2regnum): Add
>> REG_TYPE_PSEUDO handling.
>> * gas/testsuite/gas/arm/cfi-pacbti-m-readelf.d: New.
>> * gas/testsuite/gas/arm/cfi-pacbti-m.s: New.
>> ---
>> gas/config/tc-arm.c | 9 ++++++
>> gas/testsuite/gas/arm/cfi-pacbti-m-readelf.d | 31 ++++++++++++++++++++
>> gas/testsuite/gas/arm/cfi-pacbti-m.s | 22 ++++++++++++++
>> 3 files changed, 62 insertions(+)
>> create mode 100644 gas/testsuite/gas/arm/cfi-pacbti-m-readelf.d
>> create mode 100644 gas/testsuite/gas/arm/cfi-pacbti-m.s
>> diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
>> index 2e6d175482e..bf912ccf2d5 100644
>> --- a/gas/config/tc-arm.c
>> +++ b/gas/config/tc-arm.c
>> @@ -27933,6 +27933,15 @@ tc_arm_regname_to_dw2regnum (char *regname)
>> if (reg != FAIL)
>> return reg + 256;
>> + reg = arm_reg_parse (®name, REG_TYPE_PSEUDO);
>> + switch (reg)
>> + {
>> + case 12:
>> + return 143;
>
> Sorry, this doesn't look right. The comment where the pseudos are defined says:
>
> /* DWARF ABI defines RA_AUTH_CODE to 143. It also reserves 134-142 for future
> expansion. RA_AUTH_CODE here is given the value 143 % 134 to make it easy
> for tc_arm_regname_to_dw2regnum to translate to DWARF reg number using
> 134 + reg_number should the range 134 to 142 be used for more pseudo regs
> in the future. This also helps fit RA_AUTH_CODE into a bitmask. */
>
> though I'll note that 143 % 134 is 9, not 12.
>
> So really, the code here should be adding back the base for the range that it
> covers rather than just handling a special case.
>
> And, of course, either the comment needs fixing, or the assigned internal number
> needs fixing.
>
> R.
Thanks for catchig this stale comment. I should have updated this when I
re-numbered RA_AUT_CODE.
The numerical mismatch between internal numbering of the pseudo-register
arising from the modulo operation described above and the physical reg
it mapped onto made the handling of mixed register lists (e.g. via
s_arm_unwind_save_mixed) seem unnecessarily complex at the time of
implementation. A pragmatic, albeit less elegant, solution was to have
RA_AUTH_CODE pseudo be numbered according to the restrictions imposed by
the PAC/PACBTI assembly instructions, which save the generated PAC code
in R12.
If you've no objections, will update the comment and resubmit.
V.
>> + default:
>> + break;
>> + }
>> +
>> return FAIL;
>> }
>> diff --git a/gas/testsuite/gas/arm/cfi-pacbti-m-readelf.d
>> b/gas/testsuite/gas/arm/cfi-pacbti-m-readelf.d
>> new file mode 100644
>> index 00000000000..997ea75f179
>> --- /dev/null
>> +++ b/gas/testsuite/gas/arm/cfi-pacbti-m-readelf.d
>> @@ -0,0 +1,31 @@
>> +#readelf: -wf
>> +#source: cfi-pacbti-m.s
>> +#name: Call Frame information for Armv8.1-M.Mainline PACBTI extension
>> +# This test is only valid on ELF based ports.
>> +#notarget: *-*-pe *-*-wince
>> +# VxWorks needs a special variant of this file.
>> +#skip: *-*-vxworks*
>> +
>> +Contents of the .eh_frame section:
>> +
>> +
>> +00000000 00000010 00000000 CIE
>> + Version: 1
>> + Augmentation: "zR"
>> + Code alignment factor: 2
>> + Data alignment factor: -4
>> + Return address column: 14
>> + Augmentation data: 1b
>> + DW_CFA_def_cfa: r13 ofs 0
>> +
>> +00000014 00000020 00000018 FDE cie=00000000 pc=00000000..0000000c
>> + DW_CFA_advance_loc: 4 to 00000004
>> + DW_CFA_register: r143 in r12
>> + DW_CFA_advance_loc: 4 to 00000008
>> + DW_CFA_def_cfa_offset: 8
>> + DW_CFA_offset: r14 at cfa-8
>> + DW_CFA_offset: r12 at cfa-4
>> + DW_CFA_advance_loc: 4 to 0000000c
>> + DW_CFA_restore_extended: r143
>> + DW_CFA_restore: r14
>> + DW_CFA_def_cfa_offset: 0
>> diff --git a/gas/testsuite/gas/arm/cfi-pacbti-m.s b/gas/testsuite/gas/arm/cfi-pacbti-m.s
>> new file mode 100644
>> index 00000000000..515400d86f5
>> --- /dev/null
>> +++ b/gas/testsuite/gas/arm/cfi-pacbti-m.s
>> @@ -0,0 +1,22 @@
>> + .arch armv8.1-m.main
>> + .arch_extension pacbti
>> + .eabi_attribute Tag_PAC_extension, 2
>> + .eabi_attribute Tag_BTI_extension, 2
>> + .eabi_attribute Tag_BTI_use, 1
>> + .eabi_attribute Tag_PACRET_use, 1
>> + .syntax unified
>> + .text
>> + .thumb
>> +.Lstart:
>> + .cfi_startproc
>> + pacbti ip, lr, sp
>> + .cfi_register ra_auth_code, ip
>> + push {ip, lr}
>> + .cfi_def_cfa_offset 8
>> + .cfi_offset lr, -8
>> + .cfi_offset ip, -4
>> + pop {ip, lr}
>> + .cfi_restore 143
>> + .cfi_restore 14
>> + .cfi_def_cfa_offset 0
>> + .cfi_endproc
More information about the Binutils
mailing list