]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Use checking forms of DECL_FUNCTION_CODE (PR 91421)
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 13 Aug 2019 21:35:20 +0000 (21:35 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 13 Aug 2019 21:35:20 +0000 (21:35 +0000)
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

69 files changed:
gcc/ChangeLog
gcc/ada/ChangeLog
gcc/ada/gcc-interface/trans.c
gcc/builtins.c
gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/c/ChangeLog
gcc/c/c-decl.c
gcc/cgraphclones.c
gcc/config/aarch64/aarch64-builtins.c
gcc/config/aarch64/aarch64.c
gcc/config/alpha/alpha.c
gcc/config/arc/arc.c
gcc/config/arm/arm-builtins.c
gcc/config/avr/avr-c.c
gcc/config/avr/avr.c
gcc/config/bfin/bfin.c
gcc/config/c6x/c6x.c
gcc/config/darwin.c
gcc/config/frv/frv.c
gcc/config/gcn/gcn.c
gcc/config/i386/i386-builtins.c
gcc/config/i386/i386-expand.c
gcc/config/i386/i386.c
gcc/config/ia64/ia64.c
gcc/config/iq2000/iq2000.c
gcc/config/mips/mips.c
gcc/config/msp430/msp430.c
gcc/config/nds32/nds32-intrinsic.c
gcc/config/nios2/nios2.c
gcc/config/nvptx/nvptx.c
gcc/config/pa/pa.c
gcc/config/pru/pru.c
gcc/config/riscv/riscv-builtins.c
gcc/config/rs6000/rs6000-c.c
gcc/config/rs6000/rs6000-call.c
gcc/config/rs6000/rs6000.c
gcc/config/rx/rx.c
gcc/config/s390/s390-c.c
gcc/config/s390/s390.c
gcc/config/sh/sh.c
gcc/config/sparc/sparc.c
gcc/config/spu/spu-c.c
gcc/config/spu/spu.c
gcc/config/stormy16/stormy16.c
gcc/config/tilegx/tilegx.c
gcc/config/tilepro/tilepro.c
gcc/config/xtensa/xtensa.c
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/pt.c
gcc/d/ChangeLog
gcc/d/intrinsics.cc
gcc/fold-const.c
gcc/ipa-param-manipulation.c
gcc/ipa-split.c
gcc/jit/ChangeLog
gcc/jit/jit-playback.c
gcc/langhooks.c
gcc/lto-streamer-out.c
gcc/lto/ChangeLog
gcc/lto/lto-common.c
gcc/lto/lto-symtab.c
gcc/omp-simd-clone.c
gcc/print-tree.c
gcc/tree-core.h
gcc/tree-streamer-in.c
gcc/tree-streamer-out.c
gcc/tree.h

index 272d084128486526c573d641fb3a63b76ecabc13..989431d39218d06b5efa2d995f557820cded08a2 100644 (file)
@@ -1,3 +1,88 @@
+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
index 7a6d510e6c4bed016a747d1a016b92645e3bd332..4d999a4fb84469ac97f31476f9a37a54221f1530 100644 (file)
@@ -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.
index b484bc78532a62e293eea29878c1e4e51d5364d8..95991bde274b36191e631553d4a73ce17a02713b 100644 (file)
@@ -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;
index 695a9d191af4c4922351e3e59601a87b3fedda5c..cb1a45ae8154d51619d08cda1ad3f7b289e84fcd 100644 (file)
@@ -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);
 
