summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/emit-rtl.c28
-rw-r--r--gcc/function.c2
-rw-r--r--gcc/rtl.h1
4 files changed, 36 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f5888be3c6a..42db6357cc1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2003-02-28 Josef Zlomek <zlomekj@suse.cz>
+
+ * emit-rtl.c (set_reg_attrs_for_parm): New function.
+ * rtl.h (set_reg_attrs_for_parm): New exported function.
+ * function.c (assign_parms): Use set_reg_attrs_for_parm instead of
+ set_reg_attrs_from_mem.
+
2003-02-27 Roger Sayle <roger@eyesopen.com>
Zack Weinberg <zack@codesourcery.com>
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index aefa8740716..28c75ee2896 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -1,6 +1,6 @@
/* Emit RTL for the GNU C-Compiler expander.
Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
- 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+ 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
This file is part of GCC.
@@ -931,6 +931,32 @@ set_reg_attrs_from_mem (reg, mem)
= get_reg_attrs (MEM_EXPR (mem), INTVAL (MEM_OFFSET (mem)));
}
+/* Set the register attributes for registers contained in PARM_RTX.
+ Use needed values from memory attributes of MEM. */
+
+void
+set_reg_attrs_for_parm (parm_rtx, mem)
+ rtx parm_rtx;
+ rtx mem;
+{
+ if (GET_CODE (parm_rtx) == REG)
+ set_reg_attrs_from_mem (parm_rtx, mem);
+ else if (GET_CODE (parm_rtx) == PARALLEL)
+ {
+ /* Check for a NULL entry in the first slot, used to indicate that the
+ parameter goes both on the stack and in registers. */
+ int i = XEXP (XVECEXP (parm_rtx, 0, 0), 0) ? 0 : 1;
+ for (; i < XVECLEN (parm_rtx, 0); i++)
+ {
+ rtx x = XVECEXP (parm_rtx, 0, i);
+ if (GET_CODE (XEXP (x, 0)) == REG)
+ REG_ATTRS (XEXP (x, 0))
+ = get_reg_attrs (MEM_EXPR (mem),
+ INTVAL (XEXP (x, 1)));
+ }
+ }
+}
+
/* Assign the RTX X to declaration T. */
void
set_decl_rtl (t, x)
diff --git a/gcc/function.c b/gcc/function.c
index a47ab3eac0d..851dd246ee9 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -4460,7 +4460,7 @@ assign_parms (fndecl)
/* Set also REG_ATTRS if parameter was passed in a register. */
if (entry_parm)
- set_reg_attrs_from_mem (entry_parm, stack_parm);
+ set_reg_attrs_for_parm (entry_parm, stack_parm);
}
/* If this parameter was passed both in registers and in the stack,
diff --git a/gcc/rtl.h b/gcc/rtl.h
index ff6c5810232..89f554da724 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1378,6 +1378,7 @@ extern rtx gen_int_mode PARAMS ((HOST_WIDE_INT,
extern rtx emit_copy_of_insn_after PARAMS ((rtx, rtx));
extern void set_reg_attrs_from_mem PARAMS ((rtx, rtx));
extern void set_mem_attrs_from_reg PARAMS ((rtx, rtx));
+extern void set_reg_attrs_for_parm PARAMS ((rtx, rtx));
/* In rtl.c */
extern rtx rtx_alloc PARAMS ((RTX_CODE));