From 4f870c0425a0c03ddc1535d2e8469a28ddc105cc Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 18 Sep 1997 01:23:34 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 8 ++++++++ gcc/except.c | 5 ++++- gcc/libgcc2.c | 4 ++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5331d7d7e7fd..1d12a8f6fe59 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +Wed Sep 17 18:19:53 1997 Jason Merrill + + * 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 47cae20cf918..7929e9c890e6 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 34a6c71a6f6e..6b3b7b41f381 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)