From c05b3088b47fcdcf2a75fdc2bc3047556f8b961e Mon Sep 17 00:00:00 2001 From: Steffen Jaeckel Date: Mon, 4 May 2026 10:03:16 +0200 Subject: [PATCH] Use `__has_attribute()` for `target` attribute. ... and bring aarch64/PMULL in similar shape as x86/PCLMUL. Signed-off-by: Steffen Jaeckel --- helper.pl | 1 + src/encauth/gcm/gcm_gf_mult.c | 5 ++++- src/headers/tomcrypt_cfg.h | 23 +++++++++++++++-------- src/misc/crypt/crypt.c | 3 +++ 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/helper.pl b/helper.pl index 8a8824a1..3dcafcaf 100755 --- a/helper.pl +++ b/helper.pl @@ -71,6 +71,7 @@ sub check_source { my $n = $1; push @{$troubles->{invalid_macro_name}}, "$lineno($n)" unless ($file eq 'src/headers/tomcrypt_cfg.h' && $n eq '__has_builtin') || + ($file eq 'src/headers/tomcrypt_cfg.h' && $n eq '__has_attribute') || ($file eq 'src/headers/tomcrypt_cfg.h' && $n eq '_WIN32_WINNT') || ($file eq 'src/prngs/rng_get_bytes.c' && $n eq '_WIN32_WINNT'); } diff --git a/src/encauth/gcm/gcm_gf_mult.c b/src/encauth/gcm/gcm_gf_mult.c index 778ce2da..0568d6ea 100644 --- a/src/encauth/gcm/gcm_gf_mult.c +++ b/src/encauth/gcm/gcm_gf_mult.c @@ -10,7 +10,7 @@ #if defined(LTC_GCM_MODE) || defined(LTC_LRW_MODE) #if defined(LTC_GCM_PCLMUL) -#define LTC_GCM_PCLMUL_TARGET LTC_ATTRIBUTE((__target__("pclmul,ssse3"))) +#define LTC_GCM_PCLMUL_TARGET LTC_TARGET("pclmul,ssse3") #if defined(__GNUC__) #pragma GCC diagnostic push @@ -135,6 +135,9 @@ static void s_gcm_gf_mult_pclmul(const unsigned char *a, const unsigned char *b, #endif /* defined(LTC_GCM_PCLMUL) */ #if defined(LTC_GCM_PMULL) + +#define LTC_GCM_PMULL_TARGET LTC_TARGET("+crypto") + #if defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wbad-function-cast" diff --git a/src/headers/tomcrypt_cfg.h b/src/headers/tomcrypt_cfg.h index ebac5ac4..14b81d87 100644 --- a/src/headers/tomcrypt_cfg.h +++ b/src/headers/tomcrypt_cfg.h @@ -339,6 +339,14 @@ typedef unsigned long ltc_mp_digit; #endif #endif +#if defined(__aarch64__) || defined(_M_ARM64) + #define LTC_ARCH_AARCH64 + #if !defined(LTC_NO_GCM_PMULL) + #define LTC_GCM_PMULL + #undef LTC_GCM_TABLES + #endif +#endif + #if defined(__GNUC__) #define LTC_ALIGN_MSVC(n) #define LTC_ALIGN(n) __attribute__((aligned(n))) @@ -395,21 +403,20 @@ typedef unsigned long ltc_mp_digit; #endif #endif +#ifndef __has_attribute +# define __has_attribute(x) 0 +#endif #if defined(__GNUC__) || defined(__clang__) # define LTC_ATTRIBUTE(x) __attribute__(x) #else # define LTC_ATTRIBUTE(x) #endif -#if !defined(LTC_NO_GCM_PMULL) && (defined(__aarch64__) || defined(_M_ARM64)) -#define LTC_GCM_PMULL -#undef LTC_GCM_TABLES +#if __has_attribute(target) +# define LTC_TARGET(x) LTC_ATTRIBUTE((target(x))) #endif - -#if defined(LTC_GCM_PMULL) && (defined(__clang__) || defined(__GNUC__)) -#define LTC_GCM_PMULL_TARGET __attribute__((target("+crypto"))) -#else -#define LTC_GCM_PMULL_TARGET +#ifndef LTC_TARGET +# define LTC_TARGET(x) #endif #endif /* TOMCRYPT_CFG_H */ diff --git a/src/misc/crypt/crypt.c b/src/misc/crypt/crypt.c index d5583b22..a670d69b 100644 --- a/src/misc/crypt/crypt.c +++ b/src/misc/crypt/crypt.c @@ -438,6 +438,9 @@ const char *crypt_build_settings = #if defined(LTC_ARCH_X86) " LTC_ARCH_X86\n" #endif +#if defined(LTC_ARCH_AARCH64) + " LTC_ARCH_AARCH64\n" +#endif "\nVarious others: " #if defined(ARGTYPE)