aboutsummaryrefslogtreecommitdiff
path: root/gcc/libgcc2.c
diff options
context:
space:
mode:
authorJason Merrill <jason@yorick.cygnus.com>1997-09-27 18:16:15 +0000
committerJason Merrill <jason@gcc.gnu.org>1997-09-27 14:16:15 -0400
commit2f3ca9e7f4bc29c645df8a51023ece6ece8faf9d (patch)
treea5a4bcb347df37e58a470806a1587b469f81d6af /gcc/libgcc2.c
parentfaf199a62194ffea2487c131c0ef8efc2c6127f5 (diff)
downloadgcc-2f3ca9e7f4bc29c645df8a51023ece6ece8faf9d.zip
gcc-2f3ca9e7f4bc29c645df8a51023ece6ece8faf9d.tar.gz
gcc-2f3ca9e7f4bc29c645df8a51023ece6ece8faf9d.tar.bz2
c-decl.c (init_decl_processing): Add __builtin_dwarf_reg_size.
* c-decl.c (init_decl_processing): Add __builtin_dwarf_reg_size. * tree.h (built_in_function): Likewise. * expr.c (expand_builtin): Likewise. * except.h: Likewise. * dwarf2out.c (expand_builtin_dwarf_reg_size): New fn. * libgcc2.c (copy_reg): New fn. (__throw): Use it. From-SVN: r15750
Diffstat (limited to 'gcc/libgcc2.c')
-rw-r--r--gcc/libgcc2.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c
index 2b9c6bc..6a49a1b 100644
--- a/gcc/libgcc2.c
+++ b/gcc/libgcc2.c
@@ -3556,6 +3556,22 @@ put_reg (unsigned reg, void *val, frame_state *udata)
abort ();
}
+/* Copy the saved value for register REG from frame UDATA to frame
+ TARGET_UDATA. Unlike the previous two functions, this can handle
+ registers that are not one word large. */
+
+static void
+copy_reg (unsigned reg, frame_state *udata, frame_state *target_udata)
+{
+ if (udata->saved[reg] == REG_SAVED_OFFSET
+ && target_udata->saved[reg] == REG_SAVED_OFFSET)
+ memcpy (target_udata->cfa + target_udata->reg_or_offset[reg],
+ udata->cfa + udata->reg_or_offset[reg],
+ __builtin_dwarf_reg_size (reg));
+ else
+ abort ();
+}
+
/* Retrieve the return address for frame UDATA, where SUB_UDATA is a
frame called by UDATA or 0. */
@@ -3729,8 +3745,7 @@ label:
&& udata->reg_or_offset[udata->retaddr_column] == i)
continue;
#endif
- val = get_reg (i, udata, sub_udata);
- put_reg (i, val, my_udata);
+ copy_reg (i, udata, my_udata);
}
pc = get_return_addr (udata, sub_udata) - 1;
@@ -3744,10 +3759,7 @@ label:
{
i = udata->reg_or_offset[udata->retaddr_column];
if (in_reg_window (i, udata))
- {
- val = get_reg (i, udata, sub_udata);
- put_reg (i, val, my_udata);
- }
+ copy_reg (i, udata, sub_udata);
}
#endif
}