diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 0c9bc9b182a..13fa86ab2ad 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,10 @@ +2003-03-04 Andrew Haley + + * 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 * parse.y (resolve_field_access): Initialize class if field is diff --git a/gcc/java/gjavah.c b/gcc/java/gjavah.c index 42f33276edc..23af65ab352 100644 --- a/gcc/java/gjavah.c +++ b/gcc/java/gjavah.c @@ -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);