On Tue, 1 Sep 2015, Jan Hubicka wrote:
> > On Tue, 1 Sep 2015, Jan Hubicka wrote:
> >
> > > > > Yep, this looks like a resonable direction. It will break the one
> > > > > declaration
> > > > > rule in a more wild sense than current frontends does so, because if
> > > > > a builtin
> > > > > win as a prevailing declaration, we end up with no merging at all.
> > > > > I wonder if we don't want to always prevail to first non-builtin
> > > > > variant?
> > > >
> > > > I think we already try. But this can be tricky as seen by the following
> > > > which is needed to finally fix LTO bootstrap on trunk ...
> > > >
> > > > Basically there are some function decls that do not go through
> > > > lto-symtab handling because they are not in any CUs cgraph but
> > > > only exist because they are refered to from BLOCK abstract origins
> > > > (and thus also LTRANS boundary streaming doesn't force them
> > > > into the cgraph). For example during LTO bootstrap I see
> > > > this from inlining of split functions where both split parts and
> > > > the original function are optimized away before stream-out.
> > >
> > > Yep, I remember poking around this when I finally stopped my attempts
> > > to get abstract origins working with LTO :(
> > > >
> > > > We hit
> > > >
> > > > static void
> > > > gen_inlined_subroutine_die (tree stmt, dw_die_ref context_die)
> > > > {
> > > > ...
> > > > /* Make sure any inlined functions are known to be inlineable. */
> > > > gcc_checking_assert (DECL_ABSTRACT_P (decl)
> > > > || cgraph_function_possibly_inlined_p (decl));
> > > >
> > > > a lot without the following fixes. I suppose we _can_ merge
> > > > function decls which just differ in DECL_POSSIBLY_INLINED if
> > > > we make sure to "merge" the flag during tree merging. But
> > > > that's for a followup, below is for correctness.
> > >
> > > How this is going to work with early debug? If we merge one function to
> > > another, won't we move the references inside blocks to references to
> > > another
> > > block tree that is possibly incompatible with one we expect?
> >
> > Hmm, indeed, if we merge the abstract instance FUNCTION_DECL we end
> > up adjusting the abstract origin DIE reference accordingly but as
> > we don't merge BLOCKs the actual BLOCK abstract origins would refer
> > to the "original" early debug abstract instance. Not sure if that
> > will cause problems for the debug consumer - the abstract instances
> > should be the same (literally, unless you play tricks with #ifdefs
> > in different uses...).
> >
> > > The rest of patch makes sense to me modulo the possible issues with moving
> > > ECL_ABSTRACT_ORIGIN reference to an incompatible blob of dwarf info
> > > comming
> > > from other instance of the inlined function from other translation unit.
> > >
> > > I see you added DECL_ABSTRACT_ORIGIN comparer, but that won't make block
> > > numbers
> > > to match.
> >
> > Who cares about block numbers? Note the abstract origin comparer was
> > for the clone abstract origins we have.
>
> Yep, no one in dwarf2out. My original attempt used it to refer to BLOCKs
> within
> a different function body (BLOCK_ABSTRACT_ORIGIN). We currently don't stream
> it, so
> we don't need to refer to it.
>
> In longer run we will however need a way to make these references to work...
> Merging them will be tricky as it would require comparing the function's
> block trees.
> Especially after early inlining these tends to diverge, but perhaps the early
> debug is output
> before early inlining and thus this problem goes away and we only care about
> different ifdefs.
> Those are quite common, too, however, at least in Firefox :(
I think it should simply work - dependent on what the debug info
consumer does to the two block trees (we do _not_ add references
to the abstract BLOCKs, only to the abstract variables):
<2><1e7>: Abbrev Number: 7 (DW_TAG_inlined_subroutine)
<1e8> DW_AT_abstract_origin: <0x3d2>
<1ec> DW_AT_low_pc : 0x4006bc
<1f4> DW_AT_high_pc : 0xf4
<1fc> DW_AT_call_file : 1
<1fd> DW_AT_call_line : 44
<1fe> DW_AT_sibling : <0x234>
<3><202>: Abbrev Number: 8 (DW_TAG_formal_parameter)
<203> DW_AT_abstract_origin: <0x3e2>
<207> DW_AT_location : 2 byte block: 91 4c (DW_OP_fbreg: -52)
<3><20a>: Abbrev Number: 9 (DW_TAG_lexical_block)
<20b> DW_AT_low_pc : 0x4006bc
<213> DW_AT_high_pc : 0xf4
<4><21b>: Abbrev Number: 10 (DW_TAG_variable)
<21c> DW_AT_abstract_origin: <0x3eb>
<220> DW_AT_location : 3 byte block: 91 98 7e (DW_OP_fbreg:
-232)
...
so if the <0x3d2> lexical blocks do not "match" with the <1e7> ones
then what does the consumer do? I suppose it simply doesn't care
for "blocks" at all apart from source of scope pc-range info.
We always have the choice to fix the consumer after all.
Richard.