cgraph.c (cgraph_node::verify_node): Compare against builtin by using DECL_BUILT_IN_C...
authorRichard Biener <rguenther@suse.de>
Mon, 25 Jul 2016 12:35:08 +0000 (12:35 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 25 Jul 2016 12:35:08 +0000 (12:35 +0000)
2016-07-25  Richard Biener  <rguenther@suse.de>

* cgraph.c (cgraph_node::verify_node): Compare against builtin
by using DECL_BUILT_IN_CLASS and DECL_FUNCTION_CODE.
* tree-chkp.c (chkp_gimple_call_builtin_p): Likewise.
* tree-streamer.h (streamer_handle_as_builtin_p): Remove.
(streamer_get_builtin_tree): Likewise.
(streamer_write_builtin): Likewise.
* lto-streamer.h (LTO_builtin_decl): Remove.
* lto-streamer-in.c (lto_read_tree_1): Remove assert.
(lto_input_scc): Remove LTO_builtin_decl handling.
(lto_input_tree_1): Liekwise.
* lto-streamer-out.c (lto_output_tree_1): Remove special
handling of builtins.
(DFS::DFS): Likewise.
* tree-streamer-in.c (streamer_get_builtin_tree): Remove.
* tree-streamer-out.c (pack_ts_function_decl_value_fields): Remove
assert.
(streamer_write_builtin): Remove.

lto/
* lto.c (compare_tree_sccs_1): Remove streamer_handle_as_builtin_p uses.
(unify_scc): Likewise.
(lto_read_decls): Likewise.

From-SVN: r238709

gcc/ChangeLog
gcc/cgraph.c
gcc/lto-streamer-in.c
gcc/lto-streamer-out.c
gcc/lto-streamer.h
gcc/lto/ChangeLog
gcc/lto/lto.c
gcc/tree-chkp.c
gcc/tree-streamer-in.c
gcc/tree-streamer-out.c
gcc/tree-streamer.h

index e8952cbba74eb4a63239b69880a2ee78d9fc5b8e..b55a00c9b3bd1d9df1da6445c8685bcc517b8432 100644 (file)
@@ -1,3 +1,23 @@
+2016-07-25  Richard Biener  <rguenther@suse.de>
+
+       * cgraph.c (cgraph_node::verify_node): Compare against builtin
+       by using DECL_BUILT_IN_CLASS and DECL_FUNCTION_CODE.
+       * tree-chkp.c (chkp_gimple_call_builtin_p): Likewise.
+       * tree-streamer.h (streamer_handle_as_builtin_p): Remove.
+       (streamer_get_builtin_tree): Likewise.
+       (streamer_write_builtin): Likewise.
+       * lto-streamer.h (LTO_builtin_decl): Remove.
+       * lto-streamer-in.c (lto_read_tree_1): Remove assert.
+       (lto_input_scc): Remove LTO_builtin_decl handling.
+       (lto_input_tree_1): Liekwise.
+       * lto-streamer-out.c (lto_output_tree_1): Remove special
+       handling of builtins.
+       (DFS::DFS): Likewise.
+       * tree-streamer-in.c (streamer_get_builtin_tree): Remove.
+       * tree-streamer-out.c (pack_ts_function_decl_value_fields): Remove
+       assert.
+       (streamer_write_builtin): Remove.
+
 2016-07-25  Martin Liska  <mliska@suse.cz>
 
        * lto-cgraph.c (input_symtab): Don't call get_working_sets
index e256dd05d357475dd7b0372e1b3307e9d97e9ebc..9bc5b6b7c514a5ac7041587a7e1e3f753bb20b22 100644 (file)
@@ -3136,8 +3136,9 @@ cgraph_node::verify_node (void)
          && !e->speculative
          /* Optimized out calls are redirected to __builtin_unreachable.  */
          && (e->frequency
-             || e->callee->decl
-                != builtin_decl_implicit (BUILT_IN_UNREACHABLE))
+             || ! e->callee->decl
+             || DECL_BUILT_IN_CLASS (e->callee->decl) != BUILT_IN_NORMAL
+             || DECL_FUNCTION_CODE (e->callee->decl) != BUILT_IN_UNREACHABLE)
          && (e->frequency
              != compute_call_stmt_bb_frequency (e->caller->decl,
                                                 gimple_bb (e->call_stmt))))
