From 68566610afdbfd7f946eea2c4a262586160d9282 Mon Sep 17 00:00:00 2001 From: Andrew Haley Date: Wed, 12 Mar 2003 16:14:01 +0000 Subject: gjavah.c (is_first_data_member): New global variable. 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. From-SVN: r64247 --- gcc/java/gjavah.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'gcc/java/gjavah.c') diff --git a/gcc/java/gjavah.c b/gcc/java/gjavah.c index 42f3327..23af65a 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); -- cgit v1.1