[vmkit-commits] [vmkit] r59439 - in /vmkit/trunk: autoconf/configure.ac configure include/mvm/Threads/Thread.h lib/JnJVM/LLVMRuntime/Makefile lib/JnJVM/VMCore/JavaJIT.cpp lib/JnJVM/VMCore/JnjvmClassLoader.cpp lib/JnJVM/VMCore/JnjvmClassLoader.h lib/JnJVM/VMCore/JnjvmModule.cpp lib/JnJVM/VMCore/JnjvmModule.h lib/Mvm/Allocator/gcchunk.h lib/Mvm/GCMmap2/gccollector.cpp lib/Mvm/GCMmap2/gccollector.h lib/Mvm/GCMmap2/gcthread.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Mon Nov 17 04:25:29 PST 2008


Author: geoffray
Date: Mon Nov 17 06:25:11 2008
New Revision: 59439

URL: http://llvm.org/viewvc/llvm-project?rev=59439&view=rev
Log:
Compilation fixes for SERVICE build.


Modified:
    vmkit/trunk/autoconf/configure.ac
    vmkit/trunk/configure
    vmkit/trunk/include/mvm/Threads/Thread.h
    vmkit/trunk/lib/JnJVM/LLVMRuntime/Makefile
    vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
    vmkit/trunk/lib/Mvm/Allocator/gcchunk.h
    vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp
    vmkit/trunk/lib/Mvm/GCMmap2/gccollector.h
    vmkit/trunk/lib/Mvm/GCMmap2/gcthread.h

Modified: vmkit/trunk/autoconf/configure.ac
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/autoconf/configure.ac?rev=59439&r1=59438&r2=59439&view=diff

==============================================================================
--- vmkit/trunk/autoconf/configure.ac (original)
+++ vmkit/trunk/autoconf/configure.ac Mon Nov 17 06:25:11 2008
@@ -226,7 +226,7 @@
   ISOLATE_BUILD=1
 else 
   if test "x$vmtype" = "xservice"; then
-    VM_FLAGS="-DISOLATE -DSERVICE_GC -DMULTIPLE_GC -DSERVICE_VM -I\$(PROJ_SRC_ROOT)/lib/Mvm/Allocator"
+    VM_FLAGS="-DISOLATE -DSERVICE"
     SERVICE_BUILD=1
   fi
 fi

Modified: vmkit/trunk/configure
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/configure?rev=59439&r1=59438&r2=59439&view=diff

==============================================================================
--- vmkit/trunk/configure (original)
+++ vmkit/trunk/configure Mon Nov 17 06:25:11 2008
@@ -3948,7 +3948,7 @@
   ISOLATE_BUILD=1
 else
   if test "x$vmtype" = "xservice"; then
-    VM_FLAGS="-DISOLATE -DSERVICE_GC -DMULTIPLE_GC -DSERVICE_VM -I\$(PROJ_SRC_ROOT)/lib/Mvm/Allocator"
+    VM_FLAGS="-DISOLATE -DSERVICE"
     SERVICE_BUILD=1
   fi
 fi

Modified: vmkit/trunk/include/mvm/Threads/Thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Threads/Thread.h?rev=59439&r1=59438&r2=59439&view=diff

==============================================================================
--- vmkit/trunk/include/mvm/Threads/Thread.h (original)
+++ vmkit/trunk/include/mvm/Threads/Thread.h Mon Nov 17 06:25:11 2008
@@ -92,7 +92,7 @@
 
 #ifdef ISOLATE
   /// IsolateID - The Isolate ID of the thread's VM.
-  uint32 IsolateID;
+  size_t IsolateID;
 #endif
 
   /// MyVM - The VM attached to this Thread.

Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/LLVMRuntime/Makefile?rev=59439&r1=59438&r2=59439&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/LLVMRuntime/Makefile (original)
+++ vmkit/trunk/lib/JnJVM/LLVMRuntime/Makefile Mon Nov 17 06:25:11 2008
@@ -17,7 +17,7 @@
 endif
 
 ifeq ($(SERVICE_BUILD), 1)
