sh.c (sh_gimplify_va_arg_expr): Loop to substitute a RECORD_TYPE record with the...
authorJ"orn Rennecke <joern.rennecke@st.com>
Thu, 18 Aug 2005 16:42:25 +0000 (16:42 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Thu, 18 Aug 2005 16:42:25 +0000 (17:42 +0100)
* sh.c (sh_gimplify_va_arg_expr): Loop to substitute a RECORD_TYPE
record with the type of its only member.

From-SVN: r103254

gcc/ChangeLog
gcc/config/sh/sh.c

index c384e668297fe1ed23ebb8f4ae1e5e4c9e631a10..65af73ff27b9a97fcfac2a46b01e69ee2d94a03b 100644 (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>
index 12055408dd240fff34d0f087ebd2952a05dc9787..ed132f6c82dae258e08d5ad29ef05f0327760171 100644 (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)