index 00db94eac6bead812e4b2c81fecec278ccdcf873..1d56d21fcfdd3c22b38f510bc9da30cad9340164 100644 (file)
@@ -1302,10 +1302,6 @@ lto_read_tree_1 (struct lto_input_block *ib, struct data_in *data_in, tree expr)
       && TREE_CODE (expr) != TRANSLATION_UNIT_DECL)
     DECL_INITIAL (expr) = stream_read_tree (ib, data_in);
 
-  /* We should never try to instantiate an MD or NORMAL builtin here.  */
-  if (TREE_CODE (expr) == FUNCTION_DECL)
-    gcc_assert (!streamer_handle_as_builtin_p (expr));
-
 #ifdef LTO_STREAMER_DEBUG
   /* Remove the mapping to RESULT's original address set by
      streamer_alloc_tree.  */
@@ -1368,7 +1364,6 @@ lto_input_scc (struct lto_input_block *ib, struct data_in *data_in,
          if (tag == LTO_null
              || (tag >= LTO_field_decl_ref && tag <= LTO_global_decl_ref)
              || tag == LTO_tree_pickle_reference
-             || tag == LTO_builtin_decl
              || tag == LTO_integer_cst
              || tag == LTO_tree_scc)
            gcc_unreachable ();
@@ -1420,12 +1415,6 @@ lto_input_tree_1 (struct lto_input_block *ib, struct data_in *data_in,
         the reader cache.  */
       result = streamer_get_pickled_tree (ib, data_in);
     }
-  else if (tag == LTO_builtin_decl)
-    {
-      /* If we are going to read a built-in function, all we need is
-        the code and class.  */
-      result = streamer_get_builtin_tree (ib, data_in);
-    }
   else if (tag == LTO_integer_cst)
     {
       /* For shared integer constants in singletons we can use the
index e243337d8e90b427bbbc5d3c06034965410c65c9..aa6b5892ea5955cdfcfe34df7d2b1e6a0f5c6905 100644 (file)
@@ -445,17 +445,8 @@ lto_output_tree_1 (struct output_block *ob, tree expr, hashval_t hash,
   bool exists_p = streamer_tree_cache_insert (ob->writer_cache,
                                              expr, hash, &ix);
   gcc_assert (!exists_p);
-  if (streamer_handle_as_builtin_p (expr))
-    {
-      /* MD and NORMAL builtins do not need to be written out
-        completely as they are always instantiated by the
-        compiler on startup.  The only builtins that need to
-        be written out are BUILT_IN_FRONTEND.  For all other
-        builtins, we simply write the class and code.  */
-      streamer_write_builtin (ob, expr);
-    }
-  else if (TREE_CODE (expr) == INTEGER_CST
-          && !TREE_OVERFLOW (expr))
+  if (TREE_CODE (expr) == INTEGER_CST
+      && !TREE_OVERFLOW (expr))
     {
       /* Shared INTEGER_CST nodes are special because they need their
         original type to be materialized by the reader (to implement
@@ -559,10 +550,8 @@ DFS::DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
          cstate->low = cstate->dfsnum;
          w.cstate = cstate;
 
-         if (streamer_handle_as_builtin_p (expr))
-           ;
-         else if (TREE_CODE (expr) == INTEGER_CST
-                  && !TREE_OVERFLOW (expr))
+         if (TREE_CODE (expr) == INTEGER_CST
+             && !TREE_OVERFLOW (expr))
            DFS_write_tree (ob, cstate, TREE_TYPE (expr), ref_p, ref_p);
          else
            {
@@ -675,8 +664,6 @@ DFS::DFS (struct output_block *ob, tree expr, bool ref_p, bool this_ref_p,
                                    "in LTO streams",
                                    get_tree_code_name (TREE_CODE (t)));
 
-                 gcc_checking_assert (!streamer_handle_as_builtin_p (t));
-
                  /* Write the header, containing everything needed to
                     materialize EXPR on the reading side.  */
                  streamer_write_tree_header (ob, t);
@@ -2074,7 +2061,9 @@ output_function (struct cgraph_node *node)
   streamer_write_chain (ob, DECL_ARGUMENTS (function), true);
 
   /* Output DECL_INITIAL for the function, which contains the tree of
-     lexical scopes.  */
+     lexical scopes.
+     ???  This only streams the outermost block because we do not
+     recurse into BLOCK_SUBBLOCKS but re-build those on stream-in.  */
   stream_write_tree (ob, DECL_INITIAL (function), true);
 
   /* We also stream abstract functions where we stream only stuff needed for
index 92efdb8e00814123a5dc3ca34876a768964155b6..ecc1e5d58e55b6e1e463d7f05fa8545672f54b02 100644 (file)
@@ -162,9 +162,6 @@ enum LTO_tags
   /* EH region holding the previous statement.  */
   LTO_eh_region,
 
-  /* An MD or NORMAL builtin.  Only the code and class are streamed out.  */
-  LTO_builtin_decl,
-
   /* Shared INTEGER_CST node.  */
   LTO_integer_cst,
 
index 49699096606505c272b1fcf1627e1e3d582fea08..86cc8b134597066e0b09512504e40d8b6ea3bef8 100644 (file)
@@ -1,3 +1,9 @@
+2016-07-25  Richard Biener  <rguenther@suse.de>
+
+       * lto.c (compare_tree_sccs_1): Remove streamer_handle_as_builtin_p uses.
+       (unify_scc): Likewise.
+       (lto_read_decls): Likewise.
+
 2016-06-28  Jakub Jelinek  <jakub@redhat.com>
 
        * Make-lang.in: Don't cat ../stage_current if it does not exist.
index af735cb179333e063ebb96da756d1fe5a0f8e4ef..73d1e26be71bddca03439e36ec6f61083c29deda 100644 (file)
@@ -1061,12 +1061,6 @@ compare_tree_sccs_1 (tree t1, tree t2, tree **map)
                        TREE_FIXED_CST_PTR (t1), TREE_FIXED_CST_PTR (t2)))
       return false;
 
