> 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);