diff options
author | Andrew Haley <aph@redhat.com> | 2006-03-16 17:31:18 +0000 |
---|---|---|
committer | Andrew Haley <aph@redhat.com> | 2006-03-16 17:31:18 +0000 |
commit | aea024f6d713f510af0fadc3f3c2f29387f0d6af (patch) | |
tree | 8ee958e8d5ecd9c4119e6d0007d462db9ed8340a | |
parent | 31a0836f762adfae821e50d6b6a9f51e85416e1d (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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/call.c | 2 | ||||
-rw-r--r-- | gcc/cp/init.c | 2 | ||||
-rw-r--r-- | gcc/java/ChangeLog | 16 | ||||
-rw-r--r-- | gcc/java/class.c | 80 | ||||
-rw-r--r-- | gcc/java/gjavah.c | 7 | ||||
-rw-r--r-- | gcc/java/jvgenmain.c | 46 | ||||
-rw-r--r-- | gcc/java/mangle.c | 18 | ||||
-rw-r--r-- | libjava/ChangeLog | 10 | ||||
-rw-r--r-- | libjava/gnu/gcj/runtime/natSharedLibLoader.cc | 14 | ||||
-rw-r--r-- | libjava/java/lang/Class.h | 5 | ||||
-rw-r--r-- | libjava/java/lang/Object.h | 5 | ||||
-rw-r--r-- | libjava/java/lang/natClassLoader.cc | 11 |
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]; |