[2/2] aarch64/testsuite: add LTO coverage for branch-protection notes and attributes

Message ID 20260408091202.13538-3-muhammad.kamran@arm.com
State Committed
Commit b3ba4c3336c341596094672c635bd99971f36d8c
Delegated to: Tamar Christina
Headers
Series aarch64/testsuite: improve object-readelf and add LTO branch-protection tests |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 success Build passed

Commit Message

Muhammad Kamran April 8, 2026, 9:12 a.m. UTC
  Recent binutils (e.g. 2.46) switched AArch64 branch-protection emission
from .note.gnu.property to build attributes
(Tag_Feature_BTI, Tag_Feature_PAC, Tag_Feature_GCS) when GCC is
configured with such toolchains.

PR target/124365 exposed an issue where -flto with
-mbranch-protection=standard caused loss of branch-protection metadata in build
attributes. This was due to an LTO bug, now fixed upstream
(8b39ec70741b7fb9d059b6944f30a6743dea996a).

Add tests to verify both forms in LTO builds, covering:
	• older binutils behaviour (.note.gnu.property), and
	• newer binutils behaviour (build attributes).

This ensures branch-protection metadata is preserved across LTO for both
toolchain configurations.

	PR target/124365

gcc/testsuite/ChangeLog:

	* gcc.target/aarch64/lto/lto.exp: New DejaGnu test driver for LTO tests
	for aarch64. Copied from gcc/testsuite/gcc.target/arm/lto/lto.exp with
	minor changes.
	* gcc.target/aarch64/lto/pr124365-build-attributes-1_0.c: New test
	for build attributes with branch protection.
	* gcc.target/aarch64/lto/pr124365-build-attributes-1_1.c: Companion
	source file for the LTO test.
	* gcc.target/aarch64/lto/pr124365-build-attributes-2_0.c: New test
	for build attributes without branch protection.
	* gcc.target/aarch64/lto/pr124365-build-attributes-2_1.c: Companion
	source file for the LTO test with branch protection enabled.
	* gcc.target/aarch64/lto/pr124365-gnu-property-1_0.c: New test for
	`.note.gnu.property` with branch protection.
	* gcc.target/aarch64/lto/pr124365-gnu-property-1_1.c: Companion
	source file for the LTO test.
	* gcc.target/aarch64/lto/pr124365-gnu-property-2_0.c: New test for
	`.note.gnu.property` without branch protection.
	* gcc.target/aarch64/lto/pr124365-gnu-property-2_1.c: Companion
	source file for the LTO test with branch protection enabled.
---
 gcc/testsuite/gcc.target/aarch64/lto/lto.exp  | 61 +++++++++++++++++++
 .../lto/pr124365-build-attributes-1_0.c       | 18 ++++++
 .../lto/pr124365-build-attributes-1_1.c       |  5 ++
 .../lto/pr124365-build-attributes-2_0.c       | 18 ++++++
 .../lto/pr124365-build-attributes-2_1.c       |  6 ++
 .../aarch64/lto/pr124365-gnu-property-1_0.c   | 16 +++++
 .../aarch64/lto/pr124365-gnu-property-1_1.c   |  5 ++
 .../aarch64/lto/pr124365-gnu-property-2_0.c   | 16 +++++
 .../aarch64/lto/pr124365-gnu-property-2_1.c   |  6 ++
 9 files changed, 151 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/aarch64/lto/lto.exp
 create mode 100644 gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-1_0.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-1_1.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-2_0.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-2_1.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-1_0.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-1_1.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-2_0.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-2_1.c
  

Comments

