On Wed, 7 Dec 2011, Diego Novillo wrote: > On 12/07/11 10:54, Richard Guenther wrote: > > On Wed, 7 Dec 2011, Diego Novillo wrote: > > > > > On 12/07/11 10:46, Richard Guenther wrote: > > > > On Wed, 7 Dec 2011, Diego Novillo wrote: > > > > > > > > > On 12/07/11 09:52, Richard Guenther wrote: > > > > > > > > > > > Index: gcc/lto-streamer-out.c > > > > > > =================================================================== > > > > > > *** gcc/lto-streamer-out.c (revision 182081) > > > > > > --- gcc/lto-streamer-out.c (working copy) > > > > > > *************** tree_is_indexable (tree t) > > > > > > *** 129,134 **** > > > > > > --- 129,144 ---- > > > > > > else if (TREE_CODE (t) == VAR_DECL&& decl_function_context > > > > > > (t) > > > > > > && !TREE_STATIC (t)) > > > > > > return false; > > > > > > + /* If this is a decl generated for block local externs for > > > > > > + debug info generation, stream it unshared alongside > > > > > > BLOCK_VARS. > > > > > > */ > > > > > > + else if (VAR_OR_FUNCTION_DECL_P (t) > > > > > > + /* ??? The following tests are a literal match on what > > > > > > + c-decl.c:pop_scope does. */ > > > > > > > > > > Factor it into a common routine then? > > > > > > > > pop_scope of course _sets_ the values that way, it doesn't test them. > > > > > > Yes. I meant factoring, so future users have something to call, instead > > > of > > > three seemingly random flag checks. pop_scope could also be calling some > > > complementary setter instead of doing the seemingly random flag setting. > > > > I don't see a good way to factor out the flags setting. Factoring out > > the copying maybe. But well... we can do that when a 2nd user > > comes along? > > The problem is that the 2nd user will cut-n-paste from this one. However, if > you find adding a little function too strenuous, I guess it's not too big a > deal.
Testing this kind of patches turns out to be quite time-consuming (I do a LTO bootstrap and two SPEC 2k6 builds (-g and -g0)), so yeah ... The following is what I ended up LTO bootstrapping (finished ok), testing is still in progress, as is SPEC 2k6 build. It fixes PR49945 in a similar way, by streaming VLA types locally as well. I'm going to apply it tomorrow, when full testing hopefully finished Thanks, Richard. 2011-12-08 Richard Guenther <rguent...@suse.de> PR lto/48437 PR lto/49945 * lto-streamer-out.c (tree_is_indexable): Exclude block-local extern declarations. PR lto/48437 * gcc.dg/lto/20111207-2_0.c: New testcase. * gcc.dg/guality/pr48437.c: Likewise. Index: gcc/lto-streamer-out.c =================================================================== *** gcc/lto-streamer-out.c (revision 182081) --- gcc/lto-streamer-out.c (working copy) *************** tree_is_indexable (tree t) *** 129,134 **** --- 129,147 ---- else if (TREE_CODE (t) == VAR_DECL && decl_function_context (t) && !TREE_STATIC (t)) return false; + /* If this is a decl generated for block local externs for + debug info generation, stream it unshared alongside BLOCK_VARS. */ + else if (VAR_OR_FUNCTION_DECL_P (t) + /* ??? The following tests are a literal match on what + c-decl.c:pop_scope does. */ + && TREE_PUBLIC (t) + && DECL_EXTERNAL (t) + && DECL_CONTEXT (t) + && TREE_CODE (DECL_CONTEXT (t)) == FUNCTION_DECL) + return false; + else if (TYPE_P (t) + && variably_modified_type_p (t, NULL_TREE)) + return false; else return (TYPE_P (t) || DECL_P (t) || TREE_CODE (t) == SSA_NAME); } Index: gcc/testsuite/gcc.dg/lto/20111207-2_0.c =================================================================== *** gcc/testsuite/gcc.dg/lto/20111207-2_0.c (revision 0) --- gcc/testsuite/gcc.dg/lto/20111207-2_0.c (revision 0) *************** *** 0 **** --- 1,17 ---- + /* { dg-lto-do run } */ + + int + test (void) + { + int f (void); + return 0; + } + + int + main (void) + { + int f (void); + int test (void); + + return test (); + } Index: gcc/testsuite/gcc.dg/guality/pr48437.c =================================================================== *** gcc/testsuite/gcc.dg/guality/pr48437.c (revision 0) --- gcc/testsuite/gcc.dg/guality/pr48437.c (revision 0) *************** *** 0 **** --- 1,17 ---- + /* PR lto/48437 */ + /* { dg-do run } */ + /* { dg-options "-g" } */ + + #include "../nop.h" + + int i __attribute__((used)); + int main() + { + volatile int i; + for (i = 3; i < 7; ++i) + { + extern int i; + asm volatile (NOP : : : "memory"); /* { dg-final { gdb-test 14 "i" "0" } } */ + } + return 0; + }