aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1997-08-02 13:22:01 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1997-08-02 13:22:01 -0400
commit5b838011fe8f31b03f2194d2d93cd1f8ea7300e1 (patch)
tree2910b4babab06ef8ba96370223f69ab61e47eef5 /gcc
parent7c6d41201350820950728973099f783e1976b444 (diff)
downloadgcc-5b838011fe8f31b03f2194d2d93cd1f8ea7300e1.zip
gcc-5b838011fe8f31b03f2194d2d93cd1f8ea7300e1.tar.gz
gcc-5b838011fe8f31b03f2194d2d93cd1f8ea7300e1.tar.bz2
(alpha_builtin_saveregs): If -fcheck-memory-usage, set rights of saved
registers. From-SVN: r14620
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/alpha/alpha.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c
index c918b5b..de66e1d 100644
--- a/gcc/config/alpha/alpha.c
+++ b/gcc/config/alpha/alpha.c
@@ -1536,7 +1536,7 @@ struct rtx_def *
alpha_builtin_saveregs (arglist)
tree arglist;
{
- rtx block, addr, argsize;
+ rtx block, addr, dest, argsize;
tree fntype = TREE_TYPE (current_function_decl);
int stdarg = (TYPE_ARG_TYPES (fntype) != 0
&& (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
@@ -1591,14 +1591,28 @@ alpha_builtin_saveregs (arglist)
/* Store the address of the first integer register in the __base
member. */
- emit_move_insn (change_address (block, ptr_mode, XEXP (block, 0)), addr);
+ dest = change_address (block, ptr_mode, XEXP (block, 0));
+ emit_move_insn (dest, addr);
+ if (flag_check_memory_usage)
+ emit_library_call (chkr_set_right_libfunc, 1, VOIDmode, 3, dest,
+ ptr_mode, GEN_INT (GET_MODE_SIZE (ptr_mode)),
+ TYPE_MODE (sizetype),
+ GEN_INT (MEMORY_USE_RW), QImode);
+
/* Store the argsize as the __va_offset member. */
- emit_move_insn
- (change_address (block, TYPE_MODE (integer_type_node),
- plus_constant (XEXP (block, 0),
- POINTER_SIZE/BITS_PER_UNIT)),
- argsize);
+ dest = change_address (block, TYPE_MODE (integer_type_node),
+ plus_constant (XEXP (block, 0),
+ POINTER_SIZE/BITS_PER_UNIT));
+ emit_move_insn (dest, argsize);
+
+ if (flag_check_memory_usage)
+ emit_library_call (chkr_set_right_libfunc, 1, VOIDmode, 3, dest,
+ ptr_mode,
+ GEN_INT (GET_MODE_SIZE
+ (TYPE_MODE (integer_type_node))),
+ 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. Doing so would fail when not optimizing and produce worse