[vmkit-commits] [vmkit] r199375 - Implement FillInStackTrace

Gael Thomas gael.thomas at lip6.fr
Thu Jan 16 04:18:40 PST 2014


Author: gthomas
Date: Thu Jan 16 06:18:40 2014
New Revision: 199375

URL: http://llvm.org/viewvc/llvm-project?rev=199375&view=rev
Log:
Implement FillInStackTrace

Modified:
    vmkit/branches/mcjit/include/j3/j3.h
    vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
    vmkit/branches/mcjit/lib/j3/vm/j3.cc

Modified: vmkit/branches/mcjit/include/j3/j3.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199375&r1=199374&r2=199375&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Thu Jan 16 06:18:40 2014
@@ -103,6 +103,8 @@ namespace j3 {
 		J3Field*         constructorClassSlot;
 		J3Method*        constructorClassInit;
 
+		J3Field*         throwableClassBacktrace;
+
 		llvm::Type* typeJNIEnvPtr;
 		llvm::Type* typeJ3VirtualTablePtr;
 		llvm::Type* typeJ3Type;

Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc?rev=199375&r1=199374&r2=199375&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan 16 06:18:40 2014
@@ -342,7 +342,38 @@ jboolean JNICALL JVM_IsNaN(jdouble d) {
 /*
  * java.lang.Throwable
  */
-void JNICALL JVM_FillInStackTrace(JNIEnv* env, jobject throwable) { enterJVM(); leaveJVM(); NYI(); }
+void JNICALL JVM_FillInStackTrace(JNIEnv* env, jobject throwable) { 
+	enterJVM(); 
+	uint32_t           cur = 0;
+	uint32_t           max = 1024;
+	int64_t            _buf[max];
+	int64_t*           buf = _buf;
+	vmkit::StackWalker walker;
+
+	while(walker.next()) {
+		if(cur == max) {
+			void* prev = buf;
+			buf = (int64_t*)malloc((max<<1)*sizeof(int64_t));
+			memcpy(buf, prev, max*sizeof(int64_t));
+			max <<= 1;
+			if(prev != _buf) 
+				free(prev);
+		}
+		buf[cur++] = (int64_t)(uintptr_t)walker.ip();
+	}
+	
+	J3* vm = J3Thread::get()->vm();
+	jobject backtrace = J3ObjectHandle::doNewArray(vm->typeLong->getArray(), cur);
+	backtrace->setRegionLong(0, buf, 0, cur);
+
+	if(buf != _buf)
+		free(buf);
+
+	throwable->setObject(vm->throwableClassBacktrace, backtrace);
+
+	leaveJVM(); 
+}
+
 jint JNICALL JVM_GetStackTraceDepth(JNIEnv* env, jobject throwable) { enterJVM(); leaveJVM(); NYI(); }
 jobject JNICALL JVM_GetStackTraceElement(JNIEnv* env, jobject throwable, jint index) { enterJVM(); leaveJVM(); NYI(); }
 

Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3.cc?rev=199375&r1=199374&r2=199375&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Thu Jan 16 06:18:40 2014
@@ -145,6 +145,8 @@ void J3::run() {
 	constructorClassInit     = z_method(0, constructorClass, initName,
 																			names()->get("(Ljava/lang/Class;[Ljava/lang/Class;[Ljava/lang/Class;IILjava/lang/String;[B[B)V"));
 
+	throwableClassBacktrace  = z_field(0, z_class("java/lang/Throwable"), "backtrace", objectClass);
+
 #define defJavaClassPrimitive(name, ctype, llvmtype, scale)	\
 	type##name->defineJavaClass("java/lang/"#name);
 	onJavaTypes(defJavaClassPrimitive)





More information about the vmkit-commits mailing list