https://github.com/ojhunt updated https://github.com/llvm/llvm-project/pull/164535
>From 6dc291683b959808453a077cf016e76652564470 Mon Sep 17 00:00:00 2001 From: Oliver Hunt <[email protected]> Date: Tue, 21 Oct 2025 19:19:04 -0700 Subject: [PATCH] [PAC][libunwind] Fix gcc build of libunwind and compiler-rt This adds guards on the ptrauth feature checks so that they are only performed if __has_feature is actually available. --- compiler-rt/lib/builtins/gcc_personality_v0.c | 11 +++++++++-- libcxxabi/include/__cxxabi_config.h | 7 ++++++- libcxxabi/src/cxa_personality.cpp | 8 ++++---- libunwind/include/__libunwind_config.h | 12 +++++++----- libunwind/src/UnwindRegistersRestore.S | 10 ++++++++-- libunwind/src/UnwindRegistersSave.S | 10 ++++++++-- 6 files changed, 42 insertions(+), 16 deletions(-) diff --git a/compiler-rt/lib/builtins/gcc_personality_v0.c b/compiler-rt/lib/builtins/gcc_personality_v0.c index 3ed17fa788c28..5b1a6ed772469 100644 --- a/compiler-rt/lib/builtins/gcc_personality_v0.c +++ b/compiler-rt/lib/builtins/gcc_personality_v0.c @@ -30,7 +30,13 @@ EXCEPTION_DISPOSITION _GCC_specific_handler(PEXCEPTION_RECORD, void *, PCONTEXT, _Unwind_Personality_Fn); #endif -#if __has_feature(ptrauth_calls) +#if defined(__has_feature) +#define __has_ptrauth_calls __has_feature(ptrauth_calls) +#else +#define __has_ptrauth_calls 0 +#endif + +#if __has_ptrauth_calls #include <ptrauth.h> // `__ptrauth_restricted_intptr` is a feature of apple clang that predates @@ -48,6 +54,7 @@ EXCEPTION_DISPOSITION _GCC_specific_handler(PEXCEPTION_RECORD, void *, PCONTEXT, #else #define __ptrauth_gcc_personality_intptr(...) #endif +#else #define __ptrauth_gcc_personality_func_key ptrauth_key_function_pointer @@ -292,7 +299,7 @@ COMPILER_RT_ABI _Unwind_Reason_Code __gcc_personality_v0( _Unwind_SetGR(context, __builtin_eh_return_data_regno(1), 0); size_t __ptrauth_gcc_personality_lpad landingPad = funcStart + landingPadOffset; -#if __has_feature(ptrauth_calls) +#if __has_ptrauth_calls uintptr_t stackPointer = _Unwind_GetGR(context, -2); const uintptr_t existingDiscriminator = ptrauth_blend_discriminator( &landingPad, __ptrauth_gcc_personality_lpad_disc); diff --git a/libcxxabi/include/__cxxabi_config.h b/libcxxabi/include/__cxxabi_config.h index f5101dbc9e599..84c14acddbb85 100644 --- a/libcxxabi/include/__cxxabi_config.h +++ b/libcxxabi/include/__cxxabi_config.h @@ -107,7 +107,12 @@ # include <ptrauth.h> #endif -#if __has_feature(ptrauth_calls) +#if defined(__has_feature) +# define __ptrauth_cxxabi_enabled __has_feature(ptrauth_calls) +#else +# define __ptrauth_cxxabi_enabled 0 +#endif +#if __ptrauth_cxxabi_enabled // ptrauth_string_discriminator("__cxa_exception::actionRecord") == 0xFC91 # define __ptrauth_cxxabi_action_record __ptrauth(ptrauth_key_process_dependent_data, 1, 0xFC91) diff --git a/libcxxabi/src/cxa_personality.cpp b/libcxxabi/src/cxa_personality.cpp index b7eb0f23dbe06..b69b10de748ee 100644 --- a/libcxxabi/src/cxa_personality.cpp +++ b/libcxxabi/src/cxa_personality.cpp @@ -21,7 +21,7 @@ #include "cxa_handlers.h" #include "private_typeinfo.h" -#if __has_feature(ptrauth_calls) +#if __ptrauth_cxxabi_enabled // CXXABI depends on defintions in libunwind as pointer auth couples the // definitions @@ -602,7 +602,7 @@ set_registers(_Unwind_Exception* unwind_exception, _Unwind_Context* context, reinterpret_cast<uintptr_t>(unwind_exception)); _Unwind_SetGR(context, __builtin_eh_return_data_regno(1), static_cast<uintptr_t>(results.ttypeIndex)); -#if __has_feature(ptrauth_calls) +#if __ptrauth_cxxabi_enabled auto stackPointer = _Unwind_GetGR(context, UNW_REG_SP); // We manually re-sign the IP as the __ptrauth qualifiers cannot // express the required relationship with the destination address @@ -973,7 +973,7 @@ _UA_CLEANUP_PHASE using __cxa_catch_temp_type = decltype(__cxa_exception::catchTemp); static inline void set_landing_pad(scan_results& results, const __cxa_catch_temp_type& source) { -#if __has_feature(ptrauth_calls) +#if __ptrauth_cxxabi_enabled const uintptr_t sourceDiscriminator = ptrauth_blend_discriminator(&source, __ptrauth_cxxabi_catch_temp_disc); const uintptr_t targetDiscriminator = @@ -995,7 +995,7 @@ static inline void set_landing_pad(scan_results& results, static inline void get_landing_pad(__cxa_catch_temp_type &dest, const scan_results &results) { -#if __has_feature(ptrauth_calls) +#if __ptrauth_cxxabi_enabled const uintptr_t sourceDiscriminator = ptrauth_blend_discriminator(&results.landingPad, __ptrauth_scan_results_landingpad_disc); diff --git a/libunwind/include/__libunwind_config.h b/libunwind/include/__libunwind_config.h index 343934e885368..980d11ef5d4f2 100644 --- a/libunwind/include/__libunwind_config.h +++ b/libunwind/include/__libunwind_config.h @@ -212,11 +212,13 @@ # define _LIBUNWIND_HIGHEST_DWARF_REGISTER 287 #endif // _LIBUNWIND_IS_NATIVE_ONLY -#if __has_feature(ptrauth_calls) && __has_feature(ptrauth_returns) -# define _LIBUNWIND_TARGET_AARCH64_AUTHENTICATED_UNWINDING 1 -#elif __has_feature(ptrauth_calls) != __has_feature(ptrauth_returns) -# error "Either both or none of ptrauth_calls and ptrauth_returns "\ - "is allowed to be enabled" +#if defined(__has_feature) +# if __has_feature(ptrauth_calls) && __has_feature(ptrauth_returns) +# define _LIBUNWIND_TARGET_AARCH64_AUTHENTICATED_UNWINDING 1 +# elif __has_feature(ptrauth_calls) != __has_feature(ptrauth_returns) +# error "Either both or none of ptrauth_calls and ptrauth_returns "\ + "is allowed to be enabled" +# endif #endif #endif // ____LIBUNWIND_CONFIG_H__ diff --git a/libunwind/src/UnwindRegistersRestore.S b/libunwind/src/UnwindRegistersRestore.S index 1ab4c43b673b4..2d8322bea092d 100644 --- a/libunwind/src/UnwindRegistersRestore.S +++ b/libunwind/src/UnwindRegistersRestore.S @@ -634,6 +634,12 @@ Lnovec: #elif defined(__aarch64__) +#ifdef __has_feature +#define __has_ptrauth_calls __has_feature(ptrauth_calls) +#else +#define __has_ptrauth_calls 0 +#endif + #if defined(__ARM_FEATURE_GCS_DEFAULT) .arch_extension gcs #endif @@ -690,7 +696,7 @@ DEFINE_LIBUNWIND_FUNCTION(__libunwind_Registers_arm64_jumpto) ldr x16, [x0, #0x0F8] // load sp into scratch ldr lr, [x0, #0x100] // restore pc into lr -#if __has_feature(ptrauth_calls) +#if __has_ptrauth_calls // The LR is signed with its address inside the register state. Time // to resign to be a regular ROP protected signed pointer add x1, x0, #0x100 @@ -711,7 +717,7 @@ DEFINE_LIBUNWIND_FUNCTION(__libunwind_Registers_arm64_jumpto) Lnogcs: #endif -#if __has_feature(ptrauth_calls) +#if __has_ptrauth_calls retab #else ret x30 // jump to pc diff --git a/libunwind/src/UnwindRegistersSave.S b/libunwind/src/UnwindRegistersSave.S index 31a177f4a0df4..ce67306571816 100644 --- a/libunwind/src/UnwindRegistersSave.S +++ b/libunwind/src/UnwindRegistersSave.S @@ -763,6 +763,12 @@ LnoR2Fix: #elif defined(__aarch64__) +#ifdef __has_feature +#define __has_ptrauth_calls __has_feature(ptrauth_calls) +#else +#define __has_ptrauth_calls 0 +#endif + // // extern int __unw_getcontext(unw_context_t* thread_state) // @@ -772,7 +778,7 @@ LnoR2Fix: .p2align 2 DEFINE_LIBUNWIND_FUNCTION(__unw_getcontext) -#if __has_feature(ptrauth_calls) +#if __has_ptrauth_calls pacibsp #endif @@ -817,7 +823,7 @@ DEFINE_LIBUNWIND_FUNCTION(__unw_getcontext) #endif mov x0, #0 // return UNW_ESUCCESS -#if __has_feature(ptrauth_calls) +#if __has_ptrauth_calls retab #else ret _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
