This patch fixes the discriminator assignments for stmts. It used to
apply a signle locus for everything, which is not right (will
invalidate locus for macro expansion).

Bootstrapped and passed regression test.

OK for google-4_8?

Thanks,
Dehao

Index: gcc/input.c
===================================================================
--- gcc/input.c (revision 200625)
+++ gcc/input.c (working copy)
@@ -308,7 +308,7 @@ location_with_discriminator (location_t locus, int
 {
   tree block = LOCATION_BLOCK (locus);
   location_t ret;
-  locus = LOCATION_LOCUS (locus);
+  locus = map_discriminator_location (locus);

   if (locus == UNKNOWN_LOCATION)
     return block ? COMBINE_LOCATION_DATA (line_table, locus, block)
Index: gcc/tree-cfg.c
===================================================================
--- gcc/tree-cfg.c (revision 200625)
+++ gcc/tree-cfg.c (working copy)
@@ -751,24 +751,22 @@ static void
 assign_discriminator (location_t locus, basic_block bb)
 {
   gimple_stmt_iterator gsi;
-  tree block = LOCATION_BLOCK (locus);
+  int discriminator;

   locus = map_discriminator_location (locus);

   if (locus == UNKNOWN_LOCATION)
     return;

-  locus = location_with_discriminator (
-      locus, next_discriminator_for_locus (locus));
+  discriminator = next_discriminator_for_locus (locus);

-  if (block != NULL)
-    locus = COMBINE_LOCATION_DATA (line_table, locus, block);
-
   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
     {
       gimple stmt = gsi_stmt (gsi);
-      if (same_line_p (locus, gimple_location (stmt)))
- gimple_set_location (stmt, locus);
+      location_t stmt_locus = gimple_location (stmt);
+      if (same_line_p (locus, stmt_locus))
+ gimple_set_location (
+    stmt, location_with_discriminator (stmt_locus, discriminator));
     }
 }

Reply via email to