diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 0f7d7695c0eb9b2eb5431ca314c54edfed9b633e..c7837195e667a03d3f8f6d16b62c01ac875ee5fd 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -4929,6 +4929,22 @@ s_arm_unwind_pad (int ignored ATTRIBUTE_UNUSED) demand_empty_rest_of_line (); } +/* Parse an unwind_pacspval directive. */ + +static void +s_arm_unwind_pacspval (int ignored ATTRIBUTE_UNUSED) +{ + valueT op; + + if (!unwind.proc_start) + as_bad (MISSING_FNSTART); + + demand_empty_rest_of_line (); + + op = 0xb5; + add_unwind_opcode (op, 1); +} + /* Parse an unwind_setfp directive. */ static void @@ -5205,6 +5221,7 @@ const pseudo_typeS md_pseudo_table[] = { "vsave", s_arm_unwind_save, 1 }, { "movsp", s_arm_unwind_movsp, 0 }, { "pad", s_arm_unwind_pad, 0 }, + { "pacspval", s_arm_unwind_pacspval, 0 }, { "setfp", s_arm_unwind_setfp, 0 }, { "unwind_raw", s_arm_unwind_raw, 0 }, { "eabi_attribute", s_arm_eabi_attribute, 0 }, diff --git a/gas/doc/c-arm.texi b/gas/doc/c-arm.texi index 4016d3a76957e545ad8d3f1fad2067b94bb9b83e..8e00ccf55a5c86443e2977c3b8c6f4e6d7ef39d9 100644 --- a/gas/doc/c-arm.texi +++ b/gas/doc/c-arm.texi @@ -1085,6 +1085,12 @@ This directive writes 12-byte packed floating-point values to the output section. These are not compatible with current ARM processors or ABIs. +@anchor{arm_pacspval} +@cindex @code{.pacspval} directive, ARM +@item .pacspval +Generate unwinder annotations to use effective vsp as modifier in PAC +validation. + @anchor{arm_pad} @cindex @code{.pad} directive, ARM @item .pad #@var{count} diff --git a/gas/testsuite/gas/arm/ehabi-pacbti-m.d b/gas/testsuite/gas/arm/ehabi-pacbti-m.d new file mode 100644 index 0000000000000000000000000000000000000000..6039945f931a2975ae4752a5f711e62a00b6ce69 --- /dev/null +++ b/gas/testsuite/gas/arm/ehabi-pacbti-m.d @@ -0,0 +1,15 @@ +# name: Unwind Stack Frame information for Armv8.1-M.Mainline PAC extension +# source: ehabi-pacbti-m.s +# as: -march=armv8.1-m.main+mve+pacbti +# readelf: -u + +Unwind section '.ARM.exidx' at offset 0x5c contains 1 entry: + +0x0: @0x0 + Compact model index: 1 + 0xb1 0x08 pop {r3} + 0x80 0x08 pop {r7} + 0xb4 pop {ra_auth_code} + 0x84 0x00 pop {r14} + 0xb1 0x0f pop {r0, r1, r2, r3} + 0xb5 vsp as modifier for PAC validation diff --git a/gas/testsuite/gas/arm/ehabi-pacbti-m.s b/gas/testsuite/gas/arm/ehabi-pacbti-m.s new file mode 100644 index 0000000000000000000000000000000000000000..10185484c8c9716c394ab0cbe171c626b9847bfc --- /dev/null +++ b/gas/testsuite/gas/arm/ehabi-pacbti-m.s @@ -0,0 +1,38 @@ + .syntax unified + .thumb + .thumb_func + .fnstart + .cfi_startproc + .pacspval + pac ip, lr, sp + .cfi_register 143, 12 + push {r0, r1, r2, r3} + .save {r0, r1, r2, r3} + .cfi_def_cfa_offset 16 + .cfi_offset 0, -16 + .cfi_offset 1, -12 + .cfi_offset 2, -8 + .cfi_offset 3, -4 + push {r3, r7, ip, lr} + .save {r3, r7, ra_auth_code, lr} + .cfi_def_cfa_offset 32 + .cfi_offset 3, -32 + .cfi_offset 7, -28 + .cfi_offset 143, -24 + .cfi_offset 14, -20 + pop {r3, r7, ip, lr} + .cfi_restore 14 + .cfi_restore 143 + .cfi_restore 7 + .cfi_restore 3 + .cfi_def_cfa_offset 0 + add sp, sp, #16 + .cfi_restore 3 + .cfi_restore 2 + .cfi_restore 1 + .cfi_restore 0 + .cfi_def_cfa_offset -16 + aut ip, lr, sp + bx lr + .cfi_endproc + .fnend