Tamar Christina April 13, 2026, 7:27 a.m. UTC | #1
> -----Original Message-----
> From: Muhammad Kamran <muhammad.kamran@arm.com>
> Sent: 08 April 2026 10:12
> To: gcc-patches@gcc.gnu.org
> Cc: Richard Earnshaw <Richard.Earnshaw@arm.com>; Tamar Christina
> <Tamar.Christina@arm.com>; Kyrylo Tkachov <ktkachov@nvidia.com>; Alice
> Carlotti <Alice.Carlotti@arm.com>; Alex Coplan <Alex.Coplan@arm.com>;
> Andrew Pinski <andrew.pinski@oss.qualcomm.com>; Wilco Dijkstra
> <Wilco.Dijkstra@arm.com>; Jakub Jelinek <jakub@redhat.com>; Rainer Orth
> <ro@CeBiTec.Uni-Bielefeld.DE>; Mike Stump <mikestump@comcast.net>;
> Muhammad Kamran <Muhammad.Kamran@arm.com>
> Subject: [PATCH 2/2] aarch64/testsuite: add LTO coverage for branch-
> protection notes and attributes
> 
> Recent binutils (e.g. 2.46) switched AArch64 branch-protection emission
> from .note.gnu.property to build attributes
> (Tag_Feature_BTI, Tag_Feature_PAC, Tag_Feature_GCS) when GCC is
> configured with such toolchains.
> 
> PR target/124365 exposed an issue where -flto with
> -mbranch-protection=standard caused loss of branch-protection metadata in
> build
> attributes. This was due to an LTO bug, now fixed upstream
> (8b39ec70741b7fb9d059b6944f30a6743dea996a).
> 
> Add tests to verify both forms in LTO builds, covering:
> 	• older binutils behaviour (.note.gnu.property), and
> 	• newer binutils behaviour (build attributes).
> 
> This ensures branch-protection metadata is preserved across LTO for both
> toolchain configurations.
> 
> 	PR target/124365
> 
> gcc/testsuite/ChangeLog:
> 
> 	* gcc.target/aarch64/lto/lto.exp: New DejaGnu test driver for LTO
> tests
> 	for aarch64. Copied from gcc/testsuite/gcc.target/arm/lto/lto.exp
> with
> 	minor changes.
> 	* gcc.target/aarch64/lto/pr124365-build-attributes-1_0.c: New test
> 	for build attributes with branch protection.
> 	* gcc.target/aarch64/lto/pr124365-build-attributes-1_1.c:
> Companion
> 	source file for the LTO test.
> 	* gcc.target/aarch64/lto/pr124365-build-attributes-2_0.c: New test
> 	for build attributes without branch protection.
> 	* gcc.target/aarch64/lto/pr124365-build-attributes-2_1.c:
> Companion
> 	source file for the LTO test with branch protection enabled.
> 	* gcc.target/aarch64/lto/pr124365-gnu-property-1_0.c: New test for
> 	`.note.gnu.property` with branch protection.
> 	* gcc.target/aarch64/lto/pr124365-gnu-property-1_1.c: Companion
> 	source file for the LTO test.
> 	* gcc.target/aarch64/lto/pr124365-gnu-property-2_0.c: New test for
> 	`.note.gnu.property` without branch protection.
> 	* gcc.target/aarch64/lto/pr124365-gnu-property-2_1.c: Companion
> 	source file for the LTO test with branch protection enabled.

OK, once patch 1 is approved.

Thanks,
Tamar

