Commit fbe6ec81 by Josef Zlomek Committed by Josef Zlomek

emit-rtl.c (set_decl_incoming_rtl): New.

	PR/14058
	* emit-rtl.c (set_decl_incoming_rtl): New.
	* tree.h (set_decl_incoming_rtl): New.
	* function.c (assign_parms): Use set_decl_incoming_rtl for setting
	DECL_INCOMING_RTL.
	* ada/misc.c (adjust_decl_rtl): Likewise.

From-SVN: r77611
parent 8a4baa83
2004-02-10 Josef Zlomek <zlomekj@suse.cz>
PR/14058
* emit-rtl.c (set_decl_incoming_rtl): New.
* tree.h (set_decl_incoming_rtl): New.
* function.c (assign_parms): Use set_decl_incoming_rtl for setting
DECL_INCOMING_RTL.
* ada/misc.c (adjust_decl_rtl): Likewise.
2004-02-10 Per Bothner <per@bothner.com> 2004-02-10 Per Bothner <per@bothner.com>
* c-opts.c (c_common_post_options): Don't emit working directory * c-opts.c (c_common_post_options): Don't emit working directory
......
...@@ -774,7 +774,7 @@ adjust_decl_rtl (tree decl) ...@@ -774,7 +774,7 @@ adjust_decl_rtl (tree decl)
DECL_SIZE (decl) = TYPE_SIZE (new_type); DECL_SIZE (decl) = TYPE_SIZE (new_type);
if (TREE_CODE (decl) == PARM_DECL) if (TREE_CODE (decl) == PARM_DECL)
DECL_INCOMING_RTL (decl) = XEXP (DECL_INCOMING_RTL (decl), 0); set_decl_incoming_rtl (decl, XEXP (DECL_INCOMING_RTL (decl), 0));
/* If DECL_INITIAL was set, it should be updated to show that /* If DECL_INITIAL was set, it should be updated to show that
the decl is initialized to the address of that thing. the decl is initialized to the address of that thing.
......
...@@ -828,6 +828,40 @@ set_decl_rtl (tree t, rtx x) ...@@ -828,6 +828,40 @@ set_decl_rtl (tree t, rtx x)
} }
} }
/* Assign the RTX X to parameter declaration T. */
void
set_decl_incoming_rtl (tree t, rtx x)
{
DECL_INCOMING_RTL (t) = x;
if (!x)
return;
/* For register, we maintain the reverse information too. */
if (GET_CODE (x) == REG)
REG_ATTRS (x) = get_reg_attrs (t, 0);
else if (GET_CODE (x) == SUBREG)
REG_ATTRS (SUBREG_REG (x))
= get_reg_attrs (t, -SUBREG_BYTE (x));
if (GET_CODE (x) == CONCAT)
{
if (REG_P (XEXP (x, 0)))
REG_ATTRS (XEXP (x, 0)) = get_reg_attrs (t, 0);
if (REG_P (XEXP (x, 1)))
REG_ATTRS (XEXP (x, 1))
= get_reg_attrs (t, GET_MODE_UNIT_SIZE (GET_MODE (XEXP (x, 0))));
}
if (GET_CODE (x) == PARALLEL)
{
int i;
for (i = 0; i < XVECLEN (x, 0); i++)
{
rtx y = XVECEXP (x, 0, i);
if (REG_P (XEXP (y, 0)))
REG_ATTRS (XEXP (y, 0)) = get_reg_attrs (t, INTVAL (XEXP (y, 1)));
}
}
}
/* Identify REG (which may be a CONCAT) as a user register. */ /* Identify REG (which may be a CONCAT) as a user register. */
void void
......
...@@ -4645,7 +4645,7 @@ assign_parms (tree fndecl) ...@@ -4645,7 +4645,7 @@ assign_parms (tree fndecl)
entry_parm = stack_parm; entry_parm = stack_parm;
/* Record permanently how this parm was passed. */ /* Record permanently how this parm was passed. */
DECL_INCOMING_RTL (parm) = entry_parm; set_decl_incoming_rtl (parm, entry_parm);
/* If there is actually space on the stack for this parm, /* If there is actually space on the stack for this parm,
count it in stack_args_size; otherwise set stack_parm to 0 count it in stack_args_size; otherwise set stack_parm to 0
...@@ -4714,7 +4714,7 @@ assign_parms (tree fndecl) ...@@ -4714,7 +4714,7 @@ assign_parms (tree fndecl)
&& INTVAL (XEXP (XVECEXP (entry_parm, 0, i), 1)) == 0) && INTVAL (XEXP (XVECEXP (entry_parm, 0, i), 1)) == 0)
{ {
entry_parm = XEXP (XVECEXP (entry_parm, 0, i), 0); entry_parm = XEXP (XVECEXP (entry_parm, 0, i), 0);
DECL_INCOMING_RTL (parm) = entry_parm; set_decl_incoming_rtl (parm, entry_parm);
break; break;
} }
} }
...@@ -5225,20 +5225,22 @@ assign_parms (tree fndecl) ...@@ -5225,20 +5225,22 @@ assign_parms (tree fndecl)
{ {
if (TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE) if (TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE)
{ {
rtx tmp;
SET_DECL_RTL (parm, SET_DECL_RTL (parm,
gen_rtx_CONCAT (DECL_MODE (parm), gen_rtx_CONCAT (DECL_MODE (parm),
DECL_RTL (fnargs), DECL_RTL (fnargs),
DECL_RTL (TREE_CHAIN (fnargs)))); DECL_RTL (TREE_CHAIN (fnargs))));
DECL_INCOMING_RTL (parm) tmp = gen_rtx_CONCAT (DECL_MODE (parm),
= gen_rtx_CONCAT (DECL_MODE (parm),
DECL_INCOMING_RTL (fnargs), DECL_INCOMING_RTL (fnargs),
DECL_INCOMING_RTL (TREE_CHAIN (fnargs))); DECL_INCOMING_RTL (TREE_CHAIN (fnargs)));
set_decl_incoming_rtl (parm, tmp);
fnargs = TREE_CHAIN (fnargs); fnargs = TREE_CHAIN (fnargs);
} }
else else
{ {
SET_DECL_RTL (parm, DECL_RTL (fnargs)); SET_DECL_RTL (parm, DECL_RTL (fnargs));
DECL_INCOMING_RTL (parm) = DECL_INCOMING_RTL (fnargs); set_decl_incoming_rtl (parm, DECL_INCOMING_RTL (fnargs));
} }
fnargs = TREE_CHAIN (fnargs); fnargs = TREE_CHAIN (fnargs);
} }
......
...@@ -3080,6 +3080,7 @@ extern const char *dump_flag_name (enum tree_dump_index); ...@@ -3080,6 +3080,7 @@ extern const char *dump_flag_name (enum tree_dump_index);
/* Assign the RTX to declaration. */ /* Assign the RTX to declaration. */
extern void set_decl_rtl (tree, rtx); extern void set_decl_rtl (tree, rtx);
extern void set_decl_incoming_rtl (tree, rtx);
/* Redefine abort to report an internal error w/o coredump, and /* Redefine abort to report an internal error w/o coredump, and
reporting the location of the error in the source file. This logic reporting the location of the error in the source file. This logic
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment