1From e4f4094de8ddcbe6d5ff1cdf782d2b89e0563903 Mon Sep 17 00:00:00 2001 2From: Khem Raj <raj.khem@gmail.com> 3Date: Wed, 30 Apr 2025 19:51:19 -0700 4Subject: [PATCH] libunwind: Use +gcs instead of gcs target attribute 5 6__attribute__((target("gcs"))) does not work with gcc 7 8GCC-15 has added gcs intrinsics [1] but the syntax for enabling it is 9slightly different. This syntax works with clang too. 10 11With gcc15 compiler libunwind's check for this macros is succeeding and it 12ends up enabling 'gcs' by using function attribute, this works with clang 13but not with gcc but '+gcs' works with both 14 15We can see this in rust compiler bootstrap for aarch64/musl when system 16uses gcc15, it ends up with these errors 17 18Building libunwind.a for aarch64-poky-linux-musl 19cargo: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 '+' 20cargo:warning= 191 | unwind_phase2(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *exception_object) { 21cargo:warning= | ^~~~~~~~~~~~~ 22cargo: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 '+' 23cargo:warning= 337 | _Unwind_Stop_Fn stop, void *stop_parameter) { 24cargo:warning= | ^~~~~~~~~~~~~~~ 25 26[1] https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=5a6af707f0af 27 28Upstream-Status: Submitted [https://github.com/llvm/llvm-project/pull/138077] 29 30Signed-off-by: Khem Raj <raj.khem@gmail.com> 31--- 32 src/llvm-project/libunwind/src/UnwindLevel1.c | 4 ++-- 33 1 file changed, 2 insertions(+), 2 deletions(-) 34 35--- a/src/llvm-project/libunwind/src/UnwindLevel1.c 36+++ b/src/llvm-project/libunwind/src/UnwindLevel1.c 37@@ -185,7 +185,7 @@ extern int __unw_step_stage2(unw_cursor_ 38 39 #if defined(_LIBUNWIND_USE_GCS) 40 // Enable the GCS target feature to permit gcspop instructions to be used. 41-__attribute__((target("gcs"))) 42+__attribute__((target("+gcs"))) 43 #endif 44 static _Unwind_Reason_Code 45 unwind_phase2(unw_context_t *uc, unw_cursor_t *cursor, _Unwind_Exception *exception_object) { 46@@ -329,7 +329,7 @@ unwind_phase2(unw_context_t *uc, unw_cur 47 48 #if defined(_LIBUNWIND_USE_GCS) 49 // Enable the GCS target feature to permit gcspop instructions to be used. 50-__attribute__((target("gcs"))) 51+__attribute__((target("+gcs"))) 52 #endif 53 static _Unwind_Reason_Code 54 unwind_phase2_forced(unw_context_t *uc, unw_cursor_t *cursor, 55--- a/src/llvm-project/libunwind/src/cet_unwind.h 56+++ b/src/llvm-project/libunwind/src/cet_unwind.h 57@@ -42,7 +42,8 @@ 58 #include <arm_acle.h> 59 60 // We can only use GCS if arm_acle.h defines the GCS intrinsics. 61-#ifdef _CHKFEAT_GCS 62+// Enable gcs with clang for now, gcc does not build unwindlevel1.c correctly 63+#if defined(_CHKFEAT_GCS) && defined(__clang__) 64 #define _LIBUNWIND_USE_GCS 1 65 #endif 66 67