aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-cfg.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-cfg.cc')
-rw-r--r--gcc/tree-cfg.cc49
1 files changed, 40 insertions, 9 deletions
diff --git a/gcc/tree-cfg.cc b/gcc/tree-cfg.cc
index 53be0c2..ade66c5 100644
--- a/gcc/tree-cfg.cc
+++ b/gcc/tree-cfg.cc
@@ -1166,7 +1166,33 @@ same_line_p (location_t locus1, expanded_location *from, location_t locus2)
&& filename_cmp (from->file, to.file) == 0);
}
-/* Assign discriminators to each basic block. */
+/* Assign a unique discriminator value to all statements in block bb that
+ have the same line number as locus. */
+
+static void
+assign_discriminator (location_t locus, basic_block bb)
+{
+ gimple_stmt_iterator gsi;
+ int discriminator;
+
+ if (locus == UNKNOWN_LOCATION)
+ return;
+
+ expanded_location locus_e = expand_location (locus);
+
+ discriminator = next_discriminator_for_locus (locus_e.line);
+
+ for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
+ {
+ gimple *stmt = gsi_stmt (gsi);
+ location_t stmt_locus = gimple_location (stmt);
+ if (same_line_p (locus, &locus_e, stmt_locus))
+ gimple_set_location (stmt,
+ location_with_discriminator (stmt_locus, discriminator));
+ }
+}
+
+/* Assign discriminators to statement locations. */
static void
assign_discriminators (void)
@@ -1189,17 +1215,22 @@ assign_discriminators (void)
{
gimple *first = first_non_label_stmt (e->dest);
gimple *last = last_stmt (e->dest);
- if ((first && same_line_p (locus, &locus_e,
+
+ gimple *stmt_on_same_line = NULL;
+ if (first && same_line_p (locus, &locus_e,
gimple_location (first)))
- || (last && same_line_p (locus, &locus_e,
- gimple_location (last))))
+ stmt_on_same_line = first;
+ else if (last && same_line_p (locus, &locus_e,
+ gimple_location (last)))
+ stmt_on_same_line = last;
+
+ if (stmt_on_same_line)
{
- if (e->dest->discriminator != 0 && bb->discriminator == 0)
- bb->discriminator
- = next_discriminator_for_locus (locus_e.line);
+ if (has_discriminator (gimple_location (stmt_on_same_line))
+ && !has_discriminator (locus))
+ assign_discriminator (locus, bb);
else
- e->dest->discriminator
- = next_discriminator_for_locus (locus_e.line);
+ assign_discriminator (locus, e->dest);
}
}
}