From f0c75752a10218b95f31583594dac574626b3062 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sat, 2 Feb 2002 22:23:37 -0800 Subject: [PATCH] class.c (add_field): Mark static fields external. * class.c (add_field): Mark static fields external. (build_class_ref): Remove redundant set. * parse.y (java_expand_classes): Mark static fields of classes to be compiled as local. * jcf-parse.c (parse_class_file): Likewise. From-SVN: r49458 --- gcc/java/ChangeLog | 22 +++++++++++++++------- gcc/java/class.c | 6 ++++-- gcc/java/jcf-parse.c | 11 ++++++++--- gcc/java/parse.y | 25 +++++++++++++++++++++---- 4 files changed, 48 insertions(+), 16 deletions(-) diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 4482d2806b1..3bd83c7acff 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,11 @@ +2002-02-02 Richard Henderson + + * class.c (add_field): Mark static fields external. + (build_class_ref): Remove redundant set. + * parse.y (java_expand_classes): Mark static fields of classes + to be compiled as local. + * jcf-parse.c (parse_class_file): Likewise. + 2002-02-02 Nic Ferrier * gcj.texi (About CNI): New node. @@ -89,22 +97,22 @@ (Invoking jv-convert): New node. 2001-01-10 Jeff Sturm - Martin Kahlert + Martin Kahlert * jcf-parse.c (get_constant): Don't swap lo/hi for big endian targets when HOST_BITS_PER_WIDE_INT >= 64. 2002-01-03 Graham Stott - * class.c (compile_resource_file): Update copyright date. - Constify filename parameter. - (java-tree.h): Update copyright date. - (compile_resource_file): Constify filename parameter. + * class.c (compile_resource_file): Update copyright date. + Constify filename parameter. + (java-tree.h): Update copyright date. + (compile_resource_file): Constify filename parameter. 2002-01-03 Graham Stott - * gcc/jcf-parse.c: Update copyright date. - (yyparse): Constify resource_filename. + * gcc/jcf-parse.c: Update copyright date. + (yyparse): Constify resource_filename. 2002-01-02 Kaveh R. Ghazi diff --git a/gcc/java/class.c b/gcc/java/class.c index bd453062989..2e70081e095 100644 --- a/gcc/java/class.c +++ b/gcc/java/class.c @@ -773,7 +773,11 @@ add_field (class, name, field_type, flags) /* Always make field externally visible. This is required so that native methods can always access the field. */ TREE_PUBLIC (field) = 1; + /* Considered external until we know what classes are being + compiled into this object file. */ + DECL_EXTERNAL (field) = 1; } + return field; } @@ -1095,8 +1099,6 @@ build_class_ref (type) DECL_EXTERNAL (decl) = 1; make_decl_rtl (decl, NULL); pushdecl_top_level (decl); - if (is_compiled == 1) - DECL_EXTERNAL (decl) = 1; } } diff --git a/gcc/java/jcf-parse.c b/gcc/java/jcf-parse.c index 3e3bd236507..e85b5781f83 100644 --- a/gcc/java/jcf-parse.c +++ b/gcc/java/jcf-parse.c @@ -793,7 +793,7 @@ init_outgoing_cpool () static void parse_class_file () { - tree method; + tree method, field; const char *save_input_filename = input_filename; int save_lineno = lineno; @@ -808,8 +808,13 @@ parse_class_file () compiling from class files. */ always_initialize_class_p = 1; - for ( method = TYPE_METHODS (CLASS_TO_HANDLE_TYPE (current_class)); - method != NULL_TREE; method = TREE_CHAIN (method)) + for (field = TYPE_FIELDS (CLASS_TO_HANDLE_TYPE (current_class)); + field != NULL_TREE; field = TREE_CHAIN (field)) + if (FIELD_STATIC (field)) + DECL_EXTERNAL (field) = 0; + + for (method = TYPE_METHODS (CLASS_TO_HANDLE_TYPE (current_class)); + method != NULL_TREE; method = TREE_CHAIN (method)) { JCF *jcf = current_jcf; diff --git a/gcc/java/parse.y b/gcc/java/parse.y index 8b33fadf85c..328a18e3d12 100644 --- a/gcc/java/parse.y +++ b/gcc/java/parse.y @@ -8963,8 +8963,7 @@ java_expand_classes () java_layout_classes (); java_parse_abort_on_error (); - cur_ctxp = ctxp_for_generation; - for (; cur_ctxp; cur_ctxp = cur_ctxp->next) + for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next) { ctxp = cur_ctxp; input_filename = ctxp->filename; @@ -8976,7 +8975,7 @@ java_expand_classes () /* Find anonymous classes and expand their constructor, now they have been fixed. */ - for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next) + for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next) { tree current; ctxp = cur_ctxp; @@ -9009,7 +9008,25 @@ java_expand_classes () return; /* Now things are stable, go for generation of the class data. */ - for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next) + + /* We pessimistically marked all fields external until we knew + what set of classes we were planning to compile. Now mark + those that will be generated locally as not external. */ + for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next) + { + tree current; + for (current = ctxp->class_list; current; current = TREE_CHAIN (current)) + { + tree class = TREE_TYPE (current); + tree field; + for (field = TYPE_FIELDS (class); field ; field = TREE_CHAIN (field)) + if (FIELD_STATIC (field)) + DECL_EXTERNAL (field) = 0; + } + } + + /* Compile the classes. */ + for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next) { tree current; ctxp = cur_ctxp; -- 2.30.2