[vmkit-commits] [vmkit] r62051 - in /vmkit/trunk/lib/JnJVM/VMCore: Jnjvm.cpp Jnjvm.h JnjvmClassLoader.cpp JnjvmClassLoader.h
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Sun Jan 11 13:43:38 PST 2009
Author: geoffray
Date: Sun Jan 11 15:43:38 2009
New Revision: 62051
URL: http://llvm.org/viewvc/llvm-project?rev=62051&view=rev
Log:
Initial support for main application loading as a .so.
Modified:
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=62051&r1=62050&r2=62051&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Sun Jan 11 15:43:38 2009
@@ -541,7 +541,7 @@
void ClArgumentsInfo::extractClassFromJar(Jnjvm* vm, int argc, char** argv,
int i) {
- char* jarFile = argv[i];
+ jarFile = argv[i];
uint32 size = 2 + strlen(vm->classpath) + strlen(jarFile);
char* temp = (char*)vm->allocator.Allocate(size);
@@ -761,6 +761,10 @@
upcalls->getSystemClassLoader->invokeJavaObjectStatic(this, cl);
appClassLoader = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader,
this);
+ if (argumentsInfo.jarFile)
+ appClassLoader->loadLibFromJar(this, argumentsInfo.jarFile,
+ argumentsInfo.className);
+ else appClassLoader->loadLibFromFile(this, argumentsInfo.className);
}
return appClassLoader;
}
@@ -1057,32 +1061,7 @@
hashStr.insert(*i);
}
- ClassMap* classes = bootstrapLoader->getClasses();
- JnjvmModule* M = bootstrapLoader->getModule();
- for (ClassMap::iterator i = classes->map.begin(), e = classes->map.end();
- i != e; ++i) {
- CommonClass* cl = i->second;
- if (cl->isClass()) {
- Class* C = cl->asClass();
-
- for (uint32 i = 0; i < C->nbVirtualMethods; ++i) {
- JavaMethod& meth = C->virtualMethods[i];
- if (!isAbstract(meth.access) && meth.code) {
- addMethodInFunctionMap(&meth, meth.code);
- M->setMethod(&meth, meth.code, "");
- }
- }
-
- for (uint32 i = 0; i < C->nbStaticMethods; ++i) {
- JavaMethod& meth = C->staticMethods[i];
- if (!isAbstract(meth.access) && meth.code) {
- addMethodInFunctionMap(&meth, meth.code);
- M->setMethod(&meth, meth.code, "");
- }
- }
- }
- }
-
+ bootstrapLoader->insertAllMethodsInVM(this);
#ifdef ISOLATE
IsolateLock.lock();
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=62051&r1=62050&r2=62051&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Sun Jan 11 15:43:38 2009
@@ -86,6 +86,7 @@
char** argv;
uint32 appArgumentsPos;
char* className;
+ char* jarFile;
std::vector< std::pair<char*, char*> > agents;
void readArgs(Jnjvm *vm);
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=62051&r1=62050&r2=62051&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Sun Jan 11 15:43:38 2009
@@ -9,6 +9,8 @@
#include <climits>
#include <cstdlib>
+
+// for strrchr
#include <cstring>
// for dlopen and dlsym
@@ -23,10 +25,10 @@
#if defined(__MACH__)
#define SELF_HANDLE RTLD_DEFAULT
-#define BOOTLIBNAME "libvmjc.dylib"
+#define DYLD_EXTENSION ".dylib"
#else
#define SELF_HANDLE 0
-#define BOOTLIBNAME "libvmjc.so"
+#define DYLD_EXTENSION ".so"
#endif
#include "debug.h"
@@ -162,7 +164,7 @@
// Now that native types have been loaded, try to find if we have a
// pre-compiled rt.jar
- nativeHandle = dlopen(BOOTLIBNAME, RTLD_LAZY | RTLD_GLOBAL);
+ nativeHandle = dlopen("libvmjc"DYLD_EXTENSION, RTLD_LAZY | RTLD_GLOBAL);
if (nativeHandle) {
// Found it!
SuperArray = (Class*)dlsym(nativeHandle, "java.lang.Object");
@@ -948,6 +950,66 @@
return res;
}
+void JnjvmClassLoader::insertAllMethodsInVM(Jnjvm* vm) {
+ JnjvmModule* M = getModule();
+ for (ClassMap::iterator i = classes->map.begin(), e = classes->map.end();
+ i != e; ++i) {
+ CommonClass* cl = i->second;
+ if (cl->isClass()) {
+ Class* C = cl->asClass();
+
+ for (uint32 i = 0; i < C->nbVirtualMethods; ++i) {
+ JavaMethod& meth = C->virtualMethods[i];
+ if (!isAbstract(meth.access) && meth.code) {
+ vm->addMethodInFunctionMap(&meth, meth.code);
+ M->setMethod(&meth, meth.code, "");
+ }
+ }
+
+ for (uint32 i = 0; i < C->nbStaticMethods; ++i) {
+ JavaMethod& meth = C->staticMethods[i];
+ if (!isAbstract(meth.access) && meth.code) {
+ vm->addMethodInFunctionMap(&meth, meth.code);
+ M->setMethod(&meth, meth.code, "");
+ }
+ }
+ }
+ }
+}
+
+void JnjvmClassLoader::loadLibFromJar(Jnjvm* vm, const char* name,
+ const char* file) {
+
+ char* soName = (char*)alloca(strlen(name) + strlen(DYLD_EXTENSION));
+ char* ptr = strrchr(name, '/');
+ sprintf(soName, "%s%s", ptr ? ptr + 1 : name, DYLD_EXTENSION);
+ void* handle = dlopen(soName, RTLD_LAZY | RTLD_LOCAL);
+ if (handle) {
+ Class* cl = (Class*)dlsym(handle, file);
+ if (cl) {
+ static_init_t init = (static_init_t)(uintptr_t)cl->classLoader;
+ assert(init && "Loaded the wrong library");
+ init(this);
+ insertAllMethodsInVM(vm);
+ }
+ }
+}
+
+void JnjvmClassLoader::loadLibFromFile(Jnjvm* vm, const char* name) {
+ assert(classes->map.size() == 0);
+ char* soName = (char*)alloca(strlen(name) + strlen(DYLD_EXTENSION));
+ sprintf(soName, "%s%s", name, DYLD_EXTENSION);
+ void* handle = dlopen(soName, RTLD_LAZY | RTLD_LOCAL);
+ if (handle) {
+ Class* cl = (Class*)dlsym(handle, name);
+ if (cl) {
+ static_init_t init = (static_init_t)(uintptr_t)cl->classLoader;
+ init(this);
+ insertAllMethodsInVM(vm);
+ }
+ }
+}
+
// Extern "C" functions called by the vmjc static intializer.
extern "C" void vmjcAddPreCompiledClass(JnjvmClassLoader* JCL,
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=62051&r1=62050&r2=62051&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Sun Jan 11 15:43:38 2009
@@ -266,6 +266,22 @@
/// JnJVM.
///
intptr_t nativeLookup(JavaMethod* meth, bool& jnjvm, char* buf);
+
+ /// insertAllMethodsInVM - Insert all methods defined by this class loader
+ /// in the VM.
+ ///
+ void insertAllMethodsInVM(Jnjvm* vm);
+
+ /// loadLibFromJar - Try to load the shared library compiled by vmjc with
+ /// this jar file.
+ ///
+ void loadLibFromJar(Jnjvm* vm, const char* name, const char* file);
+
+ /// loadLibFromFile - Try to load the shared library compiled by vmjc with
+ /// this class file.
+ ///
+ void loadLibFromFile(Jnjvm* vm, const char* name);
+
};
/// JnjvmBootstrapLoader - This class is for the bootstrap class loader, which
More information about the vmkit-commits
mailing list