looking for a handler, to avoid hitting the beginning of the next
region.
* except.c (expand_builtin_set_return_addr_reg): Use force_operand.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@15534
138bc75d-0d04-0410-961f-
82ee72b054a4
+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.
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
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)