-
-  /* We want to compare locations up to the point where it makes
-     a difference for streaming - thus whether the decl is builtin or not.  */
-  if (CODE_CONTAINS_STRUCT (code, TS_DECL_MINIMAL))
-    compare_values (streamer_handle_as_builtin_p);
-
   if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
     {
       compare_values (DECL_MODE);
@@ -1602,8 +1596,7 @@ unify_scc (struct data_in *data_in, unsigned from,
                   streamer.  The others should be singletons, too, and we
                   should not merge them in any way.  */
                gcc_assert (code != TRANSLATION_UNIT_DECL
-                           && code != IDENTIFIER_NODE
-                           && !streamer_handle_as_builtin_p (t));
+                           && code != IDENTIFIER_NODE);
              }
 
          /* Fixup the streamer cache with the prevailing nodes according
@@ -1710,8 +1703,7 @@ lto_read_decls (struct lto_file_decl_data *decl_data, const void *data,
          if (len == 1
              && (TREE_CODE (first) == IDENTIFIER_NODE
                  || TREE_CODE (first) == INTEGER_CST
-                 || TREE_CODE (first) == TRANSLATION_UNIT_DECL
-                 || streamer_handle_as_builtin_p (first)))
+                 || TREE_CODE (first) == TRANSLATION_UNIT_DECL))
            continue;
 
          /* Try to unify the SCC with already existing ones.  */
index 4ca2d34607c664f19a01ffdb7dacdf58d1343bc9..44d6d702607a5ce44568a6efd66ebdf4a7024694 100644 (file)
@@ -431,9 +431,10 @@ chkp_gimple_call_builtin_p (gimple *call,
                            enum built_in_function code)
 {
   tree fndecl;
-  if (is_gimple_call (call)
+  if (gimple_call_builtin_p (call, BUILT_IN_MD)
       && (fndecl = targetm.builtin_chkp_function (code))
-      && gimple_call_fndecl (call) == fndecl)
+      && (DECL_FUNCTION_CODE (gimple_call_fndecl (call))
+         == DECL_FUNCTION_CODE (fndecl)))
     return true;
   return false;
 }
index 2ad2f9212fa163116e2e9b5f88295309c2d7e994..671ce31d3019c8ee4d24465e5919c6d8d82f0e4d 100644 (file)
@@ -1113,62 +1113,3 @@ streamer_get_pickled_tree (struct lto_input_block *ib, struct data_in *data_in)
 
   return result;
 }
-
-
-/* Read a code and class from input block IB and return the
-   corresponding builtin.  DATA_IN is as in stream_read_tree.  */
-
-tree
-streamer_get_builtin_tree (struct lto_input_block *ib, struct data_in *data_in)
-{
-  enum built_in_class fclass;
-  enum built_in_function fcode;
-  const char *asmname;
-  tree result;
-
-  fclass = streamer_read_enum (ib, built_in_class, BUILT_IN_LAST);
-  gcc_assert (fclass == BUILT_IN_NORMAL || fclass == BUILT_IN_MD);
-
-  fcode = (enum built_in_function) streamer_read_uhwi (ib);
-
-  if (fclass == BUILT_IN_NORMAL)
-    {
-      if (fcode >= END_BUILTINS)
-       fatal_error (input_location,
-                    "machine independent builtin code out of range");
-      result = builtin_decl_explicit (fcode);
-      if (!result)
-       {
-         if (fcode > BEGIN_CHKP_BUILTINS && fcode < END_CHKP_BUILTINS)
-           {
-             fcode = (enum built_in_function)
-                     (fcode - BEGIN_CHKP_BUILTINS - 1);
-             result = builtin_decl_explicit (fcode);
-             result = chkp_maybe_clone_builtin_fndecl (result);
-           }
-         else if (fcode > BEGIN_SANITIZER_BUILTINS
-                  && fcode < END_SANITIZER_BUILTINS)
-           {
-             initialize_sanitizer_builtins ();
-             result = builtin_decl_explicit (fcode);
-           }
-       }
-      gcc_assert (result);
-    }
-  else if (fclass == BUILT_IN_MD)
-    {
-      result = targetm.builtin_decl (fcode, true);
-      if (!result || result == error_mark_node)
-       fatal_error (input_location, "target specific builtin not available");
-    }
-  else
-    gcc_unreachable ();
-
-  asmname = streamer_read_string (data_in, ib);
-  if (asmname)
-    set_builtin_user_assembler_name (result, asmname);
-
-  streamer_tree_cache_append (data_in->reader_cache, result, 0);
-
-  return result;
-}
index a70666b2fd4bdd993668cb6b95da8924fae60e1f..887448e58085619a221f25a3f858db071423aae1 100644 (file)
@@ -278,10 +278,6 @@ pack_ts_decl_with_vis_value_fields (struct bitpack_d *bp, tree expr)
 static void
 pack_ts_function_decl_value_fields (struct bitpack_d *bp, tree expr)
 {
-  /* For normal/md builtins we only write the class and code, so they
-     should never be handled here.  */
-  gcc_assert (!streamer_handle_as_builtin_p (expr));
-
   bp_pack_enum (bp, built_in_class, BUILT_IN_LAST,
                DECL_BUILT_IN_CLASS (expr));
   bp_pack_value (bp, DECL_STATIC_CONSTRUCTOR (expr), 1);
@@ -487,41 +483,6 @@ streamer_write_tree_bitfields (struct output_block *ob, tree expr)
 }
 
 
