aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2009-03-29 15:20:20 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2009-03-29 13:20:20 +0000
commit98f358e55f3a003ab3ca4213ba59ce93c5cd9fc1 (patch)
treea1a35a096649c19b4a8776f5298d39f97494074d
parent13a9fa4483a31c1b7f35fdc83720f75fdc94231c (diff)
downloadgcc-98f358e55f3a003ab3ca4213ba59ce93c5cd9fc1.zip
gcc-98f358e55f3a003ab3ca4213ba59ce93c5cd9fc1.tar.gz
gcc-98f358e55f3a003ab3ca4213ba59ce93c5cd9fc1.tar.bz2
except.c (verify_eh_tree): Fix handling of fun!=cfun; be ready for removed regions.
* except.c (verify_eh_tree): Fix handling of fun!=cfun; be ready for removed regions. From-SVN: r145232
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/except.c73
2 files changed, 44 insertions, 34 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1d54be6..738c87e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2009-03-29 Jan Hubicka <jh@suse.cz>
+ * except.c (verify_eh_tree): Fix handling of fun!=cfun; be ready
+ for removed regions.
+
+2009-03-29 Jan Hubicka <jh@suse.cz>
+
* except.c (dump_eh_tree): Dump all datastructures.
2009-03-29 Jan Hubicka <jh@suse.cz>
diff --git a/gcc/except.c b/gcc/except.c
index d8bafc0..c6a5ca5 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -3968,23 +3968,25 @@ verify_eh_tree (struct function *fun)
int j;
int depth = 0;
- i = fun->eh->region_tree;
- if (! i)
+ if (!fun->eh->region_tree)
return;
for (j = fun->eh->last_region_number; j > 0; --j)
- if ((i = VEC_index (eh_region, cfun->eh->region_array, j)))
+ if ((i = VEC_index (eh_region, fun->eh->region_array, j)))
{
- count++;
- if (i->region_number != j)
+ if (i->region_number == j)
+ count++;
+ if (i->region_number != j && (!i->aka || !bitmap_bit_p (i->aka, j)))
{
- error ("region_array is corrupted for region %i", i->region_number);
+ error ("region_array is corrupted for region %i",
+ i->region_number);
err = true;
}
}
+ i = fun->eh->region_tree;
while (1)
{
- if (VEC_index (eh_region, cfun->eh->region_array, i->region_number) != i)
+ if (VEC_index (eh_region, fun->eh->region_array, i->region_number) != i)
{
error ("region_array is corrupted for region %i", i->region_number);
err = true;
@@ -3996,8 +3998,9 @@ verify_eh_tree (struct function *fun)
}
if (i->may_contain_throw && outer && !outer->may_contain_throw)
{
- error ("region %i may contain throw and is contained in region that may not",
- i->region_number);
+ error
+ ("region %i may contain throw and is contained in region that may not",
+ i->region_number);
err = true;
}
if (depth < 0)
@@ -4005,7 +4008,7 @@ verify_eh_tree (struct function *fun)
error ("negative nesting depth of region %i", i->region_number);
err = true;
}
- nvisited ++;
+ nvisited++;
/* If there are sub-regions, process them. */
if (i->inner)
outer = i, i = i->inner, depth++;
@@ -4015,30 +4018,32 @@ verify_eh_tree (struct function *fun)
/* Otherwise, step back up the tree to the next peer. */
else
{
- do {
- i = i->outer;
- depth--;
- if (i == NULL)
- {
- if (depth != -1)
- {
- error ("tree list ends on depth %i", depth + 1);
- err = true;
- }
- if (count != nvisited)
- {
- error ("array does not match the region tree");
- err = true;
- }
- if (err)
- {
- dump_eh_tree (stderr, fun);
- internal_error ("verify_eh_tree failed");
- }
- return;
- }
- outer = i->outer;
- } while (i->next_peer == NULL);
+ do
+ {
+ i = i->outer;
+ depth--;
+ if (i == NULL)
+ {
+ if (depth != -1)
+ {
+ error ("tree list ends on depth %i", depth + 1);
+ err = true;
+ }
+ if (count != nvisited)
+ {
+ error ("array does not match the region tree");
+ err = true;
+ }
+ if (err)
+ {
+ dump_eh_tree (stderr, fun);
+ internal_error ("verify_eh_tree failed");
+ }
+ return;
+ }
+ outer = i->outer;
+ }
+ while (i->next_peer == NULL);
i = i->next_peer;
}
}