libjava test suite keeps getting stuck
Zack Weinberg
zackw@Stanford.EDU
Mon Apr 23 20:06:00 GMT 2001
On Mon, Apr 23, 2001 at 04:52:36PM -0700, Richard Henderson wrote:
> On Thu, Apr 19, 2001 at 10:41:25PM -0700, Zack Weinberg wrote:
> > __gxx_personality_v0 is another can of worms entirely. It looks to be
> > referenced from all of the C++ source code. It's deeply involved with
> > the new exception handling scheme. I do not know whether it's
> > appropriate to keep using the C++ version or whether java should have
> > its own.
>> Java does have its own -- __gcj_personality_v0.
>> The problem at the moment is that the c++ front end uses the existance
> of a throw or a catch of a Java object to determine that we should be
> emulating Java exception handling in this module. We really ought to
> be using a pragma instead so that it is (1) affirmative and (2) works
> with only cleanups present.
Hmm, like this?
With this pair of patches, I can build libgcj without linking
libsupc++. (Mainline only.) I still get a ton of libjava testsuite
failures, but I'm not sure if this tree is consistent. Real test
results in slightly more than two hours.
jvm.h was the first header I found which was included by all the C++
files that needed to get hit by the pragma, and marked "implementation
internals"; there may be a better place. I don't know where to
document the new pragma.
How is it that 'throw new <object>', which is all over the C++ code in
libjava, generates calls to _Jv_AllocObject not _Znwj?
zw
gcc/cp:
* except.c (choose_personality_routine): Export.
* cp-tree.h: Prototype choose_personality_routine.
* lex.c (handle_pragma_java_exceptions): New function.
(init_cp_pragma): Register #pragma GCC java_exceptions.
libjava:
* Makefile.am (libgcj.la): Remove libsupc++convenience.la from
link line.
* Makefile.in: Regenerate (by hand).
* include/jvm.h: Insert #pragma GCC java_exceptions here.
* prims.cc (_Jv_ThisExecutable): Use _Jv_Malloc.
* java/lang/natClassLoader.cc (_Jv_RegisterInitiatingLoader):
Likewise.
===================================================================
Index: gcc/cp/cp-tree.h
--- gcc/cp/cp-tree.h 2001年04月21日 00:04:08 1.602
+++ gcc/cp/cp-tree.h 2001年04月24日 02:37:13
@@ -4020,6 +4020,7 @@ extern tree build_throw PARAMS ((tree
extern void mark_all_runtime_matches PARAMS ((void));
extern int nothrow_libfn_p PARAMS ((tree));
extern void check_handlers PARAMS ((tree));
+extern void choose_personality_routine PARAMS ((bool));
/* in expr.c */
extern void init_cplus_expand PARAMS ((void));
===================================================================
Index: gcc/cp/except.c
--- gcc/cp/except.c 2001年04月22日 23:50:06 1.129
+++ gcc/cp/except.c 2001年04月24日 02:37:14
@@ -43,7 +43,6 @@ static int dtor_nothrow PARAMS ((tree));
static tree do_end_catch PARAMS ((tree));
static void push_eh_cleanup PARAMS ((tree));
static bool decl_is_java_type PARAMS ((tree decl, int err));
-static void choose_personality_routine PARAMS ((bool));
static void initialize_handler_parm PARAMS ((tree, tree));
static tree do_allocate_exception PARAMS ((tree));
static int complete_ptr_ref_or_void_ptr_p PARAMS ((tree, tree));
@@ -259,7 +258,7 @@ decl_is_java_type (decl, err)
return r;
}
-static void
+void
choose_personality_routine (is_java)
bool is_java;
{
===================================================================
Index: gcc/cp/lex.c
--- gcc/cp/lex.c 2001年04月19日 22:49:48 1.242
+++ gcc/cp/lex.c 2001年04月24日 02:37:14
@@ -61,6 +61,7 @@ static void handle_pragma_vtable PARAMS
static void handle_pragma_unit PARAMS ((cpp_reader *));
static void handle_pragma_interface PARAMS ((cpp_reader *));
static void handle_pragma_implementation PARAMS ((cpp_reader *));
+static void handle_pragma_java_exceptions PARAMS ((cpp_reader *));
static void cxx_init PARAMS ((void));
static void cxx_finish PARAMS ((void));
static void cxx_init_options PARAMS ((void));
@@ -680,6 +681,8 @@ init_cp_pragma ()
cpp_register_pragma (parse_in, "GCC", "interface", handle_pragma_interface);
cpp_register_pragma (parse_in, "GCC", "implementation",
handle_pragma_implementation);
+ cpp_register_pragma (parse_in, "GCC", "java_exceptions",
+ handle_pragma_java_exceptions);
}
const char *
@@ -1172,6 +1175,18 @@ handle_pragma_implementation (dfile)
ifiles->next = impl_file_chain;
impl_file_chain = ifiles;
}
+}
+
+/* Indicate that this file uses Java-personality exception handling. */
+static void
+handle_pragma_java_exceptions (dfile)
+ cpp_reader *dfile ATTRIBUTE_UNUSED;
+{
+ tree x;
+ if (c_lex (&x) != CPP_EOF)
+ warning ("junk at end of #pragma GCC java_exceptions");
+
+ choose_personality_routine (/* is_java = */ true);
}
void
===================================================================
Index: libjava/Makefile.am
--- libjava/Makefile.am 2001年04月22日 03:05:37 1.139
+++ libjava/Makefile.am 2001年04月24日 02:37:18
@@ -260,7 +260,6 @@ libgcj.la: $(libgcj_la_OBJECTS) $(libgcj
@echo $(libgcj_la_OBJECTS) > libgcj.objectlist;
@echo $(libgcj_la_LIBADD) >> libgcj.objectlist;
$(libgcj_la_LINK) -objectlist libgcj.objectlist \
- ../libstdc++-v3/libsupc++/libsupc++convenience.la \
../libffi/libfficonvenience.la \
-rpath $(toolexeclibdir) $(libgcj_la_LDFLAGS) $(LIBS)
===================================================================
Index: libjava/Makefile.in
--- libjava/Makefile.in 2001年04月22日 03:05:37 1.149
+++ libjava/Makefile.in 2001年04月24日 02:37:19
@@ -2362,7 +2362,6 @@ libgcj.la: $(libgcj_la_OBJECTS) $(libgcj
@echo $(libgcj_la_OBJECTS) > libgcj.objectlist;
@echo $(libgcj_la_LIBADD) >> libgcj.objectlist;
$(libgcj_la_LINK) -objectlist libgcj.objectlist \
- ../libstdc++-v3/libsupc++/libsupc++convenience.la \
../libffi/libfficonvenience.la \
-rpath $(toolexeclibdir) $(libgcj_la_LDFLAGS) $(LIBS)
===================================================================
Index: libjava/prims.cc
--- libjava/prims.cc 2001年03月26日 07:05:31 1.49
+++ libjava/prims.cc 2001年04月24日 02:37:21
@@ -609,7 +609,7 @@ _Jv_ThisExecutable (const char *name)
{
if (name)
{
- _Jv_execName = new char[strlen (name) + 1];
+ _Jv_execName = (char *) _Jv_Malloc (strlen (name) + 1);
strcpy (_Jv_execName, name);
}
}
===================================================================
Index: libjava/include/jvm.h
--- libjava/include/jvm.h 2001年03月23日 19:15:43 1.32
+++ libjava/include/jvm.h 2001年04月24日 02:37:21
@@ -11,6 +11,9 @@ details. */
#ifndef __JAVA_JVM_H__
#define __JAVA_JVM_H__
+// Force C++ compiler to use Java-style exceptions.
+#pragma GCC java_exceptions
+
#include <gcj/javaprims.h>
#include <java-assert.h>
===================================================================
Index: libjava/java/lang/natClassLoader.cc
--- libjava/java/lang/natClassLoader.cc 2001年03月26日 07:05:32 1.30
+++ libjava/java/lang/natClassLoader.cc 2001年04月24日 02:37:24
@@ -403,7 +403,8 @@ _Jv_UnregisterClass (jclass the_class)
void
_Jv_RegisterInitiatingLoader (jclass klass, java::lang::ClassLoader *loader)
{
- _Jv_LoaderInfo *info = new _Jv_LoaderInfo; // non-gc alloc!
+ // non-gc alloc!
+ _Jv_LoaderInfo *info = (_Jv_LoaderInfo *) _Jv_Malloc (sizeof(_Jv_LoaderInfo));
jint hash = HASH_UTF(klass->name);
_Jv_MonitorEnter (&ClassClass);
More information about the Java
mailing list