This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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;
 }
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]