Patchwork [PR44248] Fix lto/whopr -g link-time -fcompare-debug failure

login
register
mail settings
Submitter Alexandre Oliva
Date June 20, 2010, 11:57 p.m.
Message ID <or631dgsus.fsf@livre.localdomain>
Download mbox | patch
Permalink /patch/56279/
State New
Headers show

Comments

Alexandre Oliva - June 20, 2010, 11:57 p.m.
On Jun 18, 2010, Richard Guenther <richard.guenther@gmail.com> wrote:

> Ok if you add a comment like /* Remove debug statements only
> here to preserve gimple uid numbering.  */

Thanks for the reminder.  I made it a bit more verbose.

Patch

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-20 20:48:00.000000000 -0300
+++ gcc/lto-streamer-in.c	2010-06-20 20:55:22.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,26 @@  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 we're recompiling LTO objects with debug stmts but
+	     we're not supposed to have debug stmts, remove them now.
+	     We can't remove them earlier because this would cause uid
+	     mismatches in fixups, but we can do it at this point, as
+	     long as debug stmts don't require fixups.  */
+	  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;
+	    }
 	}
     }