From 45053eaf0b43e8a9085e20cf52e589cf0aa6aef3 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sat, 5 May 2001 09:38:25 -0700 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 ++++++- gcc/except.c | 23 +++++++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) 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; -- 2.30.2