aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJ"orn Rennecke <joern.rennecke@st.com>2005-08-18 16:42:25 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>2005-08-18 17:42:25 +0100
commit8a2209bfdbc6b924513c9fa6ef1dfe28b7bd1366 (patch)
tree126ac22eefdcfbbcbf1a06b8c653104b52bf281e /gcc
parent1e24ce8318a4c3bd747d76a5178e0a807b31d2ed (diff)
downloadgcc-8a2209bfdbc6b924513c9fa6ef1dfe28b7bd1366.zip
gcc-8a2209bfdbc6b924513c9fa6ef1dfe28b7bd1366.tar.gz
gcc-8a2209bfdbc6b924513c9fa6ef1dfe28b7bd1366.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/sh/sh.c20
2 files changed, 20 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c384e66..65af73f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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>
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index 1205540..ed132f6 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -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)