diff options
author | Richard Henderson <rth@redhat.com> | 2005-10-03 13:57:45 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2005-10-03 13:57:45 -0700 |
commit | 1718a2aa9b1715961e514331aea0f5aacc611580 (patch) | |
tree | 81e9e5184f6f865cedc0d6d7a7a0898ce3083a1a /gcc | |
parent | bb13c3502be2c6eda1771e10f95f615b71d4d026 (diff) | |
download | gcc-1718a2aa9b1715961e514331aea0f5aacc611580.zip gcc-1718a2aa9b1715961e514331aea0f5aacc611580.tar.gz gcc-1718a2aa9b1715961e514331aea0f5aacc611580.tar.bz2 |
re PR middle-end/24135 (nonlocal goto from nested function gets 'undefined symbol' in assembler)
PR 24135
* tree-nested.c (convert_nl_goto_reference): Lookup a translation
before creating a new one.
From-SVN: r104911
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr24135.c | 46 | ||||
-rw-r--r-- | gcc/tree-nested.c | 30 |
3 files changed, 70 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 19dd74e..957ac6c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-10-03 Richard Henderson <rth@redhat.com> + + PR 24135 + * tree-nested.c (convert_nl_goto_reference): Lookup a translation + before creating a new one. + 2005-10-03 David Edelsohn <edelsohn@gnu.org> * config/rs6000/t-aix43 (LDFLAGS): New. diff --git a/gcc/testsuite/gcc.c-torture/execute/pr24135.c b/gcc/testsuite/gcc.c-torture/execute/pr24135.c new file mode 100644 index 0000000..fdeda16 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr24135.c @@ -0,0 +1,46 @@ +#ifndef NO_TRAMPOLINES +extern void abort (void); + +int x(int a, int b) +{ + __label__ xlab; + __label__ xlab2; + + void y(int b) + { + switch (b) + { + case 1: goto xlab; + case 2: goto xlab; + } + } + + a = a + 2; + y (b); + + xlab: + return a; + + xlab2: + a++; + return a; + +} + +int main () +{ + int i, j; + + for (j = 1; j <= 2; ++j) + for (i = 1; i <= 2; ++i) + { + int a = x (j, i); + if (a != 2 + j) + abort (); + } + + return 0; +} +#else +int main() { return 0; } +#endif diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c index d42c583..27819db 100644 --- a/gcc/tree-nested.c +++ b/gcc/tree-nested.c @@ -1089,7 +1089,7 @@ convert_nl_goto_reference (tree *tp, int *walk_subtrees, void *data) struct walk_stmt_info *wi = data; struct nesting_info *info = wi->info, *i; tree t = *tp, label, new_label, target_context, x, arg, field; - struct var_map_elt *elt; + struct var_map_elt *elt, dummy; void **slot; *walk_subtrees = 0; @@ -1110,17 +1110,23 @@ convert_nl_goto_reference (tree *tp, int *walk_subtrees, void *data) control transfer. This new label will be marked LABEL_NONLOCAL; this mark will trigger proper behavior in the cfg, as well as cause the (hairy target-specific) non-local goto receiver code to be generated - when we expand rtl. */ - new_label = create_artificial_label (); - DECL_NONLOCAL (new_label) = 1; - - /* Enter this association into var_map so that we can insert the new - label into the IL during a second pass. */ - elt = ggc_alloc (sizeof (*elt)); - elt->old = label; - elt->new = new_label; - slot = htab_find_slot (i->var_map, elt, INSERT); - *slot = elt; + when we expand rtl. Enter this association into var_map so that we + can insert the new label into the IL during a second pass. */ + dummy.old = label; + slot = htab_find_slot (i->var_map, &dummy, INSERT); + elt = *slot; + if (elt == NULL) + { + new_label = create_artificial_label (); + DECL_NONLOCAL (new_label) = 1; + + elt = ggc_alloc (sizeof (*elt)); + elt->old = label; + elt->new = new_label; + *slot = elt; + } + else + new_label = elt->new; /* Build: __builtin_nl_goto(new_label, &chain->nl_goto_field). */ field = get_nl_goto_field (i); |