[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