diff --git a/gcc/config/aarch64/aarch64-builtins.cc b/gcc/config/aarch64/aarch64-builtins.cc index a07adcee6e266c947855041ed7432085f6448836..60e4c217921bc1144bfa436a168a4a1dc194f44e 100644 --- a/gcc/config/aarch64/aarch64-builtins.cc +++ b/gcc/config/aarch64/aarch64-builtins.cc @@ -1791,21 +1791,17 @@ 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", - ftype_uint64_void, - AARCH64_TME_BUILTIN_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", - ftype_uint64_void, - AARCH64_TME_BUILTIN_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", - ftype_void_void, - AARCH64_TME_BUILTIN_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", - ftype_void_uint64, - AARCH64_TME_BUILTIN_TCANCEL); + = aarch64_general_simulate_builtin ("__tcancel", ftype_void_uint64, + AARCH64_TME_BUILTIN_TCANCEL); } /* Add builtins for Random Number instructions. */ @@ -2068,6 +2064,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 +2157,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 (); @@ -2285,6 +2279,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: @@ -2297,15 +2292,29 @@ 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); + + default: + break; } /* Default behavior. */ return true; 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'} } */ +}