index cd7cccb8eb1adf2e41300e5ebde420b918325f7b..c3bd56cf4c6203d63fe6798d43d92842101ed183 100644 (file)
@@ -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
index cb92710f2bc62e894592fac84cfc8f04d7e15fd7..610cb905814fbcb34dbc0708ae5f7b187b0efca6 100644 (file)
@@ -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:
index ada2e4b7200f8c2e754a9af0045d7cfb47edc145..4d2897e54edb231b1c6ef2e3bc1be590ddca611d 100644 (file)
@@ -1,3 +1,8 @@
+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
index 18a97db198daf96391723e2ebbbfa1ea732072ca..31116b21308dbae4f7cf9be12875f6f470cb3964 100644 (file)
@@ -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)
            {
index 28cf2ecc41130c033bb7849655a67995a9fa8bb6..fa753697c787d7868369a9ec97c6a1fb59191aba 100644 (file)
@@ -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;
index 16c1d42ea2be0f477692be592e30ba8ce27f05a7..2fc5cf7d450fc3257f9eb33088fbb99ce885f428 100644 (file)
@@ -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)
index 2b3ea9f164c208fb0bad3e9f060c443f8bffc6e1..46c058c98579e7bf55ff4ffa3d7f330598f795e9 100644 (file)
@@ -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
index 132af0b592a16afd1664a146ec901c767937d8fd..d551af74e1ee5dc7ca0103571afc89823814f14e 100644 (file)
@@ -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);
index 3c4d89cdd0811e297fb126f0b9535992b2dd0d83..98fbfea7efb18ae32f6b3da45578cfaab371193f 100644 (file)
@@ -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;
index 07da55e10a36fd50adbac9b69eb9c77c6513465f..c5cdb7b5d339748bbf5d1f26a9de676b702b5c1b 100644 (file)
@@ -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;
index de02910f0df75a1f64f8fa86bf84b48f46dacaae..e0ba5bd47af187b03f0a16ec45642071624a227e 100644 (file)
@@ -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;
index 760e9371a01237aaf5f0c9bbae2ea5bd42eceb81..ba49e3d6e88b6645495786ca9be7ec1d6c8aa1a6 100644 (file)
@@ -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)
index 319d7e2a03538a7b07dc2f3a191bcb336c37ef49..d1a68321c11e987047c8f650b6ef6c07a7d74874 100644 (file)
@@ -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;
index f6c9bbfc674fe7513869601989eecbafad6db0e1..516a7c719c7dc5d24a737575f9d23d714abca0d5 100644 (file)
@@ -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)
index fdd23c49bbe4eb925b29a2643410f2c126de9f8c..e1017befaf750bcffac8929035778aba1c01cf0c 100644 (file)
@@ -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)
     {
index f0c9351f0835f8bfd6a81c3fb57685f993ae2412..f8a3a0753196ca324f48d138a1427b2fcb5fdd02 100644 (file)
@@ -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;
 
index 7df22c8286fa2ad4ced3d7b0be7526a14f5170cd..2c1158f2df0a91d16733ea045b48bf9e92d940ff 100644 (file)
@@ -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);
index 9b6a59dd13651102c2be323f82bdadecb4149944..9736a7586f460b0c707de4f598bb80232fb6eb22 100644 (file)
@@ -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 ();
index 176347cd4e6df429afa9d339347edc90fe49dd17..d1d5a9435f132b6929284546834b58fa0f52da74 100644 (file)
@@ -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:
index d762d3ffe3285330ba792c070928534682a129a3..1236230297210991acffafb80fd058b0b9cff0bf 100644 (file)
@@ -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;
index a2a6c5cffa18dd112c1fcd25dbcd7940da3e3855..a07244e2206226852682072b18444c130de063c8 100644 (file)
@@ -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)
     {
index c3be6fa0eca9a162c6787c5a1995c959e7223529..ad21f1c87763bc17c9495bb0a03f735469463bed 100644 (file)
@@ -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;
index e0535b18b7f00760d3d23bcd568f59e0296178fd..45ddec13e9f47c90833db81e74c4d9ca456a272c 100644 (file)
@@ -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 ();
index 49fc26238a520ddc3e2448498b74f1aca4c01ad0..72e62d2f785962d10541707d8380237d39719492 100644 (file)
@@ -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)
index c78dc935bf3e671d1a40d4bd5adc6f6d6d56b44e..1348591b008ac763d04075dda70e349bafb0ac62 100644 (file)
@@ -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;
 
