fix __builtin___clear_cache overrider fallout
authorAlexandre Oliva <oliva@adacore.com>
Thu, 3 Dec 2020 19:20:28 +0000 (16:20 -0300)
committerAlexandre Oliva <oliva@gnu.org>
Thu, 3 Dec 2020 19:20:28 +0000 (16:20 -0300)
Machines that had CLEAR_CACHE_INSN and that would thus issue calls to
__clear_cache with the default call expander, would fail on languages
that did not set up the __clear_cache builtin.  This patch arranges
for all languages to set up this builtin.

Machines or multilibs that had ptr_mode != Pmode, such as aarch64 with
-mabi=ilp32, would fail the RTL mode test of the arguments passed to
__clear_cache, because we'd insist on ptr_mode.  This patch arranges
for Pmode to be accepted as well.

for  gcc/ChangeLog

* tree.c (build_common_builtin_nodes): Declare
__builtin___clear_cache for all languages.
* builtins.c (maybe_emit_call_builtin___clear_cache): Accept
Pmode arguments.

gcc/builtins.c
gcc/tree.c

index ecc12e69c14661d9ac3a74c2c9b48615d829cda4..cd30de8bfb035c24eac51159e0512816baee7ec6 100644 (file)
@@ -7793,7 +7793,8 @@ default_emit_call_builtin___clear_cache (rtx begin, rtx end)
 void
 maybe_emit_call_builtin___clear_cache (rtx begin, rtx end)
 {
-  if (GET_MODE (begin) != ptr_mode || GET_MODE (end) != ptr_mode)
+  if ((GET_MODE (begin) != ptr_mode && GET_MODE (begin) != Pmode)
+      || (GET_MODE (end) != ptr_mode && GET_MODE (end) != Pmode))
     {
       error ("both arguments to %<__builtin___clear_cache%> must be pointers");
       return;
index 52a145dd01819e4263c76de7b6c5b6e95d4c7273..72311005f57b2f0ec8b0233c178456114eac339f 100644 (file)
@@ -10733,6 +10733,12 @@ build_common_builtin_nodes (void)
 
   ftype = build_function_type_list (void_type_node,
                                    ptr_type_node, ptr_type_node, NULL_TREE);
+  if (!builtin_decl_explicit_p (BUILT_IN_CLEAR_CACHE))
+    local_define_builtin ("__builtin___clear_cache", ftype,
+                         BUILT_IN_CLEAR_CACHE,
+                         "__builtin___clear_cache",
+                         ECF_NOTHROW);
+
   local_define_builtin ("__builtin_nonlocal_goto", ftype,
                        BUILT_IN_NONLOCAL_GOTO,
                        "__builtin_nonlocal_goto",