-VMKIT_RUNTIME += $(PROJ_SRC_DIR)/runtime-service.ll $(PROJ_SRC_DIR)/runtime-isolate.ll $(PROJ_SRC_DIR)/runtime-multi-mmap.ll
+VMKIT_RUNTIME += $(PROJ_SRC_DIR)/runtime-service.ll $(PROJ_SRC_DIR)/runtime-isolate.ll $(PROJ_SRC_DIR)/runtime-single-mmap.ll
 else
 ifeq ($(GC_MULTI_MMAP), 1)
 VMKIT_RUNTIME += $(PROJ_SRC_DIR)/runtime-multi-mmap.ll

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Mon Nov 17 06:25:11 2008
@@ -640,32 +640,55 @@
 
 #if defined(SERVICE)
   JnjvmClassLoader* loader = compilingClass->classLoader;
-  Value* cmp = 0;
+  Value* Cmp = 0;
+  Value* threadId = 0;
+  Value* OldIsolateID = 0;
+  Value* IsolateIDPtr = 0;
+  Value* OldIsolate = 0;
+  Value* IsolatePtr = 0;
   if (loader != loader->bootstrapLoader && isPublic(compilingMethod->access)) {
-    Value* threadId = CallInst::Create(module->llvm_frameaddress,
-                                       module->constantZero, "", currentBlock);
+    threadId = CallInst::Create(module->llvm_frameaddress, module->constantZero,
+                                "", currentBlock);
     threadId = new PtrToIntInst(threadId, module->pointerSizeType, "",
                                 currentBlock);
     threadId = BinaryOperator::CreateAnd(threadId, module->constantThreadIDMask,
                                        "", currentBlock);
   
-    threadId = new IntToPtrInst(threadId, module->ptr32Type, "", currentBlock);
-  
-    GEP.clear();
+    threadId = new IntToPtrInst(threadId, module->ptrPtrType, "", currentBlock);
+     
+    std::vector<Value*> GEP;
     GEP.push_back(module->constantThree);
-    Value* IsolateID = GetElementPtrInst::Create(threadId, GEP.begin(),
-                                                 GEP.end(), "", currentBlock);
-    IsolateID = new LoadInst(IsolateID, "", currentBlock);
-
-    Value* MyID = ConstantInt::get(Type::Int32Ty, loader->isolate->IsolateID);
-    Cmp = new ICmpInst(ICmpInst::ICMP_EQ, IsolateID, MyID, "", currentBlock);
+    IsolateIDPtr = GetElementPtrInst::Create(threadId, GEP.begin(), GEP.end(),
+                                             "", currentBlock);
+    const Type* realType = PointerType::getUnqual(module->pointerSizeType);
+    IsolateIDPtr = new BitCastInst(IsolateIDPtr, realType, "",
+                                   currentBlock);
+    OldIsolateID = new LoadInst(IsolateIDPtr, "", currentBlock);
+
+    Value* MyID = ConstantInt::get(module->pointerSizeType,
+                                   loader->isolate->IsolateID);
+    Cmp = new ICmpInst(ICmpInst::ICMP_EQ, OldIsolateID, MyID, "", currentBlock);
 
     BasicBlock* EndBB = createBasicBlock("After service check");
-    BasicBlock* ServiceBB = createBasicBlock("Service call");
+    BasicBlock* ServiceBB = createBasicBlock("Begin service call");
 
     BranchInst::Create(EndBB, ServiceBB, Cmp, currentBlock);
 
     currentBlock = ServiceBB;
+  
+    new StoreInst(MyID, IsolateIDPtr, currentBlock);
+    GEP.clear();
+    GEP.push_back(module->constantFour);
+    IsolatePtr = GetElementPtrInst::Create(threadId, GEP.begin(), GEP.end(), "",
+                                           currentBlock);
+     
+    OldIsolate = new LoadInst(IsolatePtr, "", currentBlock);
+    Value* currentIsolate = module->getIsolate(loader->isolate);
+    currentIsolate = new LoadInst(currentIsolate, "", currentBlock);
+    new StoreInst(currentIsolate, IsolatePtr, currentBlock);
+
+    BranchInst::Create(EndBB, currentBlock);
+    currentBlock = EndBB;
   }
 #endif
 
