From 0331cd9c511f347e9acf41b8ef2bf1afb63a4a35 Mon Sep 17 00:00:00 2001 From: Indu Bhagat Date: Thu, 18 Jul 2024 20:24:44 -0700 Subject: [PATCH] gas: aarch64: testsuite: add new tests for SCFI Similar to the x86_64 testcases, some .s files contain the corresponding CFI directives. This helps in validating the synthesized CFI by running those tests with and without the --scfi=experimental command line option. GAS issues some diagnostics, enabled by default, with --scfi=experimental. The diagnostics have been added with an intent to help user correct inadvertent errors in their hand-written asm. An error is issued when GAS finds that input asm is not amenable to accurate CFI synthesis. The existing scfi-diag-*.s tests in the gas/testsuite/gas/scfi/x86_64 directory test some SCFI diagnostics already: - (#1) "Warning: SCFI: Asymetrical register restore" - (#2) "Error: SCFI: usage of REG_FP as scratch not supported" - (#3) "Error: SCFI: unsupported stack manipulation pattern" - (#4) "Error: untraceable control flow for func 'XXX'" In the newly added aarch64 testsuite, further tests for additional diagnostics have been added: - scfi-diag-1.s in this patch highlights an aarch64-specific diagnostic: (#5) "Warning: SCFI: ignored probable save/restore op with reg offset" Additionally, some testcases are added to showcase the (currently) unsupported patterns, e.g., scfi-unsupported-1.s mov x16, 4384 sub sp, sp, x16 gas/testsuite/: * gas/scfi/README: Update comment to include aarch64. * gas/scfi/aarch64/scfi-aarch64.exp: New file. * gas/scfi/aarch64/ginsn-arith-1.l: New test. * gas/scfi/aarch64/ginsn-arith-1.s: New test. * gas/scfi/aarch64/ginsn-cofi-1.l: New test. * gas/scfi/aarch64/ginsn-cofi-1.s: New test. * gas/scfi/aarch64/ginsn-ldst-1.l: New test. * gas/scfi/aarch64/ginsn-ldst-1.s: New test. * gas/scfi/aarch64/scfi-callee-saved-fp-1.d: New test. * gas/scfi/aarch64/scfi-callee-saved-fp-1.l: New test. * gas/scfi/aarch64/scfi-callee-saved-fp-1.s: New test. * gas/scfi/aarch64/scfi-callee-saved-fp-2.d: New test. * gas/scfi/aarch64/scfi-callee-saved-fp-2.l: New test. * gas/scfi/aarch64/scfi-callee-saved-fp-2.s: New test. * gas/scfi/aarch64/scfi-cb-1.d: New test. * gas/scfi/aarch64/scfi-cb-1.l: New test. * gas/scfi/aarch64/scfi-cb-1.s: New test. * gas/scfi/aarch64/scfi-cfg-1.d: New test. * gas/scfi/aarch64/scfi-cfg-1.l: New test. * gas/scfi/aarch64/scfi-cfg-1.s: New test. * gas/scfi/aarch64/scfi-cfg-2.d: New test. * gas/scfi/aarch64/scfi-cfg-2.l: New test. * gas/scfi/aarch64/scfi-cfg-2.s: New test. * gas/scfi/aarch64/scfi-cfg-3.d: New test. * gas/scfi/aarch64/scfi-cfg-3.l: New test. * gas/scfi/aarch64/scfi-cfg-3.s: New test. * gas/scfi/aarch64/scfi-cfg-4.l: New test. * gas/scfi/aarch64/scfi-cfg-4.s: New test. * gas/scfi/aarch64/scfi-cond-br-1.d: New test. * gas/scfi/aarch64/scfi-cond-br-1.l: New test. * gas/scfi/aarch64/scfi-cond-br-1.s: New test. * gas/scfi/aarch64/scfi-diag-1.l: New test. * gas/scfi/aarch64/scfi-diag-1.s: New test. * gas/scfi/aarch64/scfi-diag-2.l: New test. * gas/scfi/aarch64/scfi-diag-2.s: New test. * gas/scfi/aarch64/scfi-diag-3.l: New test. * gas/scfi/aarch64/scfi-diag-3.s: New test. * gas/scfi/aarch64/scfi-ldrp-1.d: New test. * gas/scfi/aarch64/scfi-ldrp-1.l: New test. * gas/scfi/aarch64/scfi-ldrp-1.s: New test. * gas/scfi/aarch64/scfi-ldrp-2.d: New test. * gas/scfi/aarch64/scfi-ldrp-2.l: New test. * gas/scfi/aarch64/scfi-ldrp-2.s: New test. * gas/scfi/aarch64/scfi-ldstnap-1.d: New test. * gas/scfi/aarch64/scfi-ldstnap-1.l: New test. * gas/scfi/aarch64/scfi-ldstnap-1.s: New test. * gas/scfi/aarch64/scfi-strp-1.d: New test. * gas/scfi/aarch64/scfi-strp-1.l: New test. * gas/scfi/aarch64/scfi-strp-1.s: New test. * gas/scfi/aarch64/scfi-strp-2.d: New test. * gas/scfi/aarch64/scfi-strp-2.l: New test. * gas/scfi/aarch64/scfi-strp-2.s: New test. * gas/scfi/aarch64/scfi-unsupported-1.l: New test. * gas/scfi/aarch64/scfi-unsupported-1.s: New test. * gas/scfi/aarch64/scfi-unsupported-2.l: New test. * gas/scfi/aarch64/scfi-unsupported-2.s: New test. --- gas/testsuite/gas/scfi/README | 2 +- .../gas/scfi/aarch64/ginsn-arith-1.l | 40 +++++++ .../gas/scfi/aarch64/ginsn-arith-1.s | 19 ++++ gas/testsuite/gas/scfi/aarch64/ginsn-cofi-1.l | 30 ++++++ gas/testsuite/gas/scfi/aarch64/ginsn-cofi-1.s | 16 +++ gas/testsuite/gas/scfi/aarch64/ginsn-ldst-1.l | 101 ++++++++++++++++++ gas/testsuite/gas/scfi/aarch64/ginsn-ldst-1.s | 53 +++++++++ gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.l | 48 +++++++++ gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.s | 33 ++++++ .../gas/scfi/aarch64/scfi-aarch64.exp | 74 +++++++++++++ .../gas/scfi/aarch64/scfi-callee-saved-fp-1.d | 57 ++++++++++ .../gas/scfi/aarch64/scfi-callee-saved-fp-1.l | 2 + .../gas/scfi/aarch64/scfi-callee-saved-fp-1.s | 50 +++++++++ .../gas/scfi/aarch64/scfi-callee-saved-fp-2.d | 57 ++++++++++ .../gas/scfi/aarch64/scfi-callee-saved-fp-2.l | 2 + .../gas/scfi/aarch64/scfi-callee-saved-fp-2.s | 50 +++++++++ gas/testsuite/gas/scfi/aarch64/scfi-cb-1.d | 20 ++++ gas/testsuite/gas/scfi/aarch64/scfi-cb-1.l | 2 + gas/testsuite/gas/scfi/aarch64/scfi-cb-1.s | 14 +++ gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.d | 31 ++++++ gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.l | 2 + gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.s | 46 ++++++++ gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.d | 40 +++++++ gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.l | 2 + gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.s | 42 ++++++++ gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.d | 32 ++++++ gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.l | 2 + gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.s | 34 ++++++ gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.d | 41 +++++++ gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.l | 2 + gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.s | 41 +++++++ .../gas/scfi/aarch64/scfi-cond-br-1.d | 20 ++++ .../gas/scfi/aarch64/scfi-cond-br-1.l | 2 + .../gas/scfi/aarch64/scfi-cond-br-1.s | 13 +++ gas/testsuite/gas/scfi/aarch64/scfi-diag-1.l | 2 + gas/testsuite/gas/scfi/aarch64/scfi-diag-1.s | 6 ++ gas/testsuite/gas/scfi/aarch64/scfi-diag-2.l | 3 + gas/testsuite/gas/scfi/aarch64/scfi-diag-2.s | 25 +++++ gas/testsuite/gas/scfi/aarch64/scfi-diag-3.l | 3 + gas/testsuite/gas/scfi/aarch64/scfi-diag-3.s | 8 ++ gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.d | 59 ++++++++++ gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.l | 2 + gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.s | 52 +++++++++ gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.d | 33 ++++++ gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.l | 2 + gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.s | 26 +++++ .../gas/scfi/aarch64/scfi-ldstnap-1.d | 39 +++++++ .../gas/scfi/aarch64/scfi-ldstnap-1.l | 2 + .../gas/scfi/aarch64/scfi-ldstnap-1.s | 30 ++++++ gas/testsuite/gas/scfi/aarch64/scfi-strp-1.d | 39 +++++++ gas/testsuite/gas/scfi/aarch64/scfi-strp-1.l | 2 + gas/testsuite/gas/scfi/aarch64/scfi-strp-1.s | 37 +++++++ gas/testsuite/gas/scfi/aarch64/scfi-strp-2.d | 35 ++++++ gas/testsuite/gas/scfi/aarch64/scfi-strp-2.l | 2 + gas/testsuite/gas/scfi/aarch64/scfi-strp-2.s | 30 ++++++ .../gas/scfi/aarch64/scfi-unsupported-1.l | 4 + .../gas/scfi/aarch64/scfi-unsupported-1.s | 31 ++++++ .../gas/scfi/aarch64/scfi-unsupported-2.l | 2 + .../gas/scfi/aarch64/scfi-unsupported-2.s | 8 ++ 59 files changed, 1501 insertions(+), 1 deletion(-) create mode 100644 gas/testsuite/gas/scfi/aarch64/ginsn-arith-1.l create mode 100644 gas/testsuite/gas/scfi/aarch64/ginsn-arith-1.s create mode 100644 gas/testsuite/gas/scfi/aarch64/ginsn-cofi-1.l create mode 100644 gas/testsuite/gas/scfi/aarch64/ginsn-cofi-1.s create mode 100644 gas/testsuite/gas/scfi/aarch64/ginsn-ldst-1.l create mode 100644 gas/testsuite/gas/scfi/aarch64/ginsn-ldst-1.s create mode 100644 gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.l create mode 100644 gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.s create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-aarch64.exp create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-1.d create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-1.l create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-1.s create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-2.d create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-2.l create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-2.s create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cb-1.d create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cb-1.l create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cb-1.s create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.d create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.l create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.s create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.d create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.l create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.s create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.d create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.l create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.s create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.d create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.l create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.s create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cond-br-1.d create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cond-br-1.l create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-cond-br-1.s create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-diag-1.l create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-diag-1.s create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-diag-2.l create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-diag-2.s create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-diag-3.l create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-diag-3.s create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.d create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.l create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.s create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.d create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.l create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.s create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-ldstnap-1.d create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-ldstnap-1.l create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-ldstnap-1.s create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-strp-1.d create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-strp-1.l create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-strp-1.s create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-strp-2.d create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-strp-2.l create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-strp-2.s create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-unsupported-1.l create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-unsupported-1.s create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-unsupported-2.l create mode 100644 gas/testsuite/gas/scfi/aarch64/scfi-unsupported-2.s diff --git a/gas/testsuite/gas/scfi/README b/gas/testsuite/gas/scfi/README index ddb8a3d1320..c1d6d9d0a3e 100644 --- a/gas/testsuite/gas/scfi/README +++ b/gas/testsuite/gas/scfi/README @@ -1,6 +1,6 @@ Notes on the SCFI testsuite in GAS: -* At this time, SCFI machinery is only supported for x86_64. +* At this time, SCFI machinery is only supported for x86_64 and aarch64. * When adding more core SCFI tests (scfi-* tests), please keep CFI annotations updated in the .s files. Ideally the test should be run with and diff --git a/gas/testsuite/gas/scfi/aarch64/ginsn-arith-1.l b/gas/testsuite/gas/scfi/aarch64/ginsn-arith-1.l new file mode 100644 index 00000000000..de1fb2a8807 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/ginsn-arith-1.l @@ -0,0 +1,40 @@ +.*: Assembler messages: +.*:13: Error: SCFI: unsupported stack manipulation pattern +.*:19: Error: SCFI: forward pass failed for func 'foo' + +AARCH64 GAS .* + + + 1 # Testcase for a variety of arith instructions + 2 .text + 3 .align 2 + 4 .global foo + 5 .type foo, %function + 5 ginsn: SYM FUNC_BEGIN + 6 foo: + 6 ginsn: SYM foo + 7 \?\?\?\? FF830091 add sp, sp, 32 + 7 ginsn: ADD %r31, 32, %r31 + 8 \?\?\?\? FD5B21B1 adds x29, sp, 2134 + 8 ginsn: ADD %r31, 2134, %r29 + 9 \?\?\?\? FF8300D1 sub sp, sp, 32 + 9 ginsn: SUB %r31, 32, %r31 + 10 \?\?\?\? FD5B21F1 subs x29, sp, 2134 + 10 ginsn: SUB %r31, 2134, %r29 + 11 \?\?\?\? FD63228B add x29, sp, x2 + 11 ginsn: ADD %r31, %r2, %r29 + 12 \?\?\?\? FD6323CB sub x29, sp, x3 + 12 ginsn: SUB %r31, %r3, %r29 + 13 \?\?\?\? BF63238B add sp, x29, x3 + 13 ginsn: ADD %r29, %r3, %r31 + 14 \?\?\?\? BF6322CB sub sp, x29, x2 + 14 ginsn: SUB %r29, %r2, %r31 + 15 \?\?\?\? 1F48220B add wsp, w0, w2, lsl 2 + 15 ginsn: OTH 0, 0, %r31 + 16 \?\?\?\? A4C0228B add x4, x5, x2, sxtw + 17 \?\?\?\? BFC0228B add sp, x5, x2, sxtw + 17 ginsn: OTH 0, 0, %r31 + 18 \?\?\?\? C0035FD6 ret + 18 ginsn: RET + 19 .size foo, .-foo + 19 ginsn: SYM FUNC_END diff --git a/gas/testsuite/gas/scfi/aarch64/ginsn-arith-1.s b/gas/testsuite/gas/scfi/aarch64/ginsn-arith-1.s new file mode 100644 index 00000000000..503196e56ac --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/ginsn-arith-1.s @@ -0,0 +1,19 @@ +# Testcase for a variety of arith instructions + .text + .align 2 + .global foo + .type foo, %function +foo: + add sp, sp, 32 + adds x29, sp, 2134 + sub sp, sp, 32 + subs x29, sp, 2134 + add x29, sp, x2 + sub x29, sp, x3 + add sp, x29, x3 + sub sp, x29, x2 + add wsp, w0, w2, lsl 2 + add x4, x5, x2, sxtw + add sp, x5, x2, sxtw + ret + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/ginsn-cofi-1.l b/gas/testsuite/gas/scfi/aarch64/ginsn-cofi-1.l new file mode 100644 index 00000000000..d05e19d059d --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/ginsn-cofi-1.l @@ -0,0 +1,30 @@ +.*: Assembler messages: +.*:16: Error: untraceable control flow for func 'foo' + +AARCH64 GAS .* + + 1 # Testcase for a variety of change of flow instructions + 2 # Because some of these are indirect branches, SCFI will bail out + 3 # with an error. This test merely checks that the ginsn creation + 4 # process can handle these insns gracefully. + 5 .text + 6 .align 2 + 7 .global foo + 8 .type foo, %function + 8 ginsn: SYM FUNC_BEGIN + 9 foo: + 9 ginsn: SYM foo + 10 \?\?\?\? 00000094 bl dump_bt + 10 ginsn: CALL + 11 \?\?\?\? 02000014 b .L3 + 11 ginsn: JMP + 12 \?\?\?\? 20021FD6 br x17 + 12 ginsn: JMP %r17, + 13 .L3: + 13 ginsn: SYM .L3 + 14 \?\?\?\? 60003FD6 blr x3 + 14 ginsn: CALL + 15 \?\?\?\? C0035FD6 ret + 15 ginsn: RET + 16 .size foo, .-foo + 16 ginsn: SYM FUNC_END diff --git a/gas/testsuite/gas/scfi/aarch64/ginsn-cofi-1.s b/gas/testsuite/gas/scfi/aarch64/ginsn-cofi-1.s new file mode 100644 index 00000000000..bbcbe4e02a4 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/ginsn-cofi-1.s @@ -0,0 +1,16 @@ +# Testcase for a variety of change of flow instructions +# Because some of these are indirect branches, SCFI will bail out +# with an error. This test merely checks that the ginsn creation +# process can handle these insns gracefully. + .text + .align 2 + .global foo + .type foo, %function +foo: + bl dump_bt + b .L3 + br x17 +.L3: + blr x3 + ret + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/ginsn-ldst-1.l b/gas/testsuite/gas/scfi/aarch64/ginsn-ldst-1.l new file mode 100644 index 00000000000..3471347e156 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/ginsn-ldst-1.l @@ -0,0 +1,101 @@ +AARCH64 GAS .* + + 1 # Testcase for a variety of ld st instructions. + 2 # stg ops must generate the sp update arithmetic insn, when applicable + 3 # due to writeback. + 4 .text + 5 .align 2 + 6 .global foo + 7 .type foo, %function + 7 ginsn: SYM FUNC_BEGIN + 8 foo: + 8 ginsn: SYM foo + 9 # ldstpair_indexed + 10 0000 FF7F8629 stp wzr, wzr, \[sp, 48\]! + 10 ginsn: ADD %r31, 48, %r31 + 11 0004 E00782A9 stp x0, x1, \[sp, 32\]! + 11 ginsn: ADD %r31, 32, %r31 + 11 ginsn: STORE %r0, \[%r31\+0\] + 11 ginsn: STORE %r1, \[%r31\+8\] + 12 0008 E827BC6D stp d8, d9, \[sp, -64\]! + 12 ginsn: ADD %r31, -64, %r31 + 12 ginsn: STORE %r72, \[%r31\+0\] + 12 ginsn: STORE %r73, \[%r31\+8\] + 13 000c E827C46C ldp d8, d9, \[sp\], 64 + 13 ginsn: LOAD \[%r31\+0\], %r72 + 13 ginsn: LOAD \[%r31\+8\], %r73 + 13 ginsn: ADD %r31, 64, %r31 + 14 # 32-bit FP regs + 15 0010 E51BB42D stp s5, s6, \[sp, -96\]! + 15 ginsn: ADD %r31, -96, %r31 + 16 0014 E51BCC2C ldp s5, s6, \[sp\], 96 + 16 ginsn: ADD %r31, 96, %r31 + 17 # 32-bit INT regs + 18 0018 E10BB029 stp w1, w2, \[sp, -128\]! + 18 ginsn: ADD %r31, -128, %r31 + 19 001c E10BD028 ldp w1, w2, \[sp\], 128 + 19 ginsn: ADD %r31, 128, %r31 + 20 # ldstpair_off + 21 0020 E00702AD stp q0, q1, \[sp, 64\] + 21 ginsn: STORE %r64, \[%r31\+64\] + 21 ginsn: STORE %r65, \[%r31\+80\] + 22 0024 FF7F0629 stp wzr, wzr, \[sp, 48\] + 23 0028 1F7840AD ldp q31, q30, \[x0\] + 23 ginsn: LOAD \[%r0\+0\], %r95 + 23 ginsn: LOAD \[%r0\+16\], %r94 + 24 002c FF4F01A9 stp xzr, x19, \[sp, 16\] + 24 ginsn: STORE %r19, \[%r31\+24\] + 25 0030 F37F01A9 stp x19, xzr, \[sp, 16\] + 25 ginsn: STORE %r19, \[%r31\+16\] + 26 # ldst_imm9 + 27 0034 E78F4F38 ldrb w7, \[sp, 248\]! + 27 ginsn: ADD %r31, 248, %r31 + 28 0038 FD0FC33C ldr q29, \[sp, 48\]! + 28 ginsn: ADD %r31, 48, %r31 + 28 ginsn: LOAD \[%r31\+0\], %r93 + 29 003c FF0F42B8 ldr wzr, \[sp, 32\]! + 29 ginsn: ADD %r31, 32, %r31 + 30 0040 E30742F8 ldr x3, \[sp\], 32 + 30 ginsn: LOAD \[%r31\+0\], %r3 + AARCH64 GAS .* + + + 30 ginsn: ADD %r31, 32, %r31 + 31 # 32-bit ldr + 32 0044 E10744BC ldr s1, \[sp\], 64 + 32 ginsn: ADD %r31, 64, %r31 + 33 # ldst_pos + 34 0048 FF3340B9 ldr wzr, \[sp, 48\] + 35 004c FD1300F9 str x29, \[sp, 32\] + 35 ginsn: STORE %r29, \[%r31\+32\] + 36 0050 FD1340F9 ldr x29, \[sp, 32\] + 36 ginsn: LOAD \[%r31\+32\], %r29 + 37 # store tag + 38 0054 FF2F20D9 stg sp, \[sp, 32\]! + 38 ginsn: ADD %r31, 32, %r31 + 39 # store tag pair + 40 0058 FBF38169 stgp x27, x28, \[sp, 48\]! + 40 ginsn: ADD %r31, 48, %r31 + 41 # ldpsw / ldrsw + 42 005c F353E069 ldpsw x19, x20, \[sp, -256\]! + 42 ginsn: ADD %r31, -256, %r31 + 43 0060 F50F98B8 ldrsw x21, \[sp, -128\]! + 43 ginsn: ADD %r31, -128, %r31 + 44 # ldrsb / ldrsh + 45 0064 F70F9938 ldrsb x23, \[sp, -112\]! + 45 ginsn: ADD %r31, -112, %r31 + 46 0068 F88F9978 ldrsh x24, \[sp, -104\]! + 46 ginsn: ADD %r31, -104, %r31 + 47 # ldrb / ldrh / strb / strh + 48 006c F90F5A38 ldrb w25, \[sp, -96\]! + 48 ginsn: ADD %r31, -96, %r31 + 49 0070 FA8F5A78 ldrh w26, \[sp, -88\]! + 49 ginsn: ADD %r31, -88, %r31 + 50 0074 F90F1A38 strb w25, \[sp, -96\]! + 50 ginsn: ADD %r31, -96, %r31 + 51 0078 FA8F1A78 strh w26, \[sp, -88\]! + 51 ginsn: ADD %r31, -88, %r31 + 52 007c C0035FD6 ret + 52 ginsn: RET + 53 .size foo, .-foo + 53 ginsn: SYM FUNC_END diff --git a/gas/testsuite/gas/scfi/aarch64/ginsn-ldst-1.s b/gas/testsuite/gas/scfi/aarch64/ginsn-ldst-1.s new file mode 100644 index 00000000000..98df9c6dc5a --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/ginsn-ldst-1.s @@ -0,0 +1,53 @@ +# Testcase for a variety of ld st instructions. +# stg ops must generate the sp update arithmetic insn, when applicable +# due to writeback. + .text + .align 2 + .global foo + .type foo, %function +foo: +# ldstpair_indexed + stp wzr, wzr, [sp, 48]! + stp x0, x1, [sp, 32]! + stp d8, d9, [sp, -64]! + ldp d8, d9, [sp], 64 +# 32-bit FP regs + stp s5, s6, [sp, -96]! + ldp s5, s6, [sp], 96 +# 32-bit INT regs + stp w1, w2, [sp, -128]! + ldp w1, w2, [sp], 128 +# ldstpair_off + stp q0, q1, [sp, 64] + stp wzr, wzr, [sp, 48] + ldp q31, q30, [x0] + stp xzr, x19, [sp, 16] + stp x19, xzr, [sp, 16] +# ldst_imm9 + ldrb w7, [sp, 248]! + ldr q29, [sp, 48]! + ldr wzr, [sp, 32]! + ldr x3, [sp], 32 +# 32-bit ldr + ldr s1, [sp], 64 +# ldst_pos + ldr wzr, [sp, 48] + str x29, [sp, 32] + ldr x29, [sp, 32] +# store tag + stg sp, [sp, 32]! +# store tag pair + stgp x27, x28, [sp, 48]! +# ldpsw / ldrsw + ldpsw x19, x20, [sp, -256]! + ldrsw x21, [sp, -128]! +# ldrsb / ldrsh + ldrsb x23, [sp, -112]! + ldrsh x24, [sp, -104]! +# ldrb / ldrh / strb / strh + ldrb w25, [sp, -96]! + ldrh w26, [sp, -88]! + strb w25, [sp, -96]! + strh w26, [sp, -88]! + ret + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.l b/gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.l new file mode 100644 index 00000000000..7bd70e3e955 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.l @@ -0,0 +1,48 @@ +.*: Assembler messages: +.*:13: Error: SCFI: unsupported stack manipulation pattern +.*:33: Error: SCFI: forward pass failed for func 'foo' + +AARCH64 GAS .* + + + 1 # Testcase for a variety of misc instructions. + 2 # Ensure graceful handling, irrespective of ginsn generation. + 3 # - ldrsw, ldpsw ops need a mention: they are 32-bit loads from memory + 4 # and cannot be used for reg restore. For CFI purposes, the width has to be + 5 # 8 bytes or more. Expect no memory ginsn ever as ginsn do not track width + 6 # of memory accesses yet. + 7 symbol: + 8 \?\?\?\? 7700 .string "w" + 9 + 10 .type foo, %function + 10 ginsn: SYM FUNC_BEGIN + 11 foo: + 11 ginsn: SYM foo + 12 \?\?\?\? 00000000 adrp x0, symbol + 12 0090 + 13 \?\?\?\? 1F000091 add sp, x0, :lo12:symbol + 13 ginsn: OTH 0, 0, %r31 + 14 \?\?\?\? 2000A0F2 movk x0, 0x1, lsl 16 + 15 \?\?\?\? E10380F9 prfm PLDL1STRM, \[sp\] + 16 \?\?\?\? E013DF9A irg x0, sp + 17 \?\?\?\? 000820D9 stg x0, \[x0\] + 18 \?\?\?\? F5DB3C69 stgp x21, x22, \[sp, -112\] + 19 \?\?\?\? E03FBF91 addg x0, sp, #0x3f0, #0xf + 20 \?\?\?\? 1F3CAA91 addg sp, x0, #0x2a0, #0xf + 20 ginsn: OTH 0, 0, %r31 + 21 \?\?\?\? F4577069 ldpsw x20, x21, \[sp, -128\] + 22 \?\?\?\? F3534069 ldpsw x19, x20, \[sp\] + 23 \?\?\?\? 9B0080B9 ldrsw x27, \[x4\] + 24 \?\?\?\? F4038039 ldrsb x20, \[sp\] + 25 \?\?\?\? F4038079 ldrsh x20, \[sp\] + 26 # Test a few insn with wzr / xzr + 27 \?\?\?\? 3F0480D2 mov xzr, 33 + 28 \?\?\?\? E0031FAA mov x0, xzr + 29 \?\?\?\? 1F00018B add xzr, x0, x1 + 30 \?\?\?\? 3F603F8B add sp, x1, xzr + 30 ginsn: ADD %r1, %r31, %r31 + 31 \?\?\?\? FF031F8B add xzr, xzr, xzr + 32 \?\?\?\? C0035FD6 ret + 32 ginsn: RET + 33 .size foo,.-foo + 33 ginsn: SYM FUNC_END diff --git a/gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.s b/gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.s new file mode 100644 index 00000000000..ddce948b365 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.s @@ -0,0 +1,33 @@ +# Testcase for a variety of misc instructions. +# Ensure graceful handling, irrespective of ginsn generation. +# - ldrsw, ldpsw ops need a mention: they are 32-bit loads from memory +# and cannot be used for reg restore. For CFI purposes, the width has to be +# 8 bytes or more. Expect no memory ginsn ever as ginsn do not track width +# of memory accesses yet. +symbol: + .string "w" + + .type foo, %function +foo: + adrp x0, symbol + add sp, x0, :lo12:symbol + movk x0, 0x1, lsl 16 + prfm PLDL1STRM, [sp] + irg x0, sp + stg x0, [x0] + stgp x21, x22, [sp, -112] + addg x0, sp, #0x3f0, #0xf + addg sp, x0, #0x2a0, #0xf + ldpsw x20, x21, [sp, -128] + ldpsw x19, x20, [sp] + ldrsw x27, [x4] + ldrsb x20, [sp] + ldrsh x20, [sp] +# Test a few insn with wzr / xzr + mov xzr, 33 + mov x0, xzr + add xzr, x0, x1 + add sp, x1, xzr + add xzr, xzr, xzr + ret + .size foo,.-foo diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-aarch64.exp b/gas/testsuite/gas/scfi/aarch64/scfi-aarch64.exp new file mode 100644 index 00000000000..9a0b2856cb4 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-aarch64.exp @@ -0,0 +1,74 @@ +# Copyright (C) 2022-2023 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + +if { ![is_elf_format] } then { + return +} + +# common tests +if { ([istarget "aarch64-*-*"]) } then { + + global ASFLAGS + set old_ASFLAGS "$ASFLAGS" + + run_list_test "ginsn-arith-1" "--scfi=experimental -ali --warn" + run_list_test "ginsn-cofi-1" "--scfi=experimental -ali --warn" + run_list_test "ginsn-ldst-1" "--scfi=experimental -march=armv8-a+memtag -ali --warn" + run_list_test "ginsn-misc-1" "--scfi=experimental -march=armv8-a+memtag -ali --warn" + + run_list_test "scfi-diag-1" "--scfi=experimental" + run_list_test "scfi-diag-2" "--scfi=experimental" + run_list_test "scfi-diag-3" "--scfi=experimental" + + run_list_test "scfi-unsupported-1" "--scfi=experimental" + run_list_test "scfi-unsupported-2" "--scfi=experimental" + + run_dump_test "scfi-callee-saved-fp-1" + run_list_test "scfi-callee-saved-fp-1" "--scfi=experimental --warn" + run_dump_test "scfi-callee-saved-fp-2" + run_list_test "scfi-callee-saved-fp-2" "--scfi=experimental --warn" + + run_dump_test "scfi-ldrp-1" + run_list_test "scfi-ldrp-1" "--scfi=experimental --warn" + run_dump_test "scfi-ldrp-2" + run_list_test "scfi-ldrp-2" "--scfi=experimental --warn" + + run_dump_test "scfi-strp-1" + run_list_test "scfi-strp-1" "--scfi=experimental --warn" + run_dump_test "scfi-strp-2" + run_list_test "scfi-strp-2" "--scfi=experimental --warn" + + run_dump_test "scfi-ldstnap-1" + run_list_test "scfi-ldstnap-1" "--scfi=experimental --warn" + + run_dump_test "scfi-cb-1" + run_list_test "scfi-cb-1" "--scfi=experimental --warn" + run_dump_test "scfi-cond-br-1" + run_list_test "scfi-cond-br-1" "--scfi=experimental --warn" + + run_dump_test "scfi-cfg-1" + run_list_test "scfi-cfg-1" "--scfi=experimental --warn" + + run_dump_test "scfi-cfg-2" + run_list_test "scfi-cfg-2" "--scfi=experimental --warn" + + run_dump_test "scfi-cfg-3" + run_list_test "scfi-cfg-3" "--scfi=experimental --warn" + + run_dump_test "scfi-cfg-4" + run_list_test "scfi-cfg-4" "--scfi=experimental --warn" + +} diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-1.d b/gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-1.d new file mode 100644 index 00000000000..da4b8a0bee0 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-1.d @@ -0,0 +1,57 @@ +#as: --scfi=experimental -W +#objdump: -Wf +#name: Synthesize CFI for callee-saved FP regs I +#... +Contents of the .eh_frame section: + +00000000 0+0010 00000000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 4 + Data alignment factor: -8 + Return address column: 30 + Augmentation data: 1b + DW_CFA_def_cfa: r31 \(sp\) ofs 0 + +00000014 0+[0-9a-f]+ 0+0018 FDE cie=00000000 pc=0+0000..0+0040 + DW_CFA_advance_loc: 4 to 0+0004 + DW_CFA_def_cfa_offset: 128 + DW_CFA_offset: r29 \(x29\) at cfa-128 + DW_CFA_offset: r30 \(x30\) at cfa-120 + DW_CFA_advance_loc: 4 to 0+0008 + DW_CFA_def_cfa_register: r29 \(x29\) + DW_CFA_advance_loc: 4 to 0+000c + DW_CFA_offset_extended: r72 \(v8\) at cfa-112 + DW_CFA_advance_loc: 4 to 0+0010 + DW_CFA_offset_extended: r73 \(v9\) at cfa-104 + DW_CFA_advance_loc: 4 to 0+0014 + DW_CFA_offset_extended: r74 \(v10\) at cfa-96 + DW_CFA_offset_extended: r75 \(v11\) at cfa-88 + DW_CFA_advance_loc: 4 to 0+0018 + DW_CFA_offset_extended: r76 \(v12\) at cfa-80 + DW_CFA_offset_extended: r77 \(v13\) at cfa-72 + DW_CFA_advance_loc: 4 to 0+001c + DW_CFA_offset_extended: r78 \(v14\) at cfa-64 + DW_CFA_offset_extended: r79 \(v15\) at cfa-56 + DW_CFA_advance_loc: 8 to 0+0024 + DW_CFA_def_cfa_register: r31 \(sp\) + DW_CFA_advance_loc: 4 to 0+0028 + DW_CFA_restore_extended: r72 \(v8\) + DW_CFA_advance_loc: 4 to 0+002c + DW_CFA_restore_extended: r73 \(v9\) + DW_CFA_advance_loc: 4 to 0+0030 + DW_CFA_restore_extended: r74 \(v10\) + DW_CFA_restore_extended: r75 \(v11\) + DW_CFA_advance_loc: 4 to 0+0034 + DW_CFA_restore_extended: r76 \(v12\) + DW_CFA_restore_extended: r77 \(v13\) + DW_CFA_advance_loc: 4 to 0+0038 + DW_CFA_restore_extended: r78 \(v14\) + DW_CFA_restore_extended: r79 \(v15\) + DW_CFA_advance_loc: 4 to 0+003c + DW_CFA_restore: r29 \(x29\) + DW_CFA_restore: r30 \(x30\) + DW_CFA_def_cfa_offset: 0 + DW_CFA_nop + +#pass diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-1.l b/gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-1.l new file mode 100644 index 00000000000..5ff6048bef0 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-1.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*8: Warning: SCFI ignores most user-specified CFI directives diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-1.s b/gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-1.s new file mode 100644 index 00000000000..0f7afe278fc --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-1.s @@ -0,0 +1,50 @@ +# Testcase for callee-saved FP registers. +# Uses a combination of str/stp and ldr/ldp + .text + .align 2 + .global foo + .type foo, %function +foo: + .cfi_startproc + stp x29, x30, [sp, -128]! + .cfi_def_cfa_offset 128 + .cfi_offset 29, -128 + .cfi_offset 30, -120 + mov x29, sp + .cfi_def_cfa_register 29 + str d8, [sp, 16] + .cfi_offset 72, -112 + str d9, [sp, 24] + .cfi_offset 73, -104 + stp d10, d11, [sp, 32] + .cfi_offset 74, -96 + .cfi_offset 75, -88 + stp d12, d13, [sp, 48] + .cfi_offset 76, -80 + .cfi_offset 77, -72 + stp d14, d15, [sp, 64] + .cfi_offset 78, -64 + .cfi_offset 79, -56 + mov w0, 0 + mov sp, x29 + .cfi_def_cfa_register 31 + ldr d8, [sp, 16] + .cfi_restore 72 + ldr d9, [sp, 24] + .cfi_restore 73 + ldp d10, d11, [sp, 32] + .cfi_restore 74 + .cfi_restore 75 + ldp d12, d13, [sp, 48] + .cfi_restore 76 + .cfi_restore 77 + ldp d14, d15, [sp, 64] + .cfi_restore 78 + .cfi_restore 79 + ldp x29, x30, [sp], 128 + .cfi_restore 29 + .cfi_restore 30 + .cfi_def_cfa_offset 0 + ret + .cfi_endproc + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-2.d b/gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-2.d new file mode 100644 index 00000000000..0e3de4c2ffb --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-2.d @@ -0,0 +1,57 @@ +#as: --scfi=experimental -W -mbig-endian +#objdump: -Wf +#name: Synthesize CFI for callee-saved FP regs BE II +#... +Contents of the .eh_frame section: + +00000000 0+0010 00000000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 4 + Data alignment factor: -8 + Return address column: 30 + Augmentation data: 1b + DW_CFA_def_cfa: r31 \(sp\) ofs 0 + +00000014 0+[0-9a-f]+ 0+0018 FDE cie=00000000 pc=0+0000..0+0040 + DW_CFA_advance_loc: 4 to 0+0004 + DW_CFA_def_cfa_offset: 256 + DW_CFA_offset: r29 \(x29\) at cfa-256 + DW_CFA_offset: r30 \(x30\) at cfa-248 + DW_CFA_advance_loc: 4 to 0+0008 + DW_CFA_def_cfa_register: r29 \(x29\) + DW_CFA_advance_loc: 4 to 0+000c + DW_CFA_offset_extended: r72 \(v8\) at cfa-232 + DW_CFA_advance_loc: 4 to 0+0010 + DW_CFA_offset_extended: r73 \(v9\) at cfa-216 + DW_CFA_advance_loc: 4 to 0+0014 + DW_CFA_offset_extended: r74 \(v10\) at cfa-184 + DW_CFA_offset_extended: r75 \(v11\) at cfa-168 + DW_CFA_advance_loc: 4 to 0+0018 + DW_CFA_offset_extended: r76 \(v12\) at cfa-152 + DW_CFA_offset_extended: r77 \(v13\) at cfa-136 + DW_CFA_advance_loc: 4 to 0+001c + DW_CFA_offset_extended: r78 \(v14\) at cfa-120 + DW_CFA_offset_extended: r79 \(v15\) at cfa-104 + DW_CFA_advance_loc: 8 to 0+0024 + DW_CFA_def_cfa_register: r31 \(sp\) + DW_CFA_advance_loc: 4 to 0+0028 + DW_CFA_restore_extended: r72 \(v8\) + DW_CFA_advance_loc: 4 to 0+002c + DW_CFA_restore_extended: r73 \(v9\) + DW_CFA_advance_loc: 4 to 0+0030 + DW_CFA_restore_extended: r74 \(v10\) + DW_CFA_restore_extended: r75 \(v11\) + DW_CFA_advance_loc: 4 to 0+0034 + DW_CFA_restore_extended: r76 \(v12\) + DW_CFA_restore_extended: r77 \(v13\) + DW_CFA_advance_loc: 4 to 0+0038 + DW_CFA_restore_extended: r78 \(v14\) + DW_CFA_restore_extended: r79 \(v15\) + DW_CFA_advance_loc: 4 to 0+003c + DW_CFA_restore: r29 \(x29\) + DW_CFA_restore: r30 \(x30\) + DW_CFA_def_cfa_offset: 0 + DW_CFA_nop + +#pass diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-2.l b/gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-2.l new file mode 100644 index 00000000000..5ff6048bef0 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-2.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*8: Warning: SCFI ignores most user-specified CFI directives diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-2.s b/gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-2.s new file mode 100644 index 00000000000..4204daf736d --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-callee-saved-fp-2.s @@ -0,0 +1,50 @@ +# Testcase for callee-saved FP registers. +# Use Q registers + .text + .align 2 + .global foo + .type foo, %function +foo: + .cfi_startproc + stp x29, x30, [sp, -256]! + .cfi_def_cfa_offset 256 + .cfi_offset 29, -256 + .cfi_offset 30, -248 + mov x29, sp + .cfi_def_cfa_register 29 + str q8, [sp, 16] + .cfi_offset 72, -232 + str q9, [sp, 32] + .cfi_offset 73, -216 + stp q10, q11, [sp, 64] + .cfi_offset 74, -184 + .cfi_offset 75, -168 + stp q12, q13, [sp, 96] + .cfi_offset 76, -152 + .cfi_offset 77, -136 + stp q14, q15, [sp, 128] + .cfi_offset 78, -120 + .cfi_offset 79, -104 + mov w0, 0 + mov sp, x29 + .cfi_def_cfa_register 31 + ldr q8, [sp, 16] + .cfi_restore 72 + ldr q9, [sp, 32] + .cfi_restore 73 + ldp q10, q11, [sp, 64] + .cfi_restore 74 + .cfi_restore 75 + ldp q12, q13, [sp, 96] + .cfi_restore 76 + .cfi_restore 77 + ldp q14, q15, [sp, 128] + .cfi_restore 78 + .cfi_restore 79 + ldp x29, x30, [sp], 256 + .cfi_restore 29 + .cfi_restore 30 + .cfi_def_cfa_offset 0 + ret + .cfi_endproc + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-cb-1.d b/gas/testsuite/gas/scfi/aarch64/scfi-cb-1.d new file mode 100644 index 00000000000..87583c58b3f --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-cb-1.d @@ -0,0 +1,20 @@ +#as: --scfi=experimental -W +#objdump: -Wf +#name: Synthesize CFI for comp branch 1 +#... +Contents of the .eh_frame section: + + +0+0000 0+0010 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 4 + Data alignment factor: -8 + Return address column: 30 + Augmentation data: 1b + DW_CFA_def_cfa: r31 \(sp\) ofs 0 + +0+0014 0+0010 00000018 FDE cie=00000000 pc=0+0000..0+0014 + DW_CFA_nop + +#pass diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-cb-1.l b/gas/testsuite/gas/scfi/aarch64/scfi-cb-1.l new file mode 100644 index 00000000000..abca835a642 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-cb-1.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*5: Warning: SCFI ignores most user-specified CFI directives diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-cb-1.s b/gas/testsuite/gas/scfi/aarch64/scfi-cb-1.s new file mode 100644 index 00000000000..1fa7de7639a --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-cb-1.s @@ -0,0 +1,14 @@ + .text + .global foo + .type foo, %function +foo: + .cfi_startproc +.L7: + add w4, w3, w1 + cbnz w4, .L7 + cbz w4, .L10 + tbnz w0, #31, .L7 +.L10: + ret + .cfi_endproc + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.d b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.d new file mode 100644 index 00000000000..9dca6efaad7 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.d @@ -0,0 +1,31 @@ +#as: --scfi=experimental -W +#objdump: -Wf +#name: Synthesize CFI for cfg 1 +#... +Contents of the .eh_frame section: + + +0+0000 0+0010 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 4 + Data alignment factor: -8 + Return address column: 30 + Augmentation data: 1b + DW_CFA_def_cfa: r31 \(sp\) ofs 0 + +0+0014 0+0020 0+0018 FDE cie=00000000 pc=0+0000..0+0068 + DW_CFA_advance_loc: 4 to 0+0004 + DW_CFA_def_cfa_offset: 48 + DW_CFA_offset: r29 \(x29\) at cfa-48 + DW_CFA_offset: r30 \(x30\) at cfa-40 + DW_CFA_advance_loc: 4 to 0+0008 + DW_CFA_def_cfa_register: r29 \(x29\) + DW_CFA_advance_loc: 92 to 0+0064 + DW_CFA_def_cfa_register: r31 \(sp\) + DW_CFA_restore: r29 \(x29\) + DW_CFA_restore: r30 \(x30\) + DW_CFA_def_cfa_offset: 0 + DW_CFA_nop + +#pass diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.l b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.l new file mode 100644 index 00000000000..bcf3095a9bb --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*6: Warning: SCFI ignores most user-specified CFI directives diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.s b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.s new file mode 100644 index 00000000000..6925a8f7e38 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-1.s @@ -0,0 +1,46 @@ +# Testcase for forward flow of SCFI information +# and CFG creation as well. This testcase has two backward edges +# (one of which is a loop) and one exit path. + .type foo, %function +foo: + .cfi_startproc + stp x29, x30, [sp, -48]! + .cfi_def_cfa_offset 48 + .cfi_offset 29, -48 + .cfi_offset 30, -40 + mov x29, sp + .cfi_def_cfa_register 29 + str x0, [sp, 24] + adrp x0, :got:xyz + str x0, [sp, 40] + b .L7 +.L10: + ldr x0, [sp, 40] + ldr x0, [x0] + mov x1, x0 + ldr x0, [sp, 24] + bl strcmp + cmp w0, 0 + bne .L8 + ldr x0, [sp, 40] + ldr w0, [x0, 8] + b .L9 +.L8: + ldr x0, [sp, 40] + add x0, x0, 24 + str x0, [sp, 40] +.L7: + ldr x0, [sp, 40] + ldr w0, [x0, 8] + cmp w0, 0 + bne .L10 + mov w0, 0 +.L9: + ldp x29, x30, [sp], 48 + .cfi_def_cfa_register 31 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa_offset 0 + ret + .cfi_endproc + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.d b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.d new file mode 100644 index 00000000000..af21fc14b4c --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.d @@ -0,0 +1,40 @@ +#as: --scfi=experimental -W +#objdump: -Wf +#name: Synthesize CFI for cfg 2 +#... +Contents of the .eh_frame section: + + +0+0000 0+0010 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 4 + Data alignment factor: -8 + Return address column: 30 + Augmentation data: 1b + DW_CFA_def_cfa: r31 \(sp\) ofs 0 + +0+0014 0+[0-9a-f]+ 0+0018 FDE cie=00000000 pc=0+0000..0+0028 + DW_CFA_advance_loc: 4 to 0+0004 + DW_CFA_def_cfa_offset: 48 + DW_CFA_offset: r29 \(x29\) at cfa-48 + DW_CFA_offset: r30 \(x30\) at cfa-40 + DW_CFA_advance_loc: 4 to 0+0008 + DW_CFA_def_cfa_register: r29 \(x29\) + DW_CFA_advance_loc: 8 to 0+0010 + DW_CFA_remember_state + DW_CFA_advance_loc: 8 to 0+0018 + DW_CFA_def_cfa_register: r31 \(sp\) + DW_CFA_restore: r29 \(x29\) + DW_CFA_restore: r30 \(x30\) + DW_CFA_def_cfa_offset: 0 + DW_CFA_advance_loc: 4 to 0+001c + DW_CFA_restore_state + DW_CFA_advance_loc: 8 to 0+0024 + DW_CFA_def_cfa_register: r31 \(sp\) + DW_CFA_restore: r29 \(x29\) + DW_CFA_restore: r30 \(x30\) + DW_CFA_def_cfa_offset: 0 + DW_CFA_nop + +#pass diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.l b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.l new file mode 100644 index 00000000000..e9bde339b1e --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*13: Warning: SCFI ignores most user-specified CFI directives diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.s b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.s new file mode 100644 index 00000000000..eef82b4ad24 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-2.s @@ -0,0 +1,42 @@ +# Testcase for backward flow of SCFI state. +# The cfg has two exit paths, with epilogue duplicated in +# the two. +# +# SCFI must synthesize the remember_state / restore_state pair. +# Note how SCFI does not necessary generate the least number of +# CFI directives (.cfi_remember_state can possibly be clubbed +# together with other immediately following CFI directives). +# This is not a correctness issue, however. + .global foo + .type foo, %function +foo: + .cfi_startproc + stp x29, x30, [sp, -48]! + .cfi_def_cfa_offset 48 + .cfi_offset 29, -48 + .cfi_offset 30, -40 + mov x29, sp + .cfi_def_cfa_register 29 + cmp w4, w19 + bge .L1 + +.L2: + .cfi_remember_state + bl bar + ldp x29, x30, [sp], 48 + .cfi_def_cfa_register 31 + .cfi_restore 29 + .cfi_restore 30 + .cfi_def_cfa_offset 0 + ret +.L1: + .cfi_restore_state + cbz w3, .L2 + ldp x29, x30, [sp], 48 + .cfi_def_cfa_register 31 + .cfi_restore 29 + .cfi_restore 30 + .cfi_def_cfa_offset 0 + ret + .cfi_endproc + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.d b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.d new file mode 100644 index 00000000000..4d17ee4a475 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.d @@ -0,0 +1,32 @@ +#as: --scfi=experimental -W +#objdump: -Wf +#name: Synthesize CFI for cfg 3 +#... +Contents of the .eh_frame section: + + +0+0000 0+0010 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 4 + Data alignment factor: -8 + Return address column: 30 + Augmentation data: 1b + DW_CFA_def_cfa: r31 \(sp\) ofs 0 + +0+0014 0+0020 0+0018 FDE cie=00000000 pc=0+0000..0+002c + DW_CFA_advance_loc: 4 to 0+0004 + DW_CFA_def_cfa_offset: 32 + DW_CFA_offset: r29 \(x29\) at cfa-32 + DW_CFA_offset: r30 \(x30\) at cfa-24 + DW_CFA_advance_loc: 4 to 0+0008 + DW_CFA_def_cfa_register: r29 \(x29\) + DW_CFA_advance_loc: 32 to 0+0028 + DW_CFA_def_cfa_register: r31 \(sp\) + DW_CFA_restore: r29 \(x29\) + DW_CFA_restore: r30 \(x30\) + DW_CFA_def_cfa_offset: 0 + DW_CFA_nop + DW_CFA_nop + +#pass diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.l b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.l new file mode 100644 index 00000000000..23ca73422b5 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*9: Warning: SCFI ignores most user-specified CFI directives diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.s b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.s new file mode 100644 index 00000000000..2782e11f6d3 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-3.s @@ -0,0 +1,34 @@ +# Testcase for cfg creation. +# There is at least one bb here with a single GINSN_TYPE_SYMBOL instruction +# for a user-defined label. This ginsn is visited in the fallthrough path of +# another bb. + .text + .global main + .type main, %function +main: + .cfi_startproc + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + mov x29, sp + .cfi_def_cfa_register 29 + cmp w0, 0 + bne .L2 +# ldr x0, [sp, 24] +# bl fclose + cmp w0, 0 + beq .L3 +.L2: + mov w0, 1 + b .L5 +.L3: + mov w0, 0 +.L5: + ldp x29, x30, [sp], 32 + .cfi_def_cfa_register 31 + .cfi_restore 29 + .cfi_restore 30 + .cfi_def_cfa_offset 0 + ret + .cfi_endproc diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.d b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.d new file mode 100644 index 00000000000..6a23818ad6f --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.d @@ -0,0 +1,41 @@ +#as: --scfi=experimental -W +#objdump: -Wf +#name: Synthesize CFI for cfg 4 +#... +Contents of the .eh_frame section: + + +0+0000 0+0010 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 4 + Data alignment factor: -8 + Return address column: 30 + Augmentation data: 1b + DW_CFA_def_cfa: r31 \(sp\) ofs 0 + +0+0014 0+[0-9a-f]+ 0+0018 FDE cie=00000000 pc=0+0000..0+002c + DW_CFA_advance_loc: 4 to 0+0004 + DW_CFA_def_cfa_offset: 32 + DW_CFA_offset: r29 \(x29\) at cfa-32 + DW_CFA_offset: r30 \(x30\) at cfa-24 + DW_CFA_advance_loc: 4 to 0+0008 + DW_CFA_def_cfa_register: r29 \(x29\) + DW_CFA_advance_loc: 8 to 0+0010 + DW_CFA_offset: r19 \(x19\) at cfa-16 + DW_CFA_advance_loc: 4 to 0+0014 + DW_CFA_remember_state + DW_CFA_advance_loc: 4 to 0+0018 + DW_CFA_restore: r19 \(x19\) + DW_CFA_advance_loc: 8 to 0+0020 + DW_CFA_def_cfa_register: r31 \(sp\) + DW_CFA_restore: r29 \(x29\) + DW_CFA_restore: r30 \(x30\) + DW_CFA_def_cfa_offset: 0 + DW_CFA_advance_loc: 4 to 0+0024 + DW_CFA_restore_state + DW_CFA_advance_loc: 4 to 0+0028 + DW_CFA_restore: r19 \(x19\) + DW_CFA_nop + +#pass diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.l b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.l new file mode 100644 index 00000000000..6ec24387b8c --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*7: Warning: SCFI ignores most user-specified CFI directives diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.s b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.s new file mode 100644 index 00000000000..499278ddcb8 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-cfg-4.s @@ -0,0 +1,41 @@ +# Testcase for forward flow of SCFI information. +# This testcase has two paths landing at the exit basic block, +# where only one of the exit paths has a save/restore of x19 +# (while the other does not). + .type foo, %function +foo: + .cfi_startproc + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + mov x29, sp + .cfi_def_cfa_register 29 +# do some work ... + cbz x0, .L2 + str x19, [sp, 16] + .cfi_offset 19, -16 +# do some other work ... + cbz w0, .L3 + ldr x19, [sp, 16] + .cfi_restore 19 +.L2: + mov w0, 1 +.L1: + ldp x29, x30, [sp], 32 + .cfi_def_cfa_register 31 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa_offset 0 + ret +.L3: + .cfi_def_cfa_offset 32 + .cfi_offset 19, -16 + .cfi_offset 29, -32 + .cfi_offset 30, -24 +# do yet some other work before return + ldr x19, [sp, 16] + .cfi_restore 19 + b .L1 + .cfi_endproc + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-cond-br-1.d b/gas/testsuite/gas/scfi/aarch64/scfi-cond-br-1.d new file mode 100644 index 00000000000..dc656c78038 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-cond-br-1.d @@ -0,0 +1,20 @@ +#as: --scfi=experimental -W +#objdump: -Wf +#name: Synthesize CFI for conditional br 1 +#... +Contents of the .eh_frame section: + + +0+0000 0+0010 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 4 + Data alignment factor: -8 + Return address column: 30 + Augmentation data: 1b + DW_CFA_def_cfa: r31 \(sp\) ofs 0 + +0+0014 0+0010 00000018 FDE cie=00000000 pc=0+0000..0+0010 + DW_CFA_nop + +#pass diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-cond-br-1.l b/gas/testsuite/gas/scfi/aarch64/scfi-cond-br-1.l new file mode 100644 index 00000000000..bcf3095a9bb --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-cond-br-1.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*6: Warning: SCFI ignores most user-specified CFI directives diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-cond-br-1.s b/gas/testsuite/gas/scfi/aarch64/scfi-cond-br-1.s new file mode 100644 index 00000000000..03c330df04a --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-cond-br-1.s @@ -0,0 +1,13 @@ + .text + .align 2 + .global foo + .type foo, %function +foo: + .cfi_startproc + bge .L10 + ble .L10 + bne .L10 +.L10: + ret + .cfi_endproc + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-diag-1.l b/gas/testsuite/gas/scfi/aarch64/scfi-diag-1.l new file mode 100644 index 00000000000..5a8e36923a7 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-diag-1.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*5: Warning: SCFI: ignored probable save/restore op with reg offset diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-diag-1.s b/gas/testsuite/gas/scfi/aarch64/scfi-diag-1.s new file mode 100644 index 00000000000..a6eac51998e --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-diag-1.s @@ -0,0 +1,6 @@ + .text + .globl foo + .type foo, @function +foo: + str x19, [sp, x1] + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-diag-2.l b/gas/testsuite/gas/scfi/aarch64/scfi-diag-2.l new file mode 100644 index 00000000000..03a5f4fb908 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-diag-2.l @@ -0,0 +1,3 @@ +.*Assembler messages: +.*7: Warning: SCFI ignores most user-specified CFI directives +.*16: Warning: GINSN: found unreachable code in func 'foo' diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-diag-2.s b/gas/testsuite/gas/scfi/aarch64/scfi-diag-2.s new file mode 100644 index 00000000000..81855aa9a9d --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-diag-2.s @@ -0,0 +1,25 @@ +# Testcase that triggers a diagnostic for unreachable code for +# the block of code after label .L2. This also serves as a testcase +# for cfg creation, as the said code block should not have been +# included in the CFG (and hence the warning). + .type foo, %function +foo: + .cfi_startproc + ldr w1, [x0] + cmp w1, 8 + stp x19, x20, [sp, 16] + .cfi_offset 19, 16 + .cfi_offset 20, 24 + b .L1 +.L2: + mov w0, w1 + ret +.L1: + mov w0, w1 + ldp x19, x20, [sp, 16] + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa_offset 0 + ret + .cfi_endproc + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-diag-3.l b/gas/testsuite/gas/scfi/aarch64/scfi-diag-3.l new file mode 100644 index 00000000000..85b12799f4f --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-diag-3.l @@ -0,0 +1,3 @@ +.*Assembler messages: +.*6: Error: SCFI: 0x14000000 op with non-zero addend to sym not supported +.*6: Error: SCFI: unhandled op 0x14000000 may cause incorrect CFI diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-diag-3.s b/gas/testsuite/gas/scfi/aarch64/scfi-diag-3.s new file mode 100644 index 00000000000..89a4d9a483a --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-diag-3.s @@ -0,0 +1,8 @@ +# Testcase with a branch instruction with symbol and an addend +# Such insns make CFG creation difficult and hence make the +# function ineligible for SCFI. + .type foo, %function +foo: + b symbol+1 + ret + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.d b/gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.d new file mode 100644 index 00000000000..ce8fab5813a --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.d @@ -0,0 +1,59 @@ +#as: --scfi=experimental -W +#objdump: -Wf +#name: Synthesize CFI for ldp ldr instructions +#... +Contents of the .eh_frame section: + +00000000 0+0010 00000000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 4 + Data alignment factor: -8 + Return address column: 30 + Augmentation data: 1b + DW_CFA_def_cfa: r31 \(sp\) ofs 0 + +00000014 0+0048 00000018 FDE cie=00000000 pc=0+0000..0+0040 + DW_CFA_advance_loc: 4 to 0+0004 + DW_CFA_def_cfa_offset: 128 + DW_CFA_offset: r29 \(x29\) at cfa-128 + DW_CFA_offset: r30 \(x30\) at cfa-120 + DW_CFA_advance_loc: 4 to 0+0008 + DW_CFA_def_cfa_register: r29 \(x29\) + DW_CFA_advance_loc: 4 to 0+000c + DW_CFA_offset: r19 \(x19\) at cfa-112 + DW_CFA_offset: r20 \(x20\) at cfa-104 + DW_CFA_advance_loc: 4 to 0+0010 + DW_CFA_offset: r21 \(x21\) at cfa-96 + DW_CFA_offset: r22 \(x22\) at cfa-88 + DW_CFA_advance_loc: 4 to 0+0014 + DW_CFA_offset: r23 \(x23\) at cfa-80 + DW_CFA_offset: r24 \(x24\) at cfa-72 + DW_CFA_advance_loc: 4 to 0+0018 + DW_CFA_offset: r25 \(x25\) at cfa-64 + DW_CFA_offset: r26 \(x26\) at cfa-56 + DW_CFA_advance_loc: 4 to 0+001c + DW_CFA_offset: r27 \(x27\) at cfa-48 + DW_CFA_advance_loc: 8 to 0+0024 + DW_CFA_def_cfa_register: r31 \(sp\) + DW_CFA_advance_loc: 4 to 0+0028 + DW_CFA_restore: r19 \(x19\) + DW_CFA_restore: r20 \(x20\) + DW_CFA_advance_loc: 4 to 0+002c + DW_CFA_restore: r21 \(x21\) + DW_CFA_restore: r22 \(x22\) + DW_CFA_advance_loc: 4 to 0+0030 + DW_CFA_restore: r23 \(x23\) + DW_CFA_restore: r24 \(x24\) + DW_CFA_advance_loc: 4 to 0+0034 + DW_CFA_restore: r25 \(x25\) + DW_CFA_restore: r26 \(x26\) + DW_CFA_advance_loc: 4 to 0+0038 + DW_CFA_restore: r27 \(x27\) + DW_CFA_advance_loc: 4 to 0+003c + DW_CFA_restore: r29 \(x29\) + DW_CFA_restore: r30 \(x30\) + DW_CFA_def_cfa_offset: 0 + DW_CFA_nop + +#pass diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.l b/gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.l new file mode 100644 index 00000000000..5ff6048bef0 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*8: Warning: SCFI ignores most user-specified CFI directives diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.s b/gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.s new file mode 100644 index 00000000000..4226d71b3b3 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-ldrp-1.s @@ -0,0 +1,52 @@ +# Testcase for various ldp / ldr instructions. +# This test also serves for checking callee-saved regs. + .text + .align 2 + .global foo + .type foo, %function +foo: + .cfi_startproc + stp x29, x30, [sp, -128]! + .cfi_def_cfa_offset 128 + .cfi_offset 29, -128 + .cfi_offset 30, -120 + mov x29, sp + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -112 + .cfi_offset 20, -104 + stp x21, x22, [sp, 32] + .cfi_offset 21, -96 + .cfi_offset 22, -88 + stp x23, x24, [sp, 48] + .cfi_offset 23, -80 + .cfi_offset 24, -72 + stp x25, x26, [sp, 64] + .cfi_offset 25, -64 + .cfi_offset 26, -56 + str x27, [sp, 80] + .cfi_offset 27, -48 + mov w0, 0 + mov sp, x29 + .cfi_def_cfa_register 31 + ldp x19, x20, [sp, 16] + .cfi_restore 19 + .cfi_restore 20 + ldp x21, x22, [sp, 32] + .cfi_restore 21 + .cfi_restore 22 + ldp x23, x24, [sp, 48] + .cfi_restore 23 + .cfi_restore 24 + ldp x25, x26, [sp, 64] + .cfi_restore 25 + .cfi_restore 26 + ldr x27, [sp, 80] + .cfi_restore 27 + ldp x29, x30, [sp], 128 + .cfi_restore 29 + .cfi_restore 30 + .cfi_def_cfa_offset 0 + ret + .cfi_endproc + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.d b/gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.d new file mode 100644 index 00000000000..2a0fdb60e0e --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.d @@ -0,0 +1,33 @@ +#as: --scfi=experimental -W +#objdump: -Wf +#name: Synthesize CFI for ldr insns 2 +#... +Contents of the .eh_frame section: + +00000000 0+0010 00000000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 4 + Data alignment factor: -8 + Return address column: 30 + Augmentation data: 1b + DW_CFA_def_cfa: r31 \(sp\) ofs 0 + +00000014 0+[0-9a-f]+ 00000018 FDE cie=00000000 pc=0+0000..0+0018 + DW_CFA_advance_loc: 4 to 0+0004 + DW_CFA_def_cfa_offset: 128 + DW_CFA_offset: r29 \(x29\) at cfa-128 + DW_CFA_offset: r30 \(x30\) at cfa-120 + DW_CFA_advance_loc: 4 to 0+0008 + DW_CFA_def_cfa_register: r29 \(x29\) + DW_CFA_advance_loc: 4 to 0+000c + DW_CFA_def_cfa_register: r31 \(sp\) + DW_CFA_advance_loc: 4 to 0+0010 + DW_CFA_restore: r29 \(x29\) + DW_CFA_def_cfa_offset: 120 + DW_CFA_advance_loc: 4 to 0+0014 + DW_CFA_restore: r30 \(x30\) + DW_CFA_def_cfa_offset: 0 + DW_CFA_nop + +#pass diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.l b/gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.l new file mode 100644 index 00000000000..6ec24387b8c --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*7: Warning: SCFI ignores most user-specified CFI directives diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.s b/gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.s new file mode 100644 index 00000000000..ac4ad6836ed --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-ldrp-2.s @@ -0,0 +1,26 @@ +# Testcase for various ldp / ldr instructions + .text + .align 2 + .global foo + .type foo, %function +foo: + .cfi_startproc + stp x29, x30, [sp, -128]! + .cfi_def_cfa_offset 128 + .cfi_offset 29, -128 + .cfi_offset 30, -120 + mov x29, sp + .cfi_def_cfa_register 29 + mov sp, x29 + .cfi_def_cfa_register 31 +# Post-indexed ldr + ldr x29, [sp], 8 + .cfi_restore 29 + .cfi_def_cfa_offset 120 +# Post-indexed ldr + ldr x30, [sp], 120 + .cfi_restore 30 + .cfi_def_cfa_offset 0 + ret + .cfi_endproc + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-ldstnap-1.d b/gas/testsuite/gas/scfi/aarch64/scfi-ldstnap-1.d new file mode 100644 index 00000000000..f2eeb864dc3 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-ldstnap-1.d @@ -0,0 +1,39 @@ +#as: --scfi=experimental -W +#objdump: -Wf +#name: Synthesize CFI for ldst no-allocate pair +#... +Contents of the .eh_frame section: + +00000000 0+0010 00000000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 4 + Data alignment factor: -8 + Return address column: 30 + Augmentation data: 1b + DW_CFA_def_cfa: r31 \(sp\) ofs 0 + +00000014 0+[0-9a-f]+ 00000018 FDE cie=00000000 pc=0+0000..0+0020 + DW_CFA_advance_loc: 4 to 0+0004 + DW_CFA_def_cfa_offset: 128 + DW_CFA_offset: r29 \(x29\) at cfa-128 + DW_CFA_offset: r30 \(x30\) at cfa-120 + DW_CFA_advance_loc: 4 to 0+0008 + DW_CFA_def_cfa_register: r29 \(x29\) + DW_CFA_advance_loc: 4 to 0+000c + DW_CFA_def_cfa_register: r31 \(sp\) + DW_CFA_advance_loc: 4 to 0+0010 + DW_CFA_offset: r19 \(x19\) at cfa-112 + DW_CFA_offset: r20 \(x20\) at cfa-104 + DW_CFA_advance_loc: 4 to 0+0014 + DW_CFA_restore: r19 \(x19\) + DW_CFA_restore: r20 \(x20\) + DW_CFA_advance_loc: 4 to 0+0018 + DW_CFA_restore: r29 \(x29\) + DW_CFA_def_cfa_offset: 120 + DW_CFA_advance_loc: 4 to 0+001c + DW_CFA_restore: r30 \(x30\) + DW_CFA_def_cfa_offset: 0 + DW_CFA_nop + +#pass diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-ldstnap-1.l b/gas/testsuite/gas/scfi/aarch64/scfi-ldstnap-1.l new file mode 100644 index 00000000000..6ec24387b8c --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-ldstnap-1.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*7: Warning: SCFI ignores most user-specified CFI directives diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-ldstnap-1.s b/gas/testsuite/gas/scfi/aarch64/scfi-ldstnap-1.s new file mode 100644 index 00000000000..ed1754bf204 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-ldstnap-1.s @@ -0,0 +1,30 @@ +# Testcase for various ldnp / stnp instructions + .text + .align 2 + .global foo + .type foo, %function +foo: + .cfi_startproc + stp x29, x30, [sp, -128]! + .cfi_def_cfa_offset 128 + .cfi_offset 29, -128 + .cfi_offset 30, -120 + mov x29, sp + .cfi_def_cfa_register 29 + mov sp, x29 + .cfi_def_cfa_register 31 + stp x19, x20, [sp, 16] + .cfi_offset 19, -112 + .cfi_offset 20, -104 + ldp x19, x20, [sp, 16] + .cfi_restore 19 + .cfi_restore 20 + ldr x29, [sp], 8 + .cfi_restore 29 + .cfi_def_cfa_offset 120 + ldr x30, [sp], 120 + .cfi_restore 30 + .cfi_def_cfa_offset 0 + ret + .cfi_endproc + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-strp-1.d b/gas/testsuite/gas/scfi/aarch64/scfi-strp-1.d new file mode 100644 index 00000000000..cebd254aa00 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-strp-1.d @@ -0,0 +1,39 @@ +#as: --scfi=experimental -W +#objdump: -Wf +#name: Synthesize CFI for str stp insns 1 +#... +Contents of the .eh_frame section: + +00000000 0+0010 00000000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 4 + Data alignment factor: -8 + Return address column: 30 + Augmentation data: 1b + DW_CFA_def_cfa: r31 \(sp\) ofs 0 + +00000014 0+0030 00000018 FDE cie=00000000 pc=0+0000..0+002c + DW_CFA_advance_loc: 4 to 0+0004 + DW_CFA_def_cfa_offset: 128 + DW_CFA_offset: r29 \(x29\) at cfa-128 + DW_CFA_offset: r30 \(x30\) at cfa-120 + DW_CFA_advance_loc: 4 to 0+0008 + DW_CFA_def_cfa_register: r29 \(x29\) + DW_CFA_advance_loc: 4 to 0+000c + DW_CFA_offset: r19 \(x19\) at cfa-112 + DW_CFA_offset: r20 \(x20\) at cfa-104 + DW_CFA_advance_loc: 4 to 0+0010 + DW_CFA_offset: r21 \(x21\) at cfa-96 + DW_CFA_offset: r22 \(x22\) at cfa-88 + DW_CFA_advance_loc: 4 to 0+0014 + DW_CFA_offset: r23 \(x23\) at cfa-80 + DW_CFA_offset: r24 \(x24\) at cfa-72 + DW_CFA_advance_loc: 4 to 0+0018 + DW_CFA_offset: r25 \(x25\) at cfa-64 + DW_CFA_offset: r26 \(x26\) at cfa-56 + DW_CFA_advance_loc: 4 to 0+001c + DW_CFA_offset: r27 \(x27\) at cfa-48 + DW_CFA_nop + +#pass diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-strp-1.l b/gas/testsuite/gas/scfi/aarch64/scfi-strp-1.l new file mode 100644 index 00000000000..bcf3095a9bb --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-strp-1.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*6: Warning: SCFI ignores most user-specified CFI directives diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-strp-1.s b/gas/testsuite/gas/scfi/aarch64/scfi-strp-1.s new file mode 100644 index 00000000000..932ca4ad705 --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-strp-1.s @@ -0,0 +1,37 @@ +## Testcase with a variety of str/stp instructions + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc +# Pre-indexed addressing is like offset addressing, except that +# the base pointer is updated as a result of the instruction. + stp x29, x30, [sp, -128]! + .cfi_def_cfa_offset 128 + .cfi_offset 29, -128 + .cfi_offset 30, -120 + mov x29, sp + .cfi_def_cfa_register 29 +# Offset addressing mode is when ann offset can be applied optionally to the +# base address. + stp x19, x20, [sp, 16] + .cfi_offset 19, -112 + .cfi_offset 20, -104 + stp x21, x22, [sp, 32] + .cfi_offset 21, -96 + .cfi_offset 22, -88 + stp x23, x24, [sp, 48] + .cfi_offset 23, -80 + .cfi_offset 24, -72 + stp x25, x26, [sp, 64] + .cfi_offset 25, -64 + .cfi_offset 26, -56 + str x27, [sp, 80] + .cfi_offset 27, -48 +# Stores non callee-saved register on stack. + str w0, [x29, 124] + str wzr, [x29, 120] + str w0, [x29, 120] + ret + .cfi_endproc + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-strp-2.d b/gas/testsuite/gas/scfi/aarch64/scfi-strp-2.d new file mode 100644 index 00000000000..d69ba0dfa5a --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-strp-2.d @@ -0,0 +1,35 @@ +#as: --scfi=experimental -W +#objdump: -Wf +#name: Synthesize CFI for str insns 2 +#... +Contents of the .eh_frame section: + +00000000 0+0010 00000000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 4 + Data alignment factor: -8 + Return address column: 30 + Augmentation data: 1b + DW_CFA_def_cfa: r31 \(sp\) ofs 0 + +00000014 0+0028 00000018 FDE cie=00000000 pc=0+0000..0+001c + DW_CFA_advance_loc: 4 to 0+0004 + DW_CFA_def_cfa_offset: 128 + DW_CFA_offset: r29 \(x29\) at cfa-128 + DW_CFA_offset: r30 \(x30\) at cfa-120 + DW_CFA_advance_loc: 4 to 0+0008 + DW_CFA_def_cfa_register: r29 \(x29\) + DW_CFA_advance_loc: 4 to 0+000c + DW_CFA_offset: r27 \(x27\) at cfa-128 + DW_CFA_advance_loc: 4 to 0+0010 + DW_CFA_def_cfa_register: r31 \(sp\) + DW_CFA_advance_loc: 4 to 0+0014 + DW_CFA_restore: r29 \(x29\) + DW_CFA_def_cfa_offset: 120 + DW_CFA_advance_loc: 4 to 0+0018 + DW_CFA_restore: r30 \(x30\) + DW_CFA_def_cfa_offset: 0 + DW_CFA_nop + +#pass diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-strp-2.l b/gas/testsuite/gas/scfi/aarch64/scfi-strp-2.l new file mode 100644 index 00000000000..6ec24387b8c --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-strp-2.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*7: Warning: SCFI ignores most user-specified CFI directives diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-strp-2.s b/gas/testsuite/gas/scfi/aarch64/scfi-strp-2.s new file mode 100644 index 00000000000..1792697dffa --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-strp-2.s @@ -0,0 +1,30 @@ +# Testcase for a variety of stp/str including a post-indexed store + .text + .align 2 + .global foo + .type foo, %function +foo: + .cfi_startproc + stp x29, x30, [sp, -128]! + .cfi_def_cfa_offset 128 + .cfi_offset 29, -128 + .cfi_offset 30, -120 + mov x29, sp + .cfi_def_cfa_register 29 +# post-indexed store, a stack corrupting one which over-writes +# x29! Only for testing purposes for now +# This does not generate a .cfi_def_cfa_offset 208 because +# CFA is REG_FP based + str x27, [sp], 80 + .cfi_offset 27, -128 + mov sp, x29 + .cfi_def_cfa_register 31 + ldr x29, [sp], 8 + .cfi_restore 29 + .cfi_def_cfa_offset 120 + ldr x30, [sp], 120 + .cfi_restore 30 + .cfi_def_cfa_offset 0 + ret + .cfi_endproc + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-unsupported-1.l b/gas/testsuite/gas/scfi/aarch64/scfi-unsupported-1.l new file mode 100644 index 00000000000..de3ed86250b --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-unsupported-1.l @@ -0,0 +1,4 @@ +.*Assembler messages: +.*7: Warning: SCFI ignores most user-specified CFI directives +.*9: Error: SCFI: unsupported stack manipulation pattern +.*31: Error: SCFI: forward pass failed for func 'foo' diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-unsupported-1.s b/gas/testsuite/gas/scfi/aarch64/scfi-unsupported-1.s new file mode 100644 index 00000000000..c143185d03e --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-unsupported-1.s @@ -0,0 +1,31 @@ +# Testcase where immediate used for stack allocation is a wide +# one. Since SCFI does not currently have any data-flow +# capabilities, this is currently not supported. + .global foo + .type foo, %function +foo: + .cfi_startproc + mov x16, 4384 + sub sp, sp, x16 + .cfi_def_cfa_offset 4384 + stp x29, x30, [sp] + .cfi_offset 29, -4384 + .cfi_offset 30, -4376 + mov x29, sp + str x0, [sp, 24] + str x1, [sp, 16] + add x0, sp, 4096 + add x0, x0, 112 + bl bar +.L1: + str xzr, [sp, 4376] +.L2: + ldp x29, x30, [sp] + mov x16, 4384 + add sp, sp, x16 + .cfi_restore 29 + .cfi_restore 30 + .cfi_def_cfa_offset 0 + ret + .cfi_endproc + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-unsupported-2.l b/gas/testsuite/gas/scfi/aarch64/scfi-unsupported-2.l new file mode 100644 index 00000000000..f1b960449ae --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-unsupported-2.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*7: Error: SCFI: unhandled op 0xe5e0e000 may cause incorrect CFI diff --git a/gas/testsuite/gas/scfi/aarch64/scfi-unsupported-2.s b/gas/testsuite/gas/scfi/aarch64/scfi-unsupported-2.s new file mode 100644 index 00000000000..a6a4dae39fe --- /dev/null +++ b/gas/testsuite/gas/scfi/aarch64/scfi-unsupported-2.s @@ -0,0 +1,8 @@ +# Testcase with an SVE instruction with Z register usage +# of a callee-saved register. Currently these are not handled +# and the SCFI machinery must error out. + .arch armv8-a+sve + .type foo, %function +foo: + st1d z8.d, p2, [sp, #1, mul vl] + .size foo, .-foo