[vmkit-commits] [vmkit] r61626 - in /vmkit/trunk/lib/JnJVM/VMCore: Jnjvm.cpp JnjvmClassLoader.cpp JnjvmModule.cpp JnjvmModule.h
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Sun Jan 4 05:39:44 PST 2009
Author: geoffray
Date: Sun Jan 4 07:39:35 2009
New Revision: 61626
URL: http://llvm.org/viewvc/llvm-project?rev=61626&view=rev
Log:
Add a static initializer when static compiling. The initializer records
the classes in the given class loader and loads the class required.
Modified:
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=61626&r1=61625&r2=61626&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Sun Jan 4 07:39:35 2009
@@ -1181,13 +1181,11 @@
}
// Set the linkage to External, so that the printer does not complain.
- llvm::Module* M = bootstrapLoader->getModule();
- for (Module::iterator i = M->begin(), e = M->end(); i != e; ++i) {
- i->setLinkage(llvm::GlobalValue::ExternalLinkage);
- }
+ JnjvmModule* M = bootstrapLoader->getModule();
+ M->CreateStaticInitializer();
// Print stats before quitting.
- bootstrapLoader->getModule()->printStats();
+ M->printStats();
bootstrapLoader->getModuleProvider()->printStats();
} catch(std::string str) {
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=61626&r1=61625&r2=61626&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Sun Jan 4 07:39:35 2009
@@ -920,3 +920,20 @@
}
return res;
}
+
+
+// Extern "C" functions called by the vmjc static intializer.
+extern "C" void vmjcAddPreCompiledClass(JnjvmClassLoader* JCL,
+ CommonClass* cl) {
+ JCL->getClasses()->map.insert(std::make_pair(cl->name, cl));
+ cl->classLoader = JCL;
+}
+
+extern "C" void vmjcGetClassArray(JnjvmClassLoader* JCL, ClassArray** ptr,
+ const UTF8* name) {
+ *ptr = JCL->constructArray(name);
+}
+
+extern "C" void vmjcLoadClass(JnjvmClassLoader* JCL, const UTF8* name) {
+ JCL->loadName(name, true, true);
+}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61626&r1=61625&r2=61626&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Sun Jan 4 07:39:35 2009
@@ -32,6 +32,7 @@
llvm::Constant* JnjvmModule::PrimitiveArrayVT;
llvm::Constant* JnjvmModule::ReferenceArrayVT;
+llvm::Function* JnjvmModule::StaticInitializer;
extern void* JavaArrayVT[];
extern void* ArrayObjectVT[];
@@ -97,12 +98,12 @@
llvm::ConstantInt* JnjvmModule::JavaObjectClassOffsetConstant;
-bool JnjvmModule::isCompiling(CommonClass* cl) {
+bool JnjvmModule::isCompiling(const CommonClass* cl) const {
if (cl->isClass()) {
// A class is being static compiled if owner class is not null.
- return (cl->asClass()->getOwnerClass() != 0);
+ return (((Class*)cl)->getOwnerClass() != 0);
} else if (cl->isArray()) {
- return isCompiling(cl->asArrayClass()->baseClass());
+ return isCompiling(((ClassArray*)cl)->baseClass());
} else {
return false;
}
@@ -702,7 +703,7 @@
ATy = dyn_cast<ArrayType>(STy->getContainedType(2));
assert(ATy && "Malformed type");
- Constant* TCM[1] = { Constant::getNullValue(JavaObjectType) };
+ Constant* TCM[1] = { getJavaClass(cl) };
CommonClassElts.push_back(ConstantArray::get(ATy, TCM, 1));
// access
@@ -740,8 +741,10 @@
CommonClassElts.push_back(Constant::getNullValue(JavaClassType));
}
- // classLoader
- CommonClassElts.push_back(Constant::getNullValue(ptrType));
+ // classLoader: store the static initializer, it will be overriden once
+ // the class is loaded.
+ Constant* loader = ConstantExpr::getBitCast(StaticInitializer, ptrType);
+ CommonClassElts.push_back(loader);
return ConstantStruct::get(STy, CommonClassElts);
}
@@ -1909,6 +1912,13 @@
#undef PRIMITIVE_ARRAY
+ std::vector<const llvm::Type*> llvmArgs;
+ llvmArgs.push_back(ptrType); // class loader.
+ const FunctionType* FTy = FunctionType::get(Type::VoidTy, llvmArgs, false);
+
+ StaticInitializer = Function::Create(FTy, GlobalValue::InternalLinkage,
+ "Init", this);
+
} else {
PrimitiveArrayVT = ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty,
uint64(JavaArrayVT)),
@@ -2212,3 +2222,72 @@
}
}
#endif
+
+void JnjvmModule::CreateStaticInitializer() {
+
+ // Set the linkage of all functions to External, so that the printer does
+ // not complain.
+ for (Module::iterator i = begin(), e = end(); i != e; ++i) {
+ i->setLinkage(GlobalValue::ExternalLinkage);
+ }
+
+ std::vector<const llvm::Type*> llvmArgs;
+ llvmArgs.push_back(ptrType); // class loader
+ llvmArgs.push_back(JavaCommonClassType); // cl
+ const FunctionType* FTy = FunctionType::get(Type::VoidTy, llvmArgs, false);
+
+ Function* AddClass = Function::Create(FTy, GlobalValue::ExternalLinkage,
+ "vmjcAddPreCompiledClass", this);
+
+ llvmArgs.clear();
+ llvmArgs.push_back(ptrType); // class loader
+ llvmArgs.push_back(PointerType::getUnqual(JavaClassArrayType)); // array ptr
+ llvmArgs.push_back(UTF8Type); // name
+ FTy = FunctionType::get(Type::VoidTy, llvmArgs, false);
+
+ Function* GetClassArray = Function::Create(FTy, GlobalValue::ExternalLinkage,
+ "vmjcGetClassArray", this);
+
+ llvmArgs.clear();
+ llvmArgs.push_back(ptrType); // class loader
+ llvmArgs.push_back(UTF8Type); // name
+ FTy = FunctionType::get(Type::VoidTy, llvmArgs, false);
+
+ Function* LoadClass = Function::Create(FTy, GlobalValue::ExternalLinkage,
+ "vmjcLoadClass", this);
+
+
+ BasicBlock* currentBlock = BasicBlock::Create("enter", StaticInitializer);
+ Function::arg_iterator loader = StaticInitializer->arg_begin();
+
+ Value* Args[3];
+ for (native_class_iterator i = nativeClasses.begin(),
+ e = nativeClasses.end(); i != e; ++i) {
+ if (isCompiling(i->first)) {
+ Args[0] = loader;
+ Args[1] = ConstantExpr::getBitCast(i->second, JavaCommonClassType);
+ CallInst::Create(AddClass, Args, Args + 2, "", currentBlock);
+ }
+ }
+
+ for (native_class_iterator i = nativeClasses.begin(),
+ e = nativeClasses.end(); i != e; ++i) {
+ if (!isCompiling(i->first)) {
+ Args[0] = loader;
+ Args[1] = getUTF8(i->first->name);
+ CallInst::Create(LoadClass, Args, Args + 2, "", currentBlock);
+ }
+ }
+
+ for (array_class_iterator i = arrayClasses.begin(),
+ e = arrayClasses.end(); i != e; ++i) {
+ if (!(i->first->baseClass()->isPrimitive())) {
+ Args[0] = loader;
+ Args[1] = i->second;
+ Args[2] = getUTF8(i->first->name);
+ CallInst::Create(GetClassArray, Args, Args + 3, "", currentBlock);
+ }
+ }
+
+ ReturnInst::Create(currentBlock);
+}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=61626&r1=61625&r2=61626&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Sun Jan 4 07:39:35 2009
@@ -233,6 +233,8 @@
static llvm::Constant* PrimitiveArrayVT;
static llvm::Constant* ReferenceArrayVT;
+ static llvm::Function* StaticInitializer;
+
public:
bool isStaticCompiling() {
@@ -421,7 +423,9 @@
#endif
- bool isCompiling(CommonClass* cl);
+ bool isCompiling(const CommonClass* cl) const;
+
+ void CreateStaticInitializer();
private:
static llvm::Module* initialModule;
@@ -444,6 +448,7 @@
llvm::Constant* CreateConstantFromJavaClass(CommonClass* cl);
llvm::Constant* CreateConstantForJavaObject(CommonClass* cl);
llvm::Constant* getUTF8(const UTF8* val);
+
};
}
More information about the vmkit-commits
mailing list