From: Indu Bhagat <indu.bhagat@oracle.com>
To: binutils@sourceware.org
Cc: richard.sandiford@arm.com, Richard.Earnshaw@arm.com,
Indu Bhagat <indu.bhagat@oracle.com>
Subject: [PATCH,V4 8/8] gas: aarch64: testsuite: add new tests for SCFI
Date: Sun, 30 Jun 2024 19:54:04 -0700 [thread overview]
Message-ID: <20240701025404.3361349-9-indu.bhagat@oracle.com> (raw)
In-Reply-To: <20240701025404.3361349-1-indu.bhagat@oracle.com>
[Changes in V4]
- New testcases for FP callee-saved registers.
scfi-callee-saved-fp-1.s uses D registers, scfi-callee-saved-fp-2.s
uses Q registers and is run with -mbig-endian.
- Added new ops (movk, prfm) to ginsn-misc-1. These ops are not
relevant for SCFI correctness; this testcase merely
ensures graceful handling of ginsn creation for such insns.
- Fixed ginsn-ldst-1 as it included some load / store ops with D
registers, which we now handle. Also added some insns using W and S
registers.
- Added a new test scfi-diag-3 where SCFI machinery reports the
following error when it sees an SVE memory op with callee-saved
register:
"Error: SCFI: unhandled op 0xe5e0e000 may cause incorrect CFI"
[End of changes in V4]
[No changes in V3]
[Changes in V2]
- new testcase scfi-cfg-4.s for the changes in cmp_scfi_state.
- new testcase ginsn-arith-1.s for ginsn creation for various add sub insns.
- removed redundant insns from ginsn-misc-1.s, some of those insns are
now in ginsn-arith-1.s.
- added more ld st opts in ginsn-ldst-1.s testcase.
[End of changes in V2]
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-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/testsuite/gas/scfi/README | 2 +-
.../gas/scfi/aarch64/ginsn-arith-1.l | 35 +++++++++
.../gas/scfi/aarch64/ginsn-arith-1.s | 16 ++++
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 | 78 +++++++++++++++++++
gas/testsuite/gas/scfi/aarch64/ginsn-ldst-1.s | 34 ++++++++
gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.l | 27 +++++++
gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.s | 13 ++++
.../gas/scfi/aarch64/scfi-aarch64.exp | 70 +++++++++++++++++
.../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 | 2 +
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/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 ++++++++
54 files changed, 1324 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-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
diff --git a/gas/testsuite/gas/scfi/README b/gas/testsuite/gas/scfi/README
index 91191634769..44b09177e84 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 tests, please keep CFI annotations updated in the .s files.
Ideally the test should be run with and without --scfi (as is done currently
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..8c3eef057ad
--- /dev/null
+++ b/gas/testsuite/gas/scfi/aarch64/ginsn-arith-1.l
@@ -0,0 +1,35 @@
+.*: Assembler messages:
+.*:13: Error: SCFI: unsupported stack manipulation pattern
+.*:16: 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 \?\?\?\? C0035FD6 ret
+ 15 ginsn: RET
+ 16 .size foo, .-foo
+ 16 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..749a51a70b4
--- /dev/null
+++ b/gas/testsuite/gas/scfi/aarch64/ginsn-arith-1.s
@@ -0,0 +1,16 @@
+# 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
+ 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..c71310d558f
--- /dev/null
+++ b/gas/testsuite/gas/scfi/aarch64/ginsn-ldst-1.l
@@ -0,0 +1,78 @@
+AARCH64 GAS .*
+
+ 1 # Testcase for a variety of ld st 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 # ldstpair_indexed
+ 8 0000 FF7F8629 stp wzr, wzr, \[sp, 48\]!
+ 8 ginsn: ADD %r31, 48, %r31
+ 9 0004 E00782A9 stp x0, x1, \[sp, 32\]!
+ 9 ginsn: ADD %r31, 32, %r31
+ 9 ginsn: STORE %r0, \[%r31\+0\]
+ 9 ginsn: STORE %r1, \[%r31\+8\]
+ 10 0008 E827BC6D stp d8, d9, \[sp, -64\]!
+ 10 ginsn: ADD %r31, -64, %r31
+ 10 ginsn: STORE %r72, \[%r31\+0\]
+ 10 ginsn: STORE %r73, \[%r31\+8\]
+ 11 000c E827C46C ldp d8, d9, \[sp\], 64
+ 11 ginsn: LOAD \[%r31\+0\], %r72
+ 11 ginsn: LOAD \[%r31\+8\], %r73
+ 11 ginsn: ADD %r31, 64, %r31
+ 12 # 32-bit FP regs
+ 13 0010 E51BB42D stp s5, s6, \[sp, -96\]!
+ 13 ginsn: ADD %r31, -96, %r31
+ 13 ginsn: STORE %r69, \[%r31\+0\]
+ 13 ginsn: STORE %r70, \[%r31\+4\]
+ 14 0014 E51BCC2C ldp s5, s6, \[sp\], 96
+ 14 ginsn: LOAD \[%r31\+0\], %r69
+ 14 ginsn: LOAD \[%r31\+4\], %r70
+ 14 ginsn: ADD %r31, 96, %r31
+ 15 # 32-bit INT regs
+ 16 0018 E10BB029 stp w1, w2, \[sp, -128\]!
+ 16 ginsn: ADD %r31, -128, %r31
+ 16 ginsn: STORE %r1, \[%r31\+0\]
+ 16 ginsn: STORE %r2, \[%r31\+4\]
+ 17 001c E10BD028 ldp w1, w2, \[sp\], 128
+ 17 ginsn: LOAD \[%r31\+0\], %r1
+ 17 ginsn: LOAD \[%r31\+4\], %r2
+ 17 ginsn: ADD %r31, 128, %r31
+ 18 # ldstpair_off
+ 19 0020 E00702AD stp q0, q1, \[sp, 64\]
+ 19 ginsn: STORE %r64, \[%r31\+64\]
+ 19 ginsn: STORE %r65, \[%r31\+80\]
+ 20 0024 FF7F0629 stp wzr, wzr, \[sp, 48\]
+ 21 0028 1F7840AD ldp q31, q30, \[x0\]
+ 22 # ldst_imm9
+ 23 002c E78F4F38 ldrb w7, \[sp, 248\]!
+ 23 ginsn: ADD %r31, 248, %r31
+ 23 ginsn: LOAD \[%r31\+0\], %r7
+ 24 0030 FD0FC33C ldr q29, \[sp, 48\]!
+ 24 ginsn: ADD %r31, 48, %r31
+ 24 ginsn: LOAD \[%r31\+0\], %r93
+ 25 0034 FF0F42B8 ldr wzr, \[sp, 32\]!
+ 25 ginsn: ADD %r31, 32, %r31
+ 26 0038 E30742F8 ldr x3, \[sp\], 32
+\fAARCH64 GAS .*
+
+
+ 26 ginsn: LOAD \[%r31\+0\], %r3
+ 26 ginsn: ADD %r31, 32, %r31
+ 27 # 32-bit ldr
+ 28 003c E10744BC ldr s1, \[sp\], 64
+ 28 ginsn: LOAD \[%r31\+0\], %r65
+ 28 ginsn: ADD %r31, 64, %r31
+ 29 #ldst_pos
+ 30 0040 FF3340B9 ldr wzr, \[sp, 48\]
+ 31 0044 FD1300F9 str x29, \[sp, 32\]
+ 31 ginsn: STORE %r29, \[%r31\+32\]
+ 32 0048 FD1340F9 ldr x29, \[sp, 32\]
+ 32 ginsn: LOAD \[%r31\+32\], %r29
+ 33 004c C0035FD6 ret
+ 33 ginsn: RET
+ 34 .size foo, .-foo
+ 34 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..22a6fea28d0
--- /dev/null
+++ b/gas/testsuite/gas/scfi/aarch64/ginsn-ldst-1.s
@@ -0,0 +1,34 @@
+# Testcase for a variety of ld st instructions
+ .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]
+# 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]
+ 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..310245bd947
--- /dev/null
+++ b/gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.l
@@ -0,0 +1,27 @@
+.*: Assembler messages:
+.*:9: Error: SCFI: unsupported stack manipulation pattern
+.*:13: 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 symbol:
+ 4 \?\?\?\? 7700 .string "w"
+ 5
+ 6 .type foo, %function
+ 6 ginsn: SYM FUNC_BEGIN
+ 7 foo:
+ 7 ginsn: SYM foo
+ 8 \?\?\?\? 00000000 adrp x0, symbol
+ 8 0090
+ 9 \?\?\?\? 1F000091 add sp, x0, :lo12:symbol
+ 9 ginsn: OTH 0, 0, %r31
+ 10 \?\?\?\? 2000A0F2 movk x0, 0x1, lsl 16
+ 11 \?\?\?\? E10380F9 prfm PLDL1STRM, \[sp\]
+ 11 ginsn: LOAD \[%r31\+0\], %r1
+ 12 \?\?\?\? C0035FD6 ret
+ 12 ginsn: RET
+ 13 .size foo,.-foo
+ 13 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..e1b31c113ad
--- /dev/null
+++ b/gas/testsuite/gas/scfi/aarch64/ginsn-misc-1.s
@@ -0,0 +1,13 @@
+# Testcase for a variety of misc instructions
+# Ensure graceful handling, irrespective of ginsn generation
+symbol:
+ .string "w"
+
+ .type foo, %function
+foo:
+ adrp x0, symbol
+ add sp, x0, :lo12:symbol
+ movk x0, 0x1, lsl 16
+ prfm PLDL1STRM, [sp]
+ 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..d53e136d7f1
--- /dev/null
+++ b/gas/testsuite/gas/scfi/aarch64/scfi-aarch64.exp
@@ -0,0 +1,70 @@
+# 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 -ali --warn"
+ run_list_test "ginsn-misc-1" "--scfi=experimental -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_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-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..7464fa9efee
--- /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..f1b960449ae
--- /dev/null
+++ b/gas/testsuite/gas/scfi/aarch64/scfi-diag-3.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-diag-3.s b/gas/testsuite/gas/scfi/aarch64/scfi-diag-3.s
new file mode 100644
index 00000000000..dee87f30b08
--- /dev/null
+++ b/gas/testsuite/gas/scfi/aarch64/scfi-diag-3.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
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-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..296aad890bf
--- /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
--
2.43.0
prev parent reply other threads:[~2024-07-01 2:54 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-01 2:53 [PATCH,V4 0/8] Add SCFI support for aarch64 Indu Bhagat
2024-07-01 2:53 ` [PATCH,V4 1/8] gas: scfi: make scfi_state_restore_reg function more precise Indu Bhagat
2024-07-12 15:03 ` [PATCH, V4 " Indu Bhagat
2024-07-01 2:53 ` [PATCH,V4 2/8] include: opcodes: aarch64: define new subclasses Indu Bhagat
2024-07-01 17:40 ` Richard Sandiford
2024-07-11 5:14 ` Indu Bhagat
2024-07-11 12:22 ` Richard Sandiford
2024-07-11 17:59 ` Indu Bhagat
2024-07-01 2:53 ` [PATCH,V4 3/8] opcodes: aarch64: flags to denote subclasses of ldst insns Indu Bhagat
2024-07-01 18:06 ` Richard Sandiford
2024-07-11 5:45 ` Indu Bhagat
2024-07-12 13:59 ` Indu Bhagat
2024-07-13 7:34 ` Indu Bhagat
2024-07-01 2:54 ` [PATCH,V4 4/8] opcodes: aarch64: flags to denote subclasses of arithmetic insns Indu Bhagat
2024-07-01 18:13 ` Richard Sandiford
2024-07-11 5:47 ` Indu Bhagat
2024-07-11 12:52 ` Richard Sandiford
2024-07-11 17:58 ` Indu Bhagat
2024-07-11 18:43 ` Richard Sandiford
2024-07-12 12:53 ` Indu Bhagat
2024-07-01 2:54 ` [PATCH,V4 5/8] opcodes: aarch64: flags to denote subclasses of uncond branches Indu Bhagat
2024-07-01 2:54 ` [PATCH,V4 6/8] opcodes: aarch64: enforce checks on subclass flags in aarch64-gen.c Indu Bhagat
2024-07-01 2:54 ` [PATCH,V4 7/8] gas: aarch64: add experimental support for SCFI Indu Bhagat
2024-07-01 19:49 ` Richard Sandiford
2024-07-11 6:30 ` Indu Bhagat
2024-07-11 13:15 ` Richard Sandiford
2024-07-11 19:07 ` Indu Bhagat
2024-07-11 20:10 ` Richard Sandiford
2024-07-01 2:54 ` Indu Bhagat [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240701025404.3361349-9-indu.bhagat@oracle.com \
--to=indu.bhagat@oracle.com \
--cc=Richard.Earnshaw@arm.com \
--cc=binutils@sourceware.org \
--cc=richard.sandiford@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).