sh.c (sh_gimplify_va_arg_expr): Loop to substitute a RECORD_TYPE record with the type of its only member.

* sh.c (sh_gimplify_va_arg_expr): Loop to substitute a RECORD_TYPE
	record with the type of its only member.

From-SVN: r103254
This commit is contained in:
J"orn Rennecke 2005-08-18 16:42:25 +00:00 committed by Joern Rennecke
parent 1e24ce8318
commit 8a2209bfdb
2 changed files with 20 additions and 8 deletions

View File

@ -1,3 +1,8 @@
2005-08-18 J"orn Rennecke <joern.rennecke@st.com>
* sh.c (sh_gimplify_va_arg_expr): Loop to substitute a RECORD_TYPE
record with the type of its only member.
2005-08-18 David Edelsohn <edelsohn@gnu.org>
* config/rs6000/rs6000.md (ltu<mode>_compare): Convert to
@ -81,6 +86,9 @@
2005-08-17 J"orn Rennecke <joern.rennecke@st.com>
* sh.c (sh_gimplify_va_arg_expr): Don't substitute a RECORD_TYPE
record with the type of its only member if the modes don't match.
* varasm.c (decode_reg_name): Skip empty additional register names.
2005-08-16 Zdenek Dvorak <dvorakz@suse.cz>

View File

@ -6678,20 +6678,24 @@ sh_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p,
/* Structures with a single member with a distinct mode are passed
like their member. This is relevant if the latter has a REAL_TYPE
or COMPLEX_TYPE type. */
if (TREE_CODE (type) == RECORD_TYPE
&& TYPE_FIELDS (type)
&& TREE_CODE (TYPE_FIELDS (type)) == FIELD_DECL
&& (TREE_CODE (TREE_TYPE (TYPE_FIELDS (type))) == REAL_TYPE
|| TREE_CODE (TREE_TYPE (TYPE_FIELDS (type))) == COMPLEX_TYPE)
&& TREE_CHAIN (TYPE_FIELDS (type)) == NULL_TREE)
while (TREE_CODE (type) == RECORD_TYPE
&& TYPE_FIELDS (type)
&& TREE_CODE (TYPE_FIELDS (type)) == FIELD_DECL
&& (TREE_CODE (TREE_TYPE (TYPE_FIELDS (type))) == REAL_TYPE
|| TREE_CODE (TREE_TYPE (TYPE_FIELDS (type))) == COMPLEX_TYPE
|| TREE_CODE (TREE_TYPE (TYPE_FIELDS (type))) == RECORD_TYPE)
&& TREE_CHAIN (TYPE_FIELDS (type)) == NULL_TREE)
{
tree field_type = TREE_TYPE (TYPE_FIELDS (type));
if (TYPE_MODE (type) == TYPE_MODE (field_type))
type = field_type;
else
gcc_assert (TYPE_ALIGN (type)
< GET_MODE_ALIGNMENT (TYPE_MODE (field_type)));
{
gcc_assert (TYPE_ALIGN (type)
< GET_MODE_ALIGNMENT (TYPE_MODE (field_type)));
break;
}
}
if (TARGET_SH4)