-/* Write the code and class of builtin EXPR to output block OB.  IX is
-   the index into the streamer cache where EXPR is stored.*/
-
-void
-streamer_write_builtin (struct output_block *ob, tree expr)
-{
-  gcc_assert (streamer_handle_as_builtin_p (expr));
-
-  if (DECL_BUILT_IN_CLASS (expr) == BUILT_IN_MD
-      && !targetm.builtin_decl)
-    sorry ("tree bytecode streams do not support machine specific builtin "
-          "functions on this target");
-
-  streamer_write_record_start (ob, LTO_builtin_decl);
-  streamer_write_enum (ob->main_stream, built_in_class, BUILT_IN_LAST,
-                      DECL_BUILT_IN_CLASS (expr));
-  streamer_write_uhwi (ob, DECL_FUNCTION_CODE (expr));
-
-  if (DECL_ASSEMBLER_NAME_SET_P (expr))
-    {
-      /* When the assembler name of a builtin gets a user name,
-        the new name is always prefixed with '*' by
-        set_builtin_user_assembler_name.  So, to prevent the
-        reader side from adding a second '*', we omit it here.  */
-      const char *str = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (expr));
-      if (strlen (str) > 1 && str[0] == '*')
-       streamer_write_string (ob, ob->main_stream, &str[1], true);
-      else
-       streamer_write_string (ob, ob->main_stream, NULL, true);
-    }
-  else
-    streamer_write_string (ob, ob->main_stream, NULL, true);
-}
-
-
 /* Emit the chain of tree nodes starting at T.  OB is the output block
    to write to.  REF_P is true if chain elements should be emitted
    as references.  */
index 41a76a28eb50084a0d9b85ef3ff04462db81d8b3..1daf259d3355b82a561499f55ed015c1e30c3897 100644 (file)
@@ -57,17 +57,6 @@ struct streamer_tree_cache_d
   unsigned next_idx;
 };
 
-/* Return true if tree node EXPR should be streamed as a builtin.  For
-   these nodes, we just emit the class and function code.  */
-static inline bool
-streamer_handle_as_builtin_p (tree expr)
-{
-  return (TREE_CODE (expr) == FUNCTION_DECL
-         && DECL_IS_BUILTIN (expr)
-         && (DECL_BUILT_IN_CLASS (expr) == BUILT_IN_NORMAL
-             || DECL_BUILT_IN_CLASS (expr) == BUILT_IN_MD));
-}
-
 /* In tree-streamer-in.c.  */
 tree streamer_read_string_cst (struct data_in *, struct lto_input_block *);
 tree streamer_read_chain (struct lto_input_block *, struct data_in *);
@@ -75,7 +64,6 @@ tree streamer_alloc_tree (struct lto_input_block *, struct data_in *,
                          enum LTO_tags);
 void streamer_read_tree_body (struct lto_input_block *, struct data_in *, tree);
 tree streamer_get_pickled_tree (struct lto_input_block *, struct data_in *);
-tree streamer_get_builtin_tree (struct lto_input_block *, struct data_in *);
 void streamer_read_tree_bitfields (struct lto_input_block *,
                                   struct data_in *, tree);
 
@@ -87,7 +75,6 @@ void streamer_write_tree_header (struct output_block *, tree);
 void streamer_write_tree_bitfields (struct output_block *, tree);
 void streamer_write_tree_body (struct output_block *, tree, bool);
 void streamer_write_integer_cst (struct output_block *, tree, bool);
-void streamer_write_builtin (struct output_block *, tree);
 
 /* In tree-streamer.c.  */
 extern unsigned char streamer_mode_table[1 << 8];