Andrew Carlotti <andrew.carlo...@arm.com> writes: > The availability of tme intrinsics was previously gated at both > initialisation time (using global target options) and usage time > (accounting for function-specific target options). This patch removes > the check at initialisation time, and also moves the intrinsics out of > the header file to allow for better error messages (matching the > existing error messages for SVE intrinsics). > > gcc/ChangeLog: > > PR target/112108 > * config/aarch64/aarch64-builtins.cc (aarch64_init_tme_builtins): > (aarch64_general_init_builtins): Move tme initialisation... > (handle_arm_acle_h): ...to here, and remove feature check. > (aarch64_general_check_builtin_call): Check tme intrinsics. > (aarch64_expand_builtin_tme): Check feature availability. > * config/aarch64/arm_acle.h (__tstart, __tcommit, __tcancel) > (__ttest): Remove. > (_TMFAILURE_*): Define unconditionally. > > gcc/testsuite/ChangeLog: > > PR target/112108 > * gcc.target/aarch64/acle/tme_guard-1.c: New test. > * gcc.target/aarch64/acle/tme_guard-2.c: New test. > * gcc.target/aarch64/acle/tme_guard-3.c: New test. > * gcc.target/aarch64/acle/tme_guard-4.c: New test. > > > diff --git a/gcc/config/aarch64/aarch64-builtins.cc > b/gcc/config/aarch64/aarch64-builtins.cc > index > d0fb8bc1d1fedb382cba1a1f09a9c3ce6757ee22..f7d31d8c4308b4a883f8ce7df5c3ee319abbbb9c > 100644 > --- a/gcc/config/aarch64/aarch64-builtins.cc > +++ b/gcc/config/aarch64/aarch64-builtins.cc > @@ -1791,19 +1791,19 @@ aarch64_init_tme_builtins (void) > = build_function_type_list (void_type_node, uint64_type_node, NULL); > > aarch64_builtin_decls[AARCH64_TME_BUILTIN_TSTART] > - = aarch64_general_add_builtin ("__builtin_aarch64_tstart", > + = aarch64_general_simulate_builtin ("__tstart", > ftype_uint64_void, > AARCH64_TME_BUILTIN_TSTART); > aarch64_builtin_decls[AARCH64_TME_BUILTIN_TTEST] > - = aarch64_general_add_builtin ("__builtin_aarch64_ttest", > + = aarch64_general_simulate_builtin ("__ttest", > ftype_uint64_void, > AARCH64_TME_BUILTIN_TTEST); > aarch64_builtin_decls[AARCH64_TME_BUILTIN_TCOMMIT] > - = aarch64_general_add_builtin ("__builtin_aarch64_tcommit", > + = aarch64_general_simulate_builtin ("__tcommit", > ftype_void_void, > AARCH64_TME_BUILTIN_TCOMMIT); > aarch64_builtin_decls[AARCH64_TME_BUILTIN_TCANCEL] > - = aarch64_general_add_builtin ("__builtin_aarch64_tcancel", > + = aarch64_general_simulate_builtin ("__tcancel", > ftype_void_uint64, > AARCH64_TME_BUILTIN_TCANCEL);
Very minor, sorry, but could you reindent the arguments to match the new function name? > } > @@ -2068,6 +2068,7 @@ handle_arm_acle_h (void) > { > if (TARGET_LS64) > aarch64_init_ls64_builtins (); > + aarch64_init_tme_builtins (); > } > > /* Initialize fpsr fpcr getters and setters. */ > @@ -2160,9 +2161,6 @@ aarch64_general_init_builtins (void) > if (!TARGET_ILP32) > aarch64_init_pauth_hint_builtins (); > > - if (TARGET_TME) > - aarch64_init_tme_builtins (); > - > if (TARGET_MEMTAG) > aarch64_init_memtag_builtins (); > > @@ -2289,6 +2287,7 @@ aarch64_general_check_builtin_call (location_t > location, vec<location_t>, > unsigned int code, tree fndecl, > unsigned int nargs ATTRIBUTE_UNUSED, tree *args) > { > + tree decl = aarch64_builtin_decls[code]; > switch (code) > { > case AARCH64_RSR: > @@ -2301,15 +2300,28 @@ aarch64_general_check_builtin_call (location_t > location, vec<location_t>, > case AARCH64_WSR64: > case AARCH64_WSRF: > case AARCH64_WSRF64: > - tree addr = STRIP_NOPS (args[0]); > - if (TREE_CODE (TREE_TYPE (addr)) != POINTER_TYPE > - || TREE_CODE (addr) != ADDR_EXPR > - || TREE_CODE (TREE_OPERAND (addr, 0)) != STRING_CST) > - { > - error_at (location, "first argument to %qD must be a string literal", > - fndecl); > - return false; > - } > + { > + tree addr = STRIP_NOPS (args[0]); > + if (TREE_CODE (TREE_TYPE (addr)) != POINTER_TYPE > + || TREE_CODE (addr) != ADDR_EXPR > + || TREE_CODE (TREE_OPERAND (addr, 0)) != STRING_CST) > + { > + error_at (location, "first argument to %qD must be a string > literal", > + fndecl); > + return false; > + } > + break; > + } > + > + case AARCH64_TME_BUILTIN_TSTART: > + case AARCH64_TME_BUILTIN_TCOMMIT: > + case AARCH64_TME_BUILTIN_TTEST: > + case AARCH64_TME_BUILTIN_TCANCEL: > + return aarch64_check_required_extensions (location, decl, > + AARCH64_FL_TME, false); > + > + default: > + break; > } > /* Default behavior. */ > return true; > @@ -2734,6 +2746,11 @@ aarch64_expand_fcmla_builtin (tree exp, rtx target, > int fcode) > static rtx > aarch64_expand_builtin_tme (int fcode, tree exp, rtx target) > { > + tree fndecl = aarch64_builtin_decls[fcode]; > + if (!aarch64_check_required_extensions (EXPR_LOCATION (exp), fndecl, > + AARCH64_FL_TME, false)) > + return target; > + Does this ever trigger? The SVE code also checks during expansion, but I think that's because of the manual overload resolution. Perhaps I misremember though... LGTM otherwise, but please leave 24 hours for others to comment. Thanks, Richard > switch (fcode) > { > case AARCH64_TME_BUILTIN_TSTART: > diff --git a/gcc/config/aarch64/arm_acle.h b/gcc/config/aarch64/arm_acle.h > index > 2aa681090fa205449cf1ac63151565f960716189..2d84ab1bd3f3241196727d7a632a155014708081 > 100644 > --- a/gcc/config/aarch64/arm_acle.h > +++ b/gcc/config/aarch64/arm_acle.h > @@ -252,10 +252,7 @@ __crc32d (uint32_t __a, uint64_t __b) > > #pragma GCC pop_options > > -#ifdef __ARM_FEATURE_TME > -#pragma GCC push_options > -#pragma GCC target ("+nothing+tme") > - > +/* Constants for TME failure reason. */ > #define _TMFAILURE_REASON 0x00007fffu > #define _TMFAILURE_RTRY 0x00008000u > #define _TMFAILURE_CNCL 0x00010000u > @@ -268,37 +265,6 @@ __crc32d (uint32_t __a, uint64_t __b) > #define _TMFAILURE_INT 0x00800000u > #define _TMFAILURE_TRIVIAL 0x01000000u > > -__extension__ extern __inline uint64_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__tstart (void) > -{ > - return __builtin_aarch64_tstart (); > -} > - > -__extension__ extern __inline void > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__tcommit (void) > -{ > - __builtin_aarch64_tcommit (); > -} > - > -__extension__ extern __inline void > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__tcancel (const uint64_t __reason) > -{ > - __builtin_aarch64_tcancel (__reason); > -} > - > -__extension__ extern __inline uint64_t > -__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) > -__ttest (void) > -{ > - return __builtin_aarch64_ttest (); > -} > - > -#pragma GCC pop_options > -#endif > - > #ifdef __ARM_FEATURE_LS64 > typedef __arm_data512_t data512_t; > #endif > diff --git a/gcc/testsuite/gcc.target/aarch64/acle/tme_guard-1.c > b/gcc/testsuite/gcc.target/aarch64/acle/tme_guard-1.c > new file mode 100644 > index > 0000000000000000000000000000000000000000..9894d3341f6bc352c22ad95d4d1e000207ca8d00 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/acle/tme_guard-1.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > +/* { dg-additional-options "-march=armv8-a" } */ > + > +#include <arm_acle.h> > + > +void foo (void) > +{ > + __tcommit (); /* { dg-error {ACLE function '__tcommit' requires ISA > extension 'tme'} } */ > +} > diff --git a/gcc/testsuite/gcc.target/aarch64/acle/tme_guard-2.c > b/gcc/testsuite/gcc.target/aarch64/acle/tme_guard-2.c > new file mode 100644 > index > 0000000000000000000000000000000000000000..4e3d69712b14a8123f45a2ead02b5048883614d9 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/acle/tme_guard-2.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { dg-additional-options "-march=armv8-a" } */ > + > +#include <arm_acle.h> > + > +#pragma GCC target("arch=armv8-a+tme") > +void foo (void) > +{ > + __tcommit (); > +} > diff --git a/gcc/testsuite/gcc.target/aarch64/acle/tme_guard-3.c > b/gcc/testsuite/gcc.target/aarch64/acle/tme_guard-3.c > new file mode 100644 > index > 0000000000000000000000000000000000000000..5f480ebb8209fdaeb4baa77dbdf5467d16936644 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/acle/tme_guard-3.c > @@ -0,0 +1,9 @@ > +/* { dg-do compile } */ > +/* { dg-additional-options "-march=armv8-a+tme -mgeneral-regs-only" } */ > + > +#include <arm_acle.h> > + > +void foo (void) > +{ > + __tcommit (); > +} > diff --git a/gcc/testsuite/gcc.target/aarch64/acle/tme_guard-4.c > b/gcc/testsuite/gcc.target/aarch64/acle/tme_guard-4.c > new file mode 100644 > index > 0000000000000000000000000000000000000000..bf4d368370c614ffe33035d9ec4f86988f3f1c30 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/aarch64/acle/tme_guard-4.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { dg-additional-options "-march=armv8-a+tme" } */ > + > +#include <arm_acle.h> > + > +#pragma GCC target("arch=armv8-a") > +void foo (void) > +{ > + __tcommit (); /* { dg-error {ACLE function '__tcommit' requires ISA > extension 'tme'} } */ > +}