@@ -725,21 +748,20 @@
     }
 #endif
   
-#if defined(SERVICE_VM)
-  if (compilingClass->isolate != Jnjvm::bootstrapVM) {
-    Value* cmp = new ICmpInst(ICmpInst::ICMP_NE, i, isolateLocal, "",
-                              currentBlock);
-    BasicBlock* ifTrue = createBasicBlock("true service call");
-    BasicBlock* newEndBlock = createBasicBlock("end check service call");
-    BranchInst::Create(ifTrue, newEndBlock, cmp, currentBlock);
-    currentBlock = ifTrue;
-    std::vector<Value*> Args;
-    Args.push_back(i);
-    Args.push_back(isolateLocal);
-    CallInst::Create(module->ServiceCallStopFunction, Args.begin(),
-                     Args.end(), "", currentBlock);
-    BranchInst::Create(newEndBlock, currentBlock);
-    currentBlock = newEndBlock;
+#if defined(SERVICE)
+  if (Cmp) {
+    BasicBlock* EndBB = createBasicBlock("After service check");
+    BasicBlock* ServiceBB = createBasicBlock("End Service call");
+
+    BranchInst::Create(EndBB, ServiceBB, Cmp, currentBlock);
+
+    currentBlock = ServiceBB;
+  
+    new StoreInst(OldIsolateID, IsolateIDPtr, currentBlock);
+    new StoreInst(OldIsolate, IsolatePtr, currentBlock);
+
+    BranchInst::Create(EndBB, currentBlock);
+    currentBlock = EndBB;
   }
 #endif
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Mon Nov 17 06:25:11 2008
@@ -241,6 +241,15 @@
                                          &loadClass);
   assert(loadClass && "Loader does not have a loadClass function");
 
+#if defined(SERVICE)
+  /// If the appClassLoader is already set in the isolate, then we need
+  /// a new one each time a class loader is allocated.
+  if (isolate->appClassLoader) {
+    isolate = gc_new(Jnjvm)(bootstrapLoader);
+    isolate->appClassLoader = I->appClassLoader;
+  }
+#endif
+
 }
 
 ArrayUInt8* JnjvmBootstrapLoader::openName(const UTF8* utf8) {

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Mon Nov 17 06:25:11 2008
@@ -51,6 +51,7 @@
 /// table for non-isolate environments.
 ///
 class JnjvmClassLoader : public mvm::CompilationUnit {
+  friend class JavaJIT;
   friend class Jnjvm;
 private:
    
@@ -84,13 +85,11 @@
   ///
   ClassMap* classes;
   
-  /// javaTypes - Tables of Typedef defined by this class loader. Shared by all
-  /// class loaders in a no isolation configuration.
+  /// javaTypes - Tables of Typedef defined by this class loader.
   ///
   TypeMap* javaTypes;
 
-  /// javaSignatures - Tables of Signdef defined by this class loader. Shared
-  /// by all class loaders in a no isolation configuration.
+  /// javaSignatures - Tables of Signdef defined by this class loader.
   ///
   SignMap* javaSignatures;
 
@@ -106,10 +105,9 @@
   mvm::BumpPtrAllocator allocator;
    
   
-  /// hashUTF8 - Tables of UTF8s defined by this class loader. Shared
-  /// by all class loaders in a no isolation configuration.
+  /// hashUTF8 - Tables of UTF8s defined by this class loader.
   ///
-  UTF8Map * hashUTF8;
+  UTF8Map* hashUTF8;
   
   /// TheModule - JIT module for compiling methods.
   ///
@@ -198,8 +196,7 @@
   ///
   JnjvmBootstrapLoader* bootstrapLoader;
   
-  /// ~JnjvmClassLoader - Destroy the loader. Depending on the JVM
-  /// configuration, this may destroy the tables, JIT module and
+  /// ~JnjvmClassLoader - Destroy the loader: destroy the tables, JIT module and
   /// module provider.
   ///
   ~JnjvmClassLoader();
@@ -216,21 +213,38 @@
     classes = 0;
   }
 
+  /// loadClass - The user class that defines the loadClass method.
+  ///
   UserClass* loadClass;
-  
+ 
+  /// constructArrayName - Construct an array name based on a class name
+  /// and the number of dimensions.
   const UTF8* constructArrayName(uint32 steps, const UTF8* className);
   
+  /// UTF8ToStr - Constructs a Java string out of the UTF8.
+  ///
   virtual JavaString* UTF8ToStr(const UTF8* utf8);
 
   /// Strings hashed by this classloader.
+  ///
   std::vector<JavaString*, gc_allocator<JavaString*> > strings;
   
   /// nativeLibs - Native libraries (e.g. '.so') loaded by this class loader.
   ///
   std::vector<void*> nativeLibs;
 
+  /// loadInLib - Loads a native function out of the native libraries loaded
+  /// by this class loader. The last argument tells if the returned method
+  /// is defined in jnjvm.
+  ///
   intptr_t loadInLib(const char* buf, bool& jnjvm);
+
+  /// loadInLib - Loads a native function out of the given native library.
+  ///
   intptr_t loadInLib(const char* buf, void* handle);
+
+  /// loadLib - Loads the library with the given name.
+  ///
   void* loadLib(const char* buf);
 };
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Nov 17 06:25:11 2008
@@ -1196,3 +1196,28 @@
   if (MI) return MI->methodDef;
   return 0;
 }
