summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>2003-08-20 17:27:56 +0000
committeraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>2003-08-20 17:27:56 +0000
commit30e23acf269fc543557d02a61c9f9d3539f5e8fa (patch)
tree8cc9800fc859447329cd4c9ba42a32a51f71de0f
parent09b5e87b255c834c2e43f4869eaaef0ae78dc1e6 (diff)
downloadppe42-gcc-30e23acf269fc543557d02a61c9f9d3539f5e8fa.tar.gz
ppe42-gcc-30e23acf269fc543557d02a61c9f9d3539f5e8fa.zip
2003-01-31 Andrew Haley <aph@redhat.com>
* except.c (prepare_eh_table_type): Use new encoding for exception handlers when using -fno-assume-compiled. 2003-08-20 Andrew Haley <aph@redhat.com> * gnu/gcj/runtime/StackTrace.java (getClass): New method. * gnu/gcj/runtime/natStackTrace.cc (getClass): New method. (classAt): Break out class lookup function into getClass(). * exception.cc (PERSONALITY_FUNCTION): Use new encoding for exception handlers when using -fno-assume-compiled. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@70605 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/java/except.c34
-rw-r--r--libjava/ChangeLog8
-rw-r--r--libjava/exception.cc23
-rw-r--r--libjava/gnu/gcj/runtime/StackTrace.java2
-rw-r--r--libjava/gnu/gcj/runtime/natStackTrace.cc17
5 files changed, 69 insertions, 15 deletions
diff --git a/gcc/java/except.c b/gcc/java/except.c
index 9ad41a658ba..6aeff65ea25 100644
--- a/gcc/java/except.c
+++ b/gcc/java/except.c
@@ -324,10 +324,36 @@ prepare_eh_table_type (tree type)
else if (is_compiled_class (type))
exp = build_class_ref (type);
else
- exp = fold (build
- (PLUS_EXPR, ptr_type_node,
- build_utf8_ref (DECL_NAME (TYPE_NAME (type))),
- size_one_node));
+ {
+ tree ctype = make_node (RECORD_TYPE);
+ tree field = NULL_TREE;
+ tree cinit, decl;
+ tree utf8_ref = build_utf8_ref (DECL_NAME (TYPE_NAME (type)));
+ char buf[64];
+ sprintf (buf, "%s_ref",
+ IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (utf8_ref, 0))));
+ PUSH_FIELD (ctype, field, "dummy", ptr_type_node);
+ PUSH_FIELD (ctype, field, "utf8", utf8const_ptr_type);
+ FINISH_RECORD (ctype);
+ START_RECORD_CONSTRUCTOR (cinit, ctype);
+ PUSH_FIELD_VALUE (cinit, "dummy",
+ convert (ptr_type_node, integer_minus_one_node));
+ PUSH_FIELD_VALUE (cinit, "utf8", utf8_ref);
+ FINISH_RECORD_CONSTRUCTOR (cinit);
+ TREE_CONSTANT (cinit) = 1;
+ decl = build_decl (VAR_DECL, get_identifier (buf), ctype);
+ TREE_STATIC (decl) = 1;
+ DECL_ARTIFICIAL (decl) = 1;
+ DECL_IGNORED_P (decl) = 1;
+ TREE_READONLY (decl) = 1;
+ TREE_THIS_VOLATILE (decl) = 0;
+ DECL_INITIAL (decl) = cinit;
+ layout_decl (decl, 0);
+ pushdecl (decl);
+ rest_of_decl_compilation (decl, (char*) 0, global_bindings_p (), 0);
+ make_decl_rtl (decl, (char*) 0);
+ exp = build1 (ADDR_EXPR, build_pointer_type (ctype), decl);
+ }
return exp;
}
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 99c2229343b..892e2c148ca 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,11 @@
+2003-08-20 Andrew Haley <aph@redhat.com>
+
+ * gnu/gcj/runtime/StackTrace.java (getClass): New method.
+ * gnu/gcj/runtime/natStackTrace.cc (getClass): New method.
+ (classAt): Break out class lookup function into getClass().
+ * exception.cc (PERSONALITY_FUNCTION): Use new encoding for exception
+ handlers when using -fno-assume-compiled.
+
2003-08-20 Tom Tromey <tromey@redhat.com>
Fix for PR libgcj/9125:
diff --git a/libjava/exception.cc b/libjava/exception.cc
index d983f98f8fa..9647d446d18 100644
--- a/libjava/exception.cc
+++ b/libjava/exception.cc
@@ -15,6 +15,9 @@ details. */
#include <java/lang/Class.h>
#include <java/lang/NullPointerException.h>
+#include <gnu/gcj/runtime/StackTrace.h>
+#include <gnu/gcj/runtime/MethodRef.h>
+#include <gnu/gcj/RawData.h>
#include <gcj/cni.h>
#include <jvm.h>
@@ -335,11 +338,21 @@ PERSONALITY_FUNCTION (int version,
jclass catch_type = get_ttype_entry (context, &info, ar_filter);
- // The catch_type is either a (java::lang::Class*) or
- // is one more than a (Utf8Const*).
- if ((size_t)catch_type & 1)
- catch_type = _Jv_FindClass ((Utf8Const*)((size_t)catch_type ^ 1), NULL);
-
+ typedef struct {
+ int __attribute__ ((mode (pointer))) dummy;
+ Utf8Const *utf8;
+ } utf8_hdr;
+ utf8_hdr *p = (utf8_hdr *)catch_type;
+ if (p->dummy == -1)
+ {
+ using namespace gnu::gcj::runtime;
+ java::lang::Class *klass
+ = StackTrace::getClass ((gnu::gcj::RawData *)ip);
+ java::lang::ClassLoader *loader
+ = klass ? klass->getClassLoaderInternal () : NULL;
+ catch_type = _Jv_FindClass (p->utf8, loader);
+ }
+
if (_Jv_IsInstanceOf (xh->value, catch_type))
{
handler_switch_value = ar_filter;
diff --git a/libjava/gnu/gcj/runtime/StackTrace.java b/libjava/gnu/gcj/runtime/StackTrace.java
index 5faaa1495ae..684ee4fd997 100644
--- a/libjava/gnu/gcj/runtime/StackTrace.java
+++ b/libjava/gnu/gcj/runtime/StackTrace.java
@@ -139,6 +139,8 @@ public final class StackTrace
return len;
}
+ public static native Class getClass(RawData ip);
+
private static native void update();
private static MethodRef methodAtAddress(RawData addr)
{
diff --git a/libjava/gnu/gcj/runtime/natStackTrace.cc b/libjava/gnu/gcj/runtime/natStackTrace.cc
index d39cd00dbab..af8889beb52 100644
--- a/libjava/gnu/gcj/runtime/natStackTrace.cc
+++ b/libjava/gnu/gcj/runtime/natStackTrace.cc
@@ -124,6 +124,16 @@ gnu::gcj::runtime::StackTrace::getCompiledMethodRef (gnu::gcj::RawData *addr)
}
java::lang::Class *
+gnu::gcj::runtime::StackTrace::getClass (gnu::gcj::RawData *p)
+{
+ gnu::gcj::runtime::MethodRef *ref = getCompiledMethodRef (p);
+ if (ref)
+ return ref->klass;
+ else
+ return NULL;
+}
+
+java::lang::Class *
gnu::gcj::runtime::StackTrace::classAt (jint n)
{
_Jv_frame_info *frame = GET_FRAME (n);
@@ -137,12 +147,7 @@ gnu::gcj::runtime::StackTrace::classAt (jint n)
}
#endif // INTERPRETER
- gnu::gcj::runtime::MethodRef *ref
- = getCompiledMethodRef ((gnu::gcj::RawData *)frame->addr);
- if (ref)
- return ref->klass;
- else
- return NULL;
+ return getClass ((gnu::gcj::RawData *)frame->addr);
}
java::lang::String*
OpenPOWER on IntegriCloud