|
@@ -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
|
|
|
+
|