> > 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. > > We keep quite a bit of TYPE_DECLs around for devirt.
I know, but we do not keep them systematicaly enough to make them useful for dwarf2out. So I would say dwarf2out touching them is a bug. > > We shouldn't (very often...) end up trying to emit type DIEs late. > Here we're running into > > /* If the prototype had an 'auto' or 'decltype(auto)' return > type, > emit the real type on the definition die. */ > if (is_cxx () && debug_info_level > DINFO_LEVEL_TERSE) > { > dw_die_ref die = get_AT_ref (old_die, DW_AT_type); > > but that's odd since get_AT_ref shoudn't be able to lookup DW_AT_type > in lto1. > > So a testcase would be nice to have... OK, I will try to debug into it. Testcase is of course easy - apply patch and run lto bootstrap :) Honza > > Richard. > > > > 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); > > > > > > -- > Richard Biener <rguent...@suse.de> > SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB > 21284 (AG Nuernberg)