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

Reply via email to