diff options
author | Richard Biener <rguenther@suse.de> | 2019-06-11 08:30:47 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-06-11 08:30:47 +0000 |
commit | f75d3701103301d452c02548d48facc2f95613b9 (patch) | |
tree | ee06d3f5c16eeb974acacc65034237a8c149cac2 /gcc | |
parent | 9f95c526a9f165fb7026d2ebd9a2ca82b25a503d (diff) | |
download | gcc-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')
-rw-r--r-- | gcc/d/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/d/toir.cc | 29 |
2 files changed, 30 insertions, 7 deletions
diff --git a/gcc/d/ChangeLog b/gcc/d/ChangeLog index 800dcb0..b94a903 100644 --- a/gcc/d/ChangeLog +++ b/gcc/d/ChangeLog @@ -1,3 +1,11 @@ +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. + 2019-05-24 Nathan Sidwell <nathan@acm.org> * types.cc (fixup_anonymous_offset): Use IDENTIFIER_ANON_P. 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 { |