aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/m88k
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1997-08-02 13:23:45 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1997-08-02 13:23:45 -0400
commit4e264c3fbff6865864ef7067051241dda368eaf9 (patch)
treec594343881b4a372bfc0e5ad3473da8d89a8b916 /gcc/config/m88k
parente72f998d695bfdaa608ea49d8b0f6438b563e282 (diff)
downloadgcc-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.c31
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