diff mbox series

[v2] rust: Fix build with GCC-15 on aarch64/musl

Message ID 20250501063339.1587969-1-raj.khem@gmail.com
State Accepted, archived
Commit aa5b42b32093fdd10e0a8f8a124322610c84f60b
Headers show
Series [v2] rust: Fix build with GCC-15 on aarch64/musl | expand

Commit Message

Khem Raj May 1, 2025, 6:33 a.m. UTC
GCC-15 has _CHKFEAT_GCS defined in arm_acle.h to indicate gcs intrinsics
support, this trips llvm libunwind gcs feature detection logic to set
gcs feature on. However the contructs used in unwindlib are assuming clang
and the needed target attribute is not available in gcc it should be +gcs
to work with both clang and gcc

Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
v2: Disable gcs with gcc, it was as such with gcc-14 too

 ...-gcs-instead-of-gcs-target-attribute.patch | 66 +++++++++++++++++++
 meta/recipes-devtools/rust/rust-source.inc    |  1 +
 2 files changed, 67 insertions(+)
 create mode 100644 meta/recipes-devtools/rust/files/0001-libunwind-Use-gcs-instead-of-gcs-target-attribute.patch
diff mbox series

Patch

diff --git a/meta/recipes-devtools/rust/files/0001-libunwind-Use-gcs-instead-of-gcs-target-attribute.patch b/meta/recipes-devtools/rust/files/0001-libunwind-Use-gcs-instead-of-gcs-target-attribute.patch
new file mode 100644
index 00000000000..a704671fb9b
--- /dev/null
+++ b/meta/recipes-devtools/rust/files/0001-libunwind-Use-gcs-instead-of-gcs-target-attribute.patch
@@ -0,0 +1,66 @@ 
+From e4f4094de8ddcbe6d5ff1cdf782d2b89e0563903 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Wed, 30 Apr 2025 19:51:19 -0700
+Subject: [PATCH] libunwind: Use +gcs instead of gcs target attribute
+
+__attribute__((target("gcs"))) does not work with gcc
+
+GCC-15 has added gcs intrinsics [1] but the syntax for enabling it is
+slightly different. This syntax works with clang too.
+
+With gcc15 compiler libunwind's check for this macros is succeeding and it
+ends up enabling 'gcs' by using function attribute, this works with clang
+but not with gcc but '+gcs' works with both
+
+We can see this in rust compiler bootstrap for aarch64/musl when system
+uses gcc15, it ends up with these errors
+
+Building libunwind.a for aarch64-poky-linux-musl
+cargo:warning=/mnt/b/yoe/master/sources/poky/build/tmp/work/cortexa57-poky-linux-musl/rust/1.85.1/rustc-1.85.1-src/src/llvm-project/libunwind/src/UnwindLevel1.c:191:1: error: arch extension 'gcs' should be prefixed by '+'
+cargo:warning=  191 | unwind_phase2(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *exception_object) {
+cargo:warning=      | ^~~~~~~~~~~~~
+cargo:warning=/mnt/b/yoe/master/sources/poky/build/tmp/work/cortexa57-poky-linux-musl/rust/1.85.1/rustc-1.85.1-src/src/llvm-project/libunwind/src/UnwindLevel1.c:337:22: error: arch extension 'gcs' should be prefixed by '+'
+cargo:warning=  337 |                      _Unwind_Stop_Fn stop, void *stop_parameter) {
+cargo:warning=      |                      ^~~~~~~~~~~~~~~
+
+[1] https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=5a6af707f0af
+
+Upstream-Status: Submitted [https://github.com/llvm/llvm-project/pull/138077]
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ src/llvm-project/libunwind/src/UnwindLevel1.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/src/llvm-project/libunwind/src/UnwindLevel1.c
++++ b/src/llvm-project/libunwind/src/UnwindLevel1.c
+@@ -185,7 +185,7 @@ extern int __unw_step_stage2(unw_cursor_
+ 
+ #if defined(_LIBUNWIND_USE_GCS)
+ // Enable the GCS target feature to permit gcspop instructions to be used.
+-__attribute__((target("gcs")))
++__attribute__((target("+gcs")))
+ #endif
+ static _Unwind_Reason_Code
+ unwind_phase2(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *exception_object) {
+@@ -329,7 +329,7 @@ unwind_phase2(unw_context_t *uc, unw_cur
+ 
+ #if defined(_LIBUNWIND_USE_GCS)
+ // Enable the GCS target feature to permit gcspop instructions to be used.
+-__attribute__((target("gcs")))
++__attribute__((target("+gcs")))
+ #endif
+ static _Unwind_Reason_Code
+ unwind_phase2_forced(unw_context_t *uc, unw_cursor_t *cursor,
+--- a/src/llvm-project/libunwind/src/cet_unwind.h
++++ b/src/llvm-project/libunwind/src/cet_unwind.h
+@@ -42,7 +42,8 @@
+ #include <arm_acle.h>
+ 
+ // We can only use GCS if arm_acle.h defines the GCS intrinsics.
+-#ifdef _CHKFEAT_GCS
++// Enable gcs with clang for now, gcc does not build unwindlevel1.c correctly
++#if defined(_CHKFEAT_GCS) && defined(__clang__)
+ #define _LIBUNWIND_USE_GCS 1
+ #endif
+ 
diff --git a/meta/recipes-devtools/rust/rust-source.inc b/meta/recipes-devtools/rust/rust-source.inc
index 25c0a1ce52a..82d28cf09f4 100644
--- a/meta/recipes-devtools/rust/rust-source.inc
+++ b/meta/recipes-devtools/rust/rust-source.inc
@@ -8,6 +8,7 @@  SRC_URI += "https://static.rust-lang.org/dist/rustc-${RUST_VERSION}-src.tar.xz;n
             file://0001-src-core-build_steps-tool.rs-switch-off-lto-for-rust.patch;patchdir=${RUSTSRC} \
             file://revert-link-std-statically-in-rustc_driver-feature.patch;patchdir=${RUSTSRC} \
             file://Zdual-proc-macros-additional-check.patch;patchdir=${RUSTSRC} \
+            file://0001-libunwind-Use-gcs-instead-of-gcs-target-attribute.patch;patchdir=${RUSTSRC} \
 "
 SRC_URI[rust.sha256sum] = "b1fbf809efe9f036939401e142631c201a53bcf43ec1696bd9f5290ba236a266"