[vmkit-commits] [vmkit] r54726 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaClass.h JavaConstantPool.cpp JavaConstantPool.h JavaIsolate.cpp JavaTypes.cpp JavaTypes.h Jnjvm.cpp Jnjvm.h JnjvmModule.cpp JnjvmModule.h JnjvmModuleProvider.cpp LockedMap.h ServiceDomain.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Wed Aug 13 02:17:59 PDT 2008


Author: geoffray
Date: Wed Aug 13 04:17:42 2008
New Revision: 54726

URL: http://llvm.org/viewvc/llvm-project?rev=54726&view=rev
Log:
Typedef and Signdef are now separately hashed.
Also, JIT informations for JavaField, JavaMethod, Class and Signdef
are stored in the object, not in a table.


Modified:
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp
    vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h
    vmkit/trunk/lib/JnJVM/VMCore/ServiceDomain.cpp

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=54726&r1=54725&r2=54726&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Wed Aug 13 04:17:42 2008
@@ -91,8 +91,6 @@
 CommonClass::~CommonClass() {
   free(display);
   free(virtualVT);
-  if (isolate)
-    isolate->TheModule->removeClass(this);
   delete lockVar;
   delete condVar;
 }
@@ -103,6 +101,7 @@
   lockVar = 0;
   condVar = 0;
   virtualVT = 0;
+  JInfo = 0;
 }
 
 Class::Class() {
@@ -610,6 +609,7 @@
     method->access = access;
     method->canBeInlined = false;
     method->offset = 0;
+    method->JInfo = 0;
     map.insert(std::make_pair(CC, method));
     return method;
   } else {
@@ -631,6 +631,7 @@
     field->_signature = 0;
     field->ptrOffset = 0;
     field->access = access;
+    field->JInfo = 0;
     map.insert(std::make_pair(CC, field));
     return field;
   } else {

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=54726&r1=54725&r2=54726&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Wed Aug 13 04:17:42 2008
@@ -15,6 +15,7 @@
 
 #include "types.h"
 
+#include "mvm/JIT.h"
 #include "mvm/Method.h"
 #include "mvm/Object.h"
 #include "mvm/PrintBuffer.h"
@@ -436,6 +437,18 @@
   /// CommonClass - Default constructor.
   ///
   CommonClass();
+  
+  mvm::JITInfo* JInfo;
+  template<typename Ty> 
+  Ty *getInfo() {
+    if (!JInfo) {
+      JInfo = new Ty(this);
+    }   
+
+    assert((void*)dynamic_cast<Ty*>(JInfo) == (void*)JInfo &&
+           "Invalid concrete type or multiple inheritence for getInfo");
+    return static_cast<Ty*>(JInfo);
+  }
 
 };
 
@@ -691,7 +704,7 @@
   ///
   Signdef* getSignature() {
     if(!_signature)
-      _signature = (Signdef*) classDef->isolate->constructType(type);
+      _signature = classDef->isolate->constructSign(type);
     return _signature;
   }
   
@@ -763,6 +776,18 @@
   sint64 invokeLongStatic(Jnjvm* vm, ...);
   JavaObject* invokeJavaObjectStatic(Jnjvm* vm, ...);
   
+  mvm::JITInfo* JInfo;
+  template<typename Ty> 
+  Ty *getInfo() {
+    if (!JInfo) {
+      JInfo = new Ty(this);
+    }   
+
+    assert((void*)dynamic_cast<Ty*>(JInfo) == (void*)JInfo &&
+           "Invalid concrete type or multiple inheritence for getInfo");
+    return static_cast<Ty*>(JInfo);
+  }
+  
 };
 
 /// JavaField - This class represents a Java field.
@@ -880,6 +905,18 @@
   MK_ASSESSORS(uint16, Int16);
   MK_ASSESSORS(uint32, Int32);
   MK_ASSESSORS(sint64, Long);
