aboutsummaryrefslogtreecommitdiff
path: root/gcc/d/toir.cc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-06-11 08:30:47 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-06-11 08:30:47 +0000
commitf75d3701103301d452c02548d48facc2f95613b9 (patch)
treeee06d3f5c16eeb974acacc65034237a8c149cac2 /gcc/d/toir.cc
parent9f95c526a9f165fb7026d2ebd9a2ca82b25a503d (diff)
downloadgcc-f75d3701103301d452c02548d48facc2f95613b9.zip
gcc-f75d3701103301d452c02548d48facc2f95613b9.tar.gz
gcc-f75d3701103301d452c02548d48facc2f95613b9.tar.bz2
toir.cc (pop_label): Only queue labels in a vector.
2019-06-11 Richard Biener <rguenthe@suse.de> d/90778 * toir.cc (pop_label): Only queue labels in a vector. (cmp_labels): Label decl comparator. (pop_binding_level): Pop labels in DECL_UID order to avoid debug info differences. From-SVN: r272146
Diffstat (limited to 'gcc/d/toir.cc')
-rw-r--r--gcc/d/toir.cc29
1 files changed, 22 insertions, 7 deletions
diff --git a/gcc/d/toir.cc b/gcc/d/toir.cc
index 1d125b4..4c4d639 100644
--- a/gcc/d/toir.cc
+++ b/gcc/d/toir.cc
@@ -65,10 +65,10 @@ pop_binding_label (Statement * const &, d_label_entry *ent, binding_level *bl)
}
/* At the end of a function, all labels declared within the function
- go out of scope. BLOCK is the top-level block for the function. */
+ go out of scope. Queue them in LABELS. */
bool
-pop_label (Statement * const &s, d_label_entry *ent, tree block)
+pop_label (Statement * const &, d_label_entry *ent, vec<tree> &labels)
{
if (!ent->bc_label)
{
@@ -77,13 +77,10 @@ pop_label (Statement * const &s, d_label_entry *ent, tree block)
if (DECL_NAME (ent->label))
{
gcc_assert (DECL_INITIAL (ent->label) != NULL_TREE);
- DECL_CHAIN (ent->label) = BLOCK_VARS (block);
- BLOCK_VARS (block) = ent->label;
+ labels.safe_push (ent->label);
}
}
- d_function_chain->labels->remove (s);
-
return true;
}
@@ -103,6 +100,14 @@ push_binding_level (level_kind kind)
current_binding_level = new_level;
}
+static int
+cmp_labels (const void *p1, const void *p2)
+{
+ const tree *l1 = (const tree *)p1;
+ const tree *l2 = (const tree *)p2;
+ return DECL_UID (*l1) - DECL_UID (*l2);
+}
+
tree
pop_binding_level (void)
{
@@ -125,7 +130,17 @@ pop_binding_level (void)
/* Pop all the labels declared in the function. */
if (d_function_chain->labels)
- d_function_chain->labels->traverse<tree, &pop_label> (block);
+ {
+ auto_vec<tree> labels;
+ d_function_chain->labels->traverse<vec<tree> &, &pop_label> (labels);
+ d_function_chain->labels->empty ();
+ labels.qsort (cmp_labels);
+ for (unsigned i = 0; i < labels.length (); ++i)
+ {
+ DECL_CHAIN (labels[i]) = BLOCK_VARS (block);
+ BLOCK_VARS (block) = labels[i];
+ }
+ }
}
else
{