Message ID | or4oh1jx4q.fsf@livre.localdomain |
---|---|
State | New |
Headers | show |
On Thu, Jun 17, 2010 at 9:07 PM, Alexandre Oliva <aoliva@redhat.com> wrote: > On Jun 15, 2010, Richard Guenther <richard.guenther@gmail.com> wrote: > >> On Tue, Jun 15, 2010 at 5:00 AM, Alexandre Oliva <aoliva@redhat.com> wrote: >>> When VTA is disabled, LTO streams in debug stmts as gimple nops. This >>> is inadequate, for gimple nops will get in the way of removal of blocks >>> and perhaps other situations in which debug stmts are properly >>> disregarded. Their presence is enough to bring about codegen >>> differences, causing -fcompare-debug failures when an object file >>> compiled with -g -flto is to be link-time compiled without -g, as is the >>> case when -fcompare-debug is given. >>> >>> This patch arranges for us to drop the debug stmts entirely, but to do >>> so only after applying fixups. We could drop them a bit earlier, while >>> filling in the stmts array, but then we'd have to worry about NULL stmt >>> entries in the array (should debug stmts have fixups) and the array >>> would probably be slower, for we'd have to test MAY_HAVE_DEBUG_STMTS >>> multiple times. >>> >>> Is this ok, if it passes regstrap on x86_64-linux-gnu? > >> Ok if you make input_bb return a flag whether a debug stmt was >> streamed in, aggregate that and make the loop over all stmts >> conditional on that to avoid walking over all stmts in a function >> one more time. > > How about piggibacking on another existing loop over all stmts, instead? > I tried this with an -flto -fcompare-debug bootstrap and that worked > fine on i686-pc-linux-gnu. On other platforms, there were > -fcompare-debug failures, but no crashes, so removing the stmts at that > point is fine, we just have to keep them long enough for the uids to be > computed as expected. Leave the corresponding entries in the stmts > array as NULL is fine. > > Ok to install? Ok if you add a comment like /* Remove debug statements only here to preserve gimple uid numbering. */ Thanks, Richard. > > > -- > Alexandre Oliva, freedom fighter http://FSFLA.org/~lxoliva/ > You must be the change you wish to see in the world. -- Gandhi > Be Free! -- http://FSFLA.org/ FSF Latin America board member > Free Software Evangelist Red Hat Brazil Compiler Engineer > >
for gcc/ChangeLog from Alexandre Oliva <aoliva@redhat.com> PR debug/44248 * lto-streamer-in.c (input_bb): Leave debug stmts alone. (input_function): Drop them here, if VTA is disabled. Index: gcc/lto-streamer-in.c =================================================================== --- gcc/lto-streamer-in.c.orig 2010-06-16 17:17:46.000000000 -0300 +++ gcc/lto-streamer-in.c 2010-06-16 17:21:33.000000000 -0300 @@ -1204,13 +1204,6 @@ input_bb (struct lto_input_block *ib, en { gimple stmt = input_gimple_stmt (ib, data_in, fn, tag); - /* Change debug stmts to nops on-the-fly if we do not have VTA enabled. - This allows us to build for example static libs with debugging - enabled and do the final link without. */ - if (!MAY_HAVE_DEBUG_STMTS - && is_gimple_debug (stmt)) - stmt = gimple_build_nop (); - find_referenced_vars_in (stmt); gsi_insert_after (&bsi, stmt, GSI_NEW_STMT); @@ -1370,11 +1363,21 @@ input_function (tree fn_decl, struct dat stmts = (gimple *) xcalloc (gimple_stmt_max_uid (fn), sizeof (gimple)); FOR_ALL_BB (bb) { - gimple_stmt_iterator bsi; - for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi)) + gimple_stmt_iterator bsi = gsi_start_bb (bb); + while (!gsi_end_p (bsi)) { gimple stmt = gsi_stmt (bsi); - stmts[gimple_uid (stmt)] = stmt; + if (!MAY_HAVE_DEBUG_STMTS && is_gimple_debug (stmt)) + { + gimple_stmt_iterator gsi = bsi; + gsi_next (&bsi); + gsi_remove (&gsi, true); + } + else + { + gsi_next (&bsi); + stmts[gimple_uid (stmt)] = stmt; + } } }