index 250c6ac4b08c96b645accbc205b8f4a7903734de..e54bdba8403b6fb29f5ab7d86e8c86b56bb39f12 100644 (file)
@@ -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)
     {
index c53a1ae9f26abf9d05231b9bb84753e4e9403a2f..ce4602f786e1329309c78ffa9949169a9ae1bd4e 100644 (file)
@@ -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:
index f54ca6e4abf25daf52a7483b1db37caf860f0d83..0ab95d84c3a66809e89c3bf23fca175f590be276 100644 (file)
@@ -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)
     {
index c764694f4f78982ab1339d5f2e56d19ec512dcfc..4e1c081538502966f1810e7f509a8f8b64e970cd 100644 (file)
@@ -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)
index 548267179a1af18e3815171f9c87b546d641d8a2..80169fa9887b2d522f7f496d14f40a72db31dfc9 100644 (file)
@@ -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)
index 7f0cdc73d9b16268bea74faab5043dcfe2921d0e..bd4b19d5646008a1e25fb1693d7499a523079146 100644 (file)
@@ -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;
index 832eda7cbadec5f499aab94bc68fc6ad684c8faa..62aa4bf6be4e688898877fd054c4fe5f37b5067a 100644 (file)
@@ -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;
index d1eb08ab199f3aa4adc58c9ab16412d5093ccc5a..e792116fb402f3d0e5187e11f9c74676cc7e8e50 100644 (file)
@@ -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))
index 0695f3b653851a8b5139baf71002c09f7deae75c..10b8f6e81d128ab7981505dd1d87e67181f61adf 100644 (file)
@@ -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)
     {
index 97debdc3905cac765705fdae01645a467cbff612..fd98a392517bc180d70b60cecf8b5e3b576eb3de 100644 (file)
@@ -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;
index 24b8a5c7a0df1c9a86258c48518112f71c225674..74f1d254a33a3959dc997cfed4eb3b085206fe85 100644 (file)
@@ -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;
index dfaeab5514281491b294b26b8548c9fb89266bbb..e44e46d1fad25b84d0caa00326e0cfa0fc2d2145 100644 (file)
@@ -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;
index 0227a53861fb4dc820e183db7e7687317d4e711d..a15f27f442c1fe523334a8872337fda7cb0214cd 100644 (file)
@@ -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;
 
index 6a529631559015a39f0a141ec5f2dff72952106f..63120824e031e081429d2847ee7331710f79cc80 100644 (file)
@@ -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;
 
index 613d30149c15cb506b05ea8b8aba1a3676b3f4bb..f88ad19aa6f7e8fb2451c650c8bad93d8fd499ad 100644 (file)
@@ -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)
index bd551100183f0cd4c760d3909c2aabafed6e31af..aec9f2df2614a584d1111a30f73790c17eb5df3e 100644 (file)
@@ -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++)
index 6da91390b18164900bc5deb4f1befbf87c6e5d2a..575780fcccb4befda0392fb853b265f943d30031 100644 (file)
@@ -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;
index f86461f07d46b362b595eac473b4f62d5b1c07db..b4adfa49985f221d193cf7a4f9ea56004e45a450 100644 (file)
@@ -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;
index 2b97fa2e270255de0892a1c58ed56e1df2cb467d..a99956755ec0bc5d5bb9152ac3190ff48132d9b8 100644 (file)
@@ -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)
     {
index 28bc2a4cec414cd8aea9c12804c8fe42ac75deeb..5c005d49a730482d36d5ffeb93de4d960655f8fe 100644 (file)
@@ -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.
index d91f25183fb5e09915f5449283f2bd694becae6d..b849630e3421065e9314d8c5136fef2a46b24302 100644 (file)
@@ -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);
index b03968febb4ea1218b2c07ff1c77460512c943ba..17585119bceb2e6416b548676e07059aa911a208 100644 (file)
@@ -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.  */
index 5aa50a26ab506fdf106646ba07e3b580eba07b1b..a4db1facbf844b6a2aad5d67659b391bd852d1f1 100644 (file)
@@ -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
index 4bd321b2db764b72294501a86ba86726704ea10d..56eab522e09d347573c03a93e782ec4b10416f50 100644 (file)
@@ -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.  */
index 0bd68b5e2d484d6f3be52b1d38be5a9f41637355..8c711aba12a9e4ac08f728218e3a9643e3c241bc 100644 (file)
@@ -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)
index 11908d31a566945f621949ea53f9cd448db63be2..1af6d050c486d81074aa6226234771364225126c 100644 (file)
@@ -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;
index 86b26d3cef37771daa197376842355d54757dbc4..cecfe05d0a9bdeb8cb0d4fa5ef851f1b63d8f91e 100644 (file)
@@ -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
index 256e93ecec6f71aeadf51b05324e8a89423e8f39..110367ef835998b673484dc42478f80a585131cd 100644 (file)
@@ -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.
index 942c7304ebf78774d77bc2f7425a491ce1ef8194..9eeb2a71892ab29bf44a883289b1193c9e305ea6 100644 (file)
@@ -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));
 
index 2df97f2b6ac5ca2f7e3d78c28143a2d3e9acb6dd..22ace130a627aa02d5eb6dd104cee9c64f1bde62 100644 (file)
@@ -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)
     {
index 47a9143ae2691852d73d0bf5a40e84cf3f113f0f..b156876904d3adfd3b0ee6e8a87202aec7583df1 100644 (file)
@@ -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))
index d150bf61ce401580a9d750f572cc427f93a52602..2467d78f2a26bd5fc322921c1b7af736be68232c 100644 (file)
@@ -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
index ffa05f92f3c968280955b555015d8c24765f6ff4..9a17933d094b212cd28242cb8e5289d8f8c6217f 100644 (file)
@@ -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))
index d573ea74b9f53e06ae52082ad4166c685f5d8d43..37fa572b88393eb17ba7ce87e9b8b2092fba7465 100644 (file)
@@ -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; "
index c8c528471a3a2e6bf0a288ba25a9e9ef3ea99198..a0780333941e19684841dbabf6df71745954e63e 100644 (file)
@@ -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);
index debea2b739da8d229998cbf125b61a9fff6a2f8d..6dcbb2dcb1369a0f0fb7fbcdff9322807d868d32 100644 (file)
@@ -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)],
index 0979180dd0b5c081887f7b7ca2beb7e4cb143ac2..cfd88393c04ed48b8e44bb767944c542a99a1359 100644 (file)
@@ -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;
index 7ab72a7e0d7689b5bfd3fede487e301b16a536ac..dcd511e4b55fbe7bf6fa25efd4aa18646d16a740 100644 (file)
@@ -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);
 }
 
 
index dbdc5d5e7365617c0a656fba8b7979db266a52f5..aadc56ca0db176e733a3a1cb684c276d38963a57 100644 (file)
@@ -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);
 }
 
 
index dd54f4d2af5be51ad41d431dfbfebf5cd57d3bd4..b910c5cb4759b4e45ba19b9344249cf097fa9a7d 100644 (file)
@@ -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