aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@yorick.cygnus.com>1997-09-18 01:23:34 +0000
committerJason Merrill <jason@gcc.gnu.org>1997-09-17 21:23:34 -0400
commit4f870c0425a0c03ddc1535d2e8469a28ddc105cc (patch)
treed7cf840b09538a089b4015c393caa2b4c008faaa
parent4eb66248bf9ba2c160f05da1b684412c17374aff (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/except.c5
-rw-r--r--gcc/libgcc2.c4
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)