This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Cleanup DECL streaming
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: gcc-patches at gcc dot gnu dot org, rguenther at suse dot de
- Date: Thu, 21 Jun 2018 15:29:40 +0200
- Subject: Re: Cleanup DECL streaming
- References: <20180621131850.GG84841@kam.mff.cuni.cz>
> Hi,
> this patch drops DECL_ORIGINAL_TYPE streaming and also logic handling
> external decls in blocks since we no longer stream them at all.
>
> Bootstrapped/regtested x86_64-linux, OK?
Actually the patch dies with lto-bootstrap :(
0x9c44fc gen_member_die
../../gcc/dwarf2out.c:24947
0x9c4bb1 gen_struct_or_union_type_die
../../gcc/dwarf2out.c:25143
0x9c52dd gen_tagged_type_die
../../gcc/dwarf2out.c:25353
0x9c4ffe gen_typedef_die
../../gcc/dwarf2out.c:25259
0x9c6e5f gen_decl_die
../../gcc/dwarf2out.c:26248
0x9c5557 gen_type_die_with_usage
../../gcc/dwarf2out.c:25424
0x9c5bc2 gen_type_die
../../gcc/dwarf2out.c:25608
0x9a7756 modified_type_die
../../gcc/dwarf2out.c:13396
0x9bd011 add_type_attribute
../../gcc/dwarf2out.c:21523
0x9bf854 gen_subprogram_die
../../gcc/dwarf2out.c:22835
0x9c6d8c gen_decl_die
../../gcc/dwarf2out.c:26222
0x9c7db9 dwarf2out_decl
../../gcc/dwarf2out.c:26787
0x9c7e15 dwarf2out_function_decl
../../gcc/dwarf2out.c:26802
0xa65bd9 rest_of_handle_final
../../gcc/final.c:4704
0xa65d46 execute
../../gcc/final.c:4746
I am going to respawn it becuase it seems odd that stage2 built but stage3
failed. Clearly typeefs are determined by existence of original type:
/* Returns true if X is a typedef decl. */
bool
is_typedef_decl (const_tree x)
{
return (x && TREE_CODE (x) == TYPE_DECL
&& DECL_ORIGINAL_TYPE (x) != NULL_TREE);
}
/* Returns true iff TYPE is a type variant created for a typedef. */
bool
typedef_variant_p (const_tree type)
{
return is_typedef_decl (TYPE_NAME (type));
}
however aren't we supposed to not touch these at late builds? We drop most of TYPE_DECLs in favour
of IDENTIFIER_TYPE and thus also throwing away DECL_ORIGINAL_TYPEs.
Honza
>
> Honza
>
> * lto-streamer-out.c (DFS::DFS_write_tree_body): Do not
> stream DECL_ORIGINAL_TYPE.
> (DFS::DFS_write_tree_body): Drop hack handling local external decls.
> (hash_tree): Do not walk DECL_ORIGINAL_TYPE.
> * tree-streamer-in.c (lto_input_ts_decl_non_common_tree_pointers):
> Do not walk original type.
> * tree-streamer-out.c (streamer_write_chain): Drop hack handling
> external decls.
> (write_ts_decl_non_common_tree_pointers): Do not stream
> DECL_ORIGINAL_TYPE
> * tree.c (free_lang_data_in_decl): Clear DECL_ORIGINAL_TYPE.
> (find_decls_types_r): Do not walk DEC_ORIGINAL_TYPE.
>
> Index: lto-streamer-out.c
> ===================================================================
> --- lto-streamer-out.c (revision 261841)
> +++ lto-streamer-out.c (working copy)
> @@ -819,12 +819,6 @@ DFS::DFS_write_tree_body (struct output_
> DFS_follow_tree_edge (DECL_DEBUG_EXPR (expr));
> }
>
> - if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
> - {
> - if (TREE_CODE (expr) == TYPE_DECL)
> - DFS_follow_tree_edge (DECL_ORIGINAL_TYPE (expr));
> - }
> -
> if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
> {
> /* Make sure we don't inadvertently set the assembler name. */
> @@ -907,14 +901,13 @@ DFS::DFS_write_tree_body (struct output_
> if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
> {
> for (tree t = BLOCK_VARS (expr); t; t = TREE_CHAIN (t))
> - if (VAR_OR_FUNCTION_DECL_P (t)
> - && DECL_EXTERNAL (t))
> - /* We have to stream externals in the block chain as
> - non-references. See also
> - tree-streamer-out.c:streamer_write_chain. */
> - DFS_write_tree (ob, expr_state, t, ref_p, false);
> - else
> + {
> + /* We would have to stream externals in the block chain as
> + non-references but we should have dropped them in
> + free-lang-data. */
> + gcc_assert (!VAR_OR_FUNCTION_DECL_P (t) || !DECL_EXTERNAL (t));
> DFS_follow_tree_edge (t);
> + }
>
> DFS_follow_tree_edge (BLOCK_SUPERCONTEXT (expr));
>
> @@ -1261,12 +1249,6 @@ hash_tree (struct streamer_tree_cache_d
> be able to call get_symbol_initial_value. */
> }
>
> - if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
> - {
> - if (code == TYPE_DECL)
> - visit (DECL_ORIGINAL_TYPE (t));
> - }
> -
> if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
> {
> if (DECL_ASSEMBLER_NAME_SET_P (t))
> Index: tree-streamer-in.c
> ===================================================================
> --- tree-streamer-in.c (revision 261841)
> +++ tree-streamer-in.c (working copy)
> @@ -728,11 +721,9 @@ lto_input_ts_decl_common_tree_pointers (
> file being read. */
>
> static void
> -lto_input_ts_decl_non_common_tree_pointers (struct lto_input_block *ib,
> - struct data_in *data_in, tree expr)
> +lto_input_ts_decl_non_common_tree_pointers (struct lto_input_block *,
> + struct data_in *, tree)
> {
> - if (TREE_CODE (expr) == TYPE_DECL)
> - DECL_ORIGINAL_TYPE (expr) = stream_read_tree (ib, data_in);
> }
>
>
> Index: tree-streamer-out.c
> ===================================================================
> --- tree-streamer-out.c (revision 261841)
> +++ tree-streamer-out.c (working copy)
> @@ -497,14 +494,10 @@ streamer_write_chain (struct output_bloc
> {
> /* We avoid outputting external vars or functions by reference
> to the global decls section as we do not want to have them
> - enter decl merging. This is, of course, only for the call
> - for streaming BLOCK_VARS, but other callers are safe.
> - See also lto-streamer-out.c:DFS_write_tree_body. */
> - if (VAR_OR_FUNCTION_DECL_P (t)
> - && DECL_EXTERNAL (t))
> - stream_write_tree_shallow_non_ref (ob, t, ref_p);
> - else
> - stream_write_tree (ob, t, ref_p);
> + enter decl merging. We should not need to do this anymore because
> + free_lang_data removes them from block scopes. */
> + gcc_assert (!VAR_OR_FUNCTION_DECL_P (t) || !DECL_EXTERNAL (t));
> + stream_write_tree (ob, t, ref_p);
>
> t = TREE_CHAIN (t);
> }
> @@ -620,11 +613,8 @@ write_ts_decl_common_tree_pointers (stru
> pointer fields. */
>
> static void
> -write_ts_decl_non_common_tree_pointers (struct output_block *ob, tree expr,
> - bool ref_p)
> +write_ts_decl_non_common_tree_pointers (struct output_block *, tree, bool)
> {
> - if (TREE_CODE (expr) == TYPE_DECL)
> - stream_write_tree (ob, DECL_ORIGINAL_TYPE (expr), ref_p);
> }
>
>
> Index: tree.c
> ===================================================================
> --- tree.c (revision 261841)
> +++ tree.c (working copy)
> @@ -5359,6 +5357,7 @@ free_lang_data_in_decl (tree decl)
> DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
> DECL_VISIBILITY_SPECIFIED (decl) = 0;
> DECL_INITIAL (decl) = NULL_TREE;
> + DECL_ORIGINAL_TYPE (decl) = NULL_TREE;
> }
> else if (TREE_CODE (decl) == FIELD_DECL)
> DECL_INITIAL (decl) = NULL_TREE;
> @@ -5471,10 +5470,6 @@ find_decls_types_r (tree *tp, int *ws, v
> fld_worklist_push (DECL_ARGUMENTS (t), fld);
> fld_worklist_push (DECL_RESULT (t), fld);
> }
> - else if (TREE_CODE (t) == TYPE_DECL)
> - {
> - fld_worklist_push (DECL_ORIGINAL_TYPE (t), fld);
> - }
> else if (TREE_CODE (t) == FIELD_DECL)
> {
> fld_worklist_push (DECL_FIELD_OFFSET (t), fld);