aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Haley <aph@redhat.com>2006-03-16 17:31:18 +0000
committerAndrew Haley <aph@redhat.com>2006-03-16 17:31:18 +0000
commitaea024f6d713f510af0fadc3f3c2f29387f0d6af (patch)
tree8ee958e8d5ecd9c4119e6d0007d462db9ed8340a
parent31a0836f762adfae821e50d6b6a9f51e85416e1d (diff)
2006-03-16 Andrew Haley <aph@redhat.com>
* java/lang/Class.h (Object): New field, class$$. * java/lang/Object.h: Likewise. * java/lang/natClassLoader.cc (interfaces): Hoist out of _Jv_NewArrayClass. * gnu/gcj/runtime/natSharedLibLoader.cc (_Jv_GC_has_static_roots): Register everything that isn't a shared library. 2006-03-16 Andrew Haley <aph@redhat.com> * call.c (build_java_interface_fn_ref): Rename "class$" to "class$$". * init.c (build_java_class_ref): Rename "class$" to "class$$". 2006-03-16 Andrew Haley <aph@redhat.com> * jvgenmain.c (main): Revert previous change. (do_mangle_classname): Likewise. * mangle.c (java_mangle_decl): mangle_class_field(decl), not DECL_CONTEXT (decl). (mangle_class_field): Mangle "class$$" and "class$". * gjavah.c (process_file): Emit "class$$" as well as "class$". * class.c (build_static_class_ref): Rename to "class$$". (build_classdollar_field): New function. (build_class_ref): Break out code into build_classdollar_field. (make_class_data): Explicitly emit classdollar_field. git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcj/gcj-abi-experimental-branch@112139 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/call.c2
-rw-r--r--gcc/cp/init.c2
-rw-r--r--gcc/java/ChangeLog16
-rw-r--r--gcc/java/class.c80
-rw-r--r--gcc/java/gjavah.c7
-rw-r--r--gcc/java/jvgenmain.c46
-rw-r--r--gcc/java/mangle.c18
-rw-r--r--libjava/ChangeLog10
-rw-r--r--libjava/gnu/gcj/runtime/natSharedLibLoader.cc14
-rw-r--r--libjava/java/lang/Class.h5
-rw-r--r--libjava/java/lang/Object.h5
-rw-r--r--libjava/java/lang/natClassLoader.cc11
13 files changed, 132 insertions, 89 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 5f153639eb0..c9e81a5fdd0 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2006-03-16 Andrew Haley <aph@redhat.com>
+
+ * call.c (build_java_interface_fn_ref): Rename "class$" to "class$$".
+ * init.c (build_java_class_ref): Rename "class$" to "class$$".
+
2006-02-14 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
* call.c (standard_conversion): Return NULL instead of 0.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 268573d5bc0..bf3281dc37c 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -5019,7 +5019,7 @@ build_java_interface_fn_ref (tree fn, tree instance)
/* Get the java.lang.Class pointer for the interface being called. */
iface = DECL_CONTEXT (fn);
- iface_ref = lookup_field (iface, get_identifier ("class$"), 0, false);
+ iface_ref = lookup_field (iface, get_identifier ("class$$"), 0, false);
if (!iface_ref || TREE_CODE (iface_ref) != VAR_DECL
|| DECL_CONTEXT (iface_ref) != iface)
{
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 0ef0c1ada73..16fa6e4a9c9 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -1628,7 +1628,7 @@ build_java_class_ref (tree type)
tree name = NULL_TREE, class_decl;
static tree CL_suffix = NULL_TREE;
if (CL_suffix == NULL_TREE)
- CL_suffix = get_identifier("class$");
+ CL_suffix = get_identifier("class$$");
if (jclass_node == NULL_TREE)
{
jclass_node = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jclass"));
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 763389e1132..e78fbebc589 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,19 @@
+2006-03-16 Andrew Haley <aph@redhat.com>
+
+ * jvgenmain.c (main): Revert previous change.
+ (do_mangle_classname): Likewise.
+
+ * mangle.c (java_mangle_decl): mangle_class_field(decl), not
+ DECL_CONTEXT (decl).
+ (mangle_class_field): Mangle "class$$" and "class$".
+
+ * gjavah.c (process_file): Emit "class$$" as well as "class$".
+
+ * class.c (build_static_class_ref): Rename to "class$$".
+ (build_classdollar_field): New function.
+ (build_class_ref): Break out code into build_classdollar_field.
+ (make_class_data): Explicitly emit classdollar_field.
+
2006-03-07 Andrew Haley <aph@redhat.com>
* jvgenmain.c: If flag_indirect_classes, generate access to
diff --git a/gcc/java/class.c b/gcc/java/class.c
index b8814ce6063..177bdcaf79f 100644
--- a/gcc/java/class.c
+++ b/gcc/java/class.c
@@ -951,13 +951,13 @@ build_static_class_ref (tree type)
if (TYPE_SIZE (type) == error_mark_node)
return null_pointer_node;
decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
- "", '/', '/', ".class");
+ "", '/', '/', ".class$$");
decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
if (decl == NULL_TREE)
{
decl = build_decl (VAR_DECL, decl_name, class_type_node);
TREE_STATIC (decl) = 1;
-// if (! flag_indirect_classes)
+ if (! flag_indirect_classes)
TREE_PUBLIC (decl) = 1;
DECL_IGNORED_P (decl) = 1;
DECL_ARTIFICIAL (decl) = 1;
@@ -976,6 +976,38 @@ build_static_class_ref (tree type)
return ref;
}
+static tree
+build_classdollar_field (tree type)
+{
+ tree decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
+ "", '/', '/', ".class$");
+ tree decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
+
+ if (decl == NULL_TREE)
+ {
+ decl
+ = build_decl (VAR_DECL, decl_name,
+ (build_type_variant
+ (build_pointer_type
+ (build_type_variant (class_type_node,
+ /* const */ 1, 0)),
+ /* const */ 1, 0)));
+ TREE_STATIC (decl) = 1;
+ TREE_INVARIANT (decl) = 1;
+ TREE_CONSTANT (decl) = 1;
+ TREE_READONLY (decl) = 1;
+ TREE_PUBLIC (decl) = 1;
+ DECL_IGNORED_P (decl) = 1;
+ DECL_ARTIFICIAL (decl) = 1;
+ MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
+ IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
+ DECL_CLASS_FIELD_P (decl) = 1;
+ DECL_CONTEXT (decl) = type;
+ }
+
+ return decl;
+}
+
/* Build a reference to the class TYPE.
Also handles primitive types and array types. */
@@ -994,40 +1026,8 @@ build_class_ref (tree type)
&& TREE_CODE (type) == RECORD_TYPE)
return build_indirect_class_ref (type);
- if (flag_indirect_classes
- && type == output_class)
- {
- tree decl_name = mangled_classname ("_class$_", output_class);
- decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
- if (decl == NULL_TREE)
- {
- decl
- = build_decl (VAR_DECL, decl_name,
- (build_type_variant
- (build_pointer_type
- (build_type_variant (class_type_node,
- /* const */ 1, 0)),
- /* const */ 1, 0)));
-// decl
-// = build_decl (VAR_DECL, decl_name,
-// build_pointer_type
-// (build_type_variant (class_type_node,
-// /* const */ 1, 0)));
- TREE_STATIC (decl) = 1;
- TREE_INVARIANT (decl) = 1;
- TREE_PUBLIC (decl) = 1;
- DECL_IGNORED_P (decl) = 1;
- DECL_ARTIFICIAL (decl) = 1;
- if (is_compiled == 1)
- DECL_EXTERNAL (decl) = 1;
- MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
- DECL_CLASS_FIELD_P (decl) = 1;
- DECL_CONTEXT (decl) = type;
- IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
- pushdecl_top_level (decl);
- }
- return decl;
- }
+ if (type == output_class && flag_indirect_classes)
+ return build_classdollar_field (type);
if (TREE_CODE (type) == RECORD_TYPE)
return build_static_class_ref (type);
@@ -1955,7 +1955,13 @@ make_class_data (tree type)
DECL_ALIGN (decl) = 64;
rest_of_decl_compilation (decl, 1, 0);
-
+ {
+ tree classdollar_field = build_classdollar_field (type);
+ if (!flag_indirect_classes)
+ DECL_INITIAL (classdollar_field) = build_static_class_ref (type);
+ rest_of_decl_compilation (classdollar_field, 1, 0);
+ }
+
TYPE_OTABLE_DECL (type) = NULL_TREE;
TYPE_ATABLE_DECL (type) = NULL_TREE;
TYPE_CTABLE_DECL (type) = NULL_TREE;
diff --git a/gcc/java/gjavah.c b/gcc/java/gjavah.c
index 8c9884b96fa..9fe8002bd90 100644
--- a/gcc/java/gjavah.c
+++ b/gcc/java/gjavah.c
@@ -2272,9 +2272,12 @@ process_file (JCF *jcf, FILE *out)
for (i = 0; i < add_count; ++i)
fprintf (out, " %s\n", add_specs[i]);
- /* Generate an entry for the class object. */
+ /* Generate an entry for the class objects. */
generate_access (out, ACC_PUBLIC);
- fprintf (out, "\n static ::java::lang::Class class$;\n");
+ fprintf (out, " // gcj private: Do NOT use this field.\n");
+ fprintf (out, " static ::java::lang::Class class$$;\n");
+ generate_access (out, ACC_PUBLIC);
+ fprintf (out, "\n static ::java::lang::Class &class$;\n");
fputs ("}", out);
diff --git a/gcc/java/jvgenmain.c b/gcc/java/jvgenmain.c
index 79c97760bc4..71736842010 100644
--- a/gcc/java/jvgenmain.c
+++ b/gcc/java/jvgenmain.c
@@ -140,16 +140,8 @@ main (int argc, char **argv)
fprintf (stream, "int main (int argc, const char **argv)\n");
fprintf (stream, "{\n");
fprintf (stream, " _Jv_Compiler_Properties = props;\n");
- if (flag_indirect_classes)
- {
- fprintf (stream, " extern void *%s;\n", mangled_classname);
- fprintf (stream, " JvRunMain (%s, argc, argv);\n", mangled_classname);
- }
- else
- {
- fprintf (stream, " extern int %s;\n", mangled_classname);
- fprintf (stream, " JvRunMain (&%s, argc, argv);\n", mangled_classname);
- }
+ fprintf (stream, " extern void *%s;\n", mangled_classname);
+ fprintf (stream, " JvRunMain (%s, argc, argv);\n", mangled_classname);
fprintf (stream, "}\n");
if (stream != stdout && fclose (stream) != 0)
{
@@ -167,34 +159,20 @@ do_mangle_classname (const char *string)
const char *ptr;
int count = 0;
- if (flag_indirect_classes)
- {
- obstack_grow (&name_obstack, "_class$_", strlen ("_class$_"));
- for (ptr = string; *ptr; ptr++ )
- {
- if (*ptr == '.')
- obstack_1grow (mangle_obstack, '_');
- else
- obstack_1grow (mangle_obstack, *ptr);
- }
- }
- else
+ obstack_grow (&name_obstack, "_ZN", 3);
+
+ for (ptr = string; *ptr; ptr++ )
{
- obstack_grow (&name_obstack, "_ZN", 3);
-
- for (ptr = string; *ptr; ptr++ )
+ if (*ptr == '.')
{
- if (*ptr == '.')
- {
- append_gpp_mangled_name (ptr - count, count);
- count = 0;
- }
- else
- count++;
+ append_gpp_mangled_name (ptr - count, count);
+ count = 0;
}
- append_gpp_mangled_name (ptr - count, count);
- obstack_grow (mangle_obstack, "6class$E", 8);
+ else
+ count++;
}
+ append_gpp_mangled_name (&ptr [-count], count);
+ obstack_grow (mangle_obstack, "6class$E", 8);
obstack_1grow (mangle_obstack, '\0');
return obstack_finish (mangle_obstack);
}
diff --git a/gcc/java/mangle.c b/gcc/java/mangle.c
index f9b379221d2..d603a1db141 100644
--- a/gcc/java/mangle.c
+++ b/gcc/java/mangle.c
@@ -102,7 +102,7 @@ java_mangle_decl (tree decl)
{
if (DECL_CLASS_FIELD_P (decl))
{
- mangle_class_field (DECL_CONTEXT (decl));
+ mangle_class_field (decl);
break;
}
else if (DECL_VTABLE_P (decl))
@@ -133,10 +133,14 @@ java_mangle_decl (tree decl)
/* Beginning of the helper functions */
static void
-mangle_class_field (tree type)
+mangle_class_field (tree decl)
{
+ tree type = DECL_CONTEXT (decl);
mangle_record_type (type, /* for_pointer = */ 0);
- MANGLE_RAW_STRING ("6class$");
+ if (TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE)
+ MANGLE_RAW_STRING ("7class$$");
+ else
+ MANGLE_RAW_STRING ("6class$");
obstack_1grow (mangle_obstack, 'E');
}
@@ -229,10 +233,16 @@ 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));
- /* If NAME happens to be a C++ keyword, add `$'. */
+/* s = IDENTIFIER_POINTER (name); */
+/* len = IDENTIFIER_LENGTH (name); */
+ /* If NAME happens to be a C++ keyword, add `$'. */
+/* if (cxx_keyword_p (s, len) */
+/* && (strncmp (s, "class$", len) != 0)) */
if (cxx_keyword_p (IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name)))
obstack_1grow (mangle_obstack, '$');
}
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index db2783ecde6..ec173b07631 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,13 @@
+2006-03-16 Andrew Haley <aph@redhat.com>
+
+ * java/lang/Class.h (Object): New field, class$$.
+ * java/lang/Object.h: Likewise.
+ * java/lang/natClassLoader.cc (interfaces): Hoist out of
+ _Jv_NewArrayClass.
+
+ * gnu/gcj/runtime/natSharedLibLoader.cc (_Jv_GC_has_static_roots):
+ Register everything that isn't a shared library.
+
2006-03-07 Andrew Haley <aph@redhat.com>
* java/lang/natClassLoader.cc (_Jv_NewClassFromInitializer): Don't
diff --git a/libjava/gnu/gcj/runtime/natSharedLibLoader.cc b/libjava/gnu/gcj/runtime/natSharedLibLoader.cc
index ece6cad0f31..fe581952486 100644
--- a/libjava/gnu/gcj/runtime/natSharedLibLoader.cc
+++ b/libjava/gnu/gcj/runtime/natSharedLibLoader.cc
@@ -39,17 +39,25 @@ _Jv_GC_has_static_roots (struct dl_phdr_info * info, size_t size, void *ptr)
// fprintf (stderr, "%p: lib %s ", ptr, name);
if (strlen (name) <= strlen (suffix))
- goto defaul;
+ goto registered;
// If a DSO name ends with SUFFIX, it has GC roots.
if (strcmp (name + strlen (name) - strlen (suffix),
suffix) == 0)
{
// fprintf (stderr, "registered\n");
- return 1;
+ goto registered;
}
- defaul:
+ // If a name contains ".so", it is a DSO with no roots.
+ if (strstr (name, ".so"))
+ goto shlib;
+
+ registered:
+// fprintf (stderr, "registered\n");
+ return 1;
+
+ shlib:
// fprintf (stderr, "not registered\n");
return 0;
}
diff --git a/libjava/java/lang/Class.h b/libjava/java/lang/Class.h
index b697f14123c..1cace15d594 100644
--- a/libjava/java/lang/Class.h
+++ b/libjava/java/lang/Class.h
@@ -403,7 +403,10 @@ public:
// types. See prims.cc.
Class ();
- static java::lang::Class class$;
+ // gcj private: Do NOT use this field.
+ static ::java::lang::Class class$$;
+
+ static java::lang::Class &class$;
private:
diff --git a/libjava/java/lang/Object.h b/libjava/java/lang/Object.h
index 54fd447d116..61d18ae9203 100644
--- a/libjava/java/lang/Object.h
+++ b/libjava/java/lang/Object.h
@@ -68,7 +68,10 @@ public:
friend JV_MARKARRAY_DECL;
#endif
- static java::lang::Class class$;
+ // gcj private: Do NOT use this field.
+ static ::java::lang::Class class$$;
+
+ static java::lang::Class &class$;
protected:
virtual jobject clone (void);
diff --git a/libjava/java/lang/natClassLoader.cc b/libjava/java/lang/natClassLoader.cc
index 09536c2d1a0..299f78fb376 100644
--- a/libjava/java/lang/natClassLoader.cc
+++ b/libjava/java/lang/natClassLoader.cc
@@ -400,6 +400,12 @@ static _Jv_IDispatchTable *array_idt = NULL;
static jshort array_depth = 0;
static jclass *array_ancestors = NULL;
+static jclass interfaces[] =
+{
+ &java::lang::Cloneable::class$,
+ &java::io::Serializable::class$
+};
+
// Create a class representing an array of ELEMENT and store a pointer to it
// in element->arrayclass. LOADER is the ClassLoader which _initiated_ the
// instantiation of this array. ARRAY_VTABLE is the vtable to use for the new
@@ -475,11 +481,6 @@ _Jv_NewArrayClass (jclass element, java::lang::ClassLoader *loader,
array_class->element_type = element;
// Register our interfaces.
- static jclass interfaces[] =
- {
- &java::lang::Cloneable::class$,
- &java::io::Serializable::class$
- };
array_class->interfaces = interfaces;
array_class->interface_count = sizeof interfaces / sizeof interfaces[0];