This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Patch: Fix PR 23891 / Eclipse bootstrap
- From: Bryce McKinlay <mckinlay at redhat dot com>
- To: java-patches at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- Cc: Andrew Overholt <overholt at redhat dot com>
- Date: Wed, 14 Sep 2005 20:58:29 -0400
- Subject: Patch: Fix PR 23891 / Eclipse bootstrap
Bootstrapping of gcj-compiled native Eclipse, which uses gcj to build
Eclipse's own bytecode compiler, ecj, broke recently on both HEAD and
the 4.0 branch.
The problem is that when folding constants which depend on other
constants, the current_class context is pushed, but the package context
(cxtp->context) is not, so it attempts to resolve using the wrong
package. This regression was introduced (and subsequently backported to
the 4.0 branch) with the fix for java/17845. Although that patch itself
is correct, it exposed this problem by removing a (bogus) fallback case
where gcj would search in all known packages for a class definition.
This patch fixes the problem by introducing a TYPE_PACKAGE lang
specific field, and changing do_resolve_class so that the package is
determined based on current_class and not ctxp->package which may not be
valid except during parsing. Adding TYPE_PACKAGE also allows other parts
of the compiler to be simplified, eg class_in_current_package().
No libjava testsuite regressions, and ecj now builds. However, currently
I see the following changes in JACKS results with this patch applied:
FAIL: 15.9.1-qualified-concrete-24
XPASS: 15.12.2.1-accessibility-method-2
FAIL: 15.12.2.1-accessibility-method-3
XPASS: 15.12.2.1-accessibility-method-4
FAIL: 15.12.2.1-accessibility-method-5
These are cross-package hidden member visibility tests. They seem to be
cases that we "accidentally" passed or failed for the wrong reasons
previously. Even if they compiled before, the code generated was
unlikely to be correct. I think that given the need for this patch to
get Eclipse working again, they can be addressed in a follow up patch.
OK to commit?
Bryce
2005-09-14 Bryce McKinlay <mckinlay@redhat.com>
PR java/23891
* parse.y (maybe_create_class_interface_decl): Set TYPE_PACKAGE for
the newly created type. Set import lists here, not in create_class.
(jdep_resolve_class): Set current_class.
(do_resolve_class): Use current_class's TYPE_PACKAGE to determine
the current package context, not ctxp->package.
(cicp_cache): Removed.
(class_in_current_package): Simplify implementation using TYPE_PACKAGE.
* jcf-parse.c (give_name_to_class): Set TYPE_PACKAGE.
* java-tree.h (TYPE_PACKAGE): New macro.
(struct lang_type): New member 'package'.
Index: java-tree.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/java-tree.h,v
retrieving revision 1.243
diff -u -r1.243 java-tree.h
--- java-tree.h 6 Sep 2005 02:24:59 -0000 1.243
+++ java-tree.h 15 Sep 2005 00:15:39 -0000
@@ -1074,6 +1074,7 @@
#define TYPE_TO_RUNTIME_MAP(T) (TYPE_LANG_SPECIFIC (T)->type_to_runtime_map)
#define TYPE_ASSERTIONS(T) (TYPE_LANG_SPECIFIC (T)->type_assertions)
+#define TYPE_PACKAGE(T) (TYPE_LANG_SPECIFIC (T)->package)
struct lang_type GTY(())
{
@@ -1122,6 +1123,9 @@
/* Table of type assertions to be evaluated
by the runtime when this class is loaded. */
+ tree package; /* IDENTIFIER_NODE for package this class is
+ a member of. */
+
unsigned pic:1; /* Private Inner Class. */
unsigned poic:1; /* Protected Inner Class. */
unsigned strictfp:1; /* `strictfp' class. */
Index: jcf-parse.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/jcf-parse.c,v
retrieving revision 1.188
diff -u -r1.188 jcf-parse.c
--- jcf-parse.c 6 Sep 2005 02:24:59 -0000 1.188
+++ jcf-parse.c 15 Sep 2005 00:15:40 -0000
@@ -444,6 +444,7 @@
abort ();
else
{
+ tree package_name = NULL_TREE, tmp;
tree this_class;
int j = JPOOL_USHORT1 (jcf, i);
/* verify_constant_pool confirmed that j is a CONSTANT_Utf8. */
@@ -469,6 +470,9 @@
jcf->cpool.data[i].t = this_class;
JPOOL_TAG (jcf, i) = CONSTANT_ResolvedClass;
+ split_qualified_name (&package_name, &tmp,
+ DECL_NAME (TYPE_NAME (this_class)));
+ TYPE_PACKAGE (this_class) = package_name;
return this_class;
}
}
Index: parse.y
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/parse.y,v
retrieving revision 1.554
diff -u -r1.554 parse.y
--- parse.y 6 Sep 2005 02:24:59 -0000 1.554
+++ parse.y 15 Sep 2005 00:15:43 -0000
@@ -3911,6 +3911,14 @@
/* Install a new dependency list element */
create_jdep_list (ctxp);
+ /* We keep the compilation unit imports in the class so that
+ they can be used later to resolve type dependencies that
+ aren't necessary to solve now. */
+ TYPE_IMPORT_LIST (TREE_TYPE (decl)) = ctxp->import_list;
+ TYPE_IMPORT_DEMAND_LIST (TREE_TYPE (decl)) = ctxp->import_demand_list;
+
+ TYPE_PACKAGE (TREE_TYPE (decl)) = ctxp->package;
+
SOURCE_FRONTEND_DEBUG (("Defining class/interface %s",
IDENTIFIER_POINTER (qualified_name)));
return decl;
@@ -4185,12 +4193,6 @@
virtual function table in java.lang.object. */
TYPE_VFIELD (TREE_TYPE (decl)) = TYPE_VFIELD (object_type_node);
- /* We keep the compilation unit imports in the class so that
- they can be used later to resolve type dependencies that
- aren't necessary to solve now. */
- TYPE_IMPORT_LIST (TREE_TYPE (decl)) = ctxp->import_list;
- TYPE_IMPORT_DEMAND_LIST (TREE_TYPE (decl)) = ctxp->import_demand_list;
-
/* Add the private this$<n> field, Replicate final locals still in
scope as private final fields mangled like val$<local_name>.
This does not occur for top level (static) inner classes. */
@@ -5644,6 +5646,9 @@
jdep_resolve_class (jdep *dep)
{
tree decl;
+
+ /* Set the correct context for class resolution. */
+ current_class = TREE_TYPE (JDEP_ENCLOSING (dep));
if (JDEP_RESOLVED_P (dep))
decl = JDEP_RESOLVED_DECL (dep);
@@ -5947,8 +5952,8 @@
/* 3- Search according to the current package definition */
if (!QUALIFIED_P (TYPE_NAME (class_type)))
{
- if ((new_class_decl = qualify_and_find (class_type, ctxp->package,
- TYPE_NAME (class_type))))
+ if ((new_class_decl = qualify_and_find (class_type,
+ TYPE_PACKAGE (current_class), TYPE_NAME (class_type))))
return new_class_decl;
}
@@ -10446,37 +10451,11 @@
/* Returns 1 if class was declared in the current package, 0 otherwise */
-static GTY(()) tree cicp_cache;
static int
class_in_current_package (tree class)
{
- int qualified_flag;
- tree left;
-
- if (cicp_cache == class)
- return 1;
-
- qualified_flag = QUALIFIED_P (DECL_NAME (TYPE_NAME (class)));
-
- /* If the current package is empty and the name of CLASS is
- qualified, class isn't in the current package. If there is a
- current package and the name of the CLASS is not qualified, class
- isn't in the current package */
- if ((!ctxp->package && qualified_flag) || (ctxp->package && !qualified_flag))
- return 0;
-
- /* If there is not package and the name of CLASS isn't qualified,
- they belong to the same unnamed package */
- if (!ctxp->package && !qualified_flag)
+ if (TYPE_PACKAGE (current_class) == TYPE_PACKAGE (class))
return 1;
-
- /* Compare the left part of the name of CLASS with the package name */
- split_qualified_name (&left, NULL, DECL_NAME (TYPE_NAME (class)));
- if (ctxp->package == left)
- {
- cicp_cache = class;
- return 1;
- }
return 0;
}