+
+#ifdef SERVICE
+Value* JnjvmModule::getIsolate(Jnjvm* isolate) {
+  llvm::GlobalVariable* varGV = 0;
+  isolate_iterator End = isolates.end();
+  isolate_iterator I = isolates.find(isolate);
+  if (I == End) {
+    
+      
+    Constant* cons = 
+      ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty,
+                                                 uint64_t(isolate)),
+                                ptrType);
+
+    varGV = new GlobalVariable(ptrType, !staticCompilation,
+                               GlobalValue::ExternalLinkage,
+                               cons, "", this);
+    
+    isolates.insert(std::make_pair(isolate, varGV));
+  } else {
+    varGV = I->second;
+  }
+  return varGV;
+}
+#endif

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Mon Nov 17 06:25:11 2008
@@ -379,6 +379,14 @@
   llvm::Value* getConstantPool(JavaConstantPool* ctp);
   llvm::Value* getNativeFunction(JavaMethod* meth, void* natPtr);
 
+#ifdef SERVICE
+  std::map<const Jnjvm*, llvm::GlobalVariable*> isolates;
+  typedef std::map<const Jnjvm*, llvm::GlobalVariable*>::iterator
+    isolate_iterator;
+  
+  llvm::Value* getIsolate(Jnjvm* vm);
+#endif
+
 private:
   static llvm::Module* initialModule;
 

Modified: vmkit/trunk/lib/Mvm/Allocator/gcchunk.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Allocator/gcchunk.h?rev=59439&r1=59438&r2=59439&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/Allocator/gcchunk.h (original)
+++ vmkit/trunk/lib/Mvm/Allocator/gcchunk.h Mon Nov 17 06:25:11 2008
@@ -28,7 +28,7 @@
 	                        /* bit 3: est-on collectable */
 public:
 #ifdef SERVICE
-  VirtualMachine* meta; // who allocated me
+  mvm::VirtualMachine* meta; // who allocated me
 #endif
  	static const signed int maskCollectable    = 8;
  	static const signed int maskNotCollectable = 0;

Modified: vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp?rev=59439&r1=59438&r2=59439&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp (original)
+++ vmkit/trunk/lib/Mvm/GCMmap2/gccollector.cpp Mon Nov 17 06:25:11 2008
@@ -67,10 +67,20 @@
   /* kill everyone */
   GCChunkNode *next = 0;
 
