@@ -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;
@@ -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
new file mode 100644
@@ -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'} } */
+}
new file mode 100644
@@ -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 ();
+}
new file mode 100644
@@ -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 ();
+}
new file mode 100644
@@ -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'} } */
+}