aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Haley <aph@redhat.com>2006-04-18 15:19:10 +0000
committerAndrew Haley <aph@redhat.com>2006-04-18 15:19:10 +0000
commite7accbf016bf087b15beaaaead6cacdb27e0096b (patch)
treec0540bd260df7ad2465ff5cbec7f942abd3d1934
parentb59465b29ca1ac0c1d8ced5861388cfe52ba12d6 (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/ChangeLog10
-rw-r--r--gcc/java/class.c57
-rw-r--r--gcc/java/gjavah.c2
-rw-r--r--gcc/java/lang.c3
-rw-r--r--gcc/java/lang.opt2
-rw-r--r--gcc/java/mangle.c2
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));