diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1997-08-02 13:23:45 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1997-08-02 13:23:45 -0400 |
commit | 4e264c3fbff6865864ef7067051241dda368eaf9 (patch) | |
tree | c594343881b4a372bfc0e5ad3473da8d89a8b916 /gcc/config/m88k | |
parent | e72f998d695bfdaa608ea49d8b0f6438b563e282 (diff) | |
download | gcc-4e264c3fbff6865864ef7067051241dda368eaf9.zip gcc-4e264c3fbff6865864ef7067051241dda368eaf9.tar.gz gcc-4e264c3fbff6865864ef7067051241dda368eaf9.tar.bz2 |
(m88k_builtin_saveregs): If -fcheck-memory-usage, set rights of saved
registers.
From-SVN: r14622
Diffstat (limited to 'gcc/config/m88k')
-rw-r--r-- | gcc/config/m88k/m88k.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/gcc/config/m88k/m88k.c b/gcc/config/m88k/m88k.c index b313837..7300a4c 100644 --- a/gcc/config/m88k/m88k.c +++ b/gcc/config/m88k/m88k.c @@ -1,5 +1,5 @@ /* Subroutines for insn-output.c for Motorola 88000. - Copyright (C) 1988, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. + Copyright (C) 1988, 92, 93, 94, 95, 16, 1997 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@mcc.com) Currently maintained by (gcc@dg-rtp.dg.com) @@ -2585,7 +2585,7 @@ struct rtx_def * m88k_builtin_saveregs (arglist) tree arglist; { - rtx block, addr, argsize; + rtx block, addr, argsize, dest; tree fntype = TREE_TYPE (current_function_decl); int argadj = ((!(TYPE_ARG_TYPES (fntype) != 0 && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype))) @@ -2635,12 +2635,27 @@ m88k_builtin_saveregs (arglist) /* Now store the incoming registers. */ if (fixed < 8) - move_block_from_reg - (2 + fixed, - change_address (addr, Pmode, - plus_constant (XEXP (addr, 0), - fixed * UNITS_PER_WORD)), - 8 - fixed, UNITS_PER_WORD * (8 - fixed)); + { + dest = change_address (addr, Pmode, + plus_constant (XEXP (addr, 0), + fixed * UNITS_PER_WORD)); + move_block_from_reg (2 + fixed, dest, 8 - fixed, + UNITS_PER_WORD * (8 - fixed)); + } + + if (flag_check_memory_usage) + { + emit_library_call (chkr_set_right_libfunc, 1, VOIDmode, 3, + block, ptr_mode, + GEN_INT (3 * UNITS_PER_WORD), TYPE_MODE (sizetype), + GEN_INT (MEMORY_USE_RW), QImode); + if (fixed < 8) + emit_library_call (chkr_set_right_libfunc, 1, VOIDmode, 3, + dest, ptr_mode, + GEN_INT (UNITS_PER_WORD * (8 - fixed)), + TYPE_MODE (sizetype), + GEN_INT (MEMORY_USE_RW), QImode); + } /* Return the address of the va_list constructor, but don't put it in a register. This fails when not optimizing and produces worse code when |