aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@yorick.cygnus.com>1997-09-18 23:33:56 +0000
committerJason Merrill <jason@gcc.gnu.org>1997-09-18 19:33:56 -0400
commit6020d3605c14364b52b635a93ef2b93ac39108ba (patch)
tree0c64bd1926558404f2fe6db31186a19420fcc900
parentfeb5876a0b33803a8ff6a5ba645b1f6f58647b27 (diff)
downloadgcc-6020d3605c14364b52b635a93ef2b93ac39108ba.zip
gcc-6020d3605c14364b52b635a93ef2b93ac39108ba.tar.gz
gcc-6020d3605c14364b52b635a93ef2b93ac39108ba.tar.bz2
final.c (final_scan_insn): Hand BARRIERs off to the dwarf2 code.
* final.c (final_scan_insn): Hand BARRIERs off to the dwarf2 code. * dwarf2out.c (dwarf2out_frame_debug): Pass the whole insn along. (dwarf2out_stack_adjust): A BARRIER resets the args space to 0. * except.c (end_eh_unwinder): Subtract 1 from return address. * libgcc2.c (__throw): Likewise. (find_exception_handler): Don't change PC here. Compare end with >. From-SVN: r15554
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/dwarf2out.c72
-rw-r--r--gcc/except.c2
-rw-r--r--gcc/final.c6
-rw-r--r--gcc/libgcc2.c15
5 files changed, 70 insertions, 35 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5e235af..b84b5e3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+Thu Sep 18 14:22:22 1997 Jason Merrill <jason@yorick.cygnus.com>
+
+ * final.c (final_scan_insn): Hand BARRIERs off to the dwarf2 code.
+ * dwarf2out.c (dwarf2out_frame_debug): Pass the whole insn along.
+ (dwarf2out_stack_adjust): A BARRIER resets the args space to 0.
+
+ * except.c (end_eh_unwinder): Subtract 1 from return address.
+ * libgcc2.c (__throw): Likewise.
+ (find_exception_handler): Don't change PC here. Compare end with >.
+
Thu Sep 18 10:43:07 1997 Nick Clifton <nickc@cygnus.com>
* v850.c (compute_register_save_size): Correct register
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 1b7548d..041f2e4 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -913,44 +913,64 @@ static void
dwarf2out_stack_adjust (insn)
rtx insn;
{
- rtx src, dest;
- enum rtx_code code;
long offset;
char *label;
- if (GET_CODE (insn) != SET)
- return;
-
- src = SET_SRC (insn);
- dest = SET_DEST (insn);
- if (dest == stack_pointer_rtx)
+ if (GET_CODE (insn) == BARRIER)
{
- /* (set (reg sp) (plus (reg sp) (const_int))) */
- code = GET_CODE (src);
- if (! (code == PLUS || code == MINUS)
- || XEXP (src, 0) != stack_pointer_rtx
- || GET_CODE (XEXP (src, 1)) != CONST_INT)
- return;
-
- offset = INTVAL (XEXP (src, 1));
+ /* When we see a BARRIER, we know to reset args_size to 0. Usually
+ the compiler will have already emitted a stack adjustment, but
+ doesn't bother for calls to noreturn functions. */
+#ifdef STACK_GROWS_DOWNWARD
+ offset = -args_size;
+#else
+ offset = args_size;
+#endif
}
- else if (GET_CODE (dest) == MEM)
+ else if (GET_CODE (PATTERN (insn)) == SET)
{
- /* (set (mem (pre_dec (reg sp))) (foo)) */
- src = XEXP (dest, 0);
- code = GET_CODE (src);
+ rtx src, dest;
+ enum rtx_code code;
+
+ insn = PATTERN (insn);
+ src = SET_SRC (insn);
+ dest = SET_DEST (insn);
+
+ if (dest == stack_pointer_rtx)
+ {
+ /* (set (reg sp) (plus (reg sp) (const_int))) */
+ code = GET_CODE (src);
+ if (! (code == PLUS || code == MINUS)
+ || XEXP (src, 0) != stack_pointer_rtx
+ || GET_CODE (XEXP (src, 1)) != CONST_INT)
+ return;
+
+ offset = INTVAL (XEXP (src, 1));
+ }
+ else if (GET_CODE (dest) == MEM)
+ {
+ /* (set (mem (pre_dec (reg sp))) (foo)) */
+ src = XEXP (dest, 0);
+ code = GET_CODE (src);
+
+ if (! (code == PRE_DEC || code == PRE_INC)
+ || XEXP (src, 0) != stack_pointer_rtx)
+ return;
- if (! (code == PRE_DEC || code == PRE_INC)
- || XEXP (src, 0) != stack_pointer_rtx)
+ offset = GET_MODE_SIZE (GET_MODE (dest));
+ }
+ else
return;
- offset = GET_MODE_SIZE (GET_MODE (dest));
+ if (code == PLUS || code == PRE_INC)
+ offset = -offset;
}
else
return;
- if (code == PLUS || code == PRE_INC)
- offset = -offset;
+ if (offset == 0)
+ return;
+
if (cfa_reg == STACK_POINTER_REGNUM)
cfa_offset += offset;
@@ -997,7 +1017,7 @@ dwarf2out_frame_debug (insn)
if (! RTX_FRAME_RELATED_P (insn))
{
- dwarf2out_stack_adjust (PATTERN (insn));
+ dwarf2out_stack_adjust (insn);
return;
}
diff --git a/gcc/except.c b/gcc/except.c
index 7929e9c..ae75175 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -1668,6 +1668,8 @@ end_eh_unwinder ()
/* Get the address we need to use to determine what exception
handler should be invoked, and store it in __eh_pc. */
return_val_rtx = eh_outer_context (return_val_rtx);
+ return_val_rtx = expand_binop (Pmode, sub_optab, return_val_rtx, GEN_INT (1),
+ NULL_RTX, 0, OPTAB_LIB_WIDEN);
emit_move_insn (eh_saved_pc_rtx, return_val_rtx);
/* Either set things up so we do a return directly to __throw, or
diff --git a/gcc/final.c b/gcc/final.c
index 48e1a08..8e7675e 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -1590,6 +1590,12 @@ final_scan_insn (insn, file, optimize, prescan, nopeepholes)
if (NEXT_INSN (insn))
ASM_OUTPUT_ALIGN_CODE (file);
#endif
+#if defined (DWARF2_UNWIND_INFO) && !defined (ACCUMULATE_OUTGOING_ARGS)
+ /* If we push arguments, we need to check all insns for stack
+ adjustments. */
+ if (dwarf2out_do_frame ())
+ dwarf2out_frame_debug (insn);
+#endif
break;
case CODE_LABEL:
diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c
index 6b3b7b4..2b9c6bc 100644
--- a/gcc/libgcc2.c
+++ b/gcc/libgcc2.c
@@ -3337,15 +3337,11 @@ 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)
{
- if (table[pos].start <= pc && table[pos].end >= pc)
+ if (table[pos].start <= pc && table[pos].end > pc)
{
/* This can apply. Make sure it is at least as small as
the previous best. */
@@ -3354,7 +3350,7 @@ find_exception_handler (void *pc, exception_table *table)
best = pos;
}
/* But it is sorted by starting PC within a function. */
- else if (best && table[pos].start > pc)
+ else if (best >= 0 && table[pos].start > pc)
break;
}
if (best != -1)
@@ -3686,8 +3682,9 @@ label:
break;
}
- /* Otherwise, we continue searching. */
- pc = get_return_addr (udata, sub_udata);
+ /* Otherwise, we continue searching. We subtract 1 from PC to avoid
+ hitting the beginning of the next region. */
+ pc = get_return_addr (udata, sub_udata) - 1;
}
/* If we haven't found a handler by now, this is an unhandled
@@ -3736,7 +3733,7 @@ label:
put_reg (i, val, my_udata);
}
- pc = get_return_addr (udata, sub_udata);
+ pc = get_return_addr (udata, sub_udata) - 1;
}
#ifdef INCOMING_REGNO