From 4d732405bd91b54c196fdc38191f838bb01f23a6 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 13 Aug 2019 21:35:20 +0000 Subject: [PATCH] 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 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 --- gcc/ChangeLog | 85 +++++++++++++++++++++++++++ gcc/ada/ChangeLog | 6 ++ gcc/ada/gcc-interface/trans.c | 9 ++- gcc/builtins.c | 2 +- gcc/c-family/ChangeLog | 6 ++ gcc/c-family/c-common.c | 3 +- gcc/c/ChangeLog | 5 ++ gcc/c/c-decl.c | 3 +- gcc/cgraphclones.c | 5 +- gcc/config/aarch64/aarch64-builtins.c | 6 +- gcc/config/aarch64/aarch64.c | 2 +- gcc/config/alpha/alpha.c | 6 +- gcc/config/arc/arc.c | 2 +- gcc/config/arm/arm-builtins.c | 2 +- gcc/config/avr/avr-c.c | 2 +- gcc/config/avr/avr.c | 4 +- gcc/config/bfin/bfin.c | 2 +- gcc/config/c6x/c6x.c | 2 +- gcc/config/darwin.c | 5 +- gcc/config/frv/frv.c | 2 +- gcc/config/gcn/gcn.c | 4 +- gcc/config/i386/i386-builtins.c | 6 +- gcc/config/i386/i386-expand.c | 4 +- gcc/config/i386/i386.c | 7 ++- gcc/config/ia64/ia64.c | 6 +- gcc/config/iq2000/iq2000.c | 2 +- gcc/config/mips/mips.c | 2 +- gcc/config/msp430/msp430.c | 2 +- gcc/config/nds32/nds32-intrinsic.c | 2 +- gcc/config/nios2/nios2.c | 2 +- gcc/config/nvptx/nvptx.c | 2 +- gcc/config/pa/pa.c | 2 +- gcc/config/pru/pru.c | 2 +- gcc/config/riscv/riscv-builtins.c | 2 +- gcc/config/rs6000/rs6000-c.c | 2 +- gcc/config/rs6000/rs6000-call.c | 12 ++-- gcc/config/rs6000/rs6000.c | 4 +- gcc/config/rx/rx.c | 2 +- gcc/config/s390/s390-c.c | 2 +- gcc/config/s390/s390.c | 2 +- gcc/config/sh/sh.c | 2 +- gcc/config/sparc/sparc.c | 6 +- gcc/config/spu/spu-c.c | 2 +- gcc/config/spu/spu.c | 2 +- gcc/config/stormy16/stormy16.c | 2 +- gcc/config/tilegx/tilegx.c | 2 +- gcc/config/tilepro/tilepro.c | 2 +- gcc/config/xtensa/xtensa.c | 4 +- gcc/cp/ChangeLog | 6 ++ gcc/cp/decl.c | 3 +- gcc/cp/pt.c | 5 +- gcc/d/ChangeLog | 5 ++ gcc/d/intrinsics.cc | 5 +- gcc/fold-const.c | 3 +- gcc/ipa-param-manipulation.c | 5 +- gcc/ipa-split.c | 5 +- gcc/jit/ChangeLog | 5 ++ gcc/jit/jit-playback.c | 5 +- gcc/langhooks.c | 6 +- gcc/lto-streamer-out.c | 2 +- gcc/lto/ChangeLog | 7 +++ gcc/lto/lto-common.c | 2 +- gcc/lto/lto-symtab.c | 3 +- gcc/omp-simd-clone.c | 3 +- gcc/print-tree.c | 6 +- gcc/tree-core.h | 5 +- gcc/tree-streamer-in.c | 17 +++--- gcc/tree-streamer-out.c | 2 +- gcc/tree.h | 71 +++++++++++++++++++--- 69 files changed, 293 insertions(+), 128 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 272d0841284..989431d3921 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,88 @@ +2019-08-13 Richard Sandiford + + 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 PR middle-end/91421 diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 7a6d510e6c4..4d999a4fb84 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2019-08-13 Richard Sandiford + + 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 * 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 b484bc78532..95991bde274 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 695a9d191af..cb1a45ae815 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 cd7cccb8eb1..c3bd56cf4c6 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2019-08-13 Richard Sandiford + + PR middle-end/91421 + * c-common.c (resolve_overloaded_builtin): Use + copy_decl_built_in_function. + 2019-08-13 Martin Sebor PR c/80619 diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index cb92710f2bc..610cb905814 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 *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 ada2e4b7200..4d2897e54ed 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,8 @@ +2019-08-13 Richard Sandiford + + PR middle-end/91421 + * c-decl.c (merge_decls): Use copy_decl_built_in_function. + 2019-08-13 Richard Sandiford PR middle-end/91421 diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index 18a97db198d..31116b21308 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 28cf2ecc411..fa753697c78 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 16c1d42ea2b..2fc5cf7d450 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 2b3ea9f164c..46c058c9857 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 132af0b592a..d551af74e1e 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 3c4d89cdd08..98fbfea7efb 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 07da55e10a3..c5cdb7b5d33 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 de02910f0df..e0ba5bd47af 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 &args = * (vec*) 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 760e9371a01..ba49e3d6e88 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 319d7e2a035..d1a68321c11 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 f6c9bbfc674..516a7c719c7 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 fdd23c49bbe..e1017befaf7 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 f0c9351f083..f8a3a075319 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 7df22c8286f..2c1158f2df0 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 9b6a59dd136..9736a7586f4 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 176347cd4e6..d1d5a9435f1 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 d762d3ffe32..12362302972 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 a2a6c5cffa1..a07244e2206 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 c3be6fa0eca..ad21f1c8776 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 e0535b18b7f..45ddec13e9f 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 49fc26238a5..72e62d2f785 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 c78dc935bf3..1348591b008 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 250c6ac4b08..e54bdba8403 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 c53a1ae9f26..ce4602f786e 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 f54ca6e4abf..0ab95d84c3a 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 c764694f4f7..4e1c0815385 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 548267179a1..80169fa9887 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 7f0cdc73d9b..bd4b19d5646 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 *arglist = static_cast *> (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 832eda7cbad..62aa4bf6be4 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 d1eb08ab199..e792116fb40 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 0695f3b6538..10b8f6e81d1 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 97debdc3905..fd98a392517 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 *arglist = static_cast *> (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 24b8a5c7a0d..74f1d254a33 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 dfaeab55142..e44e46d1fad 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 0227a53861f..a15f27f442c 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 6a529631559..63120824e03 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 *fnargs = static_cast *> (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 613d30149c1..f88ad19aa6f 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 bd551100183..aec9f2df261 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 6da91390b18..575780fcccb 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 f86461f07d4..b4adfa49985 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 2b97fa2e270..a99956755ec 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 28bc2a4cec4..5c005d49a73 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2019-08-13 Richard Sandiford + + 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 PR c++/90473 - wrong code with nullptr in default argument. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index d91f25183fb..b849630e342 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 b03968febb4..17585119bce 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 5aa50a26ab5..a4db1facbf8 100644 --- a/gcc/d/ChangeLog +++ b/gcc/d/ChangeLog @@ -1,3 +1,8 @@ +2019-08-13 Richard Sandiford + + PR middle-end/91421 + * intrinsics.cc (maybe_set_intrinsic): Use set_decl_built_in_function. + 2019-08-11 Iain Buclaw PR d/90601 diff --git a/gcc/d/intrinsics.cc b/gcc/d/intrinsics.cc index 4bd321b2db7..56eab522e09 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 0bd68b5e2d4..8c711aba12a 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 11908d31a56..1af6d050c48 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 86b26d3cef3..cecfe05d0a9 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 256e93ecec6..110367ef835 100644 --- a/gcc/jit/ChangeLog +++ b/gcc/jit/ChangeLog @@ -1,3 +1,8 @@ +2019-08-13 Richard Sandiford + + PR middle-end/91421 + * jit-playback.c (new_function): Use set_decl_built_in_function. + 2019-07-22 Andrea Corallo * 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 942c7304ebf..9eeb2a71892 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 2df97f2b6ac..22ace130a62 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 47a9143ae26..b156876904d 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 *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 d150bf61ce4..2467d78f2a2 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,10 @@ +2019-08-13 Richard Sandiford + + 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 * Make-lang.in (lto.install-common): Remove unnecessary slash diff --git a/gcc/lto/lto-common.c b/gcc/lto/lto-common.c index ffa05f92f3c..9a17933d094 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 d573ea74b9f..37fa572b883 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 c8c528471a3..a0780333941 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 debea2b739d..6dcbb2dcb13 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 0979180dd0b..cfd88393c04 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 7ab72a7e0d7..dcd511e4b55 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 dbdc5d5e736..aadc56ca0db 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 dd54f4d2af5..b910c5cb475 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 **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 -- 2.30.2