]> gcc.gnu.org Git - gcc.git/commitdiff
re PR target/10781 (wrong class size and alignment with static class member)
authorAndrew Pinski <pinskia@physics.uc.edu>
Sat, 17 Jan 2004 19:48:50 +0000 (19:48 +0000)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Sat, 17 Jan 2004 19:48:50 +0000 (11:48 -0800)
2004-01-17  Andrew Pinski  <pinskia@physics.uc.edu>

        PR target/10781
        * config/rs6000/rs6000-protos.h (rs6000_special_round_type_align):
        Prototype.
        * config/rs6000/rs6000.c (rs6000_special_round_type_align):
        New function.
        * config/rs6000/linux64.h (ROUND_TYPE_ALIGN): Use it.
        * config/rs6000/aix.h (ROUND_TYPE_ALIGN): Likewise.
        * config/rs6000/darwin.h (ROUND_TYPE_ALIGN): Likewise.

2004-01-17  Andrew Pinski  <pinskia@physics.uc.edu>

        PR target/10781
        * encoding.c (rs6000_special_round_type_align): Define.

From-SVN: r76043

gcc/ChangeLog
gcc/config/rs6000/aix.h
gcc/config/rs6000/darwin.h
gcc/config/rs6000/linux64.h
gcc/config/rs6000/rs6000-protos.h
gcc/config/rs6000/rs6000.c
libobjc/ChangeLog
libobjc/encoding.c

index e1f443c2db37df79250abbe478ea96409d2f05dc..ee0da69d6a4bc8ac4a7b43999618007cb00ebd5c 100644 (file)
@@ -1,3 +1,14 @@
+2004-01-17  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR target/10781
+       * config/rs6000/rs6000-protos.h (rs6000_special_round_type_align):
+       Prototype.
+       * config/rs6000/rs6000.c (rs6000_special_round_type_align):
+       New function.
+       * config/rs6000/linux64.h (ROUND_TYPE_ALIGN): Use it.
+       * config/rs6000/aix.h (ROUND_TYPE_ALIGN): Likewise.
+       * config/rs6000/darwin.h (ROUND_TYPE_ALIGN): Likewise.
+
 2004-01-17  Jan Hubicka  <jh@suse.cz>
 
        * toplev.c (rest_of_handle_reorder_blocks): Fix pasto in previous
index 3318621a2537bbb2834229122d4f15e6b81d098b..69a0a0179209e280c1b4711862a3bd696ede1259 100644 (file)
 
 /* AIX increases natural record alignment to doubleword if the first
    field is an FP double while the FP fields remain word aligned.  */
