[vmkit-commits] [vmkit] r199606 - Begin the AOT compiler. For the moment, only find the .class in a jar file.

Gael Thomas gael.thomas at lip6.fr
Sun Jan 19 09:12:29 PST 2014


Author: gthomas
Date: Sun Jan 19 11:12:29 2014
New Revision: 199606

URL: http://llvm.org/viewvc/llvm-project?rev=199606&view=rev
Log:
Begin the AOT compiler. For the moment, only find the .class in a jar file.

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

Modified: vmkit/branches/mcjit/include/j3/j3.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199606&r1=199605&r2=199606&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Sun Jan 19 11:12:29 2014
@@ -50,6 +50,9 @@ namespace j3 {
 
 		void                       introspect();
 
+		void        runApplication();
+		void        compileApplication();
+
 		J3(vmkit::BumpAllocator* allocator);
 	public:
 		J3InitialClassLoader*                 initialClassLoader;
@@ -144,6 +147,8 @@ namespace j3 {
 		const vmkit::Name*         arrayToName(J3ObjectHandle* array);
 		const vmkit::Name*         stringToName(J3ObjectHandle* str);
 
+		const vmkit::Name*         qualifiedToBinaryName(const char* type, size_t length=-1);
+
 		void                       run();
 		void                       start(int argc, char** argv);
 

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=199606&r1=199605&r2=199606&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Jan 19 11:12:29 2014
@@ -569,7 +569,15 @@ jint JNICALL JVM_ClassLoaderDepth(JNIEnv
 /*
  * java.lang.Package
  */
-jstring JNICALL JVM_GetSystemPackage(JNIEnv* env, jstring name) { enterJVM(); leaveJVM(); NYI(); }
+jstring JNICALL JVM_GetSystemPackage(JNIEnv* env, jstring _name) { 
+	/* should implements this, but I don't see what I have to do... */
+	//enterJVM(); 
+	//const vmkit::Name* name = J3Thread::get()->vm()->stringToName(_name);
+	//fprintf(stderr, " get system package from: %s\n", name->cStr());
+	//leaveJVM(); 
+	return _name;
+}
+
 jobjectArray JNICALL JVM_GetSystemPackages(JNIEnv* env) { enterJVM(); leaveJVM(); NYI(); }
 
 /*
@@ -771,7 +779,7 @@ jclass JNICALL JVM_DefineClassWithSource
 	J3* vm = J3Thread::get()->vm();
 	J3ClassLoader* loader = _loader ? J3ClassLoader::nativeClassLoader(_loader) : vm->initialClassLoader;
 	J3ClassBytes* bytes = new(loader->allocator(), len) J3ClassBytes((uint8_t*)buf, len);
-	res = loader->defineClass(vm->names()->get(name), bytes, pd, source)->javaClass();
+	res = loader->defineClass(vm->qualifiedToBinaryName(name), bytes, pd, source)->javaClass();
 	leaveJVM(); 
 	return res;
 }

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=199606&r1=199605&r2=199606&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 19 11:12:29 2014
@@ -173,6 +173,49 @@ void J3::run() {
 
 	J3Lib::bootstrap(this);
 
+	if(options()->isAOT)
+		compileApplication();
+	else
+		runApplication();
+}
+
+void J3::compileApplication() {
+	if(options()->debugLifeCycle)
+		fprintf(stderr, "  Find the class loader\n");
+
+	J3ClassLoader* loader = J3ClassLoader::nativeClassLoader(z_method(J3Cst::ACC_STATIC, z_class("java.lang.ClassLoader"),
+																																		names()->get("getSystemClassLoader"),
+																																		names()->get("()Ljava/lang/ClassLoader;"))->invokeStatic().valObject);
+
+
+	if(options()->mainClass)
+		J3::internalError("compiling a single class is not yet supported");
+	else {
+		J3Class*        jarFileClass = z_class("java.util.jar.JarFile");
+		J3ObjectHandle* jarFile = J3ObjectHandle::doNewObject(jarFileClass);
+		z_method(0, jarFileClass, initName, names()->get("(Ljava/lang/String;)V"))->invokeSpecial(jarFile, utfToString(options()->jarFile));
+		J3ObjectHandle* it = z_method(0, jarFileClass, names()->get("entries"), 
+																	names()->get("()Ljava/util/Enumeration;"))->invokeVirtual(jarFile).valObject;
+		J3Method* hasMore = z_method(0, it->vt()->type()->asObjectType(), names()->get("hasMoreElements"), names()->get("()Z"));
+		J3Method* nextEl = z_method(0, it->vt()->type()->asObjectType(), names()->get("nextElement"), names()->get("()Ljava/lang/Object;"));
+		J3Method* getName = z_method(0, z_class("java.util.zip.ZipEntry"), names()->get("getName"), names()->get("()Ljava/lang/String;"));
+
+		while(hasMore->invokeVirtual(it).valBoolean) {
+			const vmkit::Name* name = stringToName(getName->invokeVirtual(nextEl->invokeVirtual(it).valObject).valObject);
+			
+			if(strcmp(name->cStr() + name->length() - 6, ".class") == 0) {
+				char buf[name->length() - 5];
+				memcpy(buf, name->cStr(), name->length() - 6);
+				buf[name->length()-6] = 0;
+				J3Class* c = loader->getTypeFromQualified(0, buf)->asClass();
+
+				fprintf(stderr, " find: %s\n", c->name()->cStr());
+			}
+		}
+	}
+}
+
+void J3::runApplication() {
 	if(options()->debugLifeCycle)
 		fprintf(stderr, "  Find the application\n");
 
@@ -215,6 +258,18 @@ JNIEnv* J3::jniEnv() {
 	return J3Thread::get()->jniEnv();
 }
 
+const vmkit::Name* J3::qualifiedToBinaryName(const char* type, size_t length) {
+	if(length == -1)
+		length = strlen(type);
+	char buf[length+1];
+	for(size_t i=0; i<length; i++) {
+		char c = type[i];
+		buf[i] = c == '/' ? '.' : c;
+	}
+	buf[length] = 0;
+	return names()->get(buf);
+}
+
 J3ObjectHandle* J3::arrayToString(J3ObjectHandle* array, bool doPush) {
 	pthread_mutex_lock(&stringsMutex);
 	J3ObjectHandle* res = charArrayToStrings[array];

Modified: vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc?rev=199606&r1=199605&r2=199606&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sun Jan 19 11:12:29 2014
@@ -209,17 +209,12 @@ J3ObjectType* J3ClassLoader::getTypeFrom
 	if(length == -1)
 		length = strlen(type);
 
+	J3* vm = J3Thread::get()->vm();
+
 	if(type[0] == J3Cst::ID_Array)
-		return getTypeFromDescriptor(from, J3Thread::get()->vm()->names()->get(type, 0, length))->asObjectType();
-	else {
-		char buf[length+1];
-		for(size_t i=0; i<length; i++) {
-			char c = type[i];
-			buf[i] = c == '/' ? '.' : c;
-		}
-		buf[length] = 0;
-		return loadClass(J3Thread::get()->vm()->names()->get(buf));
-	}
+		return getTypeFromDescriptor(from, vm->names()->get(type, 0, length))->asObjectType();
+	else
+		return loadClass(vm->qualifiedToBinaryName(type, length));
 }
 
 J3Signature* J3ClassLoader::getSignature(J3ObjectType* from, const vmkit::Name* signature) {

Modified: vmkit/branches/mcjit/lib/j3/vm/j3options.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3options.cc?rev=199606&r1=199605&r2=199606&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Sun Jan 19 11:12:29 2014
@@ -111,6 +111,13 @@ void J3CmdLineParser::process() {
 	if(!options->jarFile && !options->mainClass)
 		help();
 
+	if(options->jarFile) {
+		size_t tot = strlen(options->classpath) + strlen(options->jarFile) + 1;
+		char* buf = (char*)malloc(tot);
+		snprintf(buf, tot, "%s:%s", options->jarFile, options->classpath);
+		options->classpath = buf;
+	}
+
 	options->args = argv + cur;
 	options->nbArgs = argc - cur;
 }





More information about the vmkit-commits mailing list