+#ifdef SERVICE
+  Thread* th = Thread::get();
+  VirtualMachine* OldVM = th->MyVM;
+#endif
+
+
   for(cur=finalizable.next(); cur!=&finalizable; cur=next) {
 #ifdef SERVICE
-    VirtualMachine* vm = cur->meta;
-    vm->memoryUsed -= real_nbb(cur);
+    mvm::VirtualMachine* NewVM = cur->meta;
+    if (NewVM) {
+      NewVM->memoryUsed -= real_nbb(cur);
+      th->MyVM = NewVM;
+      th->IsolateID = NewVM->IsolateID;
+    }
 #endif
     register gc_header *c = cur->chunk();
     next = cur->next();
@@ -84,6 +94,10 @@
       }
     }
   }
+#ifdef SERVICE
+  th->IsolateID = OldVM->IsolateID;
+  th->MyVM = OldVM;
+#endif
   
   next = 0;
   for(cur=finalizable.next(); cur!=&finalizable; cur=next) {

Modified: vmkit/trunk/lib/Mvm/GCMmap2/gccollector.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/GCMmap2/gccollector.h?rev=59439&r1=59438&r2=59439&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/GCMmap2/gccollector.h (original)
+++ vmkit/trunk/lib/Mvm/GCMmap2/gccollector.h Mon Nov 17 06:25:11 2008
@@ -145,16 +145,20 @@
     _since_last_collection -= n;
     if(_enable_auto && (_since_last_collection <= 0)) {
 #ifdef SERVICE
-      mvm::Thread::get()->vm->gcTriggered++;
+      if (threads->get_nb_threads()) {
+        mvm::Thread::get()->MyVM->gcTriggered++;
+      }
 #endif
       collect_unprotect();
     }
     
     register GCChunkNode *header = allocator->alloc_chunk(n, 1, current_mark & 1);
 #ifdef SERVICE
-    VirtualMachine* vm = mvm::Thread::get()->vm;
-    header->meta = vm;
-    vm->memoryUsed += n;
+    if (threads->get_nb_threads()) {
+      VirtualMachine* vm = mvm::Thread::get()->MyVM;
+      header->meta = vm;
+      vm->memoryUsed += n;
+    }
 #endif
     header->append(used_nodes);
     //printf("Allocate %d bytes at %p [%p] %d %d\n", n, header->chunk()->_2gc(),
@@ -182,7 +186,9 @@
 
     if(_enable_auto && (_since_last_collection <= 0)) {
 #ifdef SERVICE
-      mvm::Thread::get()->vm->gcTriggered++;
+      if (threads->get_nb_threads()) {
+        mvm::Thread::get()->MyVM->gcTriggered++;
+      }
 #endif
       collect_unprotect();
     }
@@ -190,9 +196,11 @@
     GCChunkNode  *res = allocator->realloc_chunk(desc, node, n);
 
 #ifdef SERVICE
-    VirtualMachine* vm = mvm::Thread::get()->vm;
-    header->meta = vm;
-    vm->memoryUsed += (n - old_sz);
+    if (threads->get_nb_threads()) {
+      VirtualMachine* vm = mvm::Thread::get()->MyVM;
+      res->meta = vm;
+      vm->memoryUsed += (n - old_sz);
+    }
 #endif
 
     if(res != node) {

Modified: vmkit/trunk/lib/Mvm/GCMmap2/gcthread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/GCMmap2/gcthread.h?rev=59439&r1=59438&r2=59439&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/GCMmap2/gcthread.h (original)
+++ vmkit/trunk/lib/Mvm/GCMmap2/gcthread.h Mon Nov 17 06:25:11 2008
@@ -79,7 +79,10 @@
     current_collector = 0;
     base = 0;
   }
-
+  
+  inline unsigned int get_nb_threads() {
+    return _nb_threads;
+  }
   inline void lock()   { _globalLock.lock(); }
   inline void unlock() { _globalLock.unlock(); }
   inline void unlock_dont_recovery() { _globalLock.unlock_dont_recovery(); }





More information about the vmkit-commits mailing list