On Dec 3, 2020, Christophe Lyon <christophe.l...@linaro.org> wrote: > This patches causes a lot of regressions in fortran on arm and aarch64,
On Dec 3, 2020, Andreas Schwab <sch...@linux-m68k.org> wrote: > On Dez 03 2020, Andreas Schwab wrote: >> ../../../../libffi/src/aarch64/ffi.c: In function 'ffi_prep_closure_loc': >> ../../../../libffi/src/aarch64/ffi.c:67:3: error: both arguments to >> '__builtin___clear_cache' must be pointers >> 67 | __builtin___clear_cache (start, end); >> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > This happens when compiling with -mabi=ilp32. Thank you both. Here's the patch I'm testing to fix both issues. Ok to install? fix __builtin___clear_cache overrider fallout From: Alexandre Oliva <ol...@adacore.com> 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 | 3 ++- gcc/tree.c | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/gcc/builtins.c b/gcc/builtins.c index ecc12e69c1466..cd30de8bfb035 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -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; diff --git a/gcc/tree.c b/gcc/tree.c index 52a145dd01819..72311005f57b2 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -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", -- Alexandre Oliva, happy hacker https://FSFLA.org/blogs/lxo/ Free Software Activist GNU Toolchain Engineer Vim, Vi, Voltei pro Emacs -- GNUlius Caesar