Bootstrapped & regression-tested on x86_64-linux-gnu and aarch64-linux-gnu. Also tested via config-list.mk. Committed as preapproved.
Thanks, Richard gcc/ * target-insns.def (clear_cache): New targetm instruction pattern. * builtins.c (expand_builtin___clear_cache): Use it instead of HAVE_*/gen_* interface. Index: gcc/target-insns.def =================================================================== --- gcc/target-insns.def 2015-07-05 08:58:38.390530076 +0100 +++ gcc/target-insns.def 2015-07-05 08:58:38.386530121 +0100 @@ -37,6 +37,7 @@ DEF_TARGET_INSN (builtin_setjmp_setup, ( DEF_TARGET_INSN (canonicalize_funcptr_for_compare, (rtx x0, rtx x1)) DEF_TARGET_INSN (casesi, (rtx x0, rtx x1, rtx x2, rtx x3, rtx x4)) DEF_TARGET_INSN (check_stack, (rtx x0)) +DEF_TARGET_INSN (clear_cache, (rtx x0, rtx x1)) DEF_TARGET_INSN (epilogue, (void)) DEF_TARGET_INSN (exception_receiver, (void)) DEF_TARGET_INSN (jump, (rtx x0)) Index: gcc/builtins.c =================================================================== --- gcc/builtins.c 2015-07-05 08:58:38.390530076 +0100 +++ gcc/builtins.c 2015-07-05 08:58:38.382530166 +0100 @@ -4807,20 +4807,22 @@ expand_builtin_copysign (tree exp, rtx t /* Expand a call to __builtin___clear_cache. */ static rtx -expand_builtin___clear_cache (tree exp ATTRIBUTE_UNUSED) +expand_builtin___clear_cache (tree exp) { -#ifndef HAVE_clear_cache + if (!targetm.code_for_clear_cache) + { #ifdef CLEAR_INSN_CACHE - /* There is no "clear_cache" insn, and __clear_cache() in libgcc - does something. Just do the default expansion to a call to - __clear_cache(). */ - return NULL_RTX; + /* There is no "clear_cache" insn, and __clear_cache() in libgcc + does something. Just do the default expansion to a call to + __clear_cache(). */ + return NULL_RTX; #else - /* There is no "clear_cache" insn, and __clear_cache() in libgcc - does nothing. There is no need to call it. Do nothing. */ - return const0_rtx; + /* There is no "clear_cache" insn, and __clear_cache() in libgcc + does nothing. There is no need to call it. Do nothing. */ + return const0_rtx; #endif /* CLEAR_INSN_CACHE */ -#else + } + /* We have a "clear_cache" insn, and it will handle everything. */ tree begin, end; rtx begin_rtx, end_rtx; @@ -4834,7 +4836,7 @@ expand_builtin___clear_cache (tree exp A return const0_rtx; } - if (HAVE_clear_cache) + if (targetm.have_clear_cache ()) { struct expand_operand ops[2]; @@ -4846,11 +4848,10 @@ expand_builtin___clear_cache (tree exp A create_address_operand (&ops[0], begin_rtx); create_address_operand (&ops[1], end_rtx); - if (maybe_expand_insn (CODE_FOR_clear_cache, 2, ops)) + if (maybe_expand_insn (targetm.code_for_clear_cache, 2, ops)) return const0_rtx; } return const0_rtx; -#endif /* HAVE_clear_cache */ } /* Given a trampoline address, make sure it satisfies TRAMPOLINE_ALIGNMENT. */