gjavah.c (is_first_data_member): New global variable.
authorAndrew Haley <aph@redhat.com>
Wed, 12 Mar 2003 16:14:01 +0000 (16:14 +0000)
committerAndrew Haley <aph@gcc.gnu.org>
Wed, 12 Mar 2003 16:14:01 +0000 (16:14 +0000)
2003-03-04  Andrew Haley  <aph@redhat.com>

        * gjavah.c (is_first_data_member): New global variable.
        (print_c_decl): If it's the first data member, align it as the
        superclass.
        (process_file): Set is_first_data_member.

From-SVN: r64247

gcc/java/ChangeLog
gcc/java/gjavah.c

index 0c9bc9b182af6adf26b0297ba10cfd5d6a2420d0..13fa86ab2ad079ddec84f2dba4719a7c5d9ceb51 100644 (file)
@@ -1,3 +1,10 @@
+2003-03-04  Andrew Haley  <aph@redhat.com>
+
+        * gjavah.c (is_first_data_member): New global variable.
+        (print_c_decl): If it's the first data member, align it as the
+        superclass.
+        (process_file): Set is_first_data_member.
+
 2003-03-11  Tom Tromey  <tromey@redhat.com>
 
        * parse.y (resolve_field_access): Initialize class if field is
index 42f33276edc4ca2e7822d092a6018d3d14010e5c..23af65ab3525b2d9f0698863ff60be6beb113176 100644 (file)
@@ -197,6 +197,9 @@ static int method_printed = 0;
 static int method_synthetic = 0;
 static int method_signature = 0;
 
+/* Set to 1 while the very first data member of a class is being handled.  */
+static int is_first_data_member = 0;
+
 #define HANDLE_METHOD(ACCESS_FLAGS, NAME, SIGNATURE, ATTRIBUTE_COUNT)  \
   {                                                                    \
     method_synthetic = 0;                                              \
@@ -1383,6 +1386,17 @@ print_c_decl (FILE* stream, JCF* jcf, int name_index, int signature_index,
            }
        }
 
+      /* Force the alignment of the first data member.  This is
+        because the "new" C++ ABI changed the alignemnt of non-POD
+        classes.  gcj, however, still uses the "old" alignment.  */
+      if (is_first_data_member && ! (flags & ACC_STATIC) && ! is_method)
+      {
+       is_first_data_member = 0;
+       print_cxx_classname (out, " __attribute__((aligned(__alignof__( ",
+                            jcf, jcf->super_class, 1);
+       fputs (" )))) ", stream);
+      }
+
       /* Now print the name of the thing.  */
       if (need_space)
        fputs (" ", stream);
@@ -2088,6 +2102,8 @@ process_file (JCF *jcf, FILE *out)
     }
 
   /* Now go back for second pass over methods and fields.  */
+  is_first_data_member = 1;
+
   JCF_SEEK (jcf, method_start);
   method_pass = 1;
   jcf_parse_methods (jcf);