[PATCH] Combine location with block using block_locations

Michael Matz matz@suse.de
Tue Sep 11 13:30:00 GMT 2012


Hi,

On Tue, 11 Sep 2012, Richard Guenther wrote:

> >>> +++ gcc/lto/lto.c       (working copy)
> >>> @@ -1559,8 +1559,6 @@ lto_fixup_prevailing_decls (tree t)
> >>>  {
> >>>    enum tree_code code = TREE_CODE (t);
> >>>    LTO_NO_PREVAIL (TREE_TYPE (t));
> >>> -  if (CODE_CONTAINS_STRUCT (code, TS_COMMON))
> >>> -    LTO_NO_PREVAIL (TREE_CHAIN (t));
> >>
> >> That change is odd.  Can you show us how it breaks?
> >
> > This will break LTO build of gcc.c-torture/execute/pr38051.c
> >
> > There is data structure like:
> >
> >   union { long int l; char c[sizeof (long int)]; } u;
> >
> > Once the block info is reserved for this, it'll reserve this data
> > structure. And inside this data structure, there is VAR_DECL. Thus
> > LTO_NO_PREVAIL assertion does not satisfy here for TREE_CHAIN (t).
> 
> I see - the issue here is that this data structure is not reached at the 
> time we call free_lang_data (via find_decls_types_r).

It should be reached just fine.  The problem is that TREE_CHAIN of that 
union type contains random garbage (in this case the var_decl 'u').  This 
is not supposed to happen.  It's set as part of reading back a BLOCK_VARS 
chain, so the type_decl itself is in such a chain (and 'u' is part of it 
via the TREE_CHAIN pointer).

I have no idea why this is no problem without the patch.  Possibly because 
of the hunk in remove_unused_scope_block_p that makes more blocks stay.

> But maybe I do not understand "once the block info is reserved for 
> this".
> 
> So the patch papers over an issue elsewhere I believe.  Maybe Micha can 
> add some clarification here though, how BLOCK_VARS should be visible 
> here

Hmm.  Without the half-hearted tries to support debug info with LTO the 
block_vars list was no problem, it simply wouldn't be streamed.  Now I 
think it is a problem, and we need to fix it up with the prevailing decls 
if there are multiple ones.  I.e. instead of removing the two lines, 
replace LTO_NO_PREVAIL (TREE_CHAIN (t)) with LTO_SET_PREVAIL.

This is quite unfortunate as we really rather want to make sure that 
TREE_CHAIN isn't randomly set to something.  But as long as block_vars are 
implemented via TREE_CHAIN, and we want to preserve block_vars we don't 
have much choice :-(


Ciao,
Michael.



More information about the Gcc-patches mailing list