diff options
author | Jason Merrill <jason@yorick.cygnus.com> | 1997-09-18 01:23:34 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 1997-09-17 21:23:34 -0400 |
commit | 4f870c0425a0c03ddc1535d2e8469a28ddc105cc (patch) | |
tree | d7cf840b09538a089b4015c393caa2b4c008faaa | |
parent | 4eb66248bf9ba2c160f05da1b684412c17374aff (diff) | |
download | gcc-4f870c0425a0c03ddc1535d2e8469a28ddc105cc.zip gcc-4f870c0425a0c03ddc1535d2e8469a28ddc105cc.tar.gz gcc-4f870c0425a0c03ddc1535d2e8469a28ddc105cc.tar.bz2 |
libgcc2.c (find_exception_handler): Subtract one from our PC when looking for a handler...
* libgcc2.c (find_exception_handler): Subtract one from our PC when
looking for a handler, to avoid hitting the beginning of the next
region.
* except.c (expand_builtin_set_return_addr_reg): Use force_operand.
From-SVN: r15534
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/except.c | 5 | ||||
-rw-r--r-- | gcc/libgcc2.c | 4 |
3 files changed, 16 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5331d7d..1d12a8f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +Wed Sep 17 18:19:53 1997 Jason Merrill <jason@yorick.cygnus.com> + + * libgcc2.c (find_exception_handler): Subtract one from our PC when + looking for a handler, to avoid hitting the beginning of the next + region. + + * except.c (expand_builtin_set_return_addr_reg): Use force_operand. + Wed Sep 17 18:33:59 1997 Jeffrey A Law (law@cygnus.com) * mips/abi64.h (LONG_MAX_SPEC): Define. diff --git a/gcc/except.c b/gcc/except.c index 47cae20..7929e9c 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -2207,13 +2207,16 @@ void expand_builtin_set_return_addr_reg (addr_tree) tree addr_tree; { + rtx tmp; rtx ra = expand_builtin_return_addr (BUILT_IN_RETURN_ADDRESS, 0, hard_frame_pointer_rtx); if (GET_CODE (ra) != REG || REGNO (ra) >= FIRST_PSEUDO_REGISTER) return; - emit_move_insn (ra, expand_builtin_frob_return_addr (addr_tree)); + tmp = force_operand (expand_builtin_frob_return_addr (addr_tree), ra); + if (tmp != ra) + emit_move_insn (ra, tmp); } /* Choose two registers for communication between the main body of diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c index 34a6c71..6b3b7b4 100644 --- a/gcc/libgcc2.c +++ b/gcc/libgcc2.c @@ -3337,6 +3337,10 @@ find_exception_handler (void *pc, exception_table *table) int pos; int best = -1; + /* We subtract 1 from PC to avoid hitting the beginning of the next + region. */ + --pc; + /* We can't do a binary search because the table isn't guaranteed to be sorted from function to function. */ for (pos = 0; table[pos].exception_handler != (void *) -1; ++pos) |