On 04/21/2011 10:55 PM, Nathan Froyd wrote:
On Thu, Apr 21, 2011 at 10:49:05PM -0400, Jason Merrill wrote:
Hunh. How does that work? They fill in CASE_LABEL later? Can that be
changed?
Yeah, tree-eh.c:lower_try_finally_switch. I don't know how easy it is
to fix; it certainly looks non-trivial.
Well, I tried adjusting it and regression testing seems fine so far. I
can't think what the comment would be talking about with pointers not
providing a stable order; I don't see anything that would rely on that.
Jason
commit 50cd5e483b89a3be6fd9e432edf1ece31f6756bd
Author: Jason Merrill <ja...@redhat.com>
Date: Fri Apr 22 00:47:36 2011 -0400
bar
diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c
index 60e2236..feee182 100644
--- a/gcc/tree-eh.c
+++ b/gcc/tree-eh.c
@@ -1419,11 +1419,9 @@ lower_try_finally_switch (struct leh_state *state,
struct leh_tf_state *tf)
void **slot;
case_lab = build3 (CASE_LABEL_EXPR, void_type_node,
build_int_cst (NULL, switch_id),
- NULL, NULL);
+ NULL, create_artificial_label (tf_loc));
/* We store the cont_stmt in the pointer map, so that we can recover
- it in the loop below. We don't create the new label while
- walking the goto_queue because pointers don't offer a stable
- order. */
+ it in the loop below. */
if (!cont_map)
cont_map = pointer_map_create ();
slot = pointer_map_insert (cont_map, case_lab);
@@ -1443,13 +1441,10 @@ lower_try_finally_switch (struct leh_state *state,
struct leh_tf_state *tf)
gcc_assert (cont_map);
slot = pointer_map_contains (cont_map, last_case);
- /* As the comment above suggests, CASE_LABEL (last_case) was just a
- placeholder, it does not store an actual label, yet. */
gcc_assert (slot);
cont_stmt = *(gimple *) slot;
- label = create_artificial_label (tf_loc);
- CASE_LABEL (last_case) = label;
+ label = CASE_LABEL (last_case);
x = gimple_build_label (label);
gimple_seq_add_stmt (&switch_body, x);