> ---
>  gcc/testsuite/gcc.target/aarch64/lto/lto.exp  | 61 +++++++++++++++++++
>  .../lto/pr124365-build-attributes-1_0.c       | 18 ++++++
>  .../lto/pr124365-build-attributes-1_1.c       |  5 ++
>  .../lto/pr124365-build-attributes-2_0.c       | 18 ++++++
>  .../lto/pr124365-build-attributes-2_1.c       |  6 ++
>  .../aarch64/lto/pr124365-gnu-property-1_0.c   | 16 +++++
>  .../aarch64/lto/pr124365-gnu-property-1_1.c   |  5 ++
>  .../aarch64/lto/pr124365-gnu-property-2_0.c   | 16 +++++
>  .../aarch64/lto/pr124365-gnu-property-2_1.c   |  6 ++
>  9 files changed, 151 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.target/aarch64/lto/lto.exp
>  create mode 100644 gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-
> attributes-1_0.c
>  create mode 100644 gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-
> attributes-1_1.c
>  create mode 100644 gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-
> attributes-2_0.c
>  create mode 100644 gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-
> attributes-2_1.c
>  create mode 100644 gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-
> property-1_0.c
>  create mode 100644 gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-
> property-1_1.c
>  create mode 100644 gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-
> property-2_0.c
>  create mode 100644 gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-
> property-2_1.c
> 
> diff --git a/gcc/testsuite/gcc.target/aarch64/lto/lto.exp
> b/gcc/testsuite/gcc.target/aarch64/lto/lto.exp
> new file mode 100644
> index 00000000000..0c72d343174
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/lto/lto.exp
> @@ -0,0 +1,61 @@
> +# Copyright (C) 2009-2026 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 GCC; see the file COPYING3.  If not see
> +# <http://www.gnu.org/licenses/>.
> +
> +# Exit immediately if this isn't an AArch64 target.
> +if ![istarget aarch64*-*-*] then {
> +  return
> +}
> +
> +# Test link-time optimization across multiple files.
> +#
> +# Programs are broken into multiple files.  Each one is compiled
> +# separately with LTO information.  The final executable is generated
> +# by collecting all the generated object files using regular LTO or WHOPR.
> +
> +if $tracelevel then {
> +    strace $tracelevel
> +}
> +
> +# Load procedures from common libraries.
> +load_lib standard.exp
> +load_lib gcc.exp
> +
> +# Load the language-independent compatibility support procedures.
> +load_lib lto.exp
> +
> +# If LTO has not been enabled, bail.
> +if { ![check_effective_target_lto] } {
> +    return
> +}
> +
> +gcc_init
> +lto_init no-mathlib
> +
> +# Define an identifier for use with this suite to avoid name conflicts
> +# with other lto tests running at the same time.
> +set sid "c_lto"
> +
> +# Main loop.
> +foreach src [lsort [find $srcdir/$subdir *_0.c]] {
> +    # If we're only testing specific files and this isn't one of them, skip it.
> +    if ![runtest_file_p $runtests $src] then {
> +	continue
> +    }
> +
> +    lto-execute $src $sid
> +}
> +
> +lto_finish
> diff --git a/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-
> 1_0.c b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-
> 1_0.c
> new file mode 100644
> index 00000000000..c2819532f3f
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-1_0.c
> @@ -0,0 +1,18 @@
> +/* PR target/124365 */
> +/* { dg-lto-do link } */
> +/* { dg-skip-if "" { ! aarch64*-*-linux* } } */
> +/* { dg-require-effective-target aarch64_gas_has_build_attributes } */
> +/* { dg-require-effective-target mbranch_protection_ok } */
> +/* { dg-lto-options { { -flto -O2 -mbranch-protection=standard } } } */
> +/* { dg-extra-ld-options "-nostdlib -nostartfiles -Wl,-e,main" } */
> +
> +int foo ();
> +int
> +main (void)
> +{
> +  return foo ();
> +}
> +
> +/* { dg-final { object-readelf-attributes {Tag_Feature_BTI:\s+1\s+\(0x1\)} } }
> */
> +/* { dg-final { object-readelf-attributes {Tag_Feature_PAC:\s+1\s+\(0x1\)} } }
> */
> +/* { dg-final { object-readelf-attributes {Tag_Feature_GCS:\s+1\s+\(0x1\)} } }
> */
> diff --git a/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-
> 1_1.c b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-
> 1_1.c
> new file mode 100644
> index 00000000000..8f8b1830bac
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-1_1.c
> @@ -0,0 +1,5 @@
> +int
> +foo ()
> +{
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-
> 2_0.c b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-
> 2_0.c
> new file mode 100644
> index 00000000000..091ecc83637
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-2_0.c
> @@ -0,0 +1,18 @@
> +/* PR target/124365 */
> +/* { dg-lto-do link } */
> +/* { dg-skip-if "" { ! aarch64*-*-linux* } } */
> +/* { dg-require-effective-target aarch64_gas_has_build_attributes } */
> +/* { dg-require-effective-target mbranch_protection_ok } */
> +/* { dg-lto-options { { -flto -O2 -mbranch-protection=none } } } */
> +/* { dg-extra-ld-options "-nostdlib -nostartfiles -Wl,-e,main" } */
> +
> +int foo ();
> +int
> +main (void)
> +{
> +  return foo ();
> +}
> +
> +/* { dg-final { object-readelf-attributes {Tag_Feature_BTI:\s+0\s+\(0x0\)} } }
> */
> +/* { dg-final { object-readelf-attributes {Tag_Feature_PAC:\s+0\s+\(0x0\)} } }
> */
> +/* { dg-final { object-readelf-attributes {Tag_Feature_GCS:\s+0\s+\(0x0\)} } }
> */
> diff --git a/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-
> 2_1.c b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-
> 2_1.c
> new file mode 100644
> index 00000000000..15f7c94dccb
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-2_1.c
> @@ -0,0 +1,6 @@
> +/* { dg-options "-O2 -flto -mbranch-protection=standard" }  */
> +int
> +foo ()
> +{
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-
> 1_0.c b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-1_0.c
> new file mode 100644
> index 00000000000..fca83daa0c8
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-1_0.c
> @@ -0,0 +1,16 @@
> +/* PR target/124365 */
> +/* { dg-lto-do link } */
> +/* { dg-skip-if "" { ! aarch64*-*-linux* } } */
> +/* { dg-skip-if "" { aarch64_gas_has_build_attributes } } */
> +/* { dg-require-effective-target mbranch_protection_ok } */
> +/* { dg-lto-options { { -flto -O2 -mbranch-protection=standard } } } */
> +/* { dg-extra-ld-options "-nostdlib -nostartfiles -Wl,-e,main" } */
> +
> +int foo ();
> +int
> +main (void)
> +{
> +  return 0;
> +}
> +
> +/* { dg-final { object-readelf-notes {AArch64
> feature:\s+BTI,\s+PAC,\s+(GCS|<unknown:\s+[0-9]+>)} } } */
> diff --git a/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-
> 1_1.c b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-1_1.c
> new file mode 100644
> index 00000000000..8f8b1830bac
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-1_1.c
> @@ -0,0 +1,5 @@
> +int
> +foo ()
> +{
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-
> 2_0.c b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-2_0.c
> new file mode 100644
> index 00000000000..728ad8e1ea1
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-2_0.c
> @@ -0,0 +1,16 @@
> +/* PR target/124365 */
> +/* { dg-lto-do link } */
> +/* { dg-skip-if "" { ! aarch64*-*-linux* } } */
> +/* { dg-skip-if "" { aarch64_gas_has_build_attributes } } */
> +/* { dg-require-effective-target mbranch_protection_ok } */
> +/* { dg-lto-options { { -flto -O2 -mbranch-protection=none } } } */
> +/* { dg-extra-ld-options "-nostdlib -nostartfiles -Wl,-e,main" } */
> +
> +int foo ();
> +int
> +main (void)
> +{
> +  return 0;
> +}
> +
> +/* { dg-final { object-readelf-notes-not {AArch64
> feature:\s+BTI\s+PAC\s+(GCS|<unknown:\s+[0-9]+>)} } } */
> diff --git a/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-
> 2_1.c b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-2_1.c
> new file mode 100644
> index 00000000000..15f7c94dccb
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-2_1.c
> @@ -0,0 +1,6 @@
> +/* { dg-options "-O2 -flto -mbranch-protection=standard" }  */
> +int
> +foo ()
> +{
> +  return 0;
> +}
> --
> 2.43.0
  

Patch

diff --git a/gcc/testsuite/gcc.target/aarch64/lto/lto.exp b/gcc/testsuite/gcc.target/aarch64/lto/lto.exp
new file mode 100644
index 00000000000..0c72d343174
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/lto/lto.exp
@@ -0,0 +1,61 @@ 
+# Copyright (C) 2009-2026 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 GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# Exit immediately if this isn't an AArch64 target.
+if ![istarget aarch64*-*-*] then {
+  return
+}
+
+# Test link-time optimization across multiple files.
+#
+# Programs are broken into multiple files.  Each one is compiled
+# separately with LTO information.  The final executable is generated
+# by collecting all the generated object files using regular LTO or WHOPR.
+
+if $tracelevel then {
+    strace $tracelevel
+}
+
+# Load procedures from common libraries.
+load_lib standard.exp
+load_lib gcc.exp
+
+# Load the language-independent compatibility support procedures.
+load_lib lto.exp
+
+# If LTO has not been enabled, bail.
+if { ![check_effective_target_lto] } {
+    return
+}
+
+gcc_init
+lto_init no-mathlib
+
+# Define an identifier for use with this suite to avoid name conflicts
+# with other lto tests running at the same time.
+set sid "c_lto"
+
+# Main loop.
+foreach src [lsort [find $srcdir/$subdir *_0.c]] {
+    # If we're only testing specific files and this isn't one of them, skip it.
+    if ![runtest_file_p $runtests $src] then {
+	continue
+    }
+
+    lto-execute $src $sid
+}
+
+lto_finish
diff --git a/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-1_0.c b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-1_0.c
new file mode 100644
index 00000000000..c2819532f3f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-1_0.c
@@ -0,0 +1,18 @@ 
+/* PR target/124365 */
+/* { dg-lto-do link } */
+/* { dg-skip-if "" { ! aarch64*-*-linux* } } */
+/* { dg-require-effective-target aarch64_gas_has_build_attributes } */
+/* { dg-require-effective-target mbranch_protection_ok } */
+/* { dg-lto-options { { -flto -O2 -mbranch-protection=standard } } } */
+/* { dg-extra-ld-options "-nostdlib -nostartfiles -Wl,-e,main" } */
+
+int foo ();
+int
+main (void)
+{
+  return foo ();
+}
+
+/* { dg-final { object-readelf-attributes {Tag_Feature_BTI:\s+1\s+\(0x1\)} } } */
+/* { dg-final { object-readelf-attributes {Tag_Feature_PAC:\s+1\s+\(0x1\)} } } */
+/* { dg-final { object-readelf-attributes {Tag_Feature_GCS:\s+1\s+\(0x1\)} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-1_1.c b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-1_1.c
new file mode 100644
index 00000000000..8f8b1830bac
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-1_1.c
@@ -0,0 +1,5 @@ 
+int
+foo ()
+{
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-2_0.c b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-2_0.c
new file mode 100644
index 00000000000..091ecc83637
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-2_0.c
@@ -0,0 +1,18 @@ 
+/* PR target/124365 */
+/* { dg-lto-do link } */
+/* { dg-skip-if "" { ! aarch64*-*-linux* } } */
+/* { dg-require-effective-target aarch64_gas_has_build_attributes } */
+/* { dg-require-effective-target mbranch_protection_ok } */
+/* { dg-lto-options { { -flto -O2 -mbranch-protection=none } } } */
+/* { dg-extra-ld-options "-nostdlib -nostartfiles -Wl,-e,main" } */
+
+int foo ();
+int
+main (void)
+{
+  return foo ();
+}
+
+/* { dg-final { object-readelf-attributes {Tag_Feature_BTI:\s+0\s+\(0x0\)} } } */
+/* { dg-final { object-readelf-attributes {Tag_Feature_PAC:\s+0\s+\(0x0\)} } } */
+/* { dg-final { object-readelf-attributes {Tag_Feature_GCS:\s+0\s+\(0x0\)} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-2_1.c b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-2_1.c
new file mode 100644
index 00000000000..15f7c94dccb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-build-attributes-2_1.c
@@ -0,0 +1,6 @@ 
+/* { dg-options "-O2 -flto -mbranch-protection=standard" }  */
+int
+foo ()
+{
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-1_0.c b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-1_0.c
new file mode 100644
index 00000000000..fca83daa0c8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-1_0.c
@@ -0,0 +1,16 @@ 
+/* PR target/124365 */
+/* { dg-lto-do link } */
+/* { dg-skip-if "" { ! aarch64*-*-linux* } } */
+/* { dg-skip-if "" { aarch64_gas_has_build_attributes } } */
+/* { dg-require-effective-target mbranch_protection_ok } */
+/* { dg-lto-options { { -flto -O2 -mbranch-protection=standard } } } */
+/* { dg-extra-ld-options "-nostdlib -nostartfiles -Wl,-e,main" } */
+
+int foo ();
+int
+main (void)
+{
+  return 0;
+}
+
+/* { dg-final { object-readelf-notes {AArch64 feature:\s+BTI,\s+PAC,\s+(GCS|<unknown:\s+[0-9]+>)} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-1_1.c b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-1_1.c
new file mode 100644
index 00000000000..8f8b1830bac
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-1_1.c
@@ -0,0 +1,5 @@ 
+int
+foo ()
+{
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-2_0.c b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-2_0.c
new file mode 100644
index 00000000000..728ad8e1ea1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-2_0.c
@@ -0,0 +1,16 @@ 
+/* PR target/124365 */
+/* { dg-lto-do link } */
+/* { dg-skip-if "" { ! aarch64*-*-linux* } } */
+/* { dg-skip-if "" { aarch64_gas_has_build_attributes } } */
+/* { dg-require-effective-target mbranch_protection_ok } */
+/* { dg-lto-options { { -flto -O2 -mbranch-protection=none } } } */
+/* { dg-extra-ld-options "-nostdlib -nostartfiles -Wl,-e,main" } */
+
+int foo ();
+int
+main (void)
+{
+  return 0;
+}
+
+/* { dg-final { object-readelf-notes-not {AArch64 feature:\s+BTI\s+PAC\s+(GCS|<unknown:\s+[0-9]+>)} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-2_1.c b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-2_1.c
new file mode 100644
index 00000000000..15f7c94dccb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/lto/pr124365-gnu-property-2_1.c
@@ -0,0 +1,6 @@ 
+/* { dg-options "-O2 -flto -mbranch-protection=standard" }  */
+int
+foo ()
+{
+  return 0;
+}