[vmkit-commits] [vmkit] r75434 - in /vmkit/trunk: include/jnjvm/JnjvmModule.h lib/JnJVM/Compiler/JavaAOTCompiler.cpp tools/vmjc/vmjc.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Sun Jul 12 14:55:30 PDT 2009
Author: geoffray
Date: Sun Jul 12 16:55:30 2009
New Revision: 75434
URL: http://llvm.org/viewvc/llvm-project?rev=75434&view=rev
Log:
Change how to specify which classes must be clinited.
Also a couple of bugfixes for emitting Java objects and magic objects.
Modified:
vmkit/trunk/include/jnjvm/JnjvmModule.h
vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp
vmkit/trunk/tools/vmjc/vmjc.cpp
Modified: vmkit/trunk/include/jnjvm/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/jnjvm/JnjvmModule.h?rev=75434&r1=75433&r2=75434&view=diff
==============================================================================
--- vmkit/trunk/include/jnjvm/JnjvmModule.h (original)
+++ vmkit/trunk/include/jnjvm/JnjvmModule.h Sun Jul 12 16:55:30 2009
@@ -11,6 +11,7 @@
#define JNJVM_MODULE_H
#include <map>
+#include <vector>
#include "mvm/Allocator.h"
#include "mvm/JIT.h"
@@ -639,8 +640,9 @@
bool generateStubs;
bool assumeCompiled;
- bool runClinit;
bool compileRT;
+
+ std::vector<std::string>* clinits;
void CreateStaticInitializer();
Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp?rev=75434&r1=75433&r2=75434&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp Sun Jul 12 16:55:30 2009
@@ -210,21 +210,31 @@
Constant* JavaAOTCompiler::getFinalObject(JavaObject* obj) {
- llvm::Constant* varGV = 0;
+ llvm::GlobalVariable* varGV = 0;
final_object_iterator End = finalObjects.end();
final_object_iterator I = finalObjects.find(obj);
if (I == End) {
- Constant* CO = CreateConstantFromJavaObject(obj);
-
- varGV = new GlobalVariable(CO->getType(), true,
- GlobalValue::InternalLinkage,
- CO, "", getLLVMModule());
+
+ if (mvm::Collector::begOf(obj)) {
+
+ const Type* Ty = JnjvmModule::JavaObjectType->getContainedType(0);
+ varGV = new GlobalVariable(Ty, true, GlobalValue::InternalLinkage,
+ 0, "", getLLVMModule());
- varGV = ConstantExpr::getCast(Instruction::BitCast, varGV,
- JnjvmModule::JavaObjectType);
- finalObjects.insert(std::make_pair(obj, varGV));
- return varGV;
+ finalObjects.insert(std::make_pair(obj, varGV));
+
+ Constant* C = ConstantExpr::getBitCast(CreateConstantFromJavaObject(obj),
+ Ty);
+
+ varGV->setInitializer(C);
+ return varGV;
+ } else {
+ Constant* CI = ConstantInt::get(Type::Int64Ty, uint64_t(obj));
+ CI = ConstantExpr::getIntToPtr(CI, JnjvmModule::JavaObjectType);
+ finalObjects.insert(std::make_pair(obj, CI));
+ return CI;
+ }
} else {
return I->second;
}
@@ -505,7 +515,7 @@
// JavaObject
Constant* CurConstant = CreateConstantForBaseObject(obj->getClass());
- for (uint32 j = 0; j < cl->virtualVT->depth; ++j) {
+ for (uint32 j = 1; j <= cl->virtualVT->depth; ++j) {
std::vector<Constant*> TempElts;
Elmts.push_back(CurConstant);
TempElts.push_back(CurConstant);
@@ -547,8 +557,14 @@
abort();
}
} else {
- Constant* C = getFinalObject(field.getObjectField(obj));
- TempElts.push_back(C);
+ JavaObject* val = field.getObjectField(obj);
+ if (val) {
+ Constant* C = getFinalObject(field.getObjectField(obj));
+ TempElts.push_back(C);
+ } else {
+ const llvm::Type* Ty = JnjvmModule::JavaObjectType;
+ TempElts.push_back(Constant::getNullValue(Ty));
+ }
}
}
CurConstant = ConstantStruct::get(STy, TempElts);
@@ -1115,7 +1131,11 @@
} else if (Ty->isFloatingPoint()) {
Vals.push_back(ConstantFP::get(Ty, (double)(size_t)val->elements[i]));
} else {
- Vals.push_back(getFinalObject((JavaObject*)(size_t)val->elements[i]));
+ if (val->elements[i]) {
+ Vals.push_back(getFinalObject((JavaObject*)(size_t)val->elements[i]));
+ } else {
+ Vals.push_back(Constant::getNullValue(JnjvmModule::JavaObjectType));
+ }
}
}
@@ -1575,10 +1595,11 @@
Jnjvm* vm = th->getJVM();
JnjvmBootstrapLoader* bootstrapLoader = vm->bootstrapLoader;
JavaAOTCompiler* M = (JavaAOTCompiler*)bootstrapLoader->getCompiler();
+ JavaJITCompiler* Comp = 0;
try {
- if (M->runClinit) {
- JavaJITCompiler* Comp = new JavaJITCompiler("JIT");
+ if (!M->clinits->empty()) {
+ Comp = new JavaJITCompiler("JIT");
bootstrapLoader->setCompiler(Comp);
bootstrapLoader->analyseClasspathEnv(vm->classpath);
} else {
@@ -1646,13 +1667,44 @@
}
- if (M->runClinit) {
+ if (!M->clinits->empty()) {
vm->loadBootstrap();
-
- for (std::vector<Class*>::iterator i = classes.begin(), e = classes.end();
- i != e; ++i) {
- Class* cl = *i;
- cl->initialiseClass(vm);
+
+ for (std::vector<std::string>::iterator i = M->clinits->begin(),
+ e = M->clinits->end(); i != e; ++i) {
+
+ if (i->at(i->length() - 1) == '*') {
+ for (std::vector<Class*>::iterator ii = classes.begin(),
+ ee = classes.end(); ii != ee; ++ii) {
+ Class* cl = *ii;
+ if (!strncmp(UTF8Buffer(cl->name).cString(), i->c_str(),
+ i->length() - 1)) {
+ try {
+ cl->asClass()->initialiseClass(vm);
+ } catch (...) {
+ fprintf(stderr, "Error when initializing %s\n",
+ UTF8Buffer(cl->name).cString());
+ abort();
+ }
+ }
+ }
+ } else {
+
+ const UTF8* name = bootstrapLoader->asciizConstructUTF8(i->c_str());
+ CommonClass* cl = bootstrapLoader->lookupClass(name);
+ if (cl && cl->isClass()) {
+ try {
+ cl->asClass()->initialiseClass(vm);
+ } catch (...) {
+ fprintf(stderr, "Error when initializing %s\n",
+ UTF8Buffer(cl->name).cString());
+ abort();
+ }
+ } else {
+ fprintf(stderr, "Class %s does not exist or is an array class.\n",
+ i->c_str());
+ }
+ }
}
bootstrapLoader->setCompiler(M);
}
@@ -1675,7 +1727,7 @@
const UTF8* utf8 = bootstrapLoader->asciizConstructUTF8(realName);
UserClass* cl = bootstrapLoader->loadName(utf8, true, true);
- if (M->runClinit) {
+ if (!M->clinits->empty()) {
vm->loadBootstrap();
cl->initialiseClass(vm);
bootstrapLoader->setCompiler(M);
Modified: vmkit/trunk/tools/vmjc/vmjc.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmjc/vmjc.cpp?rev=75434&r1=75433&r2=75434&view=diff
==============================================================================
--- vmkit/trunk/tools/vmjc/vmjc.cpp (original)
+++ vmkit/trunk/tools/vmjc/vmjc.cpp Sun Jul 12 16:55:30 2009
@@ -107,9 +107,6 @@
AssumeCompiled("assume-compiled",
cl::desc("Assume external Java classes are compiled"));
-static cl::opt<bool>
-WithClinit("with-clinit", cl::desc("Clinit the given file"));
-
static cl::opt<bool>
PrintStats("print-aot-stats",
cl::desc("Print stats by the AOT compiler"));
@@ -118,6 +115,10 @@
static cl::list<std::string>
Properties("D", cl::desc("Set a property"), cl::Prefix, cl::ZeroOrMore);
+static cl::list<std::string>
+WithClinit("with-clinit", cl::desc("Set a property"), cl::ZeroOrMore,
+ cl::CommaSeparated);
+
inline void addPass(FunctionPassManager *PM, Pass *P) {
@@ -179,7 +180,7 @@
return 0;
}
- if (!WithClinit) {
+ if (WithClinit.empty()) {
Module* TheModule = new Module("bootstrap module",
*(new llvm::LLVMContext()));
if (!TargetTriple.empty())
@@ -213,7 +214,6 @@
JavaAOTCompiler* Comp = new JavaAOTCompiler("AOT");
mvm::Collector::initialise();
- mvm::Collector::enable(0);
JnjvmClassLoader* JCL = mvm::VirtualMachine::initialiseJVM(Comp, false);
addCommandLinePass(argv);
@@ -221,7 +221,6 @@
if (DisableExceptions) Comp->disableExceptions();
if (DisableStubs) Comp->generateStubs = false;
if (AssumeCompiled) Comp->assumeCompiled = true;
- if (WithClinit) Comp->runClinit = true;
mvm::BumpPtrAllocator A;
Jnjvm* vm = new(A, "Bootstrap loader") Jnjvm(A, (JnjvmBootstrapLoader*)JCL);
@@ -240,6 +239,7 @@
}
}
+ Comp->clinits = &WithClinit;
Comp->compileFile(vm, InputFilename.c_str());
if (!MainClass.empty()) {
More information about the vmkit-commits
mailing list