[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