+  
+  mvm::JITInfo* JInfo;
+  template<typename Ty> 
+  Ty *getInfo() {
+    if (!JInfo) {
+      JInfo = new Ty(this);
+    }   
+
+    assert((void*)dynamic_cast<Ty*>(JInfo) == (void*)JInfo &&
+           "Invalid concrete type or multiple inheritence for getInfo");
+    return static_cast<Ty*>(JInfo);
+  }
 
 };
 

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=54726&r1=54725&r2=54726&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Wed Aug 13 04:17:42 2008
@@ -335,6 +335,22 @@
   return (Typedef*)res;
 }
 
+Signdef* JavaCtpInfo::resolveNameAndSign(uint32 index) {
+  void* res = ctpRes[index];
+  if (!res) {
+    if (typeAt(index) != ConstantNameAndType) {
+      JavaThread::get()->isolate->error(Jnjvm::ClassFormatError,
+                "bad constant pool number for name/type at entry %d", index);
+    }
+    sint32 entry = ctpDef[index];
+    const UTF8* type = UTF8At(entry & 0xFFFF);
+    Signdef* sign = classDef->isolate->constructSign(type);
+    ctpRes[index] = sign;
+    return sign;
+  }
+  return (Signdef*)res;
+}
+
 Typedef* JavaCtpInfo::infoOfField(uint32 index) {
   if (typeAt(index) != ConstantFieldref)
     JavaThread::get()->isolate->error(Jnjvm::ClassFormatError,
@@ -349,7 +365,7 @@
     JavaThread::get()->isolate->error(Jnjvm::ClassFormatError,
               "bad constant pool number for method at entry %d", index);
   
-  Signdef* sign = (Signdef*)resolveNameAndType(ctpDef[index] & 0xFFFF);
+  Signdef* sign = resolveNameAndSign(ctpDef[index] & 0xFFFF);
   sint32 entry = ctpDef[index];
   sint32 ntIndex = entry & 0xFFFF;
   const UTF8* utf8 = UTF8At(ctpDef[ntIndex] >> 16);
@@ -376,7 +392,7 @@
     JavaThread::get()->isolate->error(Jnjvm::ClassFormatError,
               "bad constant pool number for method at entry %d", index);
   
-  sign = (Signdef*)resolveNameAndType(ctpDef[index] & 0xFFFF);
+  sign = resolveNameAndSign(ctpDef[index] & 0xFFFF);
   sint32 entry = ctpDef[index];
   sint32 ntIndex = entry & 0xFFFF;
   name = UTF8At(ctpDef[ntIndex] >> 16);
@@ -392,7 +408,7 @@
     JavaThread::get()->isolate->error(Jnjvm::ClassFormatError,
               "bad constant pool number for method at entry %d", index);
   
-  sign = (Signdef*)resolveNameAndType(ctpDef[index] & 0xFFFF);
+  sign = resolveNameAndSign(ctpDef[index] & 0xFFFF);
   sint32 entry = ctpDef[index];
   sint32 ntIndex = entry & 0xFFFF;
   const UTF8* utf8 = UTF8At(ctpDef[ntIndex] >> 16);
@@ -431,7 +447,7 @@
     JavaThread::get()->isolate->error(Jnjvm::ClassFormatError,
               "bad constant pool number for method at entry %d", index);
   
-  Signdef* sign = (Signdef*)resolveNameAndType(ctpDef[index] & 0xFFFF);
+  Signdef* sign = resolveNameAndSign(ctpDef[index] & 0xFFFF);
   
   return sign;
 }

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h?rev=54726&r1=54725&r2=54726&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h Wed Aug 13 04:17:42 2008
@@ -108,6 +108,7 @@
   CommonClass* loadClass(uint32 index);
   void checkInfoOfClass(uint32 index);
   Typedef* resolveNameAndType(uint32 index);
+  Signdef* resolveNameAndSign(uint32 index);
   Typedef* infoOfField(uint32 index);
   Signdef* infoOfInterfaceOrVirtualMethod(uint32 index);
   void* infoOfStaticOrSpecialMethod(uint32 index,

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp?rev=54726&r1=54725&r2=54726&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp Wed Aug 13 04:17:42 2008
@@ -476,6 +476,7 @@
   isolate->hashStr = new StringMap();
   isolate->bootstrapClasses = callingVM->bootstrapClasses;
   isolate->javaTypes = new TypeMap(); 
+  isolate->javaSignatures = new SignMap(); 
   isolate->globalRefsLock = mvm::Lock::allocNormal();
 #ifdef MULTIPLE_VM
   isolate->statics = vm_new(isolate, StaticInstanceMap)();  
@@ -531,6 +532,7 @@
   isolate->javavmEnv = &JNI_JavaVMTable;
   isolate->globalRefsLock = mvm::Lock::allocNormal();
   isolate->javaTypes = new TypeMap();  
+  isolate->javaSignatures = new SignMap();  
 
 #ifdef MULTIPLE_VM
   isolate->statics = vm_new(isolate, StaticInstanceMap)();  

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp?rev=54726&r1=54725&r2=54726&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp Wed Aug 13 04:17:42 2008
@@ -446,7 +446,7 @@
   CommonClass::printClassName(cl->name, buf);
   buf->write("::");
   name->print(buf);
-  humanPrintArgs(&args, buf);
+  Typedef::humanPrintArgs(&args, buf);
 }
 
 Signdef* Signdef::signDup(const UTF8* name, Jnjvm *vm) {
@@ -480,12 +480,11 @@
   res->ret = vm->constructType(name->extract(vm, pos, pred));
   res->isolate = vm;
   res->keyName = name;
-  res->pseudoAssocClassName = name;
-  res->funcs = 0;
   res->_virtualCallBuf = 0;
   res->_staticCallBuf = 0;
   res->_virtualCallAP = 0;
   res->_staticCallAP = 0;
+  res->JInfo = 0;
   return res;
   
 }
@@ -495,20 +494,18 @@
   uint32 next;
   AssessorDesc::analyseIntern(name, 0, 0, funcs, next);
 
-  if (funcs == AssessorDesc::dParg) {
-    return Signdef::signDup(name, vm);
-  } else {
-    Typedef* res = new Typedef();
-    res->isolate = vm;
-    res->keyName = name;
-    res->funcs = funcs;
-    if (funcs == AssessorDesc::dRef) {
-      res->pseudoAssocClassName = name->extract(vm, 1, next - 1);
-    } else if (funcs == AssessorDesc::dTab) {
-      res->pseudoAssocClassName = name;
-    }
-    return res;
+  assert(funcs != AssessorDesc::dParg && 
+         "Error: resolving a signature for a field");
+  Typedef* res = new Typedef();
+  res->isolate = vm;
+  res->keyName = name;
+  res->funcs = funcs;
+  if (funcs == AssessorDesc::dRef) {
+    res->pseudoAssocClassName = name->extract(vm, 1, next - 1);
+  } else if (funcs == AssessorDesc::dTab) {
+    res->pseudoAssocClassName = name;
   }
+  return res;
 
 }
 

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h?rev=54726&r1=54725&r2=54726&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h Wed Aug 13 04:17:42 2008
@@ -10,13 +10,10 @@
 #ifndef JNJVM_JAVA_TYPES_H
 #define JNJVM_JAVA_TYPES_H
 
-#include "mvm/Object.h"
-
 #include "types.h"
 
-namespace mvm {
-  class Code;
-}
+#include "mvm/JIT.h"
+#include "mvm/Object.h"
 
 namespace jnjvm {
 
@@ -133,13 +130,14 @@
   
   CommonClass* assocClass(JavaObject* loader);
   void typePrint(mvm::PrintBuffer* buf);
-  static void humanPrintArgs(const std::vector<Typedef*>*, mvm::PrintBuffer* buf);
+  static void humanPrintArgs(const std::vector<Typedef*>*,
+                             mvm::PrintBuffer* buf);
   static Typedef* typeDup(const UTF8* name, Jnjvm* vm);
   void tPrintBuf(mvm::PrintBuffer* buf) const;
 
 };
 
-class Signdef : public Typedef {
+class Signdef {
 private:
   intptr_t _staticCallBuf;
   intptr_t _virtualCallBuf;
@@ -154,6 +152,8 @@
 public:
   std::vector<Typedef*> args;
   Typedef* ret;
+  Jnjvm* isolate;
+  const UTF8* keyName;
   
   const char* printString() const;
 
@@ -196,8 +196,20 @@
   void setVirtualCallAP(intptr_t code) {
     _virtualCallAP = code;
   }
-  
-  
+
+   
+  mvm::JITInfo* JInfo;
+  template<typename Ty> 
+  Ty *getInfo() {
+    if (!JInfo) {
+      JInfo = new Ty(this);
+    }   
+
+    assert((void*)dynamic_cast<Ty*>(JInfo) == (void*)JInfo &&
+           "Invalid concrete type or multiple inheritence for getInfo");
+    return static_cast<Ty*>(JInfo);
+  }
+    
 };
 
 

Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=54726&r1=54725&r2=54726&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Wed Aug 13 04:17:42 2008
@@ -759,6 +759,19 @@
   return res;
 }
 
+Signdef* Jnjvm::constructSign(const UTF8* name) {
+  Signdef* res = javaSignatures->lookup(name);
+  if (res == 0) {
+    res = Signdef::signDup(name, this);
+    javaSignatures->lock->lock();
+    Signdef* tmp = javaSignatures->lookup(name);
+    if (tmp == 0) javaSignatures->hash(name, res);
+    else res = tmp;
+    javaSignatures->lock->unlock();
+  }
+  return res;
+}
+
 CommonClass* Jnjvm::loadInClassLoader(const UTF8* name, JavaObject* loader) {
   JavaString* str = this->UTF8ToStr(name);
   JavaObject* obj = (JavaObject*)

Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=54726&r1=54725&r2=54726&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Wed Aug 13 04:17:42 2008
@@ -47,6 +47,8 @@
 class DelegateeMap;
 class FieldMap;
 class MethodMap;
+class Signdef;
+class SignMap;
 class StaticInstanceMap;
 class StringMap;
 class TypeMap;
@@ -211,6 +213,7 @@
   JavaString* asciizToStr(const char* asciiz);
   JavaString* UTF8ToStr(const UTF8* utf8);
   Typedef* constructType(const UTF8 * name);
+  Signdef* constructSign(const UTF8 * name);
   
   
   JavaObject* getClassDelegatee(CommonClass*);
@@ -248,6 +251,7 @@
   StringMap * hashStr;
   ClassMap* bootstrapClasses;
   TypeMap* javaTypes;
+  SignMap* javaSignatures;
 #ifdef MULTIPLE_VM
   StaticInstanceMap* statics;
   DelegateeMap* delegatees;

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=54726&r1=54725&r2=54726&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Aug 13 04:17:42 2008
@@ -355,7 +355,7 @@
     
     if (classDef->super) {
       LLVMClassInfo* CLI = 
-        (LLVMClassInfo*)module->getClassInfo(classDef->super);
+        (LLVMClassInfo*)JnjvmModule::getClassInfo(classDef->super);
       fields.push_back(CLI->getVirtualType()->getContainedType(0));
     } else {
       fields.push_back(JnjvmModule::JavaObjectType->getContainedType(0));
@@ -385,7 +385,7 @@
       field->ptrOffset = sl->getElementOffset(field->num + 1);
     }
     
-    VirtualTable* VT = module->makeVT((Class*)classDef, false);
+    VirtualTable* VT = JnjvmModule::makeVT((Class*)classDef, false);
   
     uint64 size = mvm::jit::getTypeSize(structType);
     classDef->virtualSize = (uint32)size;
@@ -431,7 +431,7 @@
     }
     
 
-    VirtualTable* VT = module->makeVT((Class*)classDef, true);
+    VirtualTable* VT = JnjvmModule::makeVT((Class*)classDef, true);
 
     uint64 size = mvm::jit::getTypeSize(structType);
     cl->staticSize = size;
@@ -532,7 +532,7 @@
 
 const FunctionType* LLVMMethodInfo::getFunctionType() {
   if (!functionType) {
-    LLVMSignatureInfo* LSI = module->getSignatureInfo(methodDef->getSignature());
+    LLVMSignatureInfo* LSI = JnjvmModule::getSignatureInfo(methodDef->getSignature());
     assert(LSI);
     if (isStatic(methodDef->access)) {
       functionType = LSI->getStaticType();
@@ -545,7 +545,7 @@
 
 ConstantInt* LLVMMethodInfo::getOffset() {
   if (!offsetConstant) {
-    module->resolveVirtualClass(methodDef->classDef);
+    JnjvmModule::resolveVirtualClass(methodDef->classDef);
     offsetConstant = ConstantInt::get(Type::Int32Ty, methodDef->offset);
   }
   return offsetConstant;
@@ -554,9 +554,9 @@
 ConstantInt* LLVMFieldInfo::getOffset() {
   if (!offsetConstant) {
     if (isStatic(fieldDef->access)) {
-      module->resolveStaticClass(fieldDef->classDef); 
+      JnjvmModule::resolveStaticClass(fieldDef->classDef); 
     } else {
-      module->resolveVirtualClass(fieldDef->classDef); 
+      JnjvmModule::resolveVirtualClass(fieldDef->classDef); 
     }
     // Increment by one because zero is JavaObject
     offsetConstant = ConstantInt::get(Type::Int32Ty, fieldDef->num + 1);
@@ -855,100 +855,7 @@
   LCI->getStaticType();
 }
 
-void JnjvmModule::removeClass(CommonClass* cl) {
-  // Lock here because we may be called by a finalizer
-  // (even if currently single threaded).
-  llvm::MutexGuard locked(mvm::jit::executionEngine->lock);
-  classMap.erase(cl);
-
-  for (CommonClass::field_iterator i = cl->virtualFields.begin(),
-       e = cl->virtualFields.end(); i!= e; ++i) {
-    JavaField* field = i->second;
-    fieldMap.erase(field);
-  }
-  
-  for (CommonClass::field_iterator i = cl->staticFields.begin(),
-       e = cl->staticFields.end(); i!= e; ++i) {
-    JavaField* field = i->second;
-    fieldMap.erase(field);
-  }
-  
-  for (CommonClass::method_iterator i = cl->virtualMethods.begin(),
-       e = cl->virtualMethods.end(); i!= e; ++i) {
-    JavaMethod* meth = i->second;
-    methodMap.erase(meth);
-  }
-  
-  for (CommonClass::method_iterator i = cl->staticMethods.begin(),
-       e = cl->staticMethods.end(); i!= e; ++i) {
-    JavaMethod* meth = i->second;
-    methodMap.erase(meth);
-  }
-  
-}
-
-LLVMCommonClassInfo* JnjvmModule::getClassInfo(CommonClass* cl) {
-  class_iterator CI = classMap.find(cl);
-  if (CI != classMap.end()) {
-    return CI->second;
-  } else {
-    if (cl->isArray) {
-      LLVMCommonClassInfo* LCI = new LLVMCommonClassInfo(cl, this);
-      classMap.insert(std::make_pair(cl, LCI));
-      return LCI;
-    } else {
-      LLVMClassInfo* LCI = new LLVMClassInfo((Class*)cl, this);
-      classMap.insert(std::make_pair(cl, LCI));
-      return LCI;
-    }
-  }
-}
-
-LLVMMethodInfo* JnjvmModule::getMethodInfo(JavaMethod* meth) {
-  method_iterator MI = methodMap.find(meth);
-  if (MI != methodMap.end()) {
-    return MI->second;
-  } else {
-    LLVMMethodInfo* LMI = new LLVMMethodInfo(meth, this);
-    methodMap.insert(std::make_pair(meth, LMI));
-    return LMI;
-  }
-}
-
-LLVMFieldInfo* JnjvmModule::getFieldInfo(JavaField* field) {
-  field_iterator FI = fieldMap.find(field);
-  if (FI != fieldMap.end()) {
-    return FI->second;
-  } else {
-    LLVMFieldInfo* LFI = new LLVMFieldInfo(field, this);
-    fieldMap.insert(std::make_pair(field, LFI));
-    return LFI;
-  }
-}
-
-LLVMSignatureInfo* JnjvmModule::getSignatureInfo(Signdef* sign) {
-  signature_iterator SI = signatureMap.find(sign);
-  if (SI != signatureMap.end()) {
-    return SI->second;
-  } else {
-    LLVMSignatureInfo* LSI = new LLVMSignatureInfo(sign);
-    signatureMap.insert(std::make_pair(sign, LSI));
-    return LSI;
-  }
-}
-
 #ifdef SERVICE_VM
-LLVMServiceInfo* JnjvmModule::getServiceInfo(ServiceDomain* S) {
-  service_iterator SI = serviceMap.find(S);
-  if (SI != serviceMap.end()) {
-    return SI->second;
-  } else {
-    LLVMServiceInfo* LSI = new LLVMServiceInfo(sign);
-    serviceMap.insert(std::make_pair(S, LSI));
-    return LSI;
-  }
-}
-
 Value* LLVMServiceInfo::getDelegatee(JavaJIT* jit) {
   if (!delegateeGV) {
     Constant* cons = 

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=54726&r1=54725&r2=54726&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Wed Aug 13 04:17:42 2008
@@ -20,7 +20,10 @@
 #include "llvm/Type.h"
 #include "llvm/Value.h"
 
+#include "mvm/JIT.h"
+
 #include "JavaClass.h"
+#include "JavaTypes.h"
 
 namespace jnjvm {
 
@@ -46,13 +49,12 @@
 };
 
 
-class LLVMCommonClassInfo {
+class LLVMCommonClassInfo : public mvm::JITInfo {
   
   friend class JnjvmModule;
 
 protected:
   CommonClass* classDef;
-  JnjvmModule* module;
 
 private:
   /// varGV - The LLVM global variable representing this class.
@@ -70,9 +72,8 @@
   llvm::Value* getVar(JavaJIT* jit);
   llvm::Value* getDelegatee(JavaJIT* jit);
   
-  LLVMCommonClassInfo(CommonClass* cl, JnjvmModule* M) : 
+  LLVMCommonClassInfo(CommonClass* cl) : 
     classDef(cl),
-    module(M),
     varGV(0)
 #ifndef MULTIPLE_VM
     ,delegateeGV(0)
@@ -107,8 +108,8 @@
   const llvm::Type* getVirtualType();
   const llvm::Type* getStaticType();
   
-  LLVMClassInfo(Class* cl, JnjvmModule* M) : 
-    LLVMCommonClassInfo((CommonClass*)cl, M),
+  LLVMClassInfo(CommonClass* cl) : 
+    LLVMCommonClassInfo(cl),
     virtualSizeConstant(0),
     staticVarGV(0),
     virtualTableGV(0),
@@ -118,10 +119,9 @@
     staticType(0) {}
 };
 
-class LLVMMethodInfo {
+class LLVMMethodInfo : public mvm::JITInfo {
 private:
   JavaMethod* methodDef;
-  JnjvmModule* module;
 
   llvm::Function* methodFunction;
   llvm::ConstantInt* offsetConstant;
@@ -132,31 +132,28 @@
   llvm::ConstantInt* getOffset();
   const llvm::FunctionType* getFunctionType();
   
-  LLVMMethodInfo(JavaMethod* M, JnjvmModule* Mo) : 
+  LLVMMethodInfo(JavaMethod* M) : 
     methodDef(M), 
-    module(Mo),
     methodFunction(0),
     offsetConstant(0),
     functionType(0) {}
 };
 
-class LLVMFieldInfo {
+class LLVMFieldInfo : public mvm::JITInfo {
 private:
   JavaField* fieldDef;
-  JnjvmModule* module;
   
   llvm::ConstantInt* offsetConstant;
 
 public:
   llvm::ConstantInt* getOffset();
 
-  LLVMFieldInfo(JavaField* F, JnjvmModule* M) : 
+  LLVMFieldInfo(JavaField* F) : 
     fieldDef(F), 
-    module(M),
     offsetConstant(0) {}
 };
 
-class LLVMSignatureInfo {
+class LLVMSignatureInfo : public mvm::JITInfo {
 private:
   const llvm::FunctionType* staticType;
   const llvm::FunctionType* virtualType;
@@ -216,7 +213,7 @@
 };
 
 #ifdef SERVICE_VM
-class LLVMServiceInfo {
+class LLVMServiceInfo : public mvm::JITInfo {
 private:
   ServiceDomain* vm;
   llvm::GlobalVariable* delegateeGV;
@@ -229,31 +226,9 @@
 class JnjvmModule : public llvm::Module {
   friend class LLVMClassInfo;
 private:
-  std::map<const CommonClass*, LLVMCommonClassInfo*> classMap;
-  std::map<const Signdef*, LLVMSignatureInfo*> signatureMap;
-  std::map<const JavaField*, LLVMFieldInfo*> fieldMap;
-  std::map<const JavaMethod*, LLVMMethodInfo*> methodMap;
-
-#ifdef SERVICE_VM
-  std::map<const ServiceDomain*, LLVMServiceInfo*> serviceMap;
-  typedef std::map<const ServiceDomain*, LLVMServiceInfo*>::iterator
-    class_iterator;
-#endif
-  
-  typedef std::map<const CommonClass*, LLVMCommonClassInfo*>::iterator
-    class_iterator;  
   
-  typedef std::map<const Signdef*, LLVMSignatureInfo*>::iterator
-    signature_iterator;  
-  
-  typedef std::map<const JavaMethod*, LLVMMethodInfo*>::iterator
-    method_iterator;  
-  
-  typedef std::map<const JavaField*, LLVMFieldInfo*>::iterator
-    field_iterator;  
-  
-  VirtualTable* makeVT(Class* cl, bool stat);
-  VirtualTable* allocateVT(Class* cl, CommonClass::method_iterator meths);
+  static VirtualTable* makeVT(Class* cl, bool stat);
+  static VirtualTable* allocateVT(Class* cl, CommonClass::method_iterator meths);
 
 
 public:
@@ -367,21 +342,37 @@
   static void InitField(JavaField* field, JavaObject* obj, float val);
 
 
-  void resolveVirtualClass(Class* cl);
-  void resolveStaticClass(Class* cl);
-  void setMethod(JavaMethod* meth, const char* name);
-  void* getMethod(JavaMethod* meth);
-
-  LLVMSignatureInfo* getSignatureInfo(Signdef*);
-  LLVMCommonClassInfo* getClassInfo(CommonClass*);
-  LLVMFieldInfo* getFieldInfo(JavaField*);
-  LLVMMethodInfo* getMethodInfo(JavaMethod*);
+  static void resolveVirtualClass(Class* cl);
+  static void resolveStaticClass(Class* cl);
+  static void setMethod(JavaMethod* meth, const char* name);
+  static void* getMethod(JavaMethod* meth);
+
+  static LLVMSignatureInfo* getSignatureInfo(Signdef* sign) {
+    return sign->getInfo<LLVMSignatureInfo>();
+  }
+  
+  static LLVMCommonClassInfo* getClassInfo(CommonClass* cl) {
+    if (cl->isArray || cl->isPrimitive) {
+      return cl->getInfo<LLVMCommonClassInfo>();
+    } else {
+      return cl->getInfo<LLVMClassInfo>();
+    }
+  }
+
+  static LLVMFieldInfo* getFieldInfo(JavaField* field) {
+    return field->getInfo<LLVMFieldInfo>();
+  }
+  
+  static LLVMMethodInfo* getMethodInfo(JavaMethod* method) {
+    return method->getInfo<LLVMMethodInfo>();
+  }
+
 #ifdef SERVICE_VM
-  LLVMServiceInfo* getServiceInfo(ServiceDomain*);
+  static LLVMServiceInfo* getServiceInfo(ServiceDomain* service) {
+    return service->getInfo<LLVMServiceInfo>();
+  }
 #endif
   
-  void removeClass(CommonClass*);
-
   explicit JnjvmModule(const std::string &ModuleID);
   void initialise();
 };

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=54726&r1=54725&r2=54726&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Wed Aug 13 04:17:42 2008
@@ -209,7 +209,7 @@
   
   addPass(PM, createTailCallEliminationPass());  // Eliminate tail calls
   addPass(PM, createCFGSimplificationPass());    // Merge & remove BBs
-  addPass(PM, createPredicateSimplifierPass());
+  //addPass(PM, createPredicateSimplifierPass());
   addPass(PM, createReassociatePass());          // Reassociate expressions
   addPass(PM, createLoopRotatePass());
   addPass(PM, createLICMPass());                 // Hoist loop invariants

Modified: vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h?rev=54726&r1=54725&r2=54726&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h Wed Aug 13 04:17:42 2008
@@ -209,6 +209,40 @@
   
 };
 
+class SignMap {
+public:
+  mvm::Lock* lock;
+  
+  std::map<const UTF8*, Signdef*, ltutf8> map;
+  typedef std::map<const UTF8*, Signdef*, ltutf8>::iterator iterator;
+  
+  inline Signdef* lookup(const UTF8* V) {
+    lock->lock();
+    iterator End = map.end();
+    iterator I = map.find(V);
+    lock->unlock();
+    return I != End ? I->second : 0; 
+  }
+
+  inline void hash(const UTF8* k, Signdef* c) {
+    lock->lock();
+    map.insert(std::make_pair(k, c));
+    lock->unlock();
+  }
+  
+  SignMap() {
+    lock = mvm::Lock::allocRecursive();
+  }
+  
+  ~SignMap() {
+    for (iterator i = map.begin(), e = map.end(); i!= e; ++i) {
+      delete i->second;
+    }
+    delete lock;
+  }
+  
+};
+
 class StaticInstanceMap :
     public LockedMap<Class*, std::pair<JavaState, JavaObject*>*, std::less<Class*> > {
 public:

Modified: vmkit/trunk/lib/JnJVM/VMCore/ServiceDomain.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/ServiceDomain.cpp?rev=54726&r1=54725&r2=54726&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/ServiceDomain.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/ServiceDomain.cpp Wed Aug 13 04:17:42 2008
@@ -82,6 +82,7 @@
   service->loadedMethods = vm_new(service, MethodMap)();
   service->loadedFields = vm_new(service, FieldMap)();
   service->javaTypes = vm_new(service, TypeMap)(); 
+  service->javaSignatures = vm_new(service, SignMap)(); 
   service->globalRefsLock = mvm::Lock::allocNormal();
 #ifdef MULTIPLE_VM
   service->statics = vm_new(service, StaticInstanceMap)();  





More information about the vmkit-commits mailing list