[vmkit-commits] [vmkit] r136601 - in /vmkit/trunk: include/j3/JavaAOTCompiler.h include/mvm/UTF8.h lib/J3/Compiler/JavaAOTCompiler.cpp lib/J3/LLVMRuntime/runtime-default.ll lib/J3/VMCore/JnjvmClassLoader.cpp lib/J3/VMCore/Precompiled.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Sun Jul 31 13:10:14 PDT 2011
Author: geoffray
Date: Sun Jul 31 15:10:14 2011
New Revision: 136601
URL: http://llvm.org/viewvc/llvm-project?rev=136601&view=rev
Log:
Precompiled UTF8 map.
Modified:
vmkit/trunk/include/j3/JavaAOTCompiler.h
vmkit/trunk/include/mvm/UTF8.h
vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp
vmkit/trunk/lib/J3/LLVMRuntime/runtime-default.ll
vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
vmkit/trunk/lib/J3/VMCore/Precompiled.cpp
Modified: vmkit/trunk/include/j3/JavaAOTCompiler.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/j3/JavaAOTCompiler.h?rev=136601&r1=136600&r2=136601&view=diff
==============================================================================
--- vmkit/trunk/include/j3/JavaAOTCompiler.h (original)
+++ vmkit/trunk/include/j3/JavaAOTCompiler.h Sun Jul 31 15:10:14 2011
@@ -11,6 +11,7 @@
#define J3_AOT_COMPILER_H
#include "mvm/MvmDenseMap.h"
+#include "mvm/UTF8.h"
#include "j3/JavaLLVMCompiler.h"
namespace j3 {
@@ -101,6 +102,7 @@
llvm::Constant* CreateConstantFromClassBytes(ClassBytes* bytes);
llvm::Constant* CreateConstantFromJavaConstantPool(JavaConstantPool* ctp);
llvm::Constant* CreateConstantFromClassMap(const mvm::MvmDenseMap<const UTF8*, CommonClass*>& map);
+ llvm::Constant* CreateConstantFromUTF8Map(const mvm::MvmDenseMap<mvm::UTF8MapKey, const UTF8*>& map);
void AddInitializerToClass(llvm::GlobalVariable* varGV, CommonClass* classDef);
llvm::Constant* getUTF8(const UTF8* val);
Modified: vmkit/trunk/include/mvm/UTF8.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/UTF8.h?rev=136601&r1=136600&r2=136601&view=diff
==============================================================================
--- vmkit/trunk/include/mvm/UTF8.h (original)
+++ vmkit/trunk/include/mvm/UTF8.h Sun Jul 31 15:10:14 2011
@@ -116,14 +116,13 @@
};
class UTF8Map : public mvm::PermanentObject {
-private:
+public:
typedef MvmDenseMap<UTF8MapKey, const UTF8*>::iterator iterator;
LockNormal lock;
BumpPtrAllocator& allocator;
// TODO(ngeoffray): This should really be a set.
MvmDenseMap<UTF8MapKey, const UTF8*> map;
-public:
const UTF8* lookupOrCreateAsciiz(const char* asciiz);
const UTF8* lookupOrCreateReader(const uint16* buf, uint32 size);
@@ -131,6 +130,8 @@
const UTF8* lookupReader(const uint16* buf, uint32 size);
UTF8Map(BumpPtrAllocator& A) : allocator(A) {}
+ UTF8Map(BumpPtrAllocator& A, MvmDenseMap<UTF8MapKey, const UTF8*>* m)
+ : allocator(A), map(*m) {}
~UTF8Map() {
for (iterator i = map.begin(), e = map.end(); i!= e; ++i) {
Modified: vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp?rev=136601&r1=136600&r2=136601&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp Sun Jul 31 15:10:14 2011
@@ -15,6 +15,7 @@
#include "llvm/PassManager.h"
#include "llvm/Support/raw_ostream.h"
+#include "mvm/UTF8.h"
#include "mvm/Threads/Thread.h"
#include "j3/J3Intrinsics.h"
@@ -1152,6 +1153,60 @@
ConstantStruct::get(STy, elements), "ClassMap");
}
+Constant* JavaAOTCompiler::CreateConstantFromUTF8Map(const mvm::MvmDenseMap<mvm::UTF8MapKey, const UTF8*>& map) {
+ StructType* STy =
+ dyn_cast<StructType>(JavaIntrinsics.J3DenseMapType->getContainedType(0));
+ Module& Mod = *getLLVMModule();
+
+ std::vector<Constant*> elements;
+ elements.push_back(ConstantInt::get(Type::getInt32Ty(getLLVMContext()), map.NumBuckets));
+
+ Constant* buckets;
+ if (map.NumBuckets > 0) {
+ std::vector<Constant*> TempElts;
+ ArrayType* ATy = ArrayType::get(JavaIntrinsics.ptrType, map.NumBuckets * 3);
+
+ for (uint32 i = 0; i < map.NumBuckets; ++i) {
+ mvm::MvmPair<mvm::UTF8MapKey, const UTF8*>& pair = map.Buckets[i];
+ TempElts.push_back(ConstantExpr::getCast(
+ Instruction::IntToPtr,
+ ConstantInt::get(JavaIntrinsics.pointerSizeType, pair.first.length),
+ JavaIntrinsics.ptrType));
+
+ if (mvm::MvmDenseMapInfo<mvm::UTF8MapKey>::isEqual(pair.first,
+ mvm::MvmDenseMapInfo<mvm::UTF8MapKey>::getEmptyKey())
+ || mvm::MvmDenseMapInfo<mvm::UTF8MapKey>::isEqual(pair.first,
+ mvm::MvmDenseMapInfo<mvm::UTF8MapKey>::getTombstoneKey())) {
+ TempElts.push_back(Constant::getNullValue(JavaIntrinsics.ptrType));
+ TempElts.push_back(Constant::getNullValue(JavaIntrinsics.ptrType));
+ } else {
+ Constant* gv = getUTF8(pair.second);
+ Constant* GEP[2] = { JavaIntrinsics.constantZero, JavaIntrinsics.constantOne };
+
+ TempElts.push_back(ConstantExpr::getCast(Instruction::BitCast,
+ ConstantExpr::getGetElementPtr(gv, GEP, 2), JavaIntrinsics.ptrType));
+ TempElts.push_back(ConstantExpr::getCast(Instruction::BitCast, gv, JavaIntrinsics.ptrType));
+ }
+ }
+
+ buckets = ConstantArray::get(ATy, TempElts);
+
+ GlobalVariable* gv = new GlobalVariable(Mod, ATy, false, GlobalValue::InternalLinkage, buckets, "");
+ buckets = ConstantExpr::getCast(Instruction::BitCast, gv, JavaIntrinsics.ptrType);
+ } else {
+ buckets = Constant::getNullValue(JavaIntrinsics.ptrType);
+ }
+
+ elements.push_back(buckets);
+ elements.push_back(ConstantInt::get(Type::getInt32Ty(getLLVMContext()), map.NumEntries));
+ elements.push_back(ConstantInt::get(Type::getInt32Ty(getLLVMContext()), map.NumTombstones));
+ elements.push_back(ConstantInt::get(Type::getInt1Ty(getLLVMContext()), 1));
+
+ return new GlobalVariable(Mod, STy, false,
+ GlobalValue::ExternalLinkage,
+ ConstantStruct::get(STy, elements), "UTF8Map");
+}
+
Constant* JavaAOTCompiler::CreateConstantFromClass(Class* cl) {
StructType* STy =
dyn_cast<StructType>(JavaIntrinsics.JavaClassType->getContainedType(0));
@@ -2362,6 +2417,9 @@
// Emit the class map.
CreateConstantFromClassMap(loader->classes->map);
+
+ // Emit the UTF8 map.
+ CreateConstantFromUTF8Map(loader->hashUTF8->map);
}
/// compileAllStubs - Compile all the native -> Java stubs.
Modified: vmkit/trunk/lib/J3/LLVMRuntime/runtime-default.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/LLVMRuntime/runtime-default.ll?rev=136601&r1=136600&r2=136601&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/LLVMRuntime/runtime-default.ll (original)
+++ vmkit/trunk/lib/J3/LLVMRuntime/runtime-default.ll Sun Jul 31 15:10:14 2011
@@ -49,7 +49,7 @@
%Attribut = type { %UTF8*, i32, i32 }
-%UTF8 = type { %JavaObject, i8*, [0 x i16] }
+%UTF8 = type { i8*, [0 x i16] }
%JavaField = type { i8*, i16, %UTF8*, %UTF8*, %Attribut*, i16, %JavaClass*, i32,
Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp?rev=136601&r1=136600&r2=136601&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp Sun Jul 31 15:10:14 2011
@@ -65,7 +65,6 @@
TheCompiler = Comp;
- hashUTF8 = new(allocator, "UTF8Map") UTF8Map(allocator);
javaTypes = new(allocator, "TypeMap") TypeMap();
javaSignatures = new(allocator, "SignMap") SignMap();
strings = new(allocator, "StringList") StringList();
@@ -84,6 +83,7 @@
if (!bootLoaded) {
classes = new(allocator, "ClassMap") ClassMap();
+ hashUTF8 = new(allocator, "UTF8Map") UTF8Map(allocator);
// Analyze the boot classpath, we know bootstrap classes are not in the
// executable.
analyseClasspathEnv(bootClasspathEnv);
Modified: vmkit/trunk/lib/J3/VMCore/Precompiled.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Precompiled.cpp?rev=136601&r1=136600&r2=136601&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Precompiled.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/Precompiled.cpp Sun Jul 31 15:10:14 2011
@@ -90,53 +90,14 @@
extern "C" void vmjcAddPreCompiledClass(JnjvmClassLoader* JCL,
CommonClass* cl) {
cl->classLoader = JCL;
-
- JCL->hashUTF8->insert(cl->name);
-
- if (cl->isClass()) {
- Class* realCl = cl->asClass();
-
- for (uint32 i = 0; i< realCl->nbStaticMethods; ++i) {
- JavaMethod& meth = realCl->staticMethods[i];
- JCL->hashUTF8->insert(meth.name);
- JCL->hashUTF8->insert(meth.type);
- }
-
- for (uint32 i = 0; i< realCl->nbVirtualMethods; ++i) {
- JavaMethod& meth = realCl->virtualMethods[i];
- JCL->hashUTF8->insert(meth.name);
- JCL->hashUTF8->insert(meth.type);
- }
-
- for (uint32 i = 0; i< realCl->nbStaticFields; ++i) {
- JavaField& field = realCl->staticFields[i];
- JCL->hashUTF8->insert(field.name);
- JCL->hashUTF8->insert(field.type);
- }
-
- for (uint32 i = 0; i< realCl->nbVirtualFields; ++i) {
- JavaField& field = realCl->virtualFields[i];
- JCL->hashUTF8->insert(field.name);
- JCL->hashUTF8->insert(field.type);
- }
- }
}
extern "C" void vmjcGetClassArray(JnjvmClassLoader* JCL, ClassArray** ptr,
const UTF8* name) {
- JCL->hashUTF8->insert(name);
*ptr = JCL->constructArray(name);
}
-extern "C" void vmjcAddUTF8(JnjvmClassLoader* JCL, const UTF8* val) {
- JCL->hashUTF8->insert(val);
-}
-
-extern "C" void vmjcAddString(JnjvmClassLoader* JCL, JavaString* val) {
- JCL->strings->addString(JCL, val);
-}
-
extern "C" intptr_t vmjcNativeLoader(JavaMethod* meth) {
bool j3 = false;
const UTF8* jniConsClName = meth->classDef->name;
@@ -351,15 +312,20 @@
upcalls->OfFloat->classLoader = loader;
upcalls->OfLong->classLoader = loader;
upcalls->OfDouble->classLoader = loader;
+
+ mvm::MvmDenseMap<mvm::UTF8MapKey, const UTF8*>* precompiledUTF8Map =
+ reinterpret_cast<mvm::MvmDenseMap<mvm::UTF8MapKey, const UTF8*>*>(dlsym(nativeHandle, "UTF8Map"));
+ loader->hashUTF8 = new (loader->allocator, "UTF8Map") UTF8Map(loader->allocator, precompiledUTF8Map);
mvm::MvmDenseMap<const UTF8*, CommonClass*>* precompiledClassMap =
reinterpret_cast<mvm::MvmDenseMap<const UTF8*, CommonClass*>*>(dlsym(nativeHandle, "ClassMap"));
loader->classes = new (loader->allocator, "ClassMap") ClassMap(precompiledClassMap);
+
for (ClassMap::iterator i = loader->getClasses()->map.begin(),
e = loader->getClasses()->map.end(); i != e; i++) {
- vmjcAddPreCompiledClass(loader, i->second);
+ i->second->classLoader = loader;
}
-
+
// Get the base object arrays after the init, because init puts arrays
// in the class loader map.
upcalls->ArrayOfString =
More information about the vmkit-commits
mailing list