Fix error inlining REG_EH_REGION notes
Richard Kenner
kenner@vlsi1.ultra.nyu.edu
Thu Dec 27 07:26:00 GMT 2001
This is an obviously-correct fix, though it took me several hours to
find. This may have been the source of the belief that sibcall and EH
didn't work together. This will happen if both EH and sibcall are enabled,
the RTL inliner is used, and a function getting sibcall processing has an
arg that includes a call to an inlined function that, in turn, has a call
to a const function.
The test case here is the Ada run-time module a-nlcefu.ads compiled on
Alpha/OSF with -O2 -gnatpgn -mno-bwx. gnat1 gets a SIGSEGV.
Tested on alphaev56-dec-osf4.0c.
Thu Dec 27 09:50:44 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* integrate.c (copy_insn_notes): Don't adjust REG_EH_REGION note
if special value.
*** integrate.c 2001/11/15 03:02:23 1.176
--- integrate.c 2001/12/27 03:28:57
*************** copy_insn_notes (insns, map, eh_region_o
*** 1686,1690 ****
if (REG_NOTE_KIND (note) == REG_LABEL)
remove_note (new_insn, note);
! else if (REG_NOTE_KIND (note) == REG_EH_REGION)
XEXP (note, 0) = GEN_INT (INTVAL (XEXP (note, 0))
+ eh_region_offset);
--- 1686,1691 ----
if (REG_NOTE_KIND (note) == REG_LABEL)
remove_note (new_insn, note);
! else if (REG_NOTE_KIND (note) == REG_EH_REGION
! && INTVAL (XEXP (note, 0)) > 0)
XEXP (note, 0) = GEN_INT (INTVAL (XEXP (note, 0))
+ eh_region_offset);
More information about the Gcc-patches
mailing list