diff options
author | Jason Merrill <jason@yorick.cygnus.com> | 1997-09-27 18:16:15 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 1997-09-27 14:16:15 -0400 |
commit | 2f3ca9e7f4bc29c645df8a51023ece6ece8faf9d (patch) | |
tree | a5a4bcb347df37e58a470806a1587b469f81d6af /gcc/libgcc2.c | |
parent | faf199a62194ffea2487c131c0ef8efc2c6127f5 (diff) | |
download | gcc-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.c | 24 |
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 } |