diff options
author | Andrew Haley <aph@redhat.com> | 2007-04-03 15:28:16 +0000 |
---|---|---|
committer | Andrew Haley <aph@gcc.gnu.org> | 2007-04-03 15:28:16 +0000 |
commit | 696fbee71016c152278c38048421cf291e1566a4 (patch) | |
tree | 60fe445d5b46b75e3d08f3d3944f489dda85b945 /gcc/java/class.c | |
parent | 83ff0d10edd6af76343e00f4cd8cdb78c1c0b640 (diff) | |
download | gcc-696fbee71016c152278c38048421cf291e1566a4.zip gcc-696fbee71016c152278c38048421cf291e1566a4.tar.gz gcc-696fbee71016c152278c38048421cf291e1566a4.tar.bz2 |
jvgenmain.c (main): Change main to use class$, not class$$.
2007-04-03 Andrew Haley <aph@redhat.com>
* jvgenmain.c (main): Change main to use class$, not class$$.
(do_mangle_classname): Likewise.
* class.c (hide): New function.
(add_field): Hide everything that shouldn't be visible outside a
DSO.
(build_static_class_ref): Likewise.
(build_classdollar_field): Likewise.
(make_class_data): Likewise.
(layout_class_method): Likewise.
* expr.c (special_method_p): New function.
* class.c (push_class): Don't bogusly guess the source filename.
* jcf-parse.c (give_name_to_class): Don't set input_location from
DECL_ARTIFICIAL decls.
From-SVN: r123476
Diffstat (limited to 'gcc/java/class.c')
-rw-r--r-- | gcc/java/class.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/gcc/java/class.c b/gcc/java/class.c index c9ccef6..d707461 100644 --- a/gcc/java/class.c +++ b/gcc/java/class.c @@ -428,8 +428,7 @@ push_class (tree class_type, tree class_name) tree decl, signature; location_t saved_loc = input_location; #ifndef USE_MAPPED_LOCATION - tree source_name = identifier_subst (class_name, "", '.', '/', ".java"); - input_filename = IDENTIFIER_POINTER (source_name); + input_filename = "<unknown>"; input_line = 0; #endif CLASS_P (class_type) = 1; @@ -691,6 +690,13 @@ build_java_method_type (tree fntype, tree this_class, int access_flags) return fntype; } +static void +hide (tree decl) +{ + DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN; + DECL_VISIBILITY_SPECIFIED (decl) = 1; +} + tree add_method_1 (tree this_class, int access_flags, tree name, tree function_type) { @@ -801,6 +807,10 @@ add_field (tree class, tree name, tree field_type, int flags) /* Always make field externally visible. This is required so that native methods can always access the field. */ TREE_PUBLIC (field) = 1; + /* Hide everything that shouldn't be visible outside a DSO. */ + if (flag_indirect_classes + || (FIELD_PRIVATE (field))) + hide (field); /* Considered external unless we are compiling it into this object file. */ DECL_EXTERNAL (field) = (is_compiled_class (class) != 2); @@ -958,7 +968,11 @@ build_static_class_ref (tree type) decl = build_decl (VAR_DECL, decl_name, class_type_node); TREE_STATIC (decl) = 1; if (! flag_indirect_classes) - TREE_PUBLIC (decl) = 1; + { + TREE_PUBLIC (decl) = 1; + if (CLASS_PRIVATE (TYPE_NAME (type))) + hide (decl); + } DECL_IGNORED_P (decl) = 1; DECL_ARTIFICIAL (decl) = 1; if (is_compiled_class (type) == 1) @@ -997,6 +1011,7 @@ build_classdollar_field (tree type) TREE_CONSTANT (decl) = 1; TREE_READONLY (decl) = 1; TREE_PUBLIC (decl) = 1; + hide (decl); DECL_IGNORED_P (decl) = 1; DECL_ARTIFICIAL (decl) = 1; MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); @@ -1684,6 +1699,10 @@ make_class_data (tree type) TREE_PUBLIC (dtable_decl) = 1; DECL_INITIAL (dtable_decl) = dtable; + /* The only dispatch table exported from a DSO is the dispatch + table for java.lang.Class. */ + if (DECL_NAME (type_decl) != id_class) + hide (dtable_decl); if (! flag_indirect_classes) rest_of_decl_compilation (dtable_decl, 1, 0); /* Maybe we're compiling Class as the first class. If so, set @@ -2553,6 +2572,12 @@ layout_class_method (tree this_class, tree super_class, TREE_PUBLIC (method_decl) = 1; + if (flag_indirect_classes + || (METHOD_PRIVATE (method_decl) && METHOD_STATIC (method_decl) + && ! METHOD_NATIVE (method_decl) + && ! special_method_p (method_decl))) + hide (method_decl); + /* Considered external unless it is being compiled into this object file, or it was already flagged as external. */ if (!DECL_EXTERNAL (method_decl)) |