diff options
author | Andrew Haley <aph@redhat.com> | 2006-04-18 15:19:10 +0000 |
---|---|---|
committer | Andrew Haley <aph@redhat.com> | 2006-04-18 15:19:10 +0000 |
commit | e7accbf016bf087b15beaaaead6cacdb27e0096b (patch) | |
tree | c0540bd260df7ad2465ff5cbec7f942abd3d1934 | |
parent | b59465b29ca1ac0c1d8ced5861388cfe52ba12d6 (diff) |
2006-04-18 Andrew Haley <aph@redhat.com>
* lang.opt (flag_indirect_classes): New.
* gjavah.c (process_file): Comment out class$$.
* lang.c (java_init): Set flag_indirect_classes.
* mangle.c (mangle_member_name): Removed unused vars.
* class.c (emit_indirect_register_classes): Rewrite. Generate an
initialized array that contains the address of class initializer
and the address of each class$ pointer.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcj/gcj-abi-experimental-branch@113044 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/java/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/java/class.c | 57 | ||||
-rw-r--r-- | gcc/java/gjavah.c | 2 | ||||
-rw-r--r-- | gcc/java/lang.c | 3 | ||||
-rw-r--r-- | gcc/java/lang.opt | 2 | ||||
-rw-r--r-- | gcc/java/mangle.c | 2 |
6 files changed, 59 insertions, 17 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 877e67ebbd6..fcecbaadf89 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,13 @@ +2006-04-18 Andrew Haley <aph@redhat.com> + + * lang.opt (flag_indirect_classes): New. + * gjavah.c (process_file): Comment out class$$. + * lang.c (java_init): Set flag_indirect_classes. + * mangle.c (mangle_member_name): Removed unused vars. + * class.c (emit_indirect_register_classes): Rewrite. Generate an + initialized array that contains the address of class initializer + and the address of each class$ pointer. + 2006-02-15 Andrew Haley <aph@redhat.com> * class.c (GEN_TABLE): Don't pushdecl *_SYMS_DECL here. diff --git a/gcc/java/class.c b/gcc/java/class.c index 55551cd000b..f4fd38ca895 100644 --- a/gcc/java/class.c +++ b/gcc/java/class.c @@ -947,6 +947,7 @@ static tree build_static_class_ref (tree type) { tree decl_name, decl, ref; + if (TYPE_SIZE (type) == error_mark_node) return null_pointer_node; decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)), @@ -1956,7 +1957,14 @@ make_class_data (tree type) if (flag_hash_synchronization && POINTER_SIZE < 64) DECL_ALIGN (decl) = 64; + if (flag_indirect_classes) + { + TREE_READONLY (decl) = 1; + TREE_CONSTANT (DECL_INITIAL (decl)) = 1; + } + rest_of_decl_compilation (decl, 1, 0); + { tree classdollar_field = build_classdollar_field (type); if (!flag_indirect_classes) @@ -2482,23 +2490,46 @@ emit_indirect_register_classes (tree *list_p) tree klass, t, register_class_fn; int i; - t = build_function_type_list (class_ptr_type, class_ptr_type, NULL); + tree init = NULL_TREE; + int size = VEC_length (tree, registered_class) * 2 + 1; + tree class_array_type + = build_prim_array_type (ptr_type_node, size); + tree cdecl = build_decl (VAR_DECL, get_identifier ("_Jv_CLS"), + class_array_type); + tree reg_class_list; + for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i) + { + init = tree_cons (NULL_TREE, + fold_convert (ptr_type_node, + build_static_class_ref (klass)), init); + init = tree_cons + (NULL_TREE, + fold_convert (ptr_type_node, + build_address_of (build_classdollar_field (klass))), + init); + } + init = tree_cons (NULL_TREE, integer_zero_node, init); + DECL_INITIAL (cdecl) = build_constructor_from_list (class_array_type, + nreverse (init)); + TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1; + TREE_STATIC (cdecl) = 1; + DECL_ARTIFICIAL (cdecl) = 1; + DECL_IGNORED_P (cdecl) = 1; + TREE_READONLY (cdecl) = 1; + TREE_CONSTANT (cdecl) = 1; + rest_of_decl_compilation (cdecl, 1, 0); + reg_class_list = fold_convert (ptr_type_node, build_address_of (cdecl)); + + t = build_function_type_list (void_type_node, + build_pointer_type (ptr_type_node), NULL); t = build_decl (FUNCTION_DECL, - get_identifier ("_Jv_NewClassFromInitializer"), t); + get_identifier ("_Jv_RegisterNewClasses"), t); TREE_PUBLIC (t) = 1; DECL_EXTERNAL (t) = 1; register_class_fn = t; - - for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i) - { - output_class = current_class = klass; - t = build_static_class_ref (klass); - t = tree_cons (NULL, t, NULL); - t = build_function_call_expr (register_class_fn, t); - t = build2 (MODIFY_EXPR, class_ptr_type, build_class_ref (klass), - t); - append_to_statement_list (t, list_p); - } + t = tree_cons (NULL, reg_class_list, NULL); + t = build_function_call_expr (register_class_fn, t); + append_to_statement_list (t, list_p); } /* Emit something to register classes at start-up time. diff --git a/gcc/java/gjavah.c b/gcc/java/gjavah.c index 9fe8002bd90..2338842b31a 100644 --- a/gcc/java/gjavah.c +++ b/gcc/java/gjavah.c @@ -2275,7 +2275,7 @@ process_file (JCF *jcf, FILE *out) /* Generate an entry for the class objects. */ generate_access (out, ACC_PUBLIC); fprintf (out, " // gcj private: Do NOT use this field.\n"); - fprintf (out, " static ::java::lang::Class class$$;\n"); + fprintf (out, " // static ::java::lang::Class class$$;\n"); generate_access (out, ACC_PUBLIC); fprintf (out, "\n static ::java::lang::Class &class$;\n"); diff --git a/gcc/java/lang.c b/gcc/java/lang.c index 5f9a3701fdc..93d8d7ae636 100644 --- a/gcc/java/lang.c +++ b/gcc/java/lang.c @@ -357,6 +357,9 @@ java_init (void) if (flag_indirect_dispatch) always_initialize_class_p = true; + if (!flag_indirect_dispatch) + flag_indirect_classes = false; + /* Force minimum function alignment if g++ uses the least significant bit of function pointers to store the virtual bit. This is required to keep vtables compatible. */ diff --git a/gcc/java/lang.opt b/gcc/java/lang.opt index 5dcba5695c5..7940548aa19 100644 --- a/gcc/java/lang.opt +++ b/gcc/java/lang.opt @@ -147,7 +147,7 @@ Java Var(flag_hash_synchronization) Assume the runtime uses a hash table to map an object to its synchronization structure findirect-classes -Java Var(flag_indirect_classes) +Java Var(flag_indirect_classes) Init(1) Generate instances of Class at runtime findirect-dispatch diff --git a/gcc/java/mangle.c b/gcc/java/mangle.c index d603a1db141..1c09e29692d 100644 --- a/gcc/java/mangle.c +++ b/gcc/java/mangle.c @@ -233,8 +233,6 @@ mangle_local_cni_method_decl (tree decl) static void mangle_member_name (tree name) { - const char *s; - int len; append_gpp_mangled_name (IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name)); |