[vmkit-commits] [vmkit] r137030 - in /vmkit/trunk: include/j3/JavaAOTCompiler.h lib/J3/Compiler/JavaAOTCompiler.cpp lib/J3/VMCore/JnjvmClassLoader.cpp tools/j3/Makefile tools/precompiler/Precompiler.cpp tools/precompiler/trainer/Makefile
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Sun Aug 7 01:46:44 PDT 2011
Author: geoffray
Date: Sun Aug 7 03:46:43 2011
New Revision: 137030
URL: http://llvm.org/viewvc/llvm-project?rev=137030&view=rev
Log:
Create a different .o file for the class bytes.
Modified:
vmkit/trunk/include/j3/JavaAOTCompiler.h
vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp
vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
vmkit/trunk/tools/j3/Makefile
vmkit/trunk/tools/precompiler/Precompiler.cpp
vmkit/trunk/tools/precompiler/trainer/Makefile
Modified: vmkit/trunk/include/j3/JavaAOTCompiler.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/j3/JavaAOTCompiler.h?rev=137030&r1=137029&r2=137030&view=diff
==============================================================================
--- vmkit/trunk/include/j3/JavaAOTCompiler.h (original)
+++ vmkit/trunk/include/j3/JavaAOTCompiler.h Sun Aug 7 03:46:43 2011
@@ -183,6 +183,7 @@
bool assumeCompiled;
bool compileRT;
bool precompile;
+ bool emitClassBytes;
std::vector<std::string>* clinits;
@@ -196,6 +197,7 @@
void compileFile(Jnjvm* vm, const char* name);
void compileClass(Class* cl);
void compileClassLoader(JnjvmBootstrapLoader* loader);
+ void generateClassBytes(JnjvmBootstrapLoader* loader);
void generateMain(const char* name, bool jit);
private:
Modified: vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp?rev=137030&r1=137029&r2=137030&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp Sun Aug 7 03:46:43 2011
@@ -273,10 +273,15 @@
return CI->second;
}
- std::string name(UTF8Buffer(className).toCompileName()->cString());
- name += "_bytes";
- Constant* C = CreateConstantFromClassBytes(bytes);
- GlobalVariable* varGV = new GlobalVariable(*getLLVMModule(), C->getType(), false,
+ std::vector<Type*> Elemts;
+ ArrayType* ATy = ArrayType::get(Type::getInt8Ty(getLLVMContext()), bytes->size);
+ Elemts.push_back(Type::getInt32Ty(getLLVMContext()));
+ Elemts.push_back(ATy);
+ StructType* STy = StructType::get(getLLVMContext(), Elemts);
+
+ std::string name(UTF8Buffer(className).toCompileName("_bytes")->cString());
+ Constant* C = emitClassBytes ? CreateConstantFromClassBytes(bytes) : NULL;
+ GlobalVariable* varGV = new GlobalVariable(*getLLVMModule(), STy, false,
GlobalValue::ExternalLinkage,
C, name);
classBytes[bytes] = varGV;
@@ -1323,9 +1328,12 @@
ClassElts.push_back(Constant::getNullValue(JavaIntrinsics.ptrType));
// bytes
- Constant* bytes = ConstantExpr::getBitCast(getClassBytes(cl->name, cl->bytes),
- JavaIntrinsics.ClassBytesType);
- ClassElts.push_back(bytes);
+ if (precompile) {
+ ClassElts.push_back(ConstantExpr::getBitCast(getClassBytes(cl->name, cl->bytes),
+ JavaIntrinsics.ClassBytesType));
+ } else {
+ ClassElts.push_back(Constant::getNullValue(JavaIntrinsics.ClassBytesType));
+ }
// ctpInfo
Constant* ctpInfo = CreateConstantFromJavaConstantPool(cl->ctpInfo);
@@ -1824,6 +1832,7 @@
assumeCompiled = false;
compileRT = false;
precompile = false;
+ emitClassBytes = false;
std::vector<llvm::Type*> llvmArgs;
FunctionType* FTy = FunctionType::get(
@@ -2396,18 +2405,6 @@
AddInitializerToClass(gv, i->second);
}
- // Add the bootstrap classes to the image.
- for (std::vector<ZipArchive*>::iterator i = loader->bootArchives.begin(),
- e = loader->bootArchives.end(); i != e; ++i) {
- ZipArchive* archive = *i;
- for (ZipArchive::table_iterator zi = archive->filetable.begin(),
- ze = archive->filetable.end(); zi != ze; zi++) {
- const char* name = zi->first;
- ClassBytes* bytes = Reader::openZip(loader, archive, name);
- getClassBytes(loader->asciizConstructUTF8(name), bytes);
- }
- }
-
// Finally add used stubs to the image.
for (SignMap::iterator i = loader->javaSignatures->map.begin(),
e = loader->javaSignatures->map.end(); i != e; i++) {
@@ -2448,6 +2445,24 @@
CreateConstantFromUTF8Map(loader->hashUTF8->map);
}
+void JavaAOTCompiler::generateClassBytes(JnjvmBootstrapLoader* loader) {
+ emitClassBytes = true;
+ // Add the bootstrap classes to the image.
+ for (std::vector<ZipArchive*>::iterator i = loader->bootArchives.begin(),
+ e = loader->bootArchives.end(); i != e; ++i) {
+ ZipArchive* archive = *i;
+ for (ZipArchive::table_iterator zi = archive->filetable.begin(),
+ ze = archive->filetable.end(); zi != ze; zi++) {
+ // Remove the '.class'.
+ const char* name = zi->first;
+ std::string str(name, strlen(name) - strlen(".class"));
+ ClassBytes* bytes = Reader::openZip(loader, archive, name);
+ getClassBytes(loader->asciizConstructUTF8(str.c_str()), bytes);
+ }
+ }
+}
+
+
/// compileAllStubs - Compile all the native -> Java stubs.
/// TODO: Once LLVM supports va_arg, enable AP.
///
Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp?rev=137030&r1=137029&r2=137030&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp Sun Aug 7 03:46:43 2011
@@ -240,7 +240,7 @@
ClassBytes* JnjvmBootstrapLoader::openName(const UTF8* utf8) {
ClassBytes* res = reinterpret_cast<ClassBytes*>(dlsym(SELF_HANDLE,
- UTF8Buffer(utf8).toCompileName(".class_bytes")->cString()));
+ UTF8Buffer(utf8).toCompileName("_bytes")->cString()));
if (res != NULL) return res;
mvm::ThreadAllocator threadAllocator;
Modified: vmkit/trunk/tools/j3/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/j3/Makefile?rev=137030&r1=137029&r2=137030&view=diff
==============================================================================
--- vmkit/trunk/tools/j3/Makefile (original)
+++ vmkit/trunk/tools/j3/Makefile Sun Aug 7 03:46:43 2011
@@ -11,7 +11,7 @@
include $(LEVEL)/Makefile.config
TOOLNAME = j3
-USEDLIBS = Classpath.a J3.a J3Compiler.a Mvm.a MvmCompiler.a CommonThread.a FinalMMTk.a InlineMMTk.a Precompiled.a
+USEDLIBS = Classpath.a J3.a J3Compiler.a Mvm.a MvmCompiler.a CommonThread.a FinalMMTk.a InlineMMTk.a Precompiled.a BootstrapClasses.a
BUILD_FRAMETABLE = 1
LINK_COMPONENTS = jit nativecodegen scalaropts instrumentation ipa ipo
Modified: vmkit/trunk/tools/precompiler/Precompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/precompiler/Precompiler.cpp?rev=137030&r1=137029&r2=137030&view=diff
==============================================================================
--- vmkit/trunk/tools/precompiler/Precompiler.cpp (original)
+++ vmkit/trunk/tools/precompiler/Precompiler.cpp Sun Aug 7 03:46:43 2011
@@ -50,9 +50,18 @@
vm->exit();
}
-
int main(int argc, char **argv, char **envp) {
llvm::llvm_shutdown_obj X;
+ bool EmitClassBytes = false;
+ static const char* EmitClassBytesStr = "-emit-class-bytes";
+ for (int i = 0; i < argc; i++) {
+ if (!strncmp(argv[i], EmitClassBytesStr, strlen(EmitClassBytesStr))) {
+ EmitClassBytes = true;
+ break;
+ }
+ }
+
+ std::string OutputFilename;
// Initialize base components.
MvmModule::initialise();
@@ -60,32 +69,39 @@
// Tell the compiler to run all optimizations.
StandardCompileOpts = true;
-
+
// Create the allocator that will allocate the bootstrap loader and the JVM.
mvm::BumpPtrAllocator Allocator;
- JavaJITCompiler* JIT = JavaJITCompiler::CreateCompiler("JIT");
- JnjvmBootstrapLoader* loader = new(Allocator, "Bootstrap loader")
- JnjvmBootstrapLoader(Allocator, JIT, true);
- Jnjvm* vm = new(Allocator, "VM") Jnjvm(Allocator, frametables, loader);
-
- // Run the application.
- vm->runApplication(argc, argv);
- vm->waitForExit();
-
- // Now AOT Compile all compiled methods.
JavaAOTCompiler* AOT = new JavaAOTCompiler("AOT");
- loader->setCompiler(AOT);
-
- vm->doExit = false;
- JavaThread* th = new JavaThread(vm);
- vm->setMainThread(th);
- th->start((void (*)(mvm::Thread*))mainCompilerLoaderStart);
- vm->waitForExit();
+ if (EmitClassBytes) {
+ OutputFilename = "classes.bc";
+ JnjvmBootstrapLoader* loader = new(Allocator, "Bootstrap loader")
+ JnjvmBootstrapLoader(Allocator, AOT, true);
+ AOT->generateClassBytes(loader);
+ } else {
+ OutputFilename = "generated.bc";
+ JavaJITCompiler* JIT = JavaJITCompiler::CreateCompiler("JIT");
+ JnjvmBootstrapLoader* loader = new(Allocator, "Bootstrap loader")
+ JnjvmBootstrapLoader(Allocator, JIT, true);
+ Jnjvm* vm = new(Allocator, "VM") Jnjvm(Allocator, frametables, loader);
+
+ // Run the application.
+ vm->runApplication(argc, argv);
+ vm->waitForExit();
+
+ // Now AOT Compile all compiled methods.
+ loader->setCompiler(AOT);
+
+ vm->doExit = false;
+ JavaThread* th = new JavaThread(vm);
+ vm->setMainThread(th);
+ th->start((void (*)(mvm::Thread*))mainCompilerLoaderStart);
+ vm->waitForExit();
+ }
AOT->printStats();
// Emit the bytecode in file.
- std::string OutputFilename = "generated.bc";
std::string ErrorInfo;
std::auto_ptr<llvm::raw_ostream> Out
(new llvm::raw_fd_ostream(OutputFilename.c_str(), ErrorInfo,
Modified: vmkit/trunk/tools/precompiler/trainer/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/precompiler/trainer/Makefile?rev=137030&r1=137029&r2=137030&view=diff
==============================================================================
--- vmkit/trunk/tools/precompiler/trainer/Makefile (original)
+++ vmkit/trunk/tools/precompiler/trainer/Makefile Sun Aug 7 03:46:43 2011
@@ -10,7 +10,7 @@
include $(LEVEL)/Makefile.config
-BUILT_SOURCES = Precompiled.bc
+BUILT_SOURCES = Precompiled.bc BootstrapClasses.bc
include $(LEVEL)/Makefile.common
@@ -20,17 +20,35 @@
J3.Flags := > /dev/null
endif
-Precompiled.bc: $(PRECOMPILER) HelloWorld.java $(LibDir)/StaticGCPass$(SHLIBEXT) $(LibDir)/StaticGCPrinter$(SHLIBEXT)
- $(Echo) "Building precompiled bootstrap code"
+HelloWorld.class: HelloWorld.java
+ $(Echo) "Compiling trainer"
$(Verb) javac HelloWorld.java
+
+generated.bc: $(PRECOMPILER) HelloWorld.class
+ $(Echo) "Pre-compiling bootstrap code"
$(Verb) $(PRECOMPILER) -cp $$PWD HelloWorld $(J3.Flags)
+
+Precompiled.bc: HelloWorld.class $(LibDir)/StaticGCPass$(SHLIBEXT) $(LibDir)/StaticGCPrinter$(SHLIBEXT) generated.bc
+ $(Echo) "Building precompiled bootstrap code"
$(Verb) $(MKDIR) $(ObjDir)
- $(Verb) $(LOPT) generated.bc -load=$(LibDir)/StaticGCPass$(SHLIBEXT) -StaticGCPass -o $(LibDir)/Precompiled.bc
- $(Verb) $(LLC) -disable-cfi -O0 -fast-isel=false -load=$(LibDir)/StaticGCPrinter$(SHLIBEXT) -disable-fp-elim $(LibDir)/Precompiled.bc -o $(ObjDir)/Precompiled.s
+ $(Verb) $(LLC) -disable-branch-fold -disable-cfi -O0 -fast-isel=false -load=$(LibDir)/StaticGCPrinter$(SHLIBEXT) -disable-fp-elim generated.bc -o $(ObjDir)/Precompiled.s
$(Verb) $(CC) -c $(ObjDir)/Precompiled.s -o $(ObjDir)/Precompiled.o
$(Verb) $(Archive) $(LibDir)/libPrecompiled.a $(ObjDir)/Precompiled.o
$(Verb) $(Ranlib) $(LibDir)/libPrecompiled.a
$(Verb) $(MV) generated.bc Precompiled.bc
+classes.bc: $(PRECOMPILER)
+ $(Echo) "Pre-compiling classes"
+ $(Verb) $(PRECOMPILER) -emit-class-bytes $(J3.Flags)
+
+BootstrapClasses.bc: classes.bc
+ $(Echo) "Building precompiled classes"
+ $(Verb) $(MKDIR) $(ObjDir)
+ $(Verb) $(LLC) classes.bc -o $(ObjDir)/BootstrapClasses.s
+ $(Verb) $(CC) -c $(ObjDir)/BootstrapClasses.s -o $(ObjDir)/BootstrapClasses.o
+ $(Verb) $(Archive) $(LibDir)/libBootstrapClasses.a $(ObjDir)/BootstrapClasses.o
+ $(Verb) $(Ranlib) $(LibDir)/libBootstrapClasses.a
+ $(Verb) $(MV) classes.bc BootstrapClasses.bc
+
clean-local::
- $(Verb) $(RM) -f HelloWorld.class Precompiled.bc
+ $(Verb) $(RM) -f HelloWorld.class Precompiled.bc BootstrapClasses.bc
More information about the vmkit-commits
mailing list