aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2019-08-13 21:35:20 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2019-08-13 21:35:20 +0000
commit4d732405bd91b54c196fdc38191f838bb01f23a6 (patch)
treeb29b63d06b3fd1651a8d6cccc8ad3aa409d5ddd3 /gcc
parentcb1180d547e3b28547134a06ee020163afa59cc3 (diff)
downloadgcc-4d732405bd91b54c196fdc38191f838bb01f23a6.zip
gcc-4d732405bd91b54c196fdc38191f838bb01f23a6.tar.gz
gcc-4d732405bd91b54c196fdc38191f838bb01f23a6.tar.bz2
Use checking forms of DECL_FUNCTION_CODE (PR 91421)
We were shoe-horning all built-in enumerations (including frontend and target-specific ones) into a field of type built_in_function. This was accessed as either an lvalue or an rvalue using DECL_FUNCTION_CODE. The obvious danger with this (as was noted by several ??? comments) is that the ranges have nothing to do with each other, and targets can easily have more built-in functions than generic code. But my patch to make the field bigger was the straw that finally made the problem visible. This patch therefore: - replaces the field with a plain unsigned int - turns DECL_FUNCTION_CODE into an rvalue-only accessor that checks that the function really is BUILT_IN_NORMAL - adds corresponding DECL_MD_FUNCTION_CODE and DECL_FE_FUNCTION_CODE accessors for BUILT_IN_MD and BUILT_IN_FRONTEND respectively - adds DECL_UNCHECKED_FUNCTION_CODE for places that need to access the underlying field (should be low-level code only) - adds new helpers for setting the built-in class and function code - makes DECL_BUILT_IN_CLASS an rvalue-only accessor too, since all assignments should go through the new helpers 2019-08-13 Richard Sandiford <richard.sandiford@arm.com> gcc/ PR middle-end/91421 * tree-core.h (function_decl::function_code): Change type to unsigned int. * tree.h (DECL_FUNCTION_CODE): Rename old definition to... (DECL_UNCHECKED_FUNCTION_CODE): ...this. (DECL_BUILT_IN_CLASS): Make an rvalue macro only. (DECL_FUNCTION_CODE): New function. Assert that the built-in class is BUILT_IN_NORMAL. (DECL_MD_FUNCTION_CODE, DECL_FE_FUNCTION_CODE): New functions. (set_decl_built_in_function, copy_decl_built_in_function): Likewise. (fndecl_built_in_p): Change the type of the "name" argument to unsigned int. * builtins.c (expand_builtin): Move DECL_FUNCTION_CODE use after check for DECL_BUILT_IN_CLASS. * cgraphclones.c (build_function_decl_skip_args): Use set_decl_built_in_function. * ipa-param-manipulation.c (ipa_modify_formal_parameters): Likewise. * ipa-split.c (split_function): Likewise. * langhooks.c (add_builtin_function_common): Likewise. * omp-simd-clone.c (simd_clone_create): Likewise. * tree-streamer-in.c (unpack_ts_function_decl_value_fields): Likewise. * config/darwin.c (darwin_init_cfstring_builtins): Likewise. (darwin_fold_builtin): Use DECL_MD_FUNCTION_CODE instead of DECL_FUNCTION_CODE. * fold-const.c (operand_equal_p): Compare DECL_UNCHECKED_FUNCTION_CODE instead of DECL_FUNCTION_CODE. * lto-streamer-out.c (hash_tree): Use DECL_UNCHECKED_FUNCTION_CODE instead of DECL_FUNCTION_CODE. * tree-streamer-out.c (pack_ts_function_decl_value_fields): Likewise. * print-tree.c (print_node): Use DECL_MD_FUNCTION_CODE when printing DECL_BUILT_IN_MD. Handle DECL_BUILT_IN_FRONTEND. * config/aarch64/aarch64-builtins.c (aarch64_expand_builtin) (aarch64_fold_builtin, aarch64_gimple_fold_builtin): Use DECL_MD_FUNCTION_CODE instead of DECL_FUNCTION_CODE. * config/aarch64/aarch64.c (aarch64_builtin_reciprocal): Likewise. * config/alpha/alpha.c (alpha_expand_builtin, alpha_fold_builtin): (alpha_gimple_fold_builtin): Likewise. * config/arc/arc.c (arc_expand_builtin): Likewise. * config/arm/arm-builtins.c (arm_expand_builtin): Likewise. * config/avr/avr-c.c (avr_resolve_overloaded_builtin): Likewise. * config/avr/avr.c (avr_expand_builtin, avr_fold_builtin): Likewise. * config/bfin/bfin.c (bfin_expand_builtin): Likewise. * config/c6x/c6x.c (c6x_expand_builtin): Likewise. * config/frv/frv.c (frv_expand_builtin): Likewise. * config/gcn/gcn.c (gcn_expand_builtin_1): Likewise. (gcn_expand_builtin): Likewise. * config/i386/i386-builtins.c (ix86_builtin_reciprocal): Likewise. (fold_builtin_cpu): Likewise. * config/i386/i386-expand.c (ix86_expand_builtin): Likewise. * config/i386/i386.c (ix86_fold_builtin): Likewise. (ix86_gimple_fold_builtin): Likewise. * config/ia64/ia64.c (ia64_fold_builtin): Likewise. (ia64_expand_builtin): Likewise. * config/iq2000/iq2000.c (iq2000_expand_builtin): Likewise. * config/mips/mips.c (mips_expand_builtin): Likewise. * config/msp430/msp430.c (msp430_expand_builtin): Likewise. * config/nds32/nds32-intrinsic.c (nds32_expand_builtin_impl): Likewise. * config/nios2/nios2.c (nios2_expand_builtin): Likewise. * config/nvptx/nvptx.c (nvptx_expand_builtin): Likewise. * config/pa/pa.c (pa_expand_builtin): Likewise. * config/pru/pru.c (pru_expand_builtin): Likewise. * config/riscv/riscv-builtins.c (riscv_expand_builtin): Likewise. * config/rs6000/rs6000-c.c (altivec_resolve_overloaded_builtin): Likewise. * config/rs6000/rs6000-call.c (htm_expand_builtin): Likewise. (altivec_expand_dst_builtin, altivec_expand_builtin): Likewise. (rs6000_gimple_fold_builtin, rs6000_expand_builtin): Likewise. * config/rs6000/rs6000.c (rs6000_builtin_md_vectorized_function) (rs6000_builtin_reciprocal): Likewise. * config/rx/rx.c (rx_expand_builtin): Likewise. * config/s390/s390-c.c (s390_resolve_overloaded_builtin): Likewise. * config/s390/s390.c (s390_expand_builtin): Likewise. * config/sh/sh.c (sh_expand_builtin): Likewise. * config/sparc/sparc.c (sparc_expand_builtin): Likewise. (sparc_fold_builtin): Likewise. * config/spu/spu-c.c (spu_resolve_overloaded_builtin): Likewise. * config/spu/spu.c (spu_expand_builtin): Likewise. * config/stormy16/stormy16.c (xstormy16_expand_builtin): Likewise. * config/tilegx/tilegx.c (tilegx_expand_builtin): Likewise. * config/tilepro/tilepro.c (tilepro_expand_builtin): Likewise. * config/xtensa/xtensa.c (xtensa_fold_builtin): Likewise. (xtensa_expand_builtin): Likewise. gcc/ada/ PR middle-end/91421 * gcc-interface/trans.c (gigi): Call set_decl_buillt_in_function. (Call_to_gnu): Use DECL_FE_FUNCTION_CODE instead of DECL_FUNCTION_CODE. gcc/c/ PR middle-end/91421 * c-decl.c (merge_decls): Use copy_decl_built_in_function. gcc/c-family/ PR middle-end/91421 * c-common.c (resolve_overloaded_builtin): Use copy_decl_built_in_function. gcc/cp/ PR middle-end/91421 * decl.c (duplicate_decls): Use copy_decl_built_in_function. * pt.c (declare_integer_pack): Use set_decl_built_in_function. gcc/d/ PR middle-end/91421 * intrinsics.cc (maybe_set_intrinsic): Use set_decl_built_in_function. gcc/jit/ PR middle-end/91421 * jit-playback.c (new_function): Use set_decl_built_in_function. gcc/lto/ PR middle-end/91421 * lto-common.c (compare_tree_sccs_1): Use DECL_UNCHECKED_FUNCTION_CODE instead of DECL_FUNCTION_CODE. * lto-symtab.c (lto_symtab_merge_p): Likewise. From-SVN: r274404
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog85
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/gcc-interface/trans.c9
-rw-r--r--gcc/builtins.c2
-rw-r--r--gcc/c-family/ChangeLog6
-rw-r--r--gcc/c-family/c-common.c3
-rw-r--r--gcc/c/ChangeLog5
-rw-r--r--gcc/c/c-decl.c3
-rw-r--r--gcc/cgraphclones.c5
-rw-r--r--gcc/config/aarch64/aarch64-builtins.c6
-rw-r--r--gcc/config/aarch64/aarch64.c2
-rw-r--r--gcc/config/alpha/alpha.c6
-rw-r--r--gcc/config/arc/arc.c2
-rw-r--r--gcc/config/arm/arm-builtins.c2
-rw-r--r--gcc/config/avr/avr-c.c2
-rw-r--r--gcc/config/avr/avr.c4
-rw-r--r--gcc/config/bfin/bfin.c2
-rw-r--r--gcc/config/c6x/c6x.c2
-rw-r--r--gcc/config/darwin.c5
-rw-r--r--gcc/config/frv/frv.c2
-rw-r--r--gcc/config/gcn/gcn.c4
-rw-r--r--gcc/config/i386/i386-builtins.c6
-rw-r--r--gcc/config/i386/i386-expand.c4
-rw-r--r--gcc/config/i386/i386.c7
-rw-r--r--gcc/config/ia64/ia64.c6
-rw-r--r--gcc/config/iq2000/iq2000.c2
-rw-r--r--gcc/config/mips/mips.c2
-rw-r--r--gcc/config/msp430/msp430.c2
-rw-r--r--gcc/config/nds32/nds32-intrinsic.c2
-rw-r--r--gcc/config/nios2/nios2.c2
-rw-r--r--gcc/config/nvptx/nvptx.c2
-rw-r--r--gcc/config/pa/pa.c2
-rw-r--r--gcc/config/pru/pru.c2
-rw-r--r--gcc/config/riscv/riscv-builtins.c2
-rw-r--r--gcc/config/rs6000/rs6000-c.c2
-rw-r--r--gcc/config/rs6000/rs6000-call.c12
-rw-r--r--gcc/config/rs6000/rs6000.c4
-rw-r--r--gcc/config/rx/rx.c2
-rw-r--r--gcc/config/s390/s390-c.c2
-rw-r--r--gcc/config/s390/s390.c2
-rw-r--r--gcc/config/sh/sh.c2
-rw-r--r--gcc/config/sparc/sparc.c6
-rw-r--r--gcc/config/spu/spu-c.c2
-rw-r--r--gcc/config/spu/spu.c2
-rw-r--r--gcc/config/stormy16/stormy16.c2
-rw-r--r--gcc/config/tilegx/tilegx.c2
-rw-r--r--gcc/config/tilepro/tilepro.c2
-rw-r--r--gcc/config/xtensa/xtensa.c4
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl.c3
-rw-r--r--gcc/cp/pt.c5
-rw-r--r--gcc/d/ChangeLog5
-rw-r--r--gcc/d/intrinsics.cc5
-rw-r--r--gcc/fold-const.c3
-rw-r--r--gcc/ipa-param-manipulation.c5
-rw-r--r--gcc/ipa-split.c5
-rw-r--r--gcc/jit/ChangeLog5
-rw-r--r--gcc/jit/jit-playback.c5
-rw-r--r--gcc/langhooks.c6
-rw-r--r--gcc/lto-streamer-out.c2
-rw-r--r--gcc/lto/ChangeLog7
-rw-r--r--gcc/lto/lto-common.c2
-rw-r--r--gcc/lto/lto-symtab.c3
-rw-r--r--gcc/omp-simd-clone.c3
-rw-r--r--gcc/print-tree.c6
-rw-r--r--gcc/tree-core.h5
-rw-r--r--gcc/tree-streamer-in.c17
-rw-r--r--gcc/tree-streamer-out.c2
-rw-r--r--gcc/tree.h71
69 files changed, 293 insertions, 128 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 272d084..989431d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,6 +1,91 @@
2019-08-13 Richard Sandiford <richard.sandiford@arm.com>
PR middle-end/91421
+ * tree-core.h (function_decl::function_code): Change type to
+ unsigned int.
+ * tree.h (DECL_FUNCTION_CODE): Rename old definition to...
+ (DECL_UNCHECKED_FUNCTION_CODE): ...this.
+ (DECL_BUILT_IN_CLASS): Make an rvalue macro only.
+ (DECL_FUNCTION_CODE): New function. Assert that the built-in class
+ is BUILT_IN_NORMAL.
+ (DECL_MD_FUNCTION_CODE, DECL_FE_FUNCTION_CODE): New functions.
+ (set_decl_built_in_function, copy_decl_built_in_function): Likewise.
+ (fndecl_built_in_p): Change the type of the "name" argument to
+ unsigned int.
+ * builtins.c (expand_builtin): Move DECL_FUNCTION_CODE use
+ after check for DECL_BUILT_IN_CLASS.
+ * cgraphclones.c (build_function_decl_skip_args): Use
+ set_decl_built_in_function.
+ * ipa-param-manipulation.c (ipa_modify_formal_parameters): Likewise.
+ * ipa-split.c (split_function): Likewise.
+ * langhooks.c (add_builtin_function_common): Likewise.
+ * omp-simd-clone.c (simd_clone_create): Likewise.
+ * tree-streamer-in.c (unpack_ts_function_decl_value_fields): Likewise.
+ * config/darwin.c (darwin_init_cfstring_builtins): Likewise.
+ (darwin_fold_builtin): Use DECL_MD_FUNCTION_CODE instead of
+ DECL_FUNCTION_CODE.
+ * fold-const.c (operand_equal_p): Compare DECL_UNCHECKED_FUNCTION_CODE
+ instead of DECL_FUNCTION_CODE.
+ * lto-streamer-out.c (hash_tree): Use DECL_UNCHECKED_FUNCTION_CODE
+ instead of DECL_FUNCTION_CODE.
+ * tree-streamer-out.c (pack_ts_function_decl_value_fields): Likewise.
+ * print-tree.c (print_node): Use DECL_MD_FUNCTION_CODE when
+ printing DECL_BUILT_IN_MD. Handle DECL_BUILT_IN_FRONTEND.
+ * config/aarch64/aarch64-builtins.c (aarch64_expand_builtin)
+ (aarch64_fold_builtin, aarch64_gimple_fold_builtin): Use
+ DECL_MD_FUNCTION_CODE instead of DECL_FUNCTION_CODE.
+ * config/aarch64/aarch64.c (aarch64_builtin_reciprocal): Likewise.
+ * config/alpha/alpha.c (alpha_expand_builtin, alpha_fold_builtin):
+ (alpha_gimple_fold_builtin): Likewise.
+ * config/arc/arc.c (arc_expand_builtin): Likewise.
+ * config/arm/arm-builtins.c (arm_expand_builtin): Likewise.
+ * config/avr/avr-c.c (avr_resolve_overloaded_builtin): Likewise.
+ * config/avr/avr.c (avr_expand_builtin, avr_fold_builtin): Likewise.
+ * config/bfin/bfin.c (bfin_expand_builtin): Likewise.
+ * config/c6x/c6x.c (c6x_expand_builtin): Likewise.
+ * config/frv/frv.c (frv_expand_builtin): Likewise.
+ * config/gcn/gcn.c (gcn_expand_builtin_1): Likewise.
+ (gcn_expand_builtin): Likewise.
+ * config/i386/i386-builtins.c (ix86_builtin_reciprocal): Likewise.
+ (fold_builtin_cpu): Likewise.
+ * config/i386/i386-expand.c (ix86_expand_builtin): Likewise.
+ * config/i386/i386.c (ix86_fold_builtin): Likewise.
+ (ix86_gimple_fold_builtin): Likewise.
+ * config/ia64/ia64.c (ia64_fold_builtin): Likewise.
+ (ia64_expand_builtin): Likewise.
+ * config/iq2000/iq2000.c (iq2000_expand_builtin): Likewise.
+ * config/mips/mips.c (mips_expand_builtin): Likewise.
+ * config/msp430/msp430.c (msp430_expand_builtin): Likewise.
+ * config/nds32/nds32-intrinsic.c (nds32_expand_builtin_impl): Likewise.
+ * config/nios2/nios2.c (nios2_expand_builtin): Likewise.
+ * config/nvptx/nvptx.c (nvptx_expand_builtin): Likewise.
+ * config/pa/pa.c (pa_expand_builtin): Likewise.
+ * config/pru/pru.c (pru_expand_builtin): Likewise.
+ * config/riscv/riscv-builtins.c (riscv_expand_builtin): Likewise.
+ * config/rs6000/rs6000-c.c (altivec_resolve_overloaded_builtin):
+ Likewise.
+ * config/rs6000/rs6000-call.c (htm_expand_builtin): Likewise.
+ (altivec_expand_dst_builtin, altivec_expand_builtin): Likewise.
+ (rs6000_gimple_fold_builtin, rs6000_expand_builtin): Likewise.
+ * config/rs6000/rs6000.c (rs6000_builtin_md_vectorized_function)
+ (rs6000_builtin_reciprocal): Likewise.
+ * config/rx/rx.c (rx_expand_builtin): Likewise.
+ * config/s390/s390-c.c (s390_resolve_overloaded_builtin): Likewise.
+ * config/s390/s390.c (s390_expand_builtin): Likewise.
+ * config/sh/sh.c (sh_expand_builtin): Likewise.
+ * config/sparc/sparc.c (sparc_expand_builtin): Likewise.
+ (sparc_fold_builtin): Likewise.
+ * config/spu/spu-c.c (spu_resolve_overloaded_builtin): Likewise.
+ * config/spu/spu.c (spu_expand_builtin): Likewise.
+ * config/stormy16/stormy16.c (xstormy16_expand_builtin): Likewise.
+ * config/tilegx/tilegx.c (tilegx_expand_builtin): Likewise.
+ * config/tilepro/tilepro.c (tilepro_expand_builtin): Likewise.
+ * config/xtensa/xtensa.c (xtensa_fold_builtin): Likewise.
+ (xtensa_expand_builtin): Likewise.
+
+2019-08-13 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR middle-end/91421
* attribs.c (decl_attributes): Check the DECL_BUILT_IN_CLASS
before the DECL_FUNCTION_CODE.
* calls.c (maybe_warn_alloc_args_overflow): Use fndecl_built_in_p
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 7a6d510..4d999a4 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,9 @@
+2019-08-13 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR middle-end/91421
+ * gcc-interface/trans.c (gigi): Call set_decl_buillt_in_function.
+ (Call_to_gnu): Use DECL_FE_FUNCTION_CODE instead of DECL_FUNCTION_CODE.
+
2019-08-13 Eric Botcazou <ebotcazou@adacore.com>
* ali.ads (Linker_Option_Record): Remove Original_Pos component.
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index b484bc7..95991bd 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -493,8 +493,7 @@ gigi (Node_Id gnat_root,
build_function_type_list (integer_type_node, jmpbuf_ptr_type,
NULL_TREE),
NULL_TREE, is_default, true, true, true, false, false, NULL, Empty);
- DECL_BUILT_IN_CLASS (setjmp_decl) = BUILT_IN_NORMAL;
- DECL_FUNCTION_CODE (setjmp_decl) = BUILT_IN_SETJMP;
+ set_decl_built_in_function (setjmp_decl, BUILT_IN_NORMAL, BUILT_IN_SETJMP);
/* update_setjmp_buf updates a setjmp buffer from the current stack pointer
address. */
@@ -503,8 +502,8 @@ gigi (Node_Id gnat_root,
(get_identifier ("__builtin_update_setjmp_buf"), NULL_TREE,
build_function_type_list (void_type_node, jmpbuf_ptr_type, NULL_TREE),
NULL_TREE, is_default, true, true, true, false, false, NULL, Empty);
- DECL_BUILT_IN_CLASS (update_setjmp_buf_decl) = BUILT_IN_NORMAL;
- DECL_FUNCTION_CODE (update_setjmp_buf_decl) = BUILT_IN_UPDATE_SETJMP_BUF;
+ set_decl_built_in_function (update_setjmp_buf_decl, BUILT_IN_NORMAL,
+ BUILT_IN_UPDATE_SETJMP_BUF);
/* Indicate that it never returns. */
ftype = build_function_type_list (void_type_node,
@@ -5535,7 +5534,7 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target,
tree pred_cst = build_int_cst (integer_type_node, PRED_BUILTIN_EXPECT);
enum internal_fn icode = IFN_BUILTIN_EXPECT;
- switch (DECL_FUNCTION_CODE (gnu_subprog))
+ switch (DECL_FE_FUNCTION_CODE (gnu_subprog))
{
case BUILT_IN_EXPECT:
break;
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 695a9d1..cb1a45a 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -7236,7 +7236,6 @@ expand_builtin (tree exp, rtx target, rtx subtarget, machine_mode mode,
int ignore)
{
tree fndecl = get_callee_fndecl (exp);
- enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
machine_mode target_mode = TYPE_MODE (TREE_TYPE (exp));
int flags;
@@ -7248,6 +7247,7 @@ expand_builtin (tree exp, rtx target, rtx subtarget, machine_mode mode,
redundant checks and be sure, that possible overflow will be detected
by ASan. */
+ enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
if ((flag_sanitize & SANITIZE_ADDRESS) && asan_intercepted_p (fcode))
return expand_call (exp, target, ignore);
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index cd7cccb..c3bd56c 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,9 @@
+2019-08-13 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR middle-end/91421
+ * c-common.c (resolve_overloaded_builtin): Use
+ copy_decl_built_in_function.
+
2019-08-13 Martin Sebor <msebor@redhat.com>
PR c/80619
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index cb92710..610cb90 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -7332,8 +7332,6 @@ tree
resolve_overloaded_builtin (location_t loc, tree function,
vec<tree, va_gc> *params)
{
- enum built_in_function orig_code = DECL_FUNCTION_CODE (function);
-
/* Is function one of the _FETCH_OP_ or _OP_FETCH_ built-ins?
Those are not valid to call with a pointer to _Bool (or C++ bool)
and so must be rejected. */
@@ -7355,6 +7353,7 @@ resolve_overloaded_builtin (location_t loc, tree function,
}
/* Handle BUILT_IN_NORMAL here. */
+ enum built_in_function orig_code = DECL_FUNCTION_CODE (function);
switch (orig_code)
{
case BUILT_IN_SPECULATION_SAFE_VALUE_N:
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index ada2e4b..4d2897e 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,6 +1,11 @@
2019-08-13 Richard Sandiford <richard.sandiford@arm.com>
PR middle-end/91421
+ * c-decl.c (merge_decls): Use copy_decl_built_in_function.
+
+2019-08-13 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR middle-end/91421
* c-decl.c (header_for_builtin_fn): Take a FUNCTION_DECL instead
of a built_in_function.
(diagnose_mismatched_decls, implicitly_declare): Update accordingly.
diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
index 18a97db1..31116b2 100644
--- a/gcc/c/c-decl.c
+++ b/gcc/c/c-decl.c
@@ -2736,8 +2736,7 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype)
{
/* If redeclaring a builtin function, it stays built in.
But it gets tagged as having been declared. */
- DECL_BUILT_IN_CLASS (newdecl) = DECL_BUILT_IN_CLASS (olddecl);
- DECL_FUNCTION_CODE (newdecl) = DECL_FUNCTION_CODE (olddecl);
+ copy_decl_built_in_function (newdecl, olddecl);
C_DECL_DECLARED_BUILTIN (newdecl) = 1;
if (new_is_prototype)
{
diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c
index 28cf2ec..fa75369 100644
--- a/gcc/cgraphclones.c
+++ b/gcc/cgraphclones.c
@@ -225,10 +225,7 @@ build_function_decl_skip_args (tree orig_decl, bitmap args_to_skip,
if (fndecl_built_in_p (new_decl)
&& args_to_skip
&& !bitmap_empty_p (args_to_skip))
- {
- DECL_BUILT_IN_CLASS (new_decl) = NOT_BUILT_IN;
- DECL_FUNCTION_CODE (new_decl) = (enum built_in_function) 0;
- }
+ set_decl_built_in_function (new_decl, NOT_BUILT_IN, 0);
/* The FE might have information and assumptions about the other
arguments. */
DECL_LANG_SPECIFIC (new_decl) = NULL;
diff --git a/gcc/config/aarch64/aarch64-builtins.c b/gcc/config/aarch64/aarch64-builtins.c
index 16c1d42..2fc5cf7 100644
--- a/gcc/config/aarch64/aarch64-builtins.c
+++ b/gcc/config/aarch64/aarch64-builtins.c
@@ -1595,7 +1595,7 @@ aarch64_expand_builtin (tree exp,
int ignore ATTRIBUTE_UNUSED)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- int fcode = DECL_FUNCTION_CODE (fndecl);
+ int fcode = DECL_MD_FUNCTION_CODE (fndecl);
int icode;
rtx pat, op0;
tree arg0;
@@ -1881,7 +1881,7 @@ tree
aarch64_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED, tree *args,
bool ignore ATTRIBUTE_UNUSED)
{
- int fcode = DECL_FUNCTION_CODE (fndecl);
+ int fcode = DECL_MD_FUNCTION_CODE (fndecl);
tree type = TREE_TYPE (TREE_TYPE (fndecl));
switch (fcode)
@@ -1913,7 +1913,7 @@ aarch64_gimple_fold_builtin (gimple_stmt_iterator *gsi)
fndecl = gimple_call_fndecl (stmt);
if (fndecl)
{
- int fcode = DECL_FUNCTION_CODE (fndecl);
+ int fcode = DECL_MD_FUNCTION_CODE (fndecl);
unsigned nargs = gimple_call_num_args (stmt);
tree *args = (nargs > 0
? gimple_call_arg_ptr (stmt, 0)
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 2b3ea9f..46c058c 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -11180,7 +11180,7 @@ aarch64_builtin_reciprocal (tree fndecl)
if (!use_rsqrt_p (mode))
return NULL_TREE;
- return aarch64_builtin_rsqrt (DECL_FUNCTION_CODE (fndecl));
+ return aarch64_builtin_rsqrt (DECL_MD_FUNCTION_CODE (fndecl));
}
/* Emit instruction sequence to compute either the approximate square root
diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c
index 132af0b..d551af7 100644
--- a/gcc/config/alpha/alpha.c
+++ b/gcc/config/alpha/alpha.c
@@ -6657,7 +6657,7 @@ alpha_expand_builtin (tree exp, rtx target,
#define MAX_ARGS 2
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
tree arg;
call_expr_arg_iterator iter;
enum insn_code icode;
@@ -7056,7 +7056,7 @@ alpha_fold_builtin (tree fndecl, int n_args, tree *op,
}
}
- switch (DECL_FUNCTION_CODE (fndecl))
+ switch (DECL_MD_FUNCTION_CODE (fndecl))
{
case ALPHA_BUILTIN_CMPBGE:
return alpha_fold_builtin_cmpbge (opint, op_const);
@@ -7172,7 +7172,7 @@ alpha_gimple_fold_builtin (gimple_stmt_iterator *gsi)
{
tree arg0, arg1;
- switch (DECL_FUNCTION_CODE (fndecl))
+ switch (DECL_MD_FUNCTION_CODE (fndecl))
{
case ALPHA_BUILTIN_UMULH:
arg0 = gimple_call_arg (stmt, 0);
diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
index 3c4d89c..98fbfea 100644
--- a/gcc/config/arc/arc.c
+++ b/gcc/config/arc/arc.c
@@ -6996,7 +6996,7 @@ arc_expand_builtin (tree exp,
int ignore ATTRIBUTE_UNUSED)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned int id = DECL_FUNCTION_CODE (fndecl);
+ unsigned int id = DECL_MD_FUNCTION_CODE (fndecl);
const struct arc_builtin_description *d = &arc_bdesc[id];
int i, j, n_args = call_expr_nargs (exp);
rtx pat = NULL_RTX;
diff --git a/gcc/config/arm/arm-builtins.c b/gcc/config/arm/arm-builtins.c
index 07da55e..c5cdb7b 100644
--- a/gcc/config/arm/arm-builtins.c
+++ b/gcc/config/arm/arm-builtins.c
@@ -2555,7 +2555,7 @@ arm_expand_builtin (tree exp,
rtx op1;
rtx op2;
rtx pat;
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
size_t i;
machine_mode tmode;
machine_mode mode0;
diff --git a/gcc/config/avr/avr-c.c b/gcc/config/avr/avr-c.c
index de02910..e0ba5bd 100644
--- a/gcc/config/avr/avr-c.c
+++ b/gcc/config/avr/avr-c.c
@@ -54,7 +54,7 @@ avr_resolve_overloaded_builtin (unsigned int iloc, tree fndecl, void *vargs)
location_t loc = (location_t) iloc;
vec<tree, va_gc> &args = * (vec<tree, va_gc>*) vargs;
- switch (DECL_FUNCTION_CODE (fndecl))
+ switch (DECL_MD_FUNCTION_CODE (fndecl))
{
default:
break;
diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c
index 760e937..ba49e3d 100644
--- a/gcc/config/avr/avr.c
+++ b/gcc/config/avr/avr.c
@@ -14243,7 +14243,7 @@ avr_expand_builtin (tree exp, rtx target,
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
const char *bname = IDENTIFIER_POINTER (DECL_NAME (fndecl));
- unsigned int id = DECL_FUNCTION_CODE (fndecl);
+ unsigned int id = DECL_MD_FUNCTION_CODE (fndecl);
const struct avr_builtin_description *d = &avr_bdesc[id];
tree arg0;
rtx op0;
@@ -14395,7 +14395,7 @@ static tree
avr_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED, tree *arg,
bool ignore ATTRIBUTE_UNUSED)
{
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
tree val_type = TREE_TYPE (TREE_TYPE (fndecl));
if (!optimize)
diff --git a/gcc/config/bfin/bfin.c b/gcc/config/bfin/bfin.c
index 319d7e2..d1a6832 100644
--- a/gcc/config/bfin/bfin.c
+++ b/gcc/config/bfin/bfin.c
@@ -5498,7 +5498,7 @@ bfin_expand_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
enum insn_code icode;
const struct builtin_description *d;
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
tree arg0, arg1, arg2;
rtx op0, op1, op2, accvec, pat, tmp1, tmp2, a0reg, a1reg;
machine_mode tmode, mode0;
diff --git a/gcc/config/c6x/c6x.c b/gcc/config/c6x/c6x.c
index f6c9bbf..516a7c7 100644
--- a/gcc/config/c6x/c6x.c
+++ b/gcc/config/c6x/c6x.c
@@ -6661,7 +6661,7 @@ c6x_expand_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
size_t i;
const struct builtin_description *d;
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
for (i = 0, d = bdesc_2arg; i < ARRAY_SIZE (bdesc_2arg); i++, d++)
if (d->code == fcode)
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c
index fdd23c4..e1017be 100644
--- a/gcc/config/darwin.c
+++ b/gcc/config/darwin.c
@@ -3439,8 +3439,7 @@ darwin_init_cfstring_builtins (unsigned builtin_cfstring)
in place of the existing, which may be NULL. */
DECL_LANG_SPECIFIC (cfsfun) = NULL;
(*lang_hooks.dup_lang_specific_decl) (cfsfun);
- DECL_BUILT_IN_CLASS (cfsfun) = BUILT_IN_MD;
- DECL_FUNCTION_CODE (cfsfun) = darwin_builtin_cfstring;
+ set_decl_built_in_function (cfsfun, BUILT_IN_MD, darwin_builtin_cfstring);
lang_hooks.builtin_function (cfsfun);
/* extern int __CFConstantStringClassReference[]; */
@@ -3464,7 +3463,7 @@ tree
darwin_fold_builtin (tree fndecl, int n_args, tree *argp,
bool ARG_UNUSED (ignore))
{
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
if (fcode == darwin_builtin_cfstring)
{
diff --git a/gcc/config/frv/frv.c b/gcc/config/frv/frv.c
index f0c9351..f8a3a075 100644
--- a/gcc/config/frv/frv.c
+++ b/gcc/config/frv/frv.c
@@ -9113,7 +9113,7 @@ frv_expand_builtin (tree exp,
int ignore ATTRIBUTE_UNUSED)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned fcode = (unsigned)DECL_FUNCTION_CODE (fndecl);
+ unsigned fcode = DECL_MD_FUNCTION_CODE (fndecl);
unsigned i;
struct builtin_description *d;
diff --git a/gcc/config/gcn/gcn.c b/gcc/config/gcn/gcn.c
index 7df22c8..2c1158f 100644
--- a/gcc/config/gcn/gcn.c
+++ b/gcc/config/gcn/gcn.c
@@ -3546,7 +3546,7 @@ gcn_expand_builtin_1 (tree exp, rtx target, rtx /*subtarget */ ,
struct gcn_builtin_description *)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- switch (DECL_FUNCTION_CODE (fndecl))
+ switch (DECL_MD_FUNCTION_CODE (fndecl))
{
case GCN_BUILTIN_FLAT_LOAD_INT32:
{
@@ -3773,7 +3773,7 @@ gcn_expand_builtin (tree exp, rtx target, rtx subtarget, machine_mode mode,
int ignore)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
struct gcn_builtin_description *d;
gcc_assert (fcode < GCN_BUILTIN_MAX);
diff --git a/gcc/config/i386/i386-builtins.c b/gcc/config/i386/i386-builtins.c
index 9b6a59d..9736a75 100644
--- a/gcc/config/i386/i386-builtins.c
+++ b/gcc/config/i386/i386-builtins.c
@@ -1833,7 +1833,7 @@ tree
ix86_builtin_reciprocal (tree fndecl)
{
enum ix86_builtins fn_code
- = (enum ix86_builtins) DECL_FUNCTION_CODE (fndecl);
+ = (enum ix86_builtins) DECL_MD_FUNCTION_CODE (fndecl);
switch (fn_code)
{
/* Vectorized version of sqrt to rsqrt conversion. */
@@ -2407,8 +2407,8 @@ tree
fold_builtin_cpu (tree fndecl, tree *args)
{
unsigned int i;
- enum ix86_builtins fn_code = (enum ix86_builtins)
- DECL_FUNCTION_CODE (fndecl);
+ enum ix86_builtins fn_code
+ = (enum ix86_builtins) DECL_MD_FUNCTION_CODE (fndecl);
tree param_string_cst = NULL;
tree __processor_model_type = build_processor_model_struct ();
diff --git a/gcc/config/i386/i386-expand.c b/gcc/config/i386/i386-expand.c
index 176347c..d1d5a94 100644
--- a/gcc/config/i386/i386-expand.c
+++ b/gcc/config/i386/i386-expand.c
@@ -10978,7 +10978,7 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget,
tree arg0, arg1, arg2, arg3, arg4;
rtx op0, op1, op2, op3, op4, pat, pat2, insn;
machine_mode mode0, mode1, mode2, mode3, mode4;
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
/* For CPU builtins that can be folded, fold first and expand the fold. */
switch (fcode)
@@ -12535,7 +12535,7 @@ rdseed_step:
tree fndecl = gimple_call_fndecl (def_stmt);
if (fndecl
&& fndecl_built_in_p (fndecl, BUILT_IN_MD))
- switch ((unsigned int) DECL_FUNCTION_CODE (fndecl))
+ switch (DECL_MD_FUNCTION_CODE (fndecl))
{
case IX86_BUILTIN_CMPPD:
case IX86_BUILTIN_CMPPS:
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index d762d3f..1236230 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -16817,8 +16817,8 @@ ix86_fold_builtin (tree fndecl, int n_args,
{
if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
{
- enum ix86_builtins fn_code = (enum ix86_builtins)
- DECL_FUNCTION_CODE (fndecl);
+ enum ix86_builtins fn_code
+ = (enum ix86_builtins) DECL_MD_FUNCTION_CODE (fndecl);
enum rtx_code rcode;
bool is_vshift;
unsigned HOST_WIDE_INT mask;
@@ -17283,7 +17283,8 @@ ix86_gimple_fold_builtin (gimple_stmt_iterator *gsi)
tree fndecl = gimple_call_fndecl (stmt);
gcc_checking_assert (fndecl && fndecl_built_in_p (fndecl, BUILT_IN_MD));
int n_args = gimple_call_num_args (stmt);
- enum ix86_builtins fn_code = (enum ix86_builtins) DECL_FUNCTION_CODE (fndecl);
+ enum ix86_builtins fn_code
+ = (enum ix86_builtins) DECL_MD_FUNCTION_CODE (fndecl);
tree decl = NULL_TREE;
tree arg0, arg1, arg2;
enum rtx_code rcode;
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c
index a2a6c5c..a07244e 100644
--- a/gcc/config/ia64/ia64.c
+++ b/gcc/config/ia64/ia64.c
@@ -10556,8 +10556,8 @@ ia64_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED,
{
if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
{
- enum ia64_builtins fn_code = (enum ia64_builtins)
- DECL_FUNCTION_CODE (fndecl);
+ enum ia64_builtins fn_code
+ = (enum ia64_builtins) DECL_MD_FUNCTION_CODE (fndecl);
switch (fn_code)
{
case IA64_BUILTIN_NANQ:
@@ -10591,7 +10591,7 @@ ia64_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
int ignore ATTRIBUTE_UNUSED)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
switch (fcode)
{
diff --git a/gcc/config/iq2000/iq2000.c b/gcc/config/iq2000/iq2000.c
index c3be6fa..ad21f1c 100644
--- a/gcc/config/iq2000/iq2000.c
+++ b/gcc/config/iq2000/iq2000.c
@@ -2707,7 +2707,7 @@ iq2000_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
int ignore ATTRIBUTE_UNUSED)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- int fcode = DECL_FUNCTION_CODE (fndecl);
+ int fcode = DECL_MD_FUNCTION_CODE (fndecl);
enum rtx_code code [5];
code[0] = REG;
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index e0535b1..45ddec1 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -17215,7 +17215,7 @@ mips_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
const struct mips_builtin_description *d;
fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- fcode = DECL_FUNCTION_CODE (fndecl);
+ fcode = DECL_MD_FUNCTION_CODE (fndecl);
gcc_assert (fcode < ARRAY_SIZE (mips_builtins));
d = &mips_builtins[fcode];
avail = d->avail ();
diff --git a/gcc/config/msp430/msp430.c b/gcc/config/msp430/msp430.c
index 49fc262..72e62d2 100644
--- a/gcc/config/msp430/msp430.c
+++ b/gcc/config/msp430/msp430.c
@@ -2089,7 +2089,7 @@ msp430_expand_builtin (tree exp,
int ignore ATTRIBUTE_UNUSED)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
rtx arg1 = expand_normal (CALL_EXPR_ARG (exp, 0));
if (fcode == MSP430_BUILTIN_DELAY_CYCLES)
diff --git a/gcc/config/nds32/nds32-intrinsic.c b/gcc/config/nds32/nds32-intrinsic.c
index c78dc93..1348591 100644
--- a/gcc/config/nds32/nds32-intrinsic.c
+++ b/gcc/config/nds32/nds32-intrinsic.c
@@ -993,7 +993,7 @@ nds32_expand_builtin_impl (tree exp,
int ignore ATTRIBUTE_UNUSED)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
unsigned i;
struct builtin_description *d;
diff --git a/gcc/config/nios2/nios2.c b/gcc/config/nios2/nios2.c
index 250c6ac..e54bdba 100644
--- a/gcc/config/nios2/nios2.c
+++ b/gcc/config/nios2/nios2.c
@@ -4009,7 +4009,7 @@ nios2_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
int ignore ATTRIBUTE_UNUSED)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
if (fcode < nios2_fpu_builtin_base)
{
diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c
index c53a1ae..ce4602f 100644
--- a/gcc/config/nvptx/nvptx.c
+++ b/gcc/config/nvptx/nvptx.c
@@ -5452,7 +5452,7 @@ nvptx_expand_builtin (tree exp, rtx target, rtx ARG_UNUSED (subtarget),
machine_mode mode, int ignore)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- switch (DECL_FUNCTION_CODE (fndecl))
+ switch (DECL_MD_FUNCTION_CODE (fndecl))
{
case NVPTX_BUILTIN_SHUFFLE:
case NVPTX_BUILTIN_SHUFFLELL:
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c
index f54ca6e..0ab95d8 100644
--- a/gcc/config/pa/pa.c
+++ b/gcc/config/pa/pa.c
@@ -653,7 +653,7 @@ pa_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
int ignore ATTRIBUTE_UNUSED)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
switch (fcode)
{
diff --git a/gcc/config/pru/pru.c b/gcc/config/pru/pru.c
index c764694..4e1c081 100644
--- a/gcc/config/pru/pru.c
+++ b/gcc/config/pru/pru.c
@@ -2873,7 +2873,7 @@ pru_expand_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
int ignore ATTRIBUTE_UNUSED)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
rtx arg1 = expand_normal (CALL_EXPR_ARG (exp, 0));
if (fcode == PRU_BUILTIN_DELAY_CYCLES)
diff --git a/gcc/config/riscv/riscv-builtins.c b/gcc/config/riscv/riscv-builtins.c
index 5482671..80169fa 100644
--- a/gcc/config/riscv/riscv-builtins.c
+++ b/gcc/config/riscv/riscv-builtins.c
@@ -256,7 +256,7 @@ riscv_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
int ignore ATTRIBUTE_UNUSED)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
const struct riscv_builtin_description *d = &riscv_builtins[fcode];
switch (d->builtin_type)
diff --git a/gcc/config/rs6000/rs6000-c.c b/gcc/config/rs6000/rs6000-c.c
index 7f0cdc7..bd4b19d 100644
--- a/gcc/config/rs6000/rs6000-c.c
+++ b/gcc/config/rs6000/rs6000-c.c
@@ -6124,7 +6124,7 @@ altivec_resolve_overloaded_builtin (location_t loc, tree fndecl,
vec<tree, va_gc> *arglist = static_cast<vec<tree, va_gc> *> (passed_arglist);
unsigned int nargs = vec_safe_length (arglist);
enum rs6000_builtins fcode
- = (enum rs6000_builtins)DECL_FUNCTION_CODE (fndecl);
+ = (enum rs6000_builtins) DECL_MD_FUNCTION_CODE (fndecl);
tree fnargs = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
tree types[3], args[3];
const struct altivec_builtin_types *desc;
diff --git a/gcc/config/rs6000/rs6000-call.c b/gcc/config/rs6000/rs6000-call.c
index 832eda7..62aa4bf 100644
--- a/gcc/config/rs6000/rs6000-call.c
+++ b/gcc/config/rs6000/rs6000-call.c
@@ -4003,7 +4003,8 @@ htm_expand_builtin (tree exp, rtx target, bool * expandedp)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
bool nonvoid = TREE_TYPE (TREE_TYPE (fndecl)) != void_type_node;
- enum rs6000_builtins fcode = (enum rs6000_builtins) DECL_FUNCTION_CODE (fndecl);
+ enum rs6000_builtins fcode
+ = (enum rs6000_builtins) DECL_MD_FUNCTION_CODE (fndecl);
const struct builtin_description *d;
size_t i;
@@ -4472,7 +4473,8 @@ altivec_expand_dst_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
bool *expandedp)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- enum rs6000_builtins fcode = (enum rs6000_builtins) DECL_FUNCTION_CODE (fndecl);
+ enum rs6000_builtins fcode
+ = (enum rs6000_builtins) DECL_MD_FUNCTION_CODE (fndecl);
tree arg0, arg1, arg2;
machine_mode mode0, mode1;
rtx pat, op0, op1, op2;
@@ -4666,7 +4668,7 @@ altivec_expand_builtin (tree exp, rtx target, bool *expandedp)
rtx op0, pat;
machine_mode tmode, mode0;
enum rs6000_builtins fcode
- = (enum rs6000_builtins) DECL_FUNCTION_CODE (fndecl);
+ = (enum rs6000_builtins) DECL_MD_FUNCTION_CODE (fndecl);
if (rs6000_overloaded_builtin_p (fcode))
{
@@ -5325,7 +5327,7 @@ rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi)
tree fndecl = gimple_call_fndecl (stmt);
gcc_checking_assert (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD);
enum rs6000_builtins fn_code
- = (enum rs6000_builtins) DECL_FUNCTION_CODE (fndecl);
+ = (enum rs6000_builtins) DECL_MD_FUNCTION_CODE (fndecl);
tree arg0, arg1, lhs, temp;
enum tree_code bcode;
gimple *g;
@@ -6216,7 +6218,7 @@ rs6000_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
enum rs6000_builtins fcode
- = (enum rs6000_builtins)DECL_FUNCTION_CODE (fndecl);
+ = (enum rs6000_builtins) DECL_MD_FUNCTION_CODE (fndecl);
size_t uns_fcode = (size_t)fcode;
const struct builtin_description *d;
size_t i;
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index d1eb08a..e792116 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -5335,7 +5335,7 @@ rs6000_builtin_md_vectorized_function (tree fndecl, tree type_out,
in_n = TYPE_VECTOR_SUBPARTS (type_in);
enum rs6000_builtins fn
- = (enum rs6000_builtins) DECL_FUNCTION_CODE (fndecl);
+ = (enum rs6000_builtins) DECL_MD_FUNCTION_CODE (fndecl);
switch (fn)
{
case RS6000_BUILTIN_RSQRTF:
@@ -21300,7 +21300,7 @@ rs6000_ira_change_pseudo_allocno_class (int regno ATTRIBUTE_UNUSED,
static tree
rs6000_builtin_reciprocal (tree fndecl)
{
- switch (DECL_FUNCTION_CODE (fndecl))
+ switch (DECL_MD_FUNCTION_CODE (fndecl))
{
case VSX_BUILTIN_XVSQRTDP:
if (!RS6000_RECIP_AUTO_RSQRTE_P (V2DFmode))
diff --git a/gcc/config/rx/rx.c b/gcc/config/rx/rx.c
index 0695f3b..10b8f6e 100644
--- a/gcc/config/rx/rx.c
+++ b/gcc/config/rx/rx.c
@@ -2616,7 +2616,7 @@ rx_expand_builtin (tree exp,
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
tree arg = call_expr_nargs (exp) >= 1 ? CALL_EXPR_ARG (exp, 0) : NULL_TREE;
rtx op = arg ? expand_normal (arg) : NULL_RTX;
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
switch (fcode)
{
diff --git a/gcc/config/s390/s390-c.c b/gcc/config/s390/s390-c.c
index 97debdc..fd98a39 100644
--- a/gcc/config/s390/s390-c.c
+++ b/gcc/config/s390/s390-c.c
@@ -860,7 +860,7 @@ s390_resolve_overloaded_builtin (location_t loc,
vec<tree, va_gc> *arglist = static_cast<vec<tree, va_gc> *> (passed_arglist);
unsigned int in_args_num = vec_safe_length (arglist);
unsigned int ob_args_num = 0;
- unsigned int ob_fcode = DECL_FUNCTION_CODE (ob_fndecl);
+ unsigned int ob_fcode = DECL_MD_FUNCTION_CODE (ob_fndecl);
enum s390_overloaded_builtin_vars bindex;
unsigned int i;
int last_match_type = INT_MAX;
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 24b8a5c..74f1d25 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -770,7 +770,7 @@ s390_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
#define MAX_ARGS 6
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
enum insn_code icode;
rtx op[MAX_ARGS], pat;
int arity;
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index dfaeab5..e44e46d 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -10461,7 +10461,7 @@ sh_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
machine_mode mode ATTRIBUTE_UNUSED, int ignore)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
const struct builtin_description *d = &bdesc[fcode];
enum insn_code icode = d->icode;
int signature = d->signature;
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
index 0227a53..a15f27f 100644
--- a/gcc/config/sparc/sparc.c
+++ b/gcc/config/sparc/sparc.c
@@ -11661,7 +11661,8 @@ sparc_expand_builtin (tree exp, rtx target,
int ignore ATTRIBUTE_UNUSED)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- enum sparc_builtins code = (enum sparc_builtins) DECL_FUNCTION_CODE (fndecl);
+ enum sparc_builtins code
+ = (enum sparc_builtins) DECL_MD_FUNCTION_CODE (fndecl);
enum insn_code icode = sparc_builtins_icode[code];
bool nonvoid = TREE_TYPE (TREE_TYPE (fndecl)) != void_type_node;
call_expr_arg_iterator iter;
@@ -11829,7 +11830,8 @@ static tree
sparc_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED,
tree *args, bool ignore)
{
- enum sparc_builtins code = (enum sparc_builtins) DECL_FUNCTION_CODE (fndecl);
+ enum sparc_builtins code
+ = (enum sparc_builtins) DECL_MD_FUNCTION_CODE (fndecl);
tree rtype = TREE_TYPE (TREE_TYPE (fndecl));
tree arg0, arg1, arg2;
diff --git a/gcc/config/spu/spu-c.c b/gcc/config/spu/spu-c.c
index 6a52963..6312082 100644
--- a/gcc/config/spu/spu-c.c
+++ b/gcc/config/spu/spu-c.c
@@ -93,7 +93,7 @@ spu_resolve_overloaded_builtin (location_t loc, tree fndecl, void *passed_args)
|| POINTER_TYPE_P (t))
vec<tree, va_gc> *fnargs = static_cast <vec<tree, va_gc> *> (passed_args);
unsigned int nargs = vec_safe_length (fnargs);
- int new_fcode, fcode = DECL_FUNCTION_CODE (fndecl);
+ int new_fcode, fcode = DECL_MD_FUNCTION_CODE (fndecl);
struct spu_builtin_description *desc;
tree match = NULL_TREE;
diff --git a/gcc/config/spu/spu.c b/gcc/config/spu/spu.c
index 613d301..f88ad19 100644
--- a/gcc/config/spu/spu.c
+++ b/gcc/config/spu/spu.c
@@ -6591,7 +6591,7 @@ spu_expand_builtin (tree exp,
int ignore ATTRIBUTE_UNUSED)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
struct spu_builtin_description *d;
if (fcode < NUM_SPU_BUILTINS)
diff --git a/gcc/config/stormy16/stormy16.c b/gcc/config/stormy16/stormy16.c
index bd55110..aec9f2d 100644
--- a/gcc/config/stormy16/stormy16.c
+++ b/gcc/config/stormy16/stormy16.c
@@ -2326,7 +2326,7 @@ xstormy16_expand_builtin (tree exp, rtx target,
fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
argtree = TREE_OPERAND (exp, 1);
- i = DECL_FUNCTION_CODE (fndecl);
+ i = DECL_MD_FUNCTION_CODE (fndecl);
code = s16builtins[i].md_code;
for (a = 0; a < 10 && argtree; a++)
diff --git a/gcc/config/tilegx/tilegx.c b/gcc/config/tilegx/tilegx.c
index 6da9139..575780f 100644
--- a/gcc/config/tilegx/tilegx.c
+++ b/gcc/config/tilegx/tilegx.c
@@ -3531,7 +3531,7 @@ tilegx_expand_builtin (tree exp,
#define MAX_BUILTIN_ARGS 4
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
tree arg;
call_expr_arg_iterator iter;
enum insn_code icode;
diff --git a/gcc/config/tilepro/tilepro.c b/gcc/config/tilepro/tilepro.c
index f86461f..b4adfa4 100644
--- a/gcc/config/tilepro/tilepro.c
+++ b/gcc/config/tilepro/tilepro.c
@@ -3095,7 +3095,7 @@ tilepro_expand_builtin (tree exp,
#define MAX_BUILTIN_ARGS 4
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
tree arg;
call_expr_arg_iterator iter;
enum insn_code icode;
diff --git a/gcc/config/xtensa/xtensa.c b/gcc/config/xtensa/xtensa.c
index 2b97fa2..a999567 100644
--- a/gcc/config/xtensa/xtensa.c
+++ b/gcc/config/xtensa/xtensa.c
@@ -3450,7 +3450,7 @@ static tree
xtensa_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED, tree *args,
bool ignore ATTRIBUTE_UNUSED)
{
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
tree arg0, arg1;
switch (fcode)
@@ -3481,7 +3481,7 @@ xtensa_expand_builtin (tree exp, rtx target,
int ignore)
{
tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
- unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+ unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
switch (fcode)
{
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 28bc2a4..5c005d4 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2019-08-13 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR middle-end/91421
+ * decl.c (duplicate_decls): Use copy_decl_built_in_function.
+ * pt.c (declare_integer_pack): Use set_decl_built_in_function.
+
2019-08-13 Marek Polacek <polacek@redhat.com>
PR c++/90473 - wrong code with nullptr in default argument.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index d91f251..b849630 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -2544,8 +2544,7 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend)
if (fndecl_built_in_p (olddecl)
&& (new_defines_function ? GNU_INLINE_P (newdecl) : types_match))
{
- DECL_BUILT_IN_CLASS (newdecl) = DECL_BUILT_IN_CLASS (olddecl);
- DECL_FUNCTION_CODE (newdecl) = DECL_FUNCTION_CODE (olddecl);
+ copy_decl_built_in_function (newdecl, olddecl);
/* If we're keeping the built-in definition, keep the rtl,
regardless of declaration matches. */
COPY_DECL_RTL (olddecl, newdecl);
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index b03968f..1758511 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -28331,9 +28331,8 @@ declare_integer_pack (void)
NULL_TREE),
NULL_TREE, ECF_CONST);
DECL_DECLARED_CONSTEXPR_P (ipfn) = true;
- DECL_BUILT_IN_CLASS (ipfn) = BUILT_IN_FRONTEND;
- DECL_FUNCTION_CODE (ipfn)
- = (enum built_in_function) (int) CP_BUILT_IN_INTEGER_PACK;
+ set_decl_built_in_function (ipfn, BUILT_IN_FRONTEND,
+ CP_BUILT_IN_INTEGER_PACK);
}
/* Set up the hash tables for template instantiations. */
diff --git a/gcc/d/ChangeLog b/gcc/d/ChangeLog
index 5aa50a26..a4db1fa 100644
--- a/gcc/d/ChangeLog
+++ b/gcc/d/ChangeLog
@@ -1,3 +1,8 @@
+2019-08-13 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR middle-end/91421
+ * intrinsics.cc (maybe_set_intrinsic): Use set_decl_built_in_function.
+
2019-08-11 Iain Buclaw <ibuclaw@gdcproject.org>
PR d/90601
diff --git a/gcc/d/intrinsics.cc b/gcc/d/intrinsics.cc
index 4bd321b..56eab52 100644
--- a/gcc/d/intrinsics.cc
+++ b/gcc/d/intrinsics.cc
@@ -134,10 +134,7 @@ maybe_set_intrinsic (FuncDeclaration *decl)
/* If there is no function body, then the implementation is always
provided by the compiler. */
if (!decl->fbody)
- {
- DECL_BUILT_IN_CLASS (decl->csym) = BUILT_IN_FRONTEND;
- DECL_FUNCTION_CODE (decl->csym) = (built_in_function) code;
- }
+ set_decl_built_in_function (decl->csym, BUILT_IN_FRONTEND, code);
/* Infer whether the intrinsic can be used for CTFE, let the
front-end know that it can be evaluated at compile-time. */
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 0bd68b5..8c711aba 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -3466,7 +3466,8 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
return (TREE_CODE (arg0) == FUNCTION_DECL
&& fndecl_built_in_p (arg0) && fndecl_built_in_p (arg1)
&& DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1)
- && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1));
+ && (DECL_UNCHECKED_FUNCTION_CODE (arg0)
+ == DECL_UNCHECKED_FUNCTION_CODE (arg1)));
case tcc_exceptional:
if (TREE_CODE (arg0) == CONSTRUCTOR)
diff --git a/gcc/ipa-param-manipulation.c b/gcc/ipa-param-manipulation.c
index 11908d3..1af6d05 100644
--- a/gcc/ipa-param-manipulation.c
+++ b/gcc/ipa-param-manipulation.c
@@ -219,10 +219,7 @@ ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments)
/* When signature changes, we need to clear builtin info. */
if (fndecl_built_in_p (fndecl))
- {
- DECL_BUILT_IN_CLASS (fndecl) = NOT_BUILT_IN;
- DECL_FUNCTION_CODE (fndecl) = (enum built_in_function) 0;
- }
+ set_decl_built_in_function (fndecl, NOT_BUILT_IN, 0);
TREE_TYPE (fndecl) = new_type;
DECL_VIRTUAL_P (fndecl) = 0;
diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c
index 86b26d3..cecfe05 100644
--- a/gcc/ipa-split.c
+++ b/gcc/ipa-split.c
@@ -1351,10 +1351,7 @@ split_function (basic_block return_bb, class split_point *split_point,
changes. For partial inlining we however cannot expect the part
of builtin implementation to have same semantic as the whole. */
if (fndecl_built_in_p (node->decl))
- {
- DECL_BUILT_IN_CLASS (node->decl) = NOT_BUILT_IN;
- DECL_FUNCTION_CODE (node->decl) = (enum built_in_function) 0;
- }
+ set_decl_built_in_function (node->decl, NOT_BUILT_IN, 0);
/* If return_bb contains any clobbers that refer to SSA_NAMEs
set in the split part, remove them. Also reset debug stmts that
diff --git a/gcc/jit/ChangeLog b/gcc/jit/ChangeLog
index 256e93e..110367e 100644
--- a/gcc/jit/ChangeLog
+++ b/gcc/jit/ChangeLog
@@ -1,3 +1,8 @@
+2019-08-13 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR middle-end/91421
+ * jit-playback.c (new_function): Use set_decl_built_in_function.
+
2019-07-22 Andrea Corallo <andrea.corallo@arm.com>
* jit-recording.c (unary_op_reproducer_strings): Make it extern.
diff --git a/gcc/jit/jit-playback.c b/gcc/jit/jit-playback.c
index 942c7304..9eeb2a7 100644
--- a/gcc/jit/jit-playback.c
+++ b/gcc/jit/jit-playback.c
@@ -453,12 +453,11 @@ new_function (location *loc,
if (builtin_id)
{
- DECL_FUNCTION_CODE (fndecl) = builtin_id;
gcc_assert (loc == NULL);
DECL_SOURCE_LOCATION (fndecl) = BUILTINS_LOCATION;
- DECL_BUILT_IN_CLASS (fndecl) =
- builtins_manager::get_class (builtin_id);
+ built_in_class fclass = builtins_manager::get_class (builtin_id);
+ set_decl_built_in_function (fndecl, fclass, builtin_id);
set_builtin_decl (builtin_id, fndecl,
builtins_manager::implicit_p (builtin_id));
diff --git a/gcc/langhooks.c b/gcc/langhooks.c
index 2df97f2..22ace13 100644
--- a/gcc/langhooks.c
+++ b/gcc/langhooks.c
@@ -615,12 +615,8 @@ add_builtin_function_common (const char *name,
TREE_PUBLIC (decl) = 1;
DECL_EXTERNAL (decl) = 1;
- DECL_BUILT_IN_CLASS (decl) = cl;
- DECL_FUNCTION_CODE (decl) = (enum built_in_function) function_code;
-
- /* DECL_FUNCTION_CODE is a bitfield; verify that the value fits. */
- gcc_assert (DECL_FUNCTION_CODE (decl) == function_code);
+ set_decl_built_in_function (decl, cl, function_code);
if (library_name)
{
diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c
index 47a9143..b156876 100644
--- a/gcc/lto-streamer-out.c
+++ b/gcc/lto-streamer-out.c
@@ -1137,7 +1137,7 @@ hash_tree (struct streamer_tree_cache_d *cache, hash_map<tree, hashval_t> *map,
hstate.add_flag (DECL_LOOPING_CONST_OR_PURE_P (t));
hstate.commit_flag ();
if (DECL_BUILT_IN_CLASS (t) != NOT_BUILT_IN)
- hstate.add_int (DECL_FUNCTION_CODE (t));
+ hstate.add_int (DECL_UNCHECKED_FUNCTION_CODE (t));
}
if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog
index d150bf6..2467d78 100644
--- a/gcc/lto/ChangeLog
+++ b/gcc/lto/ChangeLog
@@ -1,3 +1,10 @@
+2019-08-13 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR middle-end/91421
+ * lto-common.c (compare_tree_sccs_1): Use DECL_UNCHECKED_FUNCTION_CODE
+ instead of DECL_FUNCTION_CODE.
+ * lto-symtab.c (lto_symtab_merge_p): Likewise.
+
2019-08-01 Bernd Edlinger <bernd.edlinger@hotmail.de>
* Make-lang.in (lto.install-common): Remove unnecessary slash
diff --git a/gcc/lto/lto-common.c b/gcc/lto/lto-common.c
index ffa05f9..9a17933 100644
--- a/gcc/lto/lto-common.c
+++ b/gcc/lto/lto-common.c
@@ -1241,7 +1241,7 @@ compare_tree_sccs_1 (tree t1, tree t2, tree **map)
compare_values (DECL_CXX_CONSTRUCTOR_P);
compare_values (DECL_CXX_DESTRUCTOR_P);
if (DECL_BUILT_IN_CLASS (t1) != NOT_BUILT_IN)
- compare_values (DECL_FUNCTION_CODE);
+ compare_values (DECL_UNCHECKED_FUNCTION_CODE);
}
if (CODE_CONTAINS_STRUCT (code, TS_TYPE_COMMON))
diff --git a/gcc/lto/lto-symtab.c b/gcc/lto/lto-symtab.c
index d573ea7..37fa572 100644
--- a/gcc/lto/lto-symtab.c
+++ b/gcc/lto/lto-symtab.c
@@ -556,7 +556,8 @@ lto_symtab_merge_p (tree prevailing, tree decl)
}
if (fndecl_built_in_p (prevailing)
&& (DECL_BUILT_IN_CLASS (prevailing) != DECL_BUILT_IN_CLASS (decl)
- || DECL_FUNCTION_CODE (prevailing) != DECL_FUNCTION_CODE (decl)))
+ || (DECL_UNCHECKED_FUNCTION_CODE (prevailing)
+ != DECL_UNCHECKED_FUNCTION_CODE (decl))))
{
if (dump_file)
fprintf (dump_file, "Not merging decls; "
diff --git a/gcc/omp-simd-clone.c b/gcc/omp-simd-clone.c
index c8c5284..a078033 100644
--- a/gcc/omp-simd-clone.c
+++ b/gcc/omp-simd-clone.c
@@ -461,8 +461,7 @@ simd_clone_create (struct cgraph_node *old_node)
if (new_node == NULL)
return new_node;
- DECL_BUILT_IN_CLASS (new_node->decl) = NOT_BUILT_IN;
- DECL_FUNCTION_CODE (new_node->decl) = (enum built_in_function) 0;
+ set_decl_built_in_function (new_node->decl, NOT_BUILT_IN, 0);
TREE_PUBLIC (new_node->decl) = TREE_PUBLIC (old_node->decl);
DECL_COMDAT (new_node->decl) = DECL_COMDAT (old_node->decl);
DECL_WEAK (new_node->decl) = DECL_WEAK (old_node->decl);
diff --git a/gcc/print-tree.c b/gcc/print-tree.c
index debea2b..6dcbb2d 100644
--- a/gcc/print-tree.c
+++ b/gcc/print-tree.c
@@ -519,7 +519,11 @@ print_node (FILE *file, const char *prefix, tree node, int indent,
if (code == FUNCTION_DECL && fndecl_built_in_p (node))
{
if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_MD)
- fprintf (file, " built-in: BUILT_IN_MD:%d", DECL_FUNCTION_CODE (node));
+ fprintf (file, " built-in: BUILT_IN_MD:%d",
+ DECL_MD_FUNCTION_CODE (node));
+ else if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_FRONTEND)
+ fprintf (file, " built-in: BUILT_IN_FRONTEND:%d",
+ DECL_FE_FUNCTION_CODE (node));
else
fprintf (file, " built-in: %s:%s",
built_in_class_names[(int) DECL_BUILT_IN_CLASS (node)],
diff --git a/gcc/tree-core.h b/gcc/tree-core.h
index 0979180..cfd8839 100644
--- a/gcc/tree-core.h
+++ b/gcc/tree-core.h
@@ -1870,9 +1870,8 @@ struct GTY(()) tree_function_decl {
/* Index within a virtual table. */
tree vindex;
- /* In a FUNCTION_DECL for which DECL_BUILT_IN holds, this is
- DECL_FUNCTION_CODE. Otherwise unused. */
- enum built_in_function function_code;
+ /* In a FUNCTION_DECL this is DECL_UNCHECKED_FUNCTION_CODE. */
+ unsigned int function_code;
ENUM_BITFIELD(built_in_class) built_in_class : 2;
unsigned static_ctor_flag : 1;
diff --git a/gcc/tree-streamer-in.c b/gcc/tree-streamer-in.c
index 7ab72a7..dcd511e 100644
--- a/gcc/tree-streamer-in.c
+++ b/gcc/tree-streamer-in.c
@@ -324,8 +324,7 @@ unpack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
static void
unpack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
{
- DECL_BUILT_IN_CLASS (expr) = bp_unpack_enum (bp, built_in_class,
- BUILT_IN_LAST);
+ built_in_class cl = bp_unpack_enum (bp, built_in_class, BUILT_IN_LAST);
DECL_STATIC_CONSTRUCTOR (expr) = (unsigned) bp_unpack_value (bp, 1);
DECL_STATIC_DESTRUCTOR (expr) = (unsigned) bp_unpack_value (bp, 1);
DECL_UNINLINABLE (expr) = (unsigned) bp_unpack_value (bp, 1);
@@ -344,22 +343,22 @@ unpack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
DECL_DISREGARD_INLINE_LIMITS (expr) = (unsigned) bp_unpack_value (bp, 1);
DECL_PURE_P (expr) = (unsigned) bp_unpack_value (bp, 1);
DECL_LOOPING_CONST_OR_PURE_P (expr) = (unsigned) bp_unpack_value (bp, 1);
- if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN)
+ unsigned int fcode = 0;
+ if (cl != NOT_BUILT_IN)
{
- DECL_FUNCTION_CODE (expr) = (enum built_in_function) bp_unpack_value (bp,
- 12);
- if (DECL_BUILT_IN_CLASS (expr) == BUILT_IN_NORMAL
- && DECL_FUNCTION_CODE (expr) >= END_BUILTINS)
+ fcode = bp_unpack_value (bp, 32);
+ if (cl == BUILT_IN_NORMAL && fcode >= END_BUILTINS)
fatal_error (input_location,
"machine independent builtin code out of range");
- else if (DECL_BUILT_IN_CLASS (expr) == BUILT_IN_MD)
+ else if (cl == BUILT_IN_MD)
{
- tree result = targetm.builtin_decl (DECL_FUNCTION_CODE (expr), true);
+ tree result = targetm.builtin_decl (fcode, true);
if (!result || result == error_mark_node)
fatal_error (input_location,
"target specific builtin not available");
}
}
+ set_decl_built_in_function (expr, cl, fcode);
}
diff --git a/gcc/tree-streamer-out.c b/gcc/tree-streamer-out.c
index dbdc5d5..aadc56c 100644
--- a/gcc/tree-streamer-out.c
+++ b/gcc/tree-streamer-out.c
@@ -306,7 +306,7 @@ pack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
bp_pack_value (bp, DECL_PURE_P (expr), 1);
bp_pack_value (bp, DECL_LOOPING_CONST_OR_PURE_P (expr), 1);
if (DECL_BUILT_IN_CLASS (expr) != NOT_BUILT_IN)
- bp_pack_value (bp, DECL_FUNCTION_CODE (expr), 12);
+ bp_pack_value (bp, DECL_UNCHECKED_FUNCTION_CODE (expr), 32);
}
diff --git a/gcc/tree.h b/gcc/tree.h
index dd54f4d..b910c5c 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -2518,10 +2518,10 @@ extern machine_mode vector_type_mode (const_tree);
(DECL_COMMON_CHECK (NODE)->decl_common.mode = (MODE))
/* For FUNCTION_DECL, if it is built-in, this identifies which built-in
- operation it is. Note, however, that this field is overloaded, with
- DECL_BUILT_IN_CLASS as the discriminant, so the latter must always be
- checked before any access to the former. */
-#define DECL_FUNCTION_CODE(NODE) \
+ operation it is. This is only intended for low-level accesses;
+ normally DECL_FUNCTION_CODE, DECL_FE_FUNCTION_CODE or DECL_MD_FUNCTION
+ should be used instead. */
+#define DECL_UNCHECKED_FUNCTION_CODE(NODE) \
(FUNCTION_DECL_CHECK (NODE)->function_decl.function_code)
/* Test if FCODE is a function code for an alloca operation. */
@@ -3143,10 +3143,9 @@ extern vec<tree, va_gc> **decl_debug_args_insert (tree);
#define DECL_STRUCT_FUNCTION(NODE) \
(FUNCTION_DECL_CHECK (NODE)->function_decl.f)
-
/* For a builtin function, identify which part of the compiler defined it. */
#define DECL_BUILT_IN_CLASS(NODE) \
- (FUNCTION_DECL_CHECK (NODE)->function_decl.built_in_class)
+ ((built_in_class) FUNCTION_DECL_CHECK (NODE)->function_decl.built_in_class)
/* In FUNCTION_DECL, a chain of ..._DECL nodes. */
#define DECL_ARGUMENTS(NODE) \
@@ -3885,6 +3884,61 @@ valid_vector_subparts_p (poly_uint64 subparts)
return true;
}
+/* Return the built-in function that DECL represents, given that it is known
+ to be a FUNCTION_DECL with built-in class BUILT_IN_NORMAL. */
+inline built_in_function
+DECL_FUNCTION_CODE (const_tree decl)
+{
+ const tree_function_decl &fndecl = FUNCTION_DECL_CHECK (decl)->function_decl;
+ gcc_checking_assert (fndecl.built_in_class == BUILT_IN_NORMAL);
+ return (built_in_function) fndecl.function_code;
+}
+
+/* Return the target-specific built-in function that DECL represents,
+ given that it is known to be a FUNCTION_DECL with built-in class
+ BUILT_IN_MD. */
+inline int
+DECL_MD_FUNCTION_CODE (const_tree decl)
+{
+ const tree_function_decl &fndecl = FUNCTION_DECL_CHECK (decl)->function_decl;
+ gcc_checking_assert (fndecl.built_in_class == BUILT_IN_MD);
+ return fndecl.function_code;
+}
+
+/* Return the frontend-specific built-in function that DECL represents,
+ given that it is known to be a FUNCTION_DECL with built-in class
+ BUILT_IN_FRONTEND. */
+inline int
+DECL_FE_FUNCTION_CODE (const_tree decl)
+{
+ const tree_function_decl &fndecl = FUNCTION_DECL_CHECK (decl)->function_decl;
+ gcc_checking_assert (fndecl.built_in_class == BUILT_IN_FRONTEND);
+ return fndecl.function_code;
+}
+
+/* Record that FUNCTION_DECL DECL represents built-in function FCODE of
+ class FCLASS. */
+inline void
+set_decl_built_in_function (tree decl, built_in_class fclass,
+ unsigned int fcode)
+{
+ tree_function_decl &fndecl = FUNCTION_DECL_CHECK (decl)->function_decl;
+ fndecl.built_in_class = fclass;
+ fndecl.function_code = fcode;
+}
+
+/* Record that FUNCTION_DECL NEWDECL represents the same built-in function
+ as OLDDECL (or none, if OLDDECL doesn't represent a built-in function). */
+inline void
+copy_decl_built_in_function (tree newdecl, const_tree olddecl)
+{
+ tree_function_decl &newfndecl = FUNCTION_DECL_CHECK (newdecl)->function_decl;
+ const tree_function_decl &oldfndecl
+ = FUNCTION_DECL_CHECK (olddecl)->function_decl;
+ newfndecl.built_in_class = oldfndecl.built_in_class;
+ newfndecl.function_code = oldfndecl.function_code;
+}
+
/* In NON_LVALUE_EXPR and VIEW_CONVERT_EXPR, set when this node is merely a
wrapper added to express a location_t on behalf of the node's child
(e.g. by maybe_wrap_with_location). */
@@ -6077,9 +6131,10 @@ fndecl_built_in_p (const_tree node, built_in_class klass)
of class KLASS with name equal to NAME. */
inline bool
-fndecl_built_in_p (const_tree node, int name, built_in_class klass)
+fndecl_built_in_p (const_tree node, unsigned int name, built_in_class klass)
{
- return (fndecl_built_in_p (node, klass) && DECL_FUNCTION_CODE (node) == name);
+ return (fndecl_built_in_p (node, klass)
+ && DECL_UNCHECKED_FUNCTION_CODE (node) == name);
}
/* Return true if a FUNCTION_DECL NODE is a GCC built-in function