Commit 98ce21b3 by Richard Henderson

except.c (sjlj_find_directly_reachable_regions): Don't consider RNL_BLOCKED a…

except.c (sjlj_find_directly_reachable_regions): Don't consider RNL_BLOCKED a directly reachable region.

        * except.c (sjlj_find_directly_reachable_regions): Don't
        consider RNL_BLOCKED a directly reachable region.
        (sjlj_assign_call_site_values): Trust directly_reachable.
        (sjlj_emit_dispatch_table): Likewise.

From-SVN: r47915
parent eb15dedd
2001-12-11 Richard Henderson <rth@redhat.com> 2001-12-11 Richard Henderson <rth@redhat.com>
* except.c (sjlj_find_directly_reachable_regions): Don't
consider RNL_BLOCKED a directly reachable region.
(sjlj_assign_call_site_values): Trust directly_reachable.
(sjlj_emit_dispatch_table): Likewise.
2001-12-11 Richard Henderson <rth@redhat.com>
* config/alpha/alpha.md (divmodsi_internal_er): Split, so that * config/alpha/alpha.md (divmodsi_internal_er): Split, so that
we represent the address load's dependency on the gp. we represent the address load's dependency on the gp.
(divmoddi_internal_er): Likewise. (divmoddi_internal_er): Likewise.
......
...@@ -2014,6 +2014,7 @@ sjlj_find_directly_reachable_regions (lp_info) ...@@ -2014,6 +2014,7 @@ sjlj_find_directly_reachable_regions (lp_info)
for (insn = get_insns (); insn ; insn = NEXT_INSN (insn)) for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
{ {
struct eh_region *region; struct eh_region *region;
enum reachable_code rc;
tree type_thrown; tree type_thrown;
rtx note; rtx note;
...@@ -2035,11 +2036,14 @@ sjlj_find_directly_reachable_regions (lp_info) ...@@ -2035,11 +2036,14 @@ sjlj_find_directly_reachable_regions (lp_info)
/* Find the first containing region that might handle the exception. /* Find the first containing region that might handle the exception.
That's the landing pad to which we will transfer control. */ That's the landing pad to which we will transfer control. */
rc = RNL_NOT_CAUGHT;
for (; region; region = region->outer) for (; region; region = region->outer)
if (reachable_next_level (region, type_thrown, 0) != RNL_NOT_CAUGHT) {
rc = reachable_next_level (region, type_thrown, 0);
if (rc != RNL_NOT_CAUGHT)
break; break;
}
if (region) if (rc == RNL_MAYBE_CAUGHT || rc == RNL_CAUGHT)
{ {
lp_info[region->region_number].directly_reachable = 1; lp_info[region->region_number].directly_reachable = 1;
found_one = true; found_one = true;
...@@ -2086,8 +2090,7 @@ sjlj_assign_call_site_values (dispatch_label, lp_info) ...@@ -2086,8 +2090,7 @@ sjlj_assign_call_site_values (dispatch_label, lp_info)
index = 0; index = 0;
for (i = cfun->eh->last_region_number; i > 0; --i) for (i = cfun->eh->last_region_number; i > 0; --i)
if (lp_info[i].directly_reachable if (lp_info[i].directly_reachable)
&& lp_info[i].action_index >= 0)
lp_info[i].dispatch_index = index++; lp_info[i].dispatch_index = index++;
/* Finally: assign call-site values. If dwarf2 terms, this would be /* Finally: assign call-site values. If dwarf2 terms, this would be
...@@ -2316,8 +2319,7 @@ sjlj_emit_dispatch_table (dispatch_label, lp_info) ...@@ -2316,8 +2319,7 @@ sjlj_emit_dispatch_table (dispatch_label, lp_info)
first_reachable = 0; first_reachable = 0;
for (i = cfun->eh->last_region_number; i > 0; --i) for (i = cfun->eh->last_region_number; i > 0; --i)
{ {
if (! lp_info[i].directly_reachable if (! lp_info[i].directly_reachable)
|| lp_info[i].action_index < 0)
continue; continue;
if (! first_reachable) if (! first_reachable)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment