From: Richard Henderson Date: Sat, 5 May 2001 16:38:25 +0000 (-0700) Subject: except.c (remove_fixup_regions): Adjust REG_EH_REGION notes to the parent of the... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=45053eaf0b43e8a9085e20cf52e589cf0aa6aef3;p=gcc.git except.c (remove_fixup_regions): Adjust REG_EH_REGION notes to the parent of the fixup region. * except.c (remove_fixup_regions): Adjust REG_EH_REGION notes to the parent of the fixup region. From-SVN: r41867 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 83355b1a0a8..3b9b4a60eb0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,9 @@ -2001-05-05 Jakub Jelinek + + * except.c (remove_fixup_regions): Adjust REG_EH_REGION notes + to the parent of the fixup region. + +2001-05-05 Jakub Jelinek * gcc.c (cpp_options): Define __NO_INLINE__ unless we are honoring "inline" keyword. diff --git a/gcc/except.c b/gcc/except.c index a0158126b2b..b21769c28f9 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -1101,11 +1101,30 @@ static void remove_fixup_regions () { int i; + rtx insn, note; + struct eh_region *fixup; + /* Walk the insn chain and adjust the REG_EH_REGION numbers + for instructions referencing fixup regions. This is only + strictly necessary for fixup regions with no parent, but + doesn't hurt to do it for all regions. */ + for (insn = get_insns(); insn ; insn = NEXT_INSN (insn)) + if (INSN_P (insn) + && (note = find_reg_note (insn, REG_EH_REGION, NULL)) + && INTVAL (XEXP (note, 0)) > 0 + && (fixup = cfun->eh->region_array[INTVAL (XEXP (note, 0))]) + && fixup->type == ERT_FIXUP) + { + if (fixup->u.fixup.real_region) + XEXP (note, 1) = GEN_INT (fixup->u.fixup.real_region->region_number); + else + remove_note (insn, note); + } + + /* Remove the fixup regions from the tree. */ for (i = cfun->eh->last_region_number; i > 0; --i) { - struct eh_region *fixup = cfun->eh->region_array[i]; - + fixup = cfun->eh->region_array[i]; if (! fixup) continue;