-#define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED)  \
-  ((TREE_CODE (STRUCT) == RECORD_TYPE                  \
-    || TREE_CODE (STRUCT) == UNION_TYPE                        \
-    || TREE_CODE (STRUCT) == QUAL_UNION_TYPE)          \
-   && TYPE_FIELDS (STRUCT) != 0                                \
-   && TARGET_ALIGN_NATURAL == 0                         \
-   && DECL_MODE (TYPE_FIELDS (STRUCT)) == DFmode       \
-   ? MAX (MAX ((COMPUTED), (SPECIFIED)), 64)           \
+#define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED)                          \
+  ((TREE_CODE (STRUCT) == RECORD_TYPE                                          \
+    || TREE_CODE (STRUCT) == UNION_TYPE                                                \
+    || TREE_CODE (STRUCT) == QUAL_UNION_TYPE)                                  \
+   && TARGET_ALIGN_NATURAL == 0                                                        \
+   ? rs6000_special_round_type_align (STRUCT, COMPUTED, SPECIFIED)             \
    : MAX ((COMPUTED), (SPECIFIED)))
 
 /* The AIX ABI isn't explicit on whether aggregates smaller than a
index c77279d21427c8719c44377fa3c51d46279a952a..6db0006999193acd3b2c7ccd2e46ff79b362c521 100644 (file)
@@ -295,16 +295,14 @@ do {                                                                      \
 
 /* Darwin increases natural record alignment to doubleword if the first
    field is an FP double while the FP fields remain word aligned.  */
-#define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED)  \
-  ((TREE_CODE (STRUCT) == RECORD_TYPE                  \
-    || TREE_CODE (STRUCT) == UNION_TYPE                        \
-    || TREE_CODE (STRUCT) == QUAL_UNION_TYPE)          \
-   && TYPE_FIELDS (STRUCT) != 0                                \
-   && TARGET_ALIGN_NATURAL == 0                         \
-   && DECL_MODE (TYPE_FIELDS (STRUCT)) == DFmode       \
-   ? MAX (MAX ((COMPUTED), (SPECIFIED)), 64)           \
-   : (TARGET_ALTIVEC && TREE_CODE (STRUCT) == VECTOR_TYPE) \
-   ? MAX (MAX ((COMPUTED), (SPECIFIED)), 128)           \
+#define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED)                  \
+  ((TREE_CODE (STRUCT) == RECORD_TYPE                                  \
+    || TREE_CODE (STRUCT) == UNION_TYPE                                        \
+    || TREE_CODE (STRUCT) == QUAL_UNION_TYPE)                          \
+   && TARGET_ALIGN_NATURAL == 0                                        \
+   ? rs6000_special_round_type_align (STRUCT, COMPUTED, SPECIFIED)     \
+   : (TARGET_ALTIVEC && TREE_CODE (STRUCT) == VECTOR_TYPE)             \
+   ? MAX (MAX ((COMPUTED), (SPECIFIED)), 128)                                   \
    : MAX ((COMPUTED), (SPECIFIED)))
 
 /* XXX: Darwin supports neither .quad, or .llong, but it also doesn't
@@ -322,3 +320,4 @@ do {                                                                        \
 
 #undef REGISTER_TARGET_PRAGMAS
 #define REGISTER_TARGET_PRAGMAS DARWIN_REGISTER_TARGET_PRAGMAS
+
index d56c106b5334fa222619505972d793fc00dd3865..d36aef4485ed49e3e6190e24fe128e9e2001a315 100644 (file)
    : (COMPUTED))
 
 /* PowerPC64 Linux increases natural record alignment to doubleword if
-   the first field is an FP double.  */
+   the first field is an FP double, only if in power alignment mode.  */
 #undef  ROUND_TYPE_ALIGN
-#define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED)          \
-  ((TARGET_ALTIVEC && TREE_CODE (STRUCT) == VECTOR_TYPE)       \
-   ? MAX (MAX ((COMPUTED), (SPECIFIED)), 128)                  \
-   : (TARGET_64BIT                                             \
-      && (TREE_CODE (STRUCT) == RECORD_TYPE                    \
-         || TREE_CODE (STRUCT) == UNION_TYPE                   \
-         || TREE_CODE (STRUCT) == QUAL_UNION_TYPE)             \
-      && TYPE_FIELDS (STRUCT) != 0                             \
-      && TARGET_ALIGN_NATURAL == 0                             \
-      && DECL_MODE (TYPE_FIELDS (STRUCT)) == DFmode)           \
-   ? MAX (MAX ((COMPUTED), (SPECIFIED)), 64)                   \
+#define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED)                  \
+  ((TARGET_ALTIVEC && TREE_CODE (STRUCT) == VECTOR_TYPE)               \
+   ? MAX (MAX ((COMPUTED), (SPECIFIED)), 128)                          \
+   : (TARGET_64BIT                                                     \
+      && (TREE_CODE (STRUCT) == RECORD_TYPE                            \
+         || TREE_CODE (STRUCT) == UNION_TYPE                           \
+         || TREE_CODE (STRUCT) == QUAL_UNION_TYPE)                     \
+      && TARGET_ALIGN_NATURAL == 0)                                    \
+   ? rs6000_special_round_type_align (STRUCT, COMPUTED, SPECIFIED)     \
    : MAX ((COMPUTED), (SPECIFIED)))
 
 /* Indicate that jump tables go in the text section.  */
index abf39c6ed96c5a39eb6905033724f56e0efafdab..b98027ef82299052974e0027de86d8623862b6d7 100644 (file)
@@ -144,6 +144,7 @@ extern rtx rs6000_machopic_legitimize_pic_address (rtx orig,
 #endif /* RTX_CODE */
 
 #ifdef TREE_CODE
+extern int rs6000_special_round_type_align (tree, int, int);
 extern void function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode,
                                          tree, int);
 extern int function_arg_boundary (enum machine_mode, tree);
index 183cf21ab7e90704b59105bb7f7767f8b885b031..0a5de536d91dfd4521ec7533cad532ca674a2143 100644 (file)
@@ -2317,6 +2317,28 @@ input_operand (rtx op, enum machine_mode mode)
   return 0;
 }
 
+
+/* Darwin, AIX increases natural record alignment to doubleword if the first
+   field is an FP double while the FP fields remain word aligned.  */
+
+int
+rs6000_special_round_type_align (tree type, int computed, int specified)
+{
+  tree field = TYPE_FIELDS (type);
+  if (!field)
+    return MAX (computed, specified);
+
+  /* Skip all the static variables only if ABI is greater than
+     1 or equal to 0.   */
+  while (TREE_CODE (field) == VAR_DECL)
+    field = TREE_CHAIN (field);
+
+  if (field == type || DECL_MODE (field) != DFmode)
+    return MAX (computed, specified);
+
+  return MAX (MAX (computed, specified), 64);
+}
+
 /* Return 1 for an operand in small memory on V.4/eabi.  */
 
 int
index 069a1f9dc5153518b31bd6dfb4ed44544f2fb36e..cf2fe5f73ace5d58fd9617bbb56ea9fbd4c6868e 100644 (file)
@@ -1,3 +1,8 @@
+2004-01-17  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR target/10781
+       * encoding.c (rs6000_special_round_type_align): Define.
+
 2004-01-14  Adam Fedor  <fedor@gnu.org>
 
        PR libobjc/12155
index bed0653cff7188e1e025ff7e33ebd7f13c8306a0..17bc8d4e2e149b62c41cfcdf5cfc3570a064a64f 100644 (file)
@@ -88,6 +88,17 @@ Boston, MA 02111-1307, USA.  */
    eliminate the warning.  */
 static int __attribute__ ((__unused__)) target_flags = 0;
 
+
+/*  FIXME: while this file has no business including tm.h, this
+    definitely has no business defining this macro but it
+    is only way around without really rewritting this file,
+    should look after the branch of 3.4 to fix this.  */
+#define rs6000_special_round_type_align(STRUCT, COMPUTED, SPECIFIED)   \
+  ((TYPE_FIELDS (STRUCT) != 0                                          \
+    && DECL_MODE (TYPE_FIELDS (STRUCT)) == DFmode)                     \
+   ? MAX (MAX (COMPUTED, SPECIFIED), 64)                               \
+   : MAX (COMPUTED, SPECIFIED))
+
 /*
   return the size of an object specified by type
 */
This page took 0.085632 seconds and 5 git commands to generate.