[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