diff options
author | Jan Hubicka <jh@suse.cz> | 2009-03-29 15:20:20 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2009-03-29 13:20:20 +0000 |
commit | 98f358e55f3a003ab3ca4213ba59ce93c5cd9fc1 (patch) | |
tree | a1a35a096649c19b4a8776f5298d39f97494074d | |
parent | 13a9fa4483a31c1b7f35fdc83720f75fdc94231c (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/except.c | 73 |
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; } } |