From nicolas.geoffray at lip6.fr Mon Aug 4 23:26:26 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 05 Aug 2008 06:26:26 -0000 Subject: [vmkit-commits] [vmkit] r54341 - in /vmkit/trunk: autoconf/configure.ac configure Message-ID: <200808050626.m756QQDU013162@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 5 01:26:26 2008 New Revision: 54341 URL: http://llvm.org/viewvc/llvm-project?rev=54341&view=rev Log: Do not if on classpath jni.h, just put the two directories, with /usr/include/classpath being the default on linux systems. Modified: vmkit/trunk/autoconf/configure.ac vmkit/trunk/configure Modified: vmkit/trunk/autoconf/configure.ac URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/autoconf/configure.ac?rev=54341&r1=54340&r2=54341&view=diff ============================================================================== --- vmkit/trunk/autoconf/configure.ac (original) +++ vmkit/trunk/autoconf/configure.ac Tue Aug 5 01:26:26 2008 @@ -261,11 +261,7 @@ [[WITH_JNJVM=yes]] ) -if test "x${classpathlibs}" != "x/usr/lib/classpath"; then - classpathinclude=${classpathlibs}/../include; -else - classpathinclude=/usr/include/classpath; -fi +classpathinclude="${classpathlibs}/../include:/usr/include/classpath"; if test "x${WITH_JNJVM}" = "xyes"; then WITH_JNJVM=1; Modified: vmkit/trunk/configure URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/configure?rev=54341&r1=54340&r2=54341&view=diff ============================================================================== --- vmkit/trunk/configure (original) +++ vmkit/trunk/configure Tue Aug 5 01:26:26 2008 @@ -4006,11 +4006,7 @@ fi -if test "x${classpathlibs}" != "x/usr/lib/classpath"; then - classpathinclude=${classpathlibs}/../include; -else - classpathinclude=/usr/include/classpath; -fi +classpathinclude="${classpathlibs}/../include:/usr/include/classpath"; if test "x${WITH_JNJVM}" = "xyes"; then WITH_JNJVM=1; From nicolas.geoffray at lip6.fr Mon Aug 4 23:35:41 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 05 Aug 2008 06:35:41 -0000 Subject: [vmkit-commits] [vmkit] r54343 - in /vmkit/trunk: Makefile.common.in autoconf/configure.ac configure Message-ID: <200808050635.m756Zfv8013422@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 5 01:35:41 2008 New Revision: 54343 URL: http://llvm.org/viewvc/llvm-project?rev=54343&view=rev Log: Don't do ':' on gcc's -I flag. Modified: vmkit/trunk/Makefile.common.in vmkit/trunk/autoconf/configure.ac vmkit/trunk/configure Modified: vmkit/trunk/Makefile.common.in URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.common.in?rev=54343&r1=54342&r2=54343&view=diff ============================================================================== --- vmkit/trunk/Makefile.common.in (original) +++ vmkit/trunk/Makefile.common.in Tue Aug 5 01:35:41 2008 @@ -26,7 +26,7 @@ CXX.Flags += @GC_FLAGS@ -Wno-variadic-macros -fno-omit-frame-pointer -ansi -Werror # GNU Classpath flags -CLASSPATH_FLAGS = -I at classpathinclude@ +CLASSPATH_FLAGS = @classpathinclude@ # Pnet location PNETLIB = @pnetlocalprefix@ Modified: vmkit/trunk/autoconf/configure.ac URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/autoconf/configure.ac?rev=54343&r1=54342&r2=54343&view=diff ============================================================================== --- vmkit/trunk/autoconf/configure.ac (original) +++ vmkit/trunk/autoconf/configure.ac Tue Aug 5 01:35:41 2008 @@ -261,7 +261,7 @@ [[WITH_JNJVM=yes]] ) -classpathinclude="${classpathlibs}/../include:/usr/include/classpath"; +classpathinclude="-I${classpathlibs}/../include -I/usr/include/classpath"; if test "x${WITH_JNJVM}" = "xyes"; then WITH_JNJVM=1; Modified: vmkit/trunk/configure URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/configure?rev=54343&r1=54342&r2=54343&view=diff ============================================================================== --- vmkit/trunk/configure (original) +++ vmkit/trunk/configure Tue Aug 5 01:35:41 2008 @@ -4006,7 +4006,7 @@ fi -classpathinclude="${classpathlibs}/../include:/usr/include/classpath"; +classpathinclude="-I${classpathlibs}/../include -I/usr/include/classpath"; if test "x${WITH_JNJVM}" = "xyes"; then WITH_JNJVM=1; From nicolas.geoffray at lip6.fr Mon Aug 4 23:48:15 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 05 Aug 2008 06:48:15 -0000 Subject: [vmkit-commits] [vmkit] r54344 - /vmkit/trunk/lib/JnJVM/Classpath/Makefile Message-ID: <200808050648.m756mF9r013815@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 5 01:48:14 2008 New Revision: 54344 URL: http://llvm.org/viewvc/llvm-project?rev=54344&view=rev Log: Add the CLASSPATH_FLAGS flag to GCC. Modified: vmkit/trunk/lib/JnJVM/Classpath/Makefile Modified: vmkit/trunk/lib/JnJVM/Classpath/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/Makefile?rev=54344&r1=54343&r2=54344&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/Makefile (original) +++ vmkit/trunk/lib/JnJVM/Classpath/Makefile Tue Aug 5 01:48:14 2008 @@ -11,4 +11,4 @@ LIBRARYNAME = Classpath include $(LEVEL)/Makefile.common -CXX.Flags += -I../VMCore +CXX.Flags += -I../VMCore $(CLASSPATH_FLAGS) From nicolas.geoffray at lip6.fr Tue Aug 5 00:02:30 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 05 Aug 2008 07:02:30 -0000 Subject: [vmkit-commits] [vmkit] r54345 - /vmkit/trunk/lib/N3/VMCore/LockedMap.h Message-ID: <200808050702.m7572UFZ014270@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 5 02:02:30 2008 New Revision: 54345 URL: http://llvm.org/viewvc/llvm-project?rev=54345&view=rev Log: Constify otherwise apple gcc would complain. Modified: vmkit/trunk/lib/N3/VMCore/LockedMap.h Modified: vmkit/trunk/lib/N3/VMCore/LockedMap.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/LockedMap.h?rev=54345&r1=54344&r2=54345&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/LockedMap.h (original) +++ vmkit/trunk/lib/N3/VMCore/LockedMap.h Tue Aug 5 02:02:30 2008 @@ -39,12 +39,12 @@ template class LockedMap : public mvm::Object { public: - typedef typename std::map::iterator iterator; + typedef typename std::map::iterator iterator; typedef Container* (*funcCreate)(Key& V, Upcall* ass); mvm::Lock* lock; std::map > > map; + gc_allocator > > map; inline Container* lookupOrCreate(Key& V, Upcall* ass, funcCreate func) { lock->lock(); @@ -200,11 +200,11 @@ class UTF8Map : public mvm::Object { public: - typedef std::multimap::iterator iterator; + typedef std::multimap::iterator iterator; mvm::Lock* lock; std::multimap, - gc_allocator > > map; + gc_allocator > > map; static VirtualTable* VT; const UTF8* lookupOrCreateAsciiz(const char* asciiz); const UTF8* lookupOrCreateReader(const uint16* buf, uint32 size); From nicolas.geoffray at lip6.fr Wed Aug 6 18:16:18 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 07 Aug 2008 01:16:18 -0000 Subject: [vmkit-commits] [vmkit] r54441 - /vmkit/trunk/lib/Mvm/JIT.cpp Message-ID: <200808070116.m771GIuo030550@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 6 20:16:18 2008 New Revision: 54441 URL: http://llvm.org/viewvc/llvm-project?rev=54441&view=rev Log: Fix cxa_end_catch type after Owen's patch. Modified: vmkit/trunk/lib/Mvm/JIT.cpp Modified: vmkit/trunk/lib/Mvm/JIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/JIT.cpp?rev=54441&r1=54440&r2=54441&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/JIT.cpp (original) +++ vmkit/trunk/lib/Mvm/JIT.cpp Wed Aug 6 20:16:18 2008 @@ -309,6 +309,10 @@ /*Type=*/type, /*Linkage=*/GlobalValue::ExternalLinkage, /*Name=*/"__gxx_personality_v0", module); // (external, no body) + exceptionEndCatch = Function::Create( + /*Type=*/type, + /*Linkage=*/GlobalValue::ExternalLinkage, + /*Name=*/"__cxa_end_catch", module); // (external, no body) args.push_back(ptrType); type = FunctionType::get( @@ -319,10 +323,6 @@ /*Type=*/type, /*Linkage=*/GlobalValue::ExternalLinkage, /*Name=*/"__cxa_begin_catch", module); // (external, no body) - exceptionEndCatch = Function::Create( - /*Type=*/type, - /*Linkage=*/GlobalValue::ExternalLinkage, - /*Name=*/"__cxa_end_catch", module); // (external, no body) args.clear(); // Math function From nicolas.geoffray at lip6.fr Wed Aug 6 21:52:28 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 07 Aug 2008 04:52:28 -0000 Subject: [vmkit-commits] [vmkit] r54445 - in /vmkit/trunk: autoconf/configure.ac configure Message-ID: <200808070452.m774qT9X004547@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 6 23:52:27 2008 New Revision: 54445 URL: http://llvm.org/viewvc/llvm-project?rev=54445&view=rev Log: Remove a whitespace, which made the GC_FLAGS empty. Modified: vmkit/trunk/autoconf/configure.ac vmkit/trunk/configure Modified: vmkit/trunk/autoconf/configure.ac URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/autoconf/configure.ac?rev=54445&r1=54444&r2=54445&view=diff ============================================================================== --- vmkit/trunk/autoconf/configure.ac (original) +++ vmkit/trunk/autoconf/configure.ac Wed Aug 6 23:52:27 2008 @@ -180,7 +180,7 @@ ) if test "x$gc" = "xboehm"; then - GC_FLAGS ="-I$PWD/lib/Mvm/BoehmGC -DGC_THREADS" + GC_FLAGS="-I$PWD/lib/Mvm/BoehmGC -DGC_THREADS" AC_DEFINE([USE_GC_BOEHM], [1], [Using the boehm gc]) AC_SUBST(GC_MMAP2, [0]) AC_SUBST(GC_BOEHM, [1]) Modified: vmkit/trunk/configure URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/configure?rev=54445&r1=54444&r2=54445&view=diff ============================================================================== --- vmkit/trunk/configure (original) +++ vmkit/trunk/configure Wed Aug 6 23:52:27 2008 @@ -3885,7 +3885,7 @@ if test "x$gc" = "xboehm"; then - GC_FLAGS ="-I$PWD/lib/Mvm/BoehmGC -DGC_THREADS" + GC_FLAGS="-I$PWD/lib/Mvm/BoehmGC -DGC_THREADS" cat >>confdefs.h <<\_ACEOF #define USE_GC_BOEHM 1 @@ -3952,9 +3952,7 @@ fi fi - - -if test "x$vmtype" = "xservice"; then + if test "x$vmtype" = "xservice"; then SERVICE_BUILD_TRUE= SERVICE_BUILD_FALSE='#' else @@ -3962,9 +3960,7 @@ SERVICE_BUILD_FALSE= fi - - -if test "x$vmtype" = "xmulti"; then + if test "x$vmtype" = "xmulti"; then ISOLATE_BUILD_TRUE= ISOLATE_BUILD_FALSE='#' else From tilmann.scheller at googlemail.com Sat Aug 9 03:23:36 2008 From: tilmann.scheller at googlemail.com (Tilmann Scheller) Date: Sat, 09 Aug 2008 10:23:36 -0000 Subject: [vmkit-commits] [vmkit] r54579 - in /vmkit/trunk/lib/N3/VMCore: Assembly.cpp Assembly.h CLIJit.cpp CLISignature.cpp N3Initialise.cpp Opcodes.cpp VMArray.cpp VMArray.h VMClass.cpp VMClass.h VMThread.cpp VMThread.h VirtualTables.cpp Message-ID: <200808091023.m79ANbgr021876@zion.cs.uiuc.edu> Author: tilmann Date: Sat Aug 9 05:23:35 2008 New Revision: 54579 URL: http://llvm.org/viewvc/llvm-project?rev=54579&view=rev Log: add support for generic methods to N3 fix bug in box instruction Modified: vmkit/trunk/lib/N3/VMCore/Assembly.cpp vmkit/trunk/lib/N3/VMCore/Assembly.h vmkit/trunk/lib/N3/VMCore/CLIJit.cpp vmkit/trunk/lib/N3/VMCore/CLISignature.cpp vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp vmkit/trunk/lib/N3/VMCore/Opcodes.cpp vmkit/trunk/lib/N3/VMCore/VMArray.cpp vmkit/trunk/lib/N3/VMCore/VMArray.h vmkit/trunk/lib/N3/VMCore/VMClass.cpp vmkit/trunk/lib/N3/VMCore/VMClass.h vmkit/trunk/lib/N3/VMCore/VMThread.cpp vmkit/trunk/lib/N3/VMCore/VMThread.h vmkit/trunk/lib/N3/VMCore/VirtualTables.cpp Modified: vmkit/trunk/lib/N3/VMCore/Assembly.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/Assembly.cpp?rev=54579&r1=54578&r2=54579&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/Assembly.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/Assembly.cpp Sat Aug 9 05:23:35 2008 @@ -420,17 +420,40 @@ return meth; } +static VMGenericMethod* genMethodDup(uint32& key, Assembly* ass) { + VMGenericMethod* meth = gc_new(VMGenericMethod)(); + meth->token = key; + meth->canBeInlined = false; + return meth; +} + VMMethod* Assembly::constructMethod(VMClass* cl, const UTF8* name, - uint32 token) { + uint32 token, bool generic) { VMMethod* meth; - if (VMThread::get()->currGenericClass == 0) { + if (VMThread::get()->currGenericClass == 0 && generic == false) { // we are not reading a generic class meth = loadedTokenMethods->lookupOrCreate(token, this, methodDup); } else { - // we are reading a generic class, don't add a reference + // we are reading a generic class or a generic method, don't add a reference // to the loadedTokenMethods map meth = methodDup(token, this); + + if (generic) { + // we are reading a generic method + if (VMThread::get()->genMethodInstantiation == NULL) { + cl->genericMethods.push_back(meth); + } else { + VMGenericMethod* genMethod = genMethodDup(token, this); + genMethod->genericParams = *VMThread::get()->genMethodInstantiation; + meth = genMethod; + if (isStatic(meth->flags)) { + cl->staticMethods.push_back(meth); + } else { + cl->virtualMethods.push_back(meth); + } + } + } } meth->classDef = cl; @@ -1323,43 +1346,42 @@ uint32 paramList = methArray[CONSTANT_METHODDEF_PARAMLIST]; uint32 offset = blobOffset + signature; - - if (isGenericMethod(offset)) { - // generic methods are read on instantiation - return NULL; + + VMMethod* meth = + constructMethod((VMClass*)cl, readString(cl->vm, (name + stringOffset)), + token, isGenericMethod(offset)); + + offset = blobOffset + signature; + + VMGenericMethod* tmp = VMThread::get()->currGenericMethod; + VMThread::get()->currGenericMethod = dynamic_cast(meth); + meth->virt = extractMethodSignature(offset, cl, meth->parameters); + VMThread::get()->currGenericMethod = tmp; + + meth->flags = flags; + meth->implFlags = implFlags; + + if (rva) { + meth->offset = textSection->rawAddress + + (rva - textSection->virtualAddress); } else { - offset = blobOffset + signature; - - VMMethod* meth = - constructMethod((VMClass*)cl, readString(cl->vm, (name + stringOffset)), - token); - meth->virt = extractMethodSignature(offset, cl, meth->parameters); - meth->flags = flags; - meth->implFlags = implFlags; - - if (rva) { - meth->offset = textSection->rawAddress + - (rva - textSection->virtualAddress); - } else { - meth->offset = 0; - } - - if (paramList && paramTable != 0 && paramList <= paramSize) { - uint32 endParam = (index == methodSize) ? - paramSize + 1 : - methTable->readIndexInRow(index + 1, CONSTANT_METHODDEF_PARAMLIST, - bytes); + meth->offset = 0; + } - uint32 nbParams = endParam - paramList; + if (paramList && paramTable != 0 && paramList <= paramSize) { + uint32 endParam = (index == methodSize) ? + paramSize + 1 : + methTable->readIndexInRow(index + 1, CONSTANT_METHODDEF_PARAMLIST, + bytes); - for (uint32 j = 0; j < nbParams; ++j) { - meth->params.push_back(readParam(j + paramList, meth)); - } + uint32 nbParams = endParam - paramList; + for (uint32 j = 0; j < nbParams; ++j) { + meth->params.push_back(readParam(j + paramList, meth)); } - - return meth; } + + return meth; } VMField* Assembly::readField(uint32 index, VMCommonClass* cl) { @@ -1637,7 +1659,7 @@ } case CONSTANT_MemberRef : { - meth = readMemberRefAsMethod(token); + meth = readMemberRefAsMethod(token, NULL); break; } @@ -1679,7 +1701,7 @@ return i + 1 + (CONSTANT_TypeDef << 24); } -VMMethod* Assembly::readMemberRefAsMethod(uint32 token) { +VMMethod* Assembly::readMemberRefAsMethod(uint32 token, std::vector* genArgs) { uint32 index = token & 0xffff; Table* memberTable = CLIHeader->tables[CONSTANT_MemberRef]; uint32* memberArray = (uint32*)alloca(sizeof(uint32) * memberTable->rowSize); @@ -1706,7 +1728,34 @@ VMCommonClass* type = loadType(((N3*)VMThread::get()->vm), typeToken, true, false, false, true); bool virt = extractMethodSignature(offset, type, args); - VMMethod* meth = type->lookupMethod(name, args, !virt, true); + VMMethod* meth; + + if (genArgs != NULL) { + VMClass* cl = dynamic_cast(type); + + if (cl == NULL) { + VMThread::get()->vm->error("Only instances of generic classes are allowed."); + } + + // search for matching signature + for (uint i = 0; i < cl->genericMethods.size(); ++i) { + VMMethod* genMethod = cl->genericMethods.at(i); + + if (!name->equals(genMethod->name) || !genMethod->signatureEqualsGeneric(args)) { + continue; + } + + // use found token to create instance of generic method + VMThread::get()->genMethodInstantiation = genArgs; + meth = readMethodDef(genMethod->token & 0xFFFFFF, type); + VMThread::get()->genMethodInstantiation = NULL; + meth->token = token; + // insert in global hashmap + } + } else { + meth = type->lookupMethod(name, args, !virt, true); + } + return meth; } @@ -1781,7 +1830,7 @@ } case 1 : { methodToken = index + (CONSTANT_MemberRef << 24); - return readMemberRefAsMethod(methodToken); + return readMemberRefAsMethod(methodToken, &genArgs); } } Modified: vmkit/trunk/lib/N3/VMCore/Assembly.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/Assembly.h?rev=54579&r1=54578&r2=54579&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/Assembly.h (original) +++ vmkit/trunk/lib/N3/VMCore/Assembly.h Sat Aug 9 05:23:35 2008 @@ -150,7 +150,7 @@ VMField* constructField(VMClass* cl, const UTF8* name, VMCommonClass* signature, uint32 token); VMMethod* constructMethod(VMClass* cl, const UTF8* name, - uint32 token); + uint32 token, bool generic); VMCommonClass* lookupClassFromName(const UTF8* name, const UTF8* nameSpace); VMCommonClass* lookupClassFromToken(uint32 token); VMMethod* lookupMethodFromToken(uint32 token); @@ -248,7 +248,7 @@ VMMethod* getMethodFromToken(uint32 token); uint32 getTypedefTokenFromMethod(uint32 token); - VMMethod* readMemberRefAsMethod(uint32 token); + VMMethod* readMemberRefAsMethod(uint32 token, std::vector* genArgs); const UTF8* readUserString(uint32 token); uint32 getExplicitLayout(uint32 token); Modified: vmkit/trunk/lib/N3/VMCore/CLIJit.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIJit.cpp?rev=54579&r1=54578&r2=54579&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/CLIJit.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/CLIJit.cpp Sat Aug 9 05:23:35 2008 @@ -1462,13 +1462,16 @@ jit->compilingClass = cl; jit->compilingMethod = meth; - // save previous generic class + // save previous generic and method class VMGenericClass* old = VMThread::get()->currGenericClass; + VMGenericMethod* oldMethod = VMThread::get()->currGenericMethod; // temporarily store the class of the method to be compiled - // in case it is a generic class + // in case it is a generic class VMThread::get()->currGenericClass = dynamic_cast(cl); + VMThread::get()->currGenericMethod = dynamic_cast(meth); + Function* func; meth->getSignature(); @@ -1483,6 +1486,8 @@ // restore saved class VMThread::get()->currGenericClass = old; + VMThread::get()->currGenericMethod = oldMethod; + return func; } Modified: vmkit/trunk/lib/N3/VMCore/CLISignature.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLISignature.cpp?rev=54579&r1=54578&r2=54579&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/CLISignature.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/CLISignature.cpp Sat Aug 9 05:23:35 2008 @@ -249,8 +249,18 @@ } static VMCommonClass* METHOD_ElementTypeMvar(uint32 op, Assembly* ass, uint32& offset) { - VMThread::get()->vm->error("implement me"); - return 0; + uint32 number = ass->uncompressSignature(offset); + + if (VMThread::get()->currGenericMethod == NULL) { + // return dummy VMClass, use the token field + // to store the generic argument number + VMClass* cl = gc_new(VMClass)(); + cl->token = number; + cl->assembly = NULL; + return cl; + } else { + return VMThread::get()->currGenericMethod->genericParams[number]; + } } static VMCommonClass* METHOD_ElementTypeCmodReqd(uint32 op, Assembly* ass, uint32& offset) { @@ -365,11 +375,16 @@ //uint32 count = uncompressSignature(offset); uint32 call = uncompressSignature(offset); + + if (call & CONSTANT_Generic) { + //uint32 genArgCount = + uncompressSignature(offset); + } + uint32 paramCount = uncompressSignature(offset); uint32 hasThis = call & CONSTANT_HasThis ? 1 : 0; uint32 realCount = paramCount + hasThis; - //uint32 generic = call & CONSTANT_Generic ? 1 : 0; VMCommonClass* ret = exploreType(offset); types.push_back(ret); @@ -377,6 +392,7 @@ if (hasThis) { types.push_back(cl); } + for (uint32 i = hasThis; i < realCount; ++i) { VMCommonClass* cur = exploreType(offset); types.push_back(cur); Modified: vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp?rev=54579&r1=54578&r2=54579&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp Sat Aug 9 05:23:35 2008 @@ -187,8 +187,10 @@ INIT(UTF8); INIT(VMCommonClass); INIT(VMClass); + INIT(VMGenericClass); INIT(VMClassArray); INIT(VMMethod); + INIT(VMGenericMethod); INIT(VMField); INIT(VMCond); INIT(LockObj); Modified: vmkit/trunk/lib/N3/VMCore/Opcodes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/Opcodes.cpp?rev=54579&r1=54578&r2=54579&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/Opcodes.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/Opcodes.cpp Sat Aug 9 05:23:35 2008 @@ -1280,6 +1280,11 @@ VMCommonClass* type = assembly->loadType(vm, token, true, false, false, true); assert(type); + + if (!type->isPrimitive) { + // the box instruction has no effect on non-primitive types + break; + } Value* var = new LoadInst(type->llvmVar(), "", currentBlock); Value* obj = CallInst::Create(objConsLLVM, var, "", currentBlock); Modified: vmkit/trunk/lib/N3/VMCore/VMArray.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMArray.cpp?rev=54579&r1=54578&r2=54579&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMArray.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/VMArray.cpp Sat Aug 9 05:23:35 2008 @@ -218,3 +218,20 @@ return buf->cString(); } +bool UTF8::equals(const UTF8 *string) const +{ + if (size != string->size) { + return false; + } + + for (sint32 i = 0; i < size; ++i) { + if (at(i) != string->at(i)) { + return false; + } + } + + return true; +} + + + Modified: vmkit/trunk/lib/N3/VMCore/VMArray.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMArray.h?rev=54579&r1=54578&r2=54579&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMArray.h (original) +++ vmkit/trunk/lib/N3/VMCore/VMArray.h Sat Aug 9 05:23:35 2008 @@ -104,6 +104,8 @@ static const UTF8* readerConstruct(VirtualMachine *vm, uint16* buf, uint32 n); const UTF8* extract(VirtualMachine *vm, uint32 start, uint32 len) const; + + bool equals(const UTF8* string) const; }; } // end namespace n3 Modified: vmkit/trunk/lib/N3/VMCore/VMClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.cpp?rev=54579&r1=54578&r2=54579&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMClass.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/VMClass.cpp Sat Aug 9 05:23:35 2008 @@ -110,6 +110,32 @@ buf->write(">"); } +void VMGenericMethod::print(mvm::PrintBuffer* buf) const { + buf->write("CLIGenericMethod<"); + classDef->nameSpace->print(buf); + buf->write("."); + classDef->name->print(buf); + buf->write("::"); + name->print(buf); + buf->write("("); + std::vector::iterator i = ((VMMethod*)this)->parameters.begin(); + std::vector::iterator e = ((VMMethod*)this)->parameters.end(); + + ++i; + if (i != e) { + while (true) { + (*i)->nameSpace->print(buf); + buf->write("."); + (*i)->name->print(buf); + ++i; + if (i == e) break; + else buf->write(" ,"); + } + } + buf->write(")"); + buf->write(">"); +} + void VMField::print(mvm::PrintBuffer* buf) const { buf->write("CLIField<"); classDef->nameSpace->print(buf); @@ -796,9 +822,59 @@ return true; } +bool VMMethod::signatureEqualsGeneric(std::vector & args) { + bool stat = isStatic(flags); + + if (args.size() != parameters.size()) + return false; + else { + std::vector::iterator i = parameters.begin(), a = + args.begin(), e = args.end(); + + if (((*i)->assembly == NULL && (*a)->assembly != NULL) || + ((*i)->assembly != NULL && (*a)->assembly == NULL)) + return false; + + if ((*i)->assembly == NULL && (*a)->assembly == NULL) { + if ((*i)->token != (*a)->token) { + return false; + } + } + + if ((*i) != (*a)) + return false; + ++i; + ++a; + + if (!stat) { + ++i; + ++a; + } + + for (; a != e; ++i, ++a) { + if (((*i)->assembly == NULL && (*a)->assembly != NULL) || + ((*i)->assembly != NULL && (*a)->assembly == NULL)) + return false; + + if ((*i)->assembly == NULL && (*a)->assembly == NULL) { + if ((*i)->token != (*a)->token) { + return false; + } else { + continue; + } + } + + if ((*i) != (*a)) + return false; + } + } + return true; +} + void VMGenericClass::print(mvm::PrintBuffer* buf) const { buf->write("GenCLIType<"); nameSpace->print(buf); buf->write("::"); name->print(buf); - buf->write(">");} + buf->write(">"); +} Modified: vmkit/trunk/lib/N3/VMCore/VMClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.h?rev=54579&r1=54578&r2=54579&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMClass.h (original) +++ vmkit/trunk/lib/N3/VMCore/VMClass.h Sat Aug 9 05:23:35 2008 @@ -141,6 +141,7 @@ VMObject* virtualInstance; std::vector innerClasses; VMClass* outerClass; + std::vector genericMethods; VMObject* operator()(); VMObject* doNew(); @@ -229,10 +230,20 @@ static const llvm::FunctionType* resolveSignature( std::vector& params, bool isVirt, bool &structRet); bool signatureEquals(std::vector& args); + bool signatureEqualsGeneric(std::vector& args); llvm::GlobalVariable* llvmVar(); llvm::GlobalVariable* _llvmVar; }; +class VMGenericMethod : public VMMethod { +public: + static VirtualTable* VT; + virtual void print(mvm::PrintBuffer* buf) const; + virtual void TRACER; + + std::vector genericParams; +}; + class VMField : public mvm::Object { public: static VirtualTable* VT; Modified: vmkit/trunk/lib/N3/VMCore/VMThread.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMThread.cpp?rev=54579&r1=54578&r2=54579&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMThread.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/VMThread.cpp Sat Aug 9 05:23:35 2008 @@ -59,7 +59,10 @@ key->self = mvm::Thread::self(); key->pendingException = 0; key->perFunctionPasses = new llvm::FunctionPassManager(vm->TheModuleProvider); - key->perFunctionPasses->add(new llvm::TargetData(vm->module)); + key->perFunctionPasses->add(new llvm::TargetData(vm->module)); + key->currGenericClass = NULL; + key->currGenericMethod = NULL; + key->genMethodInstantiation = NULL; AddStandardCompilePasses(key->perFunctionPasses); return key; } Modified: vmkit/trunk/lib/N3/VMCore/VMThread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMThread.h?rev=54579&r1=54578&r2=54579&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMThread.h (original) +++ vmkit/trunk/lib/N3/VMCore/VMThread.h Sat Aug 9 05:23:35 2008 @@ -26,6 +26,7 @@ class VMClass; class VMGenericClass; class VMObject; +class VMGenericMethod; class VMThread : public mvm::Thread { public: @@ -42,6 +43,11 @@ // helper which points to the current generic class VMGenericClass* currGenericClass; + // helper which contains the instantiation of the + // current generic method + std::vector* genMethodInstantiation; + // helper which points to the current generic method + VMGenericMethod* currGenericMethod; static const unsigned int StateRunning; static const unsigned int StateWaiting; Modified: vmkit/trunk/lib/N3/VMCore/VirtualTables.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VirtualTables.cpp?rev=54579&r1=54578&r2=54579&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VirtualTables.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/VirtualTables.cpp Sat Aug 9 05:23:35 2008 @@ -44,6 +44,7 @@ INIT(VMClassArray); INIT(VMClassPointer); INIT(VMMethod); + INIT(VMGenericMethod); INIT(VMField); INIT(VMCond); INIT(LockObj); @@ -168,6 +169,7 @@ virtualInstance->MARK_AND_TRACE; TRACE_VECTOR(VMClass*, innerClasses, std::allocator); outerClass->MARK_AND_TRACE; + TRACE_VECTOR(VMMethod*, genericMethods, std::allocator); } void VMGenericClass::TRACER { @@ -195,6 +197,11 @@ name->MARK_AND_TRACE; } +void VMGenericMethod::TRACER { + VMMethod::PARENT_TRACER; + TRACE_VECTOR(VMCommonClass*, genericParams, std::allocator); +} + void VMField::TRACER { signature->MARK_AND_TRACE; classDef->MARK_AND_TRACE; From tilmann.scheller at googlemail.com Sat Aug 9 09:49:08 2008 From: tilmann.scheller at googlemail.com (Tilmann Scheller) Date: Sat, 09 Aug 2008 16:49:08 -0000 Subject: [vmkit-commits] [vmkit] r54584 - in /vmkit/trunk/lib/N3/VMCore: Assembly.cpp Assembly.h Message-ID: <200808091649.m79Gn85M000305@zion.cs.uiuc.edu> Author: tilmann Date: Sat Aug 9 11:49:08 2008 New Revision: 54584 URL: http://llvm.org/viewvc/llvm-project?rev=54584&view=rev Log: refactoring of generic method instantiation Modified: vmkit/trunk/lib/N3/VMCore/Assembly.cpp vmkit/trunk/lib/N3/VMCore/Assembly.h Modified: vmkit/trunk/lib/N3/VMCore/Assembly.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/Assembly.cpp?rev=54584&r1=54583&r2=54584&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/Assembly.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/Assembly.cpp Sat Aug 9 11:49:08 2008 @@ -1701,6 +1701,42 @@ return i + 1 + (CONSTANT_TypeDef << 24); } +VMMethod *Assembly::instantiateGenericMethod( + std::vector *genArgs, VMCommonClass *type, + const UTF8 *& name, std::vector & args, uint32 token, + bool virt) { + VMMethod *meth; + + if (genArgs != NULL) { + VMClass* cl = dynamic_cast (type); + + if (cl == NULL) { + VMThread::get()->vm->error( + "Only instances of generic classes are allowed."); + } + + // search for matching signature + for (uint i = 0; i < cl->genericMethods.size(); ++i) { + VMMethod* genMethod = cl->genericMethods.at(i); + + if (!name->equals(genMethod->name) || !genMethod->signatureEqualsGeneric( + args)) { + continue; + } + + // use found token to create instance of generic method + VMThread::get()->genMethodInstantiation = genArgs; + meth = readMethodDef(genMethod->token & 0xFFFFFF, type); + VMThread::get()->genMethodInstantiation = NULL; + meth->token = token; + } + } else { + meth = type->lookupMethod(name, args, !virt, true); + } + + return meth; +} + VMMethod* Assembly::readMemberRefAsMethod(uint32 token, std::vector* genArgs) { uint32 index = token & 0xffff; Table* memberTable = CLIHeader->tables[CONSTANT_MemberRef]; @@ -1725,37 +1761,9 @@ switch (table) { case 0 : { uint32 typeToken = index + (CONSTANT_TypeDef << 24); - VMCommonClass* type = loadType(((N3*)VMThread::get()->vm), typeToken, - true, false, false, true); + VMCommonClass* type = loadType(((N3*)(VMThread::get()->vm)), typeToken, true, false, false, true); bool virt = extractMethodSignature(offset, type, args); - VMMethod* meth; - - if (genArgs != NULL) { - VMClass* cl = dynamic_cast(type); - - if (cl == NULL) { - VMThread::get()->vm->error("Only instances of generic classes are allowed."); - } - - // search for matching signature - for (uint i = 0; i < cl->genericMethods.size(); ++i) { - VMMethod* genMethod = cl->genericMethods.at(i); - - if (!name->equals(genMethod->name) || !genMethod->signatureEqualsGeneric(args)) { - continue; - } - - // use found token to create instance of generic method - VMThread::get()->genMethodInstantiation = genArgs; - meth = readMethodDef(genMethod->token & 0xFFFFFF, type); - VMThread::get()->genMethodInstantiation = NULL; - meth->token = token; - // insert in global hashmap - } - } else { - meth = type->lookupMethod(name, args, !virt, true); - } - + VMMethod *meth = instantiateGenericMethod(genArgs, type, name, args, token, virt); return meth; } @@ -1764,7 +1772,7 @@ VMCommonClass* type = loadType(((N3*)VMThread::get()->vm), typeToken, true, false, false, true); bool virt = extractMethodSignature(offset, type, args); - VMMethod* meth = type->lookupMethod(name, args, !virt, true); + VMMethod *meth = instantiateGenericMethod(genArgs, type, name, args, token, virt); return meth; } @@ -1772,25 +1780,28 @@ case 3: VMThread::get()->vm->error("implement me %d", table); break; case 4: { VMClass* type = (VMClass*) readTypeSpec(vm, index); - - VMGenericClass* genClass = dynamic_cast(type); - + type->resolveType(false, false); + + VMGenericClass* genClass = dynamic_cast (type); + if (genClass) { bool virt = extractMethodSignature(offset, type, args); - VMMethod* meth = type->lookupMethod(name, args, !virt, true); + VMMethod* meth = instantiateGenericMethod(genArgs, type, name, args, + token, virt); return meth; } else { - VMMethod* meth = gc_new(VMMethod)(); - bool virt = extractMethodSignature(offset, type, args); - bool structReturn = false; - const llvm::FunctionType* signature = VMMethod::resolveSignature(args, virt, structReturn); - meth->_signature = signature; - meth->classDef = type; - meth->name = name; - meth->virt = virt; - meth->structReturn = structReturn; - meth->parameters = args; // TODO check whether this fix is correct - return meth; + VMMethod* meth = gc_new(VMMethod)() ; + bool virt = extractMethodSignature(offset, type, args); + bool structReturn = false; + const llvm::FunctionType* signature = VMMethod::resolveSignature(args, + virt, structReturn); + meth->_signature = signature; + meth->classDef = type; + meth->name = name; + meth->virt = virt; + meth->structReturn = structReturn; + meth->parameters = args; // TODO check whether this fix is correct + return meth; } } default: @@ -1826,17 +1837,18 @@ switch (table) { case 0 : { methodToken = index + (CONSTANT_MethodDef << 24); + VMThread::get()->vm->error("implement me"); break; } case 1 : { methodToken = index + (CONSTANT_MemberRef << 24); return readMemberRefAsMethod(methodToken, &genArgs); } + default: + VMThread::get()->vm->error("Invalid MethodSpec!"); } - VMThread::get()->vm->error("MethodSpec"); -// return NULL; - return (VMMethod*) (method ^ instantiation); + return NULL; } const UTF8* Assembly::readUserString(uint32 token) { Modified: vmkit/trunk/lib/N3/VMCore/Assembly.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/Assembly.h?rev=54584&r1=54583&r2=54584&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/Assembly.h (original) +++ vmkit/trunk/lib/N3/VMCore/Assembly.h Sat Aug 9 11:49:08 2008 @@ -259,6 +259,8 @@ void readCustomAttributes(uint32 offset, std::vector& args, VMMethod* meth); ArrayObject* getCustomAttributes(uint32 token, VMCommonClass* cl); +private: + VMMethod *instantiateGenericMethod(std::vector *genArgs, VMCommonClass *type, const UTF8 *& name, std::vector & args, uint32 token, bool virt); }; From nicolas.geoffray at lip6.fr Mon Aug 11 00:20:01 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 11 Aug 2008 07:20:01 -0000 Subject: [vmkit-commits] [vmkit] r54633 - in /vmkit/trunk/lib/Mvm: CommandLine.cpp CommandLine.h Disassembler.cpp EscapeAnalysis.cpp JIT.cpp LLVMRuntime/ LLVMRuntime/LLVMRuntime.ll LLVMRuntime/Makefile Makefile MvmMemoryManager.cpp Object.cpp Runtime/ Runtime/CommandLine.cpp Runtime/CommandLine.h Runtime/Disassembler.cpp Runtime/EscapeAnalysis.cpp Runtime/JIT.cpp Runtime/Makefile Runtime/MvmMemoryManager.cpp Runtime/Object.cpp Runtime/Sigsegv.cpp Sigsegv.cpp Message-ID: <200808110720.m7B7K2Ul008405@zion.cs.uiuc.edu> Author: geoffray Date: Mon Aug 11 02:20:00 2008 New Revision: 54633 URL: http://llvm.org/viewvc/llvm-project?rev=54633&view=rev Log: Create a LLVM runtime file, and move all MVM runtime files into the Runtime directory. Added: vmkit/trunk/lib/Mvm/LLVMRuntime/ vmkit/trunk/lib/Mvm/LLVMRuntime/LLVMRuntime.ll vmkit/trunk/lib/Mvm/LLVMRuntime/Makefile vmkit/trunk/lib/Mvm/Runtime/ vmkit/trunk/lib/Mvm/Runtime/CommandLine.cpp vmkit/trunk/lib/Mvm/Runtime/CommandLine.h vmkit/trunk/lib/Mvm/Runtime/Disassembler.cpp vmkit/trunk/lib/Mvm/Runtime/EscapeAnalysis.cpp vmkit/trunk/lib/Mvm/Runtime/JIT.cpp vmkit/trunk/lib/Mvm/Runtime/Makefile vmkit/trunk/lib/Mvm/Runtime/MvmMemoryManager.cpp vmkit/trunk/lib/Mvm/Runtime/Object.cpp vmkit/trunk/lib/Mvm/Runtime/Sigsegv.cpp Removed: vmkit/trunk/lib/Mvm/CommandLine.cpp vmkit/trunk/lib/Mvm/CommandLine.h vmkit/trunk/lib/Mvm/Disassembler.cpp vmkit/trunk/lib/Mvm/EscapeAnalysis.cpp vmkit/trunk/lib/Mvm/JIT.cpp vmkit/trunk/lib/Mvm/MvmMemoryManager.cpp vmkit/trunk/lib/Mvm/Object.cpp vmkit/trunk/lib/Mvm/Sigsegv.cpp Modified: vmkit/trunk/lib/Mvm/Makefile Removed: vmkit/trunk/lib/Mvm/CommandLine.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/CommandLine.cpp?rev=54632&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/CommandLine.cpp (original) +++ vmkit/trunk/lib/Mvm/CommandLine.cpp (removed) @@ -1,165 +0,0 @@ -//===------- CommandLine.cpp - Parses the command line --------------------===// -// -// The Micro Virtual Machine -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - - -#include -#include -#include -#include - -#include "CommandLine.h" -#include "MvmGC.h" -#include "mvm/Threads/Thread.h" - -using namespace mvm; - -typedef struct thread_arg_t { - int argc; - char** argv; - vmlet_main_t func; -} thread_arg_t; - -typedef int (*boot_t)(); - - -CommandLine::CommandLine() { - resetString(); - resetArgv(); -} - -void CommandLine::appendChar(char c) { - assert(_yytext); - _yytext[_yylen++]= c; - if (_yylen == _yylenMax) { - _yylenMax *= 2; - _yytext= (char *)realloc(_yytext, _yylenMax); - } -} - -void CommandLine::appendString(char* str) { - assert(argv); - appendChar(0); - argv[argc++] = str; - if (argc == argcMax) { - argcMax *= 2; - argv = (char **)realloc(argv, argcMax * sizeof(char*)); - } -} - -void CommandLine::resetString() { - _yytext = (char *)malloc(_yylenMax= 32); - _yylen = 0; -} - -void CommandLine::resetArgv() { - argv = (char **)malloc(sizeof(char*) * (argcMax= 10)); - argc = 0; -} - - -void CommandLine::start() { - printf("> "); - _yyChar = getc(stdin); - - while (true) { - switch(_yyChar) { - case ' ' : - do { _yyChar = getc(stdin); } while (_yyChar == ' '); - if (_yylen != 0) { - appendString(_yytext); - resetString(); - } - break; - - case '\n' : - if (_yylen != 0) { - appendString(_yytext); - resetString(); - } - if (argc > 1) { - executeInstr(); - resetArgv(); - printf("> "); - } - _yyChar = getc(stdin); - break; - - case EOF : - printf("\n"); - return; - - default : - appendChar(_yyChar); - _yyChar = getc(stdin); - } - } -} - -extern "C" int startApp(thread_arg_t* arg) { - int argc = arg->argc; - char** argv = arg->argv; - vmlet_main_t func = arg->func; - free(arg); -#ifndef MULTIPLE_GC - Collector::inject_my_thread(&argc); - func(argc, argv); - Collector::remove_my_thread(); - Collector::collect(); -#else - Collector* GC = Collector::allocate(); - GC->inject_my_thread(&argc); - func(argc, argv); - GC->remove_my_thread(); - GC->collect(); -#endif - return 0; -} - -void CommandLine::executeInstr() { - if (!strcmp(argv[0], "load")) { - char* buf = (char*)alloca(sizeof(argv[1]) + 7); - sprintf(buf, "lib%s.so", argv[1]); - void* handle = dlopen(buf, RTLD_LAZY | RTLD_GLOBAL); - if (handle == 0) { - fprintf(stderr, "\t Unable to load %s\n", argv[1]); - printf("\t error = %s\n", dlerror()); - return; - } - - boot_t func = (boot_t)(intptr_t)dlsym(handle, "boot"); - - if (func == 0) { - fprintf(stderr, "\t Unable to find %s boot method\n", argv[1]); - dlclose(handle); - return; - } - func(); - - vmlet_main_t vmlet = (vmlet_main_t)(intptr_t)dlsym(handle, "start_app"); - - vmlets[argv[1]] = vmlet; - - } else { - vmlet_main_t func = vmlets[argv[0]]; - if (!func) { - fprintf(stderr, "\t Unknown vmlet %s\n", argv[0]); - } else { -#if 0 - thread_arg_t* thread_arg = (thread_arg_t*)malloc(sizeof (thread_arg_t)); - thread_arg->argc = argc; - thread_arg->argv = argv; - thread_arg->func = func; - int tid = 0; - Thread::start(&tid, (int (*)(void *))startApp, thread_arg); -#else - func(argc, argv); -#endif - } - } -} Removed: vmkit/trunk/lib/Mvm/CommandLine.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/CommandLine.h?rev=54632&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/CommandLine.h (original) +++ vmkit/trunk/lib/Mvm/CommandLine.h (removed) @@ -1,57 +0,0 @@ -//===--------- CommandLine.h - Parses the command line --------------------===// -// -// The Micro Virtual Machine -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef COMMAND_LINE_H -#define COMMAND_LINE_H - -#include - -#include - -namespace mvm { - -typedef int (*vmlet_main_t)(int argc, char** argv); - -struct ltstr -{ - bool operator()(const char* s1, const char* s2) const - { - return strcmp(s1, s2) < 0; - } -}; - -class CommandLine { -public: - char** argv; - unsigned argc; - unsigned argcMax; - - char* _yytext; - unsigned _yylen; - unsigned _yylenMax; - char _yyChar; - - std::map vmlets; - - CommandLine(); - - void appendChar(char c); - void appendString(char* str); - - void start(); - void executeInstr(); - - void resetArgv(); - void resetString(); - -}; - -} // end namespace mvm - -#endif // COMMAND_LINE_H Removed: vmkit/trunk/lib/Mvm/Disassembler.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Disassembler.cpp?rev=54632&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/Disassembler.cpp (original) +++ vmkit/trunk/lib/Mvm/Disassembler.cpp (removed) @@ -1,91 +0,0 @@ -//===--------- Disassembler.cc - Intefarce to disassembler ----------------===// -// -// Micro Virtual Machine -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "mvm/JIT.h" - -#ifdef HAVE_DISASSEMBLER - -#if defined(__PPC__) -extern "C" -{ -# include -# include -} - - - -static struct disassemble_info info; -static int initialised= 0; - -// this is the only function exported from this file - -int mvm::jit::disassemble(unsigned int *addr) -{ - - if (!initialised) - { - INIT_DISASSEMBLE_INFO(info, stdout, fprintf); - info.flavour= bfd_target_elf_flavour; - info.arch= bfd_arch_powerpc; - info.mach= bfd_mach_ppc_750; // generic(ish) == PPC G3 - info.endian= BFD_ENDIAN_BIG; - info.buffer_length= 65536; - } - info.buffer= (bfd_byte *)addr; - info.buffer_vma= (bfd_vma)(long)addr; - return print_insn_big_powerpc((bfd_vma)(long)addr, &info); - -} - -#elif defined(__i386__) -extern "C" -{ -# include // bfd types -# include // disassemble_info - int print_insn_i386_att(bfd_vma, disassemble_info *); -} - - -static struct disassemble_info info; -static int initialised= 0; - - -int mvm::jit::disassemble(unsigned int *addr) -{ - if (!initialised) - { - INIT_DISASSEMBLE_INFO(info, stdout, fprintf); - info.flavour= bfd_target_elf_flavour; - info.arch= bfd_arch_i386; - info.mach= bfd_mach_i386_i386; - info.endian= BFD_ENDIAN_LITTLE; - info.buffer_length= 65536; - } - info.buffer= (bfd_byte *)addr; - info.buffer_vma= (bfd_vma)(long)addr; - return print_insn_i386_att((bfd_vma)(long)addr, &info); -} - -#else - -int mvm::jit::disassemble(unsigned int* addr) { - return 0; -} - -#endif - -#else - -int mvm::jit::disassemble(unsigned int* addr) { - return 0; -} - -#endif - - Removed: vmkit/trunk/lib/Mvm/EscapeAnalysis.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/EscapeAnalysis.cpp?rev=54632&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/EscapeAnalysis.cpp (original) +++ vmkit/trunk/lib/Mvm/EscapeAnalysis.cpp (removed) @@ -1,137 +0,0 @@ -//===------EscapeAnalysis.cpp - Simple LLVM escape analysis ---------------===// -// -// The Micro Virtual Machine -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - - -#include "llvm/Constants.h" -#include "llvm/Pass.h" -#include "llvm/Function.h" -#include "llvm/Instructions.h" -#include "llvm/Support/Compiler.h" -#include "llvm/Support/Debug.h" - -#include - -#include "mvm/GC/GC.h" - -using namespace llvm; - -namespace { - - class VISIBILITY_HIDDEN EscapeAnalysis : public FunctionPass { - public: - static char ID; - EscapeAnalysis(Function* alloc = 0) : - FunctionPass((intptr_t)&ID) { - Allocator = alloc; - } - - virtual bool runOnFunction(Function &F); - private: - Function* Allocator; - bool processMalloc(Instruction* I, Value* Size, Value* VT); - }; - char EscapeAnalysis::ID = 0; - RegisterPass X("EscapeAnalysis", "Escape Analysis Pass"); - -bool EscapeAnalysis::runOnFunction(Function& F) { - bool Changed = false; - for (Function::iterator BI = F.begin(), BE = F.end(); BI != BE; BI++) { - BasicBlock *Cur = BI; - - for (BasicBlock::iterator II = Cur->begin(), IE = Cur->end(); II != IE;) { - Instruction *I = II; - II++; - if (CallInst *CI = dyn_cast(I)) { - if (CI->getOperand(0) == Allocator) { - Changed |= processMalloc(CI, CI->getOperand(1), CI->getOperand(2)); - } - } else if (InvokeInst *CI = dyn_cast(I)) { - if (CI->getOperand(0) == Allocator) { - Changed |= processMalloc(CI, CI->getOperand(3), CI->getOperand(4)); - } - } - } - } - return Changed; -} - - - - -static bool escapes(Instruction* Ins, std::map& visited) { - for (Value::use_iterator I = Ins->use_begin(), E = Ins->use_end(); - I != E; ++I) { - if (Instruction* II = dyn_cast(I)) { - if (dyn_cast(II)) return true; - else if (dyn_cast(II)) return true; - else if (dyn_cast(II)) { - if (escapes(II, visited)) return true; - } - else if (StoreInst* SI = dyn_cast(II)) { - if (AllocaInst * AI = dyn_cast(SI->getOperand(1))) { - if (!visited[AI]) { - visited[AI] = true; - if (escapes(AI, visited)) return true; - } - } else if (SI->getOperand(0) == Ins) { - return true; - } - } - else if (dyn_cast(II)) { - if (isa(II->getType())) { - if (escapes(II, visited)) return true; // allocas - } - } - else if (dyn_cast(II)) { - if (escapes(II, visited)) return true; - } - else if (dyn_cast(II)) return true; - else if (dyn_cast(II)) { - if (!visited[II]) { - visited[II] = true; - if (escapes(II, visited)) return true; - } - } - } else { - return true; - } - } - return false; -} - -bool EscapeAnalysis::processMalloc(Instruction* I, Value* Size, Value* VT) { - Instruction* Alloc = I; - - ConstantExpr* CE = dyn_cast(VT); - if (CE) { - ConstantInt* C = (ConstantInt*)CE->getOperand(0); - VirtualTable* Table = (VirtualTable*)C->getZExtValue(); - // If the class has a finalize method, do not stack allocate the object - if (!((void**)Table)[0]) { - std::map visited; - if (!(escapes(Alloc, visited))) { - AllocaInst* AI = new AllocaInst(Type::Int8Ty, Size, "", Alloc); - BitCastInst* BI = new BitCastInst(AI, Alloc->getType(), "", Alloc); - DOUT << "escape" << Alloc->getParent()->getParent()->getName() << "\n"; - Alloc->replaceAllUsesWith(BI); - Alloc->eraseFromParent(); - return true; - } - } - } - return false; -} -} - -namespace mvm { -FunctionPass* createEscapeAnalysisPass(llvm::Function* alloc) { - - return new EscapeAnalysis(alloc); -} -} Removed: vmkit/trunk/lib/Mvm/JIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/JIT.cpp?rev=54632&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/JIT.cpp (original) +++ vmkit/trunk/lib/Mvm/JIT.cpp (removed) @@ -1,612 +0,0 @@ -//===---------------- JIT.cc - Initialize the JIT -------------------------===// -// -// The Micro Virtual Machine -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include - -#include -#include -#include -#include "llvm/Support/MutexGuard.h" -#include "llvm/Target/TargetOptions.h" - -#include - -#include "mvm/JIT.h" -#include "mvm/Method.h" -#include "mvm/MvmMemoryManager.h" -#include "mvm/Object.h" -#include "mvm/Threads/Thread.h" - -using namespace mvm; -using namespace mvm::jit; -using namespace llvm; - - -extern "C" void printFloat(float f) { - printf("%f\n", f); -} - -extern "C" void printDouble(double d) { - printf("%f\n", d); -} - -extern "C" void printLong(sint64 l) { - printf("%lld\n", l); -} - -extern "C" void printInt(sint32 i) { - printf("%d\n", i); -} - -extern "C" void printObject(mvm::Object* obj) { - printf("%s\n", obj->printString()); -} - -static void initialiseTypes(llvm::Module* mod) { - { - // llvm::Type Definitions - std::vectorStructTy_struct_NativeString_fields; - StructTy_struct_NativeString_fields.push_back(IntegerType::get(8)); - StructType* StructTy_struct_NativeString = - StructType::get(StructTy_struct_NativeString_fields, /*isPacked=*/true); - mod->addTypeName("struct.mvm::NativeString", StructTy_struct_NativeString); - - mod->addTypeName("struct.mvm::Object", StructTy_struct_NativeString); - mod->addTypeName("struct.mvm::Thread", StructTy_struct_NativeString); - - std::vectorStructTy_struct_PrintBuffer_fields; - StructTy_struct_PrintBuffer_fields.push_back(IntegerType::get(32)); - StructTy_struct_PrintBuffer_fields.push_back(IntegerType::get(32)); - PointerType* PointerTy_0 = PointerType::getUnqual(StructTy_struct_NativeString); - - StructTy_struct_PrintBuffer_fields.push_back(PointerTy_0); - StructType* StructTy_struct_PrintBuffer = - StructType::get(StructTy_struct_PrintBuffer_fields, /*isPacked=*/false); - mod->addTypeName("struct.mvm::PrintBuffer", StructTy_struct_PrintBuffer); - - std::vectorStructTy_struct_VirtualTable_fields; - std::vectorStructTy_struct_gc_vt_fields; - std::vectorFuncTy_2_args; - FuncTy_2_args.push_back(PointerTy_0); - FuncTy_2_args.push_back(IntegerType::get(32)); - FunctionType* FuncTy_2 = FunctionType::get( - /*Result=*/llvm::Type::VoidTy, - /*Params=*/FuncTy_2_args, - /*isVarArg=*/false); - - PointerType* PointerTy_1 = PointerType::getUnqual(FuncTy_2); - - StructTy_struct_gc_vt_fields.push_back(PointerTy_1); - StructTy_struct_gc_vt_fields.push_back(PointerTy_1); - StructType* StructTy_struct_gc_vt = - StructType::get(StructTy_struct_gc_vt_fields, /*isPacked=*/false); - mod->addTypeName("struct.mvm::gc_vt", StructTy_struct_gc_vt); - - StructTy_struct_VirtualTable_fields.push_back(PointerTy_1); - StructTy_struct_VirtualTable_fields.push_back(PointerTy_1); - std::vectorFuncTy_4_args; - FuncTy_4_args.push_back(PointerTy_0); - PointerType* PointerTy_5 = PointerType::getUnqual(StructTy_struct_PrintBuffer); - - FuncTy_4_args.push_back(PointerTy_5); - FunctionType* FuncTy_4 = FunctionType::get( - /*Result=*/llvm::Type::VoidTy, - /*Params=*/FuncTy_4_args, - /*isVarArg=*/false); - - PointerType* PointerTy_3 = PointerType::getUnqual(FuncTy_4); - - StructTy_struct_VirtualTable_fields.push_back(PointerTy_3); - std::vectorFuncTy_7_args; - FuncTy_7_args.push_back(PointerTy_0); - FunctionType* FuncTy_7 = FunctionType::get( - /*Result=*/IntegerType::get(32), - /*Params=*/FuncTy_7_args, - /*isVarArg=*/false); - - PointerType* PointerTy_6 = PointerType::getUnqual(FuncTy_7); - - StructTy_struct_VirtualTable_fields.push_back(PointerTy_6); - StructTy_struct_VirtualTable_fields.push_back(IntegerType::get(32)); - OpaqueType* OpaqueTy_struct_llvm__Type = OpaqueType::get(); - mod->addTypeName("struct.llvm::Type", OpaqueTy_struct_llvm__Type); - - PointerType* PointerTy_8 = PointerType::getUnqual(OpaqueTy_struct_llvm__Type); - - StructTy_struct_VirtualTable_fields.push_back(PointerTy_8); - StructType* StructTy_struct_VirtualTable = - StructType::get(StructTy_struct_VirtualTable_fields, /*isPacked=*/false); - mod->addTypeName("struct.mvm::VirtualTable", StructTy_struct_VirtualTable); - - mod->addTypeName("struct.mvm::gc_vt", StructTy_struct_gc_vt); - mod->addTypeName("struct.llvm::Type", OpaqueTy_struct_llvm__Type); - } - - - - { - // Lock llvm::Type Definitions - std::vectorStructTy_struct_mvm__Lock_fields; - std::vectorStructTy_struct_mvm__SpinLock_fields; - StructTy_struct_mvm__SpinLock_fields.push_back(IntegerType::get(32)); - StructType* StructTy_struct_mvm__SpinLock = - StructType::get(StructTy_struct_mvm__SpinLock_fields, /*isPacked=*/false); - mod->addTypeName("struct.mvm::SpinLock", StructTy_struct_mvm__SpinLock); - - StructTy_struct_mvm__Lock_fields.push_back(StructTy_struct_mvm__SpinLock); - std::vectorFuncTy_1_args; - PATypeHolder StructTy_struct_mvm__Lock_fwd = OpaqueType::get(); - PointerType* PointerTy_2 = PointerType::getUnqual(StructTy_struct_mvm__Lock_fwd); - - FuncTy_1_args.push_back(PointerTy_2); - FunctionType* FuncTy_1 = FunctionType::get( - /*Result=*/llvm::Type::VoidTy, - /*Params=*/FuncTy_1_args, - /*isVarArg=*/false); - - PointerType* PointerTy_0 = PointerType::getUnqual(FuncTy_1); - - StructTy_struct_mvm__Lock_fields.push_back(PointerTy_0); - StructTy_struct_mvm__Lock_fields.push_back(PointerTy_0); - std::vectorFuncTy_4_args; - FuncTy_4_args.push_back(PointerTy_2); - FunctionType* FuncTy_4 = FunctionType::get( - /*Result=*/IntegerType::get(32), - /*Params=*/FuncTy_4_args, - /*isVarArg=*/false); - - PointerType* PointerTy_3 = PointerType::getUnqual(FuncTy_4); - - StructTy_struct_mvm__Lock_fields.push_back(PointerTy_3); - StructTy_struct_mvm__Lock_fields.push_back(IntegerType::get(32)); - StructType* StructTy_struct_mvm__Lock = - StructType::get(StructTy_struct_mvm__Lock_fields, /*isPacked=*/false); - mod->addTypeName("struct.mvm::Lock", StructTy_struct_mvm__Lock); - mod->addTypeName("struct.mvm::LockNormal", StructTy_struct_mvm__Lock); - cast(StructTy_struct_mvm__Lock_fwd.get())-> - refineAbstractTypeTo(StructTy_struct_mvm__Lock); - StructTy_struct_mvm__Lock = - cast(StructTy_struct_mvm__Lock_fwd.get()); - - - std::vectorStructTy_struct_mvm__LockRecursive_fields; - StructTy_struct_mvm__LockRecursive_fields.push_back(StructTy_struct_mvm__Lock); - StructTy_struct_mvm__LockRecursive_fields.push_back(IntegerType::get(32)); - StructType* StructTy_struct_mvm__LockRecursive = - StructType::get(StructTy_struct_mvm__LockRecursive_fields, - /*isPacked=*/false); - mod->addTypeName("struct.mvm::LockRecursive", - StructTy_struct_mvm__LockRecursive); - - std::vectorStructTy_struct_mvm__Object_fields; - StructTy_struct_mvm__Object_fields.push_back(IntegerType::get(8)); - StructType* StructTy_struct_mvm__Object = - StructType::get(StructTy_struct_mvm__Object_fields, /*isPacked=*/true); - mod->addTypeName("struct.mvm::Object", StructTy_struct_mvm__Object); - - mod->addTypeName("struct.mvm::SpinLock", StructTy_struct_mvm__SpinLock); - - - // llvm::Type definition of Cond and CollectableArea - std::vectorStructTy_struct_collectablearea_fields; - StructTy_struct_collectablearea_fields.push_back(IntegerType::get(32)); - StructTy_struct_collectablearea_fields.push_back(IntegerType::get(32)); - StructTy_struct_collectablearea_fields.push_back(IntegerType::get(32)); - StructType* StructTy_struct_collectablearea = - StructType::get(StructTy_struct_collectablearea_fields, /*isPacked=*/false); - mod->addTypeName("struct.mvm::Cond", StructTy_struct_collectablearea); - mod->addTypeName("struct.mvm::CollectableArea", StructTy_struct_collectablearea); - } - - // llvm::Type Definitions of Key - std::vectorStructTy_struct_Key_fields; - PointerType* PointerTy_0 = PointerType::getUnqual(IntegerType::get(8)); - - StructTy_struct_Key_fields.push_back(PointerTy_0); - StructType* StructTy_struct_Key = - StructType::get(StructTy_struct_Key_fields, /*isPacked=*/false); - mod->addTypeName("struct.mvm::ThreadKey", StructTy_struct_Key); - - // TODO - mod->addTypeName("struct.mvm::Method", StructTy_struct_Key); - mod->addTypeName("struct.mvm::Code", StructTy_struct_Key); - -} - -extern "C" void __register_frame(void*); - -void mvm::jit::initialise() { - llvm::NoFramePointerElim = true; - llvm::ExceptionHandling = true; - llvm::Module *module = jit::globalModule = new llvm::Module ("microvm"); - jit::globalModuleProvider = new llvm::ExistingModuleProvider (jit::globalModule); - jit::memoryManager = new MvmMemoryManager(); - - initialiseTypes(globalModule); - - executionEngine = llvm::ExecutionEngine::createJIT(jit::globalModuleProvider, 0, jit::memoryManager); - executionEngine->InstallExceptionTableRegister(__register_frame); - module->setDataLayout(mvm::jit::executionEngine->getTargetData()->getStringRepresentation()); - - ptrType = PointerType::getUnqual(Type::Int8Ty); - ptr32Type = PointerType::getUnqual(Type::Int32Ty); - ptrPtrType = PointerType::getUnqual(ptrType); - - Intrinsic::getDeclaration(module, Intrinsic::vastart); - Intrinsic::getDeclaration(module, Intrinsic::frameaddress); - - std::vector args; - - const llvm::Type *BPTy = ptrType; - // Prototype malloc as "char* malloc(...)", because we don't know in - // doInitialization whether size_t is int or long. - FunctionType *FT = FunctionType::get(BPTy, args, true); - llvm::Function::Create(FT, llvm::GlobalValue::ExternalLinkage, - "_ZN2gcnwEjP5gc_vt", module); - - // Create printFloatLLVM - args.push_back(Type::FloatTy); - const FunctionType* type = FunctionType::get(Type::VoidTy, args, false); - printFloatLLVM = Function::Create(type, GlobalValue::ExternalLinkage, - "printFloat", module); - args.clear(); - - // Create printDoubleLLVM - args.push_back(Type::DoubleTy); - type = FunctionType::get(Type::VoidTy, args, false); - printDoubleLLVM = Function::Create(type, GlobalValue::ExternalLinkage, - "printDouble", module); - args.clear(); - - // Create printLongLLVM - args.push_back(Type::Int64Ty); - type = FunctionType::get(Type::VoidTy, args, false); - printLongLLVM = Function::Create(type, GlobalValue::ExternalLinkage, - "printLong", module); - args.clear(); - - // Create printIntLLVM - args.push_back(Type::Int32Ty); - type = FunctionType::get(Type::VoidTy, args, false); - printIntLLVM = Function::Create(type, GlobalValue::ExternalLinkage, - "printInt", module); - args.clear(); - - // Create printObjectLLVM - args.push_back(ptrType); - type = FunctionType::get(Type::VoidTy, args, false); - printObjectLLVM = Function::Create(type, GlobalValue::ExternalLinkage, - "printObject", module); - args.clear(); - - args.push_back(ptrType); - type = FunctionType::get( - /*Result=*/Type::VoidTy, - /*Params=*/args, - /*isVarArg=*/false); - unwindResume = Function::Create( - /*Type=*/type, - /*Linkage=*/GlobalValue::ExternalLinkage, - /*Name=*/"_Unwind_Resume_or_Rethrow", module); // (external, no body) - args.clear(); - - llvmGetException = Intrinsic::getDeclaration(module, Intrinsic::eh_exception); - exceptionSelector = sizeof(void*) == 4 ? - Intrinsic::getDeclaration(module, Intrinsic::eh_selector_i32) : - Intrinsic::getDeclaration(module, Intrinsic::eh_selector_i64); - - type = FunctionType::get( - /*Result=*/Type::VoidTy, - /*Params=*/args, - /*isVarArg=*/false); - personality = Function::Create( - /*Type=*/type, - /*Linkage=*/GlobalValue::ExternalLinkage, - /*Name=*/"__gxx_personality_v0", module); // (external, no body) - exceptionEndCatch = Function::Create( - /*Type=*/type, - /*Linkage=*/GlobalValue::ExternalLinkage, - /*Name=*/"__cxa_end_catch", module); // (external, no body) - - args.push_back(ptrType); - type = FunctionType::get( - /*Result=*/ptrType, - /*Params=*/args, - /*isVarArg=*/false); - exceptionBeginCatch = Function::Create( - /*Type=*/type, - /*Linkage=*/GlobalValue::ExternalLinkage, - /*Name=*/"__cxa_begin_catch", module); // (external, no body) - args.clear(); - - // Math function - args.push_back(Type::DoubleTy); - type = FunctionType::get( - /*Result=*/Type::DoubleTy, - /*Params=*/args, - /*isVarArg=*/false); - args.clear(); - - func_llvm_sqrt_f64 = Intrinsic::getDeclaration(module, Intrinsic::sqrt, - &Type::DoubleTy, 1); - func_llvm_sin_f64 = Intrinsic::getDeclaration(module, Intrinsic::sin, - &Type::DoubleTy, 1); - func_llvm_cos_f64 = Intrinsic::getDeclaration(module, Intrinsic::cos, - &Type::DoubleTy, 1); - - func_llvm_tan_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "tan", module); - func_llvm_asin_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "asin", module); - func_llvm_acos_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "acos", module); - func_llvm_atan_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "atan", module); - func_llvm_exp_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "exp", module); - func_llvm_log_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "log", module); - func_llvm_ceil_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "ceil", module); - func_llvm_floor_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "floor", module); - func_llvm_cbrt_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "cbrt", module); - func_llvm_cosh_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "cosh", module); - func_llvm_expm1_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "expm1", module); - func_llvm_log10_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "log10", module); - func_llvm_log1p_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "log1p", module); - func_llvm_sinh_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "sinh", module); - func_llvm_tanh_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "tanh", module); - func_llvm_fabs_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "fabs", module); - func_llvm_rint_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "rint", module); - - args.push_back(Type::DoubleTy); - args.push_back(Type::DoubleTy); - type = FunctionType::get( - /*Result=*/Type::DoubleTy, - /*Params=*/args, - /*isVarArg=*/false); - args.clear(); - - func_llvm_hypot_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "hypot", module); - //func_llvm_pow_f64 = Function::Create(FuncTy2, GlobalValue::ExternalLinkage, "llvm.pow.f64", module); - func_llvm_pow_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "pow", module); - func_llvm_atan2_f64 = Function::Create(type, GlobalValue::ExternalLinkage, - "atan2", module); - - args.push_back(Type::FloatTy); - type = FunctionType::get( - /*Result=*/Type::FloatTy, - /*Params=*/args, - /*isVarArg=*/false); - args.clear(); - - func_llvm_fabs_f32 = Function::Create(type, GlobalValue::ExternalLinkage, - "fabsf", module); - - // Create setjmp - args.push_back(ptrType); - type = FunctionType::get(Type::Int32Ty, args, false); - setjmpLLVM = Function::Create(type, GlobalValue::ExternalLinkage, - "setjmp", module); - - /* Create memcpy */ - llvm_memcpy_i32 = Intrinsic::getDeclaration(module, Intrinsic::memcpy_i32); - - /* Create memset */ - llvm_memset_i32 = Intrinsic::getDeclaration(module, Intrinsic::memset_i32); - - /* Create atomic cas i32 */ - const Type* i32 = Type::Int32Ty; - llvm_atomic_lcs_i32 = Intrinsic::getDeclaration(module, - Intrinsic::atomic_cmp_swap, - &i32, 1); - - // Constant declaration - constantLongMinusOne = ConstantInt::get(Type::Int64Ty, (uint64_t)-1); - constantLongZero = ConstantInt::get(Type::Int64Ty, 0); - constantLongOne = ConstantInt::get(Type::Int64Ty, 1); - constantZero = ConstantInt::get(Type::Int32Ty, 0); - constantInt8Zero = ConstantInt::get(Type::Int8Ty, 0); - constantOne = ConstantInt::get(Type::Int32Ty, 1); - constantTwo = ConstantInt::get(Type::Int32Ty, 2); - constantThree = ConstantInt::get(Type::Int32Ty, 3); - constantFour = ConstantInt::get(Type::Int32Ty, 4); - constantFive = ConstantInt::get(Type::Int32Ty, 5); - constantSix = ConstantInt::get(Type::Int32Ty, 6); - constantSeven = ConstantInt::get(Type::Int32Ty, 7); - constantEight = ConstantInt::get(Type::Int32Ty, 8); - constantMinusOne = ConstantInt::get(Type::Int32Ty, (uint64_t)-1); - constantMinInt = ConstantInt::get(Type::Int32Ty, MinInt); - constantMaxInt = ConstantInt::get(Type::Int32Ty, MaxInt); - constantMinLong = ConstantInt::get(Type::Int64Ty, MinLong); - constantMaxLong = ConstantInt::get(Type::Int64Ty, MaxLong); - constantFloatZero = ConstantFP::get(Type::FloatTy, 0.0f); - constantFloatOne = ConstantFP::get(Type::FloatTy, 1.0f); - constantFloatTwo = ConstantFP::get(Type::FloatTy, 2.0f); - constantDoubleZero = ConstantFP::get(Type::DoubleTy, 0.0); - constantDoubleOne = ConstantFP::get(Type::DoubleTy, 1.0); - constantMaxIntFloat = ConstantFP::get(Type::FloatTy, MaxIntFloat); - constantMinIntFloat = ConstantFP::get(Type::FloatTy, MinIntFloat); - constantMinLongFloat = ConstantFP::get(Type::FloatTy, MinLongFloat); - constantMinLongDouble = ConstantFP::get(Type::DoubleTy, MinLongDouble); - constantMaxLongFloat = ConstantFP::get(Type::FloatTy, MaxLongFloat); - constantMaxIntDouble = ConstantFP::get(Type::DoubleTy, MaxIntDouble); - constantMinIntDouble = ConstantFP::get(Type::DoubleTy, MinIntDouble); - constantMaxLongDouble = ConstantFP::get(Type::DoubleTy, MaxLongDouble); - constantMaxLongDouble = ConstantFP::get(Type::DoubleTy, MaxLongDouble); - constantFloatInfinity = ConstantFP::get(Type::FloatTy, MaxFloat); - constantFloatMinusInfinity = ConstantFP::get(Type::FloatTy, MinFloat); - constantDoubleInfinity = ConstantFP::get(Type::DoubleTy, MaxDouble); - constantDoubleMinusInfinity = ConstantFP::get(Type::DoubleTy, MinDouble); - constantDoubleMinusZero = ConstantFP::get(Type::DoubleTy, -0.0); - constantFloatMinusZero = ConstantFP::get(Type::FloatTy, -0.0f); - - constantPtrNull = Constant::getNullValue(ptrType); - constantPtrSize = ConstantInt::get(Type::Int32Ty, sizeof(void*)); - arrayPtrType = PointerType::getUnqual(ArrayType::get(Type::Int8Ty, 0)); - - mvm::jit::protectEngine = mvm::Lock::allocNormal(); -} - -llvm::Function* mvm::jit::llvm_memcpy_i32; -llvm::Function* mvm::jit::llvm_memset_i32; - -llvm::Function* mvm::jit::llvm_atomic_lcs_i32; - -llvm::Function* mvm::jit::exceptionEndCatch; -llvm::Function* mvm::jit::exceptionBeginCatch; -llvm::Function* mvm::jit::unwindResume; -llvm::Function* mvm::jit::exceptionSelector; -llvm::Function* mvm::jit::personality; -llvm::Function* mvm::jit::llvmGetException; - -llvm::Function* mvm::jit::printFloatLLVM; -llvm::Function* mvm::jit::printDoubleLLVM; -llvm::Function* mvm::jit::printLongLLVM; -llvm::Function* mvm::jit::printIntLLVM; -llvm::Function* mvm::jit::printObjectLLVM; - -llvm::Function* mvm::jit::setjmpLLVM; - -llvm::Function* mvm::jit::func_llvm_fabs_f32; -llvm::Function* mvm::jit::func_llvm_fabs_f64; -llvm::Function* mvm::jit::func_llvm_sqrt_f64; -llvm::Function* mvm::jit::func_llvm_sin_f64; -llvm::Function* mvm::jit::func_llvm_cos_f64; -llvm::Function* mvm::jit::func_llvm_tan_f64; -llvm::Function* mvm::jit::func_llvm_asin_f64; -llvm::Function* mvm::jit::func_llvm_acos_f64; -llvm::Function* mvm::jit::func_llvm_atan_f64; -llvm::Function* mvm::jit::func_llvm_atan2_f64; -llvm::Function* mvm::jit::func_llvm_exp_f64; -llvm::Function* mvm::jit::func_llvm_log_f64; -llvm::Function* mvm::jit::func_llvm_pow_f64; -llvm::Function* mvm::jit::func_llvm_ceil_f64; -llvm::Function* mvm::jit::func_llvm_floor_f64; -llvm::Function* mvm::jit::func_llvm_rint_f64; -llvm::Function* mvm::jit::func_llvm_cbrt_f64; -llvm::Function* mvm::jit::func_llvm_cosh_f64; -llvm::Function* mvm::jit::func_llvm_expm1_f64; -llvm::Function* mvm::jit::func_llvm_hypot_f64; -llvm::Function* mvm::jit::func_llvm_log10_f64; -llvm::Function* mvm::jit::func_llvm_log1p_f64; -llvm::Function* mvm::jit::func_llvm_sinh_f64; -llvm::Function* mvm::jit::func_llvm_tanh_f64; - -llvm::ExecutionEngine* mvm::jit::executionEngine; - -mvm::Lock* mvm::jit::protectEngine; -llvm::ConstantInt* mvm::jit::constantInt8Zero; -llvm::ConstantInt* mvm::jit::constantZero; -llvm::ConstantInt* mvm::jit::constantOne; -llvm::ConstantInt* mvm::jit::constantTwo; -llvm::ConstantInt* mvm::jit::constantThree; -llvm::ConstantInt* mvm::jit::constantFour; -llvm::ConstantInt* mvm::jit::constantFive; -llvm::ConstantInt* mvm::jit::constantSix; -llvm::ConstantInt* mvm::jit::constantSeven; -llvm::ConstantInt* mvm::jit::constantEight; -llvm::ConstantInt* mvm::jit::constantMinusOne; -llvm::ConstantInt* mvm::jit::constantLongMinusOne; -llvm::ConstantInt* mvm::jit::constantLongZero; -llvm::ConstantInt* mvm::jit::constantLongOne; -llvm::ConstantInt* mvm::jit::constantMinInt; -llvm::ConstantInt* mvm::jit::constantMaxInt; -llvm::ConstantInt* mvm::jit::constantMinLong; -llvm::ConstantInt* mvm::jit::constantMaxLong; -llvm::ConstantFP* mvm::jit::constantFloatZero; -llvm::ConstantFP* mvm::jit::constantFloatOne; -llvm::ConstantFP* mvm::jit::constantFloatTwo; -llvm::ConstantFP* mvm::jit::constantDoubleZero; -llvm::ConstantFP* mvm::jit::constantDoubleOne; -llvm::ConstantFP* mvm::jit::constantMaxIntFloat; -llvm::ConstantFP* mvm::jit::constantMinIntFloat; -llvm::ConstantFP* mvm::jit::constantMinLongFloat; -llvm::ConstantFP* mvm::jit::constantMinLongDouble; -llvm::ConstantFP* mvm::jit::constantMaxLongFloat; -llvm::ConstantFP* mvm::jit::constantMaxIntDouble; -llvm::ConstantFP* mvm::jit::constantMinIntDouble; -llvm::ConstantFP* mvm::jit::constantMaxLongDouble; -llvm::ConstantFP* mvm::jit::constantDoubleInfinity; -llvm::ConstantFP* mvm::jit::constantDoubleMinusInfinity; -llvm::ConstantFP* mvm::jit::constantFloatInfinity; -llvm::ConstantFP* mvm::jit::constantFloatMinusInfinity; -llvm::ConstantFP* mvm::jit::constantFloatMinusZero; -llvm::ConstantFP* mvm::jit::constantDoubleMinusZero; -llvm::Constant* mvm::jit::constantPtrNull; -llvm::ConstantInt* mvm::jit::constantPtrSize; -const llvm::PointerType* mvm::jit::ptrType; -const llvm::PointerType* mvm::jit::ptr32Type; -const llvm::PointerType* mvm::jit::ptrPtrType; -const llvm::Type* mvm::jit::arrayPtrType; - -llvm::Module *mvm::jit::globalModule; -llvm::ExistingModuleProvider *mvm::jit::globalModuleProvider; -mvm::MvmMemoryManager *mvm::jit::memoryManager; - - -uint64 mvm::jit::getTypeSize(const llvm::Type* type) { - return executionEngine->getTargetData()->getABITypeSize(type); -} - -void mvm::jit::runPasses(llvm::Function* func, llvm::FunctionPassManager* pm) { - pm->run(*func); -} - -#if defined(__MACH__) && !defined(__i386__) -#define FRAME_IP(fp) (fp[2]) -#else -#define FRAME_IP(fp) (fp[1]) -#endif - -int mvm::jit::getBacktrace(void** stack, int size) { - void** blah = (void**)__builtin_frame_address(1); - int cpt = 0; - void* baseSP = mvm::Thread::get()->baseSP; - while (blah && cpt < size && blah < baseSP) { - stack[cpt++] = (void**)FRAME_IP(blah); - blah = (void**)blah[0]; - } - return cpt; -} - -LockNormal lock; -std::map pointerMap; - -Code* mvm::jit::getCodeFromPointer(void* Addr) { - lock.lock(); - std::map::iterator I = - pointerMap.lower_bound(Addr); - - lock.unlock(); - if (I != pointerMap.end()) { - Code* m = I->second; - if (Addr >= m->FunctionStart) return m; - } - - return 0; -} - -void mvm::jit::addMethodInfo(void* Addr, Code* C) { - lock.lock(); - pointerMap.insert(std::make_pair(Addr, C)); - lock.unlock(); -} Added: vmkit/trunk/lib/Mvm/LLVMRuntime/LLVMRuntime.ll URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/LLVMRuntime/LLVMRuntime.ll?rev=54633&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/LLVMRuntime/LLVMRuntime.ll (added) +++ vmkit/trunk/lib/Mvm/LLVMRuntime/LLVMRuntime.ll Mon Aug 11 02:20:00 2008 @@ -0,0 +1,95 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Printing functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +declare void @printFloat(float) +declare void @printDouble(double) +declare void @printLong(i64) +declare void @printInt(i32) +declare void @printObject(i8*) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Exceptions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +declare void @_Unwind_Resume_or_Rethrow(i8*) +declare i8* @llvm.eh.exception() +declare i32 @llvm.eh.selector.i32(i8*, i8*, i8*, ...) +declare i64 @llvm.eh.selector.i64(i8*, i8*, i8*, ...) +declare void @__gxx_personality_v0() +declare i8* @__cxa_begin_catch(i8*) +declare void @__cxa_end_catch() +declare i32 @setjmp(i8*) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Math ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +declare double @llvm.sqrt.f64(double) +declare double @llvm.sin.f64(double) +declare double @llvm.cos.f64(double) +declare double @tan(double) +declare double @asin(double) +declare double @acos(double) +declare double @atan(double) +declare double @exp(double) +declare double @log(double) +declare double @ceil(double) +declare double @floor(double) +declare double @cbrt(double) +declare double @cosh(double) +declare double @expm1(double) +declare double @log10(double) +declare double @log1p(double) +declare double @sinh(double) +declare double @tanh(double) +declare double @fabs(double) +declare double @rint(double) +declare double @hypot(double, double) +declare double @pow(double, double) +declare double @atan2(double, double) +declare float @fabsf(float) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Memory ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +declare void @llvm.memcpy.i32(i8 *, i8 *, i32, i32) +declare void @llvm.memset.i32(i8 *, i8 *, i32, i32) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Atomic ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +declare i8 @llvm.atomic.cmp.swap.i8.p0i8(i8*, i8, i8) +declare i16 @llvm.atomic.cmp.swap.i16.p0i16(i16*, i16, i16) +declare i32 @llvm.atomic.cmp.swap.i32.p0i32(i32*, i32, i32) +declare i64 @llvm.atomic.cmp.swap.i64.p0i64(i64*, i64, i64) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;Helper functions for gcc < 4.2 ;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +define i8 @runtime.llvm.atomic.cmp.swap.i8(i8* %ptr, i8 %cmp, i8 %swap) +nounwind { + %A = call i8 @llvm.atomic.cmp.swap.i8.p0i8( i8* %ptr, i8 %cmp, i8 %swap) + ret i8 %A +} + +define i16 @runtime.llvm.atomic.cmp.swap.i16(i16* %ptr, i16 %cmp, i16 %swap) +nounwind { + %A = call i16 @llvm.atomic.cmp.swap.i16.p0i16( i16* %ptr, i16 %cmp, i16 %swap) + ret i16 %A +} + +define i32 @runtime.llvm.atomic.cmp.swap.i32(i32* %ptr, i32 %cmp, i32 %swap) +nounwind { + %A = call i32 @llvm.atomic.cmp.swap.i32.p0i32(i32* %ptr, i32 %cmp, i32 %swap) + ret i32 %A +} + +define i64 @runtime.llvm.atomic.cmp.swap.i64(i64* %ptr, i64 %cmp, i64 %swap) +nounwind { + %A = call i64 @llvm.atomic.cmp.swap.i64.p0i64( i64* %ptr, i64 %cmp, i64 %swap) + ret i64 %A +} Added: vmkit/trunk/lib/Mvm/LLVMRuntime/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/LLVMRuntime/Makefile?rev=54633&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/LLVMRuntime/Makefile (added) +++ vmkit/trunk/lib/Mvm/LLVMRuntime/Makefile Mon Aug 11 02:20:00 2008 @@ -0,0 +1,26 @@ +##===- lib/Mvm/LLVMRuntime/Makefile ------------------------*- Makefile -*-===## +# +# The vmkit project +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## +LEVEL = ../../.. + +include $(LEVEL)/Makefile.common + +all = llvmruntime.cpp + +llvmruntimebc : llvmruntimell + $(Echo) "Building LLVM runtime with llvm-as" + $(Verb) $(LLVMAS) -f LLVMRuntime.ll + +all :: llvmruntimebc + $(Echo) "Building LLVM runtime with llc" + $(Verb) $(LLC) -march=cpp -cppgen=contents -f LLVMRuntime.bc + +llvmruntimell: LLVMRuntime.ll + +clean:: + rm -f LLVMRuntime.bc LLVMRuntime.cpp Modified: vmkit/trunk/lib/Mvm/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Makefile?rev=54633&r1=54632&r2=54633&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Makefile (original) +++ vmkit/trunk/lib/Mvm/Makefile Mon Aug 11 02:20:00 2008 @@ -10,8 +10,6 @@ include $(LEVEL)/Makefile.config -PARALLEL_DIRS = Allocator CommonThread $(GCLIB) +DIRS = Allocator CommonThread $(GCLIB) LLVMRuntime Runtime -LIBRARYNAME = Mvm include $(LEVEL)/Makefile.common - Removed: vmkit/trunk/lib/Mvm/MvmMemoryManager.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/MvmMemoryManager.cpp?rev=54632&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/MvmMemoryManager.cpp (original) +++ vmkit/trunk/lib/Mvm/MvmMemoryManager.cpp (removed) @@ -1,78 +0,0 @@ -//===----- MvmMemoryManager.cpp - LLVM Memory manager for Mvm -------------===// -// -// Mvm -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include - -#include "mvm/JIT.h" -#include "mvm/Method.h" -#include "mvm/Object.h" - -#include "mvm/MvmMemoryManager.h" - -using namespace mvm; -using namespace llvm; - -unsigned char* MvmMemoryManager::startFunctionBody(const Function* F, - uintptr_t &ActualSize) { - Code* meth = new Code(); - currentMethod = meth; - return realMemoryManager->startFunctionBody(F, ActualSize); -} - -unsigned char *MvmMemoryManager::allocateStub(const GlobalValue* GV, - unsigned StubSize, - unsigned Alignment) { - unsigned char* res = realMemoryManager->allocateStub(GV, StubSize, Alignment); - Code* meth = new Code(); - mvm::jit::addMethodInfo((void*)(res + StubSize), meth); - currentMethod = meth; - meth->FunctionStart = res; - meth->FunctionEnd = res + StubSize; - currentMethod = meth; - - return res; -} - -void MvmMemoryManager::endFunctionBody(const Function *F, - unsigned char *FunctionStart, - unsigned char *FunctionEnd) { - mvm::jit::addMethodInfo((void*)FunctionEnd, currentMethod); - currentMethod->FunctionStart = FunctionStart; - currentMethod->FunctionEnd = FunctionEnd; - realMemoryManager->endFunctionBody(F, FunctionStart, FunctionEnd); -} - - -void MvmMemoryManager::deallocateMemForFunction(const Function *F) { - realMemoryManager->deallocateMemForFunction(F); -} - -void MvmMemoryManager::AllocateGOT() { - realMemoryManager->AllocateGOT(); -} - -unsigned char *MvmMemoryManager::getGOTBase() const { - return realMemoryManager->getGOTBase(); -} - -unsigned char *MvmMemoryManager::startExceptionTable(const Function* F, - uintptr_t &ActualSize) { - unsigned char* res = realMemoryManager->startExceptionTable(F, ActualSize); - - currentMethod->exceptionTable = res; - return (unsigned char*)res; -} - -void MvmMemoryManager::endExceptionTable(const Function *F, - unsigned char *TableStart, - unsigned char *TableEnd, - unsigned char* FrameRegister) { - realMemoryManager->endExceptionTable(F, TableStart, TableEnd, FrameRegister); - currentMethod->frameRegister = FrameRegister; -} Removed: vmkit/trunk/lib/Mvm/Object.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Object.cpp?rev=54632&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/Object.cpp (original) +++ vmkit/trunk/lib/Mvm/Object.cpp (removed) @@ -1,116 +0,0 @@ -//===--------- Object.cc - Common objects for vmlets ----------------------===// -// -// The Micro Virtual Machine -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include - -#include "MvmGC.h" -#include "mvm/Method.h" -#include "mvm/Object.h" -#include "mvm/PrintBuffer.h" -#include "mvm/Threads/Key.h" -#include "mvm/Threads/Thread.h" - -using namespace mvm; - - -VirtualTable *NativeString::VT = 0; -VirtualTable *PrintBuffer::VT = 0; - -mvm::Key* mvm::Thread::threadKey = 0; - - -void Object::initialise() { -# define INIT(X) { \ - X fake; \ - X::VT = ((void**)(void*)(&fake))[0]; } - - INIT(NativeString); - INIT(PrintBuffer); - -#undef INIT -} - -void PrintBuffer::TRACER { - ((PrintBuffer *)this)->contents()->MARK_AND_TRACE; -} - - -PrintBuffer *PrintBuffer::writeObj(const Object *obj) { -#ifdef MULTIPLE_GC - Object *beg = (Object*)mvm::Thread::get()->GC->begOf(obj); -#else - Object *beg = (Object*)Collector::begOf(obj); -#endif - - if(beg) { - if(beg == obj) { - obj->print((mvm::PrintBuffer*)this); - } else { - write("print(this); - write("] -- offset "); - writeS4((intptr_t)obj - (intptr_t)beg); - write(">"); - } - } else { - write(""); - } - return this; -} - -extern "C" void write_ptr(PrintBuffer* buf, void* obj) { - buf->writePtr(obj); -} - -extern "C" void write_int(PrintBuffer* buf, int a) { - buf->writeS4(a); -} - -extern "C" void write_str(PrintBuffer* buf, char* a) { - buf->write(a); -} - -char *Object::printString(void) const { - PrintBuffer *buf= PrintBuffer::alloc(); - buf->writeObj(this); - return buf->contents()->cString(); -} - -void Object::print(PrintBuffer *buf) const { - buf->write("writePtr((void*)this); - buf->write(">"); -} - -void NativeString::print(PrintBuffer *buf) const { - NativeString *const self= (NativeString *)this; - buf->write("\""); - for (size_t i= 0; i < strlen(self->cString()); ++i) { - int c= self->cString()[i]; - switch (c) { - case '\b': buf->write("\\b"); break; - case '\f': buf->write("\\f"); break; - case '\n': buf->write("\\n"); break; - case '\r': buf->write("\\r"); break; - case '\t': buf->write("\\t"); break; - case '"': buf->write("\\\""); break; - default: { - char esc[32]; - if (c < 32) - sprintf(esc, "\\x%02x", c); - else - sprintf(esc, "%c", c); - buf->write(esc); - } - } - } - buf->write("\""); -} Added: vmkit/trunk/lib/Mvm/Runtime/CommandLine.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/CommandLine.cpp?rev=54633&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/CommandLine.cpp (added) +++ vmkit/trunk/lib/Mvm/Runtime/CommandLine.cpp Mon Aug 11 02:20:00 2008 @@ -0,0 +1,165 @@ +//===------- CommandLine.cpp - Parses the command line --------------------===// +// +// The Micro Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + +#include +#include +#include +#include + +#include "CommandLine.h" +#include "MvmGC.h" +#include "mvm/Threads/Thread.h" + +using namespace mvm; + +typedef struct thread_arg_t { + int argc; + char** argv; + vmlet_main_t func; +} thread_arg_t; + +typedef int (*boot_t)(); + + +CommandLine::CommandLine() { + resetString(); + resetArgv(); +} + +void CommandLine::appendChar(char c) { + assert(_yytext); + _yytext[_yylen++]= c; + if (_yylen == _yylenMax) { + _yylenMax *= 2; + _yytext= (char *)realloc(_yytext, _yylenMax); + } +} + +void CommandLine::appendString(char* str) { + assert(argv); + appendChar(0); + argv[argc++] = str; + if (argc == argcMax) { + argcMax *= 2; + argv = (char **)realloc(argv, argcMax * sizeof(char*)); + } +} + +void CommandLine::resetString() { + _yytext = (char *)malloc(_yylenMax= 32); + _yylen = 0; +} + +void CommandLine::resetArgv() { + argv = (char **)malloc(sizeof(char*) * (argcMax= 10)); + argc = 0; +} + + +void CommandLine::start() { + printf("> "); + _yyChar = getc(stdin); + + while (true) { + switch(_yyChar) { + case ' ' : + do { _yyChar = getc(stdin); } while (_yyChar == ' '); + if (_yylen != 0) { + appendString(_yytext); + resetString(); + } + break; + + case '\n' : + if (_yylen != 0) { + appendString(_yytext); + resetString(); + } + if (argc > 1) { + executeInstr(); + resetArgv(); + printf("> "); + } + _yyChar = getc(stdin); + break; + + case EOF : + printf("\n"); + return; + + default : + appendChar(_yyChar); + _yyChar = getc(stdin); + } + } +} + +extern "C" int startApp(thread_arg_t* arg) { + int argc = arg->argc; + char** argv = arg->argv; + vmlet_main_t func = arg->func; + free(arg); +#ifndef MULTIPLE_GC + Collector::inject_my_thread(&argc); + func(argc, argv); + Collector::remove_my_thread(); + Collector::collect(); +#else + Collector* GC = Collector::allocate(); + GC->inject_my_thread(&argc); + func(argc, argv); + GC->remove_my_thread(); + GC->collect(); +#endif + return 0; +} + +void CommandLine::executeInstr() { + if (!strcmp(argv[0], "load")) { + char* buf = (char*)alloca(sizeof(argv[1]) + 7); + sprintf(buf, "lib%s.so", argv[1]); + void* handle = dlopen(buf, RTLD_LAZY | RTLD_GLOBAL); + if (handle == 0) { + fprintf(stderr, "\t Unable to load %s\n", argv[1]); + printf("\t error = %s\n", dlerror()); + return; + } + + boot_t func = (boot_t)(intptr_t)dlsym(handle, "boot"); + + if (func == 0) { + fprintf(stderr, "\t Unable to find %s boot method\n", argv[1]); + dlclose(handle); + return; + } + func(); + + vmlet_main_t vmlet = (vmlet_main_t)(intptr_t)dlsym(handle, "start_app"); + + vmlets[argv[1]] = vmlet; + + } else { + vmlet_main_t func = vmlets[argv[0]]; + if (!func) { + fprintf(stderr, "\t Unknown vmlet %s\n", argv[0]); + } else { +#if 0 + thread_arg_t* thread_arg = (thread_arg_t*)malloc(sizeof (thread_arg_t)); + thread_arg->argc = argc; + thread_arg->argv = argv; + thread_arg->func = func; + int tid = 0; + Thread::start(&tid, (int (*)(void *))startApp, thread_arg); +#else + func(argc, argv); +#endif + } + } +} Added: vmkit/trunk/lib/Mvm/Runtime/CommandLine.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/CommandLine.h?rev=54633&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/CommandLine.h (added) +++ vmkit/trunk/lib/Mvm/Runtime/CommandLine.h Mon Aug 11 02:20:00 2008 @@ -0,0 +1,57 @@ +//===--------- CommandLine.h - Parses the command line --------------------===// +// +// The Micro Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef COMMAND_LINE_H +#define COMMAND_LINE_H + +#include + +#include + +namespace mvm { + +typedef int (*vmlet_main_t)(int argc, char** argv); + +struct ltstr +{ + bool operator()(const char* s1, const char* s2) const + { + return strcmp(s1, s2) < 0; + } +}; + +class CommandLine { +public: + char** argv; + unsigned argc; + unsigned argcMax; + + char* _yytext; + unsigned _yylen; + unsigned _yylenMax; + char _yyChar; + + std::map vmlets; + + CommandLine(); + + void appendChar(char c); + void appendString(char* str); + + void start(); + void executeInstr(); + + void resetArgv(); + void resetString(); + +}; + +} // end namespace mvm + +#endif // COMMAND_LINE_H Added: vmkit/trunk/lib/Mvm/Runtime/Disassembler.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/Disassembler.cpp?rev=54633&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/Disassembler.cpp (added) +++ vmkit/trunk/lib/Mvm/Runtime/Disassembler.cpp Mon Aug 11 02:20:00 2008 @@ -0,0 +1,91 @@ +//===--------- Disassembler.cc - Intefarce to disassembler ----------------===// +// +// Micro Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "mvm/JIT.h" + +#ifdef HAVE_DISASSEMBLER + +#if defined(__PPC__) +extern "C" +{ +# include +# include +} + + + +static struct disassemble_info info; +static int initialised= 0; + +// this is the only function exported from this file + +int mvm::jit::disassemble(unsigned int *addr) +{ + + if (!initialised) + { + INIT_DISASSEMBLE_INFO(info, stdout, fprintf); + info.flavour= bfd_target_elf_flavour; + info.arch= bfd_arch_powerpc; + info.mach= bfd_mach_ppc_750; // generic(ish) == PPC G3 + info.endian= BFD_ENDIAN_BIG; + info.buffer_length= 65536; + } + info.buffer= (bfd_byte *)addr; + info.buffer_vma= (bfd_vma)(long)addr; + return print_insn_big_powerpc((bfd_vma)(long)addr, &info); + +} + +#elif defined(__i386__) +extern "C" +{ +# include // bfd types +# include // disassemble_info + int print_insn_i386_att(bfd_vma, disassemble_info *); +} + + +static struct disassemble_info info; +static int initialised= 0; + + +int mvm::jit::disassemble(unsigned int *addr) +{ + if (!initialised) + { + INIT_DISASSEMBLE_INFO(info, stdout, fprintf); + info.flavour= bfd_target_elf_flavour; + info.arch= bfd_arch_i386; + info.mach= bfd_mach_i386_i386; + info.endian= BFD_ENDIAN_LITTLE; + info.buffer_length= 65536; + } + info.buffer= (bfd_byte *)addr; + info.buffer_vma= (bfd_vma)(long)addr; + return print_insn_i386_att((bfd_vma)(long)addr, &info); +} + +#else + +int mvm::jit::disassemble(unsigned int* addr) { + return 0; +} + +#endif + +#else + +int mvm::jit::disassemble(unsigned int* addr) { + return 0; +} + +#endif + + Added: vmkit/trunk/lib/Mvm/Runtime/EscapeAnalysis.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/EscapeAnalysis.cpp?rev=54633&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/EscapeAnalysis.cpp (added) +++ vmkit/trunk/lib/Mvm/Runtime/EscapeAnalysis.cpp Mon Aug 11 02:20:00 2008 @@ -0,0 +1,137 @@ +//===------EscapeAnalysis.cpp - Simple LLVM escape analysis ---------------===// +// +// The Micro Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + +#include "llvm/Constants.h" +#include "llvm/Pass.h" +#include "llvm/Function.h" +#include "llvm/Instructions.h" +#include "llvm/Support/Compiler.h" +#include "llvm/Support/Debug.h" + +#include + +#include "mvm/GC/GC.h" + +using namespace llvm; + +namespace { + + class VISIBILITY_HIDDEN EscapeAnalysis : public FunctionPass { + public: + static char ID; + EscapeAnalysis(Function* alloc = 0) : + FunctionPass((intptr_t)&ID) { + Allocator = alloc; + } + + virtual bool runOnFunction(Function &F); + private: + Function* Allocator; + bool processMalloc(Instruction* I, Value* Size, Value* VT); + }; + char EscapeAnalysis::ID = 0; + RegisterPass X("EscapeAnalysis", "Escape Analysis Pass"); + +bool EscapeAnalysis::runOnFunction(Function& F) { + bool Changed = false; + for (Function::iterator BI = F.begin(), BE = F.end(); BI != BE; BI++) { + BasicBlock *Cur = BI; + + for (BasicBlock::iterator II = Cur->begin(), IE = Cur->end(); II != IE;) { + Instruction *I = II; + II++; + if (CallInst *CI = dyn_cast(I)) { + if (CI->getOperand(0) == Allocator) { + Changed |= processMalloc(CI, CI->getOperand(1), CI->getOperand(2)); + } + } else if (InvokeInst *CI = dyn_cast(I)) { + if (CI->getOperand(0) == Allocator) { + Changed |= processMalloc(CI, CI->getOperand(3), CI->getOperand(4)); + } + } + } + } + return Changed; +} + + + + +static bool escapes(Instruction* Ins, std::map& visited) { + for (Value::use_iterator I = Ins->use_begin(), E = Ins->use_end(); + I != E; ++I) { + if (Instruction* II = dyn_cast(I)) { + if (dyn_cast(II)) return true; + else if (dyn_cast(II)) return true; + else if (dyn_cast(II)) { + if (escapes(II, visited)) return true; + } + else if (StoreInst* SI = dyn_cast(II)) { + if (AllocaInst * AI = dyn_cast(SI->getOperand(1))) { + if (!visited[AI]) { + visited[AI] = true; + if (escapes(AI, visited)) return true; + } + } else if (SI->getOperand(0) == Ins) { + return true; + } + } + else if (dyn_cast(II)) { + if (isa(II->getType())) { + if (escapes(II, visited)) return true; // allocas + } + } + else if (dyn_cast(II)) { + if (escapes(II, visited)) return true; + } + else if (dyn_cast(II)) return true; + else if (dyn_cast(II)) { + if (!visited[II]) { + visited[II] = true; + if (escapes(II, visited)) return true; + } + } + } else { + return true; + } + } + return false; +} + +bool EscapeAnalysis::processMalloc(Instruction* I, Value* Size, Value* VT) { + Instruction* Alloc = I; + + ConstantExpr* CE = dyn_cast(VT); + if (CE) { + ConstantInt* C = (ConstantInt*)CE->getOperand(0); + VirtualTable* Table = (VirtualTable*)C->getZExtValue(); + // If the class has a finalize method, do not stack allocate the object + if (!((void**)Table)[0]) { + std::map visited; + if (!(escapes(Alloc, visited))) { + AllocaInst* AI = new AllocaInst(Type::Int8Ty, Size, "", Alloc); + BitCastInst* BI = new BitCastInst(AI, Alloc->getType(), "", Alloc); + DOUT << "escape" << Alloc->getParent()->getParent()->getName() << "\n"; + Alloc->replaceAllUsesWith(BI); + Alloc->eraseFromParent(); + return true; + } + } + } + return false; +} +} + +namespace mvm { +FunctionPass* createEscapeAnalysisPass(llvm::Function* alloc) { + + return new EscapeAnalysis(alloc); +} +} Added: vmkit/trunk/lib/Mvm/Runtime/JIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/JIT.cpp?rev=54633&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/JIT.cpp (added) +++ vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Mon Aug 11 02:20:00 2008 @@ -0,0 +1,348 @@ +//===---------------- JIT.cc - Initialize the JIT -------------------------===// +// +// The Micro Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/CallingConv.h" +#include +#include +#include +#include +#include "llvm/Support/MutexGuard.h" +#include "llvm/Target/TargetOptions.h" + +#include + +#include "mvm/JIT.h" +#include "mvm/Method.h" +#include "mvm/MvmMemoryManager.h" +#include "mvm/Object.h" +#include "mvm/Threads/Thread.h" + +using namespace mvm; +using namespace mvm::jit; +using namespace llvm; + + +extern "C" void printFloat(float f) { + printf("%f\n", f); +} + +extern "C" void printDouble(double d) { + printf("%f\n", d); +} + +extern "C" void printLong(sint64 l) { + printf("%lld\n", l); +} + +extern "C" void printInt(sint32 i) { + printf("%d\n", i); +} + +extern "C" void printObject(mvm::Object* obj) { + printf("%s\n", obj->printString()); +} + +extern "C" void __register_frame(void*); + +#include "LLVMRuntime.cpp" + +void mvm::jit::initialise() { + llvm::NoFramePointerElim = true; + llvm::ExceptionHandling = true; + llvm::Module *module = globalModule = new Module("microvm"); + jit::globalModuleProvider = new ExistingModuleProvider (globalModule); + jit::memoryManager = new MvmMemoryManager(); + + executionEngine = ExecutionEngine::createJIT(globalModuleProvider, 0, + memoryManager); + executionEngine->InstallExceptionTableRegister(__register_frame); + std::string str = executionEngine->getTargetData()->getStringRepresentation(); + module->setDataLayout(str); + + makeLLVMModuleContents(module); + + printFloatLLVM = module->getFunction("printFloat"); + printDoubleLLVM = module->getFunction("printDouble"); + printLongLLVM = module->getFunction("printLong"); + printIntLLVM = module->getFunction("printInt"); + printObjectLLVM = module->getFunction("printObject"); + + unwindResume = module->getFunction("_Unwind_Resume_or_Rethrow"); + + llvmGetException = module->getFunction("llvm.eh.exception"); + exceptionSelector = sizeof(void*) == 4 ? + module->getFunction("llvm.eh.selector.i32") : + module->getFunction("llvm.eh.selector.i64"); + + personality = module->getFunction("__gxx_personality_v0"); + exceptionEndCatch = module->getFunction("__cxa_end_catch"); + exceptionBeginCatch = module->getFunction("__cxa_begin_catch"); + + func_llvm_sqrt_f64 = module->getFunction("llvm.sqrt.f64"); + func_llvm_sin_f64 = module->getFunction("llvm.sin.f64"); + func_llvm_cos_f64 = module->getFunction("llvm.cos.f64"); + + func_llvm_tan_f64 = module->getFunction("tan"); + func_llvm_asin_f64 = module->getFunction("asin"); + func_llvm_acos_f64 = module->getFunction("acos"); + func_llvm_atan_f64 = module->getFunction("atan"); + func_llvm_exp_f64 = module->getFunction("exp"); + func_llvm_log_f64 = module->getFunction("log"); + func_llvm_ceil_f64 = module->getFunction("ceil"); + func_llvm_floor_f64 = module->getFunction("floor"); + func_llvm_cbrt_f64 = module->getFunction("cbrt"); + func_llvm_cosh_f64 = module->getFunction("cosh"); + func_llvm_expm1_f64 = module->getFunction("expm1"); + func_llvm_log10_f64 = module->getFunction("log10"); + func_llvm_log1p_f64 = module->getFunction("log1p"); + func_llvm_sinh_f64 = module->getFunction("sinh"); + func_llvm_tanh_f64 = module->getFunction("tanh"); + func_llvm_fabs_f64 = module->getFunction("fabs"); + func_llvm_rint_f64 = module->getFunction("rint"); + + func_llvm_hypot_f64 = module->getFunction("hypot"); + func_llvm_pow_f64 = module->getFunction("pow"); + func_llvm_atan2_f64 = module->getFunction("atan2"); + + func_llvm_fabs_f32 = module->getFunction("fabsf"); + + setjmpLLVM = module->getFunction("setjmp"); + + llvm_memcpy_i32 = module->getFunction("llvm.memcpy.i32"); + llvm_memset_i32 = module->getFunction("llvm.memset.i32"); + + llvm_atomic_lcs_i8 = module->getFunction("llvm.atomic.cmp.swap.i8.p0i8"); + llvm_atomic_lcs_i16 = module->getFunction("llvm.atomic.cmp.swap.i16.p0i16"); + llvm_atomic_lcs_i32 = module->getFunction("llvm.atomic.cmp.swap.i32.p0i32"); + llvm_atomic_lcs_i64 = module->getFunction("llvm.atomic.cmp.swap.i64.p0i64"); + + llvm_atomic_cmp_swap_i8 = (uint8 (*)(uint8*, uint8, uint8)) + (uintptr_t)executionEngine->getPointerToFunction( + module->getFunction("runtime.llvm.atomic.cmp.swap.i8")); + llvm_atomic_cmp_swap_i16 = (uint16 (*)(uint16*, uint16, uint16)) + (uintptr_t)executionEngine->getPointerToFunction( + module->getFunction("runtime.llvm.atomic.cmp.swap.i16")); + llvm_atomic_cmp_swap_i32 = (uint32 (*)(uint32*, uint32, uint32)) + (uintptr_t)executionEngine->getPointerToFunction( + module->getFunction("runtime.llvm.atomic.cmp.swap.i32")); + llvm_atomic_cmp_swap_i64 = (uint64 (*)(uint64*, uint64, uint64)) + (uintptr_t)executionEngine->getPointerToFunction( + module->getFunction("runtime.llvm.atomic.cmp.swap.i64")); + + // Type declaration + ptrType = PointerType::getUnqual(Type::Int8Ty); + ptr32Type = PointerType::getUnqual(Type::Int32Ty); + ptrPtrType = PointerType::getUnqual(ptrType); + + // Constant declaration + constantLongMinusOne = ConstantInt::get(Type::Int64Ty, (uint64_t)-1); + constantLongZero = ConstantInt::get(Type::Int64Ty, 0); + constantLongOne = ConstantInt::get(Type::Int64Ty, 1); + constantZero = ConstantInt::get(Type::Int32Ty, 0); + constantInt8Zero = ConstantInt::get(Type::Int8Ty, 0); + constantOne = ConstantInt::get(Type::Int32Ty, 1); + constantTwo = ConstantInt::get(Type::Int32Ty, 2); + constantThree = ConstantInt::get(Type::Int32Ty, 3); + constantFour = ConstantInt::get(Type::Int32Ty, 4); + constantFive = ConstantInt::get(Type::Int32Ty, 5); + constantSix = ConstantInt::get(Type::Int32Ty, 6); + constantSeven = ConstantInt::get(Type::Int32Ty, 7); + constantEight = ConstantInt::get(Type::Int32Ty, 8); + constantMinusOne = ConstantInt::get(Type::Int32Ty, (uint64_t)-1); + constantMinInt = ConstantInt::get(Type::Int32Ty, MinInt); + constantMaxInt = ConstantInt::get(Type::Int32Ty, MaxInt); + constantMinLong = ConstantInt::get(Type::Int64Ty, MinLong); + constantMaxLong = ConstantInt::get(Type::Int64Ty, MaxLong); + constantFloatZero = ConstantFP::get(Type::FloatTy, 0.0f); + constantFloatOne = ConstantFP::get(Type::FloatTy, 1.0f); + constantFloatTwo = ConstantFP::get(Type::FloatTy, 2.0f); + constantDoubleZero = ConstantFP::get(Type::DoubleTy, 0.0); + constantDoubleOne = ConstantFP::get(Type::DoubleTy, 1.0); + constantMaxIntFloat = ConstantFP::get(Type::FloatTy, MaxIntFloat); + constantMinIntFloat = ConstantFP::get(Type::FloatTy, MinIntFloat); + constantMinLongFloat = ConstantFP::get(Type::FloatTy, MinLongFloat); + constantMinLongDouble = ConstantFP::get(Type::DoubleTy, MinLongDouble); + constantMaxLongFloat = ConstantFP::get(Type::FloatTy, MaxLongFloat); + constantMaxIntDouble = ConstantFP::get(Type::DoubleTy, MaxIntDouble); + constantMinIntDouble = ConstantFP::get(Type::DoubleTy, MinIntDouble); + constantMaxLongDouble = ConstantFP::get(Type::DoubleTy, MaxLongDouble); + constantMaxLongDouble = ConstantFP::get(Type::DoubleTy, MaxLongDouble); + constantFloatInfinity = ConstantFP::get(Type::FloatTy, MaxFloat); + constantFloatMinusInfinity = ConstantFP::get(Type::FloatTy, MinFloat); + constantDoubleInfinity = ConstantFP::get(Type::DoubleTy, MaxDouble); + constantDoubleMinusInfinity = ConstantFP::get(Type::DoubleTy, MinDouble); + constantDoubleMinusZero = ConstantFP::get(Type::DoubleTy, -0.0); + constantFloatMinusZero = ConstantFP::get(Type::FloatTy, -0.0f); + + constantPtrNull = Constant::getNullValue(ptrType); + constantPtrSize = ConstantInt::get(Type::Int32Ty, sizeof(void*)); + arrayPtrType = PointerType::getUnqual(ArrayType::get(Type::Int8Ty, 0)); + + mvm::jit::protectEngine = mvm::Lock::allocNormal(); + +} + +llvm::Function* mvm::jit::llvm_memcpy_i32; +llvm::Function* mvm::jit::llvm_memset_i32; + +llvm::Function* mvm::jit::llvm_atomic_lcs_i8; +llvm::Function* mvm::jit::llvm_atomic_lcs_i16; +llvm::Function* mvm::jit::llvm_atomic_lcs_i32; +llvm::Function* mvm::jit::llvm_atomic_lcs_i64; + + +llvm::Function* mvm::jit::exceptionEndCatch; +llvm::Function* mvm::jit::exceptionBeginCatch; +llvm::Function* mvm::jit::unwindResume; +llvm::Function* mvm::jit::exceptionSelector; +llvm::Function* mvm::jit::personality; +llvm::Function* mvm::jit::llvmGetException; + +llvm::Function* mvm::jit::printFloatLLVM; +llvm::Function* mvm::jit::printDoubleLLVM; +llvm::Function* mvm::jit::printLongLLVM; +llvm::Function* mvm::jit::printIntLLVM; +llvm::Function* mvm::jit::printObjectLLVM; + +llvm::Function* mvm::jit::setjmpLLVM; + +llvm::Function* mvm::jit::func_llvm_fabs_f32; +llvm::Function* mvm::jit::func_llvm_fabs_f64; +llvm::Function* mvm::jit::func_llvm_sqrt_f64; +llvm::Function* mvm::jit::func_llvm_sin_f64; +llvm::Function* mvm::jit::func_llvm_cos_f64; +llvm::Function* mvm::jit::func_llvm_tan_f64; +llvm::Function* mvm::jit::func_llvm_asin_f64; +llvm::Function* mvm::jit::func_llvm_acos_f64; +llvm::Function* mvm::jit::func_llvm_atan_f64; +llvm::Function* mvm::jit::func_llvm_atan2_f64; +llvm::Function* mvm::jit::func_llvm_exp_f64; +llvm::Function* mvm::jit::func_llvm_log_f64; +llvm::Function* mvm::jit::func_llvm_pow_f64; +llvm::Function* mvm::jit::func_llvm_ceil_f64; +llvm::Function* mvm::jit::func_llvm_floor_f64; +llvm::Function* mvm::jit::func_llvm_rint_f64; +llvm::Function* mvm::jit::func_llvm_cbrt_f64; +llvm::Function* mvm::jit::func_llvm_cosh_f64; +llvm::Function* mvm::jit::func_llvm_expm1_f64; +llvm::Function* mvm::jit::func_llvm_hypot_f64; +llvm::Function* mvm::jit::func_llvm_log10_f64; +llvm::Function* mvm::jit::func_llvm_log1p_f64; +llvm::Function* mvm::jit::func_llvm_sinh_f64; +llvm::Function* mvm::jit::func_llvm_tanh_f64; + +llvm::ExecutionEngine* mvm::jit::executionEngine; + +mvm::Lock* mvm::jit::protectEngine; +llvm::ConstantInt* mvm::jit::constantInt8Zero; +llvm::ConstantInt* mvm::jit::constantZero; +llvm::ConstantInt* mvm::jit::constantOne; +llvm::ConstantInt* mvm::jit::constantTwo; +llvm::ConstantInt* mvm::jit::constantThree; +llvm::ConstantInt* mvm::jit::constantFour; +llvm::ConstantInt* mvm::jit::constantFive; +llvm::ConstantInt* mvm::jit::constantSix; +llvm::ConstantInt* mvm::jit::constantSeven; +llvm::ConstantInt* mvm::jit::constantEight; +llvm::ConstantInt* mvm::jit::constantMinusOne; +llvm::ConstantInt* mvm::jit::constantLongMinusOne; +llvm::ConstantInt* mvm::jit::constantLongZero; +llvm::ConstantInt* mvm::jit::constantLongOne; +llvm::ConstantInt* mvm::jit::constantMinInt; +llvm::ConstantInt* mvm::jit::constantMaxInt; +llvm::ConstantInt* mvm::jit::constantMinLong; +llvm::ConstantInt* mvm::jit::constantMaxLong; +llvm::ConstantFP* mvm::jit::constantFloatZero; +llvm::ConstantFP* mvm::jit::constantFloatOne; +llvm::ConstantFP* mvm::jit::constantFloatTwo; +llvm::ConstantFP* mvm::jit::constantDoubleZero; +llvm::ConstantFP* mvm::jit::constantDoubleOne; +llvm::ConstantFP* mvm::jit::constantMaxIntFloat; +llvm::ConstantFP* mvm::jit::constantMinIntFloat; +llvm::ConstantFP* mvm::jit::constantMinLongFloat; +llvm::ConstantFP* mvm::jit::constantMinLongDouble; +llvm::ConstantFP* mvm::jit::constantMaxLongFloat; +llvm::ConstantFP* mvm::jit::constantMaxIntDouble; +llvm::ConstantFP* mvm::jit::constantMinIntDouble; +llvm::ConstantFP* mvm::jit::constantMaxLongDouble; +llvm::ConstantFP* mvm::jit::constantDoubleInfinity; +llvm::ConstantFP* mvm::jit::constantDoubleMinusInfinity; +llvm::ConstantFP* mvm::jit::constantFloatInfinity; +llvm::ConstantFP* mvm::jit::constantFloatMinusInfinity; +llvm::ConstantFP* mvm::jit::constantFloatMinusZero; +llvm::ConstantFP* mvm::jit::constantDoubleMinusZero; +llvm::Constant* mvm::jit::constantPtrNull; +llvm::ConstantInt* mvm::jit::constantPtrSize; +const llvm::PointerType* mvm::jit::ptrType; +const llvm::PointerType* mvm::jit::ptr32Type; +const llvm::PointerType* mvm::jit::ptrPtrType; +const llvm::Type* mvm::jit::arrayPtrType; + +llvm::Module *mvm::jit::globalModule; +llvm::ExistingModuleProvider *mvm::jit::globalModuleProvider; +mvm::MvmMemoryManager *mvm::jit::memoryManager; + + +uint8 (*mvm::jit::llvm_atomic_cmp_swap_i8) (uint8* ptr, uint8 cmp, + uint8 val); +uint16 (*mvm::jit::llvm_atomic_cmp_swap_i16) (uint16* ptr, uint16 cmp, + uint16 val); +uint32 (*mvm::jit::llvm_atomic_cmp_swap_i32) (uint32* ptr, uint32 cmp, + uint32 val); +uint64 (*mvm::jit::llvm_atomic_cmp_swap_i64) (uint64* ptr, uint64 cmp, + uint64 val); + + +uint64 mvm::jit::getTypeSize(const llvm::Type* type) { + return executionEngine->getTargetData()->getABITypeSize(type); +} + +void mvm::jit::runPasses(llvm::Function* func, llvm::FunctionPassManager* pm) { + pm->run(*func); +} + +#if defined(__MACH__) && !defined(__i386__) +#define FRAME_IP(fp) (fp[2]) +#else +#define FRAME_IP(fp) (fp[1]) +#endif + +int mvm::jit::getBacktrace(void** stack, int size) { + void** blah = (void**)__builtin_frame_address(1); + int cpt = 0; + void* baseSP = mvm::Thread::get()->baseSP; + while (blah && cpt < size && blah < baseSP) { + stack[cpt++] = (void**)FRAME_IP(blah); + blah = (void**)blah[0]; + } + return cpt; +} + +LockNormal lock; +std::map pointerMap; + +Code* mvm::jit::getCodeFromPointer(void* Addr) { + lock.lock(); + std::map::iterator I = + pointerMap.lower_bound(Addr); + + lock.unlock(); + if (I != pointerMap.end()) { + Code* m = I->second; + if (Addr >= m->FunctionStart) return m; + } + + return 0; +} + +void mvm::jit::addMethodInfo(void* Addr, Code* C) { + lock.lock(); + pointerMap.insert(std::make_pair(Addr, C)); + lock.unlock(); +} Added: vmkit/trunk/lib/Mvm/Runtime/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/Makefile?rev=54633&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/Makefile (added) +++ vmkit/trunk/lib/Mvm/Runtime/Makefile Mon Aug 11 02:20:00 2008 @@ -0,0 +1,16 @@ +##===- lib/Mvm/Runtime/Makefile ----------------------------*- Makefile -*-===## +# +# The vmkit project +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## +LEVEL = ../../.. + +include $(LEVEL)/Makefile.config + +LIBRARYNAME = Mvm +include $(LEVEL)/Makefile.common + +CXX.Flags += -I../LLVMRuntime Added: vmkit/trunk/lib/Mvm/Runtime/MvmMemoryManager.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/MvmMemoryManager.cpp?rev=54633&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/MvmMemoryManager.cpp (added) +++ vmkit/trunk/lib/Mvm/Runtime/MvmMemoryManager.cpp Mon Aug 11 02:20:00 2008 @@ -0,0 +1,78 @@ +//===----- MvmMemoryManager.cpp - LLVM Memory manager for Mvm -------------===// +// +// Mvm +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include + +#include "mvm/JIT.h" +#include "mvm/Method.h" +#include "mvm/Object.h" + +#include "mvm/MvmMemoryManager.h" + +using namespace mvm; +using namespace llvm; + +unsigned char* MvmMemoryManager::startFunctionBody(const Function* F, + uintptr_t &ActualSize) { + Code* meth = new Code(); + currentMethod = meth; + return realMemoryManager->startFunctionBody(F, ActualSize); +} + +unsigned char *MvmMemoryManager::allocateStub(const GlobalValue* GV, + unsigned StubSize, + unsigned Alignment) { + unsigned char* res = realMemoryManager->allocateStub(GV, StubSize, Alignment); + Code* meth = new Code(); + mvm::jit::addMethodInfo((void*)(res + StubSize), meth); + currentMethod = meth; + meth->FunctionStart = res; + meth->FunctionEnd = res + StubSize; + currentMethod = meth; + + return res; +} + +void MvmMemoryManager::endFunctionBody(const Function *F, + unsigned char *FunctionStart, + unsigned char *FunctionEnd) { + mvm::jit::addMethodInfo((void*)FunctionEnd, currentMethod); + currentMethod->FunctionStart = FunctionStart; + currentMethod->FunctionEnd = FunctionEnd; + realMemoryManager->endFunctionBody(F, FunctionStart, FunctionEnd); +} + + +void MvmMemoryManager::deallocateMemForFunction(const Function *F) { + realMemoryManager->deallocateMemForFunction(F); +} + +void MvmMemoryManager::AllocateGOT() { + realMemoryManager->AllocateGOT(); +} + +unsigned char *MvmMemoryManager::getGOTBase() const { + return realMemoryManager->getGOTBase(); +} + +unsigned char *MvmMemoryManager::startExceptionTable(const Function* F, + uintptr_t &ActualSize) { + unsigned char* res = realMemoryManager->startExceptionTable(F, ActualSize); + + currentMethod->exceptionTable = res; + return (unsigned char*)res; +} + +void MvmMemoryManager::endExceptionTable(const Function *F, + unsigned char *TableStart, + unsigned char *TableEnd, + unsigned char* FrameRegister) { + realMemoryManager->endExceptionTable(F, TableStart, TableEnd, FrameRegister); + currentMethod->frameRegister = FrameRegister; +} Added: vmkit/trunk/lib/Mvm/Runtime/Object.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/Object.cpp?rev=54633&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/Object.cpp (added) +++ vmkit/trunk/lib/Mvm/Runtime/Object.cpp Mon Aug 11 02:20:00 2008 @@ -0,0 +1,116 @@ +//===--------- Object.cc - Common objects for vmlets ----------------------===// +// +// The Micro Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include + +#include "MvmGC.h" +#include "mvm/Method.h" +#include "mvm/Object.h" +#include "mvm/PrintBuffer.h" +#include "mvm/Threads/Key.h" +#include "mvm/Threads/Thread.h" + +using namespace mvm; + + +VirtualTable *NativeString::VT = 0; +VirtualTable *PrintBuffer::VT = 0; + +mvm::Key* mvm::Thread::threadKey = 0; + + +void Object::initialise() { +# define INIT(X) { \ + X fake; \ + X::VT = ((void**)(void*)(&fake))[0]; } + + INIT(NativeString); + INIT(PrintBuffer); + +#undef INIT +} + +void PrintBuffer::TRACER { + ((PrintBuffer *)this)->contents()->MARK_AND_TRACE; +} + + +PrintBuffer *PrintBuffer::writeObj(const Object *obj) { +#ifdef MULTIPLE_GC + Object *beg = (Object*)mvm::Thread::get()->GC->begOf(obj); +#else + Object *beg = (Object*)Collector::begOf(obj); +#endif + + if(beg) { + if(beg == obj) { + obj->print((mvm::PrintBuffer*)this); + } else { + write("print(this); + write("] -- offset "); + writeS4((intptr_t)obj - (intptr_t)beg); + write(">"); + } + } else { + write(""); + } + return this; +} + +extern "C" void write_ptr(PrintBuffer* buf, void* obj) { + buf->writePtr(obj); +} + +extern "C" void write_int(PrintBuffer* buf, int a) { + buf->writeS4(a); +} + +extern "C" void write_str(PrintBuffer* buf, char* a) { + buf->write(a); +} + +char *Object::printString(void) const { + PrintBuffer *buf= PrintBuffer::alloc(); + buf->writeObj(this); + return buf->contents()->cString(); +} + +void Object::print(PrintBuffer *buf) const { + buf->write("writePtr((void*)this); + buf->write(">"); +} + +void NativeString::print(PrintBuffer *buf) const { + NativeString *const self= (NativeString *)this; + buf->write("\""); + for (size_t i= 0; i < strlen(self->cString()); ++i) { + int c= self->cString()[i]; + switch (c) { + case '\b': buf->write("\\b"); break; + case '\f': buf->write("\\f"); break; + case '\n': buf->write("\\n"); break; + case '\r': buf->write("\\r"); break; + case '\t': buf->write("\\t"); break; + case '"': buf->write("\\\""); break; + default: { + char esc[32]; + if (c < 32) + sprintf(esc, "\\x%02x", c); + else + sprintf(esc, "%c", c); + buf->write(esc); + } + } + } + buf->write("\""); +} Added: vmkit/trunk/lib/Mvm/Runtime/Sigsegv.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/Sigsegv.cpp?rev=54633&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/Sigsegv.cpp (added) +++ vmkit/trunk/lib/Mvm/Runtime/Sigsegv.cpp Mon Aug 11 02:20:00 2008 @@ -0,0 +1,68 @@ +//===----------- Sigsegv.cc - Sigsegv default handling --------------------===// +// +// The Micro Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + +#include "MvmGC.h" +#include "mvm/Sigsegv.h" +#include "mvm/Threads/Thread.h" + +#include +#include + +using namespace mvm; + +void (*client_sigsegv_handler)(int, void *) = 0; + +#if defined(__MACH__) && defined(__i386__) +#include "ucontext.h" +#endif + +void sigsegv_handler(int n, siginfo_t *_info, void *context) { + void *addr = _info->si_addr; +#if defined(__i386__) + struct frame { + struct frame *caller; + void *ip; + }; + + /* my frame */ + struct frame *fp; + /* get it */ + asm ("mov %%ebp, %0" : "=&r"(fp)); + /* my caller */ + struct frame *caller = fp->caller; + /* preserve my caller if I return from the handler */ + void *caller_ip = caller->ip; + +#if defined(__MACH__) + //.gregs[REG_EIP]; /* just like it's on the stack.. */ + caller->ip = (void *)((ucontext_t*)context)->uc_mcontext->__ss.__eip; +#else + /* just like it's on the stack... */ + caller->ip = (void *)((ucontext_t*)context)->uc_mcontext.gregs[REG_EIP]; +#endif +#endif + + /* Free the GC if it sisgegv'd. No other collection is possible */ +#ifndef MULTIPLE_GC + Collector::die_if_sigsegv_occured_during_collection(addr); +#else + mvm::Thread::get()->GC->die_if_sigsegv_occured_during_collection(addr); +#endif + + // sys_exit(0); + if(client_sigsegv_handler) + client_sigsegv_handler(n, addr); + else + signal(SIGSEGV, SIG_DFL); + +#if defined(__i386__) + caller->ip = caller_ip; /* restore the caller ip */ +#endif +} Removed: vmkit/trunk/lib/Mvm/Sigsegv.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Sigsegv.cpp?rev=54632&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/Sigsegv.cpp (original) +++ vmkit/trunk/lib/Mvm/Sigsegv.cpp (removed) @@ -1,68 +0,0 @@ -//===----------- Sigsegv.cc - Sigsegv default handling --------------------===// -// -// The Micro Virtual Machine -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - - -#include "MvmGC.h" -#include "mvm/Sigsegv.h" -#include "mvm/Threads/Thread.h" - -#include -#include - -using namespace mvm; - -void (*client_sigsegv_handler)(int, void *) = 0; - -#if defined(__MACH__) && defined(__i386__) -#include "ucontext.h" -#endif - -void sigsegv_handler(int n, siginfo_t *_info, void *context) { - void *addr = _info->si_addr; -#if defined(__i386__) - struct frame { - struct frame *caller; - void *ip; - }; - - /* my frame */ - struct frame *fp; - /* get it */ - asm ("mov %%ebp, %0" : "=&r"(fp)); - /* my caller */ - struct frame *caller = fp->caller; - /* preserve my caller if I return from the handler */ - void *caller_ip = caller->ip; - -#if defined(__MACH__) - //.gregs[REG_EIP]; /* just like it's on the stack.. */ - caller->ip = (void *)((ucontext_t*)context)->uc_mcontext->__ss.__eip; -#else - /* just like it's on the stack... */ - caller->ip = (void *)((ucontext_t*)context)->uc_mcontext.gregs[REG_EIP]; -#endif -#endif - - /* Free the GC if it sisgegv'd. No other collection is possible */ -#ifndef MULTIPLE_GC - Collector::die_if_sigsegv_occured_during_collection(addr); -#else - mvm::Thread::get()->GC->die_if_sigsegv_occured_during_collection(addr); -#endif - - // sys_exit(0); - if(client_sigsegv_handler) - client_sigsegv_handler(n, addr); - else - signal(SIGSEGV, SIG_DFL); - -#if defined(__i386__) - caller->ip = caller_ip; /* restore the caller ip */ -#endif -} From nicolas.geoffray at lip6.fr Mon Aug 11 00:20:53 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 11 Aug 2008 07:20:53 -0000 Subject: [vmkit-commits] [vmkit] r54634 - /vmkit/trunk/include/mvm/JIT.h Message-ID: <200808110720.m7B7Kr5Z008442@zion.cs.uiuc.edu> Author: geoffray Date: Mon Aug 11 02:20:53 2008 New Revision: 54634 URL: http://llvm.org/viewvc/llvm-project?rev=54634&view=rev Log: Use LLVM atomic operations instead of gcc's. Find the right macro to enable them with gcc > 4.2. Modified: vmkit/trunk/include/mvm/JIT.h Modified: vmkit/trunk/include/mvm/JIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/JIT.h?rev=54634&r1=54633&r2=54634&view=diff ============================================================================== --- vmkit/trunk/include/mvm/JIT.h (original) +++ vmkit/trunk/include/mvm/JIT.h Mon Aug 11 02:20:53 2008 @@ -93,7 +93,10 @@ extern llvm::Function* llvm_memcpy_i32; extern llvm::Function* llvm_memset_i32; +extern llvm::Function* llvm_atomic_lcs_i8; +extern llvm::Function* llvm_atomic_lcs_i16; extern llvm::Function* llvm_atomic_lcs_i32; +extern llvm::Function* llvm_atomic_lcs_i64; extern llvm::ExecutionEngine* executionEngine; @@ -159,6 +162,18 @@ extern Code* getCodeFromPointer(void* addr); extern void addMethodInfo(void* end, Code* c); +extern uint8 (*llvm_atomic_cmp_swap_i8) ( uint8* ptr, uint8 cmp, uint8 val ); +extern uint16 (*llvm_atomic_cmp_swap_i16) ( uint16* ptr, uint16 cmp, uint16 val ); +extern uint32 (*llvm_atomic_cmp_swap_i32) ( uint32* ptr, uint32 cmp, uint32 val ); +extern uint64 (*llvm_atomic_cmp_swap_i64) ( uint64* ptr, uint64 cmp, uint64 val ); + +// TODO: find what macro for gcc < 4.2 +#if 1 +#define __sync_bool_compare_and_swap(ptr, cmp, val) \ + (mvm::jit::llvm_atomic_cmp_swap_i32((uint32*)(ptr), (uint32)(cmp), (uint32)(val)) == (uint32)(cmp)) +#define __sync_val_compare_and_swap(ptr, cmp,val) \ + mvm::jit::llvm_atomic_cmp_swap_i32((uint32*)(ptr), (uint32)(cmp), (uint32)(val)) +#endif } // end namespace jit } // end namespace mvm From nicolas.geoffray at lip6.fr Mon Aug 11 00:23:14 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 11 Aug 2008 07:23:14 -0000 Subject: [vmkit-commits] [vmkit] r54635 - /vmkit/trunk/Makefile.common.in Message-ID: <200808110723.m7B7NESM008516@zion.cs.uiuc.edu> Author: geoffray Date: Mon Aug 11 02:23:13 2008 New Revision: 54635 URL: http://llvm.org/viewvc/llvm-project?rev=54635&view=rev Log: No more -Werror to let compilation even when gcc is complaining. Modified: vmkit/trunk/Makefile.common.in Modified: vmkit/trunk/Makefile.common.in URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.common.in?rev=54635&r1=54634&r2=54635&view=diff ============================================================================== --- vmkit/trunk/Makefile.common.in (original) +++ vmkit/trunk/Makefile.common.in Mon Aug 11 02:23:13 2008 @@ -23,7 +23,7 @@ # Include LLVM's Master Makefile. include $(LLVM_OBJ_ROOT)/Makefile.common -CXX.Flags += @GC_FLAGS@ -Wno-variadic-macros -fno-omit-frame-pointer -ansi -Werror +CXX.Flags += @GC_FLAGS@ -Wno-variadic-macros -fno-omit-frame-pointer -ansi # GNU Classpath flags CLASSPATH_FLAGS = @classpathinclude@ From nicolas.geoffray at lip6.fr Mon Aug 11 00:40:12 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 11 Aug 2008 07:40:12 -0000 Subject: [vmkit-commits] [vmkit] r54636 - /vmkit/trunk/lib/Mvm/LLVMRuntime/LLVMRuntime.ll Message-ID: <200808110740.m7B7eCRo011429@zion.cs.uiuc.edu> Author: geoffray Date: Mon Aug 11 02:40:11 2008 New Revision: 54636 URL: http://llvm.org/viewvc/llvm-project?rev=54636&view=rev Log: Fix memset arguments. Modified: vmkit/trunk/lib/Mvm/LLVMRuntime/LLVMRuntime.ll Modified: vmkit/trunk/lib/Mvm/LLVMRuntime/LLVMRuntime.ll URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/LLVMRuntime/LLVMRuntime.ll?rev=54636&r1=54635&r2=54636&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/LLVMRuntime/LLVMRuntime.ll (original) +++ vmkit/trunk/lib/Mvm/LLVMRuntime/LLVMRuntime.ll Mon Aug 11 02:40:11 2008 @@ -55,7 +55,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; declare void @llvm.memcpy.i32(i8 *, i8 *, i32, i32) -declare void @llvm.memset.i32(i8 *, i8 *, i32, i32) +declare void @llvm.memset.i32(i8 *, i8, i32, i32) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Atomic ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; From nicolas.geoffray at lip6.fr Mon Aug 11 01:07:14 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 11 Aug 2008 08:07:14 -0000 Subject: [vmkit-commits] [vmkit] r54637 - in /vmkit/trunk/lib: JnJVM/VMCore/JnjvmModule.cpp Mvm/Runtime/JIT.cpp Message-ID: <200808110807.m7B87FFD023716@zion.cs.uiuc.edu> Author: geoffray Date: Mon Aug 11 03:07:08 2008 New Revision: 54637 URL: http://llvm.org/viewvc/llvm-project?rev=54637&view=rev Log: Include generated cpp file with the "static" keyword, so that the generated content function is local. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=54637&r1=54636&r2=54637&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Aug 11 03:07:08 2008 @@ -965,7 +965,7 @@ #endif - +static #include "LLVMRuntime.cpp" void JnjvmModule::initialise() { Modified: vmkit/trunk/lib/Mvm/Runtime/JIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/JIT.cpp?rev=54637&r1=54636&r2=54637&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/JIT.cpp (original) +++ vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Mon Aug 11 03:07:08 2008 @@ -50,6 +50,7 @@ extern "C" void __register_frame(void*); +static #include "LLVMRuntime.cpp" void mvm::jit::initialise() { From nicolas.geoffray at lip6.fr Mon Aug 11 01:08:03 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 11 Aug 2008 08:08:03 -0000 Subject: [vmkit-commits] [vmkit] r54638 - /vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp Message-ID: <200808110808.m7B883Cn023751@zion.cs.uiuc.edu> Author: geoffray Date: Mon Aug 11 03:08:03 2008 New Revision: 54638 URL: http://llvm.org/viewvc/llvm-project?rev=54638&view=rev Log: Include JIT.h for atomic operations. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp?rev=54638&r1=54637&r2=54638&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp Mon Aug 11 03:08:03 2008 @@ -9,6 +9,7 @@ #include +#include "mvm/JIT.h" #include "mvm/Threads/Locks.h" #include "JavaClass.h" From nicolas.geoffray at lip6.fr Mon Aug 11 01:12:08 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 11 Aug 2008 08:12:08 -0000 Subject: [vmkit-commits] [vmkit] r54639 - /vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp Message-ID: <200808110812.m7B8C8B2023877@zion.cs.uiuc.edu> Author: geoffray Date: Mon Aug 11 03:12:08 2008 New Revision: 54639 URL: http://llvm.org/viewvc/llvm-project?rev=54639&view=rev Log: Pass 0 instead of -1, otherwise some compilers may warn. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp?rev=54639&r1=54638&r2=54639&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp Mon Aug 11 03:12:08 2008 @@ -83,9 +83,9 @@ void AssessorDesc::initialise(Jnjvm* vm) { - dParg = new AssessorDesc(false, I_PARG, 0, 0, "(", vm, -1, 0, 0, + dParg = new AssessorDesc(false, I_PARG, 0, 0, "(", vm, 0, 0, 0, 0); - dPard = new AssessorDesc(false, I_PARD, 0, 0, ")", vm, -1, 0, 0, + dPard = new AssessorDesc(false, I_PARD, 0, 0, ")", vm, 0, 0, 0, 0); dVoid = new AssessorDesc(false, I_VOID, 0, 0, "void", vm, VOID_ID, "java/lang/Void", 0, 0); From nicolas.geoffray at lip6.fr Tue Aug 12 00:48:22 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 12 Aug 2008 07:48:22 -0000 Subject: [vmkit-commits] [vmkit] r54671 - in /vmkit/trunk: include/mvm/VirtualMachine.h lib/JnJVM/VMCore/JavaInitialise.cpp lib/JnJVM/VMCore/Jnjvm.h lib/N3/VMCore/N3Initialise.cpp lib/N3/VMCore/VirtualMachine.h Message-ID: <200808120748.m7C7mMvq008484@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 12 02:48:20 2008 New Revision: 54671 URL: http://llvm.org/viewvc/llvm-project?rev=54671&view=rev Log: Add a common virtual machine class, to be the base class of all virtual machines. Added: vmkit/trunk/include/mvm/VirtualMachine.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp vmkit/trunk/lib/N3/VMCore/VirtualMachine.h Added: vmkit/trunk/include/mvm/VirtualMachine.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/VirtualMachine.h?rev=54671&view=auto ============================================================================== --- vmkit/trunk/include/mvm/VirtualMachine.h (added) +++ vmkit/trunk/include/mvm/VirtualMachine.h Tue Aug 12 02:48:20 2008 @@ -0,0 +1,43 @@ +//===--------- VirtualMachine.h - Registering a VM ------------------------===// +// +// The VMKit project +// +// This file is distributed under the University of Pierre et Marie Curie +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Ultimately, this would be like a generic way of defining a VM. But we're not +// quite there yet. +// +//===----------------------------------------------------------------------===// + +#ifndef MVM_VIRTUALMACHINE_H +#define MVM_VIRTUALMACHINE_H + +#include "mvm/Object.h" + +namespace mvm { + +/// VirtualMachine - This class is the root of virtual machine classes. It +/// defines what a VM should be. Currently, a VM only initializes itself +/// and runs applications. +/// +class VirtualMachine : public mvm::Object { +public: + + /// runApplication - Run an application. The application name is in + /// the arguments, hence it is the virtual machine's job to parse them. + virtual void runApplication(int argc, char** argv) = 0; + + static void initialiseJVM(); + static VirtualMachine* createJVM(); + + static void initialiseCLIVM(); + static VirtualMachine* createCLIVM(); + +}; + + +} // end namespace mvm +#endif // MVM_VIRTUALMACHINE_H Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp?rev=54671&r1=54670&r2=54671&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp Tue Aug 12 02:48:20 2008 @@ -10,6 +10,7 @@ #include #include +#include "mvm/VirtualMachine.h" #include "mvm/Threads/Locks.h" #include "JavaArray.h" @@ -182,40 +183,22 @@ extern "C" void ClasspathBoot(); -void handler(int val, siginfo_t* info, void* addr) { - printf("[%d] Crash in JnJVM at %p\n", mvm::Thread::self(), addr); - JavaJIT::printBacktrace(); - assert(0); +void mvm::VirtualMachine::initialiseJVM() { + if (!JavaIsolate::bootstrapVM) { + initialiseVT(); + initialiseStatics(); + + ClasspathBoot(); + Classpath::initialiseClasspath(JavaIsolate::bootstrapVM); + } } -extern "C" int boot() { - - struct sigaction sa; - - sigaction(SIGINT, 0, &sa); - sa.sa_sigaction = handler; - sa.sa_flags |= (SA_RESTART | SA_SIGINFO | SA_NODEFER); - sigaction(SIGINT, &sa, 0); - - sigaction(SIGILL, 0, &sa); - sa.sa_sigaction = handler; - sa.sa_flags |= (SA_RESTART | SA_SIGINFO | SA_NODEFER); - sigaction(SIGILL, &sa, 0); - - sigaction(SIGSEGV, 0, &sa); - sa.sa_sigaction = handler; - sa.sa_flags |= (SA_RESTART | SA_SIGINFO | SA_NODEFER); - sigaction(SIGSEGV, &sa, 0); - - initialiseVT(); - initialiseStatics(); - - ClasspathBoot(); - Classpath::initialiseClasspath(JavaIsolate::bootstrapVM); - return 0; +void Jnjvm::runApplication(int argc, char** argv) { + mvm::Thread::threadKey->set(((JavaIsolate*)this)->bootstrapThread); + ((JavaIsolate*)this)->runMain(argc, argv); } -extern "C" int start_app(int argc, char** argv) { +mvm::VirtualMachine* mvm::VirtualMachine::createJVM() { #if !defined(MULTIPLE_VM) JavaIsolate* vm = (JavaIsolate*)JavaIsolate::bootstrapVM; #else @@ -226,6 +209,5 @@ JavaIsolate* vm = JavaIsolate::allocateIsolate(JavaIsolate::bootstrapVM); #endif #endif - vm->runMain(argc, argv); - return 0; + return vm; } Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=54671&r1=54670&r2=54671&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Tue Aug 12 02:48:20 2008 @@ -14,6 +14,7 @@ #include "mvm/Object.h" #include "mvm/PrintBuffer.h" +#include "mvm/VirtualMachine.h" #include "mvm/Threads/Cond.h" #include "mvm/Threads/Locks.h" @@ -55,7 +56,7 @@ class AllocationMap; class ZipArchive; -class Jnjvm : public mvm::Object{ +class Jnjvm : public mvm::VirtualMachine { public: #ifdef MULTIPLE_GC Collector* GC; @@ -266,6 +267,8 @@ return gc::operator new(sz, VT, GC); } #endif + + virtual void runApplication(int argc, char** argv); }; } // end namespace jnjvm Modified: vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp?rev=54671&r1=54670&r2=54671&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp Tue Aug 12 02:48:20 2008 @@ -327,14 +327,19 @@ } -extern "C" int boot(int argc, char **argv, char **envp) { - initialiseVT(); - initialiseStatics(); - return 0; +void mvm::VirtualMachine::initialiseCLIVM() { + if (!N3::bootstrapVM) { + initialiseVT(); + initialiseStatics(); + } } -extern "C" int start_app(int argc, char** argv) { +void VirtualMachine::runApplication(int argc, char** argv) { + mvm::Thread::threadKey->set(this->bootstrapThread); + ((N3*)this)->runMain(argc, argv); +} + +mvm::VirtualMachine* mvm::VirtualMachine::createCLIVM() { N3* vm = N3::allocate("", N3::bootstrapVM); - vm->runMain(argc, argv); - return 0; + return vm; } Modified: vmkit/trunk/lib/N3/VMCore/VirtualMachine.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VirtualMachine.h?rev=54671&r1=54670&r2=54671&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VirtualMachine.h (original) +++ vmkit/trunk/lib/N3/VMCore/VirtualMachine.h Tue Aug 12 02:48:20 2008 @@ -16,6 +16,7 @@ #include "mvm/Object.h" #include "mvm/PrintBuffer.h" +#include "mvm/VirtualMachine.h" #include "mvm/Threads/Cond.h" #include "mvm/Threads/Locks.h" @@ -43,7 +44,7 @@ static ThreadSystem* allocateThreadSystem(); }; -class VirtualMachine : public mvm::Object{ +class VirtualMachine : public mvm::VirtualMachine { public: static VirtualTable* VT; ThreadSystem* threadSystem; @@ -123,6 +124,9 @@ llvm::Module* module; N3ModuleProvider* TheModuleProvider; VMThread* bootstrapThread; + + virtual void runApplication(int argc, char** argv); + }; } // end namespace n3 From nicolas.geoffray at lip6.fr Tue Aug 12 00:50:17 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 12 Aug 2008 07:50:17 -0000 Subject: [vmkit-commits] [vmkit] r54672 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaIsolate.cpp JavaRuntimeJIT.cpp JnjvmModule.cpp LowerConstantCalls.cpp Message-ID: <200808120750.m7C7oHLa009414@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 12 02:50:17 2008 New Revision: 54672 URL: http://llvm.org/viewvc/llvm-project?rev=54672&view=rev Log: Internalize stuff, so that when linking with other libraries, there are less name conflicts. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp?rev=54672&r1=54671&r2=54672&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp Tue Aug 12 02:50:17 2008 @@ -45,6 +45,7 @@ extern "C" struct JNINativeInterface JNI_JNIEnvTable; extern "C" const struct JNIInvokeInterface JNI_JavaVMTable; +namespace jnjvm { class ClArgumentsInfo { public: @@ -61,6 +62,8 @@ void printVersion(); }; +} + void ClArgumentsInfo::javaAgent(char* cur) { assert(0 && "implement me"); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=54672&r1=54671&r2=54672&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Tue Aug 12 02:50:17 2008 @@ -36,7 +36,7 @@ return vm->UTF8ToStr(val); } -extern "C" void* virtualLookup(CacheNode* cache, JavaObject *obj) { +extern "C" void* jnjvmVirtualLookup(CacheNode* cache, JavaObject *obj) { Enveloppe* enveloppe = cache->enveloppe; JavaCtpInfo* ctpInfo = enveloppe->ctpInfo; CommonClass* ocl = obj->classOf; @@ -156,7 +156,7 @@ return (void*)buf; } -extern "C" void nullPointerException() { +extern "C" void jnjvmNullPointerException() { JavaThread::get()->isolate->nullPointerException("null"); } @@ -168,7 +168,7 @@ JavaThread::get()->isolate->outOfMemoryError(val); } -extern "C" void classCastException(JavaObject* obj, CommonClass* cl) { +extern "C" void jnjvmClassCastException(JavaObject* obj, CommonClass* cl) { JavaThread::get()->isolate->classCastException(""); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=54672&r1=54671&r2=54672&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Tue Aug 12 02:50:17 2008 @@ -1010,7 +1010,7 @@ EnveloppeType = PointerType::getUnqual(module->getTypeByName("Enveloppe")); - InterfaceLookupFunction = module->getFunction("virtualLookup"); + InterfaceLookupFunction = module->getFunction("jnjvmVirtualLookup"); MultiCallNewFunction = module->getFunction("multiCallNew"); InitialisationCheckFunction = module->getFunction("initialisationCheck"); ForceInitialisationCheckFunction = @@ -1044,8 +1044,8 @@ module->getFunction("jniProceedPendingException"); GetSJLJBufferFunction = module->getFunction("getSJLJBuffer"); - NullPointerExceptionFunction = module->getFunction("nullPointerException"); - ClassCastExceptionFunction = module->getFunction("classCastException"); + NullPointerExceptionFunction = module->getFunction("jnjvmNullPointerException"); + ClassCastExceptionFunction = module->getFunction("jnjvmClassCastException"); IndexOutOfBoundsExceptionFunction = module->getFunction("indexOutOfBoundsException"); NegativeArraySizeExceptionFunction = Modified: vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=54672&r1=54671&r2=54672&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Tue Aug 12 02:50:17 2008 @@ -32,8 +32,8 @@ private: }; char LowerConstantCalls::ID = 0; - RegisterPass X("LowerConstantCalls", - "Lower Constant calls"); + static RegisterPass X("LowerConstantCalls", + "Lower Constant calls"); bool LowerConstantCalls::runOnFunction(Function& F) { bool Changed = false; From nicolas.geoffray at lip6.fr Tue Aug 12 00:54:50 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 12 Aug 2008 07:54:50 -0000 Subject: [vmkit-commits] [vmkit] r54673 - /vmkit/trunk/lib/N3/VMCore/VirtualMachine.cpp Message-ID: <200808120754.m7C7sqkN011332@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 12 02:54:42 2008 New Revision: 54673 URL: http://llvm.org/viewvc/llvm-project?rev=54673&view=rev Log: Don't abort if there's an error, just throw an exception for now. Modified: vmkit/trunk/lib/N3/VMCore/VirtualMachine.cpp Modified: vmkit/trunk/lib/N3/VMCore/VirtualMachine.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VirtualMachine.cpp?rev=54673&r1=54672&r2=54673&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VirtualMachine.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/VirtualMachine.cpp Tue Aug 12 02:54:42 2008 @@ -94,7 +94,7 @@ void VirtualMachine::error(const char* className, const char* fmt, va_list ap) { fprintf(stderr, "Internal exception of type %s during bootstrap: ", className); vfprintf(stderr, fmt, ap); - abort(); + throw 1; } void VirtualMachine::indexOutOfBounds(const VMObject* obj, sint32 entry) { From nicolas.geoffray at lip6.fr Tue Aug 12 00:56:01 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 12 Aug 2008 07:56:01 -0000 Subject: [vmkit-commits] [vmkit] r54674 - in /vmkit/trunk/lib/N3/VMCore: CLIJit.cpp LowerArrayLength.cpp N3.cpp VMCache.cpp Message-ID: <200808120756.m7C7u2TB011598@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 12 02:56:01 2008 New Revision: 54674 URL: http://llvm.org/viewvc/llvm-project?rev=54674&view=rev Log: Internalize stuff, so that there are less name conflicts when linking with other libraries. Modified: vmkit/trunk/lib/N3/VMCore/CLIJit.cpp vmkit/trunk/lib/N3/VMCore/LowerArrayLength.cpp vmkit/trunk/lib/N3/VMCore/N3.cpp vmkit/trunk/lib/N3/VMCore/VMCache.cpp Modified: vmkit/trunk/lib/N3/VMCore/CLIJit.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIJit.cpp?rev=54674&r1=54673&r2=54674&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/CLIJit.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/CLIJit.cpp Tue Aug 12 02:56:01 2008 @@ -1526,12 +1526,12 @@ return cl->staticInstance; } -extern "C" void classCastException() { +extern "C" void n3ClassCastException() { fflush(stdout); assert(0 && "implement class cast exception"); } -extern "C" void nullPointerException() { +extern "C" void n3NullPointerException() { fflush(stdout); assert(0 && "implement null pointer exception"); } @@ -1755,7 +1755,7 @@ FunctionType::get(CacheNode::llvmType, args, false); virtualLookupLLVM = Function::Create(type, GlobalValue::ExternalLinkage, - "virtualLookup", module); + "n3VirtualLookup", module); /* virtualLookupLLVM = Function::Create(type, GlobalValue::ExternalLinkage, @@ -1847,7 +1847,7 @@ const FunctionType* type = FunctionType::get(Type::VoidTy, args, false); nullPointerExceptionLLVM = Function::Create(type, GlobalValue::ExternalLinkage, - "nullPointerException", + "n3NullPointerException", module); } @@ -1857,7 +1857,7 @@ const FunctionType* type = FunctionType::get(Type::VoidTy, args, false); classCastExceptionLLVM = Function::Create(type, GlobalValue::ExternalLinkage, - "classCastException", + "n3ClassCastException", module); } Modified: vmkit/trunk/lib/N3/VMCore/LowerArrayLength.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/LowerArrayLength.cpp?rev=54674&r1=54673&r2=54674&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/LowerArrayLength.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/LowerArrayLength.cpp Tue Aug 12 02:56:01 2008 @@ -31,7 +31,7 @@ private: }; char LowerArrayLength::ID = 0; - RegisterPass X("LowerArrayLength", "Lower Array length"); + static RegisterPass X("LowerArrayLength", "Lower Array length"); bool LowerArrayLength::runOnFunction(Function& F) { bool Changed = false; Modified: vmkit/trunk/lib/N3/VMCore/N3.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/N3.cpp?rev=54674&r1=54673&r2=54674&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/N3.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/N3.cpp Tue Aug 12 02:56:01 2008 @@ -153,6 +153,7 @@ return res; } +namespace n3 { class ClArgumentsInfo { public: @@ -166,6 +167,8 @@ void printVersion(); }; +} + void ClArgumentsInfo::nyi() { fprintf(stdout, "Not yet implemented\n"); } @@ -251,8 +254,6 @@ info.readArgs(argc, argv, this); if (info.assembly) { int pos = info.appArgumentsPos; - llvm::cl::ParseCommandLineOptions(pos, argv, - "N3 CLI virtual machine\n"); argv = argv + info.appArgumentsPos - 1; argc = argc - info.appArgumentsPos + 1; Modified: vmkit/trunk/lib/N3/VMCore/VMCache.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMCache.cpp?rev=54674&r1=54673&r2=54674&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMCache.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/VMCache.cpp Tue Aug 12 02:56:01 2008 @@ -158,7 +158,7 @@ } } -extern "C" CacheNode* virtualLookup(CacheNode* cache, VMObject *obj) { +extern "C" CacheNode* n3VirtualLookup(CacheNode* cache, VMObject *obj) { Enveloppe* enveloppe = cache->enveloppe; VMCommonClass* ocl = obj->classOf; VMMethod* orig = enveloppe->originalMethod; From nicolas.geoffray at lip6.fr Tue Aug 12 01:04:01 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 12 Aug 2008 08:04:01 -0000 Subject: [vmkit-commits] [vmkit] r54675 - in /vmkit/trunk: lib/JnJVM/LLVMRuntime/runtime-default.ll lib/Main.cpp lib/Makefile lib/Mvm/Runtime/CommandLine.cpp lib/Mvm/Runtime/CommandLine.h tools/Makefile tools/jnjvm/Main.cpp tools/jnjvm/Makefile tools/n3-mono/Main.cpp tools/n3-mono/Makefile tools/n3-pnetlib/Main.cpp tools/n3-pnetlib/Makefile tools/vmkit/ tools/vmkit/CommandLine.cpp tools/vmkit/CommandLine.h tools/vmkit/Launcher.cpp tools/vmkit/Makefile Message-ID: <200808120804.m7C844qV015284@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 12 03:03:45 2008 New Revision: 54675 URL: http://llvm.org/viewvc/llvm-project?rev=54675&view=rev Log: The Main.cpp file is not shared anymore. The new tool, vmkit, is a vm launcher that can run java apps uising vmkit -java, .Net apps with vmkit -net. There's also an interactive mode with just vmkit. Added: vmkit/trunk/tools/jnjvm/Main.cpp vmkit/trunk/tools/n3-mono/Main.cpp vmkit/trunk/tools/n3-pnetlib/Main.cpp vmkit/trunk/tools/vmkit/ vmkit/trunk/tools/vmkit/CommandLine.cpp vmkit/trunk/tools/vmkit/CommandLine.h vmkit/trunk/tools/vmkit/Launcher.cpp vmkit/trunk/tools/vmkit/Makefile (with props) Removed: vmkit/trunk/lib/Main.cpp vmkit/trunk/lib/Mvm/Runtime/CommandLine.cpp vmkit/trunk/lib/Mvm/Runtime/CommandLine.h Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll vmkit/trunk/lib/Makefile vmkit/trunk/tools/Makefile vmkit/trunk/tools/jnjvm/Makefile vmkit/trunk/tools/n3-mono/Makefile vmkit/trunk/tools/n3-pnetlib/Makefile Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll?rev=54675&r1=54674&r2=54675&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original) +++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Tue Aug 12 03:03:45 2008 @@ -81,7 +81,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; virtualLookup - Used for interface calls. -declare i8* @virtualLookup(%CacheNode*, %JavaObject*) +declare i8* @jnjvmVirtualLookup(%CacheNode*, %JavaObject*) ;;; multiCallNew - Allocate multi-dimensional arrays. This will go to allocation ;;; specific methods. @@ -143,8 +143,8 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Exception methods ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -declare void @nullPointerException() -declare void @classCastException(%JavaObject*, %JavaClass*) +declare void @jnjvmNullPointerException() +declare void @jnjvmClassCastException(%JavaObject*, %JavaClass*) declare void @indexOutOfBoundsException(%JavaObject*, i32) declare void @negativeArraySizeException(i32) declare void @outOfMemoryError(i32) Removed: vmkit/trunk/lib/Main.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Main.cpp?rev=54674&view=auto ============================================================================== --- vmkit/trunk/lib/Main.cpp (original) +++ vmkit/trunk/lib/Main.cpp (removed) @@ -1,34 +0,0 @@ -//===--------- Main.cpp - Simple execution of JnJVM -----------------------===// -// -// JnJVM -// -// This file is distributed under the University of Pierre et Marie Curie -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "MvmGC.h" -#include "mvm/JIT.h" -#include "mvm/Object.h" -#include "mvm/Threads/Thread.h" - -#include "llvm/Support/ManagedStatic.h" - -using namespace mvm; - -extern "C" int boot(); -extern "C" int start_app(int, char**); - -int main(int argc, char **argv, char **envp) { - llvm::llvm_shutdown_obj X; - int base; - - jit::initialise(); - Object::initialise(); - Thread::initialise(); - Collector::initialise(0, &base); - boot(); - start_app(argc, argv); - - return 0; -} Modified: vmkit/trunk/lib/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Makefile?rev=54675&r1=54674&r2=54675&view=diff ============================================================================== --- vmkit/trunk/lib/Makefile (original) +++ vmkit/trunk/lib/Makefile Tue Aug 12 03:03:45 2008 @@ -18,7 +18,5 @@ PARALLEL_DIRS += N3 -LIBRARYNAME = Main - include $(LEVEL)/Makefile.common Removed: vmkit/trunk/lib/Mvm/Runtime/CommandLine.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/CommandLine.cpp?rev=54674&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/CommandLine.cpp (original) +++ vmkit/trunk/lib/Mvm/Runtime/CommandLine.cpp (removed) @@ -1,165 +0,0 @@ -//===------- CommandLine.cpp - Parses the command line --------------------===// -// -// The Micro Virtual Machine -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - - -#include -#include -#include -#include - -#include "CommandLine.h" -#include "MvmGC.h" -#include "mvm/Threads/Thread.h" - -using namespace mvm; - -typedef struct thread_arg_t { - int argc; - char** argv; - vmlet_main_t func; -} thread_arg_t; - -typedef int (*boot_t)(); - - -CommandLine::CommandLine() { - resetString(); - resetArgv(); -} - -void CommandLine::appendChar(char c) { - assert(_yytext); - _yytext[_yylen++]= c; - if (_yylen == _yylenMax) { - _yylenMax *= 2; - _yytext= (char *)realloc(_yytext, _yylenMax); - } -} - -void CommandLine::appendString(char* str) { - assert(argv); - appendChar(0); - argv[argc++] = str; - if (argc == argcMax) { - argcMax *= 2; - argv = (char **)realloc(argv, argcMax * sizeof(char*)); - } -} - -void CommandLine::resetString() { - _yytext = (char *)malloc(_yylenMax= 32); - _yylen = 0; -} - -void CommandLine::resetArgv() { - argv = (char **)malloc(sizeof(char*) * (argcMax= 10)); - argc = 0; -} - - -void CommandLine::start() { - printf("> "); - _yyChar = getc(stdin); - - while (true) { - switch(_yyChar) { - case ' ' : - do { _yyChar = getc(stdin); } while (_yyChar == ' '); - if (_yylen != 0) { - appendString(_yytext); - resetString(); - } - break; - - case '\n' : - if (_yylen != 0) { - appendString(_yytext); - resetString(); - } - if (argc > 1) { - executeInstr(); - resetArgv(); - printf("> "); - } - _yyChar = getc(stdin); - break; - - case EOF : - printf("\n"); - return; - - default : - appendChar(_yyChar); - _yyChar = getc(stdin); - } - } -} - -extern "C" int startApp(thread_arg_t* arg) { - int argc = arg->argc; - char** argv = arg->argv; - vmlet_main_t func = arg->func; - free(arg); -#ifndef MULTIPLE_GC - Collector::inject_my_thread(&argc); - func(argc, argv); - Collector::remove_my_thread(); - Collector::collect(); -#else - Collector* GC = Collector::allocate(); - GC->inject_my_thread(&argc); - func(argc, argv); - GC->remove_my_thread(); - GC->collect(); -#endif - return 0; -} - -void CommandLine::executeInstr() { - if (!strcmp(argv[0], "load")) { - char* buf = (char*)alloca(sizeof(argv[1]) + 7); - sprintf(buf, "lib%s.so", argv[1]); - void* handle = dlopen(buf, RTLD_LAZY | RTLD_GLOBAL); - if (handle == 0) { - fprintf(stderr, "\t Unable to load %s\n", argv[1]); - printf("\t error = %s\n", dlerror()); - return; - } - - boot_t func = (boot_t)(intptr_t)dlsym(handle, "boot"); - - if (func == 0) { - fprintf(stderr, "\t Unable to find %s boot method\n", argv[1]); - dlclose(handle); - return; - } - func(); - - vmlet_main_t vmlet = (vmlet_main_t)(intptr_t)dlsym(handle, "start_app"); - - vmlets[argv[1]] = vmlet; - - } else { - vmlet_main_t func = vmlets[argv[0]]; - if (!func) { - fprintf(stderr, "\t Unknown vmlet %s\n", argv[0]); - } else { -#if 0 - thread_arg_t* thread_arg = (thread_arg_t*)malloc(sizeof (thread_arg_t)); - thread_arg->argc = argc; - thread_arg->argv = argv; - thread_arg->func = func; - int tid = 0; - Thread::start(&tid, (int (*)(void *))startApp, thread_arg); -#else - func(argc, argv); -#endif - } - } -} Removed: vmkit/trunk/lib/Mvm/Runtime/CommandLine.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/CommandLine.h?rev=54674&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/CommandLine.h (original) +++ vmkit/trunk/lib/Mvm/Runtime/CommandLine.h (removed) @@ -1,57 +0,0 @@ -//===--------- CommandLine.h - Parses the command line --------------------===// -// -// The Micro Virtual Machine -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef COMMAND_LINE_H -#define COMMAND_LINE_H - -#include - -#include - -namespace mvm { - -typedef int (*vmlet_main_t)(int argc, char** argv); - -struct ltstr -{ - bool operator()(const char* s1, const char* s2) const - { - return strcmp(s1, s2) < 0; - } -}; - -class CommandLine { -public: - char** argv; - unsigned argc; - unsigned argcMax; - - char* _yytext; - unsigned _yylen; - unsigned _yylenMax; - char _yyChar; - - std::map vmlets; - - CommandLine(); - - void appendChar(char c); - void appendString(char* str); - - void start(); - void executeInstr(); - - void resetArgv(); - void resetString(); - -}; - -} // end namespace mvm - -#endif // COMMAND_LINE_H Modified: vmkit/trunk/tools/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/Makefile?rev=54675&r1=54674&r2=54675&view=diff ============================================================================== --- vmkit/trunk/tools/Makefile (original) +++ vmkit/trunk/tools/Makefile Tue Aug 12 03:03:45 2008 @@ -8,7 +8,7 @@ ##===----------------------------------------------------------------------===## LEVEL = .. -PARALLEL_DIRS = +PARALLEL_DIRS = vmkit include $(LEVEL)/Makefile.config Added: vmkit/trunk/tools/jnjvm/Main.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/jnjvm/Main.cpp?rev=54675&view=auto ============================================================================== --- vmkit/trunk/tools/jnjvm/Main.cpp (added) +++ vmkit/trunk/tools/jnjvm/Main.cpp Tue Aug 12 03:03:45 2008 @@ -0,0 +1,34 @@ +//===--------- Main.cpp - Simple execution of JnJVM -----------------------===// +// +// JnJVM +// +// This file is distributed under the University of Pierre et Marie Curie +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "MvmGC.h" +#include "mvm/JIT.h" +#include "mvm/Object.h" +#include "mvm/VirtualMachine.h" +#include "mvm/Threads/Thread.h" + +#include "llvm/Support/ManagedStatic.h" + +using namespace mvm; + +int main(int argc, char **argv, char **envp) { + llvm::llvm_shutdown_obj X; + int base; + + jit::initialise(); + Object::initialise(); + Thread::initialise(); + Collector::initialise(0, &base); + + VirtualMachine::initialiseJVM(); + VirtualMachine* vm = VirtualMachine::createJVM(); + vm->runApplication(argc, argv); + + return 0; +} Modified: vmkit/trunk/tools/jnjvm/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/jnjvm/Makefile?rev=54675&r1=54674&r2=54675&view=diff ============================================================================== --- vmkit/trunk/tools/jnjvm/Makefile (original) +++ vmkit/trunk/tools/jnjvm/Makefile Tue Aug 12 03:03:45 2008 @@ -11,7 +11,7 @@ include $(LEVEL)/Makefile.config TOOLNAME = jnjvm -USEDLIBS = Allocator CommonThread Mvm JnJVM Classpath Main $(GCLIB) +USEDLIBS = Allocator CommonThread Mvm JnJVM Classpath $(GCLIB) LINK_COMPONENTS = engine scalaropts instrumentation ipa ipo include $(LEVEL)/Makefile.common Added: vmkit/trunk/tools/n3-mono/Main.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/n3-mono/Main.cpp?rev=54675&view=auto ============================================================================== --- vmkit/trunk/tools/n3-mono/Main.cpp (added) +++ vmkit/trunk/tools/n3-mono/Main.cpp Tue Aug 12 03:03:45 2008 @@ -0,0 +1,34 @@ +//===--------- Main.cpp - Simple execution of JnJVM -----------------------===// +// +// JnJVM +// +// This file is distributed under the University of Pierre et Marie Curie +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "MvmGC.h" +#include "mvm/JIT.h" +#include "mvm/Object.h" +#include "mvm/VirtualMachine.h" +#include "mvm/Threads/Thread.h" + +#include "llvm/Support/ManagedStatic.h" + +using namespace mvm; + +int main(int argc, char **argv, char **envp) { + llvm::llvm_shutdown_obj X; + int base; + + jit::initialise(); + Object::initialise(); + Thread::initialise(); + Collector::initialise(0, &base); + + VirtualMachine::initialiseCLIVM(); + VirtualMachine* vm = VirtualMachine::createCLIVM(); + vm->runApplication(argc, argv); + + return 0; +} Modified: vmkit/trunk/tools/n3-mono/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/n3-mono/Makefile?rev=54675&r1=54674&r2=54675&view=diff ============================================================================== --- vmkit/trunk/tools/n3-mono/Makefile (original) +++ vmkit/trunk/tools/n3-mono/Makefile Tue Aug 12 03:03:45 2008 @@ -12,7 +12,7 @@ TOOLNAME = n3-mono LINK_COMPONENTS = engine scalaropts instrumentation ipa ipo -USEDLIBS = Allocator CommonThread Mvm N3 Main $(GCLIB) Mono +USEDLIBS = Allocator CommonThread Mvm N3 $(GCLIB) Mono include $(LEVEL)/Makefile.common Added: vmkit/trunk/tools/n3-pnetlib/Main.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/n3-pnetlib/Main.cpp?rev=54675&view=auto ============================================================================== --- vmkit/trunk/tools/n3-pnetlib/Main.cpp (added) +++ vmkit/trunk/tools/n3-pnetlib/Main.cpp Tue Aug 12 03:03:45 2008 @@ -0,0 +1,34 @@ +//===--------- Main.cpp - Simple execution of JnJVM -----------------------===// +// +// JnJVM +// +// This file is distributed under the University of Pierre et Marie Curie +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "MvmGC.h" +#include "mvm/JIT.h" +#include "mvm/Object.h" +#include "mvm/VirtualMachine.h" +#include "mvm/Threads/Thread.h" + +#include "llvm/Support/ManagedStatic.h" + +using namespace mvm; + +int main(int argc, char **argv, char **envp) { + llvm::llvm_shutdown_obj X; + int base; + + jit::initialise(); + Object::initialise(); + Thread::initialise(); + Collector::initialise(0, &base); + + VirtualMachine::initialiseCLIVM(); + VirtualMachine* vm = VirtualMachine::createCLIVM(); + vm->runApplication(argc, argv); + + return 0; +} Modified: vmkit/trunk/tools/n3-pnetlib/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/n3-pnetlib/Makefile?rev=54675&r1=54674&r2=54675&view=diff ============================================================================== --- vmkit/trunk/tools/n3-pnetlib/Makefile (original) +++ vmkit/trunk/tools/n3-pnetlib/Makefile Tue Aug 12 03:03:45 2008 @@ -12,7 +12,7 @@ TOOLNAME = n3-pnetlib LINK_COMPONENTS = engine scalaropts instrumentation ipa ipo -USEDLIBS = Allocator CommonThread Mvm N3 Main $(GCLIB) PNetLib +USEDLIBS = Allocator CommonThread Mvm N3 $(GCLIB) PNetLib include $(LEVEL)/Makefile.common Added: vmkit/trunk/tools/vmkit/CommandLine.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmkit/CommandLine.cpp?rev=54675&view=auto ============================================================================== --- vmkit/trunk/tools/vmkit/CommandLine.cpp (added) +++ vmkit/trunk/tools/vmkit/CommandLine.cpp Tue Aug 12 03:03:45 2008 @@ -0,0 +1,175 @@ +//===------- CommandLine.cpp - Parses the command line --------------------===// +// +// The Micro Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + +#include +#include +#include +#include + +#include "CommandLine.h" +#include "MvmGC.h" +#include "mvm/Threads/Thread.h" + +using namespace mvm; + +typedef struct thread_arg_t { + int argc; + char** argv; + create_vm_t func; +} thread_arg_t; + + + +CommandLine::CommandLine() { + resetString(); + resetArgv(); +} + +void CommandLine::appendChar(char c) { + assert(_yytext); + _yytext[_yylen++]= c; + if (_yylen == _yylenMax) { + _yylenMax *= 2; + _yytext= (char *)realloc(_yytext, _yylenMax); + } +} + +void CommandLine::appendString(char* str) { + assert(argv); + appendChar(0); + argv[argc++] = str; + if (argc == argcMax) { + argcMax *= 2; + argv = (char **)realloc(argv, argcMax * sizeof(char*)); + } +} + +void CommandLine::resetString() { + _yytext = (char *)malloc(_yylenMax= 32); + _yylen = 0; +} + +void CommandLine::resetArgv() { + argv = (char **)malloc(sizeof(char*) * (argcMax= 10)); + argc = 0; +} + + +void CommandLine::start() { + printf("> "); + _yyChar = getc(stdin); + + while (true) { + switch(_yyChar) { + case ' ' : + do { _yyChar = getc(stdin); } while (_yyChar == ' '); + if (_yylen != 0) { + appendString(_yytext); + resetString(); + } + break; + + case '\n' : + if (_yylen != 0) { + appendString(_yytext); + resetString(); + } + if (argc > 1) { + executeInstr(); + resetArgv(); + printf("> "); + } + _yyChar = getc(stdin); + break; + + case EOF : + printf("\n"); + return; + + default : + appendChar(_yyChar); + _yyChar = getc(stdin); + } + } +} + +extern "C" int startApp(thread_arg_t* arg) { + int argc = arg->argc; + char** argv = arg->argv; + create_vm_t func = arg->func; + free(arg); +#ifndef MULTIPLE_GC + Collector::inject_my_thread(&argc); + VirtualMachine* VM = func(); + VM->runApplication(argc, argv); + Collector::remove_my_thread(); + Collector::collect(); +#else + Collector* GC = Collector::allocate(); + GC->inject_my_thread(&argc); + func(argc, argv); + GC->remove_my_thread(); + GC->collect(); +#endif + return 0; +} + +void CommandLine::executeInstr() { + if (!strcmp(argv[0], "load")) { +#if defined(__APPLE__) + char* buf = (char*)alloca(sizeof(argv[1]) + 7); + sprintf(buf, "%s.dylib", argv[1]); +#else + char* buf = (char*)alloca(sizeof(argv[1]) + 4); + sprintf(buf, "%s.so", argv[1]); +#endif + void* handle = dlopen(buf, RTLD_LAZY | RTLD_GLOBAL); + if (handle == 0) { + fprintf(stderr, "\t Unable to load %s\n", argv[1]); + printf("\t error = %s\n", dlerror()); + return; + } + + boot_t func = (boot_t)(intptr_t)dlsym(handle, "initialiseVirtualMachine"); + + if (func == 0) { + fprintf(stderr, "\t Unable to find %s boot method\n", argv[1]); + dlclose(handle); + return; + } + func(); + + create_vm_t vmlet = (create_vm_t)(intptr_t)dlsym(handle, "createVirtualMachine"); + + vmlets[argv[1]] = vmlet; + + } else { + create_vm_t func = vmlets[argv[0]]; + if (!func) { + fprintf(stderr, "\t Unknown vm %s\n", argv[0]); + } else { +#if 0 + thread_arg_t* thread_arg = (thread_arg_t*)malloc(sizeof (thread_arg_t)); + thread_arg->argc = argc; + thread_arg->argv = argv; + thread_arg->func = func; + int tid = 0; + Thread::start(&tid, (int (*)(void *))startApp, thread_arg); +#else + VirtualMachine* VM = func(); + try { + VM->runApplication(argc, argv); + } catch(...) { + printf("Caught exception when running the VM"); + } +#endif + } + } +} Added: vmkit/trunk/tools/vmkit/CommandLine.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmkit/CommandLine.h?rev=54675&view=auto ============================================================================== --- vmkit/trunk/tools/vmkit/CommandLine.h (added) +++ vmkit/trunk/tools/vmkit/CommandLine.h Tue Aug 12 03:03:45 2008 @@ -0,0 +1,73 @@ +//===--------- CommandLine.h - Parses the command line --------------------===// +// +// The Micro Virtual Machine +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef COMMAND_LINE_H +#define COMMAND_LINE_H + +#include + +#include + +#include "mvm/VirtualMachine.h" + +#if defined(__APPLE__) +#define JNJVM_LIB "Jnjvm.dylib" +#define CLASSPATH_LIB "Classpath.dylib" +#define N3_LIB "N3.dylib" +#define PNET_LIB "Pnetlib.dylib" +#else +#define JNJVM_LIB "Jnjvm.so" +#define CLASSPATH_LIB "Classpath.so" +#define N3_LIB "N3.so" +#define PNET_LIB "Pnetlib.so" +#endif + +typedef int (*boot_t)(); +typedef mvm::VirtualMachine* (*create_vm_t)(); + +namespace mvm { + + +struct ltstr +{ + bool operator()(const char* s1, const char* s2) const + { + return strcmp(s1, s2) < 0; + } +}; + +class CommandLine { +public: + char** argv; + unsigned argc; + unsigned argcMax; + + char* _yytext; + unsigned _yylen; + unsigned _yylenMax; + char _yyChar; + + std::map vmlets; + + CommandLine(); + + void appendChar(char c); + void appendString(char* str); + + void start(); + void executeInstr(); + + void resetArgv(); + void resetString(); + +}; + +} // end namespace mvm + +#endif // COMMAND_LINE_H Added: vmkit/trunk/tools/vmkit/Launcher.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmkit/Launcher.cpp?rev=54675&view=auto ============================================================================== --- vmkit/trunk/tools/vmkit/Launcher.cpp (added) +++ vmkit/trunk/tools/vmkit/Launcher.cpp Tue Aug 12 03:03:45 2008 @@ -0,0 +1,75 @@ +//===--------- Launcher.cpp - Launch command line -------------------------===// +// +// JnJVM +// +// This file is distributed under the University of Pierre et Marie Curie +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include + +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/ManagedStatic.h" + +#include "MvmGC.h" +#include "mvm/JIT.h" +#include "mvm/Object.h" +#include "mvm/VirtualMachine.h" +#include "mvm/Threads/Thread.h" + +#include "CommandLine.h" + +static llvm::cl::opt Java("java", llvm::cl::desc("Run the JVM")); +static llvm::cl::opt Net("net", llvm::cl::desc("Run the .Net VM")); + +int found(char** argv, int argc, const char* name) { + int i = 1; + for (; i < argc; i++) { + if (!(strcmp(name, argv[i]))) return i + 1; + } + return 0; +} + +int main(int argc, char** argv) { + llvm::llvm_shutdown_obj X; + int base; + + mvm::jit::initialise(); + mvm::Object::initialise(); + mvm::Thread::initialise(); + Collector::initialise(0, &base); + Collector::enable(0); + int pos = found(argv, argc, "-java"); + if (pos) { + llvm::cl::ParseCommandLineOptions(pos, argv); + } else { + pos = found(argv, argc, "-net"); + if (pos) { + llvm::cl::ParseCommandLineOptions(pos, argv); + } else { + llvm::cl::ParseCommandLineOptions(argc, argv); + } + } + + if (Java) { + mvm::VirtualMachine::initialiseJVM(); + mvm::VirtualMachine* vm = mvm::VirtualMachine::createJVM(); + vm->runApplication(argc, argv); + } else if (Net) { + mvm::VirtualMachine::initialiseCLIVM(); + mvm::VirtualMachine* vm = mvm::VirtualMachine::createCLIVM(); + vm->runApplication(argc, argv); + } else { + mvm::VirtualMachine::initialiseJVM(); + mvm::VirtualMachine::initialiseCLIVM(); + mvm::VirtualMachine* bootstrapJVM = mvm::VirtualMachine::createJVM(); + mvm::VirtualMachine* bootstrapNet = mvm::VirtualMachine::createCLIVM(); + mvm::CommandLine MyCl; + MyCl.vmlets["java"] = (mvm::VirtualMachine::createJVM); + MyCl.vmlets["net"] = (mvm::VirtualMachine::createCLIVM); + MyCl.start(); + } + + return 0; +} Added: vmkit/trunk/tools/vmkit/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmkit/Makefile?rev=54675&view=auto ============================================================================== --- vmkit/trunk/tools/vmkit/Makefile (added) +++ vmkit/trunk/tools/vmkit/Makefile Tue Aug 12 03:03:45 2008 @@ -0,0 +1,20 @@ +##===- tools/jnjvm/Makefile --------------------------------*- Makefile -*-===## +# +# The vmkit project +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## +LEVEL = ../.. + +include $(LEVEL)/Makefile.config + +TOOLNAME = vmkit +USEDLIBS = Allocator CommonThread Mvm $(GCLIB) JnJVM Classpath PNetLib N3 +LINK_COMPONENTS = engine scalaropts instrumentation ipa ipo + +include $(LEVEL)/Makefile.common + +LIBS += $(PNETLIB)/engine/libILEngine.a $(PNETLIB)/image/libILImage.a $(PNETLIB)/support/libILSupport.a \ + $(PNETLIB)/libffi/.libs/libffi.a $(PNETLIB)//dumpasm/libILDumpAsm.a Propchange: vmkit/trunk/tools/vmkit/Makefile ------------------------------------------------------------------------------ svn:executable = * From nicolas.geoffray at lip6.fr Tue Aug 12 03:10:42 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 12 Aug 2008 10:10:42 -0000 Subject: [vmkit-commits] [vmkit] r54677 - in /vmkit/trunk: Makefile.common.in Makefile.rules lib/Mvm/LLVMRuntime/ lib/Mvm/Runtime/LLVMRuntime.ll lib/Mvm/Runtime/Makefile Message-ID: <200808121010.m7CAAhl3023113@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 12 05:10:40 2008 New Revision: 54677 URL: http://llvm.org/viewvc/llvm-project?rev=54677&view=rev Log: Provide a rule for generating the LLVM runtime. The .ll file can now be in the same folder and generation is only done once. Added: vmkit/trunk/Makefile.rules vmkit/trunk/lib/Mvm/Runtime/LLVMRuntime.ll - copied unchanged from r54639, vmkit/trunk/lib/Mvm/LLVMRuntime/LLVMRuntime.ll Removed: vmkit/trunk/lib/Mvm/LLVMRuntime/ Modified: vmkit/trunk/Makefile.common.in vmkit/trunk/lib/Mvm/Runtime/Makefile Modified: vmkit/trunk/Makefile.common.in URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.common.in?rev=54677&r1=54676&r2=54677&view=diff ============================================================================== --- vmkit/trunk/Makefile.common.in (original) +++ vmkit/trunk/Makefile.common.in Tue Aug 12 05:10:40 2008 @@ -42,3 +42,5 @@ ifeq ($(GCLIB), BoehmGC) LIBS += -lgc endif + +include $(LEVEL)/Makefile.rules Added: vmkit/trunk/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.rules?rev=54677&view=auto ============================================================================== --- vmkit/trunk/Makefile.rules (added) +++ vmkit/trunk/Makefile.rules Tue Aug 12 05:10:40 2008 @@ -0,0 +1,24 @@ +ifdef VMKIT_RUNTIME + +LLFiles := $(strip $(wildcard $(PROJ_SRC_DIR)/*.ll)) +CPPFiles := $(filter %.cpp,$(BUILT_SOURCES)) +.PRECIOUS: $(CPPFiles) + +# All of these files depend on tblgen and the .td files. +$(CPPFiles) : $(LLVMAS) $(LLC) $(LLFiles) + +# CPPFiles rule: All of the tblgen generated files are emitted to +# $(ObjDir)/%.inc.tmp, instead of emitting them directly to %.inc. This allows +# us to only "touch" the real file if the contents of it change. IOW, if +# tblgen is modified, all of the .inc.tmp files are regereated, but no +# dependencies of the .inc files are, unless the contents of the .inc file +# changes. +$(CPPFiles) : %.cpp : %.ll + $(Echo) "Building $( Author: geoffray Date: Tue Aug 12 05:15:34 2008 New Revision: 54678 URL: http://llvm.org/viewvc/llvm-project?rev=54678&view=rev Log: Fix rule to generate .inc files, not .cpp files. Modified: vmkit/trunk/Makefile.rules vmkit/trunk/lib/Mvm/Runtime/JIT.cpp vmkit/trunk/lib/Mvm/Runtime/Makefile Modified: vmkit/trunk/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.rules?rev=54678&r1=54677&r2=54678&view=diff ============================================================================== --- vmkit/trunk/Makefile.rules (original) +++ vmkit/trunk/Makefile.rules Tue Aug 12 05:15:34 2008 @@ -1,11 +1,11 @@ ifdef VMKIT_RUNTIME LLFiles := $(strip $(wildcard $(PROJ_SRC_DIR)/*.ll)) -CPPFiles := $(filter %.cpp,$(BUILT_SOURCES)) +INCFiles := $(filter %.inc,$(BUILT_SOURCES)) .PRECIOUS: $(CPPFiles) # All of these files depend on tblgen and the .td files. -$(CPPFiles) : $(LLVMAS) $(LLC) $(LLFiles) +$(INCFiles) : $(LLVMAS) $(LLC) $(LLFiles) # CPPFiles rule: All of the tblgen generated files are emitted to # $(ObjDir)/%.inc.tmp, instead of emitting them directly to %.inc. This allows @@ -13,12 +13,12 @@ # tblgen is modified, all of the .inc.tmp files are regereated, but no # dependencies of the .inc files are, unless the contents of the .inc file # changes. -$(CPPFiles) : %.cpp : %.ll +$(INCFiles) : %.inc : %.ll $(Echo) "Building $( Author: geoffray Date: Tue Aug 12 05:52:13 2008 New Revision: 54679 URL: http://llvm.org/viewvc/llvm-project?rev=54679&view=rev Log: Only generate a LLVMRuntime.inc file for the LLVM runtime of individual projects: jnjvm has different .ll files depending on the vm configuration. Modified: vmkit/trunk/Makefile.common.in vmkit/trunk/Makefile.config.in vmkit/trunk/Makefile.rules vmkit/trunk/lib/JnJVM/LLVMRuntime/Makefile vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/Mvm/Runtime/JIT.cpp vmkit/trunk/lib/Mvm/Runtime/Makefile Modified: vmkit/trunk/Makefile.common.in URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.common.in?rev=54679&r1=54678&r2=54679&view=diff ============================================================================== --- vmkit/trunk/Makefile.common.in (original) +++ vmkit/trunk/Makefile.common.in Tue Aug 12 05:52:13 2008 @@ -33,11 +33,6 @@ # GC configuration LIBS += -lz -GCLIB = @GC_LIBS@ -GC_MULTI_MMAP = @GC_MULTI_MMAP@ -GC_SINGLE_MMAP = @GC_SINGLE_MMAP@ -GC_BOEHM = @GC_BOEHM@ -GC_MMAP2 = @GC_MMAP2@ ifeq ($(GCLIB), BoehmGC) LIBS += -lgc Modified: vmkit/trunk/Makefile.config.in URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.config.in?rev=54679&r1=54678&r2=54679&view=diff ============================================================================== --- vmkit/trunk/Makefile.config.in (original) +++ vmkit/trunk/Makefile.config.in Tue Aug 12 05:52:13 2008 @@ -3,3 +3,7 @@ WITH_N3_MONO = @WITH_N3_MONO@ WITH_JNJVM = @WITH_JNJVM@ N3_LIB = @N3_LIB@ +GC_MULTI_MMAP = @GC_MULTI_MMAP@ +GC_SINGLE_MMAP = @GC_SINGLE_MMAP@ +GC_BOEHM = @GC_BOEHM@ +GC_MMAP2 = @GC_MMAP2@ Modified: vmkit/trunk/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.rules?rev=54679&r1=54678&r2=54679&view=diff ============================================================================== --- vmkit/trunk/Makefile.rules (original) +++ vmkit/trunk/Makefile.rules Tue Aug 12 05:52:13 2008 @@ -1,24 +1,19 @@ ifdef VMKIT_RUNTIME -LLFiles := $(strip $(wildcard $(PROJ_SRC_DIR)/*.ll)) -INCFiles := $(filter %.inc,$(BUILT_SOURCES)) -.PRECIOUS: $(CPPFiles) +.PRECIOUS: LLVMRuntime.inc # All of these files depend on tblgen and the .td files. -$(INCFiles) : $(LLVMAS) $(LLC) $(LLFiles) +LLVMRuntime.inc : $(LLVMAS) $(LLC) $(LLFiles) -# CPPFiles rule: All of the tblgen generated files are emitted to -# $(ObjDir)/%.inc.tmp, instead of emitting them directly to %.inc. This allows -# us to only "touch" the real file if the contents of it change. IOW, if -# tblgen is modified, all of the .inc.tmp files are regereated, but no -# dependencies of the .inc files are, unless the contents of the .inc file -# changes. -$(INCFiles) : %.inc : %.ll - $(Echo) "Building $( LLVMRuntime.gen.ll + +LLVMRuntime.inc : LLVMRuntime.gen.ll + $(Echo) "Building LLVM runtime" $(Verb) $(LLVMAS) -f $( LLVMRuntime.ll +BUILT_SOURCES = LLVMRuntime.inc -clean:: - rm -f LLVMRuntime.ll LLVMRuntime.bc LLVMRuntime.cpp +include $(LEVEL)/Makefile.common Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=54679&r1=54678&r2=54679&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Tue Aug 12 05:52:13 2008 @@ -965,12 +965,13 @@ #endif -static -#include "LLVMRuntime.cpp" +namespace llvm_runtime { + #include "LLVMRuntime.inc" +} void JnjvmModule::initialise() { Module* module = this; - makeLLVMModuleContents(module); + llvm_runtime::makeLLVMModuleContents(module); VTType = module->getTypeByName("VT"); Modified: vmkit/trunk/lib/Mvm/Runtime/JIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/JIT.cpp?rev=54679&r1=54678&r2=54679&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/JIT.cpp (original) +++ vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Tue Aug 12 05:52:13 2008 @@ -50,8 +50,9 @@ extern "C" void __register_frame(void*); -static -#include "LLVMRuntime.inc" +namespace llvm_runtime { + #include "LLVMRuntime.inc" +} void mvm::jit::initialise() { llvm::NoFramePointerElim = true; @@ -66,7 +67,7 @@ std::string str = executionEngine->getTargetData()->getStringRepresentation(); module->setDataLayout(str); - makeLLVMModuleContents(module); + llvm_runtime::makeLLVMModuleContents(module); printFloatLLVM = module->getFunction("printFloat"); printDoubleLLVM = module->getFunction("printDouble"); Modified: vmkit/trunk/lib/Mvm/Runtime/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/Makefile?rev=54679&r1=54678&r2=54679&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/Makefile (original) +++ vmkit/trunk/lib/Mvm/Runtime/Makefile Tue Aug 12 05:52:13 2008 @@ -11,8 +11,7 @@ include $(LEVEL)/Makefile.config LIBRARYNAME = Mvm -VMKIT_RUNTIME = Mvm - +VMKIT_RUNTIME = LLVMRuntime.ll BUILT_SOURCES = LLVMRuntime.inc include $(LEVEL)/Makefile.common From nicolas.geoffray at lip6.fr Tue Aug 12 04:00:16 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 12 Aug 2008 11:00:16 -0000 Subject: [vmkit-commits] [vmkit] r54680 - /vmkit/trunk/lib/Mvm/Makefile Message-ID: <200808121100.m7CB0JTe024693@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 12 05:59:48 2008 New Revision: 54680 URL: http://llvm.org/viewvc/llvm-project?rev=54680&view=rev Log: LLVMRuntime directory does not exist anymore. Modified: vmkit/trunk/lib/Mvm/Makefile Modified: vmkit/trunk/lib/Mvm/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Makefile?rev=54680&r1=54679&r2=54680&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Makefile (original) +++ vmkit/trunk/lib/Mvm/Makefile Tue Aug 12 05:59:48 2008 @@ -10,6 +10,6 @@ include $(LEVEL)/Makefile.config -DIRS = Allocator CommonThread $(GCLIB) LLVMRuntime Runtime +DIRS = Allocator CommonThread $(GCLIB) Runtime include $(LEVEL)/Makefile.common From nicolas.geoffray at lip6.fr Tue Aug 12 04:01:05 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 12 Aug 2008 11:01:05 -0000 Subject: [vmkit-commits] [vmkit] r54681 - in /vmkit/trunk/lib: JnJVM/VMCore/JnjvmModule.cpp Mvm/Runtime/JIT.cpp Message-ID: <200808121101.m7CB160w024757@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 12 06:01:04 2008 New Revision: 54681 URL: http://llvm.org/viewvc/llvm-project?rev=54681&view=rev Log: Include LLVM runtime in its project's namespace. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=54681&r1=54680&r2=54681&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Tue Aug 12 06:01:04 2008 @@ -965,13 +965,16 @@ #endif -namespace llvm_runtime { - #include "LLVMRuntime.inc" + +namespace jnjvm { + namespace llvm_runtime { + #include "LLVMRuntime.inc" + } } void JnjvmModule::initialise() { Module* module = this; - llvm_runtime::makeLLVMModuleContents(module); + jnjvm::llvm_runtime::makeLLVMModuleContents(module); VTType = module->getTypeByName("VT"); Modified: vmkit/trunk/lib/Mvm/Runtime/JIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/JIT.cpp?rev=54681&r1=54680&r2=54681&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/JIT.cpp (original) +++ vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Tue Aug 12 06:01:04 2008 @@ -50,8 +50,10 @@ extern "C" void __register_frame(void*); -namespace llvm_runtime { - #include "LLVMRuntime.inc" +namespace mvm { + namespace llvm_runtime { + #include "LLVMRuntime.inc" + } } void mvm::jit::initialise() { @@ -67,7 +69,7 @@ std::string str = executionEngine->getTargetData()->getStringRepresentation(); module->setDataLayout(str); - llvm_runtime::makeLLVMModuleContents(module); + mvm::llvm_runtime::makeLLVMModuleContents(module); printFloatLLVM = module->getFunction("printFloat"); printDoubleLLVM = module->getFunction("printDouble"); From nicolas.geoffray at lip6.fr Tue Aug 12 06:21:55 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 12 Aug 2008 13:21:55 -0000 Subject: [vmkit-commits] [vmkit] r54682 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaArray.h JavaClass.cpp JavaClass.h JavaJIT.cpp JnjvmModule.cpp JnjvmModule.h LockedMap.h Message-ID: <200808121321.m7CDLufk028846@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 12 08:21:50 2008 New Revision: 54682 URL: http://llvm.org/viewvc/llvm-project?rev=54682&view=rev Log: Fix compilation for isolate build. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h?rev=54682&r1=54681&r2=54682&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h Tue Aug 12 08:21:50 2008 @@ -167,11 +167,22 @@ bool equals(const UTF8* other) const { return this == other; } + + bool lessThan(const UTF8* other) const { + return this < other; + } #else bool equals(const UTF8* other) const { if (size != other->size) return false; else return !memcmp(elements, other->elements, size * sizeof(uint16)); } + + bool lessThan(const UTF8* other) const { + if (size < other->size) return true; + else if (size > other->size) return false; + else return memcmp((const char*)elements, (const char*)other->elements, + size * sizeof(uint16)) < 0; + } #endif /// print - Prints the UTF8 for debugging purposes. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=54682&r1=54681&r2=54682&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Tue Aug 12 08:21:50 2008 @@ -24,6 +24,7 @@ #include "JavaTypes.h" #include "Jnjvm.h" #include "JnjvmModuleProvider.h" +#include "LockedMap.h" #include "Reader.h" using namespace jnjvm; @@ -80,6 +81,13 @@ return 0; } +bool CommonClass::FieldCmp::operator<(const CommonClass::FieldCmp &cmp) const { + if (name->lessThan(cmp.name)) return true; + else if (cmp.name->lessThan(name)) return false; + else return type->lessThan(cmp.type); +} + + CommonClass::~CommonClass() { free(display); free(virtualVT); @@ -552,10 +560,11 @@ (JavaObject*)JavaThread::get()->isolate->allocateObject(staticSize, staticVT); val->initialise(this); - for (std::vector::iterator i = this->staticFields.begin(), + for (field_iterator i = this->staticFields.begin(), e = this->staticFields.end(); i!= e; ++i) { - (*i)->initField(val); + JavaField* cur = i->second; + cur->initField(val); } Jnjvm* vm = JavaThread::get()->isolate; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=54682&r1=54681&r2=54682&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Tue Aug 12 08:21:50 2008 @@ -136,11 +136,7 @@ FieldCmp(const UTF8* n, const UTF8* t) : name(n), type(t) {} - inline bool operator<(const FieldCmp &cmp) const { - if (name < cmp.name) return true; - else if (name > cmp.name) return false; - else return type < cmp.type; - } + inline bool operator<(const FieldCmp &cmp) const; }; public: Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=54682&r1=54681&r2=54682&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Tue Aug 12 08:21:50 2008 @@ -1105,9 +1105,9 @@ #else val = (void*)utf8; gv = - new GlobalVariable(JnjvmModule::ArrayUInt16Type, false, + new GlobalVariable(JnjvmModule::JavaArrayUInt16Type, false, GlobalValue::ExternalLinkage, - UTF8NullConstant, "", + JnjvmModule::UTF8NullConstant, "", module); #endif Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=54682&r1=54681&r2=54682&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Tue Aug 12 08:21:50 2008 @@ -131,11 +131,11 @@ Value* LLVMCommonClassInfo::getVar(JavaJIT* jit) { if (!varGV) { #ifdef MULTIPLE_VM - if (jit->compilingClass->isolate->module == Jnjvm::bootstrapVM->module && - isArray && classDef->isolate != Jnjvm::bootstrapVM) { + if (jit->compilingClass->isolate->TheModule == Jnjvm::bootstrapVM->TheModule && + classDef->isArray && classDef->isolate != Jnjvm::bootstrapVM) { // We know the array class can belong to bootstrap - CommonClass* cl = Jnjvm::bootstrapVM->constructArray(this->name, 0); - return getVar(cl, jit); + CommonClass* cl = Jnjvm::bootstrapVM->constructArray(classDef->name, 0); + return cl->isolate->TheModule->getClassInfo(cl)->getVar(jit); } #endif @@ -166,8 +166,8 @@ } return new LoadInst(delegateeGV, "", jit->currentBlock); #else - Value* ld = llvmVar(jit); - return llvm::CallInst::Create(JnjvmModule::getClassDelegateeLLVM, ld, "", + Value* ld = getVar(jit); + return llvm::CallInst::Create(JnjvmModule::GetClassDelegateeFunction, ld, "", jit->currentBlock); #endif } @@ -472,8 +472,7 @@ return new LoadInst(staticVarGV, "", jit->currentBlock); #else - Value* var = getVar(jit->compilingClass->isolate->module); - Value* ld = new LoadInst(var, "", jit->currentBlock); + Value* ld = getVar(jit); ld = jit->invoke(JnjvmModule::InitialisationCheckFunction, ld, "", jit->currentBlock); return jit->invoke(JnjvmModule::GetStaticInstanceFunction, ld, Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=54682&r1=54681&r2=54682&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Tue Aug 12 08:21:50 2008 @@ -73,8 +73,11 @@ LLVMCommonClassInfo(CommonClass* cl, JnjvmModule* M) : classDef(cl), module(M), - varGV(0), - delegateeGV(0) {} + varGV(0) +#ifndef MULTIPLE_VM + ,delegateeGV(0) +#endif + {} }; class LLVMClassInfo : public LLVMCommonClassInfo { Modified: vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h?rev=54682&r1=54681&r2=54682&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h Tue Aug 12 08:21:50 2008 @@ -33,20 +33,10 @@ struct ltutf8 { -#ifdef MULTIPLE_VM bool operator()(const UTF8* s1, const UTF8* s2) const { - if (s1->size < s2->size) return true; - else if (s1->size > s2->size) return false; - else return memcmp((const char*)s1->elements, (const char*)s2->elements, - s1->size * sizeof(uint16)) < 0; + return s1->lessThan(s2); } -#else - bool operator()(const UTF8* s1, const UTF8* s2) const - { - return s1 < s2; - } -#endif }; template From nicolas.geoffray at lip6.fr Tue Aug 12 06:22:29 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 12 Aug 2008 13:22:29 -0000 Subject: [vmkit-commits] [vmkit] r54683 - in /vmkit/trunk: Makefile.common.in Makefile.config.in autoconf/configure.ac configure Message-ID: <200808121322.m7CDMUUL028878@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 12 08:22:29 2008 New Revision: 54683 URL: http://llvm.org/viewvc/llvm-project?rev=54683&view=rev Log: Fix compilation of isolate build. Modified: vmkit/trunk/Makefile.common.in vmkit/trunk/Makefile.config.in vmkit/trunk/autoconf/configure.ac vmkit/trunk/configure Modified: vmkit/trunk/Makefile.common.in URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.common.in?rev=54683&r1=54682&r2=54683&view=diff ============================================================================== --- vmkit/trunk/Makefile.common.in (original) +++ vmkit/trunk/Makefile.common.in Tue Aug 12 08:22:29 2008 @@ -23,7 +23,7 @@ # Include LLVM's Master Makefile. include $(LLVM_OBJ_ROOT)/Makefile.common -CXX.Flags += @GC_FLAGS@ -Wno-variadic-macros -fno-omit-frame-pointer -ansi +CXX.Flags += @GC_FLAGS@ @VM_FLAGS@ -Wno-variadic-macros -fno-omit-frame-pointer -ansi # GNU Classpath flags CLASSPATH_FLAGS = @classpathinclude@ Modified: vmkit/trunk/Makefile.config.in URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.config.in?rev=54683&r1=54682&r2=54683&view=diff ============================================================================== --- vmkit/trunk/Makefile.config.in (original) +++ vmkit/trunk/Makefile.config.in Tue Aug 12 08:22:29 2008 @@ -7,3 +7,5 @@ GC_SINGLE_MMAP = @GC_SINGLE_MMAP@ GC_BOEHM = @GC_BOEHM@ GC_MMAP2 = @GC_MMAP2@ +ISOLATE_BUILD = @ISOLATE_BUILD@ +SERVICE_BUILD = @SERVICE_BUILD@ Modified: vmkit/trunk/autoconf/configure.ac URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/autoconf/configure.ac?rev=54683&r1=54682&r2=54683&view=diff ============================================================================== --- vmkit/trunk/autoconf/configure.ac (original) +++ vmkit/trunk/autoconf/configure.ac Tue Aug 12 08:22:29 2008 @@ -222,18 +222,19 @@ ) if test "x$vmtype" = "xmulti"; then - CFLAGS="$CFLAGS -DMULTIPLE_VM" - CXXFLAGS="$CXXFLAGS -DMULTIPLE_VM" + VM_FLAGS="-DMULTIPLE_VM" + ISOLATE_BUILD=1 else if test "x$vmtype" = "xservice"; then - CFLAGS="$CFLAGS -DMULTIPLE_VM -DSERVICE_GC -DMULTIPLE_GC -DSERVICE_VM -I$PWD/lib/Mvm/Allocator" - CXXFLAGS="$CXXFLAGS -DMULTIPLE_VM -DSERVICE_GC -DMULTIPLE_GC -DSERVICE_VM -I$PWD/lib/Mvm/Allocator" + VM_FLAGS="-DMULTIPLE_VM -DSERVICE_GC -DMULTIPLE_GC -DSERVICE_VM -I$PWD/lib/Mvm/Allocator" + SERVICE_BUILD=1 fi fi -AM_CONDITIONAL([SERVICE_BUILD], [test "x$vmtype" = "xservice"]) -AM_CONDITIONAL([ISOLATE_BUILD], [test "x$vmtype" = "xmulti"]) - +AC_SUBST([SERVICE_BUILD]) +AC_SUBST([ISOLATE_BUILD]) +AC_SUBST([VM_FLAGS]) + dnl ************************************************************************** dnl GNU CLASSPATH installation prefix dnl ************************************************************************** Modified: vmkit/trunk/configure URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/configure?rev=54683&r1=54682&r2=54683&view=diff ============================================================================== --- vmkit/trunk/configure (original) +++ vmkit/trunk/configure Tue Aug 12 08:22:29 2008 @@ -687,10 +687,9 @@ GC_SINGLE_MMAP GC_FLAGS GC_LIBS -SERVICE_BUILD_TRUE -SERVICE_BUILD_FALSE -ISOLATE_BUILD_TRUE -ISOLATE_BUILD_FALSE +SERVICE_BUILD +ISOLATE_BUILD +VM_FLAGS classpathglibj classpathlibs classpathinclude @@ -3943,30 +3942,17 @@ if test "x$vmtype" = "xmulti"; then - CFLAGS="$CFLAGS -DMULTIPLE_VM" - CXXFLAGS="$CXXFLAGS -DMULTIPLE_VM" + VM_FLAGS="-DMULTIPLE_VM" + ISOLATE_BUILD=1 else if test "x$vmtype" = "xservice"; then - CFLAGS="$CFLAGS -DMULTIPLE_VM -DSERVICE_GC -DMULTIPLE_GC -DSERVICE_VM -I$PWD/lib/Mvm/Allocator" - CXXFLAGS="$CXXFLAGS -DMULTIPLE_VM -DSERVICE_GC -DMULTIPLE_GC -DSERVICE_VM -I$PWD/lib/Mvm/Allocator" + VM_FLAGS="-DMULTIPLE_VM -DSERVICE_GC -DMULTIPLE_GC -DSERVICE_VM -I$PWD/lib/Mvm/Allocator" + SERVICE_BUILD=1 fi fi - if test "x$vmtype" = "xservice"; then - SERVICE_BUILD_TRUE= - SERVICE_BUILD_FALSE='#' -else - SERVICE_BUILD_TRUE='#' - SERVICE_BUILD_FALSE= -fi - if test "x$vmtype" = "xmulti"; then - ISOLATE_BUILD_TRUE= - ISOLATE_BUILD_FALSE='#' -else - ISOLATE_BUILD_TRUE='#' - ISOLATE_BUILD_FALSE= -fi + @@ -7242,20 +7228,6 @@ LTLIBOBJS=$ac_ltlibobjs -if test -z "${SERVICE_BUILD_TRUE}" && test -z "${SERVICE_BUILD_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"SERVICE_BUILD\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"SERVICE_BUILD\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${ISOLATE_BUILD_TRUE}" && test -z "${ISOLATE_BUILD_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"ISOLATE_BUILD\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"ISOLATE_BUILD\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files @@ -7862,10 +7834,9 @@ GC_SINGLE_MMAP!$GC_SINGLE_MMAP$ac_delim GC_FLAGS!$GC_FLAGS$ac_delim GC_LIBS!$GC_LIBS$ac_delim -SERVICE_BUILD_TRUE!$SERVICE_BUILD_TRUE$ac_delim -SERVICE_BUILD_FALSE!$SERVICE_BUILD_FALSE$ac_delim -ISOLATE_BUILD_TRUE!$ISOLATE_BUILD_TRUE$ac_delim -ISOLATE_BUILD_FALSE!$ISOLATE_BUILD_FALSE$ac_delim +SERVICE_BUILD!$SERVICE_BUILD$ac_delim +ISOLATE_BUILD!$ISOLATE_BUILD$ac_delim +VM_FLAGS!$VM_FLAGS$ac_delim classpathglibj!$classpathglibj$ac_delim classpathlibs!$classpathlibs$ac_delim classpathinclude!$classpathinclude$ac_delim @@ -7890,6 +7861,7 @@ MV!$MV$ac_delim RANLIB!$RANLIB$ac_delim RM!$RM$ac_delim +SED!$SED$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then @@ -7931,7 +7903,6 @@ ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF -SED!$SED$ac_delim TAR!$TAR$ac_delim BINPWD!$BINPWD$ac_delim CAT!$CAT$ac_delim @@ -7946,7 +7917,7 @@ LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 13; then + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 12; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 From nicolas.geoffray at lip6.fr Tue Aug 12 06:29:58 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 12 Aug 2008 13:29:58 -0000 Subject: [vmkit-commits] [vmkit] r54684 - in /vmkit/trunk: lib/Makefile tools/vmkit/Makefile Message-ID: <200808121330.m7CDU2K8029095@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 12 08:29:43 2008 New Revision: 54684 URL: http://llvm.org/viewvc/llvm-project?rev=54684&view=rev Log: Fix lib dependency of makefiles. Modified: vmkit/trunk/lib/Makefile vmkit/trunk/tools/vmkit/Makefile Modified: vmkit/trunk/lib/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Makefile?rev=54684&r1=54683&r2=54684&view=diff ============================================================================== --- vmkit/trunk/lib/Makefile (original) +++ vmkit/trunk/lib/Makefile Tue Aug 12 08:29:43 2008 @@ -16,7 +16,9 @@ PARALLEL_DIRS += JnJVM endif +ifeq ($(WITH_N3_MONO), 1) || ($(WITH_N3_PNETLIB), 1) PARALLEL_DIRS += N3 +endif include $(LEVEL)/Makefile.common Modified: vmkit/trunk/tools/vmkit/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmkit/Makefile?rev=54684&r1=54683&r2=54684&view=diff ============================================================================== --- vmkit/trunk/tools/vmkit/Makefile (original) +++ vmkit/trunk/tools/vmkit/Makefile Tue Aug 12 08:29:43 2008 @@ -11,10 +11,21 @@ include $(LEVEL)/Makefile.config TOOLNAME = vmkit -USEDLIBS = Allocator CommonThread Mvm $(GCLIB) JnJVM Classpath PNetLib N3 +USEDLIBS = Allocator CommonThread Mvm $(GCLIB) + +ifeq ($(WITH_JNJVM), 1) +USEDLIBS += JnJVM Classpath +endif + +ifeq ($(WITH_N3_PNETLIB), 1) + USEDLIBS += N3 PNetLib +endif + LINK_COMPONENTS = engine scalaropts instrumentation ipa ipo include $(LEVEL)/Makefile.common +ifeq ($(WITH_N3_PNETLIB), 1) LIBS += $(PNETLIB)/engine/libILEngine.a $(PNETLIB)/image/libILImage.a $(PNETLIB)/support/libILSupport.a \ $(PNETLIB)/libffi/.libs/libffi.a $(PNETLIB)//dumpasm/libILDumpAsm.a +endif From nicolas.geoffray at lip6.fr Tue Aug 12 11:05:01 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 12 Aug 2008 18:05:01 -0000 Subject: [vmkit-commits] [vmkit] r54689 - /vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Message-ID: <200808121805.m7CI5ElG006275@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 12 13:04:19 2008 New Revision: 54689 URL: http://llvm.org/viewvc/llvm-project?rev=54689&view=rev Log: Add an assert when allocating an object to verify the class has been initialized. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=54689&r1=54688&r2=54689&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Tue Aug 12 13:04:19 2008 @@ -405,6 +405,7 @@ } JavaObject* Class::doNew(Jnjvm* vm) { + assert(this->isReady() && "Uninitialized class when allocating."); JavaObject* res = (JavaObject*)vm->allocateObject(virtualSize, virtualVT); res->classOf = this; return res; From nicolas.geoffray at lip6.fr Tue Aug 12 11:06:11 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 12 Aug 2008 18:06:11 -0000 Subject: [vmkit-commits] [vmkit] r54690 - /vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Message-ID: <200808121806.m7CI6CsU006333@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 12 13:06:10 2008 New Revision: 54690 URL: http://llvm.org/viewvc/llvm-project?rev=54690&view=rev Log: Fix compilation in debug mode. --This line, andthose below, will be ignored-- M JavaJIT.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=54690&r1=54689&r2=54690&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Tue Aug 12 13:06:10 2008 @@ -659,8 +659,8 @@ { std::vector args; args.push_back(ConstantInt::get(Type::Int32Ty, (int64_t)compilingMethod)); - llvm::CallInst::Create(printMethodStartLLVM, args.begin(), args.end(), "", - currentBlock); + llvm::CallInst::Create(JnjvmModule::PrintMethodStartFunction, args.begin(), + args.end(), "", currentBlock); } #endif From nicolas.geoffray at lip6.fr Tue Aug 12 11:07:33 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 12 Aug 2008 18:07:33 -0000 Subject: [vmkit-commits] [vmkit] r54691 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaIsolate.cpp JavaUpcalls.cpp Message-ID: <200808121807.m7CI7Y1p006406@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 12 13:07:28 2008 New Revision: 54691 URL: http://llvm.org/viewvc/llvm-project?rev=54691&view=rev Log: Perform initialization of bootstrap classes when loading the bootstrap of a jvm. Also initialize the VMThrowable class during bootstrap. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp?rev=54691&r1=54690&r2=54691&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp Tue Aug 12 13:07:28 2008 @@ -318,6 +318,8 @@ } void JavaIsolate::loadBootstrap() { + loadName(Classpath::newVMThrowable->name, + CommonClass::jnjvmClassLoader, true, true, true); loadName(Classpath::newClass->name, CommonClass::jnjvmClassLoader, true, true, true); loadName(Classpath::newConstructor->name, Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=54691&r1=54690&r2=54691&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Tue Aug 12 13:07:28 2008 @@ -389,12 +389,12 @@ vm->loadName(vm->asciizConstructUTF8("java/lang/String"), CommonClass::jnjvmClassLoader, true, - true, false); + false, false); CommonClass* object = vm->loadName(vm->asciizConstructUTF8("java/lang/Object"), CommonClass::jnjvmClassLoader, true, - true, false); + false, false); COMPILE_METHODS(object) JavaMethod* getCallingClass = From nicolas.geoffray at lip6.fr Wed Aug 13 02:17:59 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 13 Aug 2008 09:17:59 -0000 Subject: [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 Message-ID: <200808130918.m7D9I1kq018529@zion.cs.uiuc.edu> 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 + Ty *getInfo() { + if (!JInfo) { + JInfo = new Ty(this); + } + + assert((void*)dynamic_cast(JInfo) == (void*)JInfo && + "Invalid concrete type or multiple inheritence for getInfo"); + return static_cast(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 + Ty *getInfo() { + if (!JInfo) { + JInfo = new Ty(this); + } + + assert((void*)dynamic_cast(JInfo) == (void*)JInfo && + "Invalid concrete type or multiple inheritence for getInfo"); + return static_cast(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 + Ty *getInfo() { + if (!JInfo) { + JInfo = new Ty(this); + } + + assert((void*)dynamic_cast(JInfo) == (void*)JInfo && + "Invalid concrete type or multiple inheritence for getInfo"); + return static_cast(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*, mvm::PrintBuffer* buf); + static void humanPrintArgs(const std::vector*, + 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 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 + Ty *getInfo() { + if (!JInfo) { + JInfo = new Ty(this); + } + + assert((void*)dynamic_cast(JInfo) == (void*)JInfo && + "Invalid concrete type or multiple inheritence for getInfo"); + return static_cast(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 classMap; - std::map signatureMap; - std::map fieldMap; - std::map methodMap; - -#ifdef SERVICE_VM - std::map serviceMap; - typedef std::map::iterator - class_iterator; -#endif - - typedef std::map::iterator - class_iterator; - typedef std::map::iterator - signature_iterator; - - typedef std::map::iterator - method_iterator; - - typedef std::map::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(); + } + + static LLVMCommonClassInfo* getClassInfo(CommonClass* cl) { + if (cl->isArray || cl->isPrimitive) { + return cl->getInfo(); + } else { + return cl->getInfo(); + } + } + + static LLVMFieldInfo* getFieldInfo(JavaField* field) { + return field->getInfo(); + } + + static LLVMMethodInfo* getMethodInfo(JavaMethod* method) { + return method->getInfo(); + } + #ifdef SERVICE_VM - LLVMServiceInfo* getServiceInfo(ServiceDomain*); + static LLVMServiceInfo* getServiceInfo(ServiceDomain* service) { + return service->getInfo(); + } #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 map; + typedef std::map::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*, std::less > { 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)(); From nicolas.geoffray at lip6.fr Wed Aug 13 02:27:27 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 13 Aug 2008 09:27:27 -0000 Subject: [vmkit-commits] [vmkit] r54727 - /vmkit/trunk/include/mvm/JIT.h Message-ID: <200808130927.m7D9RSt8022524@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 13 04:27:20 2008 New Revision: 54727 URL: http://llvm.org/viewvc/llvm-project?rev=54727&view=rev Log: Oops, forgot to commit the JITInfo class. Modified: vmkit/trunk/include/mvm/JIT.h Modified: vmkit/trunk/include/mvm/JIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/JIT.h?rev=54727&r1=54726&r2=54727&view=diff ============================================================================== --- vmkit/trunk/include/mvm/JIT.h (original) +++ vmkit/trunk/include/mvm/JIT.h Wed Aug 13 04:27:20 2008 @@ -30,6 +30,14 @@ namespace mvm { +/// JITInfo - This class can be derived from to hold private JIT-specific +/// information. Objects of type are accessed/created with +/// ::getInfo and destroyed when the object is destroyed. +struct JITInfo { + virtual ~JITInfo() {} +}; + + namespace jit { const double MaxDouble = +INFINITY; //1.0 / 0.0; From nicolas.geoffray at lip6.fr Wed Aug 13 02:27:55 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 13 Aug 2008 09:27:55 -0000 Subject: [vmkit-commits] [vmkit] r54728 - /vmkit/trunk/lib/N3/VMCore/N3.cpp Message-ID: <200808130927.m7D9RtUO022552@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 13 04:27:55 2008 New Revision: 54728 URL: http://llvm.org/viewvc/llvm-project?rev=54728&view=rev Log: Remove a warning. Modified: vmkit/trunk/lib/N3/VMCore/N3.cpp Modified: vmkit/trunk/lib/N3/VMCore/N3.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/N3.cpp?rev=54728&r1=54727&r2=54728&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/N3.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/N3.cpp Wed Aug 13 04:27:55 2008 @@ -253,7 +253,6 @@ info.readArgs(argc, argv, this); if (info.assembly) { - int pos = info.appArgumentsPos; argv = argv + info.appArgumentsPos - 1; argc = argc - info.appArgumentsPos + 1; From nicolas.geoffray at lip6.fr Wed Aug 13 02:28:19 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 13 Aug 2008 09:28:19 -0000 Subject: [vmkit-commits] [vmkit] r54729 - in /vmkit/trunk: Makefile.config.in Makefile.rules autoconf/configure.ac configure lib/Makefile Message-ID: <200808130928.m7D9SK5N022577@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 13 04:28:19 2008 New Revision: 54729 URL: http://llvm.org/viewvc/llvm-project?rev=54729&view=rev Log: Makefile fixes. Modified: vmkit/trunk/Makefile.config.in vmkit/trunk/Makefile.rules vmkit/trunk/autoconf/configure.ac vmkit/trunk/configure vmkit/trunk/lib/Makefile Modified: vmkit/trunk/Makefile.config.in URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.config.in?rev=54729&r1=54728&r2=54729&view=diff ============================================================================== --- vmkit/trunk/Makefile.config.in (original) +++ vmkit/trunk/Makefile.config.in Wed Aug 13 04:28:19 2008 @@ -1,4 +1,5 @@ GCLIB = @GC_LIBS@ +WITH_N3 = @WITH_N3@ WITH_N3_PNETLIB = @WITH_N3_PNETLIB@ WITH_N3_MONO = @WITH_N3_MONO@ WITH_JNJVM = @WITH_JNJVM@ Modified: vmkit/trunk/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.rules?rev=54729&r1=54728&r2=54729&view=diff ============================================================================== --- vmkit/trunk/Makefile.rules (original) +++ vmkit/trunk/Makefile.rules Wed Aug 13 04:28:19 2008 @@ -3,13 +3,13 @@ .PRECIOUS: LLVMRuntime.inc # All of these files depend on tblgen and the .td files. -LLVMRuntime.inc : $(LLVMAS) $(LLC) $(LLFiles) +LLVMRuntime.inc : $(LLVMAS) $(LLC) $(VMKIT_RUNTIME) LLVMRuntime.gen.ll : $(VMKIT_RUNTIME) $(Verb) cat $(VMKIT_RUNTIME) > LLVMRuntime.gen.ll LLVMRuntime.inc : LLVMRuntime.gen.ll - $(Echo) "Building LLVM runtime" + $(Echo) "Building LLVM runtime with $(VMKIT_RUNTIME)" $(Verb) $(LLVMAS) -f $(conf$$subs.sed <<_ACEOF +SED!$SED$ac_delim TAR!$TAR$ac_delim BINPWD!$BINPWD$ac_delim CAT!$CAT$ac_delim @@ -7917,7 +7925,7 @@ LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 12; then + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 13; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 Modified: vmkit/trunk/lib/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Makefile?rev=54729&r1=54728&r2=54729&view=diff ============================================================================== --- vmkit/trunk/lib/Makefile (original) +++ vmkit/trunk/lib/Makefile Wed Aug 13 04:28:19 2008 @@ -16,7 +16,7 @@ PARALLEL_DIRS += JnJVM endif -ifeq ($(WITH_N3_MONO), 1) || ($(WITH_N3_PNETLIB), 1) +ifeq ($(WITH_N3), 1) PARALLEL_DIRS += N3 endif From nicolas.geoffray at lip6.fr Wed Aug 13 04:29:17 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 13 Aug 2008 11:29:17 -0000 Subject: [vmkit-commits] [vmkit] r54730 - /vmkit/trunk/tools/vmkit/Launcher.cpp Message-ID: <200808131129.m7DBTHgr026191@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 13 06:29:15 2008 New Revision: 54730 URL: http://llvm.org/viewvc/llvm-project?rev=54730&view=rev Log: Make the VM to run an enum. Modified: vmkit/trunk/tools/vmkit/Launcher.cpp Modified: vmkit/trunk/tools/vmkit/Launcher.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmkit/Launcher.cpp?rev=54730&r1=54729&r2=54730&view=diff ============================================================================== --- vmkit/trunk/tools/vmkit/Launcher.cpp (original) +++ vmkit/trunk/tools/vmkit/Launcher.cpp Wed Aug 13 06:29:15 2008 @@ -20,8 +20,16 @@ #include "CommandLine.h" -static llvm::cl::opt Java("java", llvm::cl::desc("Run the JVM")); -static llvm::cl::opt Net("net", llvm::cl::desc("Run the .Net VM")); +enum VMType { + Interactive, RunJava, RunNet +}; + +static llvm::cl::opt VMToRun(llvm::cl::desc("Choose VM to run:"), + llvm::cl::values( + clEnumValN(Interactive , "i", "Run in interactive mode"), + clEnumValN(RunJava , "java", "Run the JVM"), + clEnumValN(RunNet, "net", "Run the CLI VM"), + clEnumValEnd)); int found(char** argv, int argc, const char* name) { int i = 1; @@ -52,19 +60,17 @@ } } - if (Java) { + if (VMToRun == RunJava) { mvm::VirtualMachine::initialiseJVM(); mvm::VirtualMachine* vm = mvm::VirtualMachine::createJVM(); vm->runApplication(argc, argv); - } else if (Net) { + } else if (VMToRun == RunNet) { mvm::VirtualMachine::initialiseCLIVM(); mvm::VirtualMachine* vm = mvm::VirtualMachine::createCLIVM(); vm->runApplication(argc, argv); } else { mvm::VirtualMachine::initialiseJVM(); mvm::VirtualMachine::initialiseCLIVM(); - mvm::VirtualMachine* bootstrapJVM = mvm::VirtualMachine::createJVM(); - mvm::VirtualMachine* bootstrapNet = mvm::VirtualMachine::createCLIVM(); mvm::CommandLine MyCl; MyCl.vmlets["java"] = (mvm::VirtualMachine::createJVM); MyCl.vmlets["net"] = (mvm::VirtualMachine::createCLIVM); From nicolas.geoffray at lip6.fr Wed Aug 13 05:01:43 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 13 Aug 2008 12:01:43 -0000 Subject: [vmkit-commits] [vmkit] r54731 - /vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h Message-ID: <200808131201.m7DC1hlS027266@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 13 07:01:40 2008 New Revision: 54731 URL: http://llvm.org/viewvc/llvm-project?rev=54731&view=rev Log: Commentify. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h?rev=54731&r1=54730&r2=54731&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h Wed Aug 13 07:01:40 2008 @@ -40,6 +40,10 @@ typedef JavaArray* (*arrayCtor_t)(uint32 len, CommonClass* cl, Jnjvm* vm); + +/// AssessorDesc - Description of a Java assessor: these are the letters found +/// in Java signatures, e.g. "I" or "(". +/// class AssessorDesc { public: static VirtualTable *VT; @@ -59,42 +63,135 @@ static const char I_BOOL; static const char I_SEP; + /// doTrace - Is this assessor for garbage collected objects? True for + /// the "L" assessor and the "[" assessor. + /// bool doTrace; + + /// byteId - Letter reprensenting this assessor. + /// char byteId; + + /// nbb - Number of bytes of instances of this assessor (e.g. 4 for "I"). + /// uint32 nbb; + + /// nbw - Number of words of instances if this assessor (e.g. 8 for "D"). + /// uint32 nbw; + + /// numId - A byte identifier from 0 to the number of assessors. + /// uint8 numId; + /// asciizName - The name of the assessor in asciiz, e.g. "void" for "V". + /// const char* asciizName; + + /// UTF8Name - The name of the assessor in UTF8, e.g. "void" for "V". + /// + const UTF8* UTF8Name; + + /// classType - The primitive Java class of this assessor. This class + /// is internal to the JVM. + /// CommonClass* classType; + + /// assocClassName - The associated class name, e.g. "java/lang/Integer" for + /// "I". + /// const UTF8* assocClassName; - const UTF8* UTF8Name; + + /// arrayClass - The primitive array class of the assessor, e.g. I[] for "I". + /// ClassArray* arrayClass; + + /// arrayCtor - The constructor of an array of this assessor. + /// arrayCtor_t arrayCtor; +//===----------------------------------------------------------------------===// +// +// The set of assessors in Java. This set is unique and there are no other +// assessors. +// +//===----------------------------------------------------------------------===// + + + /// dParg - The "(" assessor. + /// static AssessorDesc* dParg; + + /// dPard - The ")" assessor. + /// static AssessorDesc* dPard; + + /// dVoid - The "V" assessor. + /// static AssessorDesc* dVoid; + + /// dBool - The "Z" assessor. + /// static AssessorDesc* dBool; + + /// dByte - The "B" assessor. + /// static AssessorDesc* dByte; + + /// dChar - The "C" assessor. + /// static AssessorDesc* dChar; + + /// dShort - The "S" assessor. + /// static AssessorDesc* dShort; + + /// dInt - The "I" assessor. + /// static AssessorDesc* dInt; + + /// dFloat - The "F" assessor. + /// static AssessorDesc* dFloat; + + /// dLong - The "J" assessor. + /// static AssessorDesc* dLong; + + /// dDouble - The "D" assessor. + /// static AssessorDesc* dDouble; + + /// dTab - The "[" assessor. + /// static AssessorDesc* dTab; + + /// dRef - The "L" assessor. + /// static AssessorDesc* dRef; +//===----------------------------------------------------------------------===// +// +// End of assessors. +// +//===----------------------------------------------------------------------===// + + /// AssessorDesc - Construct an assessor. + /// AssessorDesc(bool dt, char bid, uint32 nb, uint32 nw, const char* name, Jnjvm* vm, uint8 nid, const char* assocName, ClassArray* cl, arrayCtor_t ctor); + + /// initialise - Construct all assessors. + /// static void initialise(Jnjvm* vm); + /// printString - Print the assessor for debugging purposes. + /// const char* printString() const; static void analyseIntern(const UTF8* name, uint32 pos, @@ -119,48 +216,130 @@ }; +/// Typedef - Each class has a Typedef representation. A Typedef is also a class +/// which has not been loaded yet. Typedefs are hashed on the name of the class. +/// Hashing is for memory purposes, not for comparison. +/// class Typedef { public: + + /// keyName - The name of the Typedef. It is the representation of a class + /// in a Java signature, e.g. "Ljava/lang/Object;". + /// const UTF8* keyName; + + /// pseudoAssocClassName - The real name of the class this Typedef + /// represents, e.g. "java/lang/Object" + /// const UTF8* pseudoAssocClassName; + + /// funcs - The assessor for this Typedef. All Typedef must have the dRef + /// or the dTab assessor, except the primive Typedefs. + /// const AssessorDesc* funcs; + + /// isolate - Which isolate constructed me? + /// Jnjvm* isolate; + /// printString - Print the Typedef for debugging purposes. + /// const char* printString() const; + /// assocClass - Given the loaded, try to load the class represented by this + /// Typedef. + /// CommonClass* assocClass(JavaObject* loader); - void typePrint(mvm::PrintBuffer* buf); + + /// humanPrintArgs - Prints the list of typedef in a human readable form. + /// static void humanPrintArgs(const std::vector*, mvm::PrintBuffer* buf); + + /// typeDup - Create a new Typedef. + /// static Typedef* typeDup(const UTF8* name, Jnjvm* vm); + + /// tPrintBuf - Prints the name of the class this Typedef represents. + /// void tPrintBuf(mvm::PrintBuffer* buf) const; }; +/// Signdef - This class represents a Java signature. Each Java method has a +/// Java signature. Signdefs are hashed for memory purposes, not equality +/// purposes. +/// class Signdef { private: - intptr_t _staticCallBuf; - intptr_t _virtualCallBuf; - intptr_t _staticCallAP; - intptr_t _virtualCallAP; + /// _staticCallBuf - A dynamically generated method which calls a static Java + /// function with the specific signature and receive the arguments in a + /// buffer. + /// + intptr_t _staticCallBuf; intptr_t staticCallBuf(); + + /// _virtualCallBuf - A dynamically generated method which calls a virtual + /// Java function with the specific signature and receive the arguments in a + /// buffer. + /// + intptr_t _virtualCallBuf; intptr_t virtualCallBuf(); + + /// _staticCallAP - A dynamically generated method which calls a static Java + /// function with the specific signature and receive the arguments in a + /// variable argument handle. + /// + intptr_t _staticCallAP; intptr_t staticCallAP(); + + /// _virtualCallBuf - A dynamically generated method which calls a virtual + /// Java function with the specific signature and receive the arguments in a + /// variable argument handle. + /// + intptr_t _virtualCallAP; intptr_t virtualCallAP(); public: + + /// args - The arguments as Typedef of this signature. + /// std::vector args; + + /// ret - The Typedef return of this signature. + /// Typedef* ret; + + /// isolate - The isolate that defined the signature. + /// Jnjvm* isolate; + + /// keyName - The Java name of the signature, e.g. "()V". + /// const UTF8* keyName; + /// printString - Print the signature for debugging purposes. + /// const char* printString() const; + /// printWithSign - Print the signature of a method with the method's class + /// and name. + /// void printWithSign(CommonClass* cl, const UTF8* name, mvm::PrintBuffer* buf); + + /// signDup - Create a new Signdef. + /// static Signdef* signDup(const UTF8* name, Jnjvm* vm); +//===----------------------------------------------------------------------===// +// +// Inline calls to get the dynamically generated functions to call Java +// functions. Note that this calls the JIT. +// +//===----------------------------------------------------------------------===// + intptr_t getStaticCallBuf() { if(!_staticCallBuf) return staticCallBuf(); return _staticCallBuf; @@ -197,8 +376,19 @@ _virtualCallAP = code; } - +//===----------------------------------------------------------------------===// +// +// End of inlined methods of getting dynamically generated functions. +// +//===----------------------------------------------------------------------===// + + + /// JInfo - Holds info useful for the JIT. + /// mvm::JITInfo* JInfo; + + /// getInfo - Get the JIT info of this signature. The info is created lazely. + /// template Ty *getInfo() { if (!JInfo) { From nicolas.geoffray at lip6.fr Wed Aug 13 06:13:16 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 13 Aug 2008 13:13:16 -0000 Subject: [vmkit-commits] [vmkit] r54732 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaConstantPool.cpp JavaIsolate.cpp JavaJIT.cpp JavaJIT.h JavaJITOpcodes.cpp JavaMetaJIT.cpp JavaRuntimeJIT.cpp JavaTypes.cpp JavaUpcalls.cpp Jnjvm.cpp Jnjvm.h JnjvmModuleProvider.cpp JnjvmModuleProvider.h LowerConstantCalls.cpp Message-ID: <200808131313.m7DDDJbU029679@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 13 08:13:05 2008 New Revision: 54732 URL: http://llvm.org/viewvc/llvm-project?rev=54732&view=rev Log: Having a custom made Module for Jnjvm does not add a thing. Just use the basic llvm::Module. All runtime functions are now in the JavaRuntime class. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=54732&r1=54731&r2=54732&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Wed Aug 13 08:13:05 2008 @@ -508,25 +508,25 @@ Attribut* attribut = lookupAttribut(Attribut::constantAttribut); if (!attribut) { - JnjvmModule::InitField(this, obj); + JavaRuntime::InitField(this, obj); } else { Reader reader(attribut, classDef->bytes); JavaCtpInfo * ctpInfo = classDef->ctpInfo; uint16 idx = reader.readU2(); if (funcs == AssessorDesc::dLong) { - JnjvmModule::InitField(this, obj, (uint64)ctpInfo->LongAt(idx)); + JavaRuntime::InitField(this, obj, (uint64)ctpInfo->LongAt(idx)); } else if (funcs == AssessorDesc::dDouble) { - JnjvmModule::InitField(this, obj, ctpInfo->DoubleAt(idx)); + JavaRuntime::InitField(this, obj, ctpInfo->DoubleAt(idx)); } else if (funcs == AssessorDesc::dFloat) { - JnjvmModule::InitField(this, obj, ctpInfo->FloatAt(idx)); + JavaRuntime::InitField(this, obj, ctpInfo->FloatAt(idx)); } else if (funcs == AssessorDesc::dRef) { const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[idx]); - JnjvmModule::InitField(this, obj, + JavaRuntime::InitField(this, obj, (JavaObject*)ctpInfo->resolveString(utf8, idx)); } else if (funcs == AssessorDesc::dInt || funcs == AssessorDesc::dChar || funcs == AssessorDesc::dShort || funcs == AssessorDesc::dByte || funcs == AssessorDesc::dBool) { - JnjvmModule::InitField(this, obj, (uint64)ctpInfo->IntegerAt(idx)); + JavaRuntime::InitField(this, obj, (uint64)ctpInfo->IntegerAt(idx)); } else { JavaThread::get()->isolate-> unknownError("unknown constant %c", funcs->byteId); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=54732&r1=54731&r2=54732&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Wed Aug 13 08:13:05 2008 @@ -419,8 +419,7 @@ cl->lookupMethodDontThrow(utf8, sign->keyName, isStatic(access), false); if (meth) { // don't throw if no meth, the exception will be thrown just in time - JnjvmModule* M = classDef->isolate->TheModule; - void* F = M->getMethod(meth); + void* F = JavaRuntime::getMethod(meth); ctpRes[index] = (void*)F; return F; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp?rev=54732&r1=54731&r2=54732&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp Wed Aug 13 08:13:05 2008 @@ -449,7 +449,10 @@ isolate->analyseClasspathEnv(isolate->bootClasspathEnv); - isolate->TheModule = new JnjvmModule("Isolate JnJVM"); + isolate->TheModule = new llvm::Module("Isolate JnJVM"); + std::string str = + mvm::jit::executionEngine->getTargetData()->getStringRepresentation(); + isolate->TheModule->setDataLayout(str); isolate->TheModuleProvider = new JnjvmModuleProvider(isolate->TheModule); isolate->bootstrapThread = vm_new(isolate, JavaThread)(); @@ -509,8 +512,11 @@ isolate->analyseClasspathEnv(isolate->bootClasspathEnv); - isolate->TheModule = new JnjvmModule("Bootstrap JnJVM"); - isolate->TheModule->initialise(); + isolate->TheModule = new llvm::Module("Bootstrap JnJVM"); + std::string str = + mvm::jit::executionEngine->getTargetData()->getStringRepresentation(); + isolate->TheModule->setDataLayout(str); + JavaRuntime::initialise(isolate->TheModule); isolate->TheModuleProvider = new JnjvmModuleProvider(isolate->TheModule); isolate->bootstrapThread = vm_new(isolate, JavaThread)(); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=54732&r1=54731&r2=54732&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Wed Aug 13 08:13:05 2008 @@ -38,7 +38,6 @@ #include "JavaTypes.h" #include "JavaUpcalls.h" #include "Jnjvm.h" -#include "JnjvmModuleProvider.h" #include "NativeUtil.h" #include "Reader.h" #include "Zip.h" @@ -66,18 +65,18 @@ Constant* zero = mvm::jit::constantZero; Signdef* signature = ctpInfo->infoOfInterfaceOrVirtualMethod(index); std::vector args; // size = [signature->nbIn + 3]; - LLVMSignatureInfo* LSI = module->getSignatureInfo(signature); + LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(signature); const llvm::FunctionType* virtualType = LSI->getVirtualType(); FunctionType::param_iterator it = virtualType->param_end(); makeArgs(it, index, args, signature->args.size() + 1); JITVerifyNull(args[0]); - Value* VT = CallInst::Create(JnjvmModule::GetVTFunction, args[0], "", + Value* VT = CallInst::Create(JavaRuntime::GetVTFunction, args[0], "", currentBlock); std::vector indexes2; //[3]; if (meth) { - LLVMMethodInfo* LMI = module->getMethodInfo(meth); + LLVMMethodInfo* LMI = JavaRuntime::getMethodInfo(meth); indexes2.push_back(LMI->getOffset()); } else { GlobalVariable* gv = @@ -101,12 +100,12 @@ std::vector Args; Args.push_back(args[0]); LLVMClassInfo* LCI = - (LLVMClassInfo*)module->getClassInfo(compilingClass); + (LLVMClassInfo*)JavaRuntime::getClassInfo(compilingClass); Args.push_back(LCI->getVar(this)); Constant* CI = ConstantInt::get(Type::Int32Ty, index); Args.push_back(CI); Args.push_back(gv); - val = invoke(JnjvmModule::VirtualLookupFunction, Args, "", currentBlock); + val = invoke(JavaRuntime::VirtualLookupFunction, Args, "", currentBlock); node->addIncoming(val, currentBlock); llvm::BranchInst::Create(endBlock, currentBlock); @@ -176,7 +175,7 @@ } else { JavaObject* loader = compilingClass->classLoader; ServiceDomain* vm = ServiceDomain::getDomainFromLoader(loader); - LLVMServiceInfo* LSI = module->getServiceInfo(vm); + LLVMServiceInfo* LSI = JavaRuntime::getServiceInfo(vm); isolateLocal = LSI->getDelegatee(this); Value* cmp = new ICmpInst(ICmpInst::ICMP_NE, lastArg, isolateLocal, "", currentBlock); @@ -187,7 +186,7 @@ std::vector Args; Args.push_back(lastArg); Args.push_back(isolateLocal); - CallInst::Create(JnjvmModule::ServiceCallStartFunction, Args.begin(), + CallInst::Create(JavaRuntime::ServiceCallStartFunction, Args.begin(), Args.end(), "", currentBlock); BranchInst::Create(endBlock, currentBlock); currentBlock = endBlock; @@ -198,7 +197,7 @@ if (funcType->getReturnType() != Type::VoidTy) endNode = llvm::PHINode::Create(funcType->getReturnType(), "", endBlock); - Value* buf = llvm::CallInst::Create(JnjvmModule::GetSJLJBufferFunction, + Value* buf = llvm::CallInst::Create(JavaRuntime::GetSJLJBufferFunction, "", currentBlock); Value* test = llvm::CallInst::Create(mvm::jit::setjmpLLVM, buf, "", currentBlock); @@ -229,7 +228,7 @@ uint32 index = 0; if (stat) { LLVMClassInfo* LCI = - (LLVMClassInfo*)module->getClassInfo(compilingClass); + (LLVMClassInfo*)JavaRuntime::getClassInfo(compilingClass); nativeArgs.push_back(LCI->getDelegatee(this)); index = 2; } else { @@ -243,7 +242,7 @@ LLVMSignatureInfo* LSI = - module->getSignatureInfo(compilingMethod->getSignature()); + JavaRuntime::getSignatureInfo(compilingMethod->getSignature()); const llvm::Type* valPtrType = LSI->getNativePtrType(); Value* valPtr = ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, (uint64)natPtr), @@ -260,7 +259,7 @@ if (isSynchro(compilingMethod->access)) endSynchronize(); - llvm::CallInst::Create(JnjvmModule::JniProceedPendingExceptionFunction, "", + llvm::CallInst::Create(JavaRuntime::JniProceedPendingExceptionFunction, "", currentBlock); if (funcType->getReturnType() != Type::VoidTy) @@ -279,10 +278,10 @@ void JavaJIT::monitorEnter(Value* obj) { std::vector gep; gep.push_back(mvm::jit::constantZero); - gep.push_back(JnjvmModule::JavaObjectLockOffsetConstant); + gep.push_back(JavaRuntime::JavaObjectLockOffsetConstant); Value* lockPtr = GetElementPtrInst::Create(obj, gep.begin(), gep.end(), "", currentBlock); - Value* threadId = CallInst::Create(JnjvmModule::GetThreadIDFunction, "", + Value* threadId = CallInst::Create(JavaRuntime::GetThreadIDFunction, "", currentBlock); std::vector atomicArgs; atomicArgs.push_back(lockPtr); @@ -348,14 +347,14 @@ // The counter will overflow, call this function to create a new lock, // lock it 0x101 times, and pass. - CallInst::Create(JnjvmModule::OverflowThinLockFunction, obj, "", + CallInst::Create(JavaRuntime::OverflowThinLockFunction, obj, "", currentBlock); BranchInst::Create(OK, currentBlock); currentBlock = FatLockBB; // Either it's a fat lock or there is contention. - CallInst::Create(JnjvmModule::AquireObjectFunction, obj, "", currentBlock); + CallInst::Create(JavaRuntime::AquireObjectFunction, obj, "", currentBlock); BranchInst::Create(OK, currentBlock); currentBlock = OK; } @@ -363,11 +362,11 @@ void JavaJIT::monitorExit(Value* obj) { std::vector gep; gep.push_back(mvm::jit::constantZero); - gep.push_back(JnjvmModule::JavaObjectLockOffsetConstant); + gep.push_back(JavaRuntime::JavaObjectLockOffsetConstant); Value* lockPtr = GetElementPtrInst::Create(obj, gep.begin(), gep.end(), "", currentBlock); Value* lock = new LoadInst(lockPtr, "", currentBlock); - Value* threadId = CallInst::Create(JnjvmModule::GetThreadIDFunction, "", + Value* threadId = CallInst::Create(JavaRuntime::GetThreadIDFunction, "", currentBlock); Value* cmp = new ICmpInst(ICmpInst::ICMP_EQ, lock, threadId, "", @@ -409,7 +408,7 @@ currentBlock = FatLockBB; // Either it's a fat lock or there is contention. - CallInst::Create(JnjvmModule::ReleaseObjectFunction, obj, "", currentBlock); + CallInst::Create(JavaRuntime::ReleaseObjectFunction, obj, "", currentBlock); BranchInst::Create(EndUnlock, currentBlock); currentBlock = EndUnlock; } @@ -420,17 +419,17 @@ obj = llvmFunction->arg_begin(); } else { LLVMClassInfo* LCI = - (LLVMClassInfo*)module->getClassInfo(compilingClass); + (LLVMClassInfo*)JavaRuntime::getClassInfo(compilingClass); obj = LCI->getStaticVar(this); } #ifndef SERVICE_VM monitorEnter(obj); #else if (ServiceDomain::isLockableDomain(compilingClass->isolate)) { - llvm::CallInst::Create(JnjvmModule::AquireObjectInSharedDomainFunction, + llvm::CallInst::Create(JavaRuntime::AquireObjectInSharedDomainFunction, obj, "", currentBlock); } else { - llvm::CallInst::Create(JnjvmModule::AquireObjectFunction, + llvm::CallInst::Create(JavaRuntime::AquireObjectFunction, obj, "", currentBlock); } #endif @@ -442,17 +441,17 @@ obj = llvmFunction->arg_begin(); } else { LLVMClassInfo* LCI = - (LLVMClassInfo*)module->getClassInfo(compilingClass); + (LLVMClassInfo*)JavaRuntime::getClassInfo(compilingClass); obj = LCI->getStaticVar(this); } #ifndef SERVICE_VM monitorExit(obj); #else if (ServiceDomain::isLockableDomain(compilingClass->isolate)) { - llvm::CallInst::Create(JnjvmModule::ReleaseObjectInSharedDomainFunction, + llvm::CallInst::Create(JavaRuntime::ReleaseObjectInSharedDomainFunction, argsSync.begin(), argsSync.end(), "", currentBlock); } else { - llvm::CallInst::Create(JnjvmModule::ReleaseObjectFunction, argsSync.begin(), + llvm::CallInst::Create(JavaRuntime::ReleaseObjectFunction, argsSync.begin(), argsSync.end(), "", currentBlock); } #endif @@ -483,7 +482,7 @@ reader.seek(codeLen, Reader::SeekCur); - LLVMMethodInfo* LMI = module->getMethodInfo(compilingMethod); + LLVMMethodInfo* LMI = JavaRuntime::getMethodInfo(compilingMethod); assert(LMI); Function* func = LMI->getMethod(); llvmFunction = parentFunction; @@ -507,7 +506,7 @@ doubleLocals.push_back(new AllocaInst(Type::DoubleTy, "", currentBlock)); longLocals.push_back(new AllocaInst(Type::Int64Ty, "", currentBlock)); floatLocals.push_back(new AllocaInst(Type::FloatTy, "", currentBlock)); - objectLocals.push_back(new AllocaInst(JnjvmModule::JavaObjectType, "", + objectLocals.push_back(new AllocaInst(JavaRuntime::JavaObjectType, "", currentBlock)); } @@ -563,7 +562,7 @@ } else { JavaObject* loader = compilingClass->classLoader; ServiceDomain* vm = ServiceDomain::getDomainFromLoader(loader); - LLVMServiceInfo* LSI = module->getServiceInfo(vm); + LLVMServiceInfo* LSI = JavaRuntime::getServiceInfo(vm); isolateLocal = LSI->getDelegatee(this); Value* cmp = new ICmpInst(ICmpInst::ICMP_NE, args[args.size() - 1], isolateLocal, "", currentBlock); @@ -574,7 +573,7 @@ std::vector Args; Args.push_back(args[args.size()- 1]); Args.push_back(isolateLocal); - CallInst::Create(JnjvmModule::ServiceCallStartFunction, Args.begin(), + CallInst::Create(JavaRuntime::ServiceCallStartFunction, Args.begin(), Args.end(), "", currentBlock); BranchInst::Create(endBlock, currentBlock); currentBlock = endBlock; @@ -605,7 +604,7 @@ std::vector Args; Args.push_back(args[args.size() - 1]); Args.push_back(isolateLocal); - CallInst::Create(JnjvmModule::ServiceCallStopFunction, Args.begin(), + CallInst::Create(JavaRuntime::ServiceCallStopFunction, Args.begin(), Args.end(), "", currentBlock); BranchInst::Create(newEndBlock, currentBlock); currentBlock = newEndBlock; @@ -659,7 +658,7 @@ { std::vector args; args.push_back(ConstantInt::get(Type::Int32Ty, (int64_t)compilingMethod)); - llvm::CallInst::Create(JnjvmModule::PrintMethodStartFunction, args.begin(), + llvm::CallInst::Create(JavaRuntime::PrintMethodStartFunction, args.begin(), args.end(), "", currentBlock); } #endif @@ -671,7 +670,7 @@ doubleLocals.push_back(new AllocaInst(Type::DoubleTy, "", currentBlock)); longLocals.push_back(new AllocaInst(Type::Int64Ty, "", currentBlock)); floatLocals.push_back(new AllocaInst(Type::FloatTy, "", currentBlock)); - objectLocals.push_back(new AllocaInst(JnjvmModule::JavaObjectType, "", + objectLocals.push_back(new AllocaInst(JavaRuntime::JavaObjectType, "", currentBlock)); } @@ -726,7 +725,7 @@ } else { JavaObject* loader = compilingClass->classLoader; ServiceDomain* vm = ServiceDomain::getDomainFromLoader(loader); - LLVMServiceInfo* LSI = module->getServiceInfo(vm); + LLVMServiceInfo* LSI = JavaRuntime::getServiceInfo(vm); isolateLocal = LSI->getDelegatee(this); Value* cmp = new ICmpInst(ICmpInst::ICMP_NE, i, isolateLocal, "", currentBlock); @@ -737,7 +736,7 @@ std::vector Args; Args.push_back(i); Args.push_back(isolateLocal); - CallInst::Create(JnjvmModule::ServiceCallStartFunction, Args.begin(), + CallInst::Create(JavaRuntime::ServiceCallStartFunction, Args.begin(), Args.end(), "", currentBlock); BranchInst::Create(endBlock, currentBlock); currentBlock = endBlock; @@ -783,7 +782,7 @@ { std::vector args; args.push_back(ConstantInt::get(Type::Int32Ty, (int64_t)compilingMethod)); - llvm::CallInst::Create(JnjvmModule::PrintMethodEndFunction, args.begin(), + llvm::CallInst::Create(JavaRuntime::PrintMethodEndFunction, args.begin(), args.end(), "", currentBlock); } #endif @@ -799,7 +798,7 @@ std::vector Args; Args.push_back(i); Args.push_back(isolateLocal); - CallInst::Create(JnjvmModule::ServiceCallStopFunction, Args.begin(), + CallInst::Create(JavaRuntime::ServiceCallStopFunction, Args.begin(), Args.end(), "", currentBlock); BranchInst::Create(newEndBlock, currentBlock); currentBlock = newEndBlock; @@ -816,7 +815,7 @@ if (PI == PE) { endExceptionBlock->eraseFromParent(); } else { - CallInst* ptr_eh_ptr = CallInst::Create(JnjvmModule::GetExceptionFunction, + CallInst* ptr_eh_ptr = CallInst::Create(JavaRuntime::GetExceptionFunction, "eh_ptr", endExceptionBlock); llvm::CallInst::Create(mvm::jit::unwindResume, ptr_eh_ptr, "", endExceptionBlock); @@ -851,7 +850,7 @@ nbe += sync; JavaCtpInfo* ctpInfo = compilingClass->ctpInfo; if (nbe) { - supplLocal = new AllocaInst(JnjvmModule::JavaObjectType, "exceptionVar", + supplLocal = new AllocaInst(JavaRuntime::JavaObjectType, "exceptionVar", currentBlock); } @@ -869,11 +868,11 @@ if (isVirtual(compilingMethod->access)) { argsSync.push_back(llvmFunction->arg_begin()); } else { - LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); + LLVMClassInfo* LCI = (LLVMClassInfo*)JavaRuntime::getClassInfo(compilingClass); Value* arg = LCI->getStaticVar(this); argsSync.push_back(arg); } - llvm::CallInst::Create(JnjvmModule::ReleaseObjectFunction, argsSync.begin(), argsSync.end(), + llvm::CallInst::Create(JavaRuntime::ReleaseObjectFunction, argsSync.begin(), argsSync.end(), "", synchronizeExceptionBlock); llvm::BranchInst::Create(endExceptionBlock, synchronizeExceptionBlock); @@ -1027,9 +1026,9 @@ Value* cl = 0; currentBlock = cur->realTest; assert(cur->catchClass); - LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(cur->catchClass); + LLVMClassInfo* LCI = (LLVMClassInfo*)JavaRuntime::getClassInfo(cur->catchClass); cl = LCI->getVar(this); - Value* cmp = llvm::CallInst::Create(JnjvmModule::CompareExceptionFunction, cl, "", + Value* cmp = llvm::CallInst::Create(JavaRuntime::CompareExceptionFunction, cl, "", currentBlock); llvm::BranchInst::Create(cur->handler, bbNext, cmp, currentBlock); if (nodeNext) @@ -1039,9 +1038,9 @@ cur->handlerPHI = llvm::PHINode::Create(mvm::jit::ptrType, "", cur->handler); cur->handlerPHI->addIncoming(cur->exceptionPHI, currentBlock); - Value* exc = llvm::CallInst::Create(JnjvmModule::GetJavaExceptionFunction, + Value* exc = llvm::CallInst::Create(JavaRuntime::GetJavaExceptionFunction, "", cur->handler); - llvm::CallInst::Create(JnjvmModule::ClearExceptionFunction, "", + llvm::CallInst::Create(JavaRuntime::ClearExceptionFunction, "", cur->handler); llvm::CallInst::Create(mvm::jit::exceptionBeginCatch, cur->handlerPHI, "tmp8", cur->handler); @@ -1098,16 +1097,16 @@ #ifndef MULTIPLE_VM val = compilingClass->isolate->UTF8ToStr(utf8); gv = - new GlobalVariable(JnjvmModule::JavaObjectType, false, + new GlobalVariable(JavaRuntime::JavaObjectType, false, GlobalValue::ExternalLinkage, - JnjvmModule::JavaObjectNullConstant, "", + JavaRuntime::JavaObjectNullConstant, "", module); #else val = (void*)utf8; gv = - new GlobalVariable(JnjvmModule::JavaArrayUInt16Type, false, + new GlobalVariable(JavaRuntime::JavaArrayUInt16Type, false, GlobalValue::ExternalLinkage, - JnjvmModule::UTF8NullConstant, "", + JavaRuntime::UTF8NullConstant, "", module); #endif @@ -1116,7 +1115,7 @@ GenericValue Val = GenericValue(val); llvm::GenericValue * Ptr = (llvm::GenericValue*)ptr; mvm::jit::executionEngine->StoreValueToMemory(Val, Ptr, - JnjvmModule::JavaObjectType); + JavaRuntime::JavaObjectType); toPush = new LoadInst(gv, "", currentBlock); ctpInfo->ctpRes[index] = gv; compilingClass->release(); @@ -1130,7 +1129,7 @@ currentBlock); } #ifdef MULTIPLE_VM - CallInst* C = llvm::CallInst::Create(JnjvmModule::RuntimeUTF8ToStrFunction, + CallInst* C = llvm::CallInst::Create(JavaRuntime::RuntimeUTF8ToStrFunction, toPush, "", currentBlock); push(C, AssessorDesc::dRef); #else @@ -1151,11 +1150,11 @@ } else if (type == JavaCtpInfo::ConstantClass) { if (ctpInfo->ctpRes[index]) { CommonClass* cl = (CommonClass*)(ctpInfo->ctpRes[index]); - LLVMCommonClassInfo* LCI = module->getClassInfo(cl); + LLVMCommonClassInfo* LCI = JavaRuntime::getClassInfo(cl); push(LCI->getDelegatee(this), AssessorDesc::dRef); } else { Value* val = getResolvedClass(index, false); - Value* res = CallInst::Create(JnjvmModule::GetClassDelegateeFunction, val, "", + Value* res = CallInst::Create(JavaRuntime::GetClassDelegateeFunction, val, "", currentBlock); push(res, AssessorDesc::dRef); } @@ -1167,7 +1166,7 @@ void JavaJIT::JITVerifyNull(Value* obj) { JavaJIT* jit = this; - Constant* zero = JnjvmModule::JavaObjectNullConstant; + Constant* zero = JavaRuntime::JavaObjectNullConstant; Value* test = new ICmpInst(ICmpInst::ICMP_EQ, obj, zero, "", jit->currentBlock); @@ -1177,12 +1176,12 @@ llvm::BranchInst::Create(exit, cont, test, jit->currentBlock); std::vector args; if (currentExceptionBlock != endExceptionBlock) { - llvm::InvokeInst::Create(JnjvmModule::NullPointerExceptionFunction, + llvm::InvokeInst::Create(JavaRuntime::NullPointerExceptionFunction, unifiedUnreachable, currentExceptionBlock, args.begin(), args.end(), "", exit); } else { - llvm::CallInst::Create(JnjvmModule::NullPointerExceptionFunction, + llvm::CallInst::Create(JavaRuntime::NullPointerExceptionFunction, args.begin(), args.end(), "", exit); new UnreachableInst(exit); } @@ -1215,12 +1214,12 @@ args.push_back(obj); args.push_back(index); if (currentExceptionBlock != endExceptionBlock) { - llvm::InvokeInst::Create(JnjvmModule::IndexOutOfBoundsExceptionFunction, + llvm::InvokeInst::Create(JavaRuntime::IndexOutOfBoundsExceptionFunction, unifiedUnreachable, currentExceptionBlock, args.begin(), args.end(), "", ifFalse); } else { - llvm::CallInst::Create(JnjvmModule::IndexOutOfBoundsExceptionFunction, + llvm::CallInst::Create(JavaRuntime::IndexOutOfBoundsExceptionFunction, args.begin(), args.end(), "", ifFalse); new UnreachableInst(ifFalse); } @@ -1233,7 +1232,7 @@ std::vector indexes; //[3]; indexes.push_back(zero); - indexes.push_back(JnjvmModule::JavaArrayElementsOffsetConstant); + indexes.push_back(JavaRuntime::JavaArrayElementsOffsetConstant); indexes.push_back(index); Value* ptr = llvm::GetElementPtrInst::Create(val, indexes.begin(), indexes.end(), @@ -1492,7 +1491,7 @@ const UTF8* name = 0; const UTF8* cl = 0; ctpInfo->nameOfStaticOrSpecialMethod(index, cl, name, signature); - LLVMSignatureInfo* LSI = module->getSignatureInfo(signature); + LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(signature); const llvm::FunctionType* virtualType = LSI->getVirtualType(); llvm::Instruction* val = 0; @@ -1537,7 +1536,7 @@ const UTF8* name = 0; const UTF8* cl = 0; ctpInfo->nameOfStaticOrSpecialMethod(index, cl, name, signature); - LLVMSignatureInfo* LSI = module->getSignatureInfo(signature); + LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(signature); const llvm::FunctionType* staticType = LSI->getStaticType(); llvm::Instruction* val = 0; @@ -1560,11 +1559,11 @@ uint32 clIndex = ctpInfo->getClassIndexFromMethod(index); Class* mycl = (Class*)(ctpInfo->getMethodClassIfLoaded(clIndex)); if (mycl && mycl->status >= resolved) { - LLVMCommonClassInfo* LCI = module->getClassInfo(mycl); + LLVMCommonClassInfo* LCI = JavaRuntime::getClassInfo(mycl); Value* arg = LCI->getVar(this); - arg = invoke(JnjvmModule::InitialisationCheckFunction, arg, "", + arg = invoke(JavaRuntime::InitialisationCheckFunction, arg, "", currentBlock); - CallInst::Create(JnjvmModule::ForceInitialisationCheckFunction, arg, "", + CallInst::Create(JavaRuntime::ForceInitialisationCheckFunction, arg, "", currentBlock); } @@ -1590,20 +1589,20 @@ Value* JavaJIT::getResolvedClass(uint16 index, bool clinit) { GlobalVariable * gv = - new GlobalVariable(JnjvmModule::JavaClassType, false, + new GlobalVariable(JavaRuntime::JavaClassType, false, GlobalValue::ExternalLinkage, - JnjvmModule::JavaClassNullConstant, "", + JavaRuntime::JavaClassNullConstant, "", module); Value* arg1 = new LoadInst(gv, "", false, currentBlock); Value* test = new ICmpInst(ICmpInst::ICMP_EQ, arg1, - JnjvmModule::JavaClassNullConstant, "", + JavaRuntime::JavaClassNullConstant, "", currentBlock); BasicBlock* trueCl = createBasicBlock("Cl OK"); BasicBlock* falseCl = createBasicBlock("Cl Not OK"); - PHINode* node = llvm::PHINode::Create(JnjvmModule::JavaClassType, "", + PHINode* node = llvm::PHINode::Create(JavaRuntime::JavaClassType, "", trueCl); node->addIncoming(arg1, currentBlock); llvm::BranchInst::Create(falseCl, trueCl, test, currentBlock); @@ -1611,7 +1610,7 @@ currentBlock = falseCl; std::vector Args; - LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); + LLVMClassInfo* LCI = (LLVMClassInfo*)JavaRuntime::getClassInfo(compilingClass); Value* v = LCI->getVar(this); Args.push_back(v); ConstantInt* CI = ConstantInt::get(Type::Int32Ty, index); @@ -1622,7 +1621,7 @@ } else { Args.push_back(mvm::jit::constantZero); } - Value* res = invoke(JnjvmModule::ClassLookupFunction, Args, "", + Value* res = invoke(JavaRuntime::ClassLookupFunction, Args, "", currentBlock); node->addIncoming(res, currentBlock); @@ -1630,7 +1629,7 @@ currentBlock = trueCl; #ifdef MULTIPLE_VM if (clinit) - return invoke(JnjvmModule::InitialisationCheckFunction, node, "", + return invoke(JavaRuntime::InitialisationCheckFunction, node, "", currentBlock); else #endif @@ -1647,35 +1646,35 @@ Value* Cl = 0; if (!cl || !cl->isResolved()) { Cl = getResolvedClass(index, true); - Size = CallInst::Create(JnjvmModule::GetObjectSizeFromClassFunction, Cl, + Size = CallInst::Create(JavaRuntime::GetObjectSizeFromClassFunction, Cl, "", currentBlock); - VT = CallInst::Create(JnjvmModule::GetVTFromClassFunction, Cl, "", + VT = CallInst::Create(JavaRuntime::GetVTFromClassFunction, Cl, "", currentBlock); } else { - LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(cl); + LLVMClassInfo* LCI = (LLVMClassInfo*)JavaRuntime::getClassInfo(cl); Size = LCI->getVirtualSize(this); VT = LCI->getVirtualTable(this); Cl = LCI->getVar(this); #ifndef MULTIPLE_VM if (!cl->isReady()) #endif - Cl = invoke(JnjvmModule::InitialisationCheckFunction, Cl, "", currentBlock); + Cl = invoke(JavaRuntime::InitialisationCheckFunction, Cl, "", currentBlock); } std::vector args; args.push_back(Size); args.push_back(VT); #ifdef MULTIPLE_GC - args.push_back(CallInst::Create(JnjvmModule::GetCollectorFunction, + args.push_back(CallInst::Create(JavaRuntime::GetCollectorFunction, isolateLocal, "", currentBlock)); #endif - Value* val = invoke(JnjvmModule::JavaObjectAllocateFunction, args, "", + Value* val = invoke(JavaRuntime::JavaObjectAllocateFunction, args, "", currentBlock); // Set the class std::vector gep; gep.push_back(mvm::jit::constantZero); - gep.push_back(JnjvmModule::JavaObjectClassOffsetConstant); + gep.push_back(JavaRuntime::JavaObjectClassOffsetConstant); Value* GEP = GetElementPtrInst::Create(val, gep.begin(), gep.end(), "", currentBlock); new StoreInst(Cl, GEP, currentBlock); @@ -1685,7 +1684,7 @@ } Value* JavaJIT::arraySize(Value* val) { - return llvm::CallInst::Create(JnjvmModule::ArrayLengthFunction, val, "", + return llvm::CallInst::Create(JavaRuntime::ArrayLengthFunction, val, "", currentBlock); } @@ -1715,13 +1714,13 @@ && field->classDef->isReady() #endif ) { - LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(field->classDef); + LLVMClassInfo* LCI = (LLVMClassInfo*)JavaRuntime::getClassInfo(field->classDef); if (stat) { object = LCI->getStaticVar(this); } const Type* type = stat ? LCI->getStaticType() : LCI->getVirtualType(); - LLVMFieldInfo* LFI = module->getFieldInfo(field); + LLVMFieldInfo* LFI = JavaRuntime::getFieldInfo(field); return fieldGetter(this, type, object, LFI->getOffset()); } else { const Type* Pty = mvm::jit::arrayPtrType; @@ -1770,16 +1769,16 @@ if (object) { args.push_back(object); } else { - args.push_back(JnjvmModule::JavaObjectNullConstant); + args.push_back(JavaRuntime::JavaObjectNullConstant); } - LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); + LLVMClassInfo* LCI = (LLVMClassInfo*)JavaRuntime::getClassInfo(compilingClass); args.push_back(LCI->getVar(this)); Constant* CI = ConstantInt::get(Type::Int32Ty, index); args.push_back(CI); args.push_back(stat ? mvm::jit::constantOne : mvm::jit::constantZero); args.push_back(gvStaticInstance); args.push_back(gv); - Value* tmp = invoke(JnjvmModule::FieldLookupFunction, args, "", currentBlock); + Value* tmp = invoke(JavaRuntime::FieldLookupFunction, args, "", currentBlock); node->addIncoming(tmp, currentBlock); llvm::BranchInst::Create(endBlock, currentBlock); @@ -1962,7 +1961,7 @@ JavaCtpInfo* ctpInfo = compilingClass->ctpInfo; Signdef* signature = ctpInfo->infoOfInterfaceOrVirtualMethod(index); - LLVMSignatureInfo* LSI = module->getSignatureInfo(signature); + LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(signature); const llvm::FunctionType* virtualType = LSI->getVirtualType(); const llvm::PointerType* virtualPtrType = LSI->getVirtualPtrType(); @@ -1988,7 +1987,7 @@ Value* llvmEnv = ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64_t (enveloppe)), - JnjvmModule::EnveloppeType); + JavaRuntime::EnveloppeType); JITVerifyNull(args[0]); @@ -2000,7 +1999,7 @@ "", currentBlock); Value* cache = new LoadInst(cachePtr, "", currentBlock); - Value* cl = CallInst::Create(JnjvmModule::GetClassFunction, args[0], "", + Value* cl = CallInst::Create(JavaRuntime::GetClassFunction, args[0], "", currentBlock); std::vector args3; args3.push_back(zero); @@ -2017,7 +2016,7 @@ BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock); currentBlock = ifFalse; - Value* _meth = invoke(JnjvmModule::InterfaceLookupFunction, cache, args[0], + Value* _meth = invoke(JavaRuntime::InterfaceLookupFunction, cache, args[0], "", ifFalse); Value* meth = new BitCastInst(_meth, virtualPtrType, "", currentBlock); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h?rev=54732&r1=54731&r2=54732&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h Wed Aug 13 08:13:05 2008 @@ -17,6 +17,7 @@ #include "llvm/DerivedTypes.h" #include "llvm/Function.h" #include "llvm/Instructions.h" +#include "llvm/Module.h" #include "llvm/Value.h" #include "types.h" @@ -25,7 +26,7 @@ #include "mvm/PrintBuffer.h" #include "JavaTypes.h" -#include "JnjvmModule.h" +#include "JavaRuntime.h" namespace jnjvm { @@ -58,7 +59,7 @@ class JavaJIT { public: - JnjvmModule* module; + llvm::Module* module; static void invokeOnceVoid(Jnjvm* vm, JavaObject* loader, const char* className, Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp?rev=54732&r1=54731&r2=54732&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Wed Aug 13 08:13:05 2008 @@ -30,6 +30,7 @@ #include "JavaConstantPool.h" #include "JavaObject.h" #include "JavaJIT.h" +#include "JavaRuntime.h" #include "JavaThread.h" #include "JavaTypes.h" #include "Jnjvm.h" @@ -130,7 +131,7 @@ (int64_t)OpcodeNames[bytecodes[i]])); args.push_back(ConstantInt::get(Type::Int32Ty, (int64_t)i)); args.push_back(ConstantInt::get(Type::Int32Ty, (int64_t)compilingMethod)); - CallInst::Create(JnjvmModule::PrintExecutionFunction, args.begin(), + CallInst::Create(JavaRuntime::PrintExecutionFunction, args.begin(), args.end(), "", currentBlock); } #endif @@ -142,7 +143,7 @@ switch (bytecodes[i]) { case ACONST_NULL : - push(JnjvmModule::JavaObjectNullConstant, AssessorDesc::dRef); + push(JavaRuntime::JavaObjectNullConstant, AssessorDesc::dRef); break; case ICONST_M1 : @@ -365,7 +366,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JnjvmModule::JavaArraySInt32Type); + JavaRuntime::JavaArraySInt32Type); push(new LoadInst(ptr, "", currentBlock), AssessorDesc::dInt); break; } @@ -374,7 +375,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JnjvmModule::JavaArrayLongType); + JavaRuntime::JavaArrayLongType); push(new LoadInst(ptr, "", currentBlock), AssessorDesc::dLong); push(mvm::jit::constantZero, AssessorDesc::dInt); break; @@ -384,7 +385,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JnjvmModule::JavaArrayFloatType); + JavaRuntime::JavaArrayFloatType); push(new LoadInst(ptr, "", currentBlock), AssessorDesc::dFloat); break; } @@ -393,7 +394,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JnjvmModule::JavaArrayDoubleType); + JavaRuntime::JavaArrayDoubleType); push(new LoadInst(ptr, "", currentBlock), AssessorDesc::dDouble); push(mvm::jit::constantZero, AssessorDesc::dInt); break; @@ -403,7 +404,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JnjvmModule::JavaArrayObjectType); + JavaRuntime::JavaArrayObjectType); push(new LoadInst(ptr, "", currentBlock), AssessorDesc::dRef); break; } @@ -412,7 +413,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JnjvmModule::JavaArraySInt8Type); + JavaRuntime::JavaArraySInt8Type); Value* val = new LoadInst(ptr, "", currentBlock); push(new SExtInst(val, Type::Int32Ty, "", currentBlock), AssessorDesc::dInt); @@ -423,7 +424,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JnjvmModule::JavaArrayUInt16Type); + JavaRuntime::JavaArrayUInt16Type); Value* val = new LoadInst(ptr, "", currentBlock); push(new ZExtInst(val, Type::Int32Ty, "", currentBlock), AssessorDesc::dInt); @@ -434,7 +435,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JnjvmModule::JavaArraySInt16Type); + JavaRuntime::JavaArraySInt16Type); Value* val = new LoadInst(ptr, "", currentBlock); push(new SExtInst(val, Type::Int32Ty, "", currentBlock), AssessorDesc::dInt); @@ -579,7 +580,7 @@ Value* index = popAsInt(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JnjvmModule::JavaArraySInt32Type); + JavaRuntime::JavaArraySInt32Type); new StoreInst(val, ptr, false, currentBlock); break; } @@ -590,7 +591,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JnjvmModule::JavaArrayLongType); + JavaRuntime::JavaArrayLongType); new StoreInst(val, ptr, false, currentBlock); break; } @@ -600,7 +601,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JnjvmModule::JavaArrayFloatType); + JavaRuntime::JavaArrayFloatType); new StoreInst(val, ptr, false, currentBlock); break; } @@ -611,7 +612,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JnjvmModule::JavaArrayDoubleType); + JavaRuntime::JavaArrayDoubleType); new StoreInst(val, ptr, false, currentBlock); break; } @@ -621,7 +622,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JnjvmModule::JavaArrayObjectType); + JavaRuntime::JavaArrayObjectType); new StoreInst(val, ptr, false, currentBlock); break; } @@ -634,7 +635,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JnjvmModule::JavaArraySInt8Type); + JavaRuntime::JavaArraySInt8Type); new StoreInst(val, ptr, false, currentBlock); break; } @@ -650,7 +651,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JnjvmModule::JavaArrayUInt16Type); + JavaRuntime::JavaArrayUInt16Type); new StoreInst(val, ptr, false, currentBlock); break; } @@ -666,7 +667,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JnjvmModule::JavaArraySInt16Type); + JavaRuntime::JavaArraySInt16Type); new StoreInst(val, ptr, false, currentBlock); break; } @@ -1646,7 +1647,7 @@ Value* expr = ConstantExpr::getIntToPtr( ConstantInt::get(Type::Int64Ty, uint64_t (jsrIndex++)), - JnjvmModule::JavaObjectType); + JavaRuntime::JavaObjectType); new StoreInst(expr, supplLocal, false, currentBlock); BranchInst::Create(opcodeInfos[tmp + readS2(bytecodes, i)].newBlock, @@ -1829,7 +1830,7 @@ uint8 id = bytecodes[++i]; AssessorDesc* ass = AssessorDesc::arrayType(id); dcl = ass->arrayClass; - TheVT = JnjvmModule::JavaObjectVirtualTableGV; + TheVT = JavaRuntime::JavaObjectVirtualTableGV; LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[ass->numId]; sizeElement = LAI.sizeInBytesConstant; } else { @@ -1841,11 +1842,11 @@ AssessorDesc::constructArrayName(vm, 0, 1, className); dcl = vm->constructArray(arrayName, compilingClass->classLoader); - TheVT = JnjvmModule::ArrayObjectVirtualTableGV; + TheVT = JavaRuntime::ArrayObjectVirtualTableGV; sizeElement = mvm::jit::constantPtrSize; } - LLVMCommonClassInfo* LCI = module->getClassInfo(dcl); + LLVMCommonClassInfo* LCI = JavaRuntime::getClassInfo(dcl); llvm::Value* valCl = LCI->getVar(this); llvm::Value* arg1 = popAsInt(); @@ -1861,19 +1862,19 @@ std::vector exArgs; exArgs.push_back(arg1); if (currentExceptionBlock != endExceptionBlock) { - InvokeInst::Create(JnjvmModule::NegativeArraySizeExceptionFunction, + InvokeInst::Create(JavaRuntime::NegativeArraySizeExceptionFunction, unifiedUnreachable, currentExceptionBlock, exArgs.begin(), exArgs.end(), "", currentBlock); } else { - CallInst::Create(JnjvmModule::NegativeArraySizeExceptionFunction, + CallInst::Create(JavaRuntime::NegativeArraySizeExceptionFunction, exArgs.begin(), exArgs.end(), "", currentBlock); new UnreachableInst(currentBlock); } currentBlock = BB2; cmp = new ICmpInst(ICmpInst::ICMP_SGT, arg1, - JnjvmModule::MaxArraySizeConstant, + JavaRuntime::MaxArraySizeConstant, "", currentBlock); BB1 = createBasicBlock(""); @@ -1882,12 +1883,12 @@ BranchInst::Create(BB1, BB2, cmp, currentBlock); currentBlock = BB1; if (currentExceptionBlock != endExceptionBlock) { - InvokeInst::Create(JnjvmModule::OutOfMemoryErrorFunction, + InvokeInst::Create(JavaRuntime::OutOfMemoryErrorFunction, unifiedUnreachable, currentExceptionBlock, exArgs.begin(), exArgs.end(), "", currentBlock); } else { - CallInst::Create(JnjvmModule::OutOfMemoryErrorFunction, + CallInst::Create(JavaRuntime::OutOfMemoryErrorFunction, exArgs.begin(), exArgs.end(), "", currentBlock); new UnreachableInst(currentBlock); } @@ -1896,24 +1897,24 @@ Value* mult = BinaryOperator::createMul(arg1, sizeElement, "", currentBlock); Value* size = - BinaryOperator::createAdd(JnjvmModule::JavaObjectSizeConstant, mult, + BinaryOperator::createAdd(JavaRuntime::JavaObjectSizeConstant, mult, "", currentBlock); std::vector args; args.push_back(size); args.push_back(new LoadInst(TheVT, "", currentBlock)); #ifdef MULTIPLE_GC - args.push_back(CallInst::Create(JnjvmModule::GetCollectorFunction, + args.push_back(CallInst::Create(JavaRuntime::GetCollectorFunction, isolateLocal, "", currentBlock)); #endif - Value* res = invoke(JnjvmModule::JavaObjectAllocateFunction, args, "", + Value* res = invoke(JavaRuntime::JavaObjectAllocateFunction, args, "", currentBlock); - Value* cast = new BitCastInst(res, JnjvmModule::JavaArrayType, "", + Value* cast = new BitCastInst(res, JavaRuntime::JavaArrayType, "", currentBlock); // Set the size std::vector gep4; gep4.push_back(mvm::jit::constantZero); - gep4.push_back(JnjvmModule::JavaArraySizeOffsetConstant); + gep4.push_back(JavaRuntime::JavaArraySizeOffsetConstant); Value* GEP = GetElementPtrInst::Create(cast, gep4.begin(), gep4.end(), "", currentBlock); new StoreInst(arg1, GEP, currentBlock); @@ -1921,7 +1922,7 @@ // Set the class std::vector gep; gep.push_back(mvm::jit::constantZero); - gep.push_back(JnjvmModule::JavaObjectClassOffsetConstant); + gep.push_back(JavaRuntime::JavaObjectClassOffsetConstant); GEP = GetElementPtrInst::Create(res, gep.begin(), gep.end(), "", currentBlock); new StoreInst(valCl, GEP, currentBlock); @@ -1943,12 +1944,12 @@ std::vector args; args.push_back(arg); if (currentExceptionBlock != endExceptionBlock) { - InvokeInst::Create(JnjvmModule::ThrowExceptionFunction, + InvokeInst::Create(JavaRuntime::ThrowExceptionFunction, unifiedUnreachable, currentExceptionBlock, args.begin(), args.end(), "", currentBlock); } else { - CallInst::Create(JnjvmModule::ThrowExceptionFunction, args.begin(), + CallInst::Create(JavaRuntime::ThrowExceptionFunction, args.begin(), args.end(), "", currentBlock); new UnreachableInst(currentBlock); } @@ -1963,7 +1964,7 @@ Value* obj = top(); Value* cmp = new ICmpInst(ICmpInst::ICMP_EQ, obj, - JnjvmModule::JavaObjectNullConstant, + JavaRuntime::JavaObjectNullConstant, "", currentBlock); BasicBlock* ifTrue = createBasicBlock("null checkcast"); @@ -1973,7 +1974,7 @@ currentBlock = ifFalse; Value* clVar = 0; if (dcl) { - LLVMCommonClassInfo* LCI = module->getClassInfo(dcl); + LLVMCommonClassInfo* LCI = JavaRuntime::getClassInfo(dcl); clVar = LCI->getVar(this); } else { clVar = getResolvedClass(index, false); @@ -1981,7 +1982,7 @@ std::vector args; args.push_back(obj); args.push_back(clVar); - Value* call = CallInst::Create(JnjvmModule::InstanceOfFunction, + Value* call = CallInst::Create(JavaRuntime::InstanceOfFunction, args.begin(), args.end(), "", currentBlock); @@ -1992,12 +1993,12 @@ exArgs.push_back(obj); exArgs.push_back(clVar); if (currentExceptionBlock != endExceptionBlock) { - InvokeInst::Create(JnjvmModule::ClassCastExceptionFunction, + InvokeInst::Create(JavaRuntime::ClassCastExceptionFunction, unifiedUnreachable, currentExceptionBlock, exArgs.begin(), exArgs.end(), "", ex); } else { - CallInst::Create(JnjvmModule::ClassCastExceptionFunction, + CallInst::Create(JavaRuntime::ClassCastExceptionFunction, exArgs.begin(), exArgs.end(), "", ex); new UnreachableInst(ex); } @@ -2013,7 +2014,7 @@ Value* clVar = 0; if (dcl) { - LLVMCommonClassInfo* LCI = module->getClassInfo(dcl); + LLVMCommonClassInfo* LCI = JavaRuntime::getClassInfo(dcl); clVar = LCI->getVar(this); } else { clVar = getResolvedClass(index, false); @@ -2021,7 +2022,7 @@ std::vector args; args.push_back(pop()); args.push_back(clVar); - Value* val = CallInst::Create(JnjvmModule::InstanceOfFunction, + Value* val = CallInst::Create(JavaRuntime::InstanceOfFunction, args.begin(), args.end(), "", currentBlock); push(new ZExtInst(val, Type::Int32Ty, "", currentBlock), @@ -2033,10 +2034,10 @@ Value* obj = pop(); #ifdef SERVICE_VM if (ServiceDomain::isLockableDomain(compilingClass->isolate)) - invoke(JnjvmModule::AquireObjectInSharedDomainFunction, obj, "", + invoke(JavaRuntime::AquireObjectInSharedDomainFunction, obj, "", currentBlock); else - invoke(JnjvmModule::AquireObjectFunction, obj, "", + invoke(JavaRuntime::AquireObjectFunction, obj, "", currentBlock); #else JITVerifyNull(obj); @@ -2049,10 +2050,10 @@ Value* obj = pop(); #ifdef SERVICE_VM if (ServiceDomain::isLockableDomain(compilingClass->isolate)) - invoke(JnjvmModule::ReleaseObjectInSharedDomainFunction, obj, "", + invoke(JavaRuntime::ReleaseObjectInSharedDomainFunction, obj, "", currentBlock); else - invoke(JnjvmModule::ReleaseObjectFunction, obj, "", + invoke(JavaRuntime::ReleaseObjectFunction, obj, "", currentBlock); #else JITVerifyNull(obj); @@ -2074,7 +2075,7 @@ compilingClass->ctpInfo->loadClass(index); - LLVMCommonClassInfo* LCI = module->getClassInfo(dcl); + LLVMCommonClassInfo* LCI = JavaRuntime::getClassInfo(dcl); Value* valCl = LCI->getVar(this); Value** args = (Value**)alloca(sizeof(Value*) * (dim + 2)); args[0] = valCl; @@ -2090,7 +2091,7 @@ #ifdef MULTIPLE_VM Args.push_back(isolateLocal); #endif - push(invoke(JnjvmModule::MultiCallNewFunction, Args, "", currentBlock), + push(invoke(JavaRuntime::MultiCallNewFunction, Args, "", currentBlock), AssessorDesc::dRef); break; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp?rev=54732&r1=54731&r2=54732&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp Wed Aug 13 08:13:05 2008 @@ -21,7 +21,6 @@ #include "JavaThread.h" #include "JavaTypes.h" #include "Jnjvm.h" -#include "JnjvmModule.h" using namespace jnjvm; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=54732&r1=54731&r2=54732&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Wed Aug 13 08:13:05 2008 @@ -22,7 +22,6 @@ #include "JavaThread.h" #include "JavaTypes.h" #include "Jnjvm.h" -#include "JnjvmModule.h" #include "LockedMap.h" #ifdef SERVICE_VM Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp?rev=54732&r1=54731&r2=54732&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp Wed Aug 13 08:13:05 2008 @@ -511,7 +511,7 @@ intptr_t Signdef::staticCallBuf() { if (!_staticCallBuf) { - LLVMSignatureInfo* LSI = isolate->TheModule->getSignatureInfo(this); + LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(this); LSI->getStaticBuf(); } return _staticCallBuf; @@ -519,7 +519,7 @@ intptr_t Signdef::virtualCallBuf() { if (!_virtualCallBuf) { - LLVMSignatureInfo* LSI = isolate->TheModule->getSignatureInfo(this); + LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(this); LSI->getVirtualBuf(); } return _virtualCallBuf; @@ -527,7 +527,7 @@ intptr_t Signdef::staticCallAP() { if (!_staticCallAP) { - LLVMSignatureInfo* LSI = isolate->TheModule->getSignatureInfo(this); + LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(this); LSI->getStaticAP(); } return _staticCallAP; @@ -535,7 +535,7 @@ intptr_t Signdef::virtualCallAP() { if (!_virtualCallAP) { - LLVMSignatureInfo* LSI = isolate->TheModule->getSignatureInfo(this); + LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(this); LSI->getVirtualAP(); } return _virtualCallAP; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=54732&r1=54731&r2=54732&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Wed Aug 13 08:13:05 2008 @@ -15,12 +15,12 @@ #include "JavaClass.h" #include "JavaJIT.h" #include "JavaObject.h" +#include "JavaRuntime.h" #include "JavaString.h" #include "JavaThread.h" #include "JavaTypes.h" #include "JavaUpcalls.h" #include "Jnjvm.h" -#include "JnjvmModule.h" #define COMPILE_METHODS(cl) \ for (CommonClass::method_iterator i = cl->virtualMethods.begin(), \ @@ -379,11 +379,11 @@ JavaMethod* internString = UPCALL_METHOD(vm, "java/lang/VMString", "intern", "(Ljava/lang/String;)Ljava/lang/String;", ACC_STATIC); - vm->TheModule->setMethod(internString, "internString"); + JavaRuntime::setMethod(internString, "internString"); JavaMethod* isArray = UPCALL_METHOD(vm, "java/lang/Class", "isArray", "()Z", ACC_VIRTUAL); - vm->TheModule->setMethod(isArray, "isArray"); + JavaRuntime::setMethod(isArray, "isArray"); ClasspathThread::initialise(vm); @@ -400,17 +400,17 @@ JavaMethod* getCallingClass = UPCALL_METHOD(vm, "gnu/classpath/VMStackWalker", "getCallingClass", "()Ljava/lang/Class;", ACC_STATIC); - vm->TheModule->setMethod(getCallingClass, "getCallingClass"); + JavaRuntime::setMethod(getCallingClass, "getCallingClass"); JavaMethod* getCallingClassLoader = UPCALL_METHOD(vm, "gnu/classpath/VMStackWalker", "getCallingClassLoader", "()Ljava/lang/ClassLoader;", ACC_STATIC); - vm->TheModule->setMethod(getCallingClassLoader, "getCallingClassLoader"); + JavaRuntime::setMethod(getCallingClassLoader, "getCallingClassLoader"); JavaMethod* postProperties = UPCALL_METHOD(vm, "gnu/classpath/VMSystemProperties", "postInit", "(Ljava/util/Properties;)V", ACC_STATIC); - vm->TheModule->setMethod(postProperties, "propertiesPostInit"); + JavaRuntime::setMethod(postProperties, "propertiesPostInit"); } extern "C" JavaString* internString(JavaString* obj) { Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=54732&r1=54731&r2=54732&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Wed Aug 13 08:13:05 2008 @@ -331,7 +331,7 @@ cl->super->initialiseClass(); } - TheModule->resolveStaticClass((Class*)cl); + JavaRuntime::resolveStaticClass((Class*)cl); *status = inClinit; JavaMethod* meth = cl->lookupMethodDontThrow(clinitName, clinitType, true, @@ -401,7 +401,7 @@ loadParents((Class*)cl); cl->acquire(); cl->status = prepared; - TheModule->resolveVirtualClass((Class*)cl); + JavaRuntime::resolveVirtualClass((Class*)cl); cl->status = resolved; } cl->release(); Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=54732&r1=54731&r2=54732&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Wed Aug 13 08:13:05 2008 @@ -26,6 +26,10 @@ #define vm_new(vm, cl) gc_new(cl) #endif +namespace llvm { + class Module; +} + namespace jnjvm { class ArrayUInt8; @@ -37,7 +41,6 @@ class JavaMethod; class JavaObject; class JavaString; -class JnjvmModule; class JnjvmModuleProvider; class Reader; class Typedef; @@ -259,7 +262,7 @@ JnjvmModuleProvider* TheModuleProvider; - JnjvmModule* TheModule; + llvm::Module* TheModule; #ifndef MULTIPLE_GC Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=54732&r1=54731&r2=54732&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Wed Aug 13 08:13:05 2008 @@ -17,9 +17,9 @@ #include "JavaClass.h" #include "JavaConstantPool.h" #include "JavaJIT.h" +#include "JavaRuntime.h" #include "JavaThread.h" #include "Jnjvm.h" -#include "JnjvmModule.h" #include "JnjvmModuleProvider.h" using namespace llvm; @@ -41,7 +41,7 @@ meth->compiledPtr(); - LLVMMethodInfo* LMI = ((JnjvmModule*)TheModule)->getMethodInfo(meth); + LLVMMethodInfo* LMI = JavaRuntime::getMethodInfo(meth); ctpInfo->ctpRes[index] = LMI->getMethod(); return meth; @@ -92,7 +92,7 @@ mvm::jit::executionEngine->updateGlobalMapping(F, val); if (isVirtual(meth->access)) { - LLVMMethodInfo* LMI = ((JnjvmModule*)TheModule)->getMethodInfo(meth); + LLVMMethodInfo* LMI = JavaRuntime::getMethodInfo(meth); uint64_t offset = LMI->getOffset()->getZExtValue(); assert(meth->classDef->isResolved() && "Class not resolved"); assert(meth->classDef->virtualVT && "Class has no VT"); @@ -133,7 +133,7 @@ } Function* JnjvmModuleProvider::parseFunction(JavaMethod* meth) { - LLVMMethodInfo* LMI = ((JnjvmModule*)TheModule)->getMethodInfo(meth); + LLVMMethodInfo* LMI = JavaRuntime::getMethodInfo(meth); Function* func = LMI->getMethod(); if (func->hasNotBeenReadFromBitcode()) { // We are jitting. Take the lock. @@ -141,7 +141,7 @@ JavaJIT jit; jit.compilingClass = meth->classDef; jit.compilingMethod = meth; - jit.module = (JnjvmModule*)TheModule; + jit.module = TheModule; jit.llvmFunction = func; if (isNative(meth->access)) { jit.nativeCompile(); @@ -156,8 +156,7 @@ llvm::Function* JnjvmModuleProvider::addCallback(Class* cl, uint32 index, Signdef* sign, bool stat) { const llvm::FunctionType* type = 0; - JnjvmModule* M = cl->isolate->TheModule; - LLVMSignatureInfo* LSI = M->getSignatureInfo(sign); + LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(sign); if (stat) { type = LSI->getStaticType(); @@ -225,7 +224,7 @@ addPass(PM, createSCCPPass()); // Constant prop with SCCP addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs - addPass(PM, mvm::createEscapeAnalysisPass(JnjvmModule::JavaObjectAllocateFunction)); + addPass(PM, mvm::createEscapeAnalysisPass(JavaRuntime::JavaObjectAllocateFunction)); addPass(PM, mvm::createLowerConstantCallsPass()); addPass(PM, createGVNPass()); // Remove redundancies @@ -241,7 +240,7 @@ } -JnjvmModuleProvider::JnjvmModuleProvider(JnjvmModule *m) { +JnjvmModuleProvider::JnjvmModuleProvider(llvm::Module *m) { TheModule = (Module*)m; mvm::jit::protectEngine->lock(); mvm::jit::executionEngine->addModuleProvider(this); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h?rev=54732&r1=54731&r2=54732&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h Wed Aug 13 08:13:05 2008 @@ -15,13 +15,12 @@ using namespace llvm; namespace llvm { -class FunctionPassManager; + class FunctionPassManager; + class Module; } namespace jnjvm { -class JnjvmModule; - class JnjvmModuleProvider : public ModuleProvider { private: JavaMethod* staticLookup(Class* caller, uint32 index); @@ -42,7 +41,7 @@ public: - JnjvmModuleProvider(JnjvmModule *m); + JnjvmModuleProvider(llvm::Module *m); ~JnjvmModuleProvider(); llvm::Function* addCallback(Class* cl, uint32 index, Signdef* sign, Modified: vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=54732&r1=54731&r2=54732&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Wed Aug 13 08:13:05 2008 @@ -16,7 +16,7 @@ #include "mvm/JIT.h" -#include "JnjvmModule.h" +#include "JavaRuntime.h" using namespace llvm; using namespace jnjvm; @@ -44,20 +44,20 @@ II++; if (CallInst *CI = dyn_cast(I)) { Value* V = CI->getOperand(0); - if (V == jnjvm::JnjvmModule::ArrayLengthFunction) { + if (V == jnjvm::JavaRuntime::ArrayLengthFunction) { Changed = true; Value* val = CI->getOperand(1); // get the array - Value* array = new BitCastInst(val, jnjvm::JnjvmModule::JavaArrayType, + Value* array = new BitCastInst(val, jnjvm::JavaRuntime::JavaArrayType, "", CI); std::vector args; //size= 2 args.push_back(mvm::jit::constantZero); - args.push_back(jnjvm::JnjvmModule::JavaArraySizeOffsetConstant); + args.push_back(jnjvm::JavaRuntime::JavaArraySizeOffsetConstant); Value* ptr = GetElementPtrInst::Create(array, args.begin(), args.end(), "", CI); Value* load = new LoadInst(ptr, "", CI); CI->replaceAllUsesWith(load); CI->eraseFromParent(); - } else if (V == jnjvm::JnjvmModule::GetVTFunction) { + } else if (V == jnjvm::JavaRuntime::GetVTFunction) { Changed = true; Value* val = CI->getOperand(1); // get the object std::vector indexes; //[3]; @@ -68,66 +68,66 @@ Value* VT = new LoadInst(VTPtr, "", CI); CI->replaceAllUsesWith(VT); CI->eraseFromParent(); - } else if (V == jnjvm::JnjvmModule::GetClassFunction) { + } else if (V == jnjvm::JavaRuntime::GetClassFunction) { Changed = true; Value* val = CI->getOperand(1); // get the object std::vector args2; args2.push_back(mvm::jit::constantZero); - args2.push_back(jnjvm::JnjvmModule::JavaObjectClassOffsetConstant); + args2.push_back(jnjvm::JavaRuntime::JavaObjectClassOffsetConstant); Value* classPtr = GetElementPtrInst::Create(val, args2.begin(), args2.end(), "", CI); Value* cl = new LoadInst(classPtr, "", CI); CI->replaceAllUsesWith(cl); CI->eraseFromParent(); - } else if (V == jnjvm::JnjvmModule::GetVTFromClassFunction) { + } else if (V == jnjvm::JavaRuntime::GetVTFromClassFunction) { Changed = true; Value* val = CI->getOperand(1); std::vector indexes; indexes.push_back(mvm::jit::constantZero); - indexes.push_back(jnjvm::JnjvmModule::OffsetVTInClassConstant); + indexes.push_back(jnjvm::JavaRuntime::OffsetVTInClassConstant); Value* VTPtr = GetElementPtrInst::Create(val, indexes.begin(), indexes.end(), "", CI); Value* VT = new LoadInst(VTPtr, "", CI); CI->replaceAllUsesWith(VT); CI->eraseFromParent(); - } else if (V == jnjvm::JnjvmModule::GetObjectSizeFromClassFunction) { + } else if (V == jnjvm::JavaRuntime::GetObjectSizeFromClassFunction) { Changed = true; Value* val = CI->getOperand(1); std::vector indexes; indexes.push_back(mvm::jit::constantZero); - indexes.push_back(JnjvmModule::OffsetObjectSizeInClassConstant); + indexes.push_back(JavaRuntime::OffsetObjectSizeInClassConstant); Value* SizePtr = GetElementPtrInst::Create(val, indexes.begin(), indexes.end(), "", CI); Value* Size = new LoadInst(SizePtr, "", CI); CI->replaceAllUsesWith(Size); CI->eraseFromParent(); - } else if (V == jnjvm::JnjvmModule::ForceInitialisationCheckFunction) { + } else if (V == jnjvm::JavaRuntime::ForceInitialisationCheckFunction) { Changed = true; CI->eraseFromParent(); - } else if (V == jnjvm::JnjvmModule::GetDepthFunction) { + } else if (V == jnjvm::JavaRuntime::GetDepthFunction) { Changed = true; Value* val = CI->getOperand(1); std::vector indexes; indexes.push_back(mvm::jit::constantZero); - indexes.push_back(JnjvmModule::OffsetDepthInClassConstant); + indexes.push_back(JavaRuntime::OffsetDepthInClassConstant); Value* DepthPtr = GetElementPtrInst::Create(val, indexes.begin(), indexes.end(), "", CI); Value* Depth = new LoadInst(DepthPtr, "", CI); CI->replaceAllUsesWith(Depth); CI->eraseFromParent(); - } else if (V == jnjvm::JnjvmModule::GetDisplayFunction) { + } else if (V == jnjvm::JavaRuntime::GetDisplayFunction) { Changed = true; Value* val = CI->getOperand(1); std::vector indexes; indexes.push_back(mvm::jit::constantZero); - indexes.push_back(JnjvmModule::OffsetDisplayInClassConstant); + indexes.push_back(JavaRuntime::OffsetDisplayInClassConstant); Value* DisplayPtr = GetElementPtrInst::Create(val, indexes.begin(), indexes.end(), "", CI); Value* Display = new LoadInst(DisplayPtr, "", CI); CI->replaceAllUsesWith(Display); CI->eraseFromParent(); - } else if (V == jnjvm::JnjvmModule::GetClassInDisplayFunction) { + } else if (V == jnjvm::JavaRuntime::GetClassInDisplayFunction) { Changed = true; Value* val = CI->getOperand(1); Value* depth = CI->getOperand(2); @@ -135,7 +135,7 @@ Value* Class = new LoadInst(ClassPtr, "", CI); CI->replaceAllUsesWith(Class); CI->eraseFromParent(); - } else if (V == jnjvm::JnjvmModule::InstanceOfFunction) { + } else if (V == jnjvm::JavaRuntime::InstanceOfFunction) { ConstantExpr* CE = dyn_cast(CI->getOperand(2)); if (CE) { ConstantInt* C = (ConstantInt*)CE->getOperand(0); @@ -145,21 +145,21 @@ I->getParent()->getTerminator()->eraseFromParent(); Value* obj = CI->getOperand(1); Instruction* cmp = new ICmpInst(ICmpInst::ICMP_EQ, obj, - JnjvmModule::JavaObjectNullConstant, + JavaRuntime::JavaObjectNullConstant, "", CI); BasicBlock* ifTrue = BasicBlock::Create("", &F); BasicBlock* ifFalse = BasicBlock::Create("", &F); BranchInst::Create(ifTrue, ifFalse, cmp, CI); PHINode* node = PHINode::Create(Type::Int1Ty, "", ifTrue); node->addIncoming(ConstantInt::getFalse(), CI->getParent()); - Value* objCl = CallInst::Create(JnjvmModule::GetClassFunction, obj, + Value* objCl = CallInst::Create(JavaRuntime::GetClassFunction, obj, "", ifFalse); if (isInterface(cl->access)) { std::vector args; args.push_back(objCl); args.push_back(CE); - Value* res = CallInst::Create(JnjvmModule::ImplementsFunction, + Value* res = CallInst::Create(JavaRuntime::ImplementsFunction, args.begin(), args.end(), "", ifFalse); node->addIncoming(res, ifFalse); @@ -174,7 +174,7 @@ std::vector args; args.push_back(objCl); args.push_back(CE); - cmp = CallInst::Create(JnjvmModule::IsAssignableFromFunction, + cmp = CallInst::Create(JavaRuntime::IsAssignableFromFunction, args.begin(), args.end(), "", notEquals); node->addIncoming(cmp, notEquals); BranchInst::Create(ifTrue, notEquals); @@ -183,7 +183,7 @@ args.push_back(objCl); args.push_back(CE); Value* res = - CallInst::Create(JnjvmModule::InstantiationOfArrayFunction, + CallInst::Create(JavaRuntime::InstantiationOfArrayFunction, args.begin(), args.end(), "", notEquals); node->addIncoming(res, notEquals); BranchInst::Create(ifTrue, notEquals); @@ -192,10 +192,10 @@ if (cl->isResolved()) { depthCl = ConstantInt::get(Type::Int32Ty, cl->depth); } else { - depthCl = CallInst::Create(JnjvmModule::GetDepthFunction, + depthCl = CallInst::Create(JavaRuntime::GetDepthFunction, CE, "", notEquals); } - Value* depthClObj = CallInst::Create(JnjvmModule::GetDepthFunction, + Value* depthClObj = CallInst::Create(JavaRuntime::GetDepthFunction, objCl, "", notEquals); Value* cmp = new ICmpInst(ICmpInst::ICMP_ULE, depthCl, depthClObj, "", notEquals); @@ -206,14 +206,14 @@ node->addIncoming(ConstantInt::getFalse(), notEquals); Value* inDisplay = - CallInst::Create(JnjvmModule::GetDisplayFunction, objCl, + CallInst::Create(JavaRuntime::GetDisplayFunction, objCl, "", supDepth); std::vector args; args.push_back(inDisplay); args.push_back(depthCl); Value* clInDisplay = - CallInst::Create(JnjvmModule::GetClassInDisplayFunction, + CallInst::Create(JavaRuntime::GetClassInDisplayFunction, args.begin(), args.end(), "", supDepth); cmp = new ICmpInst(ICmpInst::ICMP_EQ, clInDisplay, CE, "", @@ -229,7 +229,7 @@ } } #ifdef MULTIPLE_GC - else if (V == jnjvm::JnjvmModule::GetCollectorFunction) { + else if (V == jnjvm::JavaRuntime::GetCollectorFunction) { Changed = true; Value* val = CI->getOperand(1); std::vector indexes; From nicolas.geoffray at lip6.fr Wed Aug 13 06:30:04 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 13 Aug 2008 13:30:04 -0000 Subject: [vmkit-commits] [vmkit] r54733 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaIsolate.cpp JavaRuntime.cpp JavaRuntime.h JnjvmModule.cpp JnjvmModule.h Message-ID: <200808131330.m7DDU6Lf030216@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 13 08:29:53 2008 New Revision: 54733 URL: http://llvm.org/viewvc/llvm-project?rev=54733&view=rev Log: Rename JnjvmModule --> JavaRuntime Added: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.h Removed: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp?rev=54733&r1=54732&r2=54733&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp Wed Aug 13 08:29:53 2008 @@ -449,11 +449,11 @@ isolate->analyseClasspathEnv(isolate->bootClasspathEnv); - isolate->TheModule = new llvm::Module("Isolate JnJVM"); + llvm::Module* mod = new llvm::Module("Isolate JnJVM"); std::string str = mvm::jit::executionEngine->getTargetData()->getStringRepresentation(); - isolate->TheModule->setDataLayout(str); - isolate->TheModuleProvider = new JnjvmModuleProvider(isolate->TheModule); + mod->setDataLayout(str); + isolate->TheModuleProvider = new JnjvmModuleProvider(mod); isolate->bootstrapThread = vm_new(isolate, JavaThread)(); isolate->bootstrapThread->initialise(0, isolate); @@ -512,12 +512,12 @@ isolate->analyseClasspathEnv(isolate->bootClasspathEnv); - isolate->TheModule = new llvm::Module("Bootstrap JnJVM"); + Module* Mod = new llvm::Module("Bootstrap JnJVM"); std::string str = mvm::jit::executionEngine->getTargetData()->getStringRepresentation(); - isolate->TheModule->setDataLayout(str); - JavaRuntime::initialise(isolate->TheModule); - isolate->TheModuleProvider = new JnjvmModuleProvider(isolate->TheModule); + Mod->setDataLayout(str); + JavaRuntime::initialise(Mod); + isolate->TheModuleProvider = new JnjvmModuleProvider(Mod); isolate->bootstrapThread = vm_new(isolate, JavaThread)(); isolate->bootstrapThread->initialise(0, isolate); Added: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.cpp?rev=54733&view=auto ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.cpp (added) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.cpp Wed Aug 13 08:29:53 2008 @@ -0,0 +1,1158 @@ +//===--------- JavaRuntime.cpp - Definition of a Jnjvm module -------------===// +// +// JnJVM +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/CallingConv.h" +#include "llvm/ParameterAttributes.h" +#include "llvm/Support/MutexGuard.h" + + +#include "mvm/JIT.h" + +#include "JavaJIT.h" +#include "JavaThread.h" +#include "JavaTypes.h" +#include "Jnjvm.h" +#include "JavaRuntime.h" +#include "JnjvmModuleProvider.h" +#include "LockedMap.h" + + +using namespace jnjvm; +using namespace llvm; + + +#ifdef WITH_TRACER +const llvm::FunctionType* JavaRuntime::MarkAndTraceType = 0; +#endif + +const llvm::Type* JavaRuntime::JavaObjectType = 0; +const llvm::Type* JavaRuntime::JavaArrayType = 0; +const llvm::Type* JavaRuntime::JavaArrayUInt8Type = 0; +const llvm::Type* JavaRuntime::JavaArraySInt8Type = 0; +const llvm::Type* JavaRuntime::JavaArrayUInt16Type = 0; +const llvm::Type* JavaRuntime::JavaArraySInt16Type = 0; +const llvm::Type* JavaRuntime::JavaArrayUInt32Type = 0; +const llvm::Type* JavaRuntime::JavaArraySInt32Type = 0; +const llvm::Type* JavaRuntime::JavaArrayFloatType = 0; +const llvm::Type* JavaRuntime::JavaArrayDoubleType = 0; +const llvm::Type* JavaRuntime::JavaArrayLongType = 0; +const llvm::Type* JavaRuntime::JavaArrayObjectType = 0; +const llvm::Type* JavaRuntime::CacheNodeType = 0; +const llvm::Type* JavaRuntime::EnveloppeType = 0; + +llvm::Constant* JavaRuntime::JavaObjectNullConstant; +llvm::Constant* JavaRuntime::UTF8NullConstant; +llvm::Constant* JavaRuntime::JavaClassNullConstant; +llvm::Constant* JavaRuntime::MaxArraySizeConstant; +llvm::Constant* JavaRuntime::JavaObjectSizeConstant; +llvm::GlobalVariable* JavaRuntime::JavaObjectVirtualTableGV; +llvm::GlobalVariable* JavaRuntime::ArrayObjectVirtualTableGV; +llvm::ConstantInt* JavaRuntime::OffsetObjectSizeInClassConstant; +llvm::ConstantInt* JavaRuntime::OffsetVTInClassConstant; +llvm::ConstantInt* JavaRuntime::OffsetDepthInClassConstant; +llvm::ConstantInt* JavaRuntime::OffsetDisplayInClassConstant; +const llvm::Type* JavaRuntime::JavaClassType; +const llvm::Type* JavaRuntime::VTType; +llvm::ConstantInt* JavaRuntime::JavaArrayElementsOffsetConstant; +llvm::ConstantInt* JavaRuntime::JavaArraySizeOffsetConstant; +llvm::ConstantInt* JavaRuntime::JavaObjectLockOffsetConstant; +llvm::ConstantInt* JavaRuntime::JavaObjectClassOffsetConstant; + +#ifdef WITH_TRACER +llvm::Function* JavaRuntime::MarkAndTraceFunction = 0; +llvm::Function* JavaRuntime::JavaObjectTracerFunction = 0; +#endif +llvm::Function* JavaRuntime::GetSJLJBufferFunction = 0; +llvm::Function* JavaRuntime::ThrowExceptionFunction = 0; +llvm::Function* JavaRuntime::GetExceptionFunction = 0; +llvm::Function* JavaRuntime::GetJavaExceptionFunction = 0; +llvm::Function* JavaRuntime::ClearExceptionFunction = 0; +llvm::Function* JavaRuntime::CompareExceptionFunction = 0; +llvm::Function* JavaRuntime::NullPointerExceptionFunction = 0; +llvm::Function* JavaRuntime::ClassCastExceptionFunction = 0; +llvm::Function* JavaRuntime::IndexOutOfBoundsExceptionFunction = 0; +llvm::Function* JavaRuntime::NegativeArraySizeExceptionFunction = 0; +llvm::Function* JavaRuntime::OutOfMemoryErrorFunction = 0; +llvm::Function* JavaRuntime::JavaObjectAllocateFunction = 0; +llvm::Function* JavaRuntime::InterfaceLookupFunction = 0; +llvm::Function* JavaRuntime::FieldLookupFunction = 0; +#ifndef WITHOUT_VTABLE +llvm::Function* JavaRuntime::VirtualLookupFunction = 0; +#endif +llvm::Function* JavaRuntime::PrintExecutionFunction = 0; +llvm::Function* JavaRuntime::PrintMethodStartFunction = 0; +llvm::Function* JavaRuntime::PrintMethodEndFunction = 0; +llvm::Function* JavaRuntime::JniProceedPendingExceptionFunction = 0; +llvm::Function* JavaRuntime::InitialisationCheckFunction = 0; +llvm::Function* JavaRuntime::ForceInitialisationCheckFunction = 0; +llvm::Function* JavaRuntime::ClassLookupFunction = 0; +llvm::Function* JavaRuntime::InstanceOfFunction = 0; +llvm::Function* JavaRuntime::IsAssignableFromFunction = 0; +llvm::Function* JavaRuntime::ImplementsFunction = 0; +llvm::Function* JavaRuntime::InstantiationOfArrayFunction = 0; +llvm::Function* JavaRuntime::GetDepthFunction = 0; +llvm::Function* JavaRuntime::GetDisplayFunction = 0; +llvm::Function* JavaRuntime::GetClassInDisplayFunction = 0; +llvm::Function* JavaRuntime::AquireObjectFunction = 0; +llvm::Function* JavaRuntime::ReleaseObjectFunction = 0; +llvm::Function* JavaRuntime::MultiCallNewFunction = 0; +llvm::Function* JavaRuntime::RuntimeUTF8ToStrFunction = 0; +llvm::Function* JavaRuntime::GetStaticInstanceFunction = 0; +llvm::Function* JavaRuntime::GetClassDelegateeFunction = 0; +llvm::Function* JavaRuntime::ArrayLengthFunction = 0; +llvm::Function* JavaRuntime::GetVTFunction = 0; +llvm::Function* JavaRuntime::GetClassFunction = 0; +llvm::Function* JavaRuntime::GetVTFromClassFunction = 0; +llvm::Function* JavaRuntime::GetObjectSizeFromClassFunction = 0; + +#ifdef MULTIPLE_GC +llvm::Function* JavaRuntime::GetCollectorFunction = 0; +#endif + +#ifdef SERVICE_VM +llvm::Function* JavaRuntime::AquireObjectInSharedDomainFunction = 0; +llvm::Function* JavaRuntime::ReleaseObjectInSharedDomainFunction = 0; +llvm::Function* JavaRuntime::ServiceCallStartFunction = 0; +llvm::Function* JavaRuntime::ServiceCallStopFunction = 0; +#endif + +llvm::Function* JavaRuntime::GetThreadIDFunction = 0; +llvm::Function* JavaRuntime::GetLockFunction = 0; +llvm::Function* JavaRuntime::OverflowThinLockFunction = 0; + + + +Value* LLVMCommonClassInfo::getVar(JavaJIT* jit) { + if (!varGV) { +#ifdef MULTIPLE_VM + if (jit->compilingClass->isolate->TheModule == Jnjvm::bootstrapVM->TheModule && + classDef->isArray && classDef->isolate != Jnjvm::bootstrapVM) { + // We know the array class can belong to bootstrap + CommonClass* cl = Jnjvm::bootstrapVM->constructArray(classDef->name, 0); + return cl->isolate->TheModule->getClassInfo(cl)->getVar(jit); + } +#endif + + Constant* cons = + ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, + uint64_t (classDef)), + JavaRuntime::JavaClassType); + + varGV = new GlobalVariable(JavaRuntime::JavaClassType, true, + GlobalValue::ExternalLinkage, + cons, "", + classDef->isolate->TheModule); + } + return new LoadInst(varGV, "", jit->currentBlock); +} + +Value* LLVMCommonClassInfo::getDelegatee(JavaJIT* jit) { +#ifndef MULTIPLE_VM + if (!delegateeGV) { + JavaObject* obj = classDef->getClassDelegatee(); + Constant* cons = + ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64(obj)), + JavaRuntime::JavaObjectType); + delegateeGV = new GlobalVariable(JavaRuntime::JavaObjectType, true, + GlobalValue::ExternalLinkage, + cons, "", + classDef->isolate->TheModule); + } + return new LoadInst(delegateeGV, "", jit->currentBlock); +#else + Value* ld = getVar(jit); + return llvm::CallInst::Create(JavaRuntime::GetClassDelegateeFunction, ld, "", + jit->currentBlock); +#endif +} + +#ifndef WITHOUT_VTABLE +VirtualTable* JavaRuntime::allocateVT(Class* cl, + CommonClass::method_iterator meths) { + if (meths == cl->virtualMethods.end()) { + uint64 size = cl->virtualTableSize; + VirtualTable* VT = (VirtualTable*)malloc(size * sizeof(void*)); + if (!VT) JavaThread::get()->isolate->outOfMemoryError(size * sizeof(void*)); + if (cl->super) { + Class* super = (Class*)cl->super; + assert(cl->virtualTableSize >= cl->super->virtualTableSize && + "Super VT bigger than own VT"); + assert(super->virtualVT && "Super does not have a VT!"); + memcpy(VT, super->virtualVT, cl->super->virtualTableSize * sizeof(void*)); + } else { + memcpy(VT, JavaObject::VT, VT_SIZE); + } + return VT; + } else { + JavaMethod* meth = meths->second; + VirtualTable* VT = 0; + if (meth->name->equals(Jnjvm::finalize)) { + VT = allocateVT(cl, ++meths); + meth->offset = 0; + Function* func = cl->isolate->TheModuleProvider->parseFunction(meth); + if (!cl->super) meth->canBeInlined = true; + Function::iterator BB = func->begin(); + BasicBlock::iterator I = BB->begin(); + if (isa(I)) { + ((void**)VT)[0] = 0; + } else { + ExecutionEngine* EE = mvm::jit::executionEngine; + // LLVM does not allow recursive compilation. Create the code now. + ((void**)VT)[0] = EE->getPointerToFunction(func); + } + } else { + + JavaMethod* parent = cl->super? + cl->super->lookupMethodDontThrow(meth->name, meth->type, false, true) : + 0; + + uint64_t offset = 0; + if (!parent) { + offset = cl->virtualTableSize++; + meth->offset = offset; + } else { + offset = parent->offset; + meth->offset = parent->offset; + } + VT = allocateVT(cl, ++meths); + LLVMMethodInfo* LMI = getMethodInfo(meth); + Function* func = LMI->getMethod(); + ExecutionEngine* EE = mvm::jit::executionEngine; + ((void**)VT)[offset] = EE->getPointerToFunctionOrStub(func); + } + + return VT; + } +} +#endif + + +VirtualTable* JavaRuntime::makeVT(Class* cl, bool stat) { + + VirtualTable* res = 0; +#ifndef WITHOUT_VTABLE + if (stat) { +#endif + res = (VirtualTable*)malloc(VT_SIZE); + memcpy(res, JavaObject::VT, VT_SIZE); +#ifndef WITHOUT_VTABLE + } else { + res = allocateVT(cl, cl->virtualMethods.begin()); + + if (!(cl->super)) { + // 12 = number of virtual methods in java/lang/Object (!!!) + uint32 size = 12 * sizeof(void*); +#define COPY(CLASS) \ + memcpy((void*)((unsigned)CLASS::VT + VT_SIZE), \ + (void*)((unsigned)res + VT_SIZE), size); + + COPY(JavaObject) + COPY(ArrayUInt8) + COPY(ArraySInt8) + COPY(ArrayUInt16) + COPY(ArraySInt16) + COPY(ArrayUInt32) + COPY(ArraySInt32) + COPY(ArrayLong) + COPY(ArrayFloat) + COPY(ArrayDouble) + COPY(UTF8) + COPY(ArrayObject) + +#undef COPY + } + } +#endif + + + +#ifdef WITH_TRACER + LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); + const Type* type = stat ? LCI->getStaticType() : LCI->getVirtualType(); + CommonClass::field_map fields = stat ? cl->staticFields : cl->virtualFields; + + Function* func = Function::Create(JavaRuntime::MarkAndTraceType, + GlobalValue::ExternalLinkage, + "markAndTraceObject", + cl->isolate->TheModule); + + Constant* zero = mvm::jit::constantZero; + Argument* arg = func->arg_begin(); + BasicBlock* block = BasicBlock::Create("", func); + llvm::Value* realArg = new BitCastInst(arg, type, "", block); + +#ifdef MULTIPLE_GC + Value* GC = ++func->arg_begin(); + std::vector Args; + Args.push_back(arg); + Args.push_back(GC); + if (stat || cl->super == 0) { + CallInst::Create(JavaRuntime::JavaObjectTracer, Args.begin(), Args.end(), + "", block); + } else { + CallInst::Create(((Class*)cl->super)->virtualTracer, Args.begin(), + Args.end(), "", block); + } +#else + if (stat || cl->super == 0) { + CallInst::Create(JavaRuntime::JavaObjectTracerFunction, arg, "", block); + } else { + LLVMClassInfo* LCP = (LLVMClassInfo*)getClassInfo((Class*)(cl->super)); + CallInst::Create(LCP->getVirtualTracer(), arg, "", block); + } +#endif + + for (CommonClass::field_iterator i = fields.begin(), e = fields.end(); + i!= e; ++i) { + if (i->second->getSignature()->funcs->doTrace) { + LLVMFieldInfo* LFI = getFieldInfo(i->second); + std::vector args; //size = 2 + args.push_back(zero); + args.push_back(LFI->getOffset()); + Value* ptr = GetElementPtrInst::Create(realArg, args.begin(), args.end(), + "",block); + Value* val = new LoadInst(ptr, "", block); + Value* valCast = new BitCastInst(val, JavaRuntime::JavaObjectType, "", + block); +#ifdef MULTIPLE_GC + std::vector Args; + Args.push_back(valCast); + Args.push_back(GC); + CallInst::Create(JavaRuntime::MarkAndTraceFunction, Args.begin(), + Args.end(), "", block); +#else + CallInst::Create(JavaRuntime::MarkAndTraceFunction, valCast, "", block); +#endif + } + } + + ReturnInst::Create(block); + + void* codePtr = mvm::jit::executionEngine->getPointerToGlobal(func); + ((void**)res)[VT_TRACER_OFFSET] = codePtr; + + if (!stat) { + LCI->virtualTracerFunction = func; + } else { + LCI->staticTracerFunction = func; + } +#endif + return res; +} + + +const Type* LLVMClassInfo::getVirtualType() { + if (!virtualType) { + std::vector fields; + JavaField** array = + (JavaField**)alloca(sizeof(JavaField*) * classDef->virtualFields.size()); + + if (classDef->super) { + LLVMClassInfo* CLI = + (LLVMClassInfo*)JavaRuntime::getClassInfo(classDef->super); + fields.push_back(CLI->getVirtualType()->getContainedType(0)); + } else { + fields.push_back(JavaRuntime::JavaObjectType->getContainedType(0)); + } + + for (CommonClass::field_iterator i = classDef->virtualFields.begin(), + e = classDef->virtualFields.end(); i!= e; ++i) { + JavaField* field = i->second; + array[field->num] = field; + } + + + for (uint32 index = 0; index < classDef->virtualFields.size(); ++index) { + uint8 id = array[index]->getSignature()->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + fields.push_back(LAI.llvmType); + } + + StructType* structType = StructType::get(fields, false); + virtualType = PointerType::getUnqual(structType); + const TargetData* targetData = mvm::jit::executionEngine->getTargetData(); + const StructLayout* sl = targetData->getStructLayout(structType); + + for (CommonClass::field_iterator i = classDef->virtualFields.begin(), + e = classDef->virtualFields.end(); i!= e; ++i) { + JavaField* field = i->second; + field->ptrOffset = sl->getElementOffset(field->num + 1); + } + + VirtualTable* VT = JavaRuntime::makeVT((Class*)classDef, false); + + uint64 size = mvm::jit::getTypeSize(structType); + classDef->virtualSize = (uint32)size; + classDef->virtualVT = VT; + virtualSizeConstant = ConstantInt::get(Type::Int32Ty, size); + + } + + return virtualType; +} + +const Type* LLVMClassInfo::getStaticType() { + + if (!staticType) { + Class* cl = (Class*)classDef; + std::vector fields; + JavaField** array = (JavaField**) + alloca(sizeof(JavaField*) * (classDef->staticFields.size() + 1)); + fields.push_back(JavaRuntime::JavaObjectType->getContainedType(0)); + + for (CommonClass::field_iterator i = classDef->staticFields.begin(), + e = classDef->staticFields.end(); i!= e; ++i) { + JavaField* field = i->second; + array[field->num] = field; + } + + for (uint32 index = 0; index < classDef->staticFields.size(); ++index) { + JavaField* field = array[index]; + uint8 id = field->getSignature()->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + fields.push_back(LAI.llvmType); + } + + StructType* structType = StructType::get(fields, false); + staticType = PointerType::getUnqual(structType); + const TargetData* targetData = mvm::jit::executionEngine->getTargetData(); + const StructLayout* sl = targetData->getStructLayout(structType); + + for (CommonClass::field_iterator i = classDef->staticFields.begin(), + e = classDef->staticFields.end(); i!= e; ++i) { + JavaField* field = i->second; + field->ptrOffset = sl->getElementOffset(field->num + 1); + } + + + VirtualTable* VT = JavaRuntime::makeVT((Class*)classDef, true); + + uint64 size = mvm::jit::getTypeSize(structType); + cl->staticSize = size; + cl->staticVT = VT; + +#ifndef MULTIPLE_VM + JavaObject* val = + (JavaObject*)classDef->isolate->allocateObject(cl->staticSize, + cl->staticVT); + val->initialise(classDef); + for (CommonClass::field_iterator i = cl->staticFields.begin(), + e = cl->staticFields.end(); i!= e; ++i) { + + i->second->initField(val); + } + + cl->_staticInstance = val; +#endif + } + return staticType; +} + +Value* LLVMClassInfo::getStaticVar(JavaJIT* jit) { +#ifndef MULTIPLE_VM + if (!staticVarGV) { + getStaticType(); + JavaObject* obj = ((Class*)classDef)->staticInstance(); + Constant* cons = + ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, + uint64_t (obj)), JavaRuntime::JavaObjectType); + + staticVarGV = new GlobalVariable(JavaRuntime::JavaObjectType, true, + GlobalValue::ExternalLinkage, + cons, "", + classDef->isolate->TheModule); + } + + return new LoadInst(staticVarGV, "", jit->currentBlock); + +#else + Value* ld = getVar(jit); + ld = jit->invoke(JavaRuntime::InitialisationCheckFunction, ld, "", + jit->currentBlock); + return jit->invoke(JavaRuntime::GetStaticInstanceFunction, ld, + jit->isolateLocal, "", jit->currentBlock); +#endif +} + +Value* LLVMClassInfo::getVirtualTable(JavaJIT* jit) { + if (!virtualTableGV) { + getVirtualType(); + Constant* cons = + ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, + uint64_t(classDef->virtualVT)), + JavaRuntime::VTType); + virtualTableGV = new GlobalVariable(JavaRuntime::VTType, true, + GlobalValue::ExternalLinkage, + cons, "", + classDef->isolate->TheModule); + } + return new LoadInst(virtualTableGV, "", jit->currentBlock); +} + +Value* LLVMClassInfo::getVirtualSize(JavaJIT* jit) { + if (!virtualSizeConstant) { + getVirtualType(); + virtualSizeConstant = + ConstantInt::get(Type::Int32Ty, classDef->virtualSize); + } + return virtualSizeConstant; +} + +Function* LLVMClassInfo::getStaticTracer() { + if (!staticTracerFunction) { + getStaticType(); + } + return staticTracerFunction; +} + +Function* LLVMClassInfo::getVirtualTracer() { + if (!virtualTracerFunction) { + getVirtualType(); + } + return virtualTracerFunction; +} + +Function* LLVMMethodInfo::getMethod() { + if (!methodFunction) { + Jnjvm* vm = methodDef->classDef->isolate; + methodFunction = Function::Create(getFunctionType(), + GlobalValue::GhostLinkage, + methodDef->printString(), + vm->TheModule); + vm->TheModuleProvider->addFunction(methodFunction, methodDef); + } + return methodFunction; +} + +const FunctionType* LLVMMethodInfo::getFunctionType() { + if (!functionType) { + LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(methodDef->getSignature()); + assert(LSI); + if (isStatic(methodDef->access)) { + functionType = LSI->getStaticType(); + } else { + functionType = LSI->getVirtualType(); + } + } + return functionType; +} + +ConstantInt* LLVMMethodInfo::getOffset() { + if (!offsetConstant) { + JavaRuntime::resolveVirtualClass(methodDef->classDef); + offsetConstant = ConstantInt::get(Type::Int32Ty, methodDef->offset); + } + return offsetConstant; +} + +ConstantInt* LLVMFieldInfo::getOffset() { + if (!offsetConstant) { + if (isStatic(fieldDef->access)) { + JavaRuntime::resolveStaticClass(fieldDef->classDef); + } else { + JavaRuntime::resolveVirtualClass(fieldDef->classDef); + } + // Increment by one because zero is JavaObject + offsetConstant = ConstantInt::get(Type::Int32Ty, fieldDef->num + 1); + } + return offsetConstant; +} + +const llvm::FunctionType* LLVMSignatureInfo::getVirtualType() { + if (!virtualType) { + // Lock here because we are called by arbitrary code + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + std::vector llvmArgs; + unsigned int size = signature->args.size(); + + llvmArgs.push_back(JavaRuntime::JavaObjectType); + + for (uint32 i = 0; i < size; ++i) { + uint8 id = signature->args.at(i)->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + llvmArgs.push_back(LAI.llvmType); + } + +#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) + llvmArgs.push_back(mvm::jit::ptrType); // domain +#endif + + uint8 id = signature->ret->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + virtualType = FunctionType::get(LAI.llvmType, llvmArgs, false); + } + return virtualType; +} + +const llvm::FunctionType* LLVMSignatureInfo::getStaticType() { + if (!staticType) { + // Lock here because we are called by arbitrary code + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + std::vector llvmArgs; + unsigned int size = signature->args.size(); + + for (uint32 i = 0; i < size; ++i) { + uint8 id = signature->args.at(i)->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + llvmArgs.push_back(LAI.llvmType); + } + +#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) + llvmArgs.push_back(mvm::jit::ptrType); // domain +#endif + + uint8 id = signature->ret->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + staticType = FunctionType::get(LAI.llvmType, llvmArgs, false); + } + return staticType; +} + +const llvm::FunctionType* LLVMSignatureInfo::getNativeType() { + if (!nativeType) { + // Lock here because we are called by arbitrary code + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + std::vector llvmArgs; + unsigned int size = signature->args.size(); + + llvmArgs.push_back(mvm::jit::ptrType); // JNIEnv + llvmArgs.push_back(JavaRuntime::JavaObjectType); // Class + + for (uint32 i = 0; i < size; ++i) { + uint8 id = signature->args.at(i)->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + llvmArgs.push_back(LAI.llvmType); + } + +#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) + llvmArgs.push_back(mvm::jit::ptrType); // domain +#endif + + uint8 id = signature->ret->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + nativeType = FunctionType::get(LAI.llvmType, llvmArgs, false); + } + return nativeType; +} + + +Function* LLVMSignatureInfo::createFunctionCallBuf(bool virt) { + + ConstantInt* CI = mvm::jit::constantZero; + std::vector Args; + + Function* res = Function::Create(virt ? getVirtualBufType() : + getStaticBufType(), + GlobalValue::ExternalLinkage, + signature->printString(), + signature->isolate->TheModule); + + BasicBlock* currentBlock = BasicBlock::Create("enter", res); + Function::arg_iterator i = res->arg_begin(); + Value *obj, *ptr, *func; +#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) + Value* vm = i; +#endif + ++i; + func = i; + ++i; + if (virt) { + obj = i; + ++i; + Args.push_back(obj); + } + ptr = i; + + for (std::vector::iterator i = signature->args.begin(), + e = signature->args.end(); i!= e; ++i) { + + const AssessorDesc* funcs = (*i)->funcs; + ptr = GetElementPtrInst::Create(ptr, CI, "", currentBlock); + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[funcs->numId]; + Value* val = new BitCastInst(ptr, LAI.llvmTypePtr, "", currentBlock); + Value* arg = new LoadInst(val, "", currentBlock); + Args.push_back(arg); + if (funcs == AssessorDesc::dLong || funcs == AssessorDesc::dDouble) { + CI = mvm::jit::constantTwo; + } else { + CI = mvm::jit::constantOne; + } + } + +#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) + Args.push_back(vm); +#endif + + Value* val = CallInst::Create(func, Args.begin(), Args.end(), "", currentBlock); + if (signature->ret->funcs != AssessorDesc::dVoid) + ReturnInst::Create(val, currentBlock); + else + ReturnInst::Create(currentBlock); + + return res; +} + +Function* LLVMSignatureInfo::createFunctionCallAP(bool virt) { + + std::vector Args; + + Function* res = Function::Create(virt ? getVirtualBufType() : + getStaticBufType(), + GlobalValue::ExternalLinkage, + signature->printString(), + signature->isolate->TheModule); + + BasicBlock* currentBlock = BasicBlock::Create("enter", res); + Function::arg_iterator i = res->arg_begin(); + Value *obj, *ap, *func; +#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) + Value* vm = i; +#endif + ++i; + func = i; + ++i; + if (virt) { + obj = i; + Args.push_back(obj); + ++i; + } + ap = i; + + for (std::vector::iterator i = signature->args.begin(), + e = signature->args.end(); i!= e; i++) { + + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[(*i)->funcs->numId]; + Args.push_back(new VAArgInst(ap, LAI.llvmType, "", currentBlock)); + } + +#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) + Args.push_back(vm); +#endif + + Value* val = CallInst::Create(func, Args.begin(), Args.end(), "", currentBlock); + if (signature->ret->funcs != AssessorDesc::dVoid) + ReturnInst::Create(val, currentBlock); + else + ReturnInst::Create(currentBlock); + + return res; +} + +const PointerType* LLVMSignatureInfo::getStaticPtrType() { + if (!staticPtrType) { + staticPtrType = PointerType::getUnqual(getStaticType()); + } + return staticPtrType; +} + +const PointerType* LLVMSignatureInfo::getVirtualPtrType() { + if (!virtualPtrType) { + virtualPtrType = PointerType::getUnqual(getVirtualType()); + } + return virtualPtrType; +} + +const PointerType* LLVMSignatureInfo::getNativePtrType() { + if (!nativePtrType) { + nativePtrType = PointerType::getUnqual(getNativeType()); + } + return nativePtrType; +} + + +const FunctionType* LLVMSignatureInfo::getVirtualBufType() { + if (!virtualBufType) { + // Lock here because we are called by arbitrary code + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + std::vector Args2; + Args2.push_back(mvm::jit::ptrType); // vm + Args2.push_back(getVirtualPtrType()); + Args2.push_back(JavaRuntime::JavaObjectType); + Args2.push_back(PointerType::getUnqual(Type::Int32Ty)); + uint8 id = signature->ret->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + virtualBufType = FunctionType::get(LAI.llvmType, Args2, false); + } + return virtualBufType; +} + +const FunctionType* LLVMSignatureInfo::getStaticBufType() { + if (!staticBufType) { + // Lock here because we are called by arbitrary code + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + std::vector Args; + Args.push_back(mvm::jit::ptrType); // vm + Args.push_back(getStaticPtrType()); + Args.push_back(PointerType::getUnqual(Type::Int32Ty)); + uint8 id = signature->ret->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + staticBufType = FunctionType::get(LAI.llvmType, Args, false); + } + return staticBufType; +} + +Function* LLVMSignatureInfo::getVirtualBuf() { + if (!virtualBufFunction) { + // Lock here because we are called by arbitrary code + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + virtualBufFunction = createFunctionCallBuf(true); + signature->setVirtualCallBuf((intptr_t) + mvm::jit::executionEngine->getPointerToGlobal(virtualBufFunction)); + } + return virtualBufFunction; +} + +Function* LLVMSignatureInfo::getVirtualAP() { + if (!virtualAPFunction) { + // Lock here because we are called by arbitrary code + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + virtualAPFunction = createFunctionCallAP(true); + signature->setVirtualCallAP((intptr_t) + mvm::jit::executionEngine->getPointerToGlobal(virtualAPFunction)); + } + return virtualAPFunction; +} + +Function* LLVMSignatureInfo::getStaticBuf() { + if (!staticBufFunction) { + // Lock here because we are called by arbitrary code + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + staticBufFunction = createFunctionCallBuf(false); + signature->setStaticCallBuf((intptr_t) + mvm::jit::executionEngine->getPointerToGlobal(staticBufFunction)); + } + return staticBufFunction; +} + +Function* LLVMSignatureInfo::getStaticAP() { + if (!staticAPFunction) { + // Lock here because we are called by arbitrary code + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + staticAPFunction = createFunctionCallAP(false); + signature->setStaticCallAP((intptr_t) + mvm::jit::executionEngine->getPointerToGlobal(staticAPFunction)); + } + return staticAPFunction; +} + +void JavaRuntime::resolveVirtualClass(Class* cl) { + // Lock here because we may be called by a class resolver + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); + LCI->getVirtualType(); +} + +void JavaRuntime::resolveStaticClass(Class* cl) { + // Lock here because we may be called by a class initializer + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); + LCI->getStaticType(); +} + +#ifdef SERVICE_VM +Value* LLVMServiceInfo::getDelegatee(JavaJIT* jit) { + if (!delegateeGV) { + Constant* cons = + ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64(vm)), + mvm::jit::ptrType); + delegateeGV = new GlobalVariable(mvm::jit::ptrType, true, + GlobalValue::ExternalLinkage, + cons, "", + vm->module); + } + return new LoadInst(delegateeGV, "", jit->currentBlock); +} + +#endif + + +namespace jnjvm { + namespace llvm_runtime { + #include "LLVMRuntime.inc" + } +} + +void JavaRuntime::initialise(llvm::Module* module) { + + jnjvm::llvm_runtime::makeLLVMModuleContents(module); + + VTType = module->getTypeByName("VT"); + + JavaObjectType = + PointerType::getUnqual(module->getTypeByName("JavaObject")); + + JavaArrayType = + PointerType::getUnqual(module->getTypeByName("JavaArray")); + + JavaClassType = + PointerType::getUnqual(module->getTypeByName("JavaClass")); + + JavaArrayUInt8Type = + PointerType::getUnqual(module->getTypeByName("ArrayUInt8")); + JavaArraySInt8Type = + PointerType::getUnqual(module->getTypeByName("ArraySInt8")); + JavaArrayUInt16Type = + PointerType::getUnqual(module->getTypeByName("ArrayUInt16")); + JavaArraySInt16Type = + PointerType::getUnqual(module->getTypeByName("ArraySInt16")); + JavaArrayUInt32Type = + PointerType::getUnqual(module->getTypeByName("ArrayUInt32")); + JavaArraySInt32Type = + PointerType::getUnqual(module->getTypeByName("ArraySInt32")); + JavaArrayLongType = + PointerType::getUnqual(module->getTypeByName("ArrayLong")); + JavaArrayFloatType = + PointerType::getUnqual(module->getTypeByName("ArrayFloat")); + JavaArrayDoubleType = + PointerType::getUnqual(module->getTypeByName("ArrayDouble")); + JavaArrayObjectType = + PointerType::getUnqual(module->getTypeByName("ArrayObject")); + + CacheNodeType = + PointerType::getUnqual(module->getTypeByName("CacheNode")); + + EnveloppeType = + PointerType::getUnqual(module->getTypeByName("Enveloppe")); + + InterfaceLookupFunction = module->getFunction("jnjvmVirtualLookup"); + MultiCallNewFunction = module->getFunction("multiCallNew"); + InitialisationCheckFunction = module->getFunction("initialisationCheck"); + ForceInitialisationCheckFunction = + module->getFunction("forceInitialisationCheck"); + + ArrayLengthFunction = module->getFunction("arrayLength"); + GetVTFunction = module->getFunction("getVT"); + GetClassFunction = module->getFunction("getClass"); + ClassLookupFunction = module->getFunction("newLookup"); + GetVTFromClassFunction = module->getFunction("getVTFromClass"); + GetObjectSizeFromClassFunction = module->getFunction("getObjectSizeFromClass"); + + GetClassDelegateeFunction = module->getFunction("getClassDelegatee"); + InstanceOfFunction = module->getFunction("instanceOf"); + IsAssignableFromFunction = module->getFunction("isAssignableFrom"); + ImplementsFunction = module->getFunction("implements"); + InstantiationOfArrayFunction = module->getFunction("instantiationOfArray"); + GetDepthFunction = module->getFunction("getDepth"); + GetDisplayFunction = module->getFunction("getDisplay"); + GetClassInDisplayFunction = module->getFunction("getClassInDisplay"); + AquireObjectFunction = module->getFunction("JavaObjectAquire"); + ReleaseObjectFunction = module->getFunction("JavaObjectRelease"); + OverflowThinLockFunction = module->getFunction("overflowThinLock"); + + FieldLookupFunction = module->getFunction("fieldLookup"); + + GetExceptionFunction = module->getFunction("JavaThreadGetException"); + GetJavaExceptionFunction = module->getFunction("JavaThreadGetJavaException"); + CompareExceptionFunction = module->getFunction("JavaThreadCompareException"); + JniProceedPendingExceptionFunction = + module->getFunction("jniProceedPendingException"); + GetSJLJBufferFunction = module->getFunction("getSJLJBuffer"); + + NullPointerExceptionFunction = module->getFunction("jnjvmNullPointerException"); + ClassCastExceptionFunction = module->getFunction("jnjvmClassCastException"); + IndexOutOfBoundsExceptionFunction = + module->getFunction("indexOutOfBoundsException"); + NegativeArraySizeExceptionFunction = + module->getFunction("negativeArraySizeException"); + OutOfMemoryErrorFunction = module->getFunction("outOfMemoryError"); + + JavaObjectAllocateFunction = module->getFunction("gcmalloc"); + + PrintExecutionFunction = module->getFunction("printExecution"); + PrintMethodStartFunction = module->getFunction("printMethodStart"); + PrintMethodEndFunction = module->getFunction("printMethodEnd"); + + ThrowExceptionFunction = module->getFunction("JavaThreadThrowException"); + + ClearExceptionFunction = module->getFunction("JavaThreadClearException"); + + +#ifdef MULTIPLE_VM + GetStaticInstanceFunction = module->getFunction("getStaticInstance"); + RuntimeUTF8ToStrFunction = module->getFunction("runtimeUTF8ToStr"); +#endif + +#ifdef SERVICE_VM + AquireObjectInSharedDomainFunction = + module->getFunction("JavaObjectAquireInSharedDomain"); + ReleaseObjectInSharedDomainfunction = + module->getFunction("JavaObjectReleaseInSharedDomain"); + ServiceCallStartFunction = module->getFunction("serviceCallStart"); + ServiceCallStopFunction = module->getFunction("serviceCallStop"); +#endif + +#ifdef WITH_TRACER + MarkAndTraceFunction = module->getFunction("MarkAndTrace"); + MarkAndTraceType = MarkAndTraceFunction->getFunctionType(); + JavaObjectTracerFunction = module->getFunction("JavaObjectTracer"); +#endif + +#ifndef WITHOUT_VTABLE + VirtualLookupFunction = module->getFunction("vtableLookup"); +#endif + +#ifdef MULTIPLE_GC + GetCollectorFunction = module->getFunction("getCollector"); +#endif + + GetThreadIDFunction = module->getFunction("getThreadID"); + GetLockFunction = module->getFunction("getLock"); + + UTF8NullConstant = Constant::getNullValue(JavaArrayUInt16Type); + JavaClassNullConstant = Constant::getNullValue(JavaClassType); + JavaObjectNullConstant = Constant::getNullValue(JavaRuntime::JavaObjectType); + MaxArraySizeConstant = ConstantInt::get(Type::Int32Ty, + JavaArray::MaxArraySize); + JavaObjectSizeConstant = ConstantInt::get(Type::Int32Ty, sizeof(JavaObject)); + + + Constant* cons = + ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, + uint64_t (JavaObject::VT)), VTType); + + JavaObjectVirtualTableGV = new GlobalVariable(VTType, true, + GlobalValue::ExternalLinkage, + cons, "", + module); + + cons = + ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, + uint64_t (ArrayObject::VT)), VTType); + + ArrayObjectVirtualTableGV = new GlobalVariable(VTType, true, + GlobalValue::ExternalLinkage, + cons, "", + module); + + JavaArrayElementsOffsetConstant = mvm::jit::constantTwo; + JavaArraySizeOffsetConstant = mvm::jit::constantOne; + JavaObjectLockOffsetConstant = mvm::jit::constantTwo; + JavaObjectClassOffsetConstant = mvm::jit::constantOne; + + OffsetObjectSizeInClassConstant = mvm::jit::constantOne; + OffsetVTInClassConstant = mvm::jit::constantTwo; + OffsetDisplayInClassConstant = mvm::jit::constantThree; + OffsetDepthInClassConstant = mvm::jit::constantFour; + + LLVMAssessorInfo::initialise(); +} + +void JavaRuntime::InitField(JavaField* field, JavaObject* obj, uint64 val) { + + const AssessorDesc* funcs = field->getSignature()->funcs; + if (funcs == AssessorDesc::dLong) { + ((sint64*)((uint64)obj + field->ptrOffset))[0] = val; + } else if (funcs == AssessorDesc::dInt) { + ((sint32*)((uint64)obj + field->ptrOffset))[0] = (sint32)val; + } else if (funcs == AssessorDesc::dChar) { + ((uint16*)((uint64)obj + field->ptrOffset))[0] = (uint16)val; + } else if (funcs == AssessorDesc::dShort) { + ((sint16*)((uint64)obj + field->ptrOffset))[0] = (sint16)val; + } else if (funcs == AssessorDesc::dByte) { + ((sint8*)((uint64)obj + field->ptrOffset))[0] = (sint8)val; + } else if (funcs == AssessorDesc::dBool) { + ((uint8*)((uint64)obj + field->ptrOffset))[0] = (uint8)val; + } else { + // 0 value for everything else + ((sint32*)((uint64)obj + field->ptrOffset))[0] = (sint32)val; + } +} + +void JavaRuntime::InitField(JavaField* field, JavaObject* obj, JavaObject* val) { + ((JavaObject**)((uint64)obj + field->ptrOffset))[0] = val; +} + +void JavaRuntime::InitField(JavaField* field, JavaObject* obj, double val) { + ((double*)((uint64)obj + field->ptrOffset))[0] = val; +} + +void JavaRuntime::InitField(JavaField* field, JavaObject* obj, float val) { + ((float*)((uint64)obj + field->ptrOffset))[0] = val; +} + +void JavaRuntime::setMethod(JavaMethod* meth, const char* name) { + llvm::Function* func = getMethodInfo(meth)->getMethod(); + func->setName(name); + func->setLinkage(llvm::GlobalValue::ExternalLinkage); +} + +void* JavaRuntime::getMethod(JavaMethod* meth) { + return getMethodInfo(meth)->getMethod(); +} + +void LLVMAssessorInfo::initialise() { + AssessorInfo[VOID_ID].llvmType = Type::VoidTy; + AssessorInfo[VOID_ID].llvmTypePtr = 0; + AssessorInfo[VOID_ID].llvmNullConstant = 0; + AssessorInfo[VOID_ID].sizeInBytesConstant = 0; + + AssessorInfo[BOOL_ID].llvmType = Type::Int8Ty; + AssessorInfo[BOOL_ID].llvmTypePtr = PointerType::getUnqual(Type::Int8Ty); + AssessorInfo[BOOL_ID].llvmNullConstant = + Constant::getNullValue(Type::Int8Ty); + AssessorInfo[BOOL_ID].sizeInBytesConstant = mvm::jit::constantOne; + + AssessorInfo[BYTE_ID].llvmType = Type::Int8Ty; + AssessorInfo[BYTE_ID].llvmTypePtr = PointerType::getUnqual(Type::Int8Ty); + AssessorInfo[BYTE_ID].llvmNullConstant = + Constant::getNullValue(Type::Int8Ty); + AssessorInfo[BYTE_ID].sizeInBytesConstant = mvm::jit::constantOne; + + AssessorInfo[SHORT_ID].llvmType = Type::Int16Ty; + AssessorInfo[SHORT_ID].llvmTypePtr = PointerType::getUnqual(Type::Int16Ty); + AssessorInfo[SHORT_ID].llvmNullConstant = + Constant::getNullValue(Type::Int16Ty); + AssessorInfo[SHORT_ID].sizeInBytesConstant = mvm::jit::constantTwo; + + AssessorInfo[CHAR_ID].llvmType = Type::Int16Ty; + AssessorInfo[CHAR_ID].llvmTypePtr = PointerType::getUnqual(Type::Int16Ty); + AssessorInfo[CHAR_ID].llvmNullConstant = + Constant::getNullValue(Type::Int16Ty); + AssessorInfo[CHAR_ID].sizeInBytesConstant = mvm::jit::constantTwo; + + AssessorInfo[INT_ID].llvmType = Type::Int32Ty; + AssessorInfo[INT_ID].llvmTypePtr = PointerType::getUnqual(Type::Int32Ty); + AssessorInfo[INT_ID].llvmNullConstant = + Constant::getNullValue(Type::Int32Ty); + AssessorInfo[INT_ID].sizeInBytesConstant = mvm::jit::constantFour; + + AssessorInfo[FLOAT_ID].llvmType = Type::FloatTy; + AssessorInfo[FLOAT_ID].llvmTypePtr = PointerType::getUnqual(Type::FloatTy); + AssessorInfo[FLOAT_ID].llvmNullConstant = + Constant::getNullValue(Type::FloatTy); + AssessorInfo[FLOAT_ID].sizeInBytesConstant = mvm::jit::constantFour; + + AssessorInfo[LONG_ID].llvmType = Type::Int64Ty; + AssessorInfo[LONG_ID].llvmTypePtr = PointerType::getUnqual(Type::Int64Ty); + AssessorInfo[LONG_ID].llvmNullConstant = + Constant::getNullValue(Type::Int64Ty); + AssessorInfo[LONG_ID].sizeInBytesConstant = mvm::jit::constantEight; + + AssessorInfo[DOUBLE_ID].llvmType = Type::DoubleTy; + AssessorInfo[DOUBLE_ID].llvmTypePtr = PointerType::getUnqual(Type::DoubleTy); + AssessorInfo[DOUBLE_ID].llvmNullConstant = + Constant::getNullValue(Type::DoubleTy); + AssessorInfo[DOUBLE_ID].sizeInBytesConstant = mvm::jit::constantEight; + + AssessorInfo[ARRAY_ID].llvmType = JavaRuntime::JavaObjectType; + AssessorInfo[ARRAY_ID].llvmTypePtr = + PointerType::getUnqual(JavaRuntime::JavaObjectType); + AssessorInfo[ARRAY_ID].llvmNullConstant = + JavaRuntime::JavaObjectNullConstant; + AssessorInfo[ARRAY_ID].sizeInBytesConstant = mvm::jit::constantPtrSize; + + AssessorInfo[OBJECT_ID].llvmType = JavaRuntime::JavaObjectType; + AssessorInfo[OBJECT_ID].llvmTypePtr = + PointerType::getUnqual(JavaRuntime::JavaObjectType); + AssessorInfo[OBJECT_ID].llvmNullConstant = + JavaRuntime::JavaObjectNullConstant; + AssessorInfo[OBJECT_ID].sizeInBytesConstant = mvm::jit::constantPtrSize; +} + +LLVMAssessorInfo LLVMAssessorInfo::AssessorInfo[NUM_ASSESSORS]; Added: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.h?rev=54733&view=auto ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.h (added) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.h Wed Aug 13 08:29:53 2008 @@ -0,0 +1,381 @@ +//===------- JavaRuntime.h - Definition of the Java runtime ---------------===// +// +// JnJVM +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef JNJVM_JAVA_RUNTIME_H +#define JNJVM_JAVA_RUNTIME_H + +#include + +#include "llvm/Constant.h" +#include "llvm/DerivedTypes.h" +#include "llvm/Function.h" +#include "llvm/GlobalVariable.h" +#include "llvm/Module.h" +#include "llvm/Type.h" +#include "llvm/Value.h" + +#include "mvm/JIT.h" + +#include "JavaClass.h" +#include "JavaTypes.h" + +namespace jnjvm { + +class CommonClass; +class Class; +class JavaField; +class JavaMethod; +class JavaObject; +class JavaJIT; +class JavaRuntime; +class Signdef; + +class LLVMAssessorInfo { +public: + const llvm::Type* llvmType; + const llvm::Type* llvmTypePtr; + llvm::Constant* llvmNullConstant; + llvm::ConstantInt* sizeInBytesConstant; + + static void initialise(); + static LLVMAssessorInfo AssessorInfo[]; + +}; + + +class LLVMCommonClassInfo : public mvm::JITInfo { + + friend class JavaRuntime; + +protected: + CommonClass* classDef; + +private: + /// varGV - The LLVM global variable representing this class. + /// + llvm::GlobalVariable* varGV; + +#ifndef MULTIPLE_VM + /// delegateeGV - The LLVM global variable representing the + /// java/lang/Class instance of this class. + llvm::GlobalVariable* delegateeGV; +#endif + + +public: + llvm::Value* getVar(JavaJIT* jit); + llvm::Value* getDelegatee(JavaJIT* jit); + + LLVMCommonClassInfo(CommonClass* cl) : + classDef(cl), + varGV(0) +#ifndef MULTIPLE_VM + ,delegateeGV(0) +#endif + {} +}; + +class LLVMClassInfo : public LLVMCommonClassInfo { + friend class JavaRuntime; +private: + /// virtualSizeLLVM - The LLVM constant size of instances of this class. + /// + llvm::ConstantInt* virtualSizeConstant; + llvm::GlobalVariable* staticVarGV; + llvm::GlobalVariable* virtualTableGV; + llvm::Function* virtualTracerFunction; + llvm::Function* staticTracerFunction; + /// virtualType - The LLVM type of instance of this class. + /// + const llvm::Type * virtualType; + + /// staticType - The LLVM type of the static instance of this class. + /// + const llvm::Type * staticType; +public: + + llvm::Value* getStaticVar(JavaJIT* jit); + llvm::Value* getVirtualTable(JavaJIT* jit); + llvm::Value* getVirtualSize(JavaJIT* jit); + llvm::Function* getStaticTracer(); + llvm::Function* getVirtualTracer(); + const llvm::Type* getVirtualType(); + const llvm::Type* getStaticType(); + + LLVMClassInfo(CommonClass* cl) : + LLVMCommonClassInfo(cl), + virtualSizeConstant(0), + staticVarGV(0), + virtualTableGV(0), + virtualTracerFunction(0), + staticTracerFunction(0), + virtualType(0), + staticType(0) {} +}; + +class LLVMMethodInfo : public mvm::JITInfo { +private: + JavaMethod* methodDef; + + llvm::Function* methodFunction; + llvm::ConstantInt* offsetConstant; + const llvm::FunctionType* functionType; + +public: + llvm::Function* getMethod(); + llvm::ConstantInt* getOffset(); + const llvm::FunctionType* getFunctionType(); + + LLVMMethodInfo(JavaMethod* M) : + methodDef(M), + methodFunction(0), + offsetConstant(0), + functionType(0) {} +}; + +class LLVMFieldInfo : public mvm::JITInfo { +private: + JavaField* fieldDef; + + llvm::ConstantInt* offsetConstant; + +public: + llvm::ConstantInt* getOffset(); + + LLVMFieldInfo(JavaField* F) : + fieldDef(F), + offsetConstant(0) {} +}; + +class LLVMSignatureInfo : public mvm::JITInfo { +private: + const llvm::FunctionType* staticType; + const llvm::FunctionType* virtualType; + const llvm::FunctionType* nativeType; + + const llvm::FunctionType* virtualBufType; + const llvm::FunctionType* staticBufType; + + const llvm::PointerType* staticPtrType; + const llvm::PointerType* virtualPtrType; + const llvm::PointerType* nativePtrType; + + llvm::Function* virtualBufFunction; + llvm::Function* virtualAPFunction; + llvm::Function* staticBufFunction; + llvm::Function* staticAPFunction; + + Signdef* signature; + + llvm::Function* createFunctionCallBuf(bool virt); + llvm::Function* createFunctionCallAP(bool virt); + + + +public: + const llvm::FunctionType* getVirtualType(); + const llvm::FunctionType* getStaticType(); + const llvm::FunctionType* getNativeType(); + + const llvm::FunctionType* getVirtualBufType(); + const llvm::FunctionType* getStaticBufType(); + + const llvm::PointerType* getStaticPtrType(); + const llvm::PointerType* getNativePtrType(); + const llvm::PointerType* getVirtualPtrType(); + + llvm::Function* getVirtualBuf(); + llvm::Function* getVirtualAP(); + llvm::Function* getStaticBuf(); + llvm::Function* getStaticAP(); + + LLVMSignatureInfo(Signdef* sign) : + staticType(0), + virtualType(0), + nativeType(0), + virtualBufType(0), + staticBufType(0), + staticPtrType(0), + virtualPtrType(0), + nativePtrType(0), + virtualBufFunction(0), + virtualAPFunction(0), + staticBufFunction(0), + staticAPFunction(0), + signature(sign) {} + +}; + +#ifdef SERVICE_VM +class LLVMServiceInfo : public mvm::JITInfo { +private: + ServiceDomain* vm; + llvm::GlobalVariable* delegateeGV; + +public: + llvm::Value* getDelegatee(JavaJIT* jit); +}; +#endif + +class JavaRuntime { + friend class LLVMClassInfo; +private: + + static VirtualTable* makeVT(Class* cl, bool stat); + static VirtualTable* allocateVT(Class* cl, CommonClass::method_iterator meths); + + +public: + + static llvm::ConstantInt* JavaArraySizeOffsetConstant; + static llvm::ConstantInt* JavaArrayElementsOffsetConstant; + static llvm::ConstantInt* JavaObjectLockOffsetConstant; + static llvm::ConstantInt* JavaObjectClassOffsetConstant; + + static const llvm::Type* JavaArrayUInt8Type; + static const llvm::Type* JavaArraySInt8Type; + static const llvm::Type* JavaArrayUInt16Type; + static const llvm::Type* JavaArraySInt16Type; + static const llvm::Type* JavaArrayUInt32Type; + static const llvm::Type* JavaArraySInt32Type; + static const llvm::Type* JavaArrayLongType; + static const llvm::Type* JavaArrayFloatType; + static const llvm::Type* JavaArrayDoubleType; + static const llvm::Type* JavaArrayObjectType; + + static const llvm::Type* VTType; + static const llvm::Type* JavaObjectType; + static const llvm::Type* JavaArrayType; + static const llvm::Type* JavaClassType; + static const llvm::Type* JavaCacheType; + static const llvm::Type* EnveloppeType; + static const llvm::Type* CacheNodeType; + +#ifdef WITH_TRACER + static llvm::Function* MarkAndTraceFunction; + static const llvm::FunctionType* MarkAndTraceType; + static llvm::Function* JavaObjectTracerFunction; +#endif + + static llvm::Function* GetSJLJBufferFunction; + static llvm::Function* InterfaceLookupFunction; + static llvm::Function* FieldLookupFunction; + static llvm::Function* PrintExecutionFunction; + static llvm::Function* PrintMethodStartFunction; + static llvm::Function* PrintMethodEndFunction; + static llvm::Function* JniProceedPendingExceptionFunction; + static llvm::Function* InitialisationCheckFunction; + static llvm::Function* ForceInitialisationCheckFunction; + static llvm::Function* ClassLookupFunction; +#ifndef WITHOUT_VTABLE + static llvm::Function* VirtualLookupFunction; +#endif + static llvm::Function* InstanceOfFunction; + static llvm::Function* IsAssignableFromFunction; + static llvm::Function* ImplementsFunction; + static llvm::Function* InstantiationOfArrayFunction; + static llvm::Function* GetDepthFunction; + static llvm::Function* GetClassInDisplayFunction; + static llvm::Function* GetDisplayFunction; + static llvm::Function* AquireObjectFunction; + static llvm::Function* ReleaseObjectFunction; +#ifdef SERVICE_VM + static llvm::Function* AquireObjectInSharedDomainFunction; + static llvm::Function* ReleaseObjectInSharedDomainFunction; + static llvm::Function* ServiceCallStartFunction; + static llvm::Function* ServiceCallStopFunction; +#endif + static llvm::Function* MultiCallNewFunction; + static llvm::Function* RuntimeUTF8ToStrFunction; + static llvm::Function* GetStaticInstanceFunction; + static llvm::Function* GetClassDelegateeFunction; + static llvm::Function* ArrayLengthFunction; + static llvm::Function* GetVTFunction; + static llvm::Function* GetClassFunction; + static llvm::Function* JavaObjectAllocateFunction; +#ifdef MULTIPLE_GC + static llvm::Function* GetCollectorFunction; +#endif + static llvm::Function* GetVTFromClassFunction; + static llvm::Function* GetObjectSizeFromClassFunction; + + static llvm::Function* GetLockFunction; + static llvm::Function* GetThreadIDFunction; + static llvm::Function* OverflowThinLockFunction; + + static llvm::ConstantInt* OffsetObjectSizeInClassConstant; + static llvm::ConstantInt* OffsetVTInClassConstant; + static llvm::ConstantInt* OffsetDepthInClassConstant; + static llvm::ConstantInt* OffsetDisplayInClassConstant; + + static llvm::Constant* JavaClassNullConstant; + + static llvm::Constant* JavaObjectNullConstant; + static llvm::Constant* UTF8NullConstant; + static llvm::Constant* MaxArraySizeConstant; + static llvm::Constant* JavaObjectSizeConstant; + + static llvm::GlobalVariable* ArrayObjectVirtualTableGV; + static llvm::GlobalVariable* JavaObjectVirtualTableGV; + + static llvm::Function* GetExceptionFunction; + static llvm::Function* GetJavaExceptionFunction; + static llvm::Function* ThrowExceptionFunction; + static llvm::Function* ClearExceptionFunction; + static llvm::Function* CompareExceptionFunction; + static llvm::Function* NullPointerExceptionFunction; + static llvm::Function* IndexOutOfBoundsExceptionFunction; + static llvm::Function* ClassCastExceptionFunction; + static llvm::Function* OutOfMemoryErrorFunction; + static llvm::Function* NegativeArraySizeExceptionFunction; + + static void InitField(JavaField* field); + static void InitField(JavaField* field, JavaObject* obj, uint64 val = 0); + static void InitField(JavaField* field, JavaObject* obj, JavaObject* val); + static void InitField(JavaField* field, JavaObject* obj, double val); + static void InitField(JavaField* field, JavaObject* obj, float val); + + + 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(); + } + + static LLVMCommonClassInfo* getClassInfo(CommonClass* cl) { + if (cl->isArray || cl->isPrimitive) { + return cl->getInfo(); + } else { + return cl->getInfo(); + } + } + + static LLVMFieldInfo* getFieldInfo(JavaField* field) { + return field->getInfo(); + } + + static LLVMMethodInfo* getMethodInfo(JavaMethod* method) { + return method->getInfo(); + } + +#ifdef SERVICE_VM + static LLVMServiceInfo* getServiceInfo(ServiceDomain* service) { + return service->getInfo(); + } +#endif + + static void initialise(llvm::Module* mod); +}; + +} + +#endif Removed: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=54732&view=auto ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (removed) @@ -1,1163 +0,0 @@ -//===--------- JnjvmModule.cpp - Definition of a Jnjvm module -------------===// -// -// JnJVM -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "llvm/CallingConv.h" -#include "llvm/ParameterAttributes.h" -#include "llvm/Support/MutexGuard.h" - - -#include "mvm/JIT.h" - -#include "JavaJIT.h" -#include "JavaThread.h" -#include "JavaTypes.h" -#include "Jnjvm.h" -#include "JnjvmModule.h" -#include "JnjvmModuleProvider.h" -#include "LockedMap.h" - - -using namespace jnjvm; -using namespace llvm; - - -#ifdef WITH_TRACER -const llvm::FunctionType* JnjvmModule::MarkAndTraceType = 0; -#endif - -const llvm::Type* JnjvmModule::JavaObjectType = 0; -const llvm::Type* JnjvmModule::JavaArrayType = 0; -const llvm::Type* JnjvmModule::JavaArrayUInt8Type = 0; -const llvm::Type* JnjvmModule::JavaArraySInt8Type = 0; -const llvm::Type* JnjvmModule::JavaArrayUInt16Type = 0; -const llvm::Type* JnjvmModule::JavaArraySInt16Type = 0; -const llvm::Type* JnjvmModule::JavaArrayUInt32Type = 0; -const llvm::Type* JnjvmModule::JavaArraySInt32Type = 0; -const llvm::Type* JnjvmModule::JavaArrayFloatType = 0; -const llvm::Type* JnjvmModule::JavaArrayDoubleType = 0; -const llvm::Type* JnjvmModule::JavaArrayLongType = 0; -const llvm::Type* JnjvmModule::JavaArrayObjectType = 0; -const llvm::Type* JnjvmModule::CacheNodeType = 0; -const llvm::Type* JnjvmModule::EnveloppeType = 0; - -llvm::Constant* JnjvmModule::JavaObjectNullConstant; -llvm::Constant* JnjvmModule::UTF8NullConstant; -llvm::Constant* JnjvmModule::JavaClassNullConstant; -llvm::Constant* JnjvmModule::MaxArraySizeConstant; -llvm::Constant* JnjvmModule::JavaObjectSizeConstant; -llvm::GlobalVariable* JnjvmModule::JavaObjectVirtualTableGV; -llvm::GlobalVariable* JnjvmModule::ArrayObjectVirtualTableGV; -llvm::ConstantInt* JnjvmModule::OffsetObjectSizeInClassConstant; -llvm::ConstantInt* JnjvmModule::OffsetVTInClassConstant; -llvm::ConstantInt* JnjvmModule::OffsetDepthInClassConstant; -llvm::ConstantInt* JnjvmModule::OffsetDisplayInClassConstant; -const llvm::Type* JnjvmModule::JavaClassType; -const llvm::Type* JnjvmModule::VTType; -llvm::ConstantInt* JnjvmModule::JavaArrayElementsOffsetConstant; -llvm::ConstantInt* JnjvmModule::JavaArraySizeOffsetConstant; -llvm::ConstantInt* JnjvmModule::JavaObjectLockOffsetConstant; -llvm::ConstantInt* JnjvmModule::JavaObjectClassOffsetConstant; - -#ifdef WITH_TRACER -llvm::Function* JnjvmModule::MarkAndTraceFunction = 0; -llvm::Function* JnjvmModule::JavaObjectTracerFunction = 0; -#endif -llvm::Function* JnjvmModule::GetSJLJBufferFunction = 0; -llvm::Function* JnjvmModule::ThrowExceptionFunction = 0; -llvm::Function* JnjvmModule::GetExceptionFunction = 0; -llvm::Function* JnjvmModule::GetJavaExceptionFunction = 0; -llvm::Function* JnjvmModule::ClearExceptionFunction = 0; -llvm::Function* JnjvmModule::CompareExceptionFunction = 0; -llvm::Function* JnjvmModule::NullPointerExceptionFunction = 0; -llvm::Function* JnjvmModule::ClassCastExceptionFunction = 0; -llvm::Function* JnjvmModule::IndexOutOfBoundsExceptionFunction = 0; -llvm::Function* JnjvmModule::NegativeArraySizeExceptionFunction = 0; -llvm::Function* JnjvmModule::OutOfMemoryErrorFunction = 0; -llvm::Function* JnjvmModule::JavaObjectAllocateFunction = 0; -llvm::Function* JnjvmModule::InterfaceLookupFunction = 0; -llvm::Function* JnjvmModule::FieldLookupFunction = 0; -#ifndef WITHOUT_VTABLE -llvm::Function* JnjvmModule::VirtualLookupFunction = 0; -#endif -llvm::Function* JnjvmModule::PrintExecutionFunction = 0; -llvm::Function* JnjvmModule::PrintMethodStartFunction = 0; -llvm::Function* JnjvmModule::PrintMethodEndFunction = 0; -llvm::Function* JnjvmModule::JniProceedPendingExceptionFunction = 0; -llvm::Function* JnjvmModule::InitialisationCheckFunction = 0; -llvm::Function* JnjvmModule::ForceInitialisationCheckFunction = 0; -llvm::Function* JnjvmModule::ClassLookupFunction = 0; -llvm::Function* JnjvmModule::InstanceOfFunction = 0; -llvm::Function* JnjvmModule::IsAssignableFromFunction = 0; -llvm::Function* JnjvmModule::ImplementsFunction = 0; -llvm::Function* JnjvmModule::InstantiationOfArrayFunction = 0; -llvm::Function* JnjvmModule::GetDepthFunction = 0; -llvm::Function* JnjvmModule::GetDisplayFunction = 0; -llvm::Function* JnjvmModule::GetClassInDisplayFunction = 0; -llvm::Function* JnjvmModule::AquireObjectFunction = 0; -llvm::Function* JnjvmModule::ReleaseObjectFunction = 0; -llvm::Function* JnjvmModule::MultiCallNewFunction = 0; -llvm::Function* JnjvmModule::RuntimeUTF8ToStrFunction = 0; -llvm::Function* JnjvmModule::GetStaticInstanceFunction = 0; -llvm::Function* JnjvmModule::GetClassDelegateeFunction = 0; -llvm::Function* JnjvmModule::ArrayLengthFunction = 0; -llvm::Function* JnjvmModule::GetVTFunction = 0; -llvm::Function* JnjvmModule::GetClassFunction = 0; -llvm::Function* JnjvmModule::GetVTFromClassFunction = 0; -llvm::Function* JnjvmModule::GetObjectSizeFromClassFunction = 0; - -#ifdef MULTIPLE_GC -llvm::Function* JnjvmModule::GetCollectorFunction = 0; -#endif - -#ifdef SERVICE_VM -llvm::Function* JnjvmModule::AquireObjectInSharedDomainFunction = 0; -llvm::Function* JnjvmModule::ReleaseObjectInSharedDomainFunction = 0; -llvm::Function* JnjvmModule::ServiceCallStartFunction = 0; -llvm::Function* JnjvmModule::ServiceCallStopFunction = 0; -#endif - -llvm::Function* JnjvmModule::GetThreadIDFunction = 0; -llvm::Function* JnjvmModule::GetLockFunction = 0; -llvm::Function* JnjvmModule::OverflowThinLockFunction = 0; - - - -Value* LLVMCommonClassInfo::getVar(JavaJIT* jit) { - if (!varGV) { -#ifdef MULTIPLE_VM - if (jit->compilingClass->isolate->TheModule == Jnjvm::bootstrapVM->TheModule && - classDef->isArray && classDef->isolate != Jnjvm::bootstrapVM) { - // We know the array class can belong to bootstrap - CommonClass* cl = Jnjvm::bootstrapVM->constructArray(classDef->name, 0); - return cl->isolate->TheModule->getClassInfo(cl)->getVar(jit); - } -#endif - - Constant* cons = - ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, - uint64_t (classDef)), - JnjvmModule::JavaClassType); - - varGV = new GlobalVariable(JnjvmModule::JavaClassType, true, - GlobalValue::ExternalLinkage, - cons, "", - classDef->isolate->TheModule); - } - return new LoadInst(varGV, "", jit->currentBlock); -} - -Value* LLVMCommonClassInfo::getDelegatee(JavaJIT* jit) { -#ifndef MULTIPLE_VM - if (!delegateeGV) { - JavaObject* obj = classDef->getClassDelegatee(); - Constant* cons = - ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64(obj)), - JnjvmModule::JavaObjectType); - delegateeGV = new GlobalVariable(JnjvmModule::JavaObjectType, true, - GlobalValue::ExternalLinkage, - cons, "", - classDef->isolate->TheModule); - } - return new LoadInst(delegateeGV, "", jit->currentBlock); -#else - Value* ld = getVar(jit); - return llvm::CallInst::Create(JnjvmModule::GetClassDelegateeFunction, ld, "", - jit->currentBlock); -#endif -} - -#ifndef WITHOUT_VTABLE -VirtualTable* JnjvmModule::allocateVT(Class* cl, - CommonClass::method_iterator meths) { - if (meths == cl->virtualMethods.end()) { - uint64 size = cl->virtualTableSize; - VirtualTable* VT = (VirtualTable*)malloc(size * sizeof(void*)); - if (!VT) JavaThread::get()->isolate->outOfMemoryError(size * sizeof(void*)); - if (cl->super) { - Class* super = (Class*)cl->super; - assert(cl->virtualTableSize >= cl->super->virtualTableSize && - "Super VT bigger than own VT"); - assert(super->virtualVT && "Super does not have a VT!"); - memcpy(VT, super->virtualVT, cl->super->virtualTableSize * sizeof(void*)); - } else { - memcpy(VT, JavaObject::VT, VT_SIZE); - } - return VT; - } else { - JavaMethod* meth = meths->second; - VirtualTable* VT = 0; - if (meth->name->equals(Jnjvm::finalize)) { - VT = allocateVT(cl, ++meths); - meth->offset = 0; - Function* func = cl->isolate->TheModuleProvider->parseFunction(meth); - if (!cl->super) meth->canBeInlined = true; - Function::iterator BB = func->begin(); - BasicBlock::iterator I = BB->begin(); - if (isa(I)) { - ((void**)VT)[0] = 0; - } else { - ExecutionEngine* EE = mvm::jit::executionEngine; - // LLVM does not allow recursive compilation. Create the code now. - ((void**)VT)[0] = EE->getPointerToFunction(func); - } - } else { - - JavaMethod* parent = cl->super? - cl->super->lookupMethodDontThrow(meth->name, meth->type, false, true) : - 0; - - uint64_t offset = 0; - if (!parent) { - offset = cl->virtualTableSize++; - meth->offset = offset; - } else { - offset = parent->offset; - meth->offset = parent->offset; - } - VT = allocateVT(cl, ++meths); - LLVMMethodInfo* LMI = getMethodInfo(meth); - Function* func = LMI->getMethod(); - ExecutionEngine* EE = mvm::jit::executionEngine; - ((void**)VT)[offset] = EE->getPointerToFunctionOrStub(func); - } - - return VT; - } -} -#endif - - -VirtualTable* JnjvmModule::makeVT(Class* cl, bool stat) { - - VirtualTable* res = 0; -#ifndef WITHOUT_VTABLE - if (stat) { -#endif - res = (VirtualTable*)malloc(VT_SIZE); - memcpy(res, JavaObject::VT, VT_SIZE); -#ifndef WITHOUT_VTABLE - } else { - res = allocateVT(cl, cl->virtualMethods.begin()); - - if (!(cl->super)) { - // 12 = number of virtual methods in java/lang/Object (!!!) - uint32 size = 12 * sizeof(void*); -#define COPY(CLASS) \ - memcpy((void*)((unsigned)CLASS::VT + VT_SIZE), \ - (void*)((unsigned)res + VT_SIZE), size); - - COPY(JavaObject) - COPY(ArrayUInt8) - COPY(ArraySInt8) - COPY(ArrayUInt16) - COPY(ArraySInt16) - COPY(ArrayUInt32) - COPY(ArraySInt32) - COPY(ArrayLong) - COPY(ArrayFloat) - COPY(ArrayDouble) - COPY(UTF8) - COPY(ArrayObject) - -#undef COPY - } - } -#endif - - - -#ifdef WITH_TRACER - LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); - const Type* type = stat ? LCI->getStaticType() : LCI->getVirtualType(); - CommonClass::field_map fields = stat ? cl->staticFields : cl->virtualFields; - - Function* func = Function::Create(JnjvmModule::MarkAndTraceType, - GlobalValue::ExternalLinkage, - "markAndTraceObject", - cl->isolate->TheModule); - - Constant* zero = mvm::jit::constantZero; - Argument* arg = func->arg_begin(); - BasicBlock* block = BasicBlock::Create("", func); - llvm::Value* realArg = new BitCastInst(arg, type, "", block); - -#ifdef MULTIPLE_GC - Value* GC = ++func->arg_begin(); - std::vector Args; - Args.push_back(arg); - Args.push_back(GC); - if (stat || cl->super == 0) { - CallInst::Create(JnjvmModule::JavaObjectTracer, Args.begin(), Args.end(), - "", block); - } else { - CallInst::Create(((Class*)cl->super)->virtualTracer, Args.begin(), - Args.end(), "", block); - } -#else - if (stat || cl->super == 0) { - CallInst::Create(JnjvmModule::JavaObjectTracerFunction, arg, "", block); - } else { - LLVMClassInfo* LCP = (LLVMClassInfo*)getClassInfo((Class*)(cl->super)); - CallInst::Create(LCP->getVirtualTracer(), arg, "", block); - } -#endif - - for (CommonClass::field_iterator i = fields.begin(), e = fields.end(); - i!= e; ++i) { - if (i->second->getSignature()->funcs->doTrace) { - LLVMFieldInfo* LFI = getFieldInfo(i->second); - std::vector args; //size = 2 - args.push_back(zero); - args.push_back(LFI->getOffset()); - Value* ptr = GetElementPtrInst::Create(realArg, args.begin(), args.end(), - "",block); - Value* val = new LoadInst(ptr, "", block); - Value* valCast = new BitCastInst(val, JnjvmModule::JavaObjectType, "", - block); -#ifdef MULTIPLE_GC - std::vector Args; - Args.push_back(valCast); - Args.push_back(GC); - CallInst::Create(JnjvmModule::MarkAndTraceFunction, Args.begin(), - Args.end(), "", block); -#else - CallInst::Create(JnjvmModule::MarkAndTraceFunction, valCast, "", block); -#endif - } - } - - ReturnInst::Create(block); - - void* codePtr = mvm::jit::executionEngine->getPointerToGlobal(func); - ((void**)res)[VT_TRACER_OFFSET] = codePtr; - - if (!stat) { - LCI->virtualTracerFunction = func; - } else { - LCI->staticTracerFunction = func; - } -#endif - return res; -} - - -const Type* LLVMClassInfo::getVirtualType() { - if (!virtualType) { - std::vector fields; - JavaField** array = - (JavaField**)alloca(sizeof(JavaField*) * classDef->virtualFields.size()); - - if (classDef->super) { - LLVMClassInfo* CLI = - (LLVMClassInfo*)JnjvmModule::getClassInfo(classDef->super); - fields.push_back(CLI->getVirtualType()->getContainedType(0)); - } else { - fields.push_back(JnjvmModule::JavaObjectType->getContainedType(0)); - } - - for (CommonClass::field_iterator i = classDef->virtualFields.begin(), - e = classDef->virtualFields.end(); i!= e; ++i) { - JavaField* field = i->second; - array[field->num] = field; - } - - - for (uint32 index = 0; index < classDef->virtualFields.size(); ++index) { - uint8 id = array[index]->getSignature()->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - fields.push_back(LAI.llvmType); - } - - StructType* structType = StructType::get(fields, false); - virtualType = PointerType::getUnqual(structType); - const TargetData* targetData = mvm::jit::executionEngine->getTargetData(); - const StructLayout* sl = targetData->getStructLayout(structType); - - for (CommonClass::field_iterator i = classDef->virtualFields.begin(), - e = classDef->virtualFields.end(); i!= e; ++i) { - JavaField* field = i->second; - field->ptrOffset = sl->getElementOffset(field->num + 1); - } - - VirtualTable* VT = JnjvmModule::makeVT((Class*)classDef, false); - - uint64 size = mvm::jit::getTypeSize(structType); - classDef->virtualSize = (uint32)size; - classDef->virtualVT = VT; - virtualSizeConstant = ConstantInt::get(Type::Int32Ty, size); - - } - - return virtualType; -} - -const Type* LLVMClassInfo::getStaticType() { - - if (!staticType) { - Class* cl = (Class*)classDef; - std::vector fields; - JavaField** array = (JavaField**) - alloca(sizeof(JavaField*) * (classDef->staticFields.size() + 1)); - fields.push_back(JnjvmModule::JavaObjectType->getContainedType(0)); - - for (CommonClass::field_iterator i = classDef->staticFields.begin(), - e = classDef->staticFields.end(); i!= e; ++i) { - JavaField* field = i->second; - array[field->num] = field; - } - - for (uint32 index = 0; index < classDef->staticFields.size(); ++index) { - JavaField* field = array[index]; - uint8 id = field->getSignature()->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - fields.push_back(LAI.llvmType); - } - - StructType* structType = StructType::get(fields, false); - staticType = PointerType::getUnqual(structType); - const TargetData* targetData = mvm::jit::executionEngine->getTargetData(); - const StructLayout* sl = targetData->getStructLayout(structType); - - for (CommonClass::field_iterator i = classDef->staticFields.begin(), - e = classDef->staticFields.end(); i!= e; ++i) { - JavaField* field = i->second; - field->ptrOffset = sl->getElementOffset(field->num + 1); - } - - - VirtualTable* VT = JnjvmModule::makeVT((Class*)classDef, true); - - uint64 size = mvm::jit::getTypeSize(structType); - cl->staticSize = size; - cl->staticVT = VT; - -#ifndef MULTIPLE_VM - JavaObject* val = - (JavaObject*)classDef->isolate->allocateObject(cl->staticSize, - cl->staticVT); - val->initialise(classDef); - for (CommonClass::field_iterator i = cl->staticFields.begin(), - e = cl->staticFields.end(); i!= e; ++i) { - - i->second->initField(val); - } - - cl->_staticInstance = val; -#endif - } - return staticType; -} - -Value* LLVMClassInfo::getStaticVar(JavaJIT* jit) { -#ifndef MULTIPLE_VM - if (!staticVarGV) { - getStaticType(); - JavaObject* obj = ((Class*)classDef)->staticInstance(); - Constant* cons = - ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, - uint64_t (obj)), JnjvmModule::JavaObjectType); - - staticVarGV = new GlobalVariable(JnjvmModule::JavaObjectType, true, - GlobalValue::ExternalLinkage, - cons, "", - classDef->isolate->TheModule); - } - - return new LoadInst(staticVarGV, "", jit->currentBlock); - -#else - Value* ld = getVar(jit); - ld = jit->invoke(JnjvmModule::InitialisationCheckFunction, ld, "", - jit->currentBlock); - return jit->invoke(JnjvmModule::GetStaticInstanceFunction, ld, - jit->isolateLocal, "", jit->currentBlock); -#endif -} - -Value* LLVMClassInfo::getVirtualTable(JavaJIT* jit) { - if (!virtualTableGV) { - getVirtualType(); - Constant* cons = - ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, - uint64_t(classDef->virtualVT)), - JnjvmModule::VTType); - virtualTableGV = new GlobalVariable(JnjvmModule::VTType, true, - GlobalValue::ExternalLinkage, - cons, "", - classDef->isolate->TheModule); - } - return new LoadInst(virtualTableGV, "", jit->currentBlock); -} - -Value* LLVMClassInfo::getVirtualSize(JavaJIT* jit) { - if (!virtualSizeConstant) { - getVirtualType(); - virtualSizeConstant = - ConstantInt::get(Type::Int32Ty, classDef->virtualSize); - } - return virtualSizeConstant; -} - -Function* LLVMClassInfo::getStaticTracer() { - if (!staticTracerFunction) { - getStaticType(); - } - return staticTracerFunction; -} - -Function* LLVMClassInfo::getVirtualTracer() { - if (!virtualTracerFunction) { - getVirtualType(); - } - return virtualTracerFunction; -} - -Function* LLVMMethodInfo::getMethod() { - if (!methodFunction) { - Jnjvm* vm = methodDef->classDef->isolate; - methodFunction = Function::Create(getFunctionType(), - GlobalValue::GhostLinkage, - methodDef->printString(), - vm->TheModule); - vm->TheModuleProvider->addFunction(methodFunction, methodDef); - } - return methodFunction; -} - -const FunctionType* LLVMMethodInfo::getFunctionType() { - if (!functionType) { - LLVMSignatureInfo* LSI = JnjvmModule::getSignatureInfo(methodDef->getSignature()); - assert(LSI); - if (isStatic(methodDef->access)) { - functionType = LSI->getStaticType(); - } else { - functionType = LSI->getVirtualType(); - } - } - return functionType; -} - -ConstantInt* LLVMMethodInfo::getOffset() { - if (!offsetConstant) { - JnjvmModule::resolveVirtualClass(methodDef->classDef); - offsetConstant = ConstantInt::get(Type::Int32Ty, methodDef->offset); - } - return offsetConstant; -} - -ConstantInt* LLVMFieldInfo::getOffset() { - if (!offsetConstant) { - if (isStatic(fieldDef->access)) { - JnjvmModule::resolveStaticClass(fieldDef->classDef); - } else { - JnjvmModule::resolveVirtualClass(fieldDef->classDef); - } - // Increment by one because zero is JavaObject - offsetConstant = ConstantInt::get(Type::Int32Ty, fieldDef->num + 1); - } - return offsetConstant; -} - -const llvm::FunctionType* LLVMSignatureInfo::getVirtualType() { - if (!virtualType) { - // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - std::vector llvmArgs; - unsigned int size = signature->args.size(); - - llvmArgs.push_back(JnjvmModule::JavaObjectType); - - for (uint32 i = 0; i < size; ++i) { - uint8 id = signature->args.at(i)->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - llvmArgs.push_back(LAI.llvmType); - } - -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) - llvmArgs.push_back(mvm::jit::ptrType); // domain -#endif - - uint8 id = signature->ret->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - virtualType = FunctionType::get(LAI.llvmType, llvmArgs, false); - } - return virtualType; -} - -const llvm::FunctionType* LLVMSignatureInfo::getStaticType() { - if (!staticType) { - // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - std::vector llvmArgs; - unsigned int size = signature->args.size(); - - for (uint32 i = 0; i < size; ++i) { - uint8 id = signature->args.at(i)->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - llvmArgs.push_back(LAI.llvmType); - } - -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) - llvmArgs.push_back(mvm::jit::ptrType); // domain -#endif - - uint8 id = signature->ret->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - staticType = FunctionType::get(LAI.llvmType, llvmArgs, false); - } - return staticType; -} - -const llvm::FunctionType* LLVMSignatureInfo::getNativeType() { - if (!nativeType) { - // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - std::vector llvmArgs; - unsigned int size = signature->args.size(); - - llvmArgs.push_back(mvm::jit::ptrType); // JNIEnv - llvmArgs.push_back(JnjvmModule::JavaObjectType); // Class - - for (uint32 i = 0; i < size; ++i) { - uint8 id = signature->args.at(i)->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - llvmArgs.push_back(LAI.llvmType); - } - -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) - llvmArgs.push_back(mvm::jit::ptrType); // domain -#endif - - uint8 id = signature->ret->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - nativeType = FunctionType::get(LAI.llvmType, llvmArgs, false); - } - return nativeType; -} - - -Function* LLVMSignatureInfo::createFunctionCallBuf(bool virt) { - - ConstantInt* CI = mvm::jit::constantZero; - std::vector Args; - - Function* res = Function::Create(virt ? getVirtualBufType() : - getStaticBufType(), - GlobalValue::ExternalLinkage, - signature->printString(), - signature->isolate->TheModule); - - BasicBlock* currentBlock = BasicBlock::Create("enter", res); - Function::arg_iterator i = res->arg_begin(); - Value *obj, *ptr, *func; -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) - Value* vm = i; -#endif - ++i; - func = i; - ++i; - if (virt) { - obj = i; - ++i; - Args.push_back(obj); - } - ptr = i; - - for (std::vector::iterator i = signature->args.begin(), - e = signature->args.end(); i!= e; ++i) { - - const AssessorDesc* funcs = (*i)->funcs; - ptr = GetElementPtrInst::Create(ptr, CI, "", currentBlock); - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[funcs->numId]; - Value* val = new BitCastInst(ptr, LAI.llvmTypePtr, "", currentBlock); - Value* arg = new LoadInst(val, "", currentBlock); - Args.push_back(arg); - if (funcs == AssessorDesc::dLong || funcs == AssessorDesc::dDouble) { - CI = mvm::jit::constantTwo; - } else { - CI = mvm::jit::constantOne; - } - } - -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) - Args.push_back(vm); -#endif - - Value* val = CallInst::Create(func, Args.begin(), Args.end(), "", currentBlock); - if (signature->ret->funcs != AssessorDesc::dVoid) - ReturnInst::Create(val, currentBlock); - else - ReturnInst::Create(currentBlock); - - return res; -} - -Function* LLVMSignatureInfo::createFunctionCallAP(bool virt) { - - std::vector Args; - - Function* res = Function::Create(virt ? getVirtualBufType() : - getStaticBufType(), - GlobalValue::ExternalLinkage, - signature->printString(), - signature->isolate->TheModule); - - BasicBlock* currentBlock = BasicBlock::Create("enter", res); - Function::arg_iterator i = res->arg_begin(); - Value *obj, *ap, *func; -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) - Value* vm = i; -#endif - ++i; - func = i; - ++i; - if (virt) { - obj = i; - Args.push_back(obj); - ++i; - } - ap = i; - - for (std::vector::iterator i = signature->args.begin(), - e = signature->args.end(); i!= e; i++) { - - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[(*i)->funcs->numId]; - Args.push_back(new VAArgInst(ap, LAI.llvmType, "", currentBlock)); - } - -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) - Args.push_back(vm); -#endif - - Value* val = CallInst::Create(func, Args.begin(), Args.end(), "", currentBlock); - if (signature->ret->funcs != AssessorDesc::dVoid) - ReturnInst::Create(val, currentBlock); - else - ReturnInst::Create(currentBlock); - - return res; -} - -const PointerType* LLVMSignatureInfo::getStaticPtrType() { - if (!staticPtrType) { - staticPtrType = PointerType::getUnqual(getStaticType()); - } - return staticPtrType; -} - -const PointerType* LLVMSignatureInfo::getVirtualPtrType() { - if (!virtualPtrType) { - virtualPtrType = PointerType::getUnqual(getVirtualType()); - } - return virtualPtrType; -} - -const PointerType* LLVMSignatureInfo::getNativePtrType() { - if (!nativePtrType) { - nativePtrType = PointerType::getUnqual(getNativeType()); - } - return nativePtrType; -} - - -const FunctionType* LLVMSignatureInfo::getVirtualBufType() { - if (!virtualBufType) { - // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - std::vector Args2; - Args2.push_back(mvm::jit::ptrType); // vm - Args2.push_back(getVirtualPtrType()); - Args2.push_back(JnjvmModule::JavaObjectType); - Args2.push_back(PointerType::getUnqual(Type::Int32Ty)); - uint8 id = signature->ret->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - virtualBufType = FunctionType::get(LAI.llvmType, Args2, false); - } - return virtualBufType; -} - -const FunctionType* LLVMSignatureInfo::getStaticBufType() { - if (!staticBufType) { - // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - std::vector Args; - Args.push_back(mvm::jit::ptrType); // vm - Args.push_back(getStaticPtrType()); - Args.push_back(PointerType::getUnqual(Type::Int32Ty)); - uint8 id = signature->ret->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - staticBufType = FunctionType::get(LAI.llvmType, Args, false); - } - return staticBufType; -} - -Function* LLVMSignatureInfo::getVirtualBuf() { - if (!virtualBufFunction) { - // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - virtualBufFunction = createFunctionCallBuf(true); - signature->setVirtualCallBuf((intptr_t) - mvm::jit::executionEngine->getPointerToGlobal(virtualBufFunction)); - } - return virtualBufFunction; -} - -Function* LLVMSignatureInfo::getVirtualAP() { - if (!virtualAPFunction) { - // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - virtualAPFunction = createFunctionCallAP(true); - signature->setVirtualCallAP((intptr_t) - mvm::jit::executionEngine->getPointerToGlobal(virtualAPFunction)); - } - return virtualAPFunction; -} - -Function* LLVMSignatureInfo::getStaticBuf() { - if (!staticBufFunction) { - // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - staticBufFunction = createFunctionCallBuf(false); - signature->setStaticCallBuf((intptr_t) - mvm::jit::executionEngine->getPointerToGlobal(staticBufFunction)); - } - return staticBufFunction; -} - -Function* LLVMSignatureInfo::getStaticAP() { - if (!staticAPFunction) { - // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - staticAPFunction = createFunctionCallAP(false); - signature->setStaticCallAP((intptr_t) - mvm::jit::executionEngine->getPointerToGlobal(staticAPFunction)); - } - return staticAPFunction; -} - -void JnjvmModule::resolveVirtualClass(Class* cl) { - // Lock here because we may be called by a class resolver - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); - LCI->getVirtualType(); -} - -void JnjvmModule::resolveStaticClass(Class* cl) { - // Lock here because we may be called by a class initializer - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); - LCI->getStaticType(); -} - -#ifdef SERVICE_VM -Value* LLVMServiceInfo::getDelegatee(JavaJIT* jit) { - if (!delegateeGV) { - Constant* cons = - ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64(vm)), - mvm::jit::ptrType); - delegateeGV = new GlobalVariable(mvm::jit::ptrType, true, - GlobalValue::ExternalLinkage, - cons, "", - vm->module); - } - return new LoadInst(delegateeGV, "", jit->currentBlock); -} - -#endif - - -namespace jnjvm { - namespace llvm_runtime { - #include "LLVMRuntime.inc" - } -} - -void JnjvmModule::initialise() { - Module* module = this; - jnjvm::llvm_runtime::makeLLVMModuleContents(module); - - VTType = module->getTypeByName("VT"); - - JavaObjectType = - PointerType::getUnqual(module->getTypeByName("JavaObject")); - - JavaArrayType = - PointerType::getUnqual(module->getTypeByName("JavaArray")); - - JavaClassType = - PointerType::getUnqual(module->getTypeByName("JavaClass")); - - JavaArrayUInt8Type = - PointerType::getUnqual(module->getTypeByName("ArrayUInt8")); - JavaArraySInt8Type = - PointerType::getUnqual(module->getTypeByName("ArraySInt8")); - JavaArrayUInt16Type = - PointerType::getUnqual(module->getTypeByName("ArrayUInt16")); - JavaArraySInt16Type = - PointerType::getUnqual(module->getTypeByName("ArraySInt16")); - JavaArrayUInt32Type = - PointerType::getUnqual(module->getTypeByName("ArrayUInt32")); - JavaArraySInt32Type = - PointerType::getUnqual(module->getTypeByName("ArraySInt32")); - JavaArrayLongType = - PointerType::getUnqual(module->getTypeByName("ArrayLong")); - JavaArrayFloatType = - PointerType::getUnqual(module->getTypeByName("ArrayFloat")); - JavaArrayDoubleType = - PointerType::getUnqual(module->getTypeByName("ArrayDouble")); - JavaArrayObjectType = - PointerType::getUnqual(module->getTypeByName("ArrayObject")); - - CacheNodeType = - PointerType::getUnqual(module->getTypeByName("CacheNode")); - - EnveloppeType = - PointerType::getUnqual(module->getTypeByName("Enveloppe")); - - InterfaceLookupFunction = module->getFunction("jnjvmVirtualLookup"); - MultiCallNewFunction = module->getFunction("multiCallNew"); - InitialisationCheckFunction = module->getFunction("initialisationCheck"); - ForceInitialisationCheckFunction = - module->getFunction("forceInitialisationCheck"); - - ArrayLengthFunction = module->getFunction("arrayLength"); - GetVTFunction = module->getFunction("getVT"); - GetClassFunction = module->getFunction("getClass"); - ClassLookupFunction = module->getFunction("newLookup"); - GetVTFromClassFunction = module->getFunction("getVTFromClass"); - GetObjectSizeFromClassFunction = module->getFunction("getObjectSizeFromClass"); - - GetClassDelegateeFunction = module->getFunction("getClassDelegatee"); - InstanceOfFunction = module->getFunction("instanceOf"); - IsAssignableFromFunction = module->getFunction("isAssignableFrom"); - ImplementsFunction = module->getFunction("implements"); - InstantiationOfArrayFunction = module->getFunction("instantiationOfArray"); - GetDepthFunction = module->getFunction("getDepth"); - GetDisplayFunction = module->getFunction("getDisplay"); - GetClassInDisplayFunction = module->getFunction("getClassInDisplay"); - AquireObjectFunction = module->getFunction("JavaObjectAquire"); - ReleaseObjectFunction = module->getFunction("JavaObjectRelease"); - OverflowThinLockFunction = module->getFunction("overflowThinLock"); - - FieldLookupFunction = module->getFunction("fieldLookup"); - - GetExceptionFunction = module->getFunction("JavaThreadGetException"); - GetJavaExceptionFunction = module->getFunction("JavaThreadGetJavaException"); - CompareExceptionFunction = module->getFunction("JavaThreadCompareException"); - JniProceedPendingExceptionFunction = - module->getFunction("jniProceedPendingException"); - GetSJLJBufferFunction = module->getFunction("getSJLJBuffer"); - - NullPointerExceptionFunction = module->getFunction("jnjvmNullPointerException"); - ClassCastExceptionFunction = module->getFunction("jnjvmClassCastException"); - IndexOutOfBoundsExceptionFunction = - module->getFunction("indexOutOfBoundsException"); - NegativeArraySizeExceptionFunction = - module->getFunction("negativeArraySizeException"); - OutOfMemoryErrorFunction = module->getFunction("outOfMemoryError"); - - JavaObjectAllocateFunction = module->getFunction("gcmalloc"); - - PrintExecutionFunction = module->getFunction("printExecution"); - PrintMethodStartFunction = module->getFunction("printMethodStart"); - PrintMethodEndFunction = module->getFunction("printMethodEnd"); - - ThrowExceptionFunction = module->getFunction("JavaThreadThrowException"); - - ClearExceptionFunction = module->getFunction("JavaThreadClearException"); - - -#ifdef MULTIPLE_VM - GetStaticInstanceFunction = module->getFunction("getStaticInstance"); - RuntimeUTF8ToStrFunction = module->getFunction("runtimeUTF8ToStr"); -#endif - -#ifdef SERVICE_VM - AquireObjectInSharedDomainFunction = - module->getFunction("JavaObjectAquireInSharedDomain"); - ReleaseObjectInSharedDomainfunction = - module->getFunction("JavaObjectReleaseInSharedDomain"); - ServiceCallStartFunction = module->getFunction("serviceCallStart"); - ServiceCallStopFunction = module->getFunction("serviceCallStop"); -#endif - -#ifdef WITH_TRACER - MarkAndTraceFunction = module->getFunction("MarkAndTrace"); - MarkAndTraceType = MarkAndTraceFunction->getFunctionType(); - JavaObjectTracerFunction = module->getFunction("JavaObjectTracer"); -#endif - -#ifndef WITHOUT_VTABLE - VirtualLookupFunction = module->getFunction("vtableLookup"); -#endif - -#ifdef MULTIPLE_GC - GetCollectorFunction = module->getFunction("getCollector"); -#endif - - GetThreadIDFunction = module->getFunction("getThreadID"); - GetLockFunction = module->getFunction("getLock"); - - UTF8NullConstant = Constant::getNullValue(JavaArrayUInt16Type); - JavaClassNullConstant = Constant::getNullValue(JavaClassType); - JavaObjectNullConstant = Constant::getNullValue(JnjvmModule::JavaObjectType); - MaxArraySizeConstant = ConstantInt::get(Type::Int32Ty, - JavaArray::MaxArraySize); - JavaObjectSizeConstant = ConstantInt::get(Type::Int32Ty, sizeof(JavaObject)); - - - Constant* cons = - ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, - uint64_t (JavaObject::VT)), VTType); - - JavaObjectVirtualTableGV = new GlobalVariable(VTType, true, - GlobalValue::ExternalLinkage, - cons, "", - module); - - cons = - ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, - uint64_t (ArrayObject::VT)), VTType); - - ArrayObjectVirtualTableGV = new GlobalVariable(VTType, true, - GlobalValue::ExternalLinkage, - cons, "", - module); - - JavaArrayElementsOffsetConstant = mvm::jit::constantTwo; - JavaArraySizeOffsetConstant = mvm::jit::constantOne; - JavaObjectLockOffsetConstant = mvm::jit::constantTwo; - JavaObjectClassOffsetConstant = mvm::jit::constantOne; - - OffsetObjectSizeInClassConstant = mvm::jit::constantOne; - OffsetVTInClassConstant = mvm::jit::constantTwo; - OffsetDisplayInClassConstant = mvm::jit::constantThree; - OffsetDepthInClassConstant = mvm::jit::constantFour; - - LLVMAssessorInfo::initialise(); -} - -void JnjvmModule::InitField(JavaField* field, JavaObject* obj, uint64 val) { - - const AssessorDesc* funcs = field->getSignature()->funcs; - if (funcs == AssessorDesc::dLong) { - ((sint64*)((uint64)obj + field->ptrOffset))[0] = val; - } else if (funcs == AssessorDesc::dInt) { - ((sint32*)((uint64)obj + field->ptrOffset))[0] = (sint32)val; - } else if (funcs == AssessorDesc::dChar) { - ((uint16*)((uint64)obj + field->ptrOffset))[0] = (uint16)val; - } else if (funcs == AssessorDesc::dShort) { - ((sint16*)((uint64)obj + field->ptrOffset))[0] = (sint16)val; - } else if (funcs == AssessorDesc::dByte) { - ((sint8*)((uint64)obj + field->ptrOffset))[0] = (sint8)val; - } else if (funcs == AssessorDesc::dBool) { - ((uint8*)((uint64)obj + field->ptrOffset))[0] = (uint8)val; - } else { - // 0 value for everything else - ((sint32*)((uint64)obj + field->ptrOffset))[0] = (sint32)val; - } -} - -void JnjvmModule::InitField(JavaField* field, JavaObject* obj, JavaObject* val) { - ((JavaObject**)((uint64)obj + field->ptrOffset))[0] = val; -} - -void JnjvmModule::InitField(JavaField* field, JavaObject* obj, double val) { - ((double*)((uint64)obj + field->ptrOffset))[0] = val; -} - -void JnjvmModule::InitField(JavaField* field, JavaObject* obj, float val) { - ((float*)((uint64)obj + field->ptrOffset))[0] = val; -} - -void JnjvmModule::setMethod(JavaMethod* meth, const char* name) { - llvm::Function* func = getMethodInfo(meth)->getMethod(); - func->setName(name); - func->setLinkage(llvm::GlobalValue::ExternalLinkage); -} - -void* JnjvmModule::getMethod(JavaMethod* meth) { - return getMethodInfo(meth)->getMethod(); -} - -JnjvmModule::JnjvmModule(const std::string &ModuleID) : llvm::Module(ModuleID) { - std::string str = - mvm::jit::executionEngine->getTargetData()->getStringRepresentation(); - setDataLayout(str); -} -void LLVMAssessorInfo::initialise() { - AssessorInfo[VOID_ID].llvmType = Type::VoidTy; - AssessorInfo[VOID_ID].llvmTypePtr = 0; - AssessorInfo[VOID_ID].llvmNullConstant = 0; - AssessorInfo[VOID_ID].sizeInBytesConstant = 0; - - AssessorInfo[BOOL_ID].llvmType = Type::Int8Ty; - AssessorInfo[BOOL_ID].llvmTypePtr = PointerType::getUnqual(Type::Int8Ty); - AssessorInfo[BOOL_ID].llvmNullConstant = - Constant::getNullValue(Type::Int8Ty); - AssessorInfo[BOOL_ID].sizeInBytesConstant = mvm::jit::constantOne; - - AssessorInfo[BYTE_ID].llvmType = Type::Int8Ty; - AssessorInfo[BYTE_ID].llvmTypePtr = PointerType::getUnqual(Type::Int8Ty); - AssessorInfo[BYTE_ID].llvmNullConstant = - Constant::getNullValue(Type::Int8Ty); - AssessorInfo[BYTE_ID].sizeInBytesConstant = mvm::jit::constantOne; - - AssessorInfo[SHORT_ID].llvmType = Type::Int16Ty; - AssessorInfo[SHORT_ID].llvmTypePtr = PointerType::getUnqual(Type::Int16Ty); - AssessorInfo[SHORT_ID].llvmNullConstant = - Constant::getNullValue(Type::Int16Ty); - AssessorInfo[SHORT_ID].sizeInBytesConstant = mvm::jit::constantTwo; - - AssessorInfo[CHAR_ID].llvmType = Type::Int16Ty; - AssessorInfo[CHAR_ID].llvmTypePtr = PointerType::getUnqual(Type::Int16Ty); - AssessorInfo[CHAR_ID].llvmNullConstant = - Constant::getNullValue(Type::Int16Ty); - AssessorInfo[CHAR_ID].sizeInBytesConstant = mvm::jit::constantTwo; - - AssessorInfo[INT_ID].llvmType = Type::Int32Ty; - AssessorInfo[INT_ID].llvmTypePtr = PointerType::getUnqual(Type::Int32Ty); - AssessorInfo[INT_ID].llvmNullConstant = - Constant::getNullValue(Type::Int32Ty); - AssessorInfo[INT_ID].sizeInBytesConstant = mvm::jit::constantFour; - - AssessorInfo[FLOAT_ID].llvmType = Type::FloatTy; - AssessorInfo[FLOAT_ID].llvmTypePtr = PointerType::getUnqual(Type::FloatTy); - AssessorInfo[FLOAT_ID].llvmNullConstant = - Constant::getNullValue(Type::FloatTy); - AssessorInfo[FLOAT_ID].sizeInBytesConstant = mvm::jit::constantFour; - - AssessorInfo[LONG_ID].llvmType = Type::Int64Ty; - AssessorInfo[LONG_ID].llvmTypePtr = PointerType::getUnqual(Type::Int64Ty); - AssessorInfo[LONG_ID].llvmNullConstant = - Constant::getNullValue(Type::Int64Ty); - AssessorInfo[LONG_ID].sizeInBytesConstant = mvm::jit::constantEight; - - AssessorInfo[DOUBLE_ID].llvmType = Type::DoubleTy; - AssessorInfo[DOUBLE_ID].llvmTypePtr = PointerType::getUnqual(Type::DoubleTy); - AssessorInfo[DOUBLE_ID].llvmNullConstant = - Constant::getNullValue(Type::DoubleTy); - AssessorInfo[DOUBLE_ID].sizeInBytesConstant = mvm::jit::constantEight; - - AssessorInfo[ARRAY_ID].llvmType = JnjvmModule::JavaObjectType; - AssessorInfo[ARRAY_ID].llvmTypePtr = - PointerType::getUnqual(JnjvmModule::JavaObjectType); - AssessorInfo[ARRAY_ID].llvmNullConstant = - JnjvmModule::JavaObjectNullConstant; - AssessorInfo[ARRAY_ID].sizeInBytesConstant = mvm::jit::constantPtrSize; - - AssessorInfo[OBJECT_ID].llvmType = JnjvmModule::JavaObjectType; - AssessorInfo[OBJECT_ID].llvmTypePtr = - PointerType::getUnqual(JnjvmModule::JavaObjectType); - AssessorInfo[OBJECT_ID].llvmNullConstant = - JnjvmModule::JavaObjectNullConstant; - AssessorInfo[OBJECT_ID].sizeInBytesConstant = mvm::jit::constantPtrSize; -} - -LLVMAssessorInfo LLVMAssessorInfo::AssessorInfo[NUM_ASSESSORS]; Removed: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=54732&view=auto ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (removed) @@ -1,382 +0,0 @@ -//===------- JnjvmModule.h - Definition of a Jnjvm module -----------------===// -// -// JnJVM -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef JNJVM_MODULE_H -#define JNJVM_MODULE_H - -#include - -#include "llvm/Constant.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Function.h" -#include "llvm/GlobalVariable.h" -#include "llvm/Module.h" -#include "llvm/Type.h" -#include "llvm/Value.h" - -#include "mvm/JIT.h" - -#include "JavaClass.h" -#include "JavaTypes.h" - -namespace jnjvm { - -class CommonClass; -class Class; -class JavaField; -class JavaMethod; -class JavaObject; -class JavaJIT; -class JnjvmModule; -class Signdef; - -class LLVMAssessorInfo { -public: - const llvm::Type* llvmType; - const llvm::Type* llvmTypePtr; - llvm::Constant* llvmNullConstant; - llvm::ConstantInt* sizeInBytesConstant; - - static void initialise(); - static LLVMAssessorInfo AssessorInfo[]; - -}; - - -class LLVMCommonClassInfo : public mvm::JITInfo { - - friend class JnjvmModule; - -protected: - CommonClass* classDef; - -private: - /// varGV - The LLVM global variable representing this class. - /// - llvm::GlobalVariable* varGV; - -#ifndef MULTIPLE_VM - /// delegateeGV - The LLVM global variable representing the - /// java/lang/Class instance of this class. - llvm::GlobalVariable* delegateeGV; -#endif - - -public: - llvm::Value* getVar(JavaJIT* jit); - llvm::Value* getDelegatee(JavaJIT* jit); - - LLVMCommonClassInfo(CommonClass* cl) : - classDef(cl), - varGV(0) -#ifndef MULTIPLE_VM - ,delegateeGV(0) -#endif - {} -}; - -class LLVMClassInfo : public LLVMCommonClassInfo { - friend class JnjvmModule; -private: - /// virtualSizeLLVM - The LLVM constant size of instances of this class. - /// - llvm::ConstantInt* virtualSizeConstant; - llvm::GlobalVariable* staticVarGV; - llvm::GlobalVariable* virtualTableGV; - llvm::Function* virtualTracerFunction; - llvm::Function* staticTracerFunction; - /// virtualType - The LLVM type of instance of this class. - /// - const llvm::Type * virtualType; - - /// staticType - The LLVM type of the static instance of this class. - /// - const llvm::Type * staticType; -public: - - llvm::Value* getStaticVar(JavaJIT* jit); - llvm::Value* getVirtualTable(JavaJIT* jit); - llvm::Value* getVirtualSize(JavaJIT* jit); - llvm::Function* getStaticTracer(); - llvm::Function* getVirtualTracer(); - const llvm::Type* getVirtualType(); - const llvm::Type* getStaticType(); - - LLVMClassInfo(CommonClass* cl) : - LLVMCommonClassInfo(cl), - virtualSizeConstant(0), - staticVarGV(0), - virtualTableGV(0), - virtualTracerFunction(0), - staticTracerFunction(0), - virtualType(0), - staticType(0) {} -}; - -class LLVMMethodInfo : public mvm::JITInfo { -private: - JavaMethod* methodDef; - - llvm::Function* methodFunction; - llvm::ConstantInt* offsetConstant; - const llvm::FunctionType* functionType; - -public: - llvm::Function* getMethod(); - llvm::ConstantInt* getOffset(); - const llvm::FunctionType* getFunctionType(); - - LLVMMethodInfo(JavaMethod* M) : - methodDef(M), - methodFunction(0), - offsetConstant(0), - functionType(0) {} -}; - -class LLVMFieldInfo : public mvm::JITInfo { -private: - JavaField* fieldDef; - - llvm::ConstantInt* offsetConstant; - -public: - llvm::ConstantInt* getOffset(); - - LLVMFieldInfo(JavaField* F) : - fieldDef(F), - offsetConstant(0) {} -}; - -class LLVMSignatureInfo : public mvm::JITInfo { -private: - const llvm::FunctionType* staticType; - const llvm::FunctionType* virtualType; - const llvm::FunctionType* nativeType; - - const llvm::FunctionType* virtualBufType; - const llvm::FunctionType* staticBufType; - - const llvm::PointerType* staticPtrType; - const llvm::PointerType* virtualPtrType; - const llvm::PointerType* nativePtrType; - - llvm::Function* virtualBufFunction; - llvm::Function* virtualAPFunction; - llvm::Function* staticBufFunction; - llvm::Function* staticAPFunction; - - Signdef* signature; - - llvm::Function* createFunctionCallBuf(bool virt); - llvm::Function* createFunctionCallAP(bool virt); - - - -public: - const llvm::FunctionType* getVirtualType(); - const llvm::FunctionType* getStaticType(); - const llvm::FunctionType* getNativeType(); - - const llvm::FunctionType* getVirtualBufType(); - const llvm::FunctionType* getStaticBufType(); - - const llvm::PointerType* getStaticPtrType(); - const llvm::PointerType* getNativePtrType(); - const llvm::PointerType* getVirtualPtrType(); - - llvm::Function* getVirtualBuf(); - llvm::Function* getVirtualAP(); - llvm::Function* getStaticBuf(); - llvm::Function* getStaticAP(); - - LLVMSignatureInfo(Signdef* sign) : - staticType(0), - virtualType(0), - nativeType(0), - virtualBufType(0), - staticBufType(0), - staticPtrType(0), - virtualPtrType(0), - nativePtrType(0), - virtualBufFunction(0), - virtualAPFunction(0), - staticBufFunction(0), - staticAPFunction(0), - signature(sign) {} - -}; - -#ifdef SERVICE_VM -class LLVMServiceInfo : public mvm::JITInfo { -private: - ServiceDomain* vm; - llvm::GlobalVariable* delegateeGV; - -public: - llvm::Value* getDelegatee(JavaJIT* jit); -}; -#endif - -class JnjvmModule : public llvm::Module { - friend class LLVMClassInfo; -private: - - static VirtualTable* makeVT(Class* cl, bool stat); - static VirtualTable* allocateVT(Class* cl, CommonClass::method_iterator meths); - - -public: - - static llvm::ConstantInt* JavaArraySizeOffsetConstant; - static llvm::ConstantInt* JavaArrayElementsOffsetConstant; - static llvm::ConstantInt* JavaObjectLockOffsetConstant; - static llvm::ConstantInt* JavaObjectClassOffsetConstant; - - static const llvm::Type* JavaArrayUInt8Type; - static const llvm::Type* JavaArraySInt8Type; - static const llvm::Type* JavaArrayUInt16Type; - static const llvm::Type* JavaArraySInt16Type; - static const llvm::Type* JavaArrayUInt32Type; - static const llvm::Type* JavaArraySInt32Type; - static const llvm::Type* JavaArrayLongType; - static const llvm::Type* JavaArrayFloatType; - static const llvm::Type* JavaArrayDoubleType; - static const llvm::Type* JavaArrayObjectType; - - static const llvm::Type* VTType; - static const llvm::Type* JavaObjectType; - static const llvm::Type* JavaArrayType; - static const llvm::Type* JavaClassType; - static const llvm::Type* JavaCacheType; - static const llvm::Type* EnveloppeType; - static const llvm::Type* CacheNodeType; - -#ifdef WITH_TRACER - static llvm::Function* MarkAndTraceFunction; - static const llvm::FunctionType* MarkAndTraceType; - static llvm::Function* JavaObjectTracerFunction; -#endif - - static llvm::Function* GetSJLJBufferFunction; - static llvm::Function* InterfaceLookupFunction; - static llvm::Function* FieldLookupFunction; - static llvm::Function* PrintExecutionFunction; - static llvm::Function* PrintMethodStartFunction; - static llvm::Function* PrintMethodEndFunction; - static llvm::Function* JniProceedPendingExceptionFunction; - static llvm::Function* InitialisationCheckFunction; - static llvm::Function* ForceInitialisationCheckFunction; - static llvm::Function* ClassLookupFunction; -#ifndef WITHOUT_VTABLE - static llvm::Function* VirtualLookupFunction; -#endif - static llvm::Function* InstanceOfFunction; - static llvm::Function* IsAssignableFromFunction; - static llvm::Function* ImplementsFunction; - static llvm::Function* InstantiationOfArrayFunction; - static llvm::Function* GetDepthFunction; - static llvm::Function* GetClassInDisplayFunction; - static llvm::Function* GetDisplayFunction; - static llvm::Function* AquireObjectFunction; - static llvm::Function* ReleaseObjectFunction; -#ifdef SERVICE_VM - static llvm::Function* AquireObjectInSharedDomainFunction; - static llvm::Function* ReleaseObjectInSharedDomainFunction; - static llvm::Function* ServiceCallStartFunction; - static llvm::Function* ServiceCallStopFunction; -#endif - static llvm::Function* MultiCallNewFunction; - static llvm::Function* RuntimeUTF8ToStrFunction; - static llvm::Function* GetStaticInstanceFunction; - static llvm::Function* GetClassDelegateeFunction; - static llvm::Function* ArrayLengthFunction; - static llvm::Function* GetVTFunction; - static llvm::Function* GetClassFunction; - static llvm::Function* JavaObjectAllocateFunction; -#ifdef MULTIPLE_GC - static llvm::Function* GetCollectorFunction; -#endif - static llvm::Function* GetVTFromClassFunction; - static llvm::Function* GetObjectSizeFromClassFunction; - - static llvm::Function* GetLockFunction; - static llvm::Function* GetThreadIDFunction; - static llvm::Function* OverflowThinLockFunction; - - static llvm::ConstantInt* OffsetObjectSizeInClassConstant; - static llvm::ConstantInt* OffsetVTInClassConstant; - static llvm::ConstantInt* OffsetDepthInClassConstant; - static llvm::ConstantInt* OffsetDisplayInClassConstant; - - static llvm::Constant* JavaClassNullConstant; - - static llvm::Constant* JavaObjectNullConstant; - static llvm::Constant* UTF8NullConstant; - static llvm::Constant* MaxArraySizeConstant; - static llvm::Constant* JavaObjectSizeConstant; - - static llvm::GlobalVariable* ArrayObjectVirtualTableGV; - static llvm::GlobalVariable* JavaObjectVirtualTableGV; - - static llvm::Function* GetExceptionFunction; - static llvm::Function* GetJavaExceptionFunction; - static llvm::Function* ThrowExceptionFunction; - static llvm::Function* ClearExceptionFunction; - static llvm::Function* CompareExceptionFunction; - static llvm::Function* NullPointerExceptionFunction; - static llvm::Function* IndexOutOfBoundsExceptionFunction; - static llvm::Function* ClassCastExceptionFunction; - static llvm::Function* OutOfMemoryErrorFunction; - static llvm::Function* NegativeArraySizeExceptionFunction; - - static void InitField(JavaField* field); - static void InitField(JavaField* field, JavaObject* obj, uint64 val = 0); - static void InitField(JavaField* field, JavaObject* obj, JavaObject* val); - static void InitField(JavaField* field, JavaObject* obj, double val); - static void InitField(JavaField* field, JavaObject* obj, float val); - - - 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(); - } - - static LLVMCommonClassInfo* getClassInfo(CommonClass* cl) { - if (cl->isArray || cl->isPrimitive) { - return cl->getInfo(); - } else { - return cl->getInfo(); - } - } - - static LLVMFieldInfo* getFieldInfo(JavaField* field) { - return field->getInfo(); - } - - static LLVMMethodInfo* getMethodInfo(JavaMethod* method) { - return method->getInfo(); - } - -#ifdef SERVICE_VM - static LLVMServiceInfo* getServiceInfo(ServiceDomain* service) { - return service->getInfo(); - } -#endif - - explicit JnjvmModule(const std::string &ModuleID); - void initialise(); -}; - -} - -#endif From nicolas.geoffray at lip6.fr Wed Aug 13 07:11:33 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 13 Aug 2008 14:11:33 -0000 Subject: [vmkit-commits] [vmkit] r54734 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaConstantPool.cpp JavaIsolate.cpp JavaJIT.cpp JavaJIT.h JavaJITOpcodes.cpp JavaMetaJIT.cpp JavaRuntime.h JavaRuntimeJIT.cpp JavaTypes.cpp JavaUpcalls.cpp Jnjvm.cpp Jnjvm.h JnjvmModuleProvider.cpp JnjvmModuleProvider.h LowerConstantCalls.cpp Message-ID: <200808131411.m7DEBZ7c031668@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 13 09:11:28 2008 New Revision: 54734 URL: http://llvm.org/viewvc/llvm-project?rev=54734&view=rev Log: Revert back to r54731. The jnjvm module may not be a bad idea for a clean use of LLVM. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.h vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=54734&r1=54733&r2=54734&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Wed Aug 13 09:11:28 2008 @@ -508,25 +508,25 @@ Attribut* attribut = lookupAttribut(Attribut::constantAttribut); if (!attribut) { - JavaRuntime::InitField(this, obj); + JnjvmModule::InitField(this, obj); } else { Reader reader(attribut, classDef->bytes); JavaCtpInfo * ctpInfo = classDef->ctpInfo; uint16 idx = reader.readU2(); if (funcs == AssessorDesc::dLong) { - JavaRuntime::InitField(this, obj, (uint64)ctpInfo->LongAt(idx)); + JnjvmModule::InitField(this, obj, (uint64)ctpInfo->LongAt(idx)); } else if (funcs == AssessorDesc::dDouble) { - JavaRuntime::InitField(this, obj, ctpInfo->DoubleAt(idx)); + JnjvmModule::InitField(this, obj, ctpInfo->DoubleAt(idx)); } else if (funcs == AssessorDesc::dFloat) { - JavaRuntime::InitField(this, obj, ctpInfo->FloatAt(idx)); + JnjvmModule::InitField(this, obj, ctpInfo->FloatAt(idx)); } else if (funcs == AssessorDesc::dRef) { const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[idx]); - JavaRuntime::InitField(this, obj, + JnjvmModule::InitField(this, obj, (JavaObject*)ctpInfo->resolveString(utf8, idx)); } else if (funcs == AssessorDesc::dInt || funcs == AssessorDesc::dChar || funcs == AssessorDesc::dShort || funcs == AssessorDesc::dByte || funcs == AssessorDesc::dBool) { - JavaRuntime::InitField(this, obj, (uint64)ctpInfo->IntegerAt(idx)); + JnjvmModule::InitField(this, obj, (uint64)ctpInfo->IntegerAt(idx)); } else { JavaThread::get()->isolate-> unknownError("unknown constant %c", funcs->byteId); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=54734&r1=54733&r2=54734&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Wed Aug 13 09:11:28 2008 @@ -419,7 +419,8 @@ cl->lookupMethodDontThrow(utf8, sign->keyName, isStatic(access), false); if (meth) { // don't throw if no meth, the exception will be thrown just in time - void* F = JavaRuntime::getMethod(meth); + JnjvmModule* M = classDef->isolate->TheModule; + void* F = M->getMethod(meth); ctpRes[index] = (void*)F; return F; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp?rev=54734&r1=54733&r2=54734&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp Wed Aug 13 09:11:28 2008 @@ -449,11 +449,8 @@ isolate->analyseClasspathEnv(isolate->bootClasspathEnv); - llvm::Module* mod = new llvm::Module("Isolate JnJVM"); - std::string str = - mvm::jit::executionEngine->getTargetData()->getStringRepresentation(); - mod->setDataLayout(str); - isolate->TheModuleProvider = new JnjvmModuleProvider(mod); + isolate->TheModule = new JnjvmModule("Isolate JnJVM"); + isolate->TheModuleProvider = new JnjvmModuleProvider(isolate->TheModule); isolate->bootstrapThread = vm_new(isolate, JavaThread)(); isolate->bootstrapThread->initialise(0, isolate); @@ -512,12 +509,9 @@ isolate->analyseClasspathEnv(isolate->bootClasspathEnv); - Module* Mod = new llvm::Module("Bootstrap JnJVM"); - std::string str = - mvm::jit::executionEngine->getTargetData()->getStringRepresentation(); - Mod->setDataLayout(str); - JavaRuntime::initialise(Mod); - isolate->TheModuleProvider = new JnjvmModuleProvider(Mod); + isolate->TheModule = new JnjvmModule("Bootstrap JnJVM"); + isolate->TheModule->initialise(); + isolate->TheModuleProvider = new JnjvmModuleProvider(isolate->TheModule); isolate->bootstrapThread = vm_new(isolate, JavaThread)(); isolate->bootstrapThread->initialise(0, isolate); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=54734&r1=54733&r2=54734&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Wed Aug 13 09:11:28 2008 @@ -38,6 +38,7 @@ #include "JavaTypes.h" #include "JavaUpcalls.h" #include "Jnjvm.h" +#include "JnjvmModuleProvider.h" #include "NativeUtil.h" #include "Reader.h" #include "Zip.h" @@ -65,18 +66,18 @@ Constant* zero = mvm::jit::constantZero; Signdef* signature = ctpInfo->infoOfInterfaceOrVirtualMethod(index); std::vector args; // size = [signature->nbIn + 3]; - LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(signature); + LLVMSignatureInfo* LSI = module->getSignatureInfo(signature); const llvm::FunctionType* virtualType = LSI->getVirtualType(); FunctionType::param_iterator it = virtualType->param_end(); makeArgs(it, index, args, signature->args.size() + 1); JITVerifyNull(args[0]); - Value* VT = CallInst::Create(JavaRuntime::GetVTFunction, args[0], "", + Value* VT = CallInst::Create(JnjvmModule::GetVTFunction, args[0], "", currentBlock); std::vector indexes2; //[3]; if (meth) { - LLVMMethodInfo* LMI = JavaRuntime::getMethodInfo(meth); + LLVMMethodInfo* LMI = module->getMethodInfo(meth); indexes2.push_back(LMI->getOffset()); } else { GlobalVariable* gv = @@ -100,12 +101,12 @@ std::vector Args; Args.push_back(args[0]); LLVMClassInfo* LCI = - (LLVMClassInfo*)JavaRuntime::getClassInfo(compilingClass); + (LLVMClassInfo*)module->getClassInfo(compilingClass); Args.push_back(LCI->getVar(this)); Constant* CI = ConstantInt::get(Type::Int32Ty, index); Args.push_back(CI); Args.push_back(gv); - val = invoke(JavaRuntime::VirtualLookupFunction, Args, "", currentBlock); + val = invoke(JnjvmModule::VirtualLookupFunction, Args, "", currentBlock); node->addIncoming(val, currentBlock); llvm::BranchInst::Create(endBlock, currentBlock); @@ -175,7 +176,7 @@ } else { JavaObject* loader = compilingClass->classLoader; ServiceDomain* vm = ServiceDomain::getDomainFromLoader(loader); - LLVMServiceInfo* LSI = JavaRuntime::getServiceInfo(vm); + LLVMServiceInfo* LSI = module->getServiceInfo(vm); isolateLocal = LSI->getDelegatee(this); Value* cmp = new ICmpInst(ICmpInst::ICMP_NE, lastArg, isolateLocal, "", currentBlock); @@ -186,7 +187,7 @@ std::vector Args; Args.push_back(lastArg); Args.push_back(isolateLocal); - CallInst::Create(JavaRuntime::ServiceCallStartFunction, Args.begin(), + CallInst::Create(JnjvmModule::ServiceCallStartFunction, Args.begin(), Args.end(), "", currentBlock); BranchInst::Create(endBlock, currentBlock); currentBlock = endBlock; @@ -197,7 +198,7 @@ if (funcType->getReturnType() != Type::VoidTy) endNode = llvm::PHINode::Create(funcType->getReturnType(), "", endBlock); - Value* buf = llvm::CallInst::Create(JavaRuntime::GetSJLJBufferFunction, + Value* buf = llvm::CallInst::Create(JnjvmModule::GetSJLJBufferFunction, "", currentBlock); Value* test = llvm::CallInst::Create(mvm::jit::setjmpLLVM, buf, "", currentBlock); @@ -228,7 +229,7 @@ uint32 index = 0; if (stat) { LLVMClassInfo* LCI = - (LLVMClassInfo*)JavaRuntime::getClassInfo(compilingClass); + (LLVMClassInfo*)module->getClassInfo(compilingClass); nativeArgs.push_back(LCI->getDelegatee(this)); index = 2; } else { @@ -242,7 +243,7 @@ LLVMSignatureInfo* LSI = - JavaRuntime::getSignatureInfo(compilingMethod->getSignature()); + module->getSignatureInfo(compilingMethod->getSignature()); const llvm::Type* valPtrType = LSI->getNativePtrType(); Value* valPtr = ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, (uint64)natPtr), @@ -259,7 +260,7 @@ if (isSynchro(compilingMethod->access)) endSynchronize(); - llvm::CallInst::Create(JavaRuntime::JniProceedPendingExceptionFunction, "", + llvm::CallInst::Create(JnjvmModule::JniProceedPendingExceptionFunction, "", currentBlock); if (funcType->getReturnType() != Type::VoidTy) @@ -278,10 +279,10 @@ void JavaJIT::monitorEnter(Value* obj) { std::vector gep; gep.push_back(mvm::jit::constantZero); - gep.push_back(JavaRuntime::JavaObjectLockOffsetConstant); + gep.push_back(JnjvmModule::JavaObjectLockOffsetConstant); Value* lockPtr = GetElementPtrInst::Create(obj, gep.begin(), gep.end(), "", currentBlock); - Value* threadId = CallInst::Create(JavaRuntime::GetThreadIDFunction, "", + Value* threadId = CallInst::Create(JnjvmModule::GetThreadIDFunction, "", currentBlock); std::vector atomicArgs; atomicArgs.push_back(lockPtr); @@ -347,14 +348,14 @@ // The counter will overflow, call this function to create a new lock, // lock it 0x101 times, and pass. - CallInst::Create(JavaRuntime::OverflowThinLockFunction, obj, "", + CallInst::Create(JnjvmModule::OverflowThinLockFunction, obj, "", currentBlock); BranchInst::Create(OK, currentBlock); currentBlock = FatLockBB; // Either it's a fat lock or there is contention. - CallInst::Create(JavaRuntime::AquireObjectFunction, obj, "", currentBlock); + CallInst::Create(JnjvmModule::AquireObjectFunction, obj, "", currentBlock); BranchInst::Create(OK, currentBlock); currentBlock = OK; } @@ -362,11 +363,11 @@ void JavaJIT::monitorExit(Value* obj) { std::vector gep; gep.push_back(mvm::jit::constantZero); - gep.push_back(JavaRuntime::JavaObjectLockOffsetConstant); + gep.push_back(JnjvmModule::JavaObjectLockOffsetConstant); Value* lockPtr = GetElementPtrInst::Create(obj, gep.begin(), gep.end(), "", currentBlock); Value* lock = new LoadInst(lockPtr, "", currentBlock); - Value* threadId = CallInst::Create(JavaRuntime::GetThreadIDFunction, "", + Value* threadId = CallInst::Create(JnjvmModule::GetThreadIDFunction, "", currentBlock); Value* cmp = new ICmpInst(ICmpInst::ICMP_EQ, lock, threadId, "", @@ -408,7 +409,7 @@ currentBlock = FatLockBB; // Either it's a fat lock or there is contention. - CallInst::Create(JavaRuntime::ReleaseObjectFunction, obj, "", currentBlock); + CallInst::Create(JnjvmModule::ReleaseObjectFunction, obj, "", currentBlock); BranchInst::Create(EndUnlock, currentBlock); currentBlock = EndUnlock; } @@ -419,17 +420,17 @@ obj = llvmFunction->arg_begin(); } else { LLVMClassInfo* LCI = - (LLVMClassInfo*)JavaRuntime::getClassInfo(compilingClass); + (LLVMClassInfo*)module->getClassInfo(compilingClass); obj = LCI->getStaticVar(this); } #ifndef SERVICE_VM monitorEnter(obj); #else if (ServiceDomain::isLockableDomain(compilingClass->isolate)) { - llvm::CallInst::Create(JavaRuntime::AquireObjectInSharedDomainFunction, + llvm::CallInst::Create(JnjvmModule::AquireObjectInSharedDomainFunction, obj, "", currentBlock); } else { - llvm::CallInst::Create(JavaRuntime::AquireObjectFunction, + llvm::CallInst::Create(JnjvmModule::AquireObjectFunction, obj, "", currentBlock); } #endif @@ -441,17 +442,17 @@ obj = llvmFunction->arg_begin(); } else { LLVMClassInfo* LCI = - (LLVMClassInfo*)JavaRuntime::getClassInfo(compilingClass); + (LLVMClassInfo*)module->getClassInfo(compilingClass); obj = LCI->getStaticVar(this); } #ifndef SERVICE_VM monitorExit(obj); #else if (ServiceDomain::isLockableDomain(compilingClass->isolate)) { - llvm::CallInst::Create(JavaRuntime::ReleaseObjectInSharedDomainFunction, + llvm::CallInst::Create(JnjvmModule::ReleaseObjectInSharedDomainFunction, argsSync.begin(), argsSync.end(), "", currentBlock); } else { - llvm::CallInst::Create(JavaRuntime::ReleaseObjectFunction, argsSync.begin(), + llvm::CallInst::Create(JnjvmModule::ReleaseObjectFunction, argsSync.begin(), argsSync.end(), "", currentBlock); } #endif @@ -482,7 +483,7 @@ reader.seek(codeLen, Reader::SeekCur); - LLVMMethodInfo* LMI = JavaRuntime::getMethodInfo(compilingMethod); + LLVMMethodInfo* LMI = module->getMethodInfo(compilingMethod); assert(LMI); Function* func = LMI->getMethod(); llvmFunction = parentFunction; @@ -506,7 +507,7 @@ doubleLocals.push_back(new AllocaInst(Type::DoubleTy, "", currentBlock)); longLocals.push_back(new AllocaInst(Type::Int64Ty, "", currentBlock)); floatLocals.push_back(new AllocaInst(Type::FloatTy, "", currentBlock)); - objectLocals.push_back(new AllocaInst(JavaRuntime::JavaObjectType, "", + objectLocals.push_back(new AllocaInst(JnjvmModule::JavaObjectType, "", currentBlock)); } @@ -562,7 +563,7 @@ } else { JavaObject* loader = compilingClass->classLoader; ServiceDomain* vm = ServiceDomain::getDomainFromLoader(loader); - LLVMServiceInfo* LSI = JavaRuntime::getServiceInfo(vm); + LLVMServiceInfo* LSI = module->getServiceInfo(vm); isolateLocal = LSI->getDelegatee(this); Value* cmp = new ICmpInst(ICmpInst::ICMP_NE, args[args.size() - 1], isolateLocal, "", currentBlock); @@ -573,7 +574,7 @@ std::vector Args; Args.push_back(args[args.size()- 1]); Args.push_back(isolateLocal); - CallInst::Create(JavaRuntime::ServiceCallStartFunction, Args.begin(), + CallInst::Create(JnjvmModule::ServiceCallStartFunction, Args.begin(), Args.end(), "", currentBlock); BranchInst::Create(endBlock, currentBlock); currentBlock = endBlock; @@ -604,7 +605,7 @@ std::vector Args; Args.push_back(args[args.size() - 1]); Args.push_back(isolateLocal); - CallInst::Create(JavaRuntime::ServiceCallStopFunction, Args.begin(), + CallInst::Create(JnjvmModule::ServiceCallStopFunction, Args.begin(), Args.end(), "", currentBlock); BranchInst::Create(newEndBlock, currentBlock); currentBlock = newEndBlock; @@ -658,7 +659,7 @@ { std::vector args; args.push_back(ConstantInt::get(Type::Int32Ty, (int64_t)compilingMethod)); - llvm::CallInst::Create(JavaRuntime::PrintMethodStartFunction, args.begin(), + llvm::CallInst::Create(JnjvmModule::PrintMethodStartFunction, args.begin(), args.end(), "", currentBlock); } #endif @@ -670,7 +671,7 @@ doubleLocals.push_back(new AllocaInst(Type::DoubleTy, "", currentBlock)); longLocals.push_back(new AllocaInst(Type::Int64Ty, "", currentBlock)); floatLocals.push_back(new AllocaInst(Type::FloatTy, "", currentBlock)); - objectLocals.push_back(new AllocaInst(JavaRuntime::JavaObjectType, "", + objectLocals.push_back(new AllocaInst(JnjvmModule::JavaObjectType, "", currentBlock)); } @@ -725,7 +726,7 @@ } else { JavaObject* loader = compilingClass->classLoader; ServiceDomain* vm = ServiceDomain::getDomainFromLoader(loader); - LLVMServiceInfo* LSI = JavaRuntime::getServiceInfo(vm); + LLVMServiceInfo* LSI = module->getServiceInfo(vm); isolateLocal = LSI->getDelegatee(this); Value* cmp = new ICmpInst(ICmpInst::ICMP_NE, i, isolateLocal, "", currentBlock); @@ -736,7 +737,7 @@ std::vector Args; Args.push_back(i); Args.push_back(isolateLocal); - CallInst::Create(JavaRuntime::ServiceCallStartFunction, Args.begin(), + CallInst::Create(JnjvmModule::ServiceCallStartFunction, Args.begin(), Args.end(), "", currentBlock); BranchInst::Create(endBlock, currentBlock); currentBlock = endBlock; @@ -782,7 +783,7 @@ { std::vector args; args.push_back(ConstantInt::get(Type::Int32Ty, (int64_t)compilingMethod)); - llvm::CallInst::Create(JavaRuntime::PrintMethodEndFunction, args.begin(), + llvm::CallInst::Create(JnjvmModule::PrintMethodEndFunction, args.begin(), args.end(), "", currentBlock); } #endif @@ -798,7 +799,7 @@ std::vector Args; Args.push_back(i); Args.push_back(isolateLocal); - CallInst::Create(JavaRuntime::ServiceCallStopFunction, Args.begin(), + CallInst::Create(JnjvmModule::ServiceCallStopFunction, Args.begin(), Args.end(), "", currentBlock); BranchInst::Create(newEndBlock, currentBlock); currentBlock = newEndBlock; @@ -815,7 +816,7 @@ if (PI == PE) { endExceptionBlock->eraseFromParent(); } else { - CallInst* ptr_eh_ptr = CallInst::Create(JavaRuntime::GetExceptionFunction, + CallInst* ptr_eh_ptr = CallInst::Create(JnjvmModule::GetExceptionFunction, "eh_ptr", endExceptionBlock); llvm::CallInst::Create(mvm::jit::unwindResume, ptr_eh_ptr, "", endExceptionBlock); @@ -850,7 +851,7 @@ nbe += sync; JavaCtpInfo* ctpInfo = compilingClass->ctpInfo; if (nbe) { - supplLocal = new AllocaInst(JavaRuntime::JavaObjectType, "exceptionVar", + supplLocal = new AllocaInst(JnjvmModule::JavaObjectType, "exceptionVar", currentBlock); } @@ -868,11 +869,11 @@ if (isVirtual(compilingMethod->access)) { argsSync.push_back(llvmFunction->arg_begin()); } else { - LLVMClassInfo* LCI = (LLVMClassInfo*)JavaRuntime::getClassInfo(compilingClass); + LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); Value* arg = LCI->getStaticVar(this); argsSync.push_back(arg); } - llvm::CallInst::Create(JavaRuntime::ReleaseObjectFunction, argsSync.begin(), argsSync.end(), + llvm::CallInst::Create(JnjvmModule::ReleaseObjectFunction, argsSync.begin(), argsSync.end(), "", synchronizeExceptionBlock); llvm::BranchInst::Create(endExceptionBlock, synchronizeExceptionBlock); @@ -1026,9 +1027,9 @@ Value* cl = 0; currentBlock = cur->realTest; assert(cur->catchClass); - LLVMClassInfo* LCI = (LLVMClassInfo*)JavaRuntime::getClassInfo(cur->catchClass); + LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(cur->catchClass); cl = LCI->getVar(this); - Value* cmp = llvm::CallInst::Create(JavaRuntime::CompareExceptionFunction, cl, "", + Value* cmp = llvm::CallInst::Create(JnjvmModule::CompareExceptionFunction, cl, "", currentBlock); llvm::BranchInst::Create(cur->handler, bbNext, cmp, currentBlock); if (nodeNext) @@ -1038,9 +1039,9 @@ cur->handlerPHI = llvm::PHINode::Create(mvm::jit::ptrType, "", cur->handler); cur->handlerPHI->addIncoming(cur->exceptionPHI, currentBlock); - Value* exc = llvm::CallInst::Create(JavaRuntime::GetJavaExceptionFunction, + Value* exc = llvm::CallInst::Create(JnjvmModule::GetJavaExceptionFunction, "", cur->handler); - llvm::CallInst::Create(JavaRuntime::ClearExceptionFunction, "", + llvm::CallInst::Create(JnjvmModule::ClearExceptionFunction, "", cur->handler); llvm::CallInst::Create(mvm::jit::exceptionBeginCatch, cur->handlerPHI, "tmp8", cur->handler); @@ -1097,16 +1098,16 @@ #ifndef MULTIPLE_VM val = compilingClass->isolate->UTF8ToStr(utf8); gv = - new GlobalVariable(JavaRuntime::JavaObjectType, false, + new GlobalVariable(JnjvmModule::JavaObjectType, false, GlobalValue::ExternalLinkage, - JavaRuntime::JavaObjectNullConstant, "", + JnjvmModule::JavaObjectNullConstant, "", module); #else val = (void*)utf8; gv = - new GlobalVariable(JavaRuntime::JavaArrayUInt16Type, false, + new GlobalVariable(JnjvmModule::JavaArrayUInt16Type, false, GlobalValue::ExternalLinkage, - JavaRuntime::UTF8NullConstant, "", + JnjvmModule::UTF8NullConstant, "", module); #endif @@ -1115,7 +1116,7 @@ GenericValue Val = GenericValue(val); llvm::GenericValue * Ptr = (llvm::GenericValue*)ptr; mvm::jit::executionEngine->StoreValueToMemory(Val, Ptr, - JavaRuntime::JavaObjectType); + JnjvmModule::JavaObjectType); toPush = new LoadInst(gv, "", currentBlock); ctpInfo->ctpRes[index] = gv; compilingClass->release(); @@ -1129,7 +1130,7 @@ currentBlock); } #ifdef MULTIPLE_VM - CallInst* C = llvm::CallInst::Create(JavaRuntime::RuntimeUTF8ToStrFunction, + CallInst* C = llvm::CallInst::Create(JnjvmModule::RuntimeUTF8ToStrFunction, toPush, "", currentBlock); push(C, AssessorDesc::dRef); #else @@ -1150,11 +1151,11 @@ } else if (type == JavaCtpInfo::ConstantClass) { if (ctpInfo->ctpRes[index]) { CommonClass* cl = (CommonClass*)(ctpInfo->ctpRes[index]); - LLVMCommonClassInfo* LCI = JavaRuntime::getClassInfo(cl); + LLVMCommonClassInfo* LCI = module->getClassInfo(cl); push(LCI->getDelegatee(this), AssessorDesc::dRef); } else { Value* val = getResolvedClass(index, false); - Value* res = CallInst::Create(JavaRuntime::GetClassDelegateeFunction, val, "", + Value* res = CallInst::Create(JnjvmModule::GetClassDelegateeFunction, val, "", currentBlock); push(res, AssessorDesc::dRef); } @@ -1166,7 +1167,7 @@ void JavaJIT::JITVerifyNull(Value* obj) { JavaJIT* jit = this; - Constant* zero = JavaRuntime::JavaObjectNullConstant; + Constant* zero = JnjvmModule::JavaObjectNullConstant; Value* test = new ICmpInst(ICmpInst::ICMP_EQ, obj, zero, "", jit->currentBlock); @@ -1176,12 +1177,12 @@ llvm::BranchInst::Create(exit, cont, test, jit->currentBlock); std::vector args; if (currentExceptionBlock != endExceptionBlock) { - llvm::InvokeInst::Create(JavaRuntime::NullPointerExceptionFunction, + llvm::InvokeInst::Create(JnjvmModule::NullPointerExceptionFunction, unifiedUnreachable, currentExceptionBlock, args.begin(), args.end(), "", exit); } else { - llvm::CallInst::Create(JavaRuntime::NullPointerExceptionFunction, + llvm::CallInst::Create(JnjvmModule::NullPointerExceptionFunction, args.begin(), args.end(), "", exit); new UnreachableInst(exit); } @@ -1214,12 +1215,12 @@ args.push_back(obj); args.push_back(index); if (currentExceptionBlock != endExceptionBlock) { - llvm::InvokeInst::Create(JavaRuntime::IndexOutOfBoundsExceptionFunction, + llvm::InvokeInst::Create(JnjvmModule::IndexOutOfBoundsExceptionFunction, unifiedUnreachable, currentExceptionBlock, args.begin(), args.end(), "", ifFalse); } else { - llvm::CallInst::Create(JavaRuntime::IndexOutOfBoundsExceptionFunction, + llvm::CallInst::Create(JnjvmModule::IndexOutOfBoundsExceptionFunction, args.begin(), args.end(), "", ifFalse); new UnreachableInst(ifFalse); } @@ -1232,7 +1233,7 @@ std::vector indexes; //[3]; indexes.push_back(zero); - indexes.push_back(JavaRuntime::JavaArrayElementsOffsetConstant); + indexes.push_back(JnjvmModule::JavaArrayElementsOffsetConstant); indexes.push_back(index); Value* ptr = llvm::GetElementPtrInst::Create(val, indexes.begin(), indexes.end(), @@ -1491,7 +1492,7 @@ const UTF8* name = 0; const UTF8* cl = 0; ctpInfo->nameOfStaticOrSpecialMethod(index, cl, name, signature); - LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(signature); + LLVMSignatureInfo* LSI = module->getSignatureInfo(signature); const llvm::FunctionType* virtualType = LSI->getVirtualType(); llvm::Instruction* val = 0; @@ -1536,7 +1537,7 @@ const UTF8* name = 0; const UTF8* cl = 0; ctpInfo->nameOfStaticOrSpecialMethod(index, cl, name, signature); - LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(signature); + LLVMSignatureInfo* LSI = module->getSignatureInfo(signature); const llvm::FunctionType* staticType = LSI->getStaticType(); llvm::Instruction* val = 0; @@ -1559,11 +1560,11 @@ uint32 clIndex = ctpInfo->getClassIndexFromMethod(index); Class* mycl = (Class*)(ctpInfo->getMethodClassIfLoaded(clIndex)); if (mycl && mycl->status >= resolved) { - LLVMCommonClassInfo* LCI = JavaRuntime::getClassInfo(mycl); + LLVMCommonClassInfo* LCI = module->getClassInfo(mycl); Value* arg = LCI->getVar(this); - arg = invoke(JavaRuntime::InitialisationCheckFunction, arg, "", + arg = invoke(JnjvmModule::InitialisationCheckFunction, arg, "", currentBlock); - CallInst::Create(JavaRuntime::ForceInitialisationCheckFunction, arg, "", + CallInst::Create(JnjvmModule::ForceInitialisationCheckFunction, arg, "", currentBlock); } @@ -1589,20 +1590,20 @@ Value* JavaJIT::getResolvedClass(uint16 index, bool clinit) { GlobalVariable * gv = - new GlobalVariable(JavaRuntime::JavaClassType, false, + new GlobalVariable(JnjvmModule::JavaClassType, false, GlobalValue::ExternalLinkage, - JavaRuntime::JavaClassNullConstant, "", + JnjvmModule::JavaClassNullConstant, "", module); Value* arg1 = new LoadInst(gv, "", false, currentBlock); Value* test = new ICmpInst(ICmpInst::ICMP_EQ, arg1, - JavaRuntime::JavaClassNullConstant, "", + JnjvmModule::JavaClassNullConstant, "", currentBlock); BasicBlock* trueCl = createBasicBlock("Cl OK"); BasicBlock* falseCl = createBasicBlock("Cl Not OK"); - PHINode* node = llvm::PHINode::Create(JavaRuntime::JavaClassType, "", + PHINode* node = llvm::PHINode::Create(JnjvmModule::JavaClassType, "", trueCl); node->addIncoming(arg1, currentBlock); llvm::BranchInst::Create(falseCl, trueCl, test, currentBlock); @@ -1610,7 +1611,7 @@ currentBlock = falseCl; std::vector Args; - LLVMClassInfo* LCI = (LLVMClassInfo*)JavaRuntime::getClassInfo(compilingClass); + LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); Value* v = LCI->getVar(this); Args.push_back(v); ConstantInt* CI = ConstantInt::get(Type::Int32Ty, index); @@ -1621,7 +1622,7 @@ } else { Args.push_back(mvm::jit::constantZero); } - Value* res = invoke(JavaRuntime::ClassLookupFunction, Args, "", + Value* res = invoke(JnjvmModule::ClassLookupFunction, Args, "", currentBlock); node->addIncoming(res, currentBlock); @@ -1629,7 +1630,7 @@ currentBlock = trueCl; #ifdef MULTIPLE_VM if (clinit) - return invoke(JavaRuntime::InitialisationCheckFunction, node, "", + return invoke(JnjvmModule::InitialisationCheckFunction, node, "", currentBlock); else #endif @@ -1646,35 +1647,35 @@ Value* Cl = 0; if (!cl || !cl->isResolved()) { Cl = getResolvedClass(index, true); - Size = CallInst::Create(JavaRuntime::GetObjectSizeFromClassFunction, Cl, + Size = CallInst::Create(JnjvmModule::GetObjectSizeFromClassFunction, Cl, "", currentBlock); - VT = CallInst::Create(JavaRuntime::GetVTFromClassFunction, Cl, "", + VT = CallInst::Create(JnjvmModule::GetVTFromClassFunction, Cl, "", currentBlock); } else { - LLVMClassInfo* LCI = (LLVMClassInfo*)JavaRuntime::getClassInfo(cl); + LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(cl); Size = LCI->getVirtualSize(this); VT = LCI->getVirtualTable(this); Cl = LCI->getVar(this); #ifndef MULTIPLE_VM if (!cl->isReady()) #endif - Cl = invoke(JavaRuntime::InitialisationCheckFunction, Cl, "", currentBlock); + Cl = invoke(JnjvmModule::InitialisationCheckFunction, Cl, "", currentBlock); } std::vector args; args.push_back(Size); args.push_back(VT); #ifdef MULTIPLE_GC - args.push_back(CallInst::Create(JavaRuntime::GetCollectorFunction, + args.push_back(CallInst::Create(JnjvmModule::GetCollectorFunction, isolateLocal, "", currentBlock)); #endif - Value* val = invoke(JavaRuntime::JavaObjectAllocateFunction, args, "", + Value* val = invoke(JnjvmModule::JavaObjectAllocateFunction, args, "", currentBlock); // Set the class std::vector gep; gep.push_back(mvm::jit::constantZero); - gep.push_back(JavaRuntime::JavaObjectClassOffsetConstant); + gep.push_back(JnjvmModule::JavaObjectClassOffsetConstant); Value* GEP = GetElementPtrInst::Create(val, gep.begin(), gep.end(), "", currentBlock); new StoreInst(Cl, GEP, currentBlock); @@ -1684,7 +1685,7 @@ } Value* JavaJIT::arraySize(Value* val) { - return llvm::CallInst::Create(JavaRuntime::ArrayLengthFunction, val, "", + return llvm::CallInst::Create(JnjvmModule::ArrayLengthFunction, val, "", currentBlock); } @@ -1714,13 +1715,13 @@ && field->classDef->isReady() #endif ) { - LLVMClassInfo* LCI = (LLVMClassInfo*)JavaRuntime::getClassInfo(field->classDef); + LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(field->classDef); if (stat) { object = LCI->getStaticVar(this); } const Type* type = stat ? LCI->getStaticType() : LCI->getVirtualType(); - LLVMFieldInfo* LFI = JavaRuntime::getFieldInfo(field); + LLVMFieldInfo* LFI = module->getFieldInfo(field); return fieldGetter(this, type, object, LFI->getOffset()); } else { const Type* Pty = mvm::jit::arrayPtrType; @@ -1769,16 +1770,16 @@ if (object) { args.push_back(object); } else { - args.push_back(JavaRuntime::JavaObjectNullConstant); + args.push_back(JnjvmModule::JavaObjectNullConstant); } - LLVMClassInfo* LCI = (LLVMClassInfo*)JavaRuntime::getClassInfo(compilingClass); + LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); args.push_back(LCI->getVar(this)); Constant* CI = ConstantInt::get(Type::Int32Ty, index); args.push_back(CI); args.push_back(stat ? mvm::jit::constantOne : mvm::jit::constantZero); args.push_back(gvStaticInstance); args.push_back(gv); - Value* tmp = invoke(JavaRuntime::FieldLookupFunction, args, "", currentBlock); + Value* tmp = invoke(JnjvmModule::FieldLookupFunction, args, "", currentBlock); node->addIncoming(tmp, currentBlock); llvm::BranchInst::Create(endBlock, currentBlock); @@ -1961,7 +1962,7 @@ JavaCtpInfo* ctpInfo = compilingClass->ctpInfo; Signdef* signature = ctpInfo->infoOfInterfaceOrVirtualMethod(index); - LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(signature); + LLVMSignatureInfo* LSI = module->getSignatureInfo(signature); const llvm::FunctionType* virtualType = LSI->getVirtualType(); const llvm::PointerType* virtualPtrType = LSI->getVirtualPtrType(); @@ -1987,7 +1988,7 @@ Value* llvmEnv = ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64_t (enveloppe)), - JavaRuntime::EnveloppeType); + JnjvmModule::EnveloppeType); JITVerifyNull(args[0]); @@ -1999,7 +2000,7 @@ "", currentBlock); Value* cache = new LoadInst(cachePtr, "", currentBlock); - Value* cl = CallInst::Create(JavaRuntime::GetClassFunction, args[0], "", + Value* cl = CallInst::Create(JnjvmModule::GetClassFunction, args[0], "", currentBlock); std::vector args3; args3.push_back(zero); @@ -2016,7 +2017,7 @@ BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock); currentBlock = ifFalse; - Value* _meth = invoke(JavaRuntime::InterfaceLookupFunction, cache, args[0], + Value* _meth = invoke(JnjvmModule::InterfaceLookupFunction, cache, args[0], "", ifFalse); Value* meth = new BitCastInst(_meth, virtualPtrType, "", currentBlock); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h?rev=54734&r1=54733&r2=54734&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h Wed Aug 13 09:11:28 2008 @@ -17,7 +17,6 @@ #include "llvm/DerivedTypes.h" #include "llvm/Function.h" #include "llvm/Instructions.h" -#include "llvm/Module.h" #include "llvm/Value.h" #include "types.h" @@ -26,7 +25,7 @@ #include "mvm/PrintBuffer.h" #include "JavaTypes.h" -#include "JavaRuntime.h" +#include "JnjvmModule.h" namespace jnjvm { @@ -59,7 +58,7 @@ class JavaJIT { public: - llvm::Module* module; + JnjvmModule* module; static void invokeOnceVoid(Jnjvm* vm, JavaObject* loader, const char* className, Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp?rev=54734&r1=54733&r2=54734&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Wed Aug 13 09:11:28 2008 @@ -30,7 +30,6 @@ #include "JavaConstantPool.h" #include "JavaObject.h" #include "JavaJIT.h" -#include "JavaRuntime.h" #include "JavaThread.h" #include "JavaTypes.h" #include "Jnjvm.h" @@ -131,7 +130,7 @@ (int64_t)OpcodeNames[bytecodes[i]])); args.push_back(ConstantInt::get(Type::Int32Ty, (int64_t)i)); args.push_back(ConstantInt::get(Type::Int32Ty, (int64_t)compilingMethod)); - CallInst::Create(JavaRuntime::PrintExecutionFunction, args.begin(), + CallInst::Create(JnjvmModule::PrintExecutionFunction, args.begin(), args.end(), "", currentBlock); } #endif @@ -143,7 +142,7 @@ switch (bytecodes[i]) { case ACONST_NULL : - push(JavaRuntime::JavaObjectNullConstant, AssessorDesc::dRef); + push(JnjvmModule::JavaObjectNullConstant, AssessorDesc::dRef); break; case ICONST_M1 : @@ -366,7 +365,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JavaRuntime::JavaArraySInt32Type); + JnjvmModule::JavaArraySInt32Type); push(new LoadInst(ptr, "", currentBlock), AssessorDesc::dInt); break; } @@ -375,7 +374,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JavaRuntime::JavaArrayLongType); + JnjvmModule::JavaArrayLongType); push(new LoadInst(ptr, "", currentBlock), AssessorDesc::dLong); push(mvm::jit::constantZero, AssessorDesc::dInt); break; @@ -385,7 +384,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JavaRuntime::JavaArrayFloatType); + JnjvmModule::JavaArrayFloatType); push(new LoadInst(ptr, "", currentBlock), AssessorDesc::dFloat); break; } @@ -394,7 +393,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JavaRuntime::JavaArrayDoubleType); + JnjvmModule::JavaArrayDoubleType); push(new LoadInst(ptr, "", currentBlock), AssessorDesc::dDouble); push(mvm::jit::constantZero, AssessorDesc::dInt); break; @@ -404,7 +403,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JavaRuntime::JavaArrayObjectType); + JnjvmModule::JavaArrayObjectType); push(new LoadInst(ptr, "", currentBlock), AssessorDesc::dRef); break; } @@ -413,7 +412,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JavaRuntime::JavaArraySInt8Type); + JnjvmModule::JavaArraySInt8Type); Value* val = new LoadInst(ptr, "", currentBlock); push(new SExtInst(val, Type::Int32Ty, "", currentBlock), AssessorDesc::dInt); @@ -424,7 +423,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JavaRuntime::JavaArrayUInt16Type); + JnjvmModule::JavaArrayUInt16Type); Value* val = new LoadInst(ptr, "", currentBlock); push(new ZExtInst(val, Type::Int32Ty, "", currentBlock), AssessorDesc::dInt); @@ -435,7 +434,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JavaRuntime::JavaArraySInt16Type); + JnjvmModule::JavaArraySInt16Type); Value* val = new LoadInst(ptr, "", currentBlock); push(new SExtInst(val, Type::Int32Ty, "", currentBlock), AssessorDesc::dInt); @@ -580,7 +579,7 @@ Value* index = popAsInt(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JavaRuntime::JavaArraySInt32Type); + JnjvmModule::JavaArraySInt32Type); new StoreInst(val, ptr, false, currentBlock); break; } @@ -591,7 +590,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JavaRuntime::JavaArrayLongType); + JnjvmModule::JavaArrayLongType); new StoreInst(val, ptr, false, currentBlock); break; } @@ -601,7 +600,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JavaRuntime::JavaArrayFloatType); + JnjvmModule::JavaArrayFloatType); new StoreInst(val, ptr, false, currentBlock); break; } @@ -612,7 +611,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JavaRuntime::JavaArrayDoubleType); + JnjvmModule::JavaArrayDoubleType); new StoreInst(val, ptr, false, currentBlock); break; } @@ -622,7 +621,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JavaRuntime::JavaArrayObjectType); + JnjvmModule::JavaArrayObjectType); new StoreInst(val, ptr, false, currentBlock); break; } @@ -635,7 +634,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JavaRuntime::JavaArraySInt8Type); + JnjvmModule::JavaArraySInt8Type); new StoreInst(val, ptr, false, currentBlock); break; } @@ -651,7 +650,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JavaRuntime::JavaArrayUInt16Type); + JnjvmModule::JavaArrayUInt16Type); new StoreInst(val, ptr, false, currentBlock); break; } @@ -667,7 +666,7 @@ Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, - JavaRuntime::JavaArraySInt16Type); + JnjvmModule::JavaArraySInt16Type); new StoreInst(val, ptr, false, currentBlock); break; } @@ -1647,7 +1646,7 @@ Value* expr = ConstantExpr::getIntToPtr( ConstantInt::get(Type::Int64Ty, uint64_t (jsrIndex++)), - JavaRuntime::JavaObjectType); + JnjvmModule::JavaObjectType); new StoreInst(expr, supplLocal, false, currentBlock); BranchInst::Create(opcodeInfos[tmp + readS2(bytecodes, i)].newBlock, @@ -1830,7 +1829,7 @@ uint8 id = bytecodes[++i]; AssessorDesc* ass = AssessorDesc::arrayType(id); dcl = ass->arrayClass; - TheVT = JavaRuntime::JavaObjectVirtualTableGV; + TheVT = JnjvmModule::JavaObjectVirtualTableGV; LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[ass->numId]; sizeElement = LAI.sizeInBytesConstant; } else { @@ -1842,11 +1841,11 @@ AssessorDesc::constructArrayName(vm, 0, 1, className); dcl = vm->constructArray(arrayName, compilingClass->classLoader); - TheVT = JavaRuntime::ArrayObjectVirtualTableGV; + TheVT = JnjvmModule::ArrayObjectVirtualTableGV; sizeElement = mvm::jit::constantPtrSize; } - LLVMCommonClassInfo* LCI = JavaRuntime::getClassInfo(dcl); + LLVMCommonClassInfo* LCI = module->getClassInfo(dcl); llvm::Value* valCl = LCI->getVar(this); llvm::Value* arg1 = popAsInt(); @@ -1862,19 +1861,19 @@ std::vector exArgs; exArgs.push_back(arg1); if (currentExceptionBlock != endExceptionBlock) { - InvokeInst::Create(JavaRuntime::NegativeArraySizeExceptionFunction, + InvokeInst::Create(JnjvmModule::NegativeArraySizeExceptionFunction, unifiedUnreachable, currentExceptionBlock, exArgs.begin(), exArgs.end(), "", currentBlock); } else { - CallInst::Create(JavaRuntime::NegativeArraySizeExceptionFunction, + CallInst::Create(JnjvmModule::NegativeArraySizeExceptionFunction, exArgs.begin(), exArgs.end(), "", currentBlock); new UnreachableInst(currentBlock); } currentBlock = BB2; cmp = new ICmpInst(ICmpInst::ICMP_SGT, arg1, - JavaRuntime::MaxArraySizeConstant, + JnjvmModule::MaxArraySizeConstant, "", currentBlock); BB1 = createBasicBlock(""); @@ -1883,12 +1882,12 @@ BranchInst::Create(BB1, BB2, cmp, currentBlock); currentBlock = BB1; if (currentExceptionBlock != endExceptionBlock) { - InvokeInst::Create(JavaRuntime::OutOfMemoryErrorFunction, + InvokeInst::Create(JnjvmModule::OutOfMemoryErrorFunction, unifiedUnreachable, currentExceptionBlock, exArgs.begin(), exArgs.end(), "", currentBlock); } else { - CallInst::Create(JavaRuntime::OutOfMemoryErrorFunction, + CallInst::Create(JnjvmModule::OutOfMemoryErrorFunction, exArgs.begin(), exArgs.end(), "", currentBlock); new UnreachableInst(currentBlock); } @@ -1897,24 +1896,24 @@ Value* mult = BinaryOperator::createMul(arg1, sizeElement, "", currentBlock); Value* size = - BinaryOperator::createAdd(JavaRuntime::JavaObjectSizeConstant, mult, + BinaryOperator::createAdd(JnjvmModule::JavaObjectSizeConstant, mult, "", currentBlock); std::vector args; args.push_back(size); args.push_back(new LoadInst(TheVT, "", currentBlock)); #ifdef MULTIPLE_GC - args.push_back(CallInst::Create(JavaRuntime::GetCollectorFunction, + args.push_back(CallInst::Create(JnjvmModule::GetCollectorFunction, isolateLocal, "", currentBlock)); #endif - Value* res = invoke(JavaRuntime::JavaObjectAllocateFunction, args, "", + Value* res = invoke(JnjvmModule::JavaObjectAllocateFunction, args, "", currentBlock); - Value* cast = new BitCastInst(res, JavaRuntime::JavaArrayType, "", + Value* cast = new BitCastInst(res, JnjvmModule::JavaArrayType, "", currentBlock); // Set the size std::vector gep4; gep4.push_back(mvm::jit::constantZero); - gep4.push_back(JavaRuntime::JavaArraySizeOffsetConstant); + gep4.push_back(JnjvmModule::JavaArraySizeOffsetConstant); Value* GEP = GetElementPtrInst::Create(cast, gep4.begin(), gep4.end(), "", currentBlock); new StoreInst(arg1, GEP, currentBlock); @@ -1922,7 +1921,7 @@ // Set the class std::vector gep; gep.push_back(mvm::jit::constantZero); - gep.push_back(JavaRuntime::JavaObjectClassOffsetConstant); + gep.push_back(JnjvmModule::JavaObjectClassOffsetConstant); GEP = GetElementPtrInst::Create(res, gep.begin(), gep.end(), "", currentBlock); new StoreInst(valCl, GEP, currentBlock); @@ -1944,12 +1943,12 @@ std::vector args; args.push_back(arg); if (currentExceptionBlock != endExceptionBlock) { - InvokeInst::Create(JavaRuntime::ThrowExceptionFunction, + InvokeInst::Create(JnjvmModule::ThrowExceptionFunction, unifiedUnreachable, currentExceptionBlock, args.begin(), args.end(), "", currentBlock); } else { - CallInst::Create(JavaRuntime::ThrowExceptionFunction, args.begin(), + CallInst::Create(JnjvmModule::ThrowExceptionFunction, args.begin(), args.end(), "", currentBlock); new UnreachableInst(currentBlock); } @@ -1964,7 +1963,7 @@ Value* obj = top(); Value* cmp = new ICmpInst(ICmpInst::ICMP_EQ, obj, - JavaRuntime::JavaObjectNullConstant, + JnjvmModule::JavaObjectNullConstant, "", currentBlock); BasicBlock* ifTrue = createBasicBlock("null checkcast"); @@ -1974,7 +1973,7 @@ currentBlock = ifFalse; Value* clVar = 0; if (dcl) { - LLVMCommonClassInfo* LCI = JavaRuntime::getClassInfo(dcl); + LLVMCommonClassInfo* LCI = module->getClassInfo(dcl); clVar = LCI->getVar(this); } else { clVar = getResolvedClass(index, false); @@ -1982,7 +1981,7 @@ std::vector args; args.push_back(obj); args.push_back(clVar); - Value* call = CallInst::Create(JavaRuntime::InstanceOfFunction, + Value* call = CallInst::Create(JnjvmModule::InstanceOfFunction, args.begin(), args.end(), "", currentBlock); @@ -1993,12 +1992,12 @@ exArgs.push_back(obj); exArgs.push_back(clVar); if (currentExceptionBlock != endExceptionBlock) { - InvokeInst::Create(JavaRuntime::ClassCastExceptionFunction, + InvokeInst::Create(JnjvmModule::ClassCastExceptionFunction, unifiedUnreachable, currentExceptionBlock, exArgs.begin(), exArgs.end(), "", ex); } else { - CallInst::Create(JavaRuntime::ClassCastExceptionFunction, + CallInst::Create(JnjvmModule::ClassCastExceptionFunction, exArgs.begin(), exArgs.end(), "", ex); new UnreachableInst(ex); } @@ -2014,7 +2013,7 @@ Value* clVar = 0; if (dcl) { - LLVMCommonClassInfo* LCI = JavaRuntime::getClassInfo(dcl); + LLVMCommonClassInfo* LCI = module->getClassInfo(dcl); clVar = LCI->getVar(this); } else { clVar = getResolvedClass(index, false); @@ -2022,7 +2021,7 @@ std::vector args; args.push_back(pop()); args.push_back(clVar); - Value* val = CallInst::Create(JavaRuntime::InstanceOfFunction, + Value* val = CallInst::Create(JnjvmModule::InstanceOfFunction, args.begin(), args.end(), "", currentBlock); push(new ZExtInst(val, Type::Int32Ty, "", currentBlock), @@ -2034,10 +2033,10 @@ Value* obj = pop(); #ifdef SERVICE_VM if (ServiceDomain::isLockableDomain(compilingClass->isolate)) - invoke(JavaRuntime::AquireObjectInSharedDomainFunction, obj, "", + invoke(JnjvmModule::AquireObjectInSharedDomainFunction, obj, "", currentBlock); else - invoke(JavaRuntime::AquireObjectFunction, obj, "", + invoke(JnjvmModule::AquireObjectFunction, obj, "", currentBlock); #else JITVerifyNull(obj); @@ -2050,10 +2049,10 @@ Value* obj = pop(); #ifdef SERVICE_VM if (ServiceDomain::isLockableDomain(compilingClass->isolate)) - invoke(JavaRuntime::ReleaseObjectInSharedDomainFunction, obj, "", + invoke(JnjvmModule::ReleaseObjectInSharedDomainFunction, obj, "", currentBlock); else - invoke(JavaRuntime::ReleaseObjectFunction, obj, "", + invoke(JnjvmModule::ReleaseObjectFunction, obj, "", currentBlock); #else JITVerifyNull(obj); @@ -2075,7 +2074,7 @@ compilingClass->ctpInfo->loadClass(index); - LLVMCommonClassInfo* LCI = JavaRuntime::getClassInfo(dcl); + LLVMCommonClassInfo* LCI = module->getClassInfo(dcl); Value* valCl = LCI->getVar(this); Value** args = (Value**)alloca(sizeof(Value*) * (dim + 2)); args[0] = valCl; @@ -2091,7 +2090,7 @@ #ifdef MULTIPLE_VM Args.push_back(isolateLocal); #endif - push(invoke(JavaRuntime::MultiCallNewFunction, Args, "", currentBlock), + push(invoke(JnjvmModule::MultiCallNewFunction, Args, "", currentBlock), AssessorDesc::dRef); break; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp?rev=54734&r1=54733&r2=54734&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp Wed Aug 13 09:11:28 2008 @@ -21,6 +21,7 @@ #include "JavaThread.h" #include "JavaTypes.h" #include "Jnjvm.h" +#include "JnjvmModule.h" using namespace jnjvm; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.h?rev=54734&r1=54733&r2=54734&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.h Wed Aug 13 09:11:28 2008 @@ -6,6 +6,16 @@ // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// +// +// This file defines the Java runtime LLVM requires to execute Java programs. +// The LLVM IR will perform JVM calls or access global variables that will +// be defined at runtime. +// +// A clean implementation will create global variables and functions for each +// module. Currently we don't do this, and the verifier pass in LLVM does not +// like it. +// +//===----------------------------------------------------------------------===// #ifndef JNJVM_JAVA_RUNTIME_H #define JNJVM_JAVA_RUNTIME_H @@ -87,7 +97,11 @@ /// virtualSizeLLVM - The LLVM constant size of instances of this class. /// llvm::ConstantInt* virtualSizeConstant; + +#ifndef MULTIPLE_VM llvm::GlobalVariable* staticVarGV; +#endif + llvm::GlobalVariable* virtualTableGV; llvm::Function* virtualTracerFunction; llvm::Function* staticTracerFunction; @@ -111,7 +125,9 @@ LLVMClassInfo(CommonClass* cl) : LLVMCommonClassInfo(cl), virtualSizeConstant(0), +#ifndef MULITPLE_VM staticVarGV(0), +#endif virtualTableGV(0), virtualTracerFunction(0), staticTracerFunction(0), Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=54734&r1=54733&r2=54734&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Wed Aug 13 09:11:28 2008 @@ -22,6 +22,7 @@ #include "JavaThread.h" #include "JavaTypes.h" #include "Jnjvm.h" +#include "JnjvmModule.h" #include "LockedMap.h" #ifdef SERVICE_VM Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp?rev=54734&r1=54733&r2=54734&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp Wed Aug 13 09:11:28 2008 @@ -511,7 +511,7 @@ intptr_t Signdef::staticCallBuf() { if (!_staticCallBuf) { - LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(this); + LLVMSignatureInfo* LSI = isolate->TheModule->getSignatureInfo(this); LSI->getStaticBuf(); } return _staticCallBuf; @@ -519,7 +519,7 @@ intptr_t Signdef::virtualCallBuf() { if (!_virtualCallBuf) { - LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(this); + LLVMSignatureInfo* LSI = isolate->TheModule->getSignatureInfo(this); LSI->getVirtualBuf(); } return _virtualCallBuf; @@ -527,7 +527,7 @@ intptr_t Signdef::staticCallAP() { if (!_staticCallAP) { - LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(this); + LLVMSignatureInfo* LSI = isolate->TheModule->getSignatureInfo(this); LSI->getStaticAP(); } return _staticCallAP; @@ -535,7 +535,7 @@ intptr_t Signdef::virtualCallAP() { if (!_virtualCallAP) { - LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(this); + LLVMSignatureInfo* LSI = isolate->TheModule->getSignatureInfo(this); LSI->getVirtualAP(); } return _virtualCallAP; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=54734&r1=54733&r2=54734&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Wed Aug 13 09:11:28 2008 @@ -15,12 +15,12 @@ #include "JavaClass.h" #include "JavaJIT.h" #include "JavaObject.h" -#include "JavaRuntime.h" #include "JavaString.h" #include "JavaThread.h" #include "JavaTypes.h" #include "JavaUpcalls.h" #include "Jnjvm.h" +#include "JnjvmModule.h" #define COMPILE_METHODS(cl) \ for (CommonClass::method_iterator i = cl->virtualMethods.begin(), \ @@ -379,11 +379,11 @@ JavaMethod* internString = UPCALL_METHOD(vm, "java/lang/VMString", "intern", "(Ljava/lang/String;)Ljava/lang/String;", ACC_STATIC); - JavaRuntime::setMethod(internString, "internString"); + vm->TheModule->setMethod(internString, "internString"); JavaMethod* isArray = UPCALL_METHOD(vm, "java/lang/Class", "isArray", "()Z", ACC_VIRTUAL); - JavaRuntime::setMethod(isArray, "isArray"); + vm->TheModule->setMethod(isArray, "isArray"); ClasspathThread::initialise(vm); @@ -400,17 +400,17 @@ JavaMethod* getCallingClass = UPCALL_METHOD(vm, "gnu/classpath/VMStackWalker", "getCallingClass", "()Ljava/lang/Class;", ACC_STATIC); - JavaRuntime::setMethod(getCallingClass, "getCallingClass"); + vm->TheModule->setMethod(getCallingClass, "getCallingClass"); JavaMethod* getCallingClassLoader = UPCALL_METHOD(vm, "gnu/classpath/VMStackWalker", "getCallingClassLoader", "()Ljava/lang/ClassLoader;", ACC_STATIC); - JavaRuntime::setMethod(getCallingClassLoader, "getCallingClassLoader"); + vm->TheModule->setMethod(getCallingClassLoader, "getCallingClassLoader"); JavaMethod* postProperties = UPCALL_METHOD(vm, "gnu/classpath/VMSystemProperties", "postInit", "(Ljava/util/Properties;)V", ACC_STATIC); - JavaRuntime::setMethod(postProperties, "propertiesPostInit"); + vm->TheModule->setMethod(postProperties, "propertiesPostInit"); } extern "C" JavaString* internString(JavaString* obj) { Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=54734&r1=54733&r2=54734&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Wed Aug 13 09:11:28 2008 @@ -331,7 +331,7 @@ cl->super->initialiseClass(); } - JavaRuntime::resolveStaticClass((Class*)cl); + TheModule->resolveStaticClass((Class*)cl); *status = inClinit; JavaMethod* meth = cl->lookupMethodDontThrow(clinitName, clinitType, true, @@ -401,7 +401,7 @@ loadParents((Class*)cl); cl->acquire(); cl->status = prepared; - JavaRuntime::resolveVirtualClass((Class*)cl); + TheModule->resolveVirtualClass((Class*)cl); cl->status = resolved; } cl->release(); Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=54734&r1=54733&r2=54734&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Wed Aug 13 09:11:28 2008 @@ -26,10 +26,6 @@ #define vm_new(vm, cl) gc_new(cl) #endif -namespace llvm { - class Module; -} - namespace jnjvm { class ArrayUInt8; @@ -41,6 +37,7 @@ class JavaMethod; class JavaObject; class JavaString; +class JnjvmModule; class JnjvmModuleProvider; class Reader; class Typedef; @@ -262,7 +259,7 @@ JnjvmModuleProvider* TheModuleProvider; - llvm::Module* TheModule; + JnjvmModule* TheModule; #ifndef MULTIPLE_GC Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=54734&r1=54733&r2=54734&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Wed Aug 13 09:11:28 2008 @@ -17,9 +17,9 @@ #include "JavaClass.h" #include "JavaConstantPool.h" #include "JavaJIT.h" -#include "JavaRuntime.h" #include "JavaThread.h" #include "Jnjvm.h" +#include "JnjvmModule.h" #include "JnjvmModuleProvider.h" using namespace llvm; @@ -41,7 +41,7 @@ meth->compiledPtr(); - LLVMMethodInfo* LMI = JavaRuntime::getMethodInfo(meth); + LLVMMethodInfo* LMI = ((JnjvmModule*)TheModule)->getMethodInfo(meth); ctpInfo->ctpRes[index] = LMI->getMethod(); return meth; @@ -92,7 +92,7 @@ mvm::jit::executionEngine->updateGlobalMapping(F, val); if (isVirtual(meth->access)) { - LLVMMethodInfo* LMI = JavaRuntime::getMethodInfo(meth); + LLVMMethodInfo* LMI = ((JnjvmModule*)TheModule)->getMethodInfo(meth); uint64_t offset = LMI->getOffset()->getZExtValue(); assert(meth->classDef->isResolved() && "Class not resolved"); assert(meth->classDef->virtualVT && "Class has no VT"); @@ -133,7 +133,7 @@ } Function* JnjvmModuleProvider::parseFunction(JavaMethod* meth) { - LLVMMethodInfo* LMI = JavaRuntime::getMethodInfo(meth); + LLVMMethodInfo* LMI = ((JnjvmModule*)TheModule)->getMethodInfo(meth); Function* func = LMI->getMethod(); if (func->hasNotBeenReadFromBitcode()) { // We are jitting. Take the lock. @@ -141,7 +141,7 @@ JavaJIT jit; jit.compilingClass = meth->classDef; jit.compilingMethod = meth; - jit.module = TheModule; + jit.module = (JnjvmModule*)TheModule; jit.llvmFunction = func; if (isNative(meth->access)) { jit.nativeCompile(); @@ -156,7 +156,8 @@ llvm::Function* JnjvmModuleProvider::addCallback(Class* cl, uint32 index, Signdef* sign, bool stat) { const llvm::FunctionType* type = 0; - LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(sign); + JnjvmModule* M = cl->isolate->TheModule; + LLVMSignatureInfo* LSI = M->getSignatureInfo(sign); if (stat) { type = LSI->getStaticType(); @@ -224,7 +225,7 @@ addPass(PM, createSCCPPass()); // Constant prop with SCCP addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs - addPass(PM, mvm::createEscapeAnalysisPass(JavaRuntime::JavaObjectAllocateFunction)); + addPass(PM, mvm::createEscapeAnalysisPass(JnjvmModule::JavaObjectAllocateFunction)); addPass(PM, mvm::createLowerConstantCallsPass()); addPass(PM, createGVNPass()); // Remove redundancies @@ -240,7 +241,7 @@ } -JnjvmModuleProvider::JnjvmModuleProvider(llvm::Module *m) { +JnjvmModuleProvider::JnjvmModuleProvider(JnjvmModule *m) { TheModule = (Module*)m; mvm::jit::protectEngine->lock(); mvm::jit::executionEngine->addModuleProvider(this); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h?rev=54734&r1=54733&r2=54734&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h Wed Aug 13 09:11:28 2008 @@ -15,12 +15,13 @@ using namespace llvm; namespace llvm { - class FunctionPassManager; - class Module; +class FunctionPassManager; } namespace jnjvm { +class JnjvmModule; + class JnjvmModuleProvider : public ModuleProvider { private: JavaMethod* staticLookup(Class* caller, uint32 index); @@ -41,7 +42,7 @@ public: - JnjvmModuleProvider(llvm::Module *m); + JnjvmModuleProvider(JnjvmModule *m); ~JnjvmModuleProvider(); llvm::Function* addCallback(Class* cl, uint32 index, Signdef* sign, Modified: vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=54734&r1=54733&r2=54734&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Wed Aug 13 09:11:28 2008 @@ -16,7 +16,7 @@ #include "mvm/JIT.h" -#include "JavaRuntime.h" +#include "JnjvmModule.h" using namespace llvm; using namespace jnjvm; @@ -44,20 +44,20 @@ II++; if (CallInst *CI = dyn_cast(I)) { Value* V = CI->getOperand(0); - if (V == jnjvm::JavaRuntime::ArrayLengthFunction) { + if (V == jnjvm::JnjvmModule::ArrayLengthFunction) { Changed = true; Value* val = CI->getOperand(1); // get the array - Value* array = new BitCastInst(val, jnjvm::JavaRuntime::JavaArrayType, + Value* array = new BitCastInst(val, jnjvm::JnjvmModule::JavaArrayType, "", CI); std::vector args; //size= 2 args.push_back(mvm::jit::constantZero); - args.push_back(jnjvm::JavaRuntime::JavaArraySizeOffsetConstant); + args.push_back(jnjvm::JnjvmModule::JavaArraySizeOffsetConstant); Value* ptr = GetElementPtrInst::Create(array, args.begin(), args.end(), "", CI); Value* load = new LoadInst(ptr, "", CI); CI->replaceAllUsesWith(load); CI->eraseFromParent(); - } else if (V == jnjvm::JavaRuntime::GetVTFunction) { + } else if (V == jnjvm::JnjvmModule::GetVTFunction) { Changed = true; Value* val = CI->getOperand(1); // get the object std::vector indexes; //[3]; @@ -68,66 +68,66 @@ Value* VT = new LoadInst(VTPtr, "", CI); CI->replaceAllUsesWith(VT); CI->eraseFromParent(); - } else if (V == jnjvm::JavaRuntime::GetClassFunction) { + } else if (V == jnjvm::JnjvmModule::GetClassFunction) { Changed = true; Value* val = CI->getOperand(1); // get the object std::vector args2; args2.push_back(mvm::jit::constantZero); - args2.push_back(jnjvm::JavaRuntime::JavaObjectClassOffsetConstant); + args2.push_back(jnjvm::JnjvmModule::JavaObjectClassOffsetConstant); Value* classPtr = GetElementPtrInst::Create(val, args2.begin(), args2.end(), "", CI); Value* cl = new LoadInst(classPtr, "", CI); CI->replaceAllUsesWith(cl); CI->eraseFromParent(); - } else if (V == jnjvm::JavaRuntime::GetVTFromClassFunction) { + } else if (V == jnjvm::JnjvmModule::GetVTFromClassFunction) { Changed = true; Value* val = CI->getOperand(1); std::vector indexes; indexes.push_back(mvm::jit::constantZero); - indexes.push_back(jnjvm::JavaRuntime::OffsetVTInClassConstant); + indexes.push_back(jnjvm::JnjvmModule::OffsetVTInClassConstant); Value* VTPtr = GetElementPtrInst::Create(val, indexes.begin(), indexes.end(), "", CI); Value* VT = new LoadInst(VTPtr, "", CI); CI->replaceAllUsesWith(VT); CI->eraseFromParent(); - } else if (V == jnjvm::JavaRuntime::GetObjectSizeFromClassFunction) { + } else if (V == jnjvm::JnjvmModule::GetObjectSizeFromClassFunction) { Changed = true; Value* val = CI->getOperand(1); std::vector indexes; indexes.push_back(mvm::jit::constantZero); - indexes.push_back(JavaRuntime::OffsetObjectSizeInClassConstant); + indexes.push_back(JnjvmModule::OffsetObjectSizeInClassConstant); Value* SizePtr = GetElementPtrInst::Create(val, indexes.begin(), indexes.end(), "", CI); Value* Size = new LoadInst(SizePtr, "", CI); CI->replaceAllUsesWith(Size); CI->eraseFromParent(); - } else if (V == jnjvm::JavaRuntime::ForceInitialisationCheckFunction) { + } else if (V == jnjvm::JnjvmModule::ForceInitialisationCheckFunction) { Changed = true; CI->eraseFromParent(); - } else if (V == jnjvm::JavaRuntime::GetDepthFunction) { + } else if (V == jnjvm::JnjvmModule::GetDepthFunction) { Changed = true; Value* val = CI->getOperand(1); std::vector indexes; indexes.push_back(mvm::jit::constantZero); - indexes.push_back(JavaRuntime::OffsetDepthInClassConstant); + indexes.push_back(JnjvmModule::OffsetDepthInClassConstant); Value* DepthPtr = GetElementPtrInst::Create(val, indexes.begin(), indexes.end(), "", CI); Value* Depth = new LoadInst(DepthPtr, "", CI); CI->replaceAllUsesWith(Depth); CI->eraseFromParent(); - } else if (V == jnjvm::JavaRuntime::GetDisplayFunction) { + } else if (V == jnjvm::JnjvmModule::GetDisplayFunction) { Changed = true; Value* val = CI->getOperand(1); std::vector indexes; indexes.push_back(mvm::jit::constantZero); - indexes.push_back(JavaRuntime::OffsetDisplayInClassConstant); + indexes.push_back(JnjvmModule::OffsetDisplayInClassConstant); Value* DisplayPtr = GetElementPtrInst::Create(val, indexes.begin(), indexes.end(), "", CI); Value* Display = new LoadInst(DisplayPtr, "", CI); CI->replaceAllUsesWith(Display); CI->eraseFromParent(); - } else if (V == jnjvm::JavaRuntime::GetClassInDisplayFunction) { + } else if (V == jnjvm::JnjvmModule::GetClassInDisplayFunction) { Changed = true; Value* val = CI->getOperand(1); Value* depth = CI->getOperand(2); @@ -135,7 +135,7 @@ Value* Class = new LoadInst(ClassPtr, "", CI); CI->replaceAllUsesWith(Class); CI->eraseFromParent(); - } else if (V == jnjvm::JavaRuntime::InstanceOfFunction) { + } else if (V == jnjvm::JnjvmModule::InstanceOfFunction) { ConstantExpr* CE = dyn_cast(CI->getOperand(2)); if (CE) { ConstantInt* C = (ConstantInt*)CE->getOperand(0); @@ -145,21 +145,21 @@ I->getParent()->getTerminator()->eraseFromParent(); Value* obj = CI->getOperand(1); Instruction* cmp = new ICmpInst(ICmpInst::ICMP_EQ, obj, - JavaRuntime::JavaObjectNullConstant, + JnjvmModule::JavaObjectNullConstant, "", CI); BasicBlock* ifTrue = BasicBlock::Create("", &F); BasicBlock* ifFalse = BasicBlock::Create("", &F); BranchInst::Create(ifTrue, ifFalse, cmp, CI); PHINode* node = PHINode::Create(Type::Int1Ty, "", ifTrue); node->addIncoming(ConstantInt::getFalse(), CI->getParent()); - Value* objCl = CallInst::Create(JavaRuntime::GetClassFunction, obj, + Value* objCl = CallInst::Create(JnjvmModule::GetClassFunction, obj, "", ifFalse); if (isInterface(cl->access)) { std::vector args; args.push_back(objCl); args.push_back(CE); - Value* res = CallInst::Create(JavaRuntime::ImplementsFunction, + Value* res = CallInst::Create(JnjvmModule::ImplementsFunction, args.begin(), args.end(), "", ifFalse); node->addIncoming(res, ifFalse); @@ -174,7 +174,7 @@ std::vector args; args.push_back(objCl); args.push_back(CE); - cmp = CallInst::Create(JavaRuntime::IsAssignableFromFunction, + cmp = CallInst::Create(JnjvmModule::IsAssignableFromFunction, args.begin(), args.end(), "", notEquals); node->addIncoming(cmp, notEquals); BranchInst::Create(ifTrue, notEquals); @@ -183,7 +183,7 @@ args.push_back(objCl); args.push_back(CE); Value* res = - CallInst::Create(JavaRuntime::InstantiationOfArrayFunction, + CallInst::Create(JnjvmModule::InstantiationOfArrayFunction, args.begin(), args.end(), "", notEquals); node->addIncoming(res, notEquals); BranchInst::Create(ifTrue, notEquals); @@ -192,10 +192,10 @@ if (cl->isResolved()) { depthCl = ConstantInt::get(Type::Int32Ty, cl->depth); } else { - depthCl = CallInst::Create(JavaRuntime::GetDepthFunction, + depthCl = CallInst::Create(JnjvmModule::GetDepthFunction, CE, "", notEquals); } - Value* depthClObj = CallInst::Create(JavaRuntime::GetDepthFunction, + Value* depthClObj = CallInst::Create(JnjvmModule::GetDepthFunction, objCl, "", notEquals); Value* cmp = new ICmpInst(ICmpInst::ICMP_ULE, depthCl, depthClObj, "", notEquals); @@ -206,14 +206,14 @@ node->addIncoming(ConstantInt::getFalse(), notEquals); Value* inDisplay = - CallInst::Create(JavaRuntime::GetDisplayFunction, objCl, + CallInst::Create(JnjvmModule::GetDisplayFunction, objCl, "", supDepth); std::vector args; args.push_back(inDisplay); args.push_back(depthCl); Value* clInDisplay = - CallInst::Create(JavaRuntime::GetClassInDisplayFunction, + CallInst::Create(JnjvmModule::GetClassInDisplayFunction, args.begin(), args.end(), "", supDepth); cmp = new ICmpInst(ICmpInst::ICMP_EQ, clInDisplay, CE, "", @@ -229,7 +229,7 @@ } } #ifdef MULTIPLE_GC - else if (V == jnjvm::JavaRuntime::GetCollectorFunction) { + else if (V == jnjvm::JnjvmModule::GetCollectorFunction) { Changed = true; Value* val = CI->getOperand(1); std::vector indexes; From nicolas.geoffray at lip6.fr Wed Aug 13 07:34:47 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 13 Aug 2008 14:34:47 -0000 Subject: [vmkit-commits] [vmkit] r54735 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaRuntime.h JavaRuntimeJIT.cpp Message-ID: <200808131434.m7DEYm1I032448@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 13 09:34:45 2008 New Revision: 54735 URL: http://llvm.org/viewvc/llvm-project?rev=54735&view=rev Log: Delete unused files. Removed: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.h vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Removed: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.h?rev=54734&view=auto ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.h (removed) @@ -1,397 +0,0 @@ -//===------- JavaRuntime.h - Definition of the Java runtime ---------------===// -// -// JnJVM -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines the Java runtime LLVM requires to execute Java programs. -// The LLVM IR will perform JVM calls or access global variables that will -// be defined at runtime. -// -// A clean implementation will create global variables and functions for each -// module. Currently we don't do this, and the verifier pass in LLVM does not -// like it. -// -//===----------------------------------------------------------------------===// - -#ifndef JNJVM_JAVA_RUNTIME_H -#define JNJVM_JAVA_RUNTIME_H - -#include - -#include "llvm/Constant.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Function.h" -#include "llvm/GlobalVariable.h" -#include "llvm/Module.h" -#include "llvm/Type.h" -#include "llvm/Value.h" - -#include "mvm/JIT.h" - -#include "JavaClass.h" -#include "JavaTypes.h" - -namespace jnjvm { - -class CommonClass; -class Class; -class JavaField; -class JavaMethod; -class JavaObject; -class JavaJIT; -class JavaRuntime; -class Signdef; - -class LLVMAssessorInfo { -public: - const llvm::Type* llvmType; - const llvm::Type* llvmTypePtr; - llvm::Constant* llvmNullConstant; - llvm::ConstantInt* sizeInBytesConstant; - - static void initialise(); - static LLVMAssessorInfo AssessorInfo[]; - -}; - - -class LLVMCommonClassInfo : public mvm::JITInfo { - - friend class JavaRuntime; - -protected: - CommonClass* classDef; - -private: - /// varGV - The LLVM global variable representing this class. - /// - llvm::GlobalVariable* varGV; - -#ifndef MULTIPLE_VM - /// delegateeGV - The LLVM global variable representing the - /// java/lang/Class instance of this class. - llvm::GlobalVariable* delegateeGV; -#endif - - -public: - llvm::Value* getVar(JavaJIT* jit); - llvm::Value* getDelegatee(JavaJIT* jit); - - LLVMCommonClassInfo(CommonClass* cl) : - classDef(cl), - varGV(0) -#ifndef MULTIPLE_VM - ,delegateeGV(0) -#endif - {} -}; - -class LLVMClassInfo : public LLVMCommonClassInfo { - friend class JavaRuntime; -private: - /// virtualSizeLLVM - The LLVM constant size of instances of this class. - /// - llvm::ConstantInt* virtualSizeConstant; - -#ifndef MULTIPLE_VM - llvm::GlobalVariable* staticVarGV; -#endif - - llvm::GlobalVariable* virtualTableGV; - llvm::Function* virtualTracerFunction; - llvm::Function* staticTracerFunction; - /// virtualType - The LLVM type of instance of this class. - /// - const llvm::Type * virtualType; - - /// staticType - The LLVM type of the static instance of this class. - /// - const llvm::Type * staticType; -public: - - llvm::Value* getStaticVar(JavaJIT* jit); - llvm::Value* getVirtualTable(JavaJIT* jit); - llvm::Value* getVirtualSize(JavaJIT* jit); - llvm::Function* getStaticTracer(); - llvm::Function* getVirtualTracer(); - const llvm::Type* getVirtualType(); - const llvm::Type* getStaticType(); - - LLVMClassInfo(CommonClass* cl) : - LLVMCommonClassInfo(cl), - virtualSizeConstant(0), -#ifndef MULITPLE_VM - staticVarGV(0), -#endif - virtualTableGV(0), - virtualTracerFunction(0), - staticTracerFunction(0), - virtualType(0), - staticType(0) {} -}; - -class LLVMMethodInfo : public mvm::JITInfo { -private: - JavaMethod* methodDef; - - llvm::Function* methodFunction; - llvm::ConstantInt* offsetConstant; - const llvm::FunctionType* functionType; - -public: - llvm::Function* getMethod(); - llvm::ConstantInt* getOffset(); - const llvm::FunctionType* getFunctionType(); - - LLVMMethodInfo(JavaMethod* M) : - methodDef(M), - methodFunction(0), - offsetConstant(0), - functionType(0) {} -}; - -class LLVMFieldInfo : public mvm::JITInfo { -private: - JavaField* fieldDef; - - llvm::ConstantInt* offsetConstant; - -public: - llvm::ConstantInt* getOffset(); - - LLVMFieldInfo(JavaField* F) : - fieldDef(F), - offsetConstant(0) {} -}; - -class LLVMSignatureInfo : public mvm::JITInfo { -private: - const llvm::FunctionType* staticType; - const llvm::FunctionType* virtualType; - const llvm::FunctionType* nativeType; - - const llvm::FunctionType* virtualBufType; - const llvm::FunctionType* staticBufType; - - const llvm::PointerType* staticPtrType; - const llvm::PointerType* virtualPtrType; - const llvm::PointerType* nativePtrType; - - llvm::Function* virtualBufFunction; - llvm::Function* virtualAPFunction; - llvm::Function* staticBufFunction; - llvm::Function* staticAPFunction; - - Signdef* signature; - - llvm::Function* createFunctionCallBuf(bool virt); - llvm::Function* createFunctionCallAP(bool virt); - - - -public: - const llvm::FunctionType* getVirtualType(); - const llvm::FunctionType* getStaticType(); - const llvm::FunctionType* getNativeType(); - - const llvm::FunctionType* getVirtualBufType(); - const llvm::FunctionType* getStaticBufType(); - - const llvm::PointerType* getStaticPtrType(); - const llvm::PointerType* getNativePtrType(); - const llvm::PointerType* getVirtualPtrType(); - - llvm::Function* getVirtualBuf(); - llvm::Function* getVirtualAP(); - llvm::Function* getStaticBuf(); - llvm::Function* getStaticAP(); - - LLVMSignatureInfo(Signdef* sign) : - staticType(0), - virtualType(0), - nativeType(0), - virtualBufType(0), - staticBufType(0), - staticPtrType(0), - virtualPtrType(0), - nativePtrType(0), - virtualBufFunction(0), - virtualAPFunction(0), - staticBufFunction(0), - staticAPFunction(0), - signature(sign) {} - -}; - -#ifdef SERVICE_VM -class LLVMServiceInfo : public mvm::JITInfo { -private: - ServiceDomain* vm; - llvm::GlobalVariable* delegateeGV; - -public: - llvm::Value* getDelegatee(JavaJIT* jit); -}; -#endif - -class JavaRuntime { - friend class LLVMClassInfo; -private: - - static VirtualTable* makeVT(Class* cl, bool stat); - static VirtualTable* allocateVT(Class* cl, CommonClass::method_iterator meths); - - -public: - - static llvm::ConstantInt* JavaArraySizeOffsetConstant; - static llvm::ConstantInt* JavaArrayElementsOffsetConstant; - static llvm::ConstantInt* JavaObjectLockOffsetConstant; - static llvm::ConstantInt* JavaObjectClassOffsetConstant; - - static const llvm::Type* JavaArrayUInt8Type; - static const llvm::Type* JavaArraySInt8Type; - static const llvm::Type* JavaArrayUInt16Type; - static const llvm::Type* JavaArraySInt16Type; - static const llvm::Type* JavaArrayUInt32Type; - static const llvm::Type* JavaArraySInt32Type; - static const llvm::Type* JavaArrayLongType; - static const llvm::Type* JavaArrayFloatType; - static const llvm::Type* JavaArrayDoubleType; - static const llvm::Type* JavaArrayObjectType; - - static const llvm::Type* VTType; - static const llvm::Type* JavaObjectType; - static const llvm::Type* JavaArrayType; - static const llvm::Type* JavaClassType; - static const llvm::Type* JavaCacheType; - static const llvm::Type* EnveloppeType; - static const llvm::Type* CacheNodeType; - -#ifdef WITH_TRACER - static llvm::Function* MarkAndTraceFunction; - static const llvm::FunctionType* MarkAndTraceType; - static llvm::Function* JavaObjectTracerFunction; -#endif - - static llvm::Function* GetSJLJBufferFunction; - static llvm::Function* InterfaceLookupFunction; - static llvm::Function* FieldLookupFunction; - static llvm::Function* PrintExecutionFunction; - static llvm::Function* PrintMethodStartFunction; - static llvm::Function* PrintMethodEndFunction; - static llvm::Function* JniProceedPendingExceptionFunction; - static llvm::Function* InitialisationCheckFunction; - static llvm::Function* ForceInitialisationCheckFunction; - static llvm::Function* ClassLookupFunction; -#ifndef WITHOUT_VTABLE - static llvm::Function* VirtualLookupFunction; -#endif - static llvm::Function* InstanceOfFunction; - static llvm::Function* IsAssignableFromFunction; - static llvm::Function* ImplementsFunction; - static llvm::Function* InstantiationOfArrayFunction; - static llvm::Function* GetDepthFunction; - static llvm::Function* GetClassInDisplayFunction; - static llvm::Function* GetDisplayFunction; - static llvm::Function* AquireObjectFunction; - static llvm::Function* ReleaseObjectFunction; -#ifdef SERVICE_VM - static llvm::Function* AquireObjectInSharedDomainFunction; - static llvm::Function* ReleaseObjectInSharedDomainFunction; - static llvm::Function* ServiceCallStartFunction; - static llvm::Function* ServiceCallStopFunction; -#endif - static llvm::Function* MultiCallNewFunction; - static llvm::Function* RuntimeUTF8ToStrFunction; - static llvm::Function* GetStaticInstanceFunction; - static llvm::Function* GetClassDelegateeFunction; - static llvm::Function* ArrayLengthFunction; - static llvm::Function* GetVTFunction; - static llvm::Function* GetClassFunction; - static llvm::Function* JavaObjectAllocateFunction; -#ifdef MULTIPLE_GC - static llvm::Function* GetCollectorFunction; -#endif - static llvm::Function* GetVTFromClassFunction; - static llvm::Function* GetObjectSizeFromClassFunction; - - static llvm::Function* GetLockFunction; - static llvm::Function* GetThreadIDFunction; - static llvm::Function* OverflowThinLockFunction; - - static llvm::ConstantInt* OffsetObjectSizeInClassConstant; - static llvm::ConstantInt* OffsetVTInClassConstant; - static llvm::ConstantInt* OffsetDepthInClassConstant; - static llvm::ConstantInt* OffsetDisplayInClassConstant; - - static llvm::Constant* JavaClassNullConstant; - - static llvm::Constant* JavaObjectNullConstant; - static llvm::Constant* UTF8NullConstant; - static llvm::Constant* MaxArraySizeConstant; - static llvm::Constant* JavaObjectSizeConstant; - - static llvm::GlobalVariable* ArrayObjectVirtualTableGV; - static llvm::GlobalVariable* JavaObjectVirtualTableGV; - - static llvm::Function* GetExceptionFunction; - static llvm::Function* GetJavaExceptionFunction; - static llvm::Function* ThrowExceptionFunction; - static llvm::Function* ClearExceptionFunction; - static llvm::Function* CompareExceptionFunction; - static llvm::Function* NullPointerExceptionFunction; - static llvm::Function* IndexOutOfBoundsExceptionFunction; - static llvm::Function* ClassCastExceptionFunction; - static llvm::Function* OutOfMemoryErrorFunction; - static llvm::Function* NegativeArraySizeExceptionFunction; - - static void InitField(JavaField* field); - static void InitField(JavaField* field, JavaObject* obj, uint64 val = 0); - static void InitField(JavaField* field, JavaObject* obj, JavaObject* val); - static void InitField(JavaField* field, JavaObject* obj, double val); - static void InitField(JavaField* field, JavaObject* obj, float val); - - - 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(); - } - - static LLVMCommonClassInfo* getClassInfo(CommonClass* cl) { - if (cl->isArray || cl->isPrimitive) { - return cl->getInfo(); - } else { - return cl->getInfo(); - } - } - - static LLVMFieldInfo* getFieldInfo(JavaField* field) { - return field->getInfo(); - } - - static LLVMMethodInfo* getMethodInfo(JavaMethod* method) { - return method->getInfo(); - } - -#ifdef SERVICE_VM - static LLVMServiceInfo* getServiceInfo(ServiceDomain* service) { - return service->getInfo(); - } -#endif - - static void initialise(llvm::Module* mod); -}; - -} - -#endif Removed: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=54734&view=auto ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (removed) @@ -1,358 +0,0 @@ -//===-------------------- JavaRuntimeJIT.cpp ------------------------------===// -//=== ---- Runtime functions called by code compiled by the JIT -----------===// -// -// JnJVM -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include - -#include "mvm/JIT.h" -#include "mvm/Threads/Thread.h" - -#include "JavaArray.h" -#include "JavaCache.h" -#include "JavaClass.h" -#include "JavaConstantPool.h" -#include "JavaJIT.h" -#include "JavaString.h" -#include "JavaThread.h" -#include "JavaTypes.h" -#include "Jnjvm.h" -#include "JnjvmModule.h" -#include "LockedMap.h" - -#ifdef SERVICE_VM -#include "ServiceDomain.h" -#endif - -using namespace jnjvm; - -extern "C" JavaString* runtimeUTF8ToStr(const UTF8* val) { - Jnjvm* vm = JavaThread::get()->isolate; - return vm->UTF8ToStr(val); -} - -extern "C" void* jnjvmVirtualLookup(CacheNode* cache, JavaObject *obj) { - Enveloppe* enveloppe = cache->enveloppe; - JavaCtpInfo* ctpInfo = enveloppe->ctpInfo; - CommonClass* ocl = obj->classOf; - CommonClass* cl = 0; - const UTF8* utf8 = 0; - Signdef* sign = 0; - uint32 index = enveloppe->index; - - ctpInfo->resolveInterfaceOrMethod(index, cl, utf8, sign); - - enveloppe->cacheLock->lock(); - CacheNode* rcache = 0; - CacheNode* tmp = enveloppe->firstCache; - CacheNode* last = tmp; - - while (tmp) { - if (ocl == tmp->lastCible) { - rcache = tmp; - break; - } else { - last = tmp; - tmp = tmp->next; - } - } - - if (!rcache) { - JavaMethod* dmeth = ocl->lookupMethod(utf8, sign->keyName, false, true); - if (cache->methPtr) { - rcache = new CacheNode(enveloppe); - } else { - rcache = cache; - } - - rcache->methPtr = dmeth->compiledPtr(); - rcache->lastCible = (Class*)ocl; - - } - - if (enveloppe->firstCache != rcache) { - CacheNode *f = enveloppe->firstCache; - enveloppe->firstCache = rcache; - last->next = rcache->next; - rcache->next = f; - } - - enveloppe->cacheLock->unlock(); - - return rcache->methPtr; -} - -extern "C" void* fieldLookup(JavaObject* obj, Class* caller, uint32 index, - uint32 stat, void** ifStatic, uint32* offset) { - JavaCtpInfo* ctpInfo = caller->ctpInfo; - if (ctpInfo->ctpRes[index]) { - JavaField* field = (JavaField*)(ctpInfo->ctpRes[index]); - field->classDef->initialiseClass(); - if (stat) obj = field->classDef->staticInstance(); - void* ptr = (void*)(field->ptrOffset + (uint64)obj); -#ifndef MULTIPLE_VM - if (stat) *ifStatic = ptr; - *offset = (uint32)field->ptrOffset; -#endif - return ptr; - } - - CommonClass* cl = 0; - const UTF8* utf8 = 0; - Typedef* sign = 0; - - ctpInfo->resolveField(index, cl, utf8, sign); - - JavaField* field = cl->lookupField(utf8, sign->keyName, stat, true); - field->classDef->initialiseClass(); - - if (stat) obj = ((Class*)cl)->staticInstance(); - void* ptr = (void*)((uint64)obj + field->ptrOffset); - - ctpInfo->ctpRes[index] = field; -#ifndef MULTIPLE_VM - if (stat) *ifStatic = ptr; - *offset = (uint32)field->ptrOffset; -#endif - - return ptr; -} - -extern "C" void printMethodStart(JavaMethod* meth) { - printf("[%d] executing %s\n", mvm::Thread::self(), meth->printString()); - fflush(stdout); -} - -extern "C" void printMethodEnd(JavaMethod* meth) { - printf("[%d] return from %s\n", mvm::Thread::self(), meth->printString()); - fflush(stdout); -} - -extern "C" void printExecution(char* opcode, uint32 index, JavaMethod* meth) { - printf("[%d] executing %s %s at %d\n", mvm::Thread::self(), meth->printString(), - opcode, index); - fflush(stdout); -} - -extern "C" void jniProceedPendingException() { - JavaThread* th = JavaThread::get(); - jmp_buf* buf = th->sjlj_buffers.back(); - th->sjlj_buffers.pop_back(); - free(buf); - if (JavaThread::get()->pendingException) { - th->throwPendingException(); - } -} - -extern "C" void* getSJLJBuffer() { - JavaThread* th = JavaThread::get(); - void** buf = (void**)malloc(sizeof(jmp_buf)); - th->sjlj_buffers.push_back((jmp_buf*)buf); - return (void*)buf; -} - -extern "C" void jnjvmNullPointerException() { - JavaThread::get()->isolate->nullPointerException("null"); -} - -extern "C" void negativeArraySizeException(sint32 val) { - JavaThread::get()->isolate->negativeArraySizeException(val); -} - -extern "C" void outOfMemoryError(sint32 val) { - JavaThread::get()->isolate->outOfMemoryError(val); -} - -extern "C" void jnjvmClassCastException(JavaObject* obj, CommonClass* cl) { - JavaThread::get()->isolate->classCastException(""); -} - -extern "C" void indexOutOfBoundsException(JavaObject* obj, sint32 index) { - JavaThread::get()->isolate->indexOutOfBounds(obj, index); -} - -#ifdef MULTIPLE_VM -extern "C" JavaObject* getStaticInstance(Class* cl, Jnjvm* vm) { - std::pair* val = vm->statics->lookup(cl); - if (!val || !(val->second)) { - cl->initialiseClass(); - val = vm->statics->lookup(cl); - } - return val->second; -} -#endif - -extern "C" CommonClass* initialisationCheck(CommonClass* cl) { - cl->isolate->initialiseClass(cl); - return cl; -} - -extern "C" JavaObject* getClassDelegatee(CommonClass* cl) { -#ifdef MULTIPLE_VM - Jnjvm* vm = JavaThread::get()->isolate; -#else - Jnjvm* vm = cl->isolate; -#endif - return vm->getClassDelegatee(cl); -} - -extern "C" Class* newLookup(Class* caller, uint32 index, Class** toAlloc, - uint32 clinit) { - JavaCtpInfo* ctpInfo = caller->ctpInfo; - Class* cl = (Class*)ctpInfo->loadClass(index); - cl->resolveClass(clinit); - - *toAlloc = cl; - return cl; -} - -#ifndef WITHOUT_VTABLE -extern "C" uint32 vtableLookup(JavaObject* obj, Class* caller, uint32 index, - uint32* offset) { - CommonClass* cl = 0; - const UTF8* utf8 = 0; - Signdef* sign = 0; - - caller->ctpInfo->resolveInterfaceOrMethod(index, cl, utf8, sign); - JavaMethod* dmeth = cl->lookupMethodDontThrow(utf8, sign->keyName, false, - true); - if (!dmeth) { - // Arg, it should have been an invoke interface.... Perform the lookup - // on the object class and do not update offset. - dmeth = obj->classOf->lookupMethod(utf8, sign->keyName, false, true); - return dmeth->offset; - } - *offset = dmeth->offset; - return *offset; -} -#endif - - -static JavaArray* multiCallNewIntern(arrayCtor_t ctor, ClassArray* cl, - uint32 len, - sint32* dims, - Jnjvm* vm) { - if (len <= 0) JavaThread::get()->isolate->unknownError("Can not happen"); - JavaArray* _res = ctor(dims[0], cl, vm); - if (len > 1) { - ArrayObject* res = (ArrayObject*)_res; - CommonClass* _base = cl->baseClass(); - if (_base->isArray) { - ClassArray* base = (ClassArray*)_base; - AssessorDesc* func = base->funcs(); - arrayCtor_t newCtor = func->arrayCtor; - if (dims[0] > 0) { - for (sint32 i = 0; i < dims[0]; ++i) { - res->elements[i] = multiCallNewIntern(newCtor, base, (len - 1), - &dims[1], vm); - } - } else { - for (uint32 i = 1; i < len; ++i) { - sint32 p = dims[i]; - if (p < 0) JavaThread::get()->isolate->negativeArraySizeException(p); - } - } - } else { - JavaThread::get()->isolate->unknownError("Can not happen"); - } - } - return _res; -} - -extern "C" JavaArray* multiCallNew(ClassArray* cl, uint32 len, ...) { - va_list ap; - va_start(ap, len); - sint32* dims = (sint32*)alloca(sizeof(sint32) * len); - for (uint32 i = 0; i < len; ++i){ - dims[i] = va_arg(ap, int); - } -#ifdef MULTIPLE_VM - Jnjvm* vm = va_arg(ap, Jnjvm*); -#else - Jnjvm* vm = 0; -#endif - return multiCallNewIntern((arrayCtor_t)ArrayObject::acons, cl, len, dims, vm); -} - -extern "C" void JavaObjectAquire(JavaObject* obj) { -#ifdef SERVICE_VM - ServiceDomain* vm = (ServiceDomain*)JavaThread::get()->isolate; - if (!(vm->GC->isMyObject(obj))) { - vm->serviceError(vm, "I'm locking an object I don't own"); - } -#endif - obj->acquire(); -} - - -extern "C" void JavaObjectRelease(JavaObject* obj) { - verifyNull(obj); -#ifdef SERVICE_VM - ServiceDomain* vm = (ServiceDomain*)JavaThread::get()->isolate; - if (!(vm->GC->isMyObject(obj))) { - vm->serviceError(vm, "I'm unlocking an object I don't own"); - } -#endif - obj->release(); -} - -#ifdef SERVICE_VM -extern "C" void JavaObjectAquireInSharedDomain(JavaObject* obj) { - verifyNull(obj); - obj->acquire(); -} - -extern "C" void JavaObjectReleaseInSharedDomain(JavaObject* obj) { - verifyNull(obj); - obj->release(); -} -#endif - -extern "C" bool instanceOf(JavaObject* obj, CommonClass* cl) { - return obj->instanceOf(cl); -} - -extern "C" bool instantiationOfArray(CommonClass* cl1, ClassArray* cl2) { - return cl1->instantiationOfArray(cl2); -} - -extern "C" bool implements(CommonClass* cl1, CommonClass* cl2) { - return cl1->implements(cl2); -} - -extern "C" bool isAssignableFrom(CommonClass* cl1, CommonClass* cl2) { - return cl1->isAssignableFrom(cl2); -} - -extern "C" void* JavaThreadGetException() { - return JavaThread::getException(); -} - -extern "C" void JavaThreadThrowException(JavaObject* obj) { - return JavaThread::throwException(obj); -} - -extern "C" JavaObject* JavaThreadGetJavaException() { - return JavaThread::getJavaException(); -} - -extern "C" bool JavaThreadCompareException(Class* cl) { - return JavaThread::compareException(cl); -} - -extern "C" void JavaThreadClearException() { - return JavaThread::clearException(); -} - -extern "C" uint32 getThreadID() { - return JavaThread::get()->threadID; -} - -extern "C" void overflowThinLock(JavaObject* obj) { - obj->overflowThinlock(); -} From nicolas.geoffray at lip6.fr Wed Aug 13 07:36:46 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 13 Aug 2008 14:36:46 -0000 Subject: [vmkit-commits] [vmkit] r54736 - /vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.cpp Message-ID: <200808131436.m7DEakZP032641@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 13 09:36:46 2008 New Revision: 54736 URL: http://llvm.org/viewvc/llvm-project?rev=54736&view=rev Log: Delete the right file..... Removed: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.cpp Removed: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.cpp?rev=54735&view=auto ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntime.cpp (removed) @@ -1,1158 +0,0 @@ -//===--------- JavaRuntime.cpp - Definition of a Jnjvm module -------------===// -// -// JnJVM -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "llvm/CallingConv.h" -#include "llvm/ParameterAttributes.h" -#include "llvm/Support/MutexGuard.h" - - -#include "mvm/JIT.h" - -#include "JavaJIT.h" -#include "JavaThread.h" -#include "JavaTypes.h" -#include "Jnjvm.h" -#include "JavaRuntime.h" -#include "JnjvmModuleProvider.h" -#include "LockedMap.h" - - -using namespace jnjvm; -using namespace llvm; - - -#ifdef WITH_TRACER -const llvm::FunctionType* JavaRuntime::MarkAndTraceType = 0; -#endif - -const llvm::Type* JavaRuntime::JavaObjectType = 0; -const llvm::Type* JavaRuntime::JavaArrayType = 0; -const llvm::Type* JavaRuntime::JavaArrayUInt8Type = 0; -const llvm::Type* JavaRuntime::JavaArraySInt8Type = 0; -const llvm::Type* JavaRuntime::JavaArrayUInt16Type = 0; -const llvm::Type* JavaRuntime::JavaArraySInt16Type = 0; -const llvm::Type* JavaRuntime::JavaArrayUInt32Type = 0; -const llvm::Type* JavaRuntime::JavaArraySInt32Type = 0; -const llvm::Type* JavaRuntime::JavaArrayFloatType = 0; -const llvm::Type* JavaRuntime::JavaArrayDoubleType = 0; -const llvm::Type* JavaRuntime::JavaArrayLongType = 0; -const llvm::Type* JavaRuntime::JavaArrayObjectType = 0; -const llvm::Type* JavaRuntime::CacheNodeType = 0; -const llvm::Type* JavaRuntime::EnveloppeType = 0; - -llvm::Constant* JavaRuntime::JavaObjectNullConstant; -llvm::Constant* JavaRuntime::UTF8NullConstant; -llvm::Constant* JavaRuntime::JavaClassNullConstant; -llvm::Constant* JavaRuntime::MaxArraySizeConstant; -llvm::Constant* JavaRuntime::JavaObjectSizeConstant; -llvm::GlobalVariable* JavaRuntime::JavaObjectVirtualTableGV; -llvm::GlobalVariable* JavaRuntime::ArrayObjectVirtualTableGV; -llvm::ConstantInt* JavaRuntime::OffsetObjectSizeInClassConstant; -llvm::ConstantInt* JavaRuntime::OffsetVTInClassConstant; -llvm::ConstantInt* JavaRuntime::OffsetDepthInClassConstant; -llvm::ConstantInt* JavaRuntime::OffsetDisplayInClassConstant; -const llvm::Type* JavaRuntime::JavaClassType; -const llvm::Type* JavaRuntime::VTType; -llvm::ConstantInt* JavaRuntime::JavaArrayElementsOffsetConstant; -llvm::ConstantInt* JavaRuntime::JavaArraySizeOffsetConstant; -llvm::ConstantInt* JavaRuntime::JavaObjectLockOffsetConstant; -llvm::ConstantInt* JavaRuntime::JavaObjectClassOffsetConstant; - -#ifdef WITH_TRACER -llvm::Function* JavaRuntime::MarkAndTraceFunction = 0; -llvm::Function* JavaRuntime::JavaObjectTracerFunction = 0; -#endif -llvm::Function* JavaRuntime::GetSJLJBufferFunction = 0; -llvm::Function* JavaRuntime::ThrowExceptionFunction = 0; -llvm::Function* JavaRuntime::GetExceptionFunction = 0; -llvm::Function* JavaRuntime::GetJavaExceptionFunction = 0; -llvm::Function* JavaRuntime::ClearExceptionFunction = 0; -llvm::Function* JavaRuntime::CompareExceptionFunction = 0; -llvm::Function* JavaRuntime::NullPointerExceptionFunction = 0; -llvm::Function* JavaRuntime::ClassCastExceptionFunction = 0; -llvm::Function* JavaRuntime::IndexOutOfBoundsExceptionFunction = 0; -llvm::Function* JavaRuntime::NegativeArraySizeExceptionFunction = 0; -llvm::Function* JavaRuntime::OutOfMemoryErrorFunction = 0; -llvm::Function* JavaRuntime::JavaObjectAllocateFunction = 0; -llvm::Function* JavaRuntime::InterfaceLookupFunction = 0; -llvm::Function* JavaRuntime::FieldLookupFunction = 0; -#ifndef WITHOUT_VTABLE -llvm::Function* JavaRuntime::VirtualLookupFunction = 0; -#endif -llvm::Function* JavaRuntime::PrintExecutionFunction = 0; -llvm::Function* JavaRuntime::PrintMethodStartFunction = 0; -llvm::Function* JavaRuntime::PrintMethodEndFunction = 0; -llvm::Function* JavaRuntime::JniProceedPendingExceptionFunction = 0; -llvm::Function* JavaRuntime::InitialisationCheckFunction = 0; -llvm::Function* JavaRuntime::ForceInitialisationCheckFunction = 0; -llvm::Function* JavaRuntime::ClassLookupFunction = 0; -llvm::Function* JavaRuntime::InstanceOfFunction = 0; -llvm::Function* JavaRuntime::IsAssignableFromFunction = 0; -llvm::Function* JavaRuntime::ImplementsFunction = 0; -llvm::Function* JavaRuntime::InstantiationOfArrayFunction = 0; -llvm::Function* JavaRuntime::GetDepthFunction = 0; -llvm::Function* JavaRuntime::GetDisplayFunction = 0; -llvm::Function* JavaRuntime::GetClassInDisplayFunction = 0; -llvm::Function* JavaRuntime::AquireObjectFunction = 0; -llvm::Function* JavaRuntime::ReleaseObjectFunction = 0; -llvm::Function* JavaRuntime::MultiCallNewFunction = 0; -llvm::Function* JavaRuntime::RuntimeUTF8ToStrFunction = 0; -llvm::Function* JavaRuntime::GetStaticInstanceFunction = 0; -llvm::Function* JavaRuntime::GetClassDelegateeFunction = 0; -llvm::Function* JavaRuntime::ArrayLengthFunction = 0; -llvm::Function* JavaRuntime::GetVTFunction = 0; -llvm::Function* JavaRuntime::GetClassFunction = 0; -llvm::Function* JavaRuntime::GetVTFromClassFunction = 0; -llvm::Function* JavaRuntime::GetObjectSizeFromClassFunction = 0; - -#ifdef MULTIPLE_GC -llvm::Function* JavaRuntime::GetCollectorFunction = 0; -#endif - -#ifdef SERVICE_VM -llvm::Function* JavaRuntime::AquireObjectInSharedDomainFunction = 0; -llvm::Function* JavaRuntime::ReleaseObjectInSharedDomainFunction = 0; -llvm::Function* JavaRuntime::ServiceCallStartFunction = 0; -llvm::Function* JavaRuntime::ServiceCallStopFunction = 0; -#endif - -llvm::Function* JavaRuntime::GetThreadIDFunction = 0; -llvm::Function* JavaRuntime::GetLockFunction = 0; -llvm::Function* JavaRuntime::OverflowThinLockFunction = 0; - - - -Value* LLVMCommonClassInfo::getVar(JavaJIT* jit) { - if (!varGV) { -#ifdef MULTIPLE_VM - if (jit->compilingClass->isolate->TheModule == Jnjvm::bootstrapVM->TheModule && - classDef->isArray && classDef->isolate != Jnjvm::bootstrapVM) { - // We know the array class can belong to bootstrap - CommonClass* cl = Jnjvm::bootstrapVM->constructArray(classDef->name, 0); - return cl->isolate->TheModule->getClassInfo(cl)->getVar(jit); - } -#endif - - Constant* cons = - ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, - uint64_t (classDef)), - JavaRuntime::JavaClassType); - - varGV = new GlobalVariable(JavaRuntime::JavaClassType, true, - GlobalValue::ExternalLinkage, - cons, "", - classDef->isolate->TheModule); - } - return new LoadInst(varGV, "", jit->currentBlock); -} - -Value* LLVMCommonClassInfo::getDelegatee(JavaJIT* jit) { -#ifndef MULTIPLE_VM - if (!delegateeGV) { - JavaObject* obj = classDef->getClassDelegatee(); - Constant* cons = - ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64(obj)), - JavaRuntime::JavaObjectType); - delegateeGV = new GlobalVariable(JavaRuntime::JavaObjectType, true, - GlobalValue::ExternalLinkage, - cons, "", - classDef->isolate->TheModule); - } - return new LoadInst(delegateeGV, "", jit->currentBlock); -#else - Value* ld = getVar(jit); - return llvm::CallInst::Create(JavaRuntime::GetClassDelegateeFunction, ld, "", - jit->currentBlock); -#endif -} - -#ifndef WITHOUT_VTABLE -VirtualTable* JavaRuntime::allocateVT(Class* cl, - CommonClass::method_iterator meths) { - if (meths == cl->virtualMethods.end()) { - uint64 size = cl->virtualTableSize; - VirtualTable* VT = (VirtualTable*)malloc(size * sizeof(void*)); - if (!VT) JavaThread::get()->isolate->outOfMemoryError(size * sizeof(void*)); - if (cl->super) { - Class* super = (Class*)cl->super; - assert(cl->virtualTableSize >= cl->super->virtualTableSize && - "Super VT bigger than own VT"); - assert(super->virtualVT && "Super does not have a VT!"); - memcpy(VT, super->virtualVT, cl->super->virtualTableSize * sizeof(void*)); - } else { - memcpy(VT, JavaObject::VT, VT_SIZE); - } - return VT; - } else { - JavaMethod* meth = meths->second; - VirtualTable* VT = 0; - if (meth->name->equals(Jnjvm::finalize)) { - VT = allocateVT(cl, ++meths); - meth->offset = 0; - Function* func = cl->isolate->TheModuleProvider->parseFunction(meth); - if (!cl->super) meth->canBeInlined = true; - Function::iterator BB = func->begin(); - BasicBlock::iterator I = BB->begin(); - if (isa(I)) { - ((void**)VT)[0] = 0; - } else { - ExecutionEngine* EE = mvm::jit::executionEngine; - // LLVM does not allow recursive compilation. Create the code now. - ((void**)VT)[0] = EE->getPointerToFunction(func); - } - } else { - - JavaMethod* parent = cl->super? - cl->super->lookupMethodDontThrow(meth->name, meth->type, false, true) : - 0; - - uint64_t offset = 0; - if (!parent) { - offset = cl->virtualTableSize++; - meth->offset = offset; - } else { - offset = parent->offset; - meth->offset = parent->offset; - } - VT = allocateVT(cl, ++meths); - LLVMMethodInfo* LMI = getMethodInfo(meth); - Function* func = LMI->getMethod(); - ExecutionEngine* EE = mvm::jit::executionEngine; - ((void**)VT)[offset] = EE->getPointerToFunctionOrStub(func); - } - - return VT; - } -} -#endif - - -VirtualTable* JavaRuntime::makeVT(Class* cl, bool stat) { - - VirtualTable* res = 0; -#ifndef WITHOUT_VTABLE - if (stat) { -#endif - res = (VirtualTable*)malloc(VT_SIZE); - memcpy(res, JavaObject::VT, VT_SIZE); -#ifndef WITHOUT_VTABLE - } else { - res = allocateVT(cl, cl->virtualMethods.begin()); - - if (!(cl->super)) { - // 12 = number of virtual methods in java/lang/Object (!!!) - uint32 size = 12 * sizeof(void*); -#define COPY(CLASS) \ - memcpy((void*)((unsigned)CLASS::VT + VT_SIZE), \ - (void*)((unsigned)res + VT_SIZE), size); - - COPY(JavaObject) - COPY(ArrayUInt8) - COPY(ArraySInt8) - COPY(ArrayUInt16) - COPY(ArraySInt16) - COPY(ArrayUInt32) - COPY(ArraySInt32) - COPY(ArrayLong) - COPY(ArrayFloat) - COPY(ArrayDouble) - COPY(UTF8) - COPY(ArrayObject) - -#undef COPY - } - } -#endif - - - -#ifdef WITH_TRACER - LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); - const Type* type = stat ? LCI->getStaticType() : LCI->getVirtualType(); - CommonClass::field_map fields = stat ? cl->staticFields : cl->virtualFields; - - Function* func = Function::Create(JavaRuntime::MarkAndTraceType, - GlobalValue::ExternalLinkage, - "markAndTraceObject", - cl->isolate->TheModule); - - Constant* zero = mvm::jit::constantZero; - Argument* arg = func->arg_begin(); - BasicBlock* block = BasicBlock::Create("", func); - llvm::Value* realArg = new BitCastInst(arg, type, "", block); - -#ifdef MULTIPLE_GC - Value* GC = ++func->arg_begin(); - std::vector Args; - Args.push_back(arg); - Args.push_back(GC); - if (stat || cl->super == 0) { - CallInst::Create(JavaRuntime::JavaObjectTracer, Args.begin(), Args.end(), - "", block); - } else { - CallInst::Create(((Class*)cl->super)->virtualTracer, Args.begin(), - Args.end(), "", block); - } -#else - if (stat || cl->super == 0) { - CallInst::Create(JavaRuntime::JavaObjectTracerFunction, arg, "", block); - } else { - LLVMClassInfo* LCP = (LLVMClassInfo*)getClassInfo((Class*)(cl->super)); - CallInst::Create(LCP->getVirtualTracer(), arg, "", block); - } -#endif - - for (CommonClass::field_iterator i = fields.begin(), e = fields.end(); - i!= e; ++i) { - if (i->second->getSignature()->funcs->doTrace) { - LLVMFieldInfo* LFI = getFieldInfo(i->second); - std::vector args; //size = 2 - args.push_back(zero); - args.push_back(LFI->getOffset()); - Value* ptr = GetElementPtrInst::Create(realArg, args.begin(), args.end(), - "",block); - Value* val = new LoadInst(ptr, "", block); - Value* valCast = new BitCastInst(val, JavaRuntime::JavaObjectType, "", - block); -#ifdef MULTIPLE_GC - std::vector Args; - Args.push_back(valCast); - Args.push_back(GC); - CallInst::Create(JavaRuntime::MarkAndTraceFunction, Args.begin(), - Args.end(), "", block); -#else - CallInst::Create(JavaRuntime::MarkAndTraceFunction, valCast, "", block); -#endif - } - } - - ReturnInst::Create(block); - - void* codePtr = mvm::jit::executionEngine->getPointerToGlobal(func); - ((void**)res)[VT_TRACER_OFFSET] = codePtr; - - if (!stat) { - LCI->virtualTracerFunction = func; - } else { - LCI->staticTracerFunction = func; - } -#endif - return res; -} - - -const Type* LLVMClassInfo::getVirtualType() { - if (!virtualType) { - std::vector fields; - JavaField** array = - (JavaField**)alloca(sizeof(JavaField*) * classDef->virtualFields.size()); - - if (classDef->super) { - LLVMClassInfo* CLI = - (LLVMClassInfo*)JavaRuntime::getClassInfo(classDef->super); - fields.push_back(CLI->getVirtualType()->getContainedType(0)); - } else { - fields.push_back(JavaRuntime::JavaObjectType->getContainedType(0)); - } - - for (CommonClass::field_iterator i = classDef->virtualFields.begin(), - e = classDef->virtualFields.end(); i!= e; ++i) { - JavaField* field = i->second; - array[field->num] = field; - } - - - for (uint32 index = 0; index < classDef->virtualFields.size(); ++index) { - uint8 id = array[index]->getSignature()->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - fields.push_back(LAI.llvmType); - } - - StructType* structType = StructType::get(fields, false); - virtualType = PointerType::getUnqual(structType); - const TargetData* targetData = mvm::jit::executionEngine->getTargetData(); - const StructLayout* sl = targetData->getStructLayout(structType); - - for (CommonClass::field_iterator i = classDef->virtualFields.begin(), - e = classDef->virtualFields.end(); i!= e; ++i) { - JavaField* field = i->second; - field->ptrOffset = sl->getElementOffset(field->num + 1); - } - - VirtualTable* VT = JavaRuntime::makeVT((Class*)classDef, false); - - uint64 size = mvm::jit::getTypeSize(structType); - classDef->virtualSize = (uint32)size; - classDef->virtualVT = VT; - virtualSizeConstant = ConstantInt::get(Type::Int32Ty, size); - - } - - return virtualType; -} - -const Type* LLVMClassInfo::getStaticType() { - - if (!staticType) { - Class* cl = (Class*)classDef; - std::vector fields; - JavaField** array = (JavaField**) - alloca(sizeof(JavaField*) * (classDef->staticFields.size() + 1)); - fields.push_back(JavaRuntime::JavaObjectType->getContainedType(0)); - - for (CommonClass::field_iterator i = classDef->staticFields.begin(), - e = classDef->staticFields.end(); i!= e; ++i) { - JavaField* field = i->second; - array[field->num] = field; - } - - for (uint32 index = 0; index < classDef->staticFields.size(); ++index) { - JavaField* field = array[index]; - uint8 id = field->getSignature()->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - fields.push_back(LAI.llvmType); - } - - StructType* structType = StructType::get(fields, false); - staticType = PointerType::getUnqual(structType); - const TargetData* targetData = mvm::jit::executionEngine->getTargetData(); - const StructLayout* sl = targetData->getStructLayout(structType); - - for (CommonClass::field_iterator i = classDef->staticFields.begin(), - e = classDef->staticFields.end(); i!= e; ++i) { - JavaField* field = i->second; - field->ptrOffset = sl->getElementOffset(field->num + 1); - } - - - VirtualTable* VT = JavaRuntime::makeVT((Class*)classDef, true); - - uint64 size = mvm::jit::getTypeSize(structType); - cl->staticSize = size; - cl->staticVT = VT; - -#ifndef MULTIPLE_VM - JavaObject* val = - (JavaObject*)classDef->isolate->allocateObject(cl->staticSize, - cl->staticVT); - val->initialise(classDef); - for (CommonClass::field_iterator i = cl->staticFields.begin(), - e = cl->staticFields.end(); i!= e; ++i) { - - i->second->initField(val); - } - - cl->_staticInstance = val; -#endif - } - return staticType; -} - -Value* LLVMClassInfo::getStaticVar(JavaJIT* jit) { -#ifndef MULTIPLE_VM - if (!staticVarGV) { - getStaticType(); - JavaObject* obj = ((Class*)classDef)->staticInstance(); - Constant* cons = - ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, - uint64_t (obj)), JavaRuntime::JavaObjectType); - - staticVarGV = new GlobalVariable(JavaRuntime::JavaObjectType, true, - GlobalValue::ExternalLinkage, - cons, "", - classDef->isolate->TheModule); - } - - return new LoadInst(staticVarGV, "", jit->currentBlock); - -#else - Value* ld = getVar(jit); - ld = jit->invoke(JavaRuntime::InitialisationCheckFunction, ld, "", - jit->currentBlock); - return jit->invoke(JavaRuntime::GetStaticInstanceFunction, ld, - jit->isolateLocal, "", jit->currentBlock); -#endif -} - -Value* LLVMClassInfo::getVirtualTable(JavaJIT* jit) { - if (!virtualTableGV) { - getVirtualType(); - Constant* cons = - ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, - uint64_t(classDef->virtualVT)), - JavaRuntime::VTType); - virtualTableGV = new GlobalVariable(JavaRuntime::VTType, true, - GlobalValue::ExternalLinkage, - cons, "", - classDef->isolate->TheModule); - } - return new LoadInst(virtualTableGV, "", jit->currentBlock); -} - -Value* LLVMClassInfo::getVirtualSize(JavaJIT* jit) { - if (!virtualSizeConstant) { - getVirtualType(); - virtualSizeConstant = - ConstantInt::get(Type::Int32Ty, classDef->virtualSize); - } - return virtualSizeConstant; -} - -Function* LLVMClassInfo::getStaticTracer() { - if (!staticTracerFunction) { - getStaticType(); - } - return staticTracerFunction; -} - -Function* LLVMClassInfo::getVirtualTracer() { - if (!virtualTracerFunction) { - getVirtualType(); - } - return virtualTracerFunction; -} - -Function* LLVMMethodInfo::getMethod() { - if (!methodFunction) { - Jnjvm* vm = methodDef->classDef->isolate; - methodFunction = Function::Create(getFunctionType(), - GlobalValue::GhostLinkage, - methodDef->printString(), - vm->TheModule); - vm->TheModuleProvider->addFunction(methodFunction, methodDef); - } - return methodFunction; -} - -const FunctionType* LLVMMethodInfo::getFunctionType() { - if (!functionType) { - LLVMSignatureInfo* LSI = JavaRuntime::getSignatureInfo(methodDef->getSignature()); - assert(LSI); - if (isStatic(methodDef->access)) { - functionType = LSI->getStaticType(); - } else { - functionType = LSI->getVirtualType(); - } - } - return functionType; -} - -ConstantInt* LLVMMethodInfo::getOffset() { - if (!offsetConstant) { - JavaRuntime::resolveVirtualClass(methodDef->classDef); - offsetConstant = ConstantInt::get(Type::Int32Ty, methodDef->offset); - } - return offsetConstant; -} - -ConstantInt* LLVMFieldInfo::getOffset() { - if (!offsetConstant) { - if (isStatic(fieldDef->access)) { - JavaRuntime::resolveStaticClass(fieldDef->classDef); - } else { - JavaRuntime::resolveVirtualClass(fieldDef->classDef); - } - // Increment by one because zero is JavaObject - offsetConstant = ConstantInt::get(Type::Int32Ty, fieldDef->num + 1); - } - return offsetConstant; -} - -const llvm::FunctionType* LLVMSignatureInfo::getVirtualType() { - if (!virtualType) { - // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - std::vector llvmArgs; - unsigned int size = signature->args.size(); - - llvmArgs.push_back(JavaRuntime::JavaObjectType); - - for (uint32 i = 0; i < size; ++i) { - uint8 id = signature->args.at(i)->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - llvmArgs.push_back(LAI.llvmType); - } - -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) - llvmArgs.push_back(mvm::jit::ptrType); // domain -#endif - - uint8 id = signature->ret->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - virtualType = FunctionType::get(LAI.llvmType, llvmArgs, false); - } - return virtualType; -} - -const llvm::FunctionType* LLVMSignatureInfo::getStaticType() { - if (!staticType) { - // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - std::vector llvmArgs; - unsigned int size = signature->args.size(); - - for (uint32 i = 0; i < size; ++i) { - uint8 id = signature->args.at(i)->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - llvmArgs.push_back(LAI.llvmType); - } - -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) - llvmArgs.push_back(mvm::jit::ptrType); // domain -#endif - - uint8 id = signature->ret->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - staticType = FunctionType::get(LAI.llvmType, llvmArgs, false); - } - return staticType; -} - -const llvm::FunctionType* LLVMSignatureInfo::getNativeType() { - if (!nativeType) { - // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - std::vector llvmArgs; - unsigned int size = signature->args.size(); - - llvmArgs.push_back(mvm::jit::ptrType); // JNIEnv - llvmArgs.push_back(JavaRuntime::JavaObjectType); // Class - - for (uint32 i = 0; i < size; ++i) { - uint8 id = signature->args.at(i)->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - llvmArgs.push_back(LAI.llvmType); - } - -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) - llvmArgs.push_back(mvm::jit::ptrType); // domain -#endif - - uint8 id = signature->ret->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - nativeType = FunctionType::get(LAI.llvmType, llvmArgs, false); - } - return nativeType; -} - - -Function* LLVMSignatureInfo::createFunctionCallBuf(bool virt) { - - ConstantInt* CI = mvm::jit::constantZero; - std::vector Args; - - Function* res = Function::Create(virt ? getVirtualBufType() : - getStaticBufType(), - GlobalValue::ExternalLinkage, - signature->printString(), - signature->isolate->TheModule); - - BasicBlock* currentBlock = BasicBlock::Create("enter", res); - Function::arg_iterator i = res->arg_begin(); - Value *obj, *ptr, *func; -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) - Value* vm = i; -#endif - ++i; - func = i; - ++i; - if (virt) { - obj = i; - ++i; - Args.push_back(obj); - } - ptr = i; - - for (std::vector::iterator i = signature->args.begin(), - e = signature->args.end(); i!= e; ++i) { - - const AssessorDesc* funcs = (*i)->funcs; - ptr = GetElementPtrInst::Create(ptr, CI, "", currentBlock); - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[funcs->numId]; - Value* val = new BitCastInst(ptr, LAI.llvmTypePtr, "", currentBlock); - Value* arg = new LoadInst(val, "", currentBlock); - Args.push_back(arg); - if (funcs == AssessorDesc::dLong || funcs == AssessorDesc::dDouble) { - CI = mvm::jit::constantTwo; - } else { - CI = mvm::jit::constantOne; - } - } - -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) - Args.push_back(vm); -#endif - - Value* val = CallInst::Create(func, Args.begin(), Args.end(), "", currentBlock); - if (signature->ret->funcs != AssessorDesc::dVoid) - ReturnInst::Create(val, currentBlock); - else - ReturnInst::Create(currentBlock); - - return res; -} - -Function* LLVMSignatureInfo::createFunctionCallAP(bool virt) { - - std::vector Args; - - Function* res = Function::Create(virt ? getVirtualBufType() : - getStaticBufType(), - GlobalValue::ExternalLinkage, - signature->printString(), - signature->isolate->TheModule); - - BasicBlock* currentBlock = BasicBlock::Create("enter", res); - Function::arg_iterator i = res->arg_begin(); - Value *obj, *ap, *func; -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) - Value* vm = i; -#endif - ++i; - func = i; - ++i; - if (virt) { - obj = i; - Args.push_back(obj); - ++i; - } - ap = i; - - for (std::vector::iterator i = signature->args.begin(), - e = signature->args.end(); i!= e; i++) { - - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[(*i)->funcs->numId]; - Args.push_back(new VAArgInst(ap, LAI.llvmType, "", currentBlock)); - } - -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) - Args.push_back(vm); -#endif - - Value* val = CallInst::Create(func, Args.begin(), Args.end(), "", currentBlock); - if (signature->ret->funcs != AssessorDesc::dVoid) - ReturnInst::Create(val, currentBlock); - else - ReturnInst::Create(currentBlock); - - return res; -} - -const PointerType* LLVMSignatureInfo::getStaticPtrType() { - if (!staticPtrType) { - staticPtrType = PointerType::getUnqual(getStaticType()); - } - return staticPtrType; -} - -const PointerType* LLVMSignatureInfo::getVirtualPtrType() { - if (!virtualPtrType) { - virtualPtrType = PointerType::getUnqual(getVirtualType()); - } - return virtualPtrType; -} - -const PointerType* LLVMSignatureInfo::getNativePtrType() { - if (!nativePtrType) { - nativePtrType = PointerType::getUnqual(getNativeType()); - } - return nativePtrType; -} - - -const FunctionType* LLVMSignatureInfo::getVirtualBufType() { - if (!virtualBufType) { - // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - std::vector Args2; - Args2.push_back(mvm::jit::ptrType); // vm - Args2.push_back(getVirtualPtrType()); - Args2.push_back(JavaRuntime::JavaObjectType); - Args2.push_back(PointerType::getUnqual(Type::Int32Ty)); - uint8 id = signature->ret->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - virtualBufType = FunctionType::get(LAI.llvmType, Args2, false); - } - return virtualBufType; -} - -const FunctionType* LLVMSignatureInfo::getStaticBufType() { - if (!staticBufType) { - // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - std::vector Args; - Args.push_back(mvm::jit::ptrType); // vm - Args.push_back(getStaticPtrType()); - Args.push_back(PointerType::getUnqual(Type::Int32Ty)); - uint8 id = signature->ret->funcs->numId; - LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; - staticBufType = FunctionType::get(LAI.llvmType, Args, false); - } - return staticBufType; -} - -Function* LLVMSignatureInfo::getVirtualBuf() { - if (!virtualBufFunction) { - // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - virtualBufFunction = createFunctionCallBuf(true); - signature->setVirtualCallBuf((intptr_t) - mvm::jit::executionEngine->getPointerToGlobal(virtualBufFunction)); - } - return virtualBufFunction; -} - -Function* LLVMSignatureInfo::getVirtualAP() { - if (!virtualAPFunction) { - // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - virtualAPFunction = createFunctionCallAP(true); - signature->setVirtualCallAP((intptr_t) - mvm::jit::executionEngine->getPointerToGlobal(virtualAPFunction)); - } - return virtualAPFunction; -} - -Function* LLVMSignatureInfo::getStaticBuf() { - if (!staticBufFunction) { - // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - staticBufFunction = createFunctionCallBuf(false); - signature->setStaticCallBuf((intptr_t) - mvm::jit::executionEngine->getPointerToGlobal(staticBufFunction)); - } - return staticBufFunction; -} - -Function* LLVMSignatureInfo::getStaticAP() { - if (!staticAPFunction) { - // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - staticAPFunction = createFunctionCallAP(false); - signature->setStaticCallAP((intptr_t) - mvm::jit::executionEngine->getPointerToGlobal(staticAPFunction)); - } - return staticAPFunction; -} - -void JavaRuntime::resolveVirtualClass(Class* cl) { - // Lock here because we may be called by a class resolver - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); - LCI->getVirtualType(); -} - -void JavaRuntime::resolveStaticClass(Class* cl) { - // Lock here because we may be called by a class initializer - llvm::MutexGuard locked(mvm::jit::executionEngine->lock); - LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); - LCI->getStaticType(); -} - -#ifdef SERVICE_VM -Value* LLVMServiceInfo::getDelegatee(JavaJIT* jit) { - if (!delegateeGV) { - Constant* cons = - ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64(vm)), - mvm::jit::ptrType); - delegateeGV = new GlobalVariable(mvm::jit::ptrType, true, - GlobalValue::ExternalLinkage, - cons, "", - vm->module); - } - return new LoadInst(delegateeGV, "", jit->currentBlock); -} - -#endif - - -namespace jnjvm { - namespace llvm_runtime { - #include "LLVMRuntime.inc" - } -} - -void JavaRuntime::initialise(llvm::Module* module) { - - jnjvm::llvm_runtime::makeLLVMModuleContents(module); - - VTType = module->getTypeByName("VT"); - - JavaObjectType = - PointerType::getUnqual(module->getTypeByName("JavaObject")); - - JavaArrayType = - PointerType::getUnqual(module->getTypeByName("JavaArray")); - - JavaClassType = - PointerType::getUnqual(module->getTypeByName("JavaClass")); - - JavaArrayUInt8Type = - PointerType::getUnqual(module->getTypeByName("ArrayUInt8")); - JavaArraySInt8Type = - PointerType::getUnqual(module->getTypeByName("ArraySInt8")); - JavaArrayUInt16Type = - PointerType::getUnqual(module->getTypeByName("ArrayUInt16")); - JavaArraySInt16Type = - PointerType::getUnqual(module->getTypeByName("ArraySInt16")); - JavaArrayUInt32Type = - PointerType::getUnqual(module->getTypeByName("ArrayUInt32")); - JavaArraySInt32Type = - PointerType::getUnqual(module->getTypeByName("ArraySInt32")); - JavaArrayLongType = - PointerType::getUnqual(module->getTypeByName("ArrayLong")); - JavaArrayFloatType = - PointerType::getUnqual(module->getTypeByName("ArrayFloat")); - JavaArrayDoubleType = - PointerType::getUnqual(module->getTypeByName("ArrayDouble")); - JavaArrayObjectType = - PointerType::getUnqual(module->getTypeByName("ArrayObject")); - - CacheNodeType = - PointerType::getUnqual(module->getTypeByName("CacheNode")); - - EnveloppeType = - PointerType::getUnqual(module->getTypeByName("Enveloppe")); - - InterfaceLookupFunction = module->getFunction("jnjvmVirtualLookup"); - MultiCallNewFunction = module->getFunction("multiCallNew"); - InitialisationCheckFunction = module->getFunction("initialisationCheck"); - ForceInitialisationCheckFunction = - module->getFunction("forceInitialisationCheck"); - - ArrayLengthFunction = module->getFunction("arrayLength"); - GetVTFunction = module->getFunction("getVT"); - GetClassFunction = module->getFunction("getClass"); - ClassLookupFunction = module->getFunction("newLookup"); - GetVTFromClassFunction = module->getFunction("getVTFromClass"); - GetObjectSizeFromClassFunction = module->getFunction("getObjectSizeFromClass"); - - GetClassDelegateeFunction = module->getFunction("getClassDelegatee"); - InstanceOfFunction = module->getFunction("instanceOf"); - IsAssignableFromFunction = module->getFunction("isAssignableFrom"); - ImplementsFunction = module->getFunction("implements"); - InstantiationOfArrayFunction = module->getFunction("instantiationOfArray"); - GetDepthFunction = module->getFunction("getDepth"); - GetDisplayFunction = module->getFunction("getDisplay"); - GetClassInDisplayFunction = module->getFunction("getClassInDisplay"); - AquireObjectFunction = module->getFunction("JavaObjectAquire"); - ReleaseObjectFunction = module->getFunction("JavaObjectRelease"); - OverflowThinLockFunction = module->getFunction("overflowThinLock"); - - FieldLookupFunction = module->getFunction("fieldLookup"); - - GetExceptionFunction = module->getFunction("JavaThreadGetException"); - GetJavaExceptionFunction = module->getFunction("JavaThreadGetJavaException"); - CompareExceptionFunction = module->getFunction("JavaThreadCompareException"); - JniProceedPendingExceptionFunction = - module->getFunction("jniProceedPendingException"); - GetSJLJBufferFunction = module->getFunction("getSJLJBuffer"); - - NullPointerExceptionFunction = module->getFunction("jnjvmNullPointerException"); - ClassCastExceptionFunction = module->getFunction("jnjvmClassCastException"); - IndexOutOfBoundsExceptionFunction = - module->getFunction("indexOutOfBoundsException"); - NegativeArraySizeExceptionFunction = - module->getFunction("negativeArraySizeException"); - OutOfMemoryErrorFunction = module->getFunction("outOfMemoryError"); - - JavaObjectAllocateFunction = module->getFunction("gcmalloc"); - - PrintExecutionFunction = module->getFunction("printExecution"); - PrintMethodStartFunction = module->getFunction("printMethodStart"); - PrintMethodEndFunction = module->getFunction("printMethodEnd"); - - ThrowExceptionFunction = module->getFunction("JavaThreadThrowException"); - - ClearExceptionFunction = module->getFunction("JavaThreadClearException"); - - -#ifdef MULTIPLE_VM - GetStaticInstanceFunction = module->getFunction("getStaticInstance"); - RuntimeUTF8ToStrFunction = module->getFunction("runtimeUTF8ToStr"); -#endif - -#ifdef SERVICE_VM - AquireObjectInSharedDomainFunction = - module->getFunction("JavaObjectAquireInSharedDomain"); - ReleaseObjectInSharedDomainfunction = - module->getFunction("JavaObjectReleaseInSharedDomain"); - ServiceCallStartFunction = module->getFunction("serviceCallStart"); - ServiceCallStopFunction = module->getFunction("serviceCallStop"); -#endif - -#ifdef WITH_TRACER - MarkAndTraceFunction = module->getFunction("MarkAndTrace"); - MarkAndTraceType = MarkAndTraceFunction->getFunctionType(); - JavaObjectTracerFunction = module->getFunction("JavaObjectTracer"); -#endif - -#ifndef WITHOUT_VTABLE - VirtualLookupFunction = module->getFunction("vtableLookup"); -#endif - -#ifdef MULTIPLE_GC - GetCollectorFunction = module->getFunction("getCollector"); -#endif - - GetThreadIDFunction = module->getFunction("getThreadID"); - GetLockFunction = module->getFunction("getLock"); - - UTF8NullConstant = Constant::getNullValue(JavaArrayUInt16Type); - JavaClassNullConstant = Constant::getNullValue(JavaClassType); - JavaObjectNullConstant = Constant::getNullValue(JavaRuntime::JavaObjectType); - MaxArraySizeConstant = ConstantInt::get(Type::Int32Ty, - JavaArray::MaxArraySize); - JavaObjectSizeConstant = ConstantInt::get(Type::Int32Ty, sizeof(JavaObject)); - - - Constant* cons = - ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, - uint64_t (JavaObject::VT)), VTType); - - JavaObjectVirtualTableGV = new GlobalVariable(VTType, true, - GlobalValue::ExternalLinkage, - cons, "", - module); - - cons = - ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, - uint64_t (ArrayObject::VT)), VTType); - - ArrayObjectVirtualTableGV = new GlobalVariable(VTType, true, - GlobalValue::ExternalLinkage, - cons, "", - module); - - JavaArrayElementsOffsetConstant = mvm::jit::constantTwo; - JavaArraySizeOffsetConstant = mvm::jit::constantOne; - JavaObjectLockOffsetConstant = mvm::jit::constantTwo; - JavaObjectClassOffsetConstant = mvm::jit::constantOne; - - OffsetObjectSizeInClassConstant = mvm::jit::constantOne; - OffsetVTInClassConstant = mvm::jit::constantTwo; - OffsetDisplayInClassConstant = mvm::jit::constantThree; - OffsetDepthInClassConstant = mvm::jit::constantFour; - - LLVMAssessorInfo::initialise(); -} - -void JavaRuntime::InitField(JavaField* field, JavaObject* obj, uint64 val) { - - const AssessorDesc* funcs = field->getSignature()->funcs; - if (funcs == AssessorDesc::dLong) { - ((sint64*)((uint64)obj + field->ptrOffset))[0] = val; - } else if (funcs == AssessorDesc::dInt) { - ((sint32*)((uint64)obj + field->ptrOffset))[0] = (sint32)val; - } else if (funcs == AssessorDesc::dChar) { - ((uint16*)((uint64)obj + field->ptrOffset))[0] = (uint16)val; - } else if (funcs == AssessorDesc::dShort) { - ((sint16*)((uint64)obj + field->ptrOffset))[0] = (sint16)val; - } else if (funcs == AssessorDesc::dByte) { - ((sint8*)((uint64)obj + field->ptrOffset))[0] = (sint8)val; - } else if (funcs == AssessorDesc::dBool) { - ((uint8*)((uint64)obj + field->ptrOffset))[0] = (uint8)val; - } else { - // 0 value for everything else - ((sint32*)((uint64)obj + field->ptrOffset))[0] = (sint32)val; - } -} - -void JavaRuntime::InitField(JavaField* field, JavaObject* obj, JavaObject* val) { - ((JavaObject**)((uint64)obj + field->ptrOffset))[0] = val; -} - -void JavaRuntime::InitField(JavaField* field, JavaObject* obj, double val) { - ((double*)((uint64)obj + field->ptrOffset))[0] = val; -} - -void JavaRuntime::InitField(JavaField* field, JavaObject* obj, float val) { - ((float*)((uint64)obj + field->ptrOffset))[0] = val; -} - -void JavaRuntime::setMethod(JavaMethod* meth, const char* name) { - llvm::Function* func = getMethodInfo(meth)->getMethod(); - func->setName(name); - func->setLinkage(llvm::GlobalValue::ExternalLinkage); -} - -void* JavaRuntime::getMethod(JavaMethod* meth) { - return getMethodInfo(meth)->getMethod(); -} - -void LLVMAssessorInfo::initialise() { - AssessorInfo[VOID_ID].llvmType = Type::VoidTy; - AssessorInfo[VOID_ID].llvmTypePtr = 0; - AssessorInfo[VOID_ID].llvmNullConstant = 0; - AssessorInfo[VOID_ID].sizeInBytesConstant = 0; - - AssessorInfo[BOOL_ID].llvmType = Type::Int8Ty; - AssessorInfo[BOOL_ID].llvmTypePtr = PointerType::getUnqual(Type::Int8Ty); - AssessorInfo[BOOL_ID].llvmNullConstant = - Constant::getNullValue(Type::Int8Ty); - AssessorInfo[BOOL_ID].sizeInBytesConstant = mvm::jit::constantOne; - - AssessorInfo[BYTE_ID].llvmType = Type::Int8Ty; - AssessorInfo[BYTE_ID].llvmTypePtr = PointerType::getUnqual(Type::Int8Ty); - AssessorInfo[BYTE_ID].llvmNullConstant = - Constant::getNullValue(Type::Int8Ty); - AssessorInfo[BYTE_ID].sizeInBytesConstant = mvm::jit::constantOne; - - AssessorInfo[SHORT_ID].llvmType = Type::Int16Ty; - AssessorInfo[SHORT_ID].llvmTypePtr = PointerType::getUnqual(Type::Int16Ty); - AssessorInfo[SHORT_ID].llvmNullConstant = - Constant::getNullValue(Type::Int16Ty); - AssessorInfo[SHORT_ID].sizeInBytesConstant = mvm::jit::constantTwo; - - AssessorInfo[CHAR_ID].llvmType = Type::Int16Ty; - AssessorInfo[CHAR_ID].llvmTypePtr = PointerType::getUnqual(Type::Int16Ty); - AssessorInfo[CHAR_ID].llvmNullConstant = - Constant::getNullValue(Type::Int16Ty); - AssessorInfo[CHAR_ID].sizeInBytesConstant = mvm::jit::constantTwo; - - AssessorInfo[INT_ID].llvmType = Type::Int32Ty; - AssessorInfo[INT_ID].llvmTypePtr = PointerType::getUnqual(Type::Int32Ty); - AssessorInfo[INT_ID].llvmNullConstant = - Constant::getNullValue(Type::Int32Ty); - AssessorInfo[INT_ID].sizeInBytesConstant = mvm::jit::constantFour; - - AssessorInfo[FLOAT_ID].llvmType = Type::FloatTy; - AssessorInfo[FLOAT_ID].llvmTypePtr = PointerType::getUnqual(Type::FloatTy); - AssessorInfo[FLOAT_ID].llvmNullConstant = - Constant::getNullValue(Type::FloatTy); - AssessorInfo[FLOAT_ID].sizeInBytesConstant = mvm::jit::constantFour; - - AssessorInfo[LONG_ID].llvmType = Type::Int64Ty; - AssessorInfo[LONG_ID].llvmTypePtr = PointerType::getUnqual(Type::Int64Ty); - AssessorInfo[LONG_ID].llvmNullConstant = - Constant::getNullValue(Type::Int64Ty); - AssessorInfo[LONG_ID].sizeInBytesConstant = mvm::jit::constantEight; - - AssessorInfo[DOUBLE_ID].llvmType = Type::DoubleTy; - AssessorInfo[DOUBLE_ID].llvmTypePtr = PointerType::getUnqual(Type::DoubleTy); - AssessorInfo[DOUBLE_ID].llvmNullConstant = - Constant::getNullValue(Type::DoubleTy); - AssessorInfo[DOUBLE_ID].sizeInBytesConstant = mvm::jit::constantEight; - - AssessorInfo[ARRAY_ID].llvmType = JavaRuntime::JavaObjectType; - AssessorInfo[ARRAY_ID].llvmTypePtr = - PointerType::getUnqual(JavaRuntime::JavaObjectType); - AssessorInfo[ARRAY_ID].llvmNullConstant = - JavaRuntime::JavaObjectNullConstant; - AssessorInfo[ARRAY_ID].sizeInBytesConstant = mvm::jit::constantPtrSize; - - AssessorInfo[OBJECT_ID].llvmType = JavaRuntime::JavaObjectType; - AssessorInfo[OBJECT_ID].llvmTypePtr = - PointerType::getUnqual(JavaRuntime::JavaObjectType); - AssessorInfo[OBJECT_ID].llvmNullConstant = - JavaRuntime::JavaObjectNullConstant; - AssessorInfo[OBJECT_ID].sizeInBytesConstant = mvm::jit::constantPtrSize; -} - -LLVMAssessorInfo LLVMAssessorInfo::AssessorInfo[NUM_ASSESSORS]; From nicolas.geoffray at lip6.fr Wed Aug 13 07:42:53 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 13 Aug 2008 14:42:53 -0000 Subject: [vmkit-commits] [vmkit] r54737 - /vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Message-ID: <200808131442.m7DEgrm5000410@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 13 09:42:52 2008 New Revision: 54737 URL: http://llvm.org/viewvc/llvm-project?rev=54737&view=rev Log: Restore the file. Added: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Added: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=54737&view=auto ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (added) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Wed Aug 13 09:42:52 2008 @@ -0,0 +1,357 @@ +//===-------------------- JavaRuntimeJIT.cpp ------------------------------===// +//=== ---- Runtime functions called by code compiled by the JIT -----------===// +// +// JnJVM +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include + +#include "mvm/JIT.h" +#include "mvm/Threads/Thread.h" + +#include "JavaArray.h" +#include "JavaCache.h" +#include "JavaClass.h" +#include "JavaConstantPool.h" +#include "JavaJIT.h" +#include "JavaString.h" +#include "JavaThread.h" +#include "JavaTypes.h" +#include "Jnjvm.h" +#include "LockedMap.h" + +#ifdef SERVICE_VM +#include "ServiceDomain.h" +#endif + +using namespace jnjvm; + +extern "C" JavaString* runtimeUTF8ToStr(const UTF8* val) { + Jnjvm* vm = JavaThread::get()->isolate; + return vm->UTF8ToStr(val); +} + +extern "C" void* jnjvmVirtualLookup(CacheNode* cache, JavaObject *obj) { + Enveloppe* enveloppe = cache->enveloppe; + JavaCtpInfo* ctpInfo = enveloppe->ctpInfo; + CommonClass* ocl = obj->classOf; + CommonClass* cl = 0; + const UTF8* utf8 = 0; + Signdef* sign = 0; + uint32 index = enveloppe->index; + + ctpInfo->resolveInterfaceOrMethod(index, cl, utf8, sign); + + enveloppe->cacheLock->lock(); + CacheNode* rcache = 0; + CacheNode* tmp = enveloppe->firstCache; + CacheNode* last = tmp; + + while (tmp) { + if (ocl == tmp->lastCible) { + rcache = tmp; + break; + } else { + last = tmp; + tmp = tmp->next; + } + } + + if (!rcache) { + JavaMethod* dmeth = ocl->lookupMethod(utf8, sign->keyName, false, true); + if (cache->methPtr) { + rcache = new CacheNode(enveloppe); + } else { + rcache = cache; + } + + rcache->methPtr = dmeth->compiledPtr(); + rcache->lastCible = (Class*)ocl; + + } + + if (enveloppe->firstCache != rcache) { + CacheNode *f = enveloppe->firstCache; + enveloppe->firstCache = rcache; + last->next = rcache->next; + rcache->next = f; + } + + enveloppe->cacheLock->unlock(); + + return rcache->methPtr; +} + +extern "C" void* fieldLookup(JavaObject* obj, Class* caller, uint32 index, + uint32 stat, void** ifStatic, uint32* offset) { + JavaCtpInfo* ctpInfo = caller->ctpInfo; + if (ctpInfo->ctpRes[index]) { + JavaField* field = (JavaField*)(ctpInfo->ctpRes[index]); + field->classDef->initialiseClass(); + if (stat) obj = field->classDef->staticInstance(); + void* ptr = (void*)(field->ptrOffset + (uint64)obj); +#ifndef MULTIPLE_VM + if (stat) *ifStatic = ptr; + *offset = (uint32)field->ptrOffset; +#endif + return ptr; + } + + CommonClass* cl = 0; + const UTF8* utf8 = 0; + Typedef* sign = 0; + + ctpInfo->resolveField(index, cl, utf8, sign); + + JavaField* field = cl->lookupField(utf8, sign->keyName, stat, true); + field->classDef->initialiseClass(); + + if (stat) obj = ((Class*)cl)->staticInstance(); + void* ptr = (void*)((uint64)obj + field->ptrOffset); + + ctpInfo->ctpRes[index] = field; +#ifndef MULTIPLE_VM + if (stat) *ifStatic = ptr; + *offset = (uint32)field->ptrOffset; +#endif + + return ptr; +} + +extern "C" void printMethodStart(JavaMethod* meth) { + printf("[%d] executing %s\n", mvm::Thread::self(), meth->printString()); + fflush(stdout); +} + +extern "C" void printMethodEnd(JavaMethod* meth) { + printf("[%d] return from %s\n", mvm::Thread::self(), meth->printString()); + fflush(stdout); +} + +extern "C" void printExecution(char* opcode, uint32 index, JavaMethod* meth) { + printf("[%d] executing %s %s at %d\n", mvm::Thread::self(), meth->printString(), + opcode, index); + fflush(stdout); +} + +extern "C" void jniProceedPendingException() { + JavaThread* th = JavaThread::get(); + jmp_buf* buf = th->sjlj_buffers.back(); + th->sjlj_buffers.pop_back(); + free(buf); + if (JavaThread::get()->pendingException) { + th->throwPendingException(); + } +} + +extern "C" void* getSJLJBuffer() { + JavaThread* th = JavaThread::get(); + void** buf = (void**)malloc(sizeof(jmp_buf)); + th->sjlj_buffers.push_back((jmp_buf*)buf); + return (void*)buf; +} + +extern "C" void jnjvmNullPointerException() { + JavaThread::get()->isolate->nullPointerException("null"); +} + +extern "C" void negativeArraySizeException(sint32 val) { + JavaThread::get()->isolate->negativeArraySizeException(val); +} + +extern "C" void outOfMemoryError(sint32 val) { + JavaThread::get()->isolate->outOfMemoryError(val); +} + +extern "C" void jnjvmClassCastException(JavaObject* obj, CommonClass* cl) { + JavaThread::get()->isolate->classCastException(""); +} + +extern "C" void indexOutOfBoundsException(JavaObject* obj, sint32 index) { + JavaThread::get()->isolate->indexOutOfBounds(obj, index); +} + +#ifdef MULTIPLE_VM +extern "C" JavaObject* getStaticInstance(Class* cl, Jnjvm* vm) { + std::pair* val = vm->statics->lookup(cl); + if (!val || !(val->second)) { + cl->initialiseClass(); + val = vm->statics->lookup(cl); + } + return val->second; +} +#endif + +extern "C" CommonClass* initialisationCheck(CommonClass* cl) { + cl->isolate->initialiseClass(cl); + return cl; +} + +extern "C" JavaObject* getClassDelegatee(CommonClass* cl) { +#ifdef MULTIPLE_VM + Jnjvm* vm = JavaThread::get()->isolate; +#else + Jnjvm* vm = cl->isolate; +#endif + return vm->getClassDelegatee(cl); +} + +extern "C" Class* newLookup(Class* caller, uint32 index, Class** toAlloc, + uint32 clinit) { + JavaCtpInfo* ctpInfo = caller->ctpInfo; + Class* cl = (Class*)ctpInfo->loadClass(index); + cl->resolveClass(clinit); + + *toAlloc = cl; + return cl; +} + +#ifndef WITHOUT_VTABLE +extern "C" uint32 vtableLookup(JavaObject* obj, Class* caller, uint32 index, + uint32* offset) { + CommonClass* cl = 0; + const UTF8* utf8 = 0; + Signdef* sign = 0; + + caller->ctpInfo->resolveInterfaceOrMethod(index, cl, utf8, sign); + JavaMethod* dmeth = cl->lookupMethodDontThrow(utf8, sign->keyName, false, + true); + if (!dmeth) { + // Arg, it should have been an invoke interface.... Perform the lookup + // on the object class and do not update offset. + dmeth = obj->classOf->lookupMethod(utf8, sign->keyName, false, true); + return dmeth->offset; + } + *offset = dmeth->offset; + return *offset; +} +#endif + + +static JavaArray* multiCallNewIntern(arrayCtor_t ctor, ClassArray* cl, + uint32 len, + sint32* dims, + Jnjvm* vm) { + if (len <= 0) JavaThread::get()->isolate->unknownError("Can not happen"); + JavaArray* _res = ctor(dims[0], cl, vm); + if (len > 1) { + ArrayObject* res = (ArrayObject*)_res; + CommonClass* _base = cl->baseClass(); + if (_base->isArray) { + ClassArray* base = (ClassArray*)_base; + AssessorDesc* func = base->funcs(); + arrayCtor_t newCtor = func->arrayCtor; + if (dims[0] > 0) { + for (sint32 i = 0; i < dims[0]; ++i) { + res->elements[i] = multiCallNewIntern(newCtor, base, (len - 1), + &dims[1], vm); + } + } else { + for (uint32 i = 1; i < len; ++i) { + sint32 p = dims[i]; + if (p < 0) JavaThread::get()->isolate->negativeArraySizeException(p); + } + } + } else { + JavaThread::get()->isolate->unknownError("Can not happen"); + } + } + return _res; +} + +extern "C" JavaArray* multiCallNew(ClassArray* cl, uint32 len, ...) { + va_list ap; + va_start(ap, len); + sint32* dims = (sint32*)alloca(sizeof(sint32) * len); + for (uint32 i = 0; i < len; ++i){ + dims[i] = va_arg(ap, int); + } +#ifdef MULTIPLE_VM + Jnjvm* vm = va_arg(ap, Jnjvm*); +#else + Jnjvm* vm = 0; +#endif + return multiCallNewIntern((arrayCtor_t)ArrayObject::acons, cl, len, dims, vm); +} + +extern "C" void JavaObjectAquire(JavaObject* obj) { +#ifdef SERVICE_VM + ServiceDomain* vm = (ServiceDomain*)JavaThread::get()->isolate; + if (!(vm->GC->isMyObject(obj))) { + vm->serviceError(vm, "I'm locking an object I don't own"); + } +#endif + obj->acquire(); +} + + +extern "C" void JavaObjectRelease(JavaObject* obj) { + verifyNull(obj); +#ifdef SERVICE_VM + ServiceDomain* vm = (ServiceDomain*)JavaThread::get()->isolate; + if (!(vm->GC->isMyObject(obj))) { + vm->serviceError(vm, "I'm unlocking an object I don't own"); + } +#endif + obj->release(); +} + +#ifdef SERVICE_VM +extern "C" void JavaObjectAquireInSharedDomain(JavaObject* obj) { + verifyNull(obj); + obj->acquire(); +} + +extern "C" void JavaObjectReleaseInSharedDomain(JavaObject* obj) { + verifyNull(obj); + obj->release(); +} +#endif + +extern "C" bool instanceOf(JavaObject* obj, CommonClass* cl) { + return obj->instanceOf(cl); +} + +extern "C" bool instantiationOfArray(CommonClass* cl1, ClassArray* cl2) { + return cl1->instantiationOfArray(cl2); +} + +extern "C" bool implements(CommonClass* cl1, CommonClass* cl2) { + return cl1->implements(cl2); +} + +extern "C" bool isAssignableFrom(CommonClass* cl1, CommonClass* cl2) { + return cl1->isAssignableFrom(cl2); +} + +extern "C" void* JavaThreadGetException() { + return JavaThread::getException(); +} + +extern "C" void JavaThreadThrowException(JavaObject* obj) { + return JavaThread::throwException(obj); +} + +extern "C" JavaObject* JavaThreadGetJavaException() { + return JavaThread::getJavaException(); +} + +extern "C" bool JavaThreadCompareException(Class* cl) { + return JavaThread::compareException(cl); +} + +extern "C" void JavaThreadClearException() { + return JavaThread::clearException(); +} + +extern "C" uint32 getThreadID() { + return JavaThread::get()->threadID; +} + +extern "C" void overflowThinLock(JavaObject* obj) { + obj->overflowThinlock(); +} From nicolas.geoffray at lip6.fr Wed Aug 13 07:45:37 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 13 Aug 2008 14:45:37 -0000 Subject: [vmkit-commits] [vmkit] r54738 - in /vmkit/trunk/lib/JnJVM/VMCore: JnjvmModule.cpp JnjvmModule.h Message-ID: <200808131445.m7DEjb0f000584@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 13 09:45:37 2008 New Revision: 54738 URL: http://llvm.org/viewvc/llvm-project?rev=54738&view=rev Log: Restore the files... Added: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Added: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=54738&view=auto ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (added) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Aug 13 09:45:37 2008 @@ -0,0 +1,1163 @@ +//===--------- JnjvmModule.cpp - Definition of a Jnjvm module -------------===// +// +// JnJVM +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/CallingConv.h" +#include "llvm/ParameterAttributes.h" +#include "llvm/Support/MutexGuard.h" + + +#include "mvm/JIT.h" + +#include "JavaJIT.h" +#include "JavaThread.h" +#include "JavaTypes.h" +#include "Jnjvm.h" +#include "JnjvmModule.h" +#include "JnjvmModuleProvider.h" +#include "LockedMap.h" + + +using namespace jnjvm; +using namespace llvm; + + +#ifdef WITH_TRACER +const llvm::FunctionType* JnjvmModule::MarkAndTraceType = 0; +#endif + +const llvm::Type* JnjvmModule::JavaObjectType = 0; +const llvm::Type* JnjvmModule::JavaArrayType = 0; +const llvm::Type* JnjvmModule::JavaArrayUInt8Type = 0; +const llvm::Type* JnjvmModule::JavaArraySInt8Type = 0; +const llvm::Type* JnjvmModule::JavaArrayUInt16Type = 0; +const llvm::Type* JnjvmModule::JavaArraySInt16Type = 0; +const llvm::Type* JnjvmModule::JavaArrayUInt32Type = 0; +const llvm::Type* JnjvmModule::JavaArraySInt32Type = 0; +const llvm::Type* JnjvmModule::JavaArrayFloatType = 0; +const llvm::Type* JnjvmModule::JavaArrayDoubleType = 0; +const llvm::Type* JnjvmModule::JavaArrayLongType = 0; +const llvm::Type* JnjvmModule::JavaArrayObjectType = 0; +const llvm::Type* JnjvmModule::CacheNodeType = 0; +const llvm::Type* JnjvmModule::EnveloppeType = 0; + +llvm::Constant* JnjvmModule::JavaObjectNullConstant; +llvm::Constant* JnjvmModule::UTF8NullConstant; +llvm::Constant* JnjvmModule::JavaClassNullConstant; +llvm::Constant* JnjvmModule::MaxArraySizeConstant; +llvm::Constant* JnjvmModule::JavaObjectSizeConstant; +llvm::GlobalVariable* JnjvmModule::JavaObjectVirtualTableGV; +llvm::GlobalVariable* JnjvmModule::ArrayObjectVirtualTableGV; +llvm::ConstantInt* JnjvmModule::OffsetObjectSizeInClassConstant; +llvm::ConstantInt* JnjvmModule::OffsetVTInClassConstant; +llvm::ConstantInt* JnjvmModule::OffsetDepthInClassConstant; +llvm::ConstantInt* JnjvmModule::OffsetDisplayInClassConstant; +const llvm::Type* JnjvmModule::JavaClassType; +const llvm::Type* JnjvmModule::VTType; +llvm::ConstantInt* JnjvmModule::JavaArrayElementsOffsetConstant; +llvm::ConstantInt* JnjvmModule::JavaArraySizeOffsetConstant; +llvm::ConstantInt* JnjvmModule::JavaObjectLockOffsetConstant; +llvm::ConstantInt* JnjvmModule::JavaObjectClassOffsetConstant; + +#ifdef WITH_TRACER +llvm::Function* JnjvmModule::MarkAndTraceFunction = 0; +llvm::Function* JnjvmModule::JavaObjectTracerFunction = 0; +#endif +llvm::Function* JnjvmModule::GetSJLJBufferFunction = 0; +llvm::Function* JnjvmModule::ThrowExceptionFunction = 0; +llvm::Function* JnjvmModule::GetExceptionFunction = 0; +llvm::Function* JnjvmModule::GetJavaExceptionFunction = 0; +llvm::Function* JnjvmModule::ClearExceptionFunction = 0; +llvm::Function* JnjvmModule::CompareExceptionFunction = 0; +llvm::Function* JnjvmModule::NullPointerExceptionFunction = 0; +llvm::Function* JnjvmModule::ClassCastExceptionFunction = 0; +llvm::Function* JnjvmModule::IndexOutOfBoundsExceptionFunction = 0; +llvm::Function* JnjvmModule::NegativeArraySizeExceptionFunction = 0; +llvm::Function* JnjvmModule::OutOfMemoryErrorFunction = 0; +llvm::Function* JnjvmModule::JavaObjectAllocateFunction = 0; +llvm::Function* JnjvmModule::InterfaceLookupFunction = 0; +llvm::Function* JnjvmModule::FieldLookupFunction = 0; +#ifndef WITHOUT_VTABLE +llvm::Function* JnjvmModule::VirtualLookupFunction = 0; +#endif +llvm::Function* JnjvmModule::PrintExecutionFunction = 0; +llvm::Function* JnjvmModule::PrintMethodStartFunction = 0; +llvm::Function* JnjvmModule::PrintMethodEndFunction = 0; +llvm::Function* JnjvmModule::JniProceedPendingExceptionFunction = 0; +llvm::Function* JnjvmModule::InitialisationCheckFunction = 0; +llvm::Function* JnjvmModule::ForceInitialisationCheckFunction = 0; +llvm::Function* JnjvmModule::ClassLookupFunction = 0; +llvm::Function* JnjvmModule::InstanceOfFunction = 0; +llvm::Function* JnjvmModule::IsAssignableFromFunction = 0; +llvm::Function* JnjvmModule::ImplementsFunction = 0; +llvm::Function* JnjvmModule::InstantiationOfArrayFunction = 0; +llvm::Function* JnjvmModule::GetDepthFunction = 0; +llvm::Function* JnjvmModule::GetDisplayFunction = 0; +llvm::Function* JnjvmModule::GetClassInDisplayFunction = 0; +llvm::Function* JnjvmModule::AquireObjectFunction = 0; +llvm::Function* JnjvmModule::ReleaseObjectFunction = 0; +llvm::Function* JnjvmModule::MultiCallNewFunction = 0; +llvm::Function* JnjvmModule::RuntimeUTF8ToStrFunction = 0; +llvm::Function* JnjvmModule::GetStaticInstanceFunction = 0; +llvm::Function* JnjvmModule::GetClassDelegateeFunction = 0; +llvm::Function* JnjvmModule::ArrayLengthFunction = 0; +llvm::Function* JnjvmModule::GetVTFunction = 0; +llvm::Function* JnjvmModule::GetClassFunction = 0; +llvm::Function* JnjvmModule::GetVTFromClassFunction = 0; +llvm::Function* JnjvmModule::GetObjectSizeFromClassFunction = 0; + +#ifdef MULTIPLE_GC +llvm::Function* JnjvmModule::GetCollectorFunction = 0; +#endif + +#ifdef SERVICE_VM +llvm::Function* JnjvmModule::AquireObjectInSharedDomainFunction = 0; +llvm::Function* JnjvmModule::ReleaseObjectInSharedDomainFunction = 0; +llvm::Function* JnjvmModule::ServiceCallStartFunction = 0; +llvm::Function* JnjvmModule::ServiceCallStopFunction = 0; +#endif + +llvm::Function* JnjvmModule::GetThreadIDFunction = 0; +llvm::Function* JnjvmModule::GetLockFunction = 0; +llvm::Function* JnjvmModule::OverflowThinLockFunction = 0; + + + +Value* LLVMCommonClassInfo::getVar(JavaJIT* jit) { + if (!varGV) { +#ifdef MULTIPLE_VM + if (jit->compilingClass->isolate->TheModule == Jnjvm::bootstrapVM->TheModule && + classDef->isArray && classDef->isolate != Jnjvm::bootstrapVM) { + // We know the array class can belong to bootstrap + CommonClass* cl = Jnjvm::bootstrapVM->constructArray(classDef->name, 0); + return cl->isolate->TheModule->getClassInfo(cl)->getVar(jit); + } +#endif + + Constant* cons = + ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, + uint64_t (classDef)), + JnjvmModule::JavaClassType); + + varGV = new GlobalVariable(JnjvmModule::JavaClassType, true, + GlobalValue::ExternalLinkage, + cons, "", + classDef->isolate->TheModule); + } + return new LoadInst(varGV, "", jit->currentBlock); +} + +Value* LLVMCommonClassInfo::getDelegatee(JavaJIT* jit) { +#ifndef MULTIPLE_VM + if (!delegateeGV) { + JavaObject* obj = classDef->getClassDelegatee(); + Constant* cons = + ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64(obj)), + JnjvmModule::JavaObjectType); + delegateeGV = new GlobalVariable(JnjvmModule::JavaObjectType, true, + GlobalValue::ExternalLinkage, + cons, "", + classDef->isolate->TheModule); + } + return new LoadInst(delegateeGV, "", jit->currentBlock); +#else + Value* ld = getVar(jit); + return llvm::CallInst::Create(JnjvmModule::GetClassDelegateeFunction, ld, "", + jit->currentBlock); +#endif +} + +#ifndef WITHOUT_VTABLE +VirtualTable* JnjvmModule::allocateVT(Class* cl, + CommonClass::method_iterator meths) { + if (meths == cl->virtualMethods.end()) { + uint64 size = cl->virtualTableSize; + VirtualTable* VT = (VirtualTable*)malloc(size * sizeof(void*)); + if (!VT) JavaThread::get()->isolate->outOfMemoryError(size * sizeof(void*)); + if (cl->super) { + Class* super = (Class*)cl->super; + assert(cl->virtualTableSize >= cl->super->virtualTableSize && + "Super VT bigger than own VT"); + assert(super->virtualVT && "Super does not have a VT!"); + memcpy(VT, super->virtualVT, cl->super->virtualTableSize * sizeof(void*)); + } else { + memcpy(VT, JavaObject::VT, VT_SIZE); + } + return VT; + } else { + JavaMethod* meth = meths->second; + VirtualTable* VT = 0; + if (meth->name->equals(Jnjvm::finalize)) { + VT = allocateVT(cl, ++meths); + meth->offset = 0; + Function* func = cl->isolate->TheModuleProvider->parseFunction(meth); + if (!cl->super) meth->canBeInlined = true; + Function::iterator BB = func->begin(); + BasicBlock::iterator I = BB->begin(); + if (isa(I)) { + ((void**)VT)[0] = 0; + } else { + ExecutionEngine* EE = mvm::jit::executionEngine; + // LLVM does not allow recursive compilation. Create the code now. + ((void**)VT)[0] = EE->getPointerToFunction(func); + } + } else { + + JavaMethod* parent = cl->super? + cl->super->lookupMethodDontThrow(meth->name, meth->type, false, true) : + 0; + + uint64_t offset = 0; + if (!parent) { + offset = cl->virtualTableSize++; + meth->offset = offset; + } else { + offset = parent->offset; + meth->offset = parent->offset; + } + VT = allocateVT(cl, ++meths); + LLVMMethodInfo* LMI = getMethodInfo(meth); + Function* func = LMI->getMethod(); + ExecutionEngine* EE = mvm::jit::executionEngine; + ((void**)VT)[offset] = EE->getPointerToFunctionOrStub(func); + } + + return VT; + } +} +#endif + + +VirtualTable* JnjvmModule::makeVT(Class* cl, bool stat) { + + VirtualTable* res = 0; +#ifndef WITHOUT_VTABLE + if (stat) { +#endif + res = (VirtualTable*)malloc(VT_SIZE); + memcpy(res, JavaObject::VT, VT_SIZE); +#ifndef WITHOUT_VTABLE + } else { + res = allocateVT(cl, cl->virtualMethods.begin()); + + if (!(cl->super)) { + // 12 = number of virtual methods in java/lang/Object (!!!) + uint32 size = 12 * sizeof(void*); +#define COPY(CLASS) \ + memcpy((void*)((unsigned)CLASS::VT + VT_SIZE), \ + (void*)((unsigned)res + VT_SIZE), size); + + COPY(JavaObject) + COPY(ArrayUInt8) + COPY(ArraySInt8) + COPY(ArrayUInt16) + COPY(ArraySInt16) + COPY(ArrayUInt32) + COPY(ArraySInt32) + COPY(ArrayLong) + COPY(ArrayFloat) + COPY(ArrayDouble) + COPY(UTF8) + COPY(ArrayObject) + +#undef COPY + } + } +#endif + + + +#ifdef WITH_TRACER + LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); + const Type* type = stat ? LCI->getStaticType() : LCI->getVirtualType(); + CommonClass::field_map fields = stat ? cl->staticFields : cl->virtualFields; + + Function* func = Function::Create(JnjvmModule::MarkAndTraceType, + GlobalValue::ExternalLinkage, + "markAndTraceObject", + cl->isolate->TheModule); + + Constant* zero = mvm::jit::constantZero; + Argument* arg = func->arg_begin(); + BasicBlock* block = BasicBlock::Create("", func); + llvm::Value* realArg = new BitCastInst(arg, type, "", block); + +#ifdef MULTIPLE_GC + Value* GC = ++func->arg_begin(); + std::vector Args; + Args.push_back(arg); + Args.push_back(GC); + if (stat || cl->super == 0) { + CallInst::Create(JnjvmModule::JavaObjectTracer, Args.begin(), Args.end(), + "", block); + } else { + CallInst::Create(((Class*)cl->super)->virtualTracer, Args.begin(), + Args.end(), "", block); + } +#else + if (stat || cl->super == 0) { + CallInst::Create(JnjvmModule::JavaObjectTracerFunction, arg, "", block); + } else { + LLVMClassInfo* LCP = (LLVMClassInfo*)getClassInfo((Class*)(cl->super)); + CallInst::Create(LCP->getVirtualTracer(), arg, "", block); + } +#endif + + for (CommonClass::field_iterator i = fields.begin(), e = fields.end(); + i!= e; ++i) { + if (i->second->getSignature()->funcs->doTrace) { + LLVMFieldInfo* LFI = getFieldInfo(i->second); + std::vector args; //size = 2 + args.push_back(zero); + args.push_back(LFI->getOffset()); + Value* ptr = GetElementPtrInst::Create(realArg, args.begin(), args.end(), + "",block); + Value* val = new LoadInst(ptr, "", block); + Value* valCast = new BitCastInst(val, JnjvmModule::JavaObjectType, "", + block); +#ifdef MULTIPLE_GC + std::vector Args; + Args.push_back(valCast); + Args.push_back(GC); + CallInst::Create(JnjvmModule::MarkAndTraceFunction, Args.begin(), + Args.end(), "", block); +#else + CallInst::Create(JnjvmModule::MarkAndTraceFunction, valCast, "", block); +#endif + } + } + + ReturnInst::Create(block); + + void* codePtr = mvm::jit::executionEngine->getPointerToGlobal(func); + ((void**)res)[VT_TRACER_OFFSET] = codePtr; + + if (!stat) { + LCI->virtualTracerFunction = func; + } else { + LCI->staticTracerFunction = func; + } +#endif + return res; +} + + +const Type* LLVMClassInfo::getVirtualType() { + if (!virtualType) { + std::vector fields; + JavaField** array = + (JavaField**)alloca(sizeof(JavaField*) * classDef->virtualFields.size()); + + if (classDef->super) { + LLVMClassInfo* CLI = + (LLVMClassInfo*)JnjvmModule::getClassInfo(classDef->super); + fields.push_back(CLI->getVirtualType()->getContainedType(0)); + } else { + fields.push_back(JnjvmModule::JavaObjectType->getContainedType(0)); + } + + for (CommonClass::field_iterator i = classDef->virtualFields.begin(), + e = classDef->virtualFields.end(); i!= e; ++i) { + JavaField* field = i->second; + array[field->num] = field; + } + + + for (uint32 index = 0; index < classDef->virtualFields.size(); ++index) { + uint8 id = array[index]->getSignature()->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + fields.push_back(LAI.llvmType); + } + + StructType* structType = StructType::get(fields, false); + virtualType = PointerType::getUnqual(structType); + const TargetData* targetData = mvm::jit::executionEngine->getTargetData(); + const StructLayout* sl = targetData->getStructLayout(structType); + + for (CommonClass::field_iterator i = classDef->virtualFields.begin(), + e = classDef->virtualFields.end(); i!= e; ++i) { + JavaField* field = i->second; + field->ptrOffset = sl->getElementOffset(field->num + 1); + } + + VirtualTable* VT = JnjvmModule::makeVT((Class*)classDef, false); + + uint64 size = mvm::jit::getTypeSize(structType); + classDef->virtualSize = (uint32)size; + classDef->virtualVT = VT; + virtualSizeConstant = ConstantInt::get(Type::Int32Ty, size); + + } + + return virtualType; +} + +const Type* LLVMClassInfo::getStaticType() { + + if (!staticType) { + Class* cl = (Class*)classDef; + std::vector fields; + JavaField** array = (JavaField**) + alloca(sizeof(JavaField*) * (classDef->staticFields.size() + 1)); + fields.push_back(JnjvmModule::JavaObjectType->getContainedType(0)); + + for (CommonClass::field_iterator i = classDef->staticFields.begin(), + e = classDef->staticFields.end(); i!= e; ++i) { + JavaField* field = i->second; + array[field->num] = field; + } + + for (uint32 index = 0; index < classDef->staticFields.size(); ++index) { + JavaField* field = array[index]; + uint8 id = field->getSignature()->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + fields.push_back(LAI.llvmType); + } + + StructType* structType = StructType::get(fields, false); + staticType = PointerType::getUnqual(structType); + const TargetData* targetData = mvm::jit::executionEngine->getTargetData(); + const StructLayout* sl = targetData->getStructLayout(structType); + + for (CommonClass::field_iterator i = classDef->staticFields.begin(), + e = classDef->staticFields.end(); i!= e; ++i) { + JavaField* field = i->second; + field->ptrOffset = sl->getElementOffset(field->num + 1); + } + + + VirtualTable* VT = JnjvmModule::makeVT((Class*)classDef, true); + + uint64 size = mvm::jit::getTypeSize(structType); + cl->staticSize = size; + cl->staticVT = VT; + +#ifndef MULTIPLE_VM + JavaObject* val = + (JavaObject*)classDef->isolate->allocateObject(cl->staticSize, + cl->staticVT); + val->initialise(classDef); + for (CommonClass::field_iterator i = cl->staticFields.begin(), + e = cl->staticFields.end(); i!= e; ++i) { + + i->second->initField(val); + } + + cl->_staticInstance = val; +#endif + } + return staticType; +} + +Value* LLVMClassInfo::getStaticVar(JavaJIT* jit) { +#ifndef MULTIPLE_VM + if (!staticVarGV) { + getStaticType(); + JavaObject* obj = ((Class*)classDef)->staticInstance(); + Constant* cons = + ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, + uint64_t (obj)), JnjvmModule::JavaObjectType); + + staticVarGV = new GlobalVariable(JnjvmModule::JavaObjectType, true, + GlobalValue::ExternalLinkage, + cons, "", + classDef->isolate->TheModule); + } + + return new LoadInst(staticVarGV, "", jit->currentBlock); + +#else + Value* ld = getVar(jit); + ld = jit->invoke(JnjvmModule::InitialisationCheckFunction, ld, "", + jit->currentBlock); + return jit->invoke(JnjvmModule::GetStaticInstanceFunction, ld, + jit->isolateLocal, "", jit->currentBlock); +#endif +} + +Value* LLVMClassInfo::getVirtualTable(JavaJIT* jit) { + if (!virtualTableGV) { + getVirtualType(); + Constant* cons = + ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, + uint64_t(classDef->virtualVT)), + JnjvmModule::VTType); + virtualTableGV = new GlobalVariable(JnjvmModule::VTType, true, + GlobalValue::ExternalLinkage, + cons, "", + classDef->isolate->TheModule); + } + return new LoadInst(virtualTableGV, "", jit->currentBlock); +} + +Value* LLVMClassInfo::getVirtualSize(JavaJIT* jit) { + if (!virtualSizeConstant) { + getVirtualType(); + virtualSizeConstant = + ConstantInt::get(Type::Int32Ty, classDef->virtualSize); + } + return virtualSizeConstant; +} + +Function* LLVMClassInfo::getStaticTracer() { + if (!staticTracerFunction) { + getStaticType(); + } + return staticTracerFunction; +} + +Function* LLVMClassInfo::getVirtualTracer() { + if (!virtualTracerFunction) { + getVirtualType(); + } + return virtualTracerFunction; +} + +Function* LLVMMethodInfo::getMethod() { + if (!methodFunction) { + Jnjvm* vm = methodDef->classDef->isolate; + methodFunction = Function::Create(getFunctionType(), + GlobalValue::GhostLinkage, + methodDef->printString(), + vm->TheModule); + vm->TheModuleProvider->addFunction(methodFunction, methodDef); + } + return methodFunction; +} + +const FunctionType* LLVMMethodInfo::getFunctionType() { + if (!functionType) { + LLVMSignatureInfo* LSI = JnjvmModule::getSignatureInfo(methodDef->getSignature()); + assert(LSI); + if (isStatic(methodDef->access)) { + functionType = LSI->getStaticType(); + } else { + functionType = LSI->getVirtualType(); + } + } + return functionType; +} + +ConstantInt* LLVMMethodInfo::getOffset() { + if (!offsetConstant) { + JnjvmModule::resolveVirtualClass(methodDef->classDef); + offsetConstant = ConstantInt::get(Type::Int32Ty, methodDef->offset); + } + return offsetConstant; +} + +ConstantInt* LLVMFieldInfo::getOffset() { + if (!offsetConstant) { + if (isStatic(fieldDef->access)) { + JnjvmModule::resolveStaticClass(fieldDef->classDef); + } else { + JnjvmModule::resolveVirtualClass(fieldDef->classDef); + } + // Increment by one because zero is JavaObject + offsetConstant = ConstantInt::get(Type::Int32Ty, fieldDef->num + 1); + } + return offsetConstant; +} + +const llvm::FunctionType* LLVMSignatureInfo::getVirtualType() { + if (!virtualType) { + // Lock here because we are called by arbitrary code + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + std::vector llvmArgs; + unsigned int size = signature->args.size(); + + llvmArgs.push_back(JnjvmModule::JavaObjectType); + + for (uint32 i = 0; i < size; ++i) { + uint8 id = signature->args.at(i)->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + llvmArgs.push_back(LAI.llvmType); + } + +#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) + llvmArgs.push_back(mvm::jit::ptrType); // domain +#endif + + uint8 id = signature->ret->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + virtualType = FunctionType::get(LAI.llvmType, llvmArgs, false); + } + return virtualType; +} + +const llvm::FunctionType* LLVMSignatureInfo::getStaticType() { + if (!staticType) { + // Lock here because we are called by arbitrary code + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + std::vector llvmArgs; + unsigned int size = signature->args.size(); + + for (uint32 i = 0; i < size; ++i) { + uint8 id = signature->args.at(i)->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + llvmArgs.push_back(LAI.llvmType); + } + +#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) + llvmArgs.push_back(mvm::jit::ptrType); // domain +#endif + + uint8 id = signature->ret->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + staticType = FunctionType::get(LAI.llvmType, llvmArgs, false); + } + return staticType; +} + +const llvm::FunctionType* LLVMSignatureInfo::getNativeType() { + if (!nativeType) { + // Lock here because we are called by arbitrary code + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + std::vector llvmArgs; + unsigned int size = signature->args.size(); + + llvmArgs.push_back(mvm::jit::ptrType); // JNIEnv + llvmArgs.push_back(JnjvmModule::JavaObjectType); // Class + + for (uint32 i = 0; i < size; ++i) { + uint8 id = signature->args.at(i)->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + llvmArgs.push_back(LAI.llvmType); + } + +#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) + llvmArgs.push_back(mvm::jit::ptrType); // domain +#endif + + uint8 id = signature->ret->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + nativeType = FunctionType::get(LAI.llvmType, llvmArgs, false); + } + return nativeType; +} + + +Function* LLVMSignatureInfo::createFunctionCallBuf(bool virt) { + + ConstantInt* CI = mvm::jit::constantZero; + std::vector Args; + + Function* res = Function::Create(virt ? getVirtualBufType() : + getStaticBufType(), + GlobalValue::ExternalLinkage, + signature->printString(), + signature->isolate->TheModule); + + BasicBlock* currentBlock = BasicBlock::Create("enter", res); + Function::arg_iterator i = res->arg_begin(); + Value *obj, *ptr, *func; +#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) + Value* vm = i; +#endif + ++i; + func = i; + ++i; + if (virt) { + obj = i; + ++i; + Args.push_back(obj); + } + ptr = i; + + for (std::vector::iterator i = signature->args.begin(), + e = signature->args.end(); i!= e; ++i) { + + const AssessorDesc* funcs = (*i)->funcs; + ptr = GetElementPtrInst::Create(ptr, CI, "", currentBlock); + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[funcs->numId]; + Value* val = new BitCastInst(ptr, LAI.llvmTypePtr, "", currentBlock); + Value* arg = new LoadInst(val, "", currentBlock); + Args.push_back(arg); + if (funcs == AssessorDesc::dLong || funcs == AssessorDesc::dDouble) { + CI = mvm::jit::constantTwo; + } else { + CI = mvm::jit::constantOne; + } + } + +#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) + Args.push_back(vm); +#endif + + Value* val = CallInst::Create(func, Args.begin(), Args.end(), "", currentBlock); + if (signature->ret->funcs != AssessorDesc::dVoid) + ReturnInst::Create(val, currentBlock); + else + ReturnInst::Create(currentBlock); + + return res; +} + +Function* LLVMSignatureInfo::createFunctionCallAP(bool virt) { + + std::vector Args; + + Function* res = Function::Create(virt ? getVirtualBufType() : + getStaticBufType(), + GlobalValue::ExternalLinkage, + signature->printString(), + signature->isolate->TheModule); + + BasicBlock* currentBlock = BasicBlock::Create("enter", res); + Function::arg_iterator i = res->arg_begin(); + Value *obj, *ap, *func; +#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) + Value* vm = i; +#endif + ++i; + func = i; + ++i; + if (virt) { + obj = i; + Args.push_back(obj); + ++i; + } + ap = i; + + for (std::vector::iterator i = signature->args.begin(), + e = signature->args.end(); i!= e; i++) { + + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[(*i)->funcs->numId]; + Args.push_back(new VAArgInst(ap, LAI.llvmType, "", currentBlock)); + } + +#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) + Args.push_back(vm); +#endif + + Value* val = CallInst::Create(func, Args.begin(), Args.end(), "", currentBlock); + if (signature->ret->funcs != AssessorDesc::dVoid) + ReturnInst::Create(val, currentBlock); + else + ReturnInst::Create(currentBlock); + + return res; +} + +const PointerType* LLVMSignatureInfo::getStaticPtrType() { + if (!staticPtrType) { + staticPtrType = PointerType::getUnqual(getStaticType()); + } + return staticPtrType; +} + +const PointerType* LLVMSignatureInfo::getVirtualPtrType() { + if (!virtualPtrType) { + virtualPtrType = PointerType::getUnqual(getVirtualType()); + } + return virtualPtrType; +} + +const PointerType* LLVMSignatureInfo::getNativePtrType() { + if (!nativePtrType) { + nativePtrType = PointerType::getUnqual(getNativeType()); + } + return nativePtrType; +} + + +const FunctionType* LLVMSignatureInfo::getVirtualBufType() { + if (!virtualBufType) { + // Lock here because we are called by arbitrary code + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + std::vector Args2; + Args2.push_back(mvm::jit::ptrType); // vm + Args2.push_back(getVirtualPtrType()); + Args2.push_back(JnjvmModule::JavaObjectType); + Args2.push_back(PointerType::getUnqual(Type::Int32Ty)); + uint8 id = signature->ret->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + virtualBufType = FunctionType::get(LAI.llvmType, Args2, false); + } + return virtualBufType; +} + +const FunctionType* LLVMSignatureInfo::getStaticBufType() { + if (!staticBufType) { + // Lock here because we are called by arbitrary code + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + std::vector Args; + Args.push_back(mvm::jit::ptrType); // vm + Args.push_back(getStaticPtrType()); + Args.push_back(PointerType::getUnqual(Type::Int32Ty)); + uint8 id = signature->ret->funcs->numId; + LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[id]; + staticBufType = FunctionType::get(LAI.llvmType, Args, false); + } + return staticBufType; +} + +Function* LLVMSignatureInfo::getVirtualBuf() { + if (!virtualBufFunction) { + // Lock here because we are called by arbitrary code + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + virtualBufFunction = createFunctionCallBuf(true); + signature->setVirtualCallBuf((intptr_t) + mvm::jit::executionEngine->getPointerToGlobal(virtualBufFunction)); + } + return virtualBufFunction; +} + +Function* LLVMSignatureInfo::getVirtualAP() { + if (!virtualAPFunction) { + // Lock here because we are called by arbitrary code + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + virtualAPFunction = createFunctionCallAP(true); + signature->setVirtualCallAP((intptr_t) + mvm::jit::executionEngine->getPointerToGlobal(virtualAPFunction)); + } + return virtualAPFunction; +} + +Function* LLVMSignatureInfo::getStaticBuf() { + if (!staticBufFunction) { + // Lock here because we are called by arbitrary code + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + staticBufFunction = createFunctionCallBuf(false); + signature->setStaticCallBuf((intptr_t) + mvm::jit::executionEngine->getPointerToGlobal(staticBufFunction)); + } + return staticBufFunction; +} + +Function* LLVMSignatureInfo::getStaticAP() { + if (!staticAPFunction) { + // Lock here because we are called by arbitrary code + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + staticAPFunction = createFunctionCallAP(false); + signature->setStaticCallAP((intptr_t) + mvm::jit::executionEngine->getPointerToGlobal(staticAPFunction)); + } + return staticAPFunction; +} + +void JnjvmModule::resolveVirtualClass(Class* cl) { + // Lock here because we may be called by a class resolver + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); + LCI->getVirtualType(); +} + +void JnjvmModule::resolveStaticClass(Class* cl) { + // Lock here because we may be called by a class initializer + llvm::MutexGuard locked(mvm::jit::executionEngine->lock); + LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); + LCI->getStaticType(); +} + +#ifdef SERVICE_VM +Value* LLVMServiceInfo::getDelegatee(JavaJIT* jit) { + if (!delegateeGV) { + Constant* cons = + ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64(vm)), + mvm::jit::ptrType); + delegateeGV = new GlobalVariable(mvm::jit::ptrType, true, + GlobalValue::ExternalLinkage, + cons, "", + vm->module); + } + return new LoadInst(delegateeGV, "", jit->currentBlock); +} + +#endif + + +namespace jnjvm { + namespace llvm_runtime { + #include "LLVMRuntime.inc" + } +} + +void JnjvmModule::initialise() { + Module* module = this; + jnjvm::llvm_runtime::makeLLVMModuleContents(module); + + VTType = module->getTypeByName("VT"); + + JavaObjectType = + PointerType::getUnqual(module->getTypeByName("JavaObject")); + + JavaArrayType = + PointerType::getUnqual(module->getTypeByName("JavaArray")); + + JavaClassType = + PointerType::getUnqual(module->getTypeByName("JavaClass")); + + JavaArrayUInt8Type = + PointerType::getUnqual(module->getTypeByName("ArrayUInt8")); + JavaArraySInt8Type = + PointerType::getUnqual(module->getTypeByName("ArraySInt8")); + JavaArrayUInt16Type = + PointerType::getUnqual(module->getTypeByName("ArrayUInt16")); + JavaArraySInt16Type = + PointerType::getUnqual(module->getTypeByName("ArraySInt16")); + JavaArrayUInt32Type = + PointerType::getUnqual(module->getTypeByName("ArrayUInt32")); + JavaArraySInt32Type = + PointerType::getUnqual(module->getTypeByName("ArraySInt32")); + JavaArrayLongType = + PointerType::getUnqual(module->getTypeByName("ArrayLong")); + JavaArrayFloatType = + PointerType::getUnqual(module->getTypeByName("ArrayFloat")); + JavaArrayDoubleType = + PointerType::getUnqual(module->getTypeByName("ArrayDouble")); + JavaArrayObjectType = + PointerType::getUnqual(module->getTypeByName("ArrayObject")); + + CacheNodeType = + PointerType::getUnqual(module->getTypeByName("CacheNode")); + + EnveloppeType = + PointerType::getUnqual(module->getTypeByName("Enveloppe")); + + InterfaceLookupFunction = module->getFunction("jnjvmVirtualLookup"); + MultiCallNewFunction = module->getFunction("multiCallNew"); + InitialisationCheckFunction = module->getFunction("initialisationCheck"); + ForceInitialisationCheckFunction = + module->getFunction("forceInitialisationCheck"); + + ArrayLengthFunction = module->getFunction("arrayLength"); + GetVTFunction = module->getFunction("getVT"); + GetClassFunction = module->getFunction("getClass"); + ClassLookupFunction = module->getFunction("newLookup"); + GetVTFromClassFunction = module->getFunction("getVTFromClass"); + GetObjectSizeFromClassFunction = module->getFunction("getObjectSizeFromClass"); + + GetClassDelegateeFunction = module->getFunction("getClassDelegatee"); + InstanceOfFunction = module->getFunction("instanceOf"); + IsAssignableFromFunction = module->getFunction("isAssignableFrom"); + ImplementsFunction = module->getFunction("implements"); + InstantiationOfArrayFunction = module->getFunction("instantiationOfArray"); + GetDepthFunction = module->getFunction("getDepth"); + GetDisplayFunction = module->getFunction("getDisplay"); + GetClassInDisplayFunction = module->getFunction("getClassInDisplay"); + AquireObjectFunction = module->getFunction("JavaObjectAquire"); + ReleaseObjectFunction = module->getFunction("JavaObjectRelease"); + OverflowThinLockFunction = module->getFunction("overflowThinLock"); + + FieldLookupFunction = module->getFunction("fieldLookup"); + + GetExceptionFunction = module->getFunction("JavaThreadGetException"); + GetJavaExceptionFunction = module->getFunction("JavaThreadGetJavaException"); + CompareExceptionFunction = module->getFunction("JavaThreadCompareException"); + JniProceedPendingExceptionFunction = + module->getFunction("jniProceedPendingException"); + GetSJLJBufferFunction = module->getFunction("getSJLJBuffer"); + + NullPointerExceptionFunction = module->getFunction("jnjvmNullPointerException"); + ClassCastExceptionFunction = module->getFunction("jnjvmClassCastException"); + IndexOutOfBoundsExceptionFunction = + module->getFunction("indexOutOfBoundsException"); + NegativeArraySizeExceptionFunction = + module->getFunction("negativeArraySizeException"); + OutOfMemoryErrorFunction = module->getFunction("outOfMemoryError"); + + JavaObjectAllocateFunction = module->getFunction("gcmalloc"); + + PrintExecutionFunction = module->getFunction("printExecution"); + PrintMethodStartFunction = module->getFunction("printMethodStart"); + PrintMethodEndFunction = module->getFunction("printMethodEnd"); + + ThrowExceptionFunction = module->getFunction("JavaThreadThrowException"); + + ClearExceptionFunction = module->getFunction("JavaThreadClearException"); + + +#ifdef MULTIPLE_VM + GetStaticInstanceFunction = module->getFunction("getStaticInstance"); + RuntimeUTF8ToStrFunction = module->getFunction("runtimeUTF8ToStr"); +#endif + +#ifdef SERVICE_VM + AquireObjectInSharedDomainFunction = + module->getFunction("JavaObjectAquireInSharedDomain"); + ReleaseObjectInSharedDomainfunction = + module->getFunction("JavaObjectReleaseInSharedDomain"); + ServiceCallStartFunction = module->getFunction("serviceCallStart"); + ServiceCallStopFunction = module->getFunction("serviceCallStop"); +#endif + +#ifdef WITH_TRACER + MarkAndTraceFunction = module->getFunction("MarkAndTrace"); + MarkAndTraceType = MarkAndTraceFunction->getFunctionType(); + JavaObjectTracerFunction = module->getFunction("JavaObjectTracer"); +#endif + +#ifndef WITHOUT_VTABLE + VirtualLookupFunction = module->getFunction("vtableLookup"); +#endif + +#ifdef MULTIPLE_GC + GetCollectorFunction = module->getFunction("getCollector"); +#endif + + GetThreadIDFunction = module->getFunction("getThreadID"); + GetLockFunction = module->getFunction("getLock"); + + UTF8NullConstant = Constant::getNullValue(JavaArrayUInt16Type); + JavaClassNullConstant = Constant::getNullValue(JavaClassType); + JavaObjectNullConstant = Constant::getNullValue(JnjvmModule::JavaObjectType); + MaxArraySizeConstant = ConstantInt::get(Type::Int32Ty, + JavaArray::MaxArraySize); + JavaObjectSizeConstant = ConstantInt::get(Type::Int32Ty, sizeof(JavaObject)); + + + Constant* cons = + ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, + uint64_t (JavaObject::VT)), VTType); + + JavaObjectVirtualTableGV = new GlobalVariable(VTType, true, + GlobalValue::ExternalLinkage, + cons, "", + module); + + cons = + ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, + uint64_t (ArrayObject::VT)), VTType); + + ArrayObjectVirtualTableGV = new GlobalVariable(VTType, true, + GlobalValue::ExternalLinkage, + cons, "", + module); + + JavaArrayElementsOffsetConstant = mvm::jit::constantTwo; + JavaArraySizeOffsetConstant = mvm::jit::constantOne; + JavaObjectLockOffsetConstant = mvm::jit::constantTwo; + JavaObjectClassOffsetConstant = mvm::jit::constantOne; + + OffsetObjectSizeInClassConstant = mvm::jit::constantOne; + OffsetVTInClassConstant = mvm::jit::constantTwo; + OffsetDisplayInClassConstant = mvm::jit::constantThree; + OffsetDepthInClassConstant = mvm::jit::constantFour; + + LLVMAssessorInfo::initialise(); +} + +void JnjvmModule::InitField(JavaField* field, JavaObject* obj, uint64 val) { + + const AssessorDesc* funcs = field->getSignature()->funcs; + if (funcs == AssessorDesc::dLong) { + ((sint64*)((uint64)obj + field->ptrOffset))[0] = val; + } else if (funcs == AssessorDesc::dInt) { + ((sint32*)((uint64)obj + field->ptrOffset))[0] = (sint32)val; + } else if (funcs == AssessorDesc::dChar) { + ((uint16*)((uint64)obj + field->ptrOffset))[0] = (uint16)val; + } else if (funcs == AssessorDesc::dShort) { + ((sint16*)((uint64)obj + field->ptrOffset))[0] = (sint16)val; + } else if (funcs == AssessorDesc::dByte) { + ((sint8*)((uint64)obj + field->ptrOffset))[0] = (sint8)val; + } else if (funcs == AssessorDesc::dBool) { + ((uint8*)((uint64)obj + field->ptrOffset))[0] = (uint8)val; + } else { + // 0 value for everything else + ((sint32*)((uint64)obj + field->ptrOffset))[0] = (sint32)val; + } +} + +void JnjvmModule::InitField(JavaField* field, JavaObject* obj, JavaObject* val) { + ((JavaObject**)((uint64)obj + field->ptrOffset))[0] = val; +} + +void JnjvmModule::InitField(JavaField* field, JavaObject* obj, double val) { + ((double*)((uint64)obj + field->ptrOffset))[0] = val; +} + +void JnjvmModule::InitField(JavaField* field, JavaObject* obj, float val) { + ((float*)((uint64)obj + field->ptrOffset))[0] = val; +} + +void JnjvmModule::setMethod(JavaMethod* meth, const char* name) { + llvm::Function* func = getMethodInfo(meth)->getMethod(); + func->setName(name); + func->setLinkage(llvm::GlobalValue::ExternalLinkage); +} + +void* JnjvmModule::getMethod(JavaMethod* meth) { + return getMethodInfo(meth)->getMethod(); +} + +JnjvmModule::JnjvmModule(const std::string &ModuleID) : llvm::Module(ModuleID) { + std::string str = + mvm::jit::executionEngine->getTargetData()->getStringRepresentation(); + setDataLayout(str); +} +void LLVMAssessorInfo::initialise() { + AssessorInfo[VOID_ID].llvmType = Type::VoidTy; + AssessorInfo[VOID_ID].llvmTypePtr = 0; + AssessorInfo[VOID_ID].llvmNullConstant = 0; + AssessorInfo[VOID_ID].sizeInBytesConstant = 0; + + AssessorInfo[BOOL_ID].llvmType = Type::Int8Ty; + AssessorInfo[BOOL_ID].llvmTypePtr = PointerType::getUnqual(Type::Int8Ty); + AssessorInfo[BOOL_ID].llvmNullConstant = + Constant::getNullValue(Type::Int8Ty); + AssessorInfo[BOOL_ID].sizeInBytesConstant = mvm::jit::constantOne; + + AssessorInfo[BYTE_ID].llvmType = Type::Int8Ty; + AssessorInfo[BYTE_ID].llvmTypePtr = PointerType::getUnqual(Type::Int8Ty); + AssessorInfo[BYTE_ID].llvmNullConstant = + Constant::getNullValue(Type::Int8Ty); + AssessorInfo[BYTE_ID].sizeInBytesConstant = mvm::jit::constantOne; + + AssessorInfo[SHORT_ID].llvmType = Type::Int16Ty; + AssessorInfo[SHORT_ID].llvmTypePtr = PointerType::getUnqual(Type::Int16Ty); + AssessorInfo[SHORT_ID].llvmNullConstant = + Constant::getNullValue(Type::Int16Ty); + AssessorInfo[SHORT_ID].sizeInBytesConstant = mvm::jit::constantTwo; + + AssessorInfo[CHAR_ID].llvmType = Type::Int16Ty; + AssessorInfo[CHAR_ID].llvmTypePtr = PointerType::getUnqual(Type::Int16Ty); + AssessorInfo[CHAR_ID].llvmNullConstant = + Constant::getNullValue(Type::Int16Ty); + AssessorInfo[CHAR_ID].sizeInBytesConstant = mvm::jit::constantTwo; + + AssessorInfo[INT_ID].llvmType = Type::Int32Ty; + AssessorInfo[INT_ID].llvmTypePtr = PointerType::getUnqual(Type::Int32Ty); + AssessorInfo[INT_ID].llvmNullConstant = + Constant::getNullValue(Type::Int32Ty); + AssessorInfo[INT_ID].sizeInBytesConstant = mvm::jit::constantFour; + + AssessorInfo[FLOAT_ID].llvmType = Type::FloatTy; + AssessorInfo[FLOAT_ID].llvmTypePtr = PointerType::getUnqual(Type::FloatTy); + AssessorInfo[FLOAT_ID].llvmNullConstant = + Constant::getNullValue(Type::FloatTy); + AssessorInfo[FLOAT_ID].sizeInBytesConstant = mvm::jit::constantFour; + + AssessorInfo[LONG_ID].llvmType = Type::Int64Ty; + AssessorInfo[LONG_ID].llvmTypePtr = PointerType::getUnqual(Type::Int64Ty); + AssessorInfo[LONG_ID].llvmNullConstant = + Constant::getNullValue(Type::Int64Ty); + AssessorInfo[LONG_ID].sizeInBytesConstant = mvm::jit::constantEight; + + AssessorInfo[DOUBLE_ID].llvmType = Type::DoubleTy; + AssessorInfo[DOUBLE_ID].llvmTypePtr = PointerType::getUnqual(Type::DoubleTy); + AssessorInfo[DOUBLE_ID].llvmNullConstant = + Constant::getNullValue(Type::DoubleTy); + AssessorInfo[DOUBLE_ID].sizeInBytesConstant = mvm::jit::constantEight; + + AssessorInfo[ARRAY_ID].llvmType = JnjvmModule::JavaObjectType; + AssessorInfo[ARRAY_ID].llvmTypePtr = + PointerType::getUnqual(JnjvmModule::JavaObjectType); + AssessorInfo[ARRAY_ID].llvmNullConstant = + JnjvmModule::JavaObjectNullConstant; + AssessorInfo[ARRAY_ID].sizeInBytesConstant = mvm::jit::constantPtrSize; + + AssessorInfo[OBJECT_ID].llvmType = JnjvmModule::JavaObjectType; + AssessorInfo[OBJECT_ID].llvmTypePtr = + PointerType::getUnqual(JnjvmModule::JavaObjectType); + AssessorInfo[OBJECT_ID].llvmNullConstant = + JnjvmModule::JavaObjectNullConstant; + AssessorInfo[OBJECT_ID].sizeInBytesConstant = mvm::jit::constantPtrSize; +} + +LLVMAssessorInfo LLVMAssessorInfo::AssessorInfo[NUM_ASSESSORS]; Added: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=54738&view=auto ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (added) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Wed Aug 13 09:45:37 2008 @@ -0,0 +1,382 @@ +//===------- JnjvmModule.h - Definition of a Jnjvm module -----------------===// +// +// JnJVM +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef JNJVM_MODULE_H +#define JNJVM_MODULE_H + +#include + +#include "llvm/Constant.h" +#include "llvm/DerivedTypes.h" +#include "llvm/Function.h" +#include "llvm/GlobalVariable.h" +#include "llvm/Module.h" +#include "llvm/Type.h" +#include "llvm/Value.h" + +#include "mvm/JIT.h" + +#include "JavaClass.h" +#include "JavaTypes.h" + +namespace jnjvm { + +class CommonClass; +class Class; +class JavaField; +class JavaMethod; +class JavaObject; +class JavaJIT; +class JnjvmModule; +class Signdef; + +class LLVMAssessorInfo { +public: + const llvm::Type* llvmType; + const llvm::Type* llvmTypePtr; + llvm::Constant* llvmNullConstant; + llvm::ConstantInt* sizeInBytesConstant; + + static void initialise(); + static LLVMAssessorInfo AssessorInfo[]; + +}; + + +class LLVMCommonClassInfo : public mvm::JITInfo { + + friend class JnjvmModule; + +protected: + CommonClass* classDef; + +private: + /// varGV - The LLVM global variable representing this class. + /// + llvm::GlobalVariable* varGV; + +#ifndef MULTIPLE_VM + /// delegateeGV - The LLVM global variable representing the + /// java/lang/Class instance of this class. + llvm::GlobalVariable* delegateeGV; +#endif + + +public: + llvm::Value* getVar(JavaJIT* jit); + llvm::Value* getDelegatee(JavaJIT* jit); + + LLVMCommonClassInfo(CommonClass* cl) : + classDef(cl), + varGV(0) +#ifndef MULTIPLE_VM + ,delegateeGV(0) +#endif + {} +}; + +class LLVMClassInfo : public LLVMCommonClassInfo { + friend class JnjvmModule; +private: + /// virtualSizeLLVM - The LLVM constant size of instances of this class. + /// + llvm::ConstantInt* virtualSizeConstant; + llvm::GlobalVariable* staticVarGV; + llvm::GlobalVariable* virtualTableGV; + llvm::Function* virtualTracerFunction; + llvm::Function* staticTracerFunction; + /// virtualType - The LLVM type of instance of this class. + /// + const llvm::Type * virtualType; + + /// staticType - The LLVM type of the static instance of this class. + /// + const llvm::Type * staticType; +public: + + llvm::Value* getStaticVar(JavaJIT* jit); + llvm::Value* getVirtualTable(JavaJIT* jit); + llvm::Value* getVirtualSize(JavaJIT* jit); + llvm::Function* getStaticTracer(); + llvm::Function* getVirtualTracer(); + const llvm::Type* getVirtualType(); + const llvm::Type* getStaticType(); + + LLVMClassInfo(CommonClass* cl) : + LLVMCommonClassInfo(cl), + virtualSizeConstant(0), + staticVarGV(0), + virtualTableGV(0), + virtualTracerFunction(0), + staticTracerFunction(0), + virtualType(0), + staticType(0) {} +}; + +class LLVMMethodInfo : public mvm::JITInfo { +private: + JavaMethod* methodDef; + + llvm::Function* methodFunction; + llvm::ConstantInt* offsetConstant; + const llvm::FunctionType* functionType; + +public: + llvm::Function* getMethod(); + llvm::ConstantInt* getOffset(); + const llvm::FunctionType* getFunctionType(); + + LLVMMethodInfo(JavaMethod* M) : + methodDef(M), + methodFunction(0), + offsetConstant(0), + functionType(0) {} +}; + +class LLVMFieldInfo : public mvm::JITInfo { +private: + JavaField* fieldDef; + + llvm::ConstantInt* offsetConstant; + +public: + llvm::ConstantInt* getOffset(); + + LLVMFieldInfo(JavaField* F) : + fieldDef(F), + offsetConstant(0) {} +}; + +class LLVMSignatureInfo : public mvm::JITInfo { +private: + const llvm::FunctionType* staticType; + const llvm::FunctionType* virtualType; + const llvm::FunctionType* nativeType; + + const llvm::FunctionType* virtualBufType; + const llvm::FunctionType* staticBufType; + + const llvm::PointerType* staticPtrType; + const llvm::PointerType* virtualPtrType; + const llvm::PointerType* nativePtrType; + + llvm::Function* virtualBufFunction; + llvm::Function* virtualAPFunction; + llvm::Function* staticBufFunction; + llvm::Function* staticAPFunction; + + Signdef* signature; + + llvm::Function* createFunctionCallBuf(bool virt); + llvm::Function* createFunctionCallAP(bool virt); + + + +public: + const llvm::FunctionType* getVirtualType(); + const llvm::FunctionType* getStaticType(); + const llvm::FunctionType* getNativeType(); + + const llvm::FunctionType* getVirtualBufType(); + const llvm::FunctionType* getStaticBufType(); + + const llvm::PointerType* getStaticPtrType(); + const llvm::PointerType* getNativePtrType(); + const llvm::PointerType* getVirtualPtrType(); + + llvm::Function* getVirtualBuf(); + llvm::Function* getVirtualAP(); + llvm::Function* getStaticBuf(); + llvm::Function* getStaticAP(); + + LLVMSignatureInfo(Signdef* sign) : + staticType(0), + virtualType(0), + nativeType(0), + virtualBufType(0), + staticBufType(0), + staticPtrType(0), + virtualPtrType(0), + nativePtrType(0), + virtualBufFunction(0), + virtualAPFunction(0), + staticBufFunction(0), + staticAPFunction(0), + signature(sign) {} + +}; + +#ifdef SERVICE_VM +class LLVMServiceInfo : public mvm::JITInfo { +private: + ServiceDomain* vm; + llvm::GlobalVariable* delegateeGV; + +public: + llvm::Value* getDelegatee(JavaJIT* jit); +}; +#endif + +class JnjvmModule : public llvm::Module { + friend class LLVMClassInfo; +private: + + static VirtualTable* makeVT(Class* cl, bool stat); + static VirtualTable* allocateVT(Class* cl, CommonClass::method_iterator meths); + + +public: + + static llvm::ConstantInt* JavaArraySizeOffsetConstant; + static llvm::ConstantInt* JavaArrayElementsOffsetConstant; + static llvm::ConstantInt* JavaObjectLockOffsetConstant; + static llvm::ConstantInt* JavaObjectClassOffsetConstant; + + static const llvm::Type* JavaArrayUInt8Type; + static const llvm::Type* JavaArraySInt8Type; + static const llvm::Type* JavaArrayUInt16Type; + static const llvm::Type* JavaArraySInt16Type; + static const llvm::Type* JavaArrayUInt32Type; + static const llvm::Type* JavaArraySInt32Type; + static const llvm::Type* JavaArrayLongType; + static const llvm::Type* JavaArrayFloatType; + static const llvm::Type* JavaArrayDoubleType; + static const llvm::Type* JavaArrayObjectType; + + static const llvm::Type* VTType; + static const llvm::Type* JavaObjectType; + static const llvm::Type* JavaArrayType; + static const llvm::Type* JavaClassType; + static const llvm::Type* JavaCacheType; + static const llvm::Type* EnveloppeType; + static const llvm::Type* CacheNodeType; + +#ifdef WITH_TRACER + static llvm::Function* MarkAndTraceFunction; + static const llvm::FunctionType* MarkAndTraceType; + static llvm::Function* JavaObjectTracerFunction; +#endif + + static llvm::Function* GetSJLJBufferFunction; + static llvm::Function* InterfaceLookupFunction; + static llvm::Function* FieldLookupFunction; + static llvm::Function* PrintExecutionFunction; + static llvm::Function* PrintMethodStartFunction; + static llvm::Function* PrintMethodEndFunction; + static llvm::Function* JniProceedPendingExceptionFunction; + static llvm::Function* InitialisationCheckFunction; + static llvm::Function* ForceInitialisationCheckFunction; + static llvm::Function* ClassLookupFunction; +#ifndef WITHOUT_VTABLE + static llvm::Function* VirtualLookupFunction; +#endif + static llvm::Function* InstanceOfFunction; + static llvm::Function* IsAssignableFromFunction; + static llvm::Function* ImplementsFunction; + static llvm::Function* InstantiationOfArrayFunction; + static llvm::Function* GetDepthFunction; + static llvm::Function* GetClassInDisplayFunction; + static llvm::Function* GetDisplayFunction; + static llvm::Function* AquireObjectFunction; + static llvm::Function* ReleaseObjectFunction; +#ifdef SERVICE_VM + static llvm::Function* AquireObjectInSharedDomainFunction; + static llvm::Function* ReleaseObjectInSharedDomainFunction; + static llvm::Function* ServiceCallStartFunction; + static llvm::Function* ServiceCallStopFunction; +#endif + static llvm::Function* MultiCallNewFunction; + static llvm::Function* RuntimeUTF8ToStrFunction; + static llvm::Function* GetStaticInstanceFunction; + static llvm::Function* GetClassDelegateeFunction; + static llvm::Function* ArrayLengthFunction; + static llvm::Function* GetVTFunction; + static llvm::Function* GetClassFunction; + static llvm::Function* JavaObjectAllocateFunction; +#ifdef MULTIPLE_GC + static llvm::Function* GetCollectorFunction; +#endif + static llvm::Function* GetVTFromClassFunction; + static llvm::Function* GetObjectSizeFromClassFunction; + + static llvm::Function* GetLockFunction; + static llvm::Function* GetThreadIDFunction; + static llvm::Function* OverflowThinLockFunction; + + static llvm::ConstantInt* OffsetObjectSizeInClassConstant; + static llvm::ConstantInt* OffsetVTInClassConstant; + static llvm::ConstantInt* OffsetDepthInClassConstant; + static llvm::ConstantInt* OffsetDisplayInClassConstant; + + static llvm::Constant* JavaClassNullConstant; + + static llvm::Constant* JavaObjectNullConstant; + static llvm::Constant* UTF8NullConstant; + static llvm::Constant* MaxArraySizeConstant; + static llvm::Constant* JavaObjectSizeConstant; + + static llvm::GlobalVariable* ArrayObjectVirtualTableGV; + static llvm::GlobalVariable* JavaObjectVirtualTableGV; + + static llvm::Function* GetExceptionFunction; + static llvm::Function* GetJavaExceptionFunction; + static llvm::Function* ThrowExceptionFunction; + static llvm::Function* ClearExceptionFunction; + static llvm::Function* CompareExceptionFunction; + static llvm::Function* NullPointerExceptionFunction; + static llvm::Function* IndexOutOfBoundsExceptionFunction; + static llvm::Function* ClassCastExceptionFunction; + static llvm::Function* OutOfMemoryErrorFunction; + static llvm::Function* NegativeArraySizeExceptionFunction; + + static void InitField(JavaField* field); + static void InitField(JavaField* field, JavaObject* obj, uint64 val = 0); + static void InitField(JavaField* field, JavaObject* obj, JavaObject* val); + static void InitField(JavaField* field, JavaObject* obj, double val); + static void InitField(JavaField* field, JavaObject* obj, float val); + + + 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(); + } + + static LLVMCommonClassInfo* getClassInfo(CommonClass* cl) { + if (cl->isArray || cl->isPrimitive) { + return cl->getInfo(); + } else { + return cl->getInfo(); + } + } + + static LLVMFieldInfo* getFieldInfo(JavaField* field) { + return field->getInfo(); + } + + static LLVMMethodInfo* getMethodInfo(JavaMethod* method) { + return method->getInfo(); + } + +#ifdef SERVICE_VM + static LLVMServiceInfo* getServiceInfo(ServiceDomain* service) { + return service->getInfo(); + } +#endif + + explicit JnjvmModule(const std::string &ModuleID); + void initialise(); +}; + +} + +#endif From nicolas.geoffray at lip6.fr Wed Aug 13 07:56:30 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 13 Aug 2008 14:56:30 -0000 Subject: [vmkit-commits] [vmkit] r54739 - in /vmkit/trunk: autoconf/configure.ac configure include/mvm/Config/config.h.in tools/vmkit/Launcher.cpp Message-ID: <200808131456.m7DEuV2H000921@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 13 09:56:28 2008 New Revision: 54739 URL: http://llvm.org/viewvc/llvm-project?rev=54739&view=rev Log: Configure WITH_N3 and WITH_JNJVM to be in config.h. Modified: vmkit/trunk/autoconf/configure.ac vmkit/trunk/configure vmkit/trunk/include/mvm/Config/config.h.in vmkit/trunk/tools/vmkit/Launcher.cpp Modified: vmkit/trunk/autoconf/configure.ac URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/autoconf/configure.ac?rev=54739&r1=54738&r2=54739&view=diff ============================================================================== --- vmkit/trunk/autoconf/configure.ac (original) +++ vmkit/trunk/autoconf/configure.ac Wed Aug 13 09:56:28 2008 @@ -266,6 +266,7 @@ if test "x${WITH_JNJVM}" = "xyes"; then WITH_JNJVM=1; + AC_DEFINE([WITH_JNJVM], [1], [With JNJVM]) else WITH_JNJVM=0; fi @@ -301,6 +302,7 @@ echo Using ${pnetlocalprefix} as PNET local prefix; WITH_N3_PNETLIB=1; WITH_N3=1; + AC_DEFINE([WITH_N3], [1], [With N3]) else WITH_N3_PNETLIB=0; fi Modified: vmkit/trunk/configure URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/configure?rev=54739&r1=54738&r2=54739&view=diff ============================================================================== --- vmkit/trunk/configure (original) +++ vmkit/trunk/configure Wed Aug 13 09:56:28 2008 @@ -3993,6 +3993,11 @@ if test "x${WITH_JNJVM}" = "xyes"; then WITH_JNJVM=1; + +cat >>confdefs.h <<\_ACEOF +#define WITH_JNJVM 1 +_ACEOF + else WITH_JNJVM=0; fi @@ -4031,6 +4036,11 @@ echo Using ${pnetlocalprefix} as PNET local prefix; WITH_N3_PNETLIB=1; WITH_N3=1; + +cat >>confdefs.h <<\_ACEOF +#define WITH_N3 1 +_ACEOF + else WITH_N3_PNETLIB=0; fi Modified: vmkit/trunk/include/mvm/Config/config.h.in URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Config/config.h.in?rev=54739&r1=54738&r2=54739&view=diff ============================================================================== --- vmkit/trunk/include/mvm/Config/config.h.in (original) +++ vmkit/trunk/include/mvm/Config/config.h.in Wed Aug 13 09:56:28 2008 @@ -87,6 +87,9 @@ /* Compiling N3 */ #undef WITH_N3 +/* Compiling JNJVM */ +#undef WITH_JNJVM + /* Define to `int' if does not define. */ #undef pid_t Modified: vmkit/trunk/tools/vmkit/Launcher.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmkit/Launcher.cpp?rev=54739&r1=54738&r2=54739&view=diff ============================================================================== --- vmkit/trunk/tools/vmkit/Launcher.cpp (original) +++ vmkit/trunk/tools/vmkit/Launcher.cpp Wed Aug 13 09:56:28 2008 @@ -13,6 +13,7 @@ #include "llvm/Support/ManagedStatic.h" #include "MvmGC.h" +#include "mvm/Config/config.h" #include "mvm/JIT.h" #include "mvm/Object.h" #include "mvm/VirtualMachine.h" @@ -61,16 +62,24 @@ } if (VMToRun == RunJava) { +#if WITH_JNJVM mvm::VirtualMachine::initialiseJVM(); mvm::VirtualMachine* vm = mvm::VirtualMachine::createJVM(); vm->runApplication(argc, argv); +#endif } else if (VMToRun == RunNet) { +#if WITH_N3 mvm::VirtualMachine::initialiseCLIVM(); mvm::VirtualMachine* vm = mvm::VirtualMachine::createCLIVM(); vm->runApplication(argc, argv); +#endif } else { +#if WITH_JNJVM mvm::VirtualMachine::initialiseJVM(); +#endif +#if WITH_N3 mvm::VirtualMachine::initialiseCLIVM(); +#endif mvm::CommandLine MyCl; MyCl.vmlets["java"] = (mvm::VirtualMachine::createJVM); MyCl.vmlets["net"] = (mvm::VirtualMachine::createCLIVM); From nicolas.geoffray at lip6.fr Wed Aug 13 12:43:32 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 13 Aug 2008 19:43:32 -0000 Subject: [vmkit-commits] [vmkit] r54748 - /vmkit/trunk/tools/vmkit/Launcher.cpp Message-ID: <200808131943.m7DJhX6S012929@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 13 14:43:31 2008 New Revision: 54748 URL: http://llvm.org/viewvc/llvm-project?rev=54748&view=rev Log: Fix #if directives. Modified: vmkit/trunk/tools/vmkit/Launcher.cpp Modified: vmkit/trunk/tools/vmkit/Launcher.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmkit/Launcher.cpp?rev=54748&r1=54747&r2=54748&view=diff ============================================================================== --- vmkit/trunk/tools/vmkit/Launcher.cpp (original) +++ vmkit/trunk/tools/vmkit/Launcher.cpp Wed Aug 13 14:43:31 2008 @@ -74,15 +74,15 @@ vm->runApplication(argc, argv); #endif } else { + mvm::CommandLine MyCl; #if WITH_JNJVM mvm::VirtualMachine::initialiseJVM(); + MyCl.vmlets["java"] = (mvm::VirtualMachine::createJVM); #endif #if WITH_N3 mvm::VirtualMachine::initialiseCLIVM(); -#endif - mvm::CommandLine MyCl; - MyCl.vmlets["java"] = (mvm::VirtualMachine::createJVM); MyCl.vmlets["net"] = (mvm::VirtualMachine::createCLIVM); +#endif MyCl.start(); } From nicolas.geoffray at lip6.fr Thu Aug 14 08:58:57 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 14 Aug 2008 15:58:57 -0000 Subject: [vmkit-commits] [vmkit] r54779 - in /vmkit/trunk/lib/JnJVM: Classpath/ VMCore/ Message-ID: <200808141558.m7EFwwVK002912@zion.cs.uiuc.edu> Author: geoffray Date: Thu Aug 14 10:58:53 2008 New Revision: 54779 URL: http://llvm.org/viewvc/llvm-project?rev=54779&view=rev Log: Major rewrite of class loading in jnjvm. Now, each class is linked with a JnjvmClassLoader instead of the Java object loader. The Java object loader is referenced by the JnjvmClassLoader. All class loading, reading and resolution is done by a JnjvmClassLoader. The default class loader, of type JnjvmBootstrapLoader contains additional infos: the boot classpath and the classpath libraries environment. TODOs: 1) Find a clean way to protect the boot class loader from GC. Currently, it is protected by instances of JavaIsolate. 2) Merge JavaIsolate and Jnjvm. 3) Clean which allocator is used when allocating UTF8 (and also Strings). Added: vmkit/trunk/lib/JnJVM/VMCore/JavaAllocator.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Modified: vmkit/trunk/lib/JnJVM/Classpath/Classpath.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMField.cpp.inc vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMObject.cpp.inc vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp.inc vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc vmkit/trunk/lib/JnJVM/VMCore/JavaArray.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h vmkit/trunk/lib/JnJVM/VMCore/JavaBacktrace.cpp 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/JavaInitialise.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.h vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp 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/JnjvmModuleProvider.cpp vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.h vmkit/trunk/lib/JnJVM/VMCore/Reader.cpp vmkit/trunk/lib/JnJVM/VMCore/Reader.h vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp vmkit/trunk/lib/JnJVM/VMCore/Zip.h Modified: vmkit/trunk/lib/JnJVM/Classpath/Classpath.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/Classpath.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/Classpath.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/Classpath.cpp Thu Aug 14 10:58:53 2008 @@ -166,11 +166,11 @@ { Jnjvm* vm = JavaThread::get()->isolate; CommonClass* base = NativeUtil::resolvedImplClass(arrayType, true); - JavaObject* loader = base->classLoader; + JnjvmClassLoader* loader = base->classLoader; const UTF8* name = base->name; - const UTF8* arrayName = AssessorDesc::constructArrayName(vm, 0, 1, name); - ClassArray* array = vm->constructArray(arrayName, loader); - ArrayObject* res = ArrayObject::acons(arrayLength, array, vm); + const UTF8* arrayName = AssessorDesc::constructArrayName(loader, 0, 1, name); + ClassArray* array = loader->constructArray(arrayName); + ArrayObject* res = ArrayObject::acons(arrayLength, array, &(vm->allocator)); return (jobject) res; } Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc Thu Aug 14 10:58:53 2008 @@ -19,6 +19,7 @@ #include "JavaThread.h" #include "JavaUpcalls.h" #include "Jnjvm.h" +#include "JnjvmClassLoader.h" #include "NativeUtil.h" using namespace jnjvm; @@ -32,7 +33,7 @@ #endif jobject cons) { JavaMethod* meth = (JavaMethod*)(Classpath::constructorSlot->getVirtualInt32Field((JavaObject*)cons)); - JavaObject* loader = meth->classDef->classLoader; + JnjvmClassLoader* loader = meth->classDef->classLoader; return (jobject)(NativeUtil::getParameterTypes(loader, meth)); } Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc Thu Aug 14 10:58:53 2008 @@ -19,6 +19,7 @@ #include "JavaThread.h" #include "JavaUpcalls.h" #include "Jnjvm.h" +#include "JnjvmClassLoader.h" #include "NativeUtil.h" using namespace jnjvm; @@ -40,7 +41,7 @@ #endif jobject Meth) { JavaMethod* meth = (JavaMethod*)Classpath::methodSlot->getVirtualInt32Field((JavaObject*)Meth); - JavaObject* loader = meth->classDef->classLoader; + JnjvmClassLoader* loader = meth->classDef->classLoader; return (jclass)NativeUtil::getClassType(loader, meth->getSignature()->ret); } @@ -52,7 +53,7 @@ jobject Meth) { JavaMethod* meth = (JavaMethod*)Classpath::methodSlot->getVirtualInt32Field((JavaObject*)Meth); - JavaObject* loader = meth->classDef->classLoader; + JnjvmClassLoader* loader = meth->classDef->classLoader; return (jobject)(NativeUtil::getParameterTypes(loader, meth)); } Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc Thu Aug 14 10:58:53 2008 @@ -52,17 +52,17 @@ jboolean clinit, jobject loader) { - Jnjvm* vm = JavaThread::get()->isolate; - CommonClass* cl = vm->lookupClassFromJavaString((JavaString*)str, - (JavaObject*)loader, true, - false, false); + + JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader); + CommonClass* cl = JCL->lookupClassFromJavaString((JavaString*)str, + true, false, false); if (cl != 0) { if (clinit) { cl->initialiseClass(); } return (jclass)(cl->getClassDelegatee()); } else { - vm->error(Jnjvm::ClassNotFoundException, "unable to load %s", + JavaThread::get()->isolate->error(Jnjvm::ClassNotFoundException, "unable to load %s", ((JavaString*)str)->strToAsciiz()); return 0; } @@ -81,7 +81,7 @@ Jnjvm* vm = JavaThread::get()->isolate; if (cl->isArray || isInterface(cl->access)) { - return (jobject)ArrayObject::acons(0, Classpath::constructorArrayClass, vm); + return (jobject)ArrayObject::acons(0, Classpath::constructorArrayClass, &(vm->allocator)); } else { CommonClass::method_map meths = cl->virtualMethods; std::vector res; @@ -93,7 +93,7 @@ } } - ArrayObject* ret = ArrayObject::acons(res.size(), Classpath::constructorArrayClass, vm); + ArrayObject* ret = ArrayObject::acons(res.size(), Classpath::constructorArrayClass, &(vm->allocator)); sint32 index = 0; for (std::vector::iterator i = res.begin(), e = res.end(); i != e; ++i, ++index) { @@ -120,7 +120,7 @@ CommonClass* cl = NativeUtil::resolvedImplClass(Cl, false); if (cl->isArray) { - return (jobject)ArrayObject::acons(0, Classpath::methodArrayClass, vm); + return (jobject)ArrayObject::acons(0, Classpath::methodArrayClass, &(vm->allocator)); } else { CommonClass::method_map meths = cl->virtualMethods; std::vector res; @@ -140,7 +140,7 @@ } } - ArrayObject* ret = ArrayObject::acons(res.size(), Classpath::methodArrayClass, vm); + ArrayObject* ret = ArrayObject::acons(res.size(), Classpath::methodArrayClass, &(vm->allocator)); sint32 index = 0; for (std::vector::iterator i = res.begin(), e = res.end(); i != e; ++i, ++index) { @@ -178,7 +178,7 @@ (CommonClass*)Classpath::vmdataClass->getVirtualObjectField((JavaObject*)Cl); const UTF8* iname = cl->name; - const UTF8* res = iname->internalToJava(vm, 0, iname->size); + const UTF8* res = iname->internalToJava(cl->classLoader->hashUTF8, 0, iname->size); return (jobject)(vm->UTF8ToStr(res)); } @@ -231,7 +231,7 @@ jclass Cl) { CommonClass* cl = (CommonClass*)Classpath::vmdataClass->getVirtualObjectField((JavaObject*)Cl); - return (jobject)cl->classLoader; + return (jobject)cl->classLoader->getJavaClassLoader(); } JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isAssignableFrom( @@ -288,7 +288,7 @@ CommonClass* cl = NativeUtil::resolvedImplClass(Cl, false); if (cl->isArray) { - return (jobject)ArrayObject::acons(0, Classpath::fieldArrayClass, vm); + return (jobject)ArrayObject::acons(0, Classpath::fieldArrayClass, &(vm->allocator)); } else { CommonClass::field_map fields = cl->virtualFields; std::vector res; @@ -309,7 +309,7 @@ } ArrayObject* ret = ArrayObject::acons(res.size(), - Classpath::fieldArrayClass, vm); + Classpath::fieldArrayClass, &(vm->allocator)); sint32 index = 0; for (std::vector::iterator i = res.begin(), e = res.end(); i != e; ++i, ++index) { @@ -333,7 +333,7 @@ Jnjvm* vm = JavaThread::get()->isolate; CommonClass* cl = NativeUtil::resolvedImplClass(Cl, false); std::vector & interfaces = cl->interfaces; - ArrayObject* ret = ArrayObject::acons(interfaces.size(), Classpath::classArrayClass, vm); + ArrayObject* ret = ArrayObject::acons(interfaces.size(), Classpath::classArrayClass, &(vm->allocator)); sint32 index = 0; for (std::vector::iterator i = interfaces.begin(), e = interfaces.end(); i != e; ++i, ++index) { @@ -397,7 +397,7 @@ Class* cl = (Class*)NativeUtil::resolvedImplClass(Cl, false); if (!(cl->innerOuterResolved)) resolveInnerOuterClasses(cl); - ArrayObject* res = ArrayObject::acons(cl->innerClasses.size(), Classpath::constructorArrayClass, vm); + ArrayObject* res = ArrayObject::acons(cl->innerClasses.size(), Classpath::constructorArrayClass, &(vm->allocator)); uint32 index = 0; for (std::vector::iterator i = cl->innerClasses.begin(), e = cl->innerClasses.end(); i!= e; i++) { @@ -425,7 +425,7 @@ jclass Cl) { // TODO implement me Jnjvm* vm = JavaThread::get()->isolate; - ArrayObject* res = ArrayObject::acons(0, Classpath::constructorArrayAnnotation, vm); + ArrayObject* res = ArrayObject::acons(0, Classpath::constructorArrayAnnotation, &(vm->allocator)); return (jobjectArray)res; } } Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc Thu Aug 14 10:58:53 2008 @@ -52,7 +52,8 @@ Jnjvm* vm = JavaThread::get()->isolate; JavaString* name = (JavaString*)_name; const UTF8* utf8 = name->strToUTF8(vm); - CommonClass* cl = vm->lookupClass(utf8, (JavaObject*)loader); + JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader); + CommonClass* cl = JCL->lookupClass(utf8); if (cl) return (jclass)(cl->getClassDelegatee()); else return 0; @@ -66,9 +67,9 @@ jobject _str, jboolean doResolve) { JavaString* str = (JavaString*)_str; - Jnjvm* vm = JavaThread::get()->isolate; - CommonClass* cl = vm->lookupClassFromJavaString(str, 0, doResolve, false, false); + JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; + CommonClass* cl = JCL->lookupClassFromJavaString(str, doResolve, false, false); if (cl != 0) { return (jclass)cl->getClassDelegatee(); @@ -88,10 +89,10 @@ jint off, jint len, jobject pd) { - Jnjvm* vm = JavaThread::get()->isolate; + JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader); JavaString* str = (JavaString*)_str; - const UTF8* name = str->value->javaToInternal(vm, str->offset, str->count); - Class* cl = vm->constructClass(name, (JavaObject*)loader); + const UTF8* name = str->value->javaToInternal(JCL->hashUTF8, str->offset, str->count); + Class* cl = JCL->constructClass(name); if (cl->status == hashed) { cl->acquire(); Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMField.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMField.cpp.inc?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMField.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMField.cpp.inc Thu Aug 14 10:58:53 2008 @@ -34,7 +34,7 @@ #endif jobject obj) { JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)obj); - JavaObject* loader = field->classDef->classLoader; + JnjvmClassLoader* loader = field->classDef->classLoader; CommonClass* cl = field->getSignature()->assocClass(loader); return (jclass)cl->getClassDelegatee(); } Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMObject.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMObject.cpp.inc?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMObject.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMObject.cpp.inc Thu Aug 14 10:58:53 2008 @@ -40,7 +40,7 @@ size = cl->virtualSize; } JavaObject* res = (JavaObject*) - JavaThread::get()->isolate->allocateObject(size, src->getVirtualTable()); + JavaThread::get()->isolate->allocator.allocateObject(size, src->getVirtualTable()); memcpy(res, src, size); res->lock = 0; return (jobject)res; Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp.inc?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp.inc Thu Aug 14 10:58:53 2008 @@ -51,7 +51,8 @@ memmove(&(elements[lgPre]), &(utf8Lib->elements[stLib]), lgLib * sizeof(uint16)); memmove(&(elements[lgPre + lgLib]), vm->postlib->elements, lgPost * sizeof(uint16)); - const UTF8* res = vm->readerConstructUTF8(elements, size); + // TODO: find a better place to store the UTF8 + const UTF8* res = JnjvmClassLoader::bootstrapLoader->readerConstructUTF8(elements, size); return (jobject)(vm->UTF8ToStr(res)); Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc Thu Aug 14 10:58:53 2008 @@ -40,7 +40,7 @@ } } else { Jnjvm* vm = JavaThread::get()->isolate; - return ArrayObject::acons(rec, Classpath::classArrayClass, vm); + return ArrayObject::acons(rec, Classpath::classArrayClass, &(vm->allocator)); } } @@ -75,7 +75,7 @@ jclass _Cl) { JavaObject* Cl = (JavaObject*)_Cl; CommonClass* cl = (CommonClass*)Classpath::vmdataClass->getVirtualObjectField(Cl); - return (jobject)cl->classLoader; + return (jobject)cl->classLoader->getJavaClassLoader(); } extern "C" JavaObject* getCallingClass() { Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc Thu Aug 14 10:58:53 2008 @@ -70,16 +70,17 @@ tmp = getenv("JAVA_HOME"); if (!tmp) tmp = ""; setProperty(vm, prop, "java.home", tmp); - + + JnjvmBootstrapLoader* JCL = JnjvmClassLoader::bootstrapLoader; setProperty(vm, prop, "java.class.version", "49.0"); setProperty(vm, prop, "java.class.path", vm->classpath); - setProperty(vm, prop, "java.boot.class.path", vm->bootClasspathEnv); - setProperty(vm, prop, "sun.boot.class.path", vm->bootClasspathEnv); + setProperty(vm, prop, "java.boot.class.path", JCL->bootClasspathEnv); + setProperty(vm, prop, "sun.boot.class.path", JCL->bootClasspathEnv); setProperty(vm, prop, "java.vm.version", "2.0"); setProperty(vm, prop, "java.vm.vendor", "VVM Project"); setProperty(vm, prop, "java.vm.name", "JnJVM"); setProperty(vm, prop, "java.specification.version", "1.5"); - setProperty(vm, prop, "java.library.path", vm->libClasspathEnv); + setProperty(vm, prop, "java.library.path", JCL->libClasspathEnv); setProperty(vm, prop, "java.io.tmpdir", "/tmp"); tmp = getenv("JAVA_COMPILER"); @@ -87,7 +88,7 @@ setProperty(vm, prop, "java.compiler", tmp); setProperty(vm, prop, "build.compiler", "gcj"); - setProperty(vm, prop, "gcj.class.path", vm->bootClasspathEnv); + setProperty(vm, prop, "gcj.class.path", JCL->bootClasspathEnv); setUnameProp(vm, prop); Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc Thu Aug 14 10:58:53 2008 @@ -113,7 +113,7 @@ assert(javaThread); Jnjvm* vm = JavaThread::get()->isolate; - JavaThread* th = vm_new(vm, JavaThread)(); + JavaThread* th = allocator_new(vm->allocator, JavaThread)(); th->initialise(javaThread, vm); ClasspathThread::vmdata->setVirtualObjectField(vmThread, (JavaObject*)th); int tid = 0; Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc Thu Aug 14 10:58:53 2008 @@ -51,7 +51,7 @@ Jnjvm* vm = JavaThread::get()->isolate; JavaObject* methodName = vm->UTF8ToStr(meth->name); Class* cl = meth->classDef; - JavaObject* className = vm->UTF8ToStr(cl->name->internalToJava(vm, 0, cl->name->size)); + JavaObject* className = vm->UTF8ToStr(cl->name->internalToJava(cl->classLoader->hashUTF8, 0, cl->name->size)); JavaObject* sourceName = 0; Attribut* sourceAtt = cl->lookupAttribut(Attribut::sourceFileAttribut); @@ -83,7 +83,7 @@ return recGetStackTrace(stack, first + 1, rec); } } else { - return ArrayObject::acons(rec, Classpath::stackTraceArray, vm); + return ArrayObject::acons(rec, Classpath::stackTraceArray, &(vm->allocator)); } } Added: vmkit/trunk/lib/JnJVM/VMCore/JavaAllocator.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaAllocator.h?rev=54779&view=auto ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaAllocator.h (added) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaAllocator.h Thu Aug 14 10:58:53 2008 @@ -0,0 +1,45 @@ +//===------- JavaAllocator.h - A memory allocator for Jnjvm ---------------===// +// +// JnJVM +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef JNJVM_JAVA_ALLOCATOR_H +#define JNJVM_JAVA_ALLOCATOR_H + +#include "MvmGC.h" + +#ifdef MULTIPLE_GC +#define allocator_new(alloc, cl) collector_new(cl, alloc.GC) +#else +#define allocator_new(alloc, cl) gc_new(cl) +#endif + +namespace jnjvm { + +class JavaAllocator { + +#ifdef MULTIPLE_GC + Collector* GC; +#endif + +public: + +#ifndef MULTIPLE_GC + void* allocateObject(unsigned int sz, VirtualTable* VT) { + return gc::operator new(sz, VT); + } +#else + void* allocateObject(unsigned int sz, VirtualTable* VT) { + return gc::operator new(sz, VT, GC); + } +#endif + +}; + +} // end namespace jnjvm + +#endif // JNJVM_JAVA_ALLOCATOR_H Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaArray.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaArray.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaArray.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaArray.cpp Thu Aug 14 10:58:53 2008 @@ -16,6 +16,7 @@ #include "JavaTypes.h" #include "Jnjvm.h" #include "JavaThread.h" +#include "LockedMap.h" using namespace jnjvm; @@ -49,30 +50,30 @@ extern "C" void outOfMemoryError(sint32 val); #ifndef MULTIPLE_VM -#define ACONS(name, elmt, primSize, VT) \ - name *name::acons(sint32 n, ClassArray* atype, Jnjvm* vm) { \ - if (n < 0) \ - negativeArraySizeException(n); \ - else if (n > JavaArray::MaxArraySize) \ - outOfMemoryError(n); \ - name* res = (name*) \ - (Object*) operator new(sizeof(name) + n * primSize, VT); \ - res->initialise(atype); \ - res->size = n; \ - return res; \ +#define ACONS(name, elmt, primSize, VT) \ + name *name::acons(sint32 n, ClassArray* atype, JavaAllocator* allocator) { \ + if (n < 0) \ + negativeArraySizeException(n); \ + else if (n > JavaArray::MaxArraySize) \ + outOfMemoryError(n); \ + name* res = (name*) \ + (Object*) allocator->allocateObject(sizeof(name) + n * primSize, VT); \ + res->initialise(atype); \ + res->size = n; \ + return res; \ } #else -#define ACONS(name, elmt, primSize, VT) \ - name *name::acons(sint32 n, ClassArray* atype, Jnjvm* vm) { \ - if (n < 0) \ - negativeArraySizeException(n); \ - else if (n > JavaArray::MaxArraySize) \ - outOfMemoryError(n); \ - name* res = (name*) \ - (Object*) vm->allocateObject(sizeof(name) + n * primSize, VT); \ - res->initialise(atype); \ - res->size = n; \ - return res; \ +#define ACONS(name, elmt, primSize, VT) \ + name *name::acons(sint32 n, ClassArray* atype, JavaAllocator* allocator) { \ + if (n < 0) \ + negativeArraySizeException(n); \ + else if (n > JavaArray::MaxArraySize) \ + outOfMemoryError(n); \ + name* res = (name*) \ + (Object*) allocator->allocateObject(sizeof(name) + n * primSize, VT); \ + res->initialise(atype); \ + res->size = n; \ + return res; \ } #endif @@ -100,7 +101,7 @@ buf->writeChar((char)elements[i]); } -const UTF8* UTF8::javaToInternal(Jnjvm* vm, unsigned int start, +const UTF8* UTF8::javaToInternal(UTF8Map* map, unsigned int start, unsigned int len) const { uint16* java = (uint16*) alloca(len * sizeof(uint16)); for (uint32 i = 0; i < len; i++) { @@ -109,10 +110,10 @@ else java[i] = cur; } - return readerConstruct(vm, java, len); + return map->lookupOrCreateReader(java, len); } -const UTF8* UTF8::internalToJava(Jnjvm *vm, unsigned int start, +const UTF8* UTF8::internalToJava(UTF8Map* map, unsigned int start, unsigned int len) const { uint16* java = (uint16*) alloca(len * sizeof(uint16)); for (uint32 i = 0; i < len; i++) { @@ -121,10 +122,10 @@ else java[i] = cur; } - return readerConstruct(vm, java, len); + return map->lookupOrCreateReader(java, len); } -const UTF8* UTF8::extract(Jnjvm *vm, uint32 start, uint32 end) const { +const UTF8* UTF8::extract(UTF8Map* map, uint32 start, uint32 end) const { uint32 len = end - start; uint16* buf = (uint16*)alloca(sizeof(uint16) * len); @@ -132,15 +133,7 @@ buf[i] = elements[i + start]; } - return readerConstruct(vm, buf, len); -} - -const UTF8* UTF8::asciizConstruct(Jnjvm* vm, char* asciiz) { - return vm->asciizConstructUTF8(asciiz); -} - -const UTF8* UTF8::readerConstruct(Jnjvm* vm, uint16* buf, uint32 n) { - return vm->readerConstructUTF8(buf, n); + return map->lookupOrCreateReader(buf, len); } char* UTF8::UTF8ToAsciiz() const { @@ -167,13 +160,13 @@ free(obj); } -const UTF8* UTF8::acons(sint32 n, ClassArray* cl, Jnjvm* vm) { +const UTF8* UTF8::acons(sint32 n, ClassArray* cl, JavaAllocator* allocator) { if (n < 0) negativeArraySizeException(n); else if (n > JavaArray::MaxArraySize) outOfMemoryError(n); UTF8* res = new (n) UTF8(); - res->initialise(cl); + res->initialise(cl); res->size = n; return (const UTF8*)res; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h Thu Aug 14 10:58:53 2008 @@ -24,6 +24,7 @@ class ClassArray; class CommonClass; +class JavaAllocator; class JavaObject; class Jnjvm; @@ -91,7 +92,7 @@ #define ARRAYCLASS(name, elmt) \ class name : public TJavaArray { \ public: \ - static name* acons(sint32 n, ClassArray* cl, Jnjvm* vm); \ + static name* acons(sint32 n, ClassArray* cl, JavaAllocator* allocator); \ } ARRAYCLASS(ArrayUInt8, uint8); @@ -116,7 +117,7 @@ /// acons - Allocates a Java array of objects. The class given as argument is /// the class of the array, not the class of its elements. - static ArrayObject* acons(sint32 n, ClassArray* cl, Jnjvm* vm); + static ArrayObject* acons(sint32 n, ClassArray* cl, JavaAllocator* allocator); /// tracer - The tracer method of Java arrays of objects. This method will /// trace all objects in the array. @@ -133,32 +134,25 @@ /// acons - Allocates an UTF8 in permanent memory. The class argument must be /// JavaArray::ofChar. - static const UTF8* acons(sint32 n, ClassArray* cl, Jnjvm* vm); + static const UTF8* acons(sint32 n, ClassArray* cl, JavaAllocator* allocator); /// internalToJava - Creates a copy of the UTF8 at its given offset and size /// woth all its '.' replaced by '/'. The JVM bytecode reference classes in /// packages with the '.' as the separating character. The JVM language uses /// the '/' character. - const UTF8* internalToJava(Jnjvm *vm, unsigned int start, + const UTF8* internalToJava(UTF8Map* map, unsigned int start, unsigned int len) const; /// javaToInternal - Replaces all '/' into '.'. - const UTF8* javaToInternal(Jnjvm *vm, unsigned int start, + const UTF8* javaToInternal(UTF8Map* map, unsigned int start, unsigned int len) const; /// UTF8ToAsciiz - Allocates a C string with the contents of this UTF8. char* UTF8ToAsciiz() const; - /// asciizConstruct - Constructs an UTF8 with the given C string. - static const UTF8* asciizConstruct(Jnjvm *vm, char* asciiz); - - /// readerConstruct - Constructs an UTF8 with the given buffer and size. - /// This function is called when parsing JVM bytecode. - static const UTF8* readerConstruct(Jnjvm *vm, uint16* buf, uint32 n); - /// extract - Creates an UTF8 by extracting the contents at the given size /// of this. - const UTF8* extract(Jnjvm *vm, uint32 start, uint32 len) const; + const UTF8* extract(UTF8Map* map, uint32 start, uint32 len) const; /// equals - Returns whether two UTF8s are equals. When the JnJVM executes /// in single mode, equality is just a pointer comparison. When executing Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaBacktrace.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaBacktrace.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaBacktrace.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaBacktrace.cpp Thu Aug 14 10:58:53 2008 @@ -106,5 +106,5 @@ JavaObject* JavaJIT::getCallingClassLoader() { Class* cl = getCallingClassWalker(); if (!cl) return 0; - else return cl->classLoader; + else return cl->classLoader->getJavaClassLoader(); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Thu Aug 14 10:58:53 2008 @@ -36,8 +36,6 @@ const UTF8* Attribut::innerClassesAttribut = 0; const UTF8* Attribut::sourceFileAttribut = 0; -JavaObject* CommonClass::jnjvmClassLoader = 0; - CommonClass* ClassArray::SuperArray = 0; std::vector ClassArray::InterfacesArray; @@ -97,7 +95,6 @@ CommonClass::CommonClass() { display = 0; - isolate = 0; lockVar = 0; condVar = 0; virtualVT = 0; @@ -206,12 +203,12 @@ buf->write(">"); } -CommonClass::CommonClass(Jnjvm* vm, const UTF8* n, bool isArray) { +CommonClass::CommonClass(JnjvmClassLoader* loader, const UTF8* n, bool isArray) { name = n; this->lockVar = mvm::Lock::allocRecursive(); this->condVar = mvm::Cond::allocCond(); this->status = hashed; - this->isolate = vm; + this->classLoader = loader; this->isArray = isArray; this->isPrimitive = false; #ifndef MULTIPLE_VM @@ -219,8 +216,8 @@ #endif } -ClassPrimitive::ClassPrimitive(Jnjvm* vm, const UTF8* n) : - CommonClass(vm, n, false) { +ClassPrimitive::ClassPrimitive(JnjvmClassLoader* loader, const UTF8* n) : + CommonClass(loader, n, false) { display = (CommonClass**)malloc(sizeof(CommonClass*)); display[0] = this; @@ -229,8 +226,7 @@ access = ACC_ABSTRACT | ACC_FINAL | ACC_PUBLIC; } -Class::Class(Jnjvm* vm, const UTF8* n) : CommonClass(vm, n, false) { - classLoader = 0; +Class::Class(JnjvmClassLoader* loader, const UTF8* n) : CommonClass(loader, n, false) { bytes = 0; super = 0; ctpInfo = 0; @@ -239,8 +235,7 @@ #endif } -ClassArray::ClassArray(Jnjvm* vm, const UTF8* n) : CommonClass(vm, n, true) { - classLoader = 0; +ClassArray::ClassArray(JnjvmClassLoader* loader, const UTF8* n) : CommonClass(loader, n, true) { _funcs = 0; _baseClass = 0; super = ClassArray::SuperArray; @@ -266,24 +261,24 @@ } void ClassArray::resolveComponent() { - AssessorDesc::introspectArray(isolate, classLoader, name, 0, _funcs, + AssessorDesc::introspectArray(classLoader, name, 0, _funcs, _baseClass); } -JavaObject* ClassArray::arrayLoader(Jnjvm* isolate, const UTF8* name, - JavaObject* loader, - unsigned int start, unsigned int len) { +JnjvmClassLoader* ClassArray::arrayLoader(const UTF8* name, + JnjvmClassLoader* loader, + unsigned int start, + unsigned int len) { if (name->elements[start] == AssessorDesc::I_TAB) { - return arrayLoader(isolate, name, loader, start + 1, len - 1); + return arrayLoader(name, loader, start + 1, len - 1); } else if (name->elements[start] == AssessorDesc::I_REF) { - const UTF8* componentName = name->javaToInternal(isolate, start + 1, + const UTF8* componentName = name->javaToInternal(loader->hashUTF8, start + 1, len - 2); - CommonClass* cl = isolate->loadName(componentName, loader, false, false, - true); + CommonClass* cl = loader->loadName(componentName, false, false, true); return cl->classLoader; } else { - return 0; + return JnjvmClassLoader::bootstrapLoader; } } @@ -293,7 +288,7 @@ classDef->acquire(); if (code == 0) { code = - classDef->isolate->TheModuleProvider->materializeFunction(this); + classDef->classLoader->TheModuleProvider->materializeFunction(this); } classDef->release(); return code; @@ -405,7 +400,7 @@ JavaObject* Class::doNew(Jnjvm* vm) { assert(this->isReady() && "Uninitialized class when allocating."); - JavaObject* res = (JavaObject*)vm->allocateObject(virtualSize, virtualVT); + JavaObject* res = (JavaObject*)vm->allocator.allocateObject(virtualSize, virtualVT); res->classOf = this; return res; } @@ -436,16 +431,14 @@ while (res && Tname->elements[prof] == AssessorDesc::I_TAB) { CommonClass* cl = ((ClassArray*)curS)->baseClass(); - Jnjvm *vm = cl->isolate; ++prof; - vm->resolveClass(cl, false); + classLoader->resolveClass(cl, false); res = curS->isArray && cl && (prof < len); curS = cl; } - Jnjvm *vm = this->isolate; return (Tname->elements[prof] == AssessorDesc::I_REF) && - (res && curS->inheritName(Tname->extract(vm, prof + 1, len - 1))); + (res && curS->inheritName(Tname->extract(classLoader->hashUTF8, prof + 1, len - 1))); } else { return false; } @@ -540,11 +533,11 @@ } void CommonClass::resolveClass(bool doClinit) { - isolate->resolveClass(this, doClinit); + classLoader->resolveClass(this, doClinit); } void CommonClass::initialiseClass() { - return isolate->initialiseClass(this); + return JavaThread::get()->isolate->initialiseClass(this); } #ifdef MULTIPLE_VM Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Thu Aug 14 10:58:53 2008 @@ -23,7 +23,7 @@ #include "mvm/Threads/Locks.h" #include "JavaAccess.h" -#include "Jnjvm.h" +#include "JnjvmClassLoader.h" namespace jnjvm { @@ -200,10 +200,6 @@ /// const UTF8* name; - /// isolate - Which isolate defined this class. - /// - Jnjvm *isolate; - /// status - The loading/resolve/initialization state of the class. /// JavaState status; @@ -233,9 +229,9 @@ /// process of this class, done by another thread. mvm::Cond* condVar; - /// classLoader - The Java class loader that loaded the class. + /// classLoader - The Jnjvm class loader that loaded the class. /// - JavaObject* classLoader; + JnjvmClassLoader* classLoader; #ifndef MULTIPLE_VM /// delegatee - The java/lang/Class object representing this class @@ -418,17 +414,13 @@ /// CommonClass - Create a class with th given name. /// - CommonClass(Jnjvm* vm, const UTF8* name, bool isArray); + CommonClass(JnjvmClassLoader* loader, const UTF8* name, bool isArray); /// VT - The virtual table of instances of this class (TODO: should be /// removed). /// static VirtualTable* VT; - /// jnjvmClassLoader - The bootstrap class loader (null). - /// - static JavaObject* jnjvmClassLoader; - /// ~CommonClass - Free memory used by this class, and remove it from /// metadata. /// @@ -457,7 +449,7 @@ /// class ClassPrimitive : public CommonClass { public: - ClassPrimitive(Jnjvm* vm, const UTF8* name); + ClassPrimitive(JnjvmClassLoader* loader, const UTF8* name); }; @@ -557,7 +549,7 @@ /// Class - Create a class in the given virtual machine and with the given /// name. - Class(Jnjvm* vm, const UTF8* name); + Class(JnjvmClassLoader* loader, const UTF8* name); }; @@ -606,16 +598,17 @@ /// ClassArray - Construct a Java array class with the given name. /// - ClassArray(Jnjvm* vm, const UTF8* name); + ClassArray(JnjvmClassLoader* loader, const UTF8* name); /// arrayLoader - Return the class loader of the class with the name 'name'. /// If the class has not been loaded, load it with the given loader and /// return the real class loader that loaded this class. /// - static JavaObject* arrayLoader(Jnjvm* isolate, const UTF8* name, - JavaObject* loader, unsigned int start, - unsigned int end); + static JnjvmClassLoader* arrayLoader(const UTF8* name, + JnjvmClassLoader* loader, + unsigned int start, + unsigned int end); /// print - Print a string representation of this array class. Used for /// debugging purposes. @@ -704,7 +697,7 @@ /// Signdef* getSignature() { if(!_signature) - _signature = classDef->isolate->constructSign(type); + _signature = classDef->classLoader->constructSign(type); return _signature; } @@ -838,7 +831,7 @@ /// Typedef* getSignature() { if(!_signature) - _signature = classDef->isolate->constructType(type); + _signature = classDef->classLoader->constructType(type); return _signature; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Thu Aug 14 10:58:53 2008 @@ -25,6 +25,7 @@ #include "JnjvmModuleProvider.h" #include "JavaThread.h" #include "JavaTypes.h" +#include "LockedMap.h" #include "Reader.h" using namespace jnjvm; @@ -42,7 +43,7 @@ const uint32 JavaCtpInfo::ConstantNameAndType = 12; -static uint32 unimplemented(Jnjvm* vm, uint32 type, uint32 e, Reader& reader, +static uint32 unimplemented(Class* cl, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType) { JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, "unknown constant pool type %d", @@ -51,7 +52,7 @@ } -uint32 JavaCtpInfo::CtpReaderClass(Jnjvm* vm, uint32 type, uint32 e, +uint32 JavaCtpInfo::CtpReaderClass(Class* cl, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType) { uint16 entry = reader.readU2(); @@ -61,7 +62,7 @@ return 1; } -uint32 JavaCtpInfo::CtpReaderInteger(Jnjvm* vm, uint32 type, uint32 e, +uint32 JavaCtpInfo::CtpReaderInteger(Class* cl, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType) { uint32 val = reader.readU4(); @@ -71,7 +72,7 @@ return 1; } -uint32 JavaCtpInfo::CtpReaderFloat(Jnjvm* vm, uint32 type, uint32 e, +uint32 JavaCtpInfo::CtpReaderFloat(Class* cl, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType) { uint32 val = reader.readU4(); @@ -81,7 +82,7 @@ return 1; } -uint32 JavaCtpInfo::CtpReaderUTF8(Jnjvm* vm, uint32 type, uint32 e, +uint32 JavaCtpInfo::CtpReaderUTF8(Class* cl, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType) { uint16 len = reader.readU2(); @@ -111,7 +112,7 @@ ++n; } - const UTF8* utf8 = UTF8::readerConstruct(vm, buf, n); + const UTF8* utf8 = cl->classLoader->hashUTF8->lookupOrCreateReader(buf, n); ctpRes[e] = (UTF8*)utf8; PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, "; [%5d] \t\t\"%s\"\n", e, @@ -120,9 +121,10 @@ return 1; } -uint32 JavaCtpInfo::CtpReaderNameAndType(Jnjvm* vm, uint32 type, uint32 e, - Reader& reader, sint32* ctpDef, - void** ctpRes, uint8* ctpType) { +uint32 JavaCtpInfo::CtpReaderNameAndType(Class* cl, uint32 type, + uint32 e, Reader& reader, + sint32* ctpDef, void** ctpRes, + uint8* ctpType) { uint32 entry = reader.readU4(); ctpDef[e] = entry; PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, @@ -131,8 +133,8 @@ return 1; } -uint32 JavaCtpInfo::CtpReaderFieldref(Jnjvm* vm, uint32 type, uint32 e, - Reader& reader, sint32* ctpDef, +uint32 JavaCtpInfo::CtpReaderFieldref(Class* cl, uint32 type, + uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType) { uint32 entry = reader.readU4(); ctpDef[e] = entry; @@ -142,7 +144,7 @@ return 1; } -uint32 JavaCtpInfo::CtpReaderString(Jnjvm* vm, uint32 type, uint32 e, +uint32 JavaCtpInfo::CtpReaderString(Class* cl, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType) { uint16 entry = reader.readU2(); @@ -152,8 +154,8 @@ return 1; } -uint32 JavaCtpInfo::CtpReaderMethodref(Jnjvm* vm, uint32 type, uint32 e, - Reader& reader, sint32* ctpDef, +uint32 JavaCtpInfo::CtpReaderMethodref(Class* cl, uint32 type, + uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType) { uint32 entry = reader.readU4(); ctpDef[e] = entry; @@ -163,7 +165,8 @@ return 1; } -uint32 JavaCtpInfo::CtpReaderInterfaceMethodref(Jnjvm* vm, uint32 type, +uint32 JavaCtpInfo::CtpReaderInterfaceMethodref(Class* cl, + uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType) { @@ -175,7 +178,7 @@ return 1; } -uint32 JavaCtpInfo::CtpReaderLong(Jnjvm* vm, uint32 type, uint32 e, +uint32 JavaCtpInfo::CtpReaderLong(Class* cl, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType) { ctpDef[e + 1] = reader.readU4(); @@ -186,7 +189,7 @@ return 2; } -uint32 JavaCtpInfo::CtpReaderDouble(Jnjvm* vm, uint32 type, uint32 e, +uint32 JavaCtpInfo::CtpReaderDouble(Class* cl, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType) { ctpDef[e + 1] = reader.readU4(); @@ -197,7 +200,7 @@ return 2; } -void JavaCtpInfo::read(Jnjvm *vm, Class* cl, Reader& reader) { +void JavaCtpInfo::read(Class* cl, Reader& reader) { uint32 nbCtp = reader.readU2(); JavaCtpInfo* res = new JavaCtpInfo(); @@ -216,7 +219,7 @@ while (cur < nbCtp) { uint8 curType = reader.readU1(); res->ctpType[cur] = curType; - cur += ((funcsReader[curType])(vm, curType, cur, reader, res->ctpDef, + cur += ((funcsReader[curType])(cl, curType, cur, reader, res->ctpDef, res->ctpRes, res->ctpType)); } } @@ -284,15 +287,14 @@ CommonClass* JavaCtpInfo::loadClass(uint32 index) { CommonClass* temp = isLoadedClassOrClassName(index); if (!temp) { - JavaObject* loader = classDef->classLoader; + JnjvmClassLoader* loader = classDef->classLoader; const UTF8* name = UTF8At(ctpDef[index]); if (name->elements[0] == AssessorDesc::I_TAB) { // Don't put into ctpRes because the class can be isolate specific - temp = JavaThread::get()->isolate->constructArray(name, loader); + temp = loader->constructArray(name); } else { // Put into ctpRes because there is only one representation of the class - ctpRes[index] = temp = classDef->isolate->loadName(name, loader, false, - false, false); + ctpRes[index] = temp = loader->loadName(name, false, false, false); } } return temp; @@ -301,12 +303,11 @@ CommonClass* JavaCtpInfo::getMethodClassIfLoaded(uint32 index) { CommonClass* temp = isLoadedClassOrClassName(index); if (!temp) { - JavaObject* loader = classDef->classLoader; + JnjvmClassLoader* loader = classDef->classLoader; const UTF8* name = UTF8At(ctpDef[index]); - temp = JavaThread::get()->isolate->lookupClass(name, loader); + temp = loader->lookupClass(name); if (!temp) - temp = Jnjvm::bootstrapVM->lookupClass(name, - CommonClass::jnjvmClassLoader); + temp = JnjvmClassLoader::bootstrapLoader->lookupClass(name); } return temp; } @@ -328,7 +329,7 @@ } sint32 entry = ctpDef[index]; const UTF8* type = UTF8At(entry & 0xFFFF); - Typedef* sign = classDef->isolate->constructType(type); + Typedef* sign = classDef->classLoader->constructType(type); ctpRes[index] = sign; return sign; } @@ -344,7 +345,7 @@ } sint32 entry = ctpDef[index]; const UTF8* type = UTF8At(entry & 0xFFFF); - Signdef* sign = classDef->isolate->constructSign(type); + Signdef* sign = classDef->classLoader->constructSign(type); ctpRes[index] = sign; return sign; } @@ -419,7 +420,7 @@ cl->lookupMethodDontThrow(utf8, sign->keyName, isStatic(access), false); if (meth) { // don't throw if no meth, the exception will be thrown just in time - JnjvmModule* M = classDef->isolate->TheModule; + JnjvmModule* M = classDef->classLoader->TheModule; void* F = M->getMethod(meth); ctpRes[index] = (void*)F; return F; @@ -431,8 +432,8 @@ return ctpRes[index]; } else { void* val = - classDef->isolate->TheModuleProvider->addCallback(classDef, index, sign, - isStatic(access)); + classDef->classLoader->TheModuleProvider->addCallback(classDef, index, sign, + isStatic(access)); ctpRes[index] = val; return val; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h Thu Aug 14 10:58:53 2008 @@ -17,14 +17,17 @@ namespace jnjvm { class Class; +class CommonClass; class Jnjvm; +class JavaField; +class JavaMethod; class JavaString; class Reader; class Signdef; class Typedef; class UTF8; -typedef uint32 (*ctpReader)(Jnjvm*, uint32, uint32, Reader&, sint32*, void**, uint8*); +typedef uint32 (*ctpReader)(Class*, uint32, uint32, Reader&, sint32*, void**, uint8*); class JavaCtpInfo { public: @@ -48,42 +51,42 @@ static ctpReader funcsReader[16]; - static uint32 CtpReaderClass(Jnjvm* vm, uint32 type, uint32 e, Reader& reader, + static uint32 CtpReaderClass(Class*, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType); - static uint32 CtpReaderInteger(Jnjvm* vm, uint32 type, uint32 e, Reader& reader, + static uint32 CtpReaderInteger(Class*, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType); - static uint32 CtpReaderFloat(Jnjvm* vm, uint32 type, uint32 e, Reader& reader, + static uint32 CtpReaderFloat(Class*, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType); - static uint32 CtpReaderUTF8(Jnjvm* vm, uint32 type, uint32 e, Reader& reader, + static uint32 CtpReaderUTF8(Class*, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType); - static uint32 CtpReaderNameAndType(Jnjvm* vm, uint32 type, uint32 e, Reader& reader, + static uint32 CtpReaderNameAndType(Class*, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType); - static uint32 CtpReaderFieldref(Jnjvm* vm, uint32 type, uint32 e, Reader& reader, + static uint32 CtpReaderFieldref(Class*, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType); - static uint32 CtpReaderString(Jnjvm* vm, uint32 type, uint32 e, Reader& reader, + static uint32 CtpReaderString(Class*, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType); - static uint32 CtpReaderMethodref(Jnjvm* vm, uint32 type, uint32 e, Reader& reader, + static uint32 CtpReaderMethodref(Class*, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType); - static uint32 CtpReaderInterfaceMethodref(Jnjvm* vm, uint32 type, uint32 e, + static uint32 CtpReaderInterfaceMethodref(Class*, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType); - static uint32 CtpReaderLong(Jnjvm* vm, uint32 type, uint32 e, Reader& reader, + static uint32 CtpReaderLong(Class*, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType); - static uint32 CtpReaderDouble(Jnjvm* vm, uint32 type, uint32 e, Reader& reader, + static uint32 CtpReaderDouble(Class*, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType); - static void read(Jnjvm *vm, Class* cl, Reader& reader); + static void read(Class* cl, Reader& reader); bool isAStaticCall(uint32 index) { return (ctpType[index] & 0x80) != 0; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp Thu Aug 14 10:58:53 2008 @@ -7,7 +7,6 @@ // //===----------------------------------------------------------------------===// -#include #include #include "mvm/VirtualMachine.h" @@ -51,6 +50,8 @@ INIT(StaticInstanceMap); INIT(DelegateeMap); INIT(JavaIsolate); + INIT(JnjvmBootstrapLoader); + INIT(JnjvmClassLoader); #ifdef SERVICE_VM INIT(ServiceDomain); #endif @@ -71,86 +72,73 @@ static void initialiseStatics() { - Jnjvm* vm = JavaIsolate::bootstrapVM = JavaIsolate::allocateBootstrap(); + JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader = JnjvmClassLoader::createBootstrapLoader(); // Array initialization - const UTF8* utf8OfChar = vm->asciizConstructUTF8("[C"); - JavaArray::ofChar = vm->constructArray(utf8OfChar, - CommonClass::jnjvmClassLoader); + const UTF8* utf8OfChar = JCL->asciizConstructUTF8("[C"); + JavaArray::ofChar = JCL->constructArray(utf8OfChar); ((UTF8*)utf8OfChar)->classOf = JavaArray::ofChar; ClassArray::InterfacesArray.push_back( - vm->constructClass(vm->asciizConstructUTF8("java/lang/Cloneable"), - CommonClass::jnjvmClassLoader)); + JCL->constructClass(JCL->asciizConstructUTF8("java/lang/Cloneable"))); ClassArray::InterfacesArray.push_back( - vm->constructClass(vm->asciizConstructUTF8("java/io/Serializable"), - CommonClass::jnjvmClassLoader)); + JCL->constructClass(JCL->asciizConstructUTF8("java/io/Serializable"))); ClassArray::SuperArray = - vm->constructClass(vm->asciizConstructUTF8("java/lang/Object"), - CommonClass::jnjvmClassLoader); + JCL->constructClass(JCL->asciizConstructUTF8("java/lang/Object")); JavaArray::ofChar->interfaces = ClassArray::InterfacesArray; JavaArray::ofChar->super = ClassArray::SuperArray; - JavaArray::ofByte = vm->constructArray(vm->asciizConstructUTF8("[B"), - CommonClass::jnjvmClassLoader); + JavaArray::ofByte = JCL->constructArray(JCL->asciizConstructUTF8("[B")); JavaArray::ofString = - vm->constructArray(vm->asciizConstructUTF8("[Ljava/lang/String;"), - CommonClass::jnjvmClassLoader); + JCL->constructArray(JCL->asciizConstructUTF8("[Ljava/lang/String;")); JavaArray::ofObject = - vm->constructArray(vm->asciizConstructUTF8("[Ljava/lang/Object;"), - CommonClass::jnjvmClassLoader); + JCL->constructArray(JCL->asciizConstructUTF8("[Ljava/lang/Object;")); - JavaArray::ofInt = vm->constructArray(vm->asciizConstructUTF8("[I"), - CommonClass::jnjvmClassLoader); + JavaArray::ofInt = JCL->constructArray(JCL->asciizConstructUTF8("[I")); - JavaArray::ofBool = vm->constructArray(vm->asciizConstructUTF8("[Z"), - CommonClass::jnjvmClassLoader); + JavaArray::ofBool = JCL->constructArray(JCL->asciizConstructUTF8("[Z")); - JavaArray::ofLong = vm->constructArray(vm->asciizConstructUTF8("[J"), - CommonClass::jnjvmClassLoader); + JavaArray::ofLong = JCL->constructArray(JCL->asciizConstructUTF8("[J")); - JavaArray::ofFloat = vm->constructArray(vm->asciizConstructUTF8("[F"), - CommonClass::jnjvmClassLoader); + JavaArray::ofFloat = JCL->constructArray(JCL->asciizConstructUTF8("[F")); - JavaArray::ofDouble = vm->constructArray(vm->asciizConstructUTF8("[D"), - CommonClass::jnjvmClassLoader); + JavaArray::ofDouble = JCL->constructArray(JCL->asciizConstructUTF8("[D")); - JavaArray::ofShort = vm->constructArray(vm->asciizConstructUTF8("[S"), - CommonClass::jnjvmClassLoader); + JavaArray::ofShort = JCL->constructArray(JCL->asciizConstructUTF8("[S")); // End array initialization - AssessorDesc::initialise(vm); + AssessorDesc::initialise(JCL); - Attribut::codeAttribut = vm->asciizConstructUTF8("Code"); - Attribut::exceptionsAttribut = vm->asciizConstructUTF8("Exceptions"); - Attribut::constantAttribut = vm->asciizConstructUTF8("ConstantValue"); + Attribut::codeAttribut = JCL->asciizConstructUTF8("Code"); + Attribut::exceptionsAttribut = JCL->asciizConstructUTF8("Exceptions"); + Attribut::constantAttribut = JCL->asciizConstructUTF8("ConstantValue"); Attribut::lineNumberTableAttribut = - vm->asciizConstructUTF8("LineNumberTable"); - Attribut::innerClassesAttribut = vm->asciizConstructUTF8("InnerClasses"); - Attribut::sourceFileAttribut = vm->asciizConstructUTF8("SourceFile"); - - Jnjvm::initName = vm->asciizConstructUTF8(""); - Jnjvm::clinitName = vm->asciizConstructUTF8(""); - Jnjvm::clinitType = vm->asciizConstructUTF8("()V"); - Jnjvm::runName = vm->asciizConstructUTF8("run"); - Jnjvm::prelib = vm->asciizConstructUTF8("lib"); + JCL->asciizConstructUTF8("LineNumberTable"); + Attribut::innerClassesAttribut = JCL->asciizConstructUTF8("InnerClasses"); + Attribut::sourceFileAttribut = JCL->asciizConstructUTF8("SourceFile"); + + Jnjvm::initName = JCL->asciizConstructUTF8(""); + Jnjvm::clinitName = JCL->asciizConstructUTF8(""); + Jnjvm::clinitType = JCL->asciizConstructUTF8("()V"); + Jnjvm::runName = JCL->asciizConstructUTF8("run"); + Jnjvm::prelib = JCL->asciizConstructUTF8("lib"); #if defined(__MACH__) - Jnjvm::postlib = vm->asciizConstructUTF8(".dylib"); + Jnjvm::postlib = JCL->asciizConstructUTF8(".dylib"); #else - Jnjvm::postlib = vm->asciizConstructUTF8(".so"); + Jnjvm::postlib = JCL->asciizConstructUTF8(".so"); #endif - Jnjvm::mathName = vm->asciizConstructUTF8("java/lang/Math"); + Jnjvm::mathName = JCL->asciizConstructUTF8("java/lang/Math"); #define DEF_UTF8(var) \ - Jnjvm::var = vm->asciizConstructUTF8(#var) + Jnjvm::var = JCL->asciizConstructUTF8(#var) DEF_UTF8(abs); DEF_UTF8(sqrt); @@ -184,12 +172,12 @@ extern "C" void ClasspathBoot(); void mvm::VirtualMachine::initialiseJVM() { - if (!JavaIsolate::bootstrapVM) { + if (!JnjvmClassLoader::bootstrapLoader) { initialiseVT(); initialiseStatics(); ClasspathBoot(); - Classpath::initialiseClasspath(JavaIsolate::bootstrapVM); + Classpath::initialiseClasspath(JnjvmClassLoader::bootstrapLoader); } } @@ -199,15 +187,11 @@ } mvm::VirtualMachine* mvm::VirtualMachine::createJVM() { -#if !defined(MULTIPLE_VM) - JavaIsolate* vm = (JavaIsolate*)JavaIsolate::bootstrapVM; -#else #ifdef SERVICE_VM - ServiceDomain* vm = ServiceDomain::allocateService((JavaIsolate*)Jnjvm::bootstrapVM); + ServiceDomain* vm = ServiceDomain::allocateService(); vm->startExecution(); #else - JavaIsolate* vm = JavaIsolate::allocateIsolate(JavaIsolate::bootstrapVM); -#endif + JavaIsolate* vm = JavaIsolate::allocateIsolate(); #endif return vm; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp Thu Aug 14 10:58:53 2008 @@ -103,13 +103,14 @@ sprintf(temp, "%s:%s", vm->classpath, jarFile); vm->setClasspath(temp); - ArrayUInt8* bytes = Reader::openFile(vm, jarFile); + ArrayUInt8* bytes = Reader::openFile(JnjvmClassLoader::bootstrapLoader, + jarFile); ZipArchive archive(bytes); if (archive.getOfscd() != -1) { ZipFile* file = archive.getFile(PATH_MANIFEST); if (file) { - ArrayUInt8* res = ArrayUInt8::acons(file->ucsize, JavaArray::ofByte, vm); + ArrayUInt8* res = ArrayUInt8::acons(file->ucsize, JavaArray::ofByte, &vm->allocator); int ok = archive.readFile(res, file); if (ok) { char* mainClass = findInformation(res, MAIN_CLASS, LENGTH_MAIN_CLASS); @@ -224,7 +225,7 @@ printInformation(); } else { char* path = &cur[16]; - vm->analyseClasspathEnv(path); + JnjvmClassLoader::bootstrapLoader->analyseClasspathEnv(path); } } else if (!(strcmp(cur, "-enableassertions"))) { nyi(); @@ -306,9 +307,10 @@ } -JavaObject* JavaIsolate::loadAppClassLoader() { +JnjvmClassLoader* JavaIsolate::loadAppClassLoader() { if (appClassLoader == 0) { - appClassLoader = Classpath::getSystemClassLoader->invokeJavaObjectStatic(this); + JavaObject* loader = Classpath::getSystemClassLoader->invokeJavaObjectStatic(this); + appClassLoader = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader); } return appClassLoader; } @@ -318,26 +320,27 @@ } void JavaIsolate::loadBootstrap() { - loadName(Classpath::newVMThrowable->name, - CommonClass::jnjvmClassLoader, true, true, true); - loadName(Classpath::newClass->name, - CommonClass::jnjvmClassLoader, true, true, true); - loadName(Classpath::newConstructor->name, - CommonClass::jnjvmClassLoader, true, true, true); - loadName(Classpath::newMethod->name, - CommonClass::jnjvmClassLoader, true, true, true); - loadName(Classpath::newField->name, - CommonClass::jnjvmClassLoader, true, true, true); - loadName(Classpath::newStackTraceElement->name, - CommonClass::jnjvmClassLoader, true, true, true); + JnjvmClassLoader* loader = JnjvmClassLoader::bootstrapLoader; + loader->loadName(Classpath::newVMThrowable->name, + true, true, true); + loader->loadName(Classpath::newClass->name, + true, true, true); + loader->loadName(Classpath::newConstructor->name, + true, true, true); + loader->loadName(Classpath::newMethod->name, + true, true, true); + loader->loadName(Classpath::newField->name, + true, true, true); + loader->loadName(Classpath::newStackTraceElement->name, + true, true, true); mapInitialThread(); loadAppClassLoader(); JavaObject* obj = JavaThread::currentThread(); - Classpath::setContextClassLoader->invokeIntSpecial(this, obj, appClassLoader); + Classpath::setContextClassLoader->invokeIntSpecial(this, obj, appClassLoader->getJavaClassLoader()); // load and initialise math since it is responsible for dlopen'ing // libjavalang.so and we are optimizing some math operations - loadName(asciizConstructUTF8("java/lang/Math"), - CommonClass::jnjvmClassLoader, true, true, true); + loader->loadName(loader->asciizConstructUTF8("java/lang/Math"), + true, true, true); } void JavaIsolate::executeClass(const char* className, ArrayObject* args) { @@ -408,7 +411,7 @@ } } - ArrayObject* args = ArrayObject::acons(argc - 2, JavaArray::ofString, this); + ArrayObject* args = ArrayObject::acons(argc - 2, JavaArray::ofString, &allocator); for (int i = 2; i < argc; ++i) { args->elements[i - 2] = (JavaObject*)asciizToStr(argv[i]); } @@ -419,17 +422,14 @@ } void JavaIsolate::runIsolate(const char* className, ArrayObject* args) { - JavaIsolate *isolate = allocateIsolate(bootstrapVM); + JavaIsolate *isolate = allocateIsolate(); isolate->loadBootstrap(); isolate->executeClass(className, args); isolate->waitForExit(); } -extern const char* GNUClasspathGlibj; -extern const char* GNUClasspathLibs; - -JavaIsolate* JavaIsolate::allocateIsolate(Jnjvm* callingVM) { - JavaIsolate *isolate= vm_new(callingVM, JavaIsolate)(); +JavaIsolate* JavaIsolate::allocateIsolate() { + JavaIsolate *isolate= gc_new(JavaIsolate)(); #ifdef MULTIPLE_GC isolate->GC = Collector::allocate(); @@ -438,21 +438,8 @@ if (!(isolate->classpath)) { isolate->classpath = "."; } - isolate->bootClasspathEnv = getenv("JNJVM_BOOTCLASSPATH"); - if (!(isolate->bootClasspathEnv)) { - isolate->bootClasspathEnv = GNUClasspathGlibj; - } - isolate->libClasspathEnv = getenv("JNJVM_LIBCLASSPATH"); - if (!(isolate->libClasspathEnv)) { - isolate->libClasspathEnv = GNUClasspathLibs; - } - - isolate->analyseClasspathEnv(isolate->bootClasspathEnv); - - isolate->TheModule = new JnjvmModule("Isolate JnJVM"); - isolate->TheModuleProvider = new JnjvmModuleProvider(isolate->TheModule); - isolate->bootstrapThread = vm_new(isolate, JavaThread)(); + isolate->bootstrapThread = gc_new(JavaThread)(); isolate->bootstrapThread->initialise(0, isolate); void* baseSP = mvm::Thread::get()->baseSP; isolate->bootstrapThread->threadID = (mvm::Thread::self() << 8) & 0x7FFFFF00; @@ -471,12 +458,7 @@ isolate->javavmEnv = &JNI_JavaVMTable; // We copy so that bootstrap utf8 such as "" are unique - isolate->hashUTF8 = new UTF8Map(); - bootstrapVM->hashUTF8->copy(isolate->hashUTF8); 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)(); @@ -486,66 +468,6 @@ return isolate; } -JavaIsolate* JavaIsolate::allocateBootstrap() { - JavaIsolate *isolate= gc_new(JavaIsolate)(); - -#ifdef MULTIPLE_GC - isolate->GC = mvm::Thread::get()->GC; - isolate->GC->enable(0); -#endif - - isolate->classpath = getenv("CLASSPATH"); - if (!(isolate->classpath)) { - isolate->classpath = "."; - } - isolate->bootClasspathEnv = getenv("JNJVM_BOOTCLASSPATH"); - if (!(isolate->bootClasspathEnv)) { - isolate->bootClasspathEnv = GNUClasspathGlibj; - } - isolate->libClasspathEnv = getenv("JNJVM_LIBCLASSPATH"); - if (!(isolate->libClasspathEnv)) { - isolate->libClasspathEnv = GNUClasspathLibs; - } - - isolate->analyseClasspathEnv(isolate->bootClasspathEnv); - - isolate->TheModule = new JnjvmModule("Bootstrap JnJVM"); - isolate->TheModule->initialise(); - isolate->TheModuleProvider = new JnjvmModuleProvider(isolate->TheModule); - - isolate->bootstrapThread = vm_new(isolate, JavaThread)(); - isolate->bootstrapThread->initialise(0, isolate); - void* baseSP = mvm::Thread::get()->baseSP; - isolate->bootstrapThread->threadID = (mvm::Thread::self() << 8) & 0x7FFFFF00; -#ifdef MULTIPLE_GC - isolate->bootstrapThread->GC = isolate->GC; -#endif - isolate->bootstrapThread->baseSP = baseSP; - JavaThread::threadKey->set(isolate->bootstrapThread); - - isolate->name = "bootstrapVM"; - isolate->appClassLoader = 0; - isolate->hashUTF8 = new UTF8Map(); - isolate->hashStr = new StringMap(); - isolate->bootstrapClasses = vm_new(isolate, ClassMap)(); - isolate->jniEnv = &JNI_JNIEnvTable; - 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)(); - isolate->delegatees = vm_new(isolate, DelegateeMap)(); -#endif - -#if defined(SERVICE_VM) || !defined(MULTIPLE_VM) - isolate->threadSystem = new ThreadSystem(); -#endif - - return isolate; -} - JavaIsolate::~JavaIsolate() { delete threadSystem; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.h?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.h Thu Aug 14 10:58:53 2008 @@ -56,7 +56,7 @@ ~JavaIsolate(); JavaIsolate(); - JavaObject* loadAppClassLoader(); + JnjvmClassLoader* loadAppClassLoader(); void loadBootstrap(); void executeClass(const char* className, ArrayObject* args); void executePremain(const char* className, JavaString* args, @@ -65,8 +65,7 @@ void runMain(int argc, char** argv); void mapInitialThread(); static void runIsolate(const char* className, ArrayObject* args); - static JavaIsolate* allocateIsolate(Jnjvm* callingVM); - static JavaIsolate* allocateBootstrap(); + static JavaIsolate* allocateIsolate(); }; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Thu Aug 14 10:58:53 2008 @@ -221,7 +221,7 @@ uint32 nargs = func->arg_size() + 1 + (stat ? 1 : 0); std::vector nativeArgs; - int64_t jniEnv = (int64_t)&(compilingClass->isolate->jniEnv); + int64_t jniEnv = (int64_t)&(JavaThread::get()->isolate->jniEnv); nativeArgs.push_back( ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, jniEnv), mvm::jit::ptrType)); @@ -1096,7 +1096,7 @@ void* val = 0; GlobalVariable* gv = 0; #ifndef MULTIPLE_VM - val = compilingClass->isolate->UTF8ToStr(utf8); + val = JavaThread::get()->isolate->UTF8ToStr(utf8); gv = new GlobalVariable(JnjvmModule::JavaObjectType, false, GlobalValue::ExternalLinkage, Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h Thu Aug 14 10:58:53 2008 @@ -60,7 +60,7 @@ JnjvmModule* module; - static void invokeOnceVoid(Jnjvm* vm, JavaObject* loader, + static void invokeOnceVoid(Jnjvm* vm, JnjvmClassLoader* loader, const char* className, const char* func, const char* sign, int access, ...); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Thu Aug 14 10:58:53 2008 @@ -1823,7 +1823,7 @@ ClassArray* dcl = 0; ConstantInt* sizeElement = 0; GlobalVariable* TheVT = 0; - Jnjvm* vm = compilingClass->isolate; + JnjvmClassLoader* JCL = compilingClass->classLoader; if (bytecodes[i] == NEWARRAY) { uint8 id = bytecodes[++i]; @@ -1838,9 +1838,9 @@ compilingClass->ctpInfo->resolveClassName(index); const UTF8* arrayName = - AssessorDesc::constructArrayName(vm, 0, 1, className); + AssessorDesc::constructArrayName(JCL, 0, 1, className); - dcl = vm->constructArray(arrayName, compilingClass->classLoader); + dcl = JCL->constructArray(arrayName); TheVT = JnjvmModule::ArrayObjectVirtualTableGV; sizeElement = mvm::jit::constantPtrSize; } @@ -2062,15 +2062,14 @@ } case MULTIANEWARRAY : { - Jnjvm* vm = compilingClass->isolate; + JnjvmClassLoader* JCL = compilingClass->classLoader; uint16 index = readU2(bytecodes, i); uint8 dim = readU1(bytecodes, i); const UTF8* className = compilingClass->ctpInfo->resolveClassName(index); - ClassArray* dcl = - vm->constructArray(className, compilingClass->classLoader); + ClassArray* dcl = JCL->constructArray(className); compilingClass->ctpInfo->loadClass(index); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp Thu Aug 14 10:58:53 2008 @@ -25,16 +25,16 @@ using namespace jnjvm; -void JavaJIT::invokeOnceVoid(Jnjvm* vm, JavaObject* loader, +void JavaJIT::invokeOnceVoid(Jnjvm* vm, JnjvmClassLoader* loader, char const* className, char const* func, char const* sign, int access, ...) { - CommonClass* cl = vm->loadName(vm->asciizConstructUTF8(className), loader, - true, true, true); + CommonClass* cl = loader->loadName(loader->asciizConstructUTF8(className), + true, true, true); bool stat = access == ACC_STATIC ? true : false; - JavaMethod* method = cl->lookupMethod(vm->asciizConstructUTF8(func), - vm->asciizConstructUTF8(sign), stat, + JavaMethod* method = cl->lookupMethod(loader->asciizConstructUTF8(func), + loader->asciizConstructUTF8(sign), stat, true); va_list ap; va_start(ap, access); @@ -92,7 +92,7 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap) { \ if (!classDef->isReady()) \ - classDef->isolate->loadName(classDef->name, classDef->classLoader, true, true, true); \ + classDef->classLoader->loadName(classDef->name, true, true, true); \ \ verifyNull(obj); \ Signdef* sign = getSignature(); \ @@ -105,7 +105,7 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap) {\ if (!classDef->isReady())\ - classDef->isolate->loadName(classDef->name, classDef->classLoader, true, true, true);\ + classDef->classLoader->loadName(classDef->name, true, true, true);\ \ verifyNull(obj);\ Signdef* sign = getSignature(); \ @@ -118,7 +118,7 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, va_list ap) {\ if (!classDef->isReady())\ - classDef->isolate->loadName(classDef->name, classDef->classLoader, true, true, true);\ + classDef->classLoader->loadName(classDef->name, true, true, true);\ \ Signdef* sign = getSignature(); \ void** buf = (void**)alloca(sign->args.size() * sizeof(uint64)); \ @@ -130,7 +130,7 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\ if (!classDef->isReady())\ - classDef->isolate->loadName(classDef->name, classDef->classLoader, true, true, true);\ + classDef->classLoader->loadName(classDef->name, true, true, true);\ \ verifyNull(obj);\ JavaMethod* meth = obj->classOf->lookupMethod(name, type, false, true);\ @@ -142,7 +142,7 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\ if (!classDef->isReady())\ - classDef->isolate->loadName(classDef->name, classDef->classLoader, true, true, true);\ + classDef->classLoader->loadName(classDef->name, true, true, true);\ \ verifyNull(obj);\ void* func = this->compiledPtr();\ @@ -152,7 +152,7 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, void* buf) {\ if (!classDef->isReady())\ - classDef->isolate->loadName(classDef->name, classDef->classLoader, true, true, true);\ + classDef->classLoader->loadName(classDef->name, true, true, true);\ \ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ @@ -189,7 +189,7 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap) { \ if (!classDef->isReady()) \ - classDef->isolate->loadName(classDef->name, classDef->classLoader, true, true, true); \ + classDef->classLoader->loadName(classDef->name, true, true, true); \ \ verifyNull(obj); \ void* func = (((void***)obj)[0])[offset];\ @@ -199,7 +199,7 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap) {\ if (!classDef->isReady())\ - classDef->isolate->loadName(classDef->name, classDef->classLoader, true, true, true);\ + classDef->classLoader->loadName(classDef->name, true, true, true);\ \ verifyNull(obj);\ void* func = this->compiledPtr();\ @@ -209,7 +209,7 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, va_list ap) {\ if (!classDef->isReady())\ - classDef->isolate->loadName(classDef->name, classDef->classLoader, true, true, true);\ + classDef->classLoader->loadName(classDef->name, true, true, true);\ \ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ @@ -218,7 +218,7 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\ if (!classDef->isReady())\ - classDef->isolate->loadName(classDef->name, classDef->classLoader, true, true, true);\ + classDef->classLoader->loadName(classDef->name, true, true, true);\ \ verifyNull(obj);\ void* func = (((void***)obj)[0])[offset];\ @@ -228,7 +228,7 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\ if (!classDef->isReady())\ - classDef->isolate->loadName(classDef->name, classDef->classLoader, true, true, true);\ + classDef->classLoader->loadName(classDef->name, true, true, true);\ \ verifyNull(obj);\ void* func = this->compiledPtr();\ @@ -238,7 +238,7 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, void* buf) {\ if (!classDef->isReady())\ - classDef->isolate->loadName(classDef->name, classDef->classLoader, true, true, true);\ + classDef->classLoader->loadName(classDef->name, true, true, true);\ \ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Thu Aug 14 10:58:53 2008 @@ -187,16 +187,12 @@ #endif extern "C" CommonClass* initialisationCheck(CommonClass* cl) { - cl->isolate->initialiseClass(cl); + JavaThread::get()->isolate->initialiseClass(cl); return cl; } extern "C" JavaObject* getClassDelegatee(CommonClass* cl) { -#ifdef MULTIPLE_VM Jnjvm* vm = JavaThread::get()->isolate; -#else - Jnjvm* vm = cl->isolate; -#endif return vm->getClassDelegatee(cl); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp Thu Aug 14 10:58:53 2008 @@ -43,7 +43,8 @@ const UTF8* JavaString::strToUTF8(Jnjvm* vm) { const UTF8* utf8 = this->value; if (offset || (offset + count <= utf8->size)) { - return utf8->extract(vm, offset, offset + count); + // TODO find a way to get a relevant hashUTF8 + return utf8->extract(JnjvmClassLoader::bootstrapLoader->hashUTF8, offset, offset + count); } else { return utf8; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp Thu Aug 14 10:58:53 2008 @@ -54,7 +54,7 @@ AssessorDesc::AssessorDesc(bool dt, char bid, uint32 nb, uint32 nw, const char* name, - Jnjvm* vm, uint8 nid, + JnjvmClassLoader* loader, uint8 nid, const char* assocName, ClassArray* cl, arrayCtor_t ctor) { AssessorDesc* res = this; @@ -64,24 +64,24 @@ res->nbb = nb; res->nbw = nw; res->asciizName = name; - res->UTF8Name = vm->asciizConstructUTF8(name); + res->UTF8Name = loader->asciizConstructUTF8(name); res->arrayCtor = ctor; res->arrayClass = cl; if (assocName) - res->assocClassName = vm->asciizConstructUTF8(assocName); + res->assocClassName = loader->asciizConstructUTF8(assocName); else res->assocClassName = 0; if (bid != I_PARG && bid != I_PARD && bid != I_REF && bid != I_TAB) { - res->classType = new ClassPrimitive(vm, res->UTF8Name); + res->classType = new ClassPrimitive(loader, res->UTF8Name); res->classType->virtualSize = nb; } else { res->classType = 0; } } -void AssessorDesc::initialise(Jnjvm* vm) { +void AssessorDesc::initialise(JnjvmClassLoader* vm) { dParg = new AssessorDesc(false, I_PARG, 0, 0, "(", vm, 0, 0, 0, 0); @@ -226,7 +226,7 @@ } } -const UTF8* AssessorDesc::constructArrayName(Jnjvm *vm, AssessorDesc* ass, +const UTF8* AssessorDesc::constructArrayName(JnjvmClassLoader *loader, AssessorDesc* ass, uint32 steps, const UTF8* className) { if (ass) { @@ -235,7 +235,7 @@ buf[i] = I_TAB; } buf[steps] = ass->byteId; - return UTF8::readerConstruct(vm, buf, steps + 1); + return loader->readerConstructUTF8(buf, steps + 1); } else { uint32 len = className->size; uint32 pos = steps; @@ -260,10 +260,11 @@ buf[n - 1] = I_END_REF; } - return UTF8::readerConstruct(vm, buf, n); + return loader->readerConstructUTF8(buf, n); } } +/* void AssessorDesc::introspectArrayName(Jnjvm *vm, const UTF8* utf8, uint32 start, AssessorDesc*& ass, const UTF8*& res) { @@ -290,8 +291,8 @@ res = 0; } } - -void AssessorDesc::introspectArray(Jnjvm *vm, JavaObject* loader, +*/ +void AssessorDesc::introspectArray(JnjvmClassLoader* loader, const UTF8* utf8, uint32 start, AssessorDesc*& ass, CommonClass*& res) { uint32 pos = 0; @@ -301,18 +302,18 @@ analyseIntern(utf8, start, 1, funcs, intern); if (funcs != dTab) { - vm->unknownError("%s isn't an array", utf8->printString()); + JavaThread::get()->isolate->unknownError("%s isn't an array", utf8->printString()); } analyseIntern(utf8, intern, 0, funcs, pos); if (funcs == dRef) { ass = dRef; - res = vm->loadName(utf8->extract(vm, intern + 1, pos - 1), loader, false, + res = loader->loadName(utf8->extract(loader->hashUTF8, intern + 1, pos - 1), false, false, true); } else if (funcs == dTab) { ass = dTab; - res = vm->constructArray(utf8->extract(vm, intern, pos), loader); + res = loader->constructArray(utf8->extract(loader->hashUTF8, intern, pos)); } else { ass = funcs; res = funcs->classType; @@ -407,13 +408,13 @@ return buf->contents()->cString(); } -CommonClass* Typedef::assocClass(JavaObject* loader) { +CommonClass* Typedef::assocClass(JnjvmClassLoader* loader) { if (pseudoAssocClassName == 0) { return funcs->classType; } else if (funcs == AssessorDesc::dRef) { - return isolate->loadName(pseudoAssocClassName, loader, false, true, true); + return loader->loadName(pseudoAssocClassName, false, true, true); } else { - return isolate->constructArray(pseudoAssocClassName, loader); + return loader->constructArray(pseudoAssocClassName); } } @@ -449,7 +450,8 @@ Typedef::humanPrintArgs(&args, buf); } -Signdef* Signdef::signDup(const UTF8* name, Jnjvm *vm) { +Signdef::Signdef(const UTF8* name, JnjvmClassLoader* loader) { + Signdef* res = this; std::vector buf; uint32 len = (uint32)name->size; uint32 pos = 1; @@ -461,7 +463,7 @@ AssessorDesc::analyseIntern(name, pos, 0, funcs, pos); if (funcs == AssessorDesc::dPard) break; else { - buf.push_back(vm->constructType(name->extract(vm, pred, pos))); + buf.push_back(loader->constructType(name->extract(loader->hashUTF8, pred, pos))); } } @@ -475,43 +477,42 @@ typeError(name, 0); } - Signdef* res = new Signdef(); res->args = buf; - res->ret = vm->constructType(name->extract(vm, pos, pred)); - res->isolate = vm; + res->ret = loader->constructType(name->extract(loader->hashUTF8, pos, pred)); + res->initialLoader = loader; res->keyName = name; res->_virtualCallBuf = 0; res->_staticCallBuf = 0; res->_virtualCallAP = 0; res->_staticCallAP = 0; res->JInfo = 0; - return res; } -Typedef* Typedef::typeDup(const UTF8* name, Jnjvm *vm) { +Typedef::Typedef(const UTF8* name, JnjvmClassLoader *loader) { + Typedef* res = this; AssessorDesc* funcs = 0; uint32 next; AssessorDesc::analyseIntern(name, 0, 0, funcs, next); assert(funcs != AssessorDesc::dParg && "Error: resolving a signature for a field"); - Typedef* res = new Typedef(); - res->isolate = vm; + res->initialLoader = loader; res->keyName = name; res->funcs = funcs; if (funcs == AssessorDesc::dRef) { - res->pseudoAssocClassName = name->extract(vm, 1, next - 1); + res->pseudoAssocClassName = name->extract(loader->hashUTF8, 1, next - 1); } else if (funcs == AssessorDesc::dTab) { res->pseudoAssocClassName = name; + } else { + res->pseudoAssocClassName = 0; } - return res; } intptr_t Signdef::staticCallBuf() { if (!_staticCallBuf) { - LLVMSignatureInfo* LSI = isolate->TheModule->getSignatureInfo(this); + LLVMSignatureInfo* LSI = initialLoader->TheModule->getSignatureInfo(this); LSI->getStaticBuf(); } return _staticCallBuf; @@ -519,7 +520,7 @@ intptr_t Signdef::virtualCallBuf() { if (!_virtualCallBuf) { - LLVMSignatureInfo* LSI = isolate->TheModule->getSignatureInfo(this); + LLVMSignatureInfo* LSI = initialLoader->TheModule->getSignatureInfo(this); LSI->getVirtualBuf(); } return _virtualCallBuf; @@ -527,7 +528,7 @@ intptr_t Signdef::staticCallAP() { if (!_staticCallAP) { - LLVMSignatureInfo* LSI = isolate->TheModule->getSignatureInfo(this); + LLVMSignatureInfo* LSI = initialLoader->TheModule->getSignatureInfo(this); LSI->getStaticAP(); } return _staticCallAP; @@ -535,7 +536,7 @@ intptr_t Signdef::virtualCallAP() { if (!_virtualCallAP) { - LLVMSignatureInfo* LSI = isolate->TheModule->getSignatureInfo(this); + LLVMSignatureInfo* LSI = initialLoader->TheModule->getSignatureInfo(this); LSI->getVirtualAP(); } return _virtualCallAP; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h Thu Aug 14 10:58:53 2008 @@ -23,6 +23,7 @@ class JavaJIT; class JavaObject; class Jnjvm; +class JnjvmClassLoader; class UTF8; #define VOID_ID 0 @@ -180,14 +181,14 @@ /// AssessorDesc(bool dt, char bid, uint32 nb, uint32 nw, const char* name, - Jnjvm* vm, uint8 nid, + JnjvmClassLoader* loader, uint8 nid, const char* assocName, ClassArray* cl, arrayCtor_t ctor); /// initialise - Construct all assessors. /// - static void initialise(Jnjvm* vm); + static void initialise(JnjvmClassLoader* loader); /// printString - Print the assessor for debugging purposes. @@ -198,13 +199,14 @@ uint32 meth, AssessorDesc*& ass, uint32& ret); - static const UTF8* constructArrayName(Jnjvm *vm, AssessorDesc* ass, + static const UTF8* constructArrayName(JnjvmClassLoader* loader, AssessorDesc* ass, uint32 steps, const UTF8* className); - static void introspectArrayName(Jnjvm *vm, const UTF8* utf8, uint32 start, + /* + static void introspectArrayName(const UTF8* utf8, uint32 start, AssessorDesc*& ass, const UTF8*& res); - - static void introspectArray(Jnjvm *vm, JavaObject* loader, const UTF8* utf8, + */ + static void introspectArray(JnjvmClassLoader* loader, const UTF8* utf8, uint32 start, AssessorDesc*& ass, CommonClass*& res); @@ -238,9 +240,9 @@ /// const AssessorDesc* funcs; - /// isolate - Which isolate constructed me? + /// initialLoader - The loader that first loaded this typedef. /// - Jnjvm* isolate; + JnjvmClassLoader* initialLoader; /// printString - Print the Typedef for debugging purposes. /// @@ -249,16 +251,16 @@ /// assocClass - Given the loaded, try to load the class represented by this /// Typedef. /// - CommonClass* assocClass(JavaObject* loader); + CommonClass* assocClass(JnjvmClassLoader* loader); /// humanPrintArgs - Prints the list of typedef in a human readable form. /// static void humanPrintArgs(const std::vector*, mvm::PrintBuffer* buf); - /// typeDup - Create a new Typedef. + /// Typedef - Create a new Typedef. /// - static Typedef* typeDup(const UTF8* name, Jnjvm* vm); + Typedef(const UTF8* name, JnjvmClassLoader* loader); /// tPrintBuf - Prints the name of the class this Typedef represents. /// @@ -311,9 +313,9 @@ /// Typedef* ret; - /// isolate - The isolate that defined the signature. + /// initialLoader - The loader that first loaded this typedef. /// - Jnjvm* isolate; + JnjvmClassLoader* initialLoader; /// keyName - The Java name of the signature, e.g. "()V". /// @@ -328,9 +330,9 @@ /// void printWithSign(CommonClass* cl, const UTF8* name, mvm::PrintBuffer* buf); - /// signDup - Create a new Signdef. + /// Signdef - Create a new Signdef. /// - static Signdef* signDup(const UTF8* name, Jnjvm* vm); + Signdef(const UTF8* name, JnjvmClassLoader* loader); //===----------------------------------------------------------------------===// Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Thu Aug 14 10:58:53 2008 @@ -111,7 +111,7 @@ Class* Classpath::vmStackWalker; -void ClasspathThread::initialise(Jnjvm* vm) { +void ClasspathThread::initialise(JnjvmClassLoader* vm) { newThread = UPCALL_CLASS(vm, "java/lang/Thread"); @@ -169,7 +169,8 @@ } void ClasspathThread::createInitialThread(Jnjvm* vm, JavaObject* th) { - vm->loadName(newVMThread->name, newVMThread->classLoader, true, true, true); + JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; + JCL->loadName(newVMThread->name, true, true, true); JavaObject* vmth = newVMThread->doNew(vm); name->setVirtualObjectField(th, (JavaObject*)vm->asciizToStr("main")); @@ -179,16 +180,16 @@ assocThread->setVirtualObjectField(vmth, th); running->setVirtualInt8Field(vmth, (uint32)1); - rootGroup->classDef->isolate->loadName(rootGroup->classDef->name, - rootGroup->classDef->classLoader, - true, true, true); + JCL->loadName(rootGroup->classDef->name, + true, true, true); JavaObject* RG = rootGroup->getStaticObjectField(); group->setVirtualObjectField(th, RG); groupAddThread->invokeIntSpecial(vm, RG, th); } void ClasspathThread::mapInitialThread(Jnjvm* vm) { - vm->loadName(newThread->name, newThread->classLoader, true, true, true); + JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; + JCL->loadName(newThread->name, true, true, true); JavaObject* th = newThread->doNew(vm); createInitialThread(vm, th); JavaThread* myth = JavaThread::get(); @@ -198,7 +199,7 @@ finaliseCreateInitialThread->invokeIntStatic(vm, th); } -void Classpath::initialiseClasspath(Jnjvm* vm) { +void Classpath::initialiseClasspath(JnjvmClassLoader* vm) { getSystemClassLoader = UPCALL_METHOD(vm, "java/lang/ClassLoader", "getSystemClassLoader", "()Ljava/lang/ClassLoader;", ACC_STATIC); @@ -388,15 +389,14 @@ ClasspathThread::initialise(vm); vm->loadName(vm->asciizConstructUTF8("java/lang/String"), - CommonClass::jnjvmClassLoader, true, - false, false); + true, false, false); - CommonClass* object = - vm->loadName(vm->asciizConstructUTF8("java/lang/Object"), - CommonClass::jnjvmClassLoader, true, - false, false); - COMPILE_METHODS(object) + vm->loadName(vm->asciizConstructUTF8("java/lang/Object"), + true, false, false); + // Don't compile methods here, we still don't know where to allocate Java + // strings. + JavaMethod* getCallingClass = UPCALL_METHOD(vm, "gnu/classpath/VMStackWalker", "getCallingClass", "()Ljava/lang/Class;", ACC_STATIC); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h Thu Aug 14 10:58:53 2008 @@ -12,8 +12,7 @@ #define UPCALL_CLASS(vm, name) \ - vm->constructClass(vm->asciizConstructUTF8(name), \ - CommonClass::jnjvmClassLoader) + vm->constructClass(vm->asciizConstructUTF8(name)) \ #define UPCALL_FIELD(vm, cl, name, type, acc) \ UPCALL_CLASS(vm, cl)->constructField(vm->asciizConstructUTF8(name), \ @@ -26,8 +25,7 @@ #define UPCALL_ARRAY_CLASS(vm, name, depth) \ vm->constructArray( \ AssessorDesc::constructArrayName(vm, 0, depth, \ - vm->asciizConstructUTF8(name)), \ - CommonClass::jnjvmClassLoader) + vm->asciizConstructUTF8(name))) \ namespace jnjvm { @@ -40,7 +38,7 @@ class ClasspathThread { public: - static void initialise(Jnjvm* vm); + static void initialise(JnjvmClassLoader* vm); static Class* newThread; static Class* newVMThread; @@ -111,7 +109,7 @@ static ClassArray* stackTraceArray; static JavaMethod* initStackTraceElement; - static void initialiseClasspath(Jnjvm* vm); + static void initialiseClasspath(JnjvmClassLoader* loader); static Class* voidClass; static Class* boolClass; Modified: vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp Thu Aug 14 10:58:53 2008 @@ -62,15 +62,16 @@ BEGIN_EXCEPTION - Jnjvm *vm = NativeUtil::myVM(env); - const UTF8* utf8 = vm->asciizConstructUTF8(asciiz); - sint32 len = utf8->size; - - JavaObject* loader = 0; + JnjvmClassLoader* loader = 0; Class* currentClass = JavaJIT::getCallingClass(); if (currentClass) loader = currentClass->classLoader; + else loader = JnjvmClassLoader::bootstrapLoader; + + const UTF8* utf8 = loader->asciizConstructUTF8(asciiz); + sint32 len = utf8->size; + - CommonClass* cl = vm->lookupClassFromUTF8(utf8, 0, len, loader, true, true, + CommonClass* cl = loader->lookupClassFromUTF8(utf8, 0, len, true, true, true); return (jclass)(cl->getClassDelegatee()); @@ -139,7 +140,7 @@ JavaObject* res = ((Class*)cl)->doNew(vm); JavaMethod* init = cl->lookupMethod(Jnjvm::initName, - vm->asciizConstructUTF8("(Ljava/lang/String;)V"), 0, 1); + cl->classLoader->asciizConstructUTF8("(Ljava/lang/String;)V"), 0, 1); init->invokeIntSpecial(vm, res, vm->asciizToStr(msg)); th->pendingException = res; th->returnFromNative(); @@ -291,14 +292,14 @@ const char *atype) { BEGIN_EXCEPTION - - Jnjvm* vm = NativeUtil::myVM(env); + + // TODO: find a better place for creating UTF8 CommonClass* cl = NativeUtil::resolvedImplClass(clazz, true); - const UTF8* name = vm->asciizConstructUTF8(aname); - const UTF8* type = vm->asciizConstructUTF8(atype); + const UTF8* name = cl->classLoader->asciizConstructUTF8(aname); + const UTF8* type = cl->classLoader->asciizConstructUTF8(atype); JavaMethod* meth = cl->lookupMethod( - name->javaToInternal(vm, 0, name->size), - type->javaToInternal(vm, 0, type->size), false, true); + name->javaToInternal(cl->classLoader->hashUTF8, 0, name->size), + type->javaToInternal(cl->classLoader->hashUTF8, 0, type->size), false, true); return (jmethodID)meth; @@ -828,11 +829,11 @@ BEGIN_EXCEPTION - Jnjvm* vm = NativeUtil::myVM(env); - return (jfieldID) - NativeUtil::resolvedImplClass(clazz, true)->lookupField( - vm->asciizConstructUTF8(name), - vm->asciizConstructUTF8(sig), 0, 1); + // TODO: find a better place to store the UTF8 + CommonClass* cl = NativeUtil::resolvedImplClass(clazz, true); + return (jfieldID) + cl->lookupField(cl->classLoader->asciizConstructUTF8(name), + cl->classLoader->asciizConstructUTF8(sig), 0, 1); END_EXCEPTION return 0; @@ -1070,14 +1071,14 @@ const char *atype) { BEGIN_EXCEPTION - - Jnjvm* vm = NativeUtil::myVM(env); + + // TODO: find a better place to store the UTF8 CommonClass* cl = NativeUtil::resolvedImplClass(clazz, true); - const UTF8* name = vm->asciizConstructUTF8(aname); - const UTF8* type = vm->asciizConstructUTF8(atype); + const UTF8* name = cl->classLoader->asciizConstructUTF8(aname); + const UTF8* type = cl->classLoader->asciizConstructUTF8(atype); JavaMethod* meth = cl->lookupMethod( - name->javaToInternal(vm, 0, name->size), - type->javaToInternal(vm, 0, type->size), true, true); + name->javaToInternal(cl->classLoader->hashUTF8, 0, name->size), + type->javaToInternal(cl->classLoader->hashUTF8, 0, type->size), true, true); return (jmethodID)meth; @@ -1321,11 +1322,11 @@ BEGIN_EXCEPTION - Jnjvm* vm = NativeUtil::myVM(env); + // TODO: find a better place to store the UTF8 + CommonClass* cl = NativeUtil::resolvedImplClass(clazz, true); return (jfieldID) - NativeUtil::resolvedImplClass(clazz, true)->lookupField( - vm->asciizConstructUTF8(name), - vm->asciizConstructUTF8(sig), true, true); + cl->lookupField(cl->classLoader->asciizConstructUTF8(name), + cl->classLoader->asciizConstructUTF8(sig), true, true); END_EXCEPTION return 0; @@ -1624,11 +1625,11 @@ if (length < 0) vm->negativeArraySizeException(length); CommonClass* base = NativeUtil::resolvedImplClass(elementClass, true); - JavaObject* loader = base->classLoader; + JnjvmClassLoader* loader = base->classLoader; const UTF8* name = base->name; - const UTF8* arrayName = AssessorDesc::constructArrayName(vm, 0, 1, name); - ClassArray* array = vm->constructArray(arrayName, loader); - ArrayObject* res = ArrayObject::acons(length, array, vm); + const UTF8* arrayName = AssessorDesc::constructArrayName(loader, 0, 1, name); + ClassArray* array = loader->constructArray(arrayName); + ArrayObject* res = ArrayObject::acons(length, array, &(vm->allocator)); if (initialElement) { memset(res->elements, (int)initialElement, length * sizeof(JavaObject*)); @@ -1672,7 +1673,7 @@ BEGIN_EXCEPTION ArrayUInt8* res = 0; - res = ArrayUInt8::acons(len, JavaArray::ofBool, NativeUtil::myVM(env)); + res = ArrayUInt8::acons(len, JavaArray::ofBool, &NativeUtil::myVM(env)->allocator); return (jbooleanArray)res; END_EXCEPTION @@ -1685,7 +1686,7 @@ BEGIN_EXCEPTION ArraySInt8* res = 0; - res = ArraySInt8::acons(len, JavaArray::ofByte, NativeUtil::myVM(env)); + res = ArraySInt8::acons(len, JavaArray::ofByte, &NativeUtil::myVM(env)->allocator); return (jbyteArray) res; END_EXCEPTION @@ -1698,7 +1699,7 @@ BEGIN_EXCEPTION ArrayUInt16* res = 0; - res = ArrayUInt16::acons(len, JavaArray::ofChar, NativeUtil::myVM(env)); + res = ArrayUInt16::acons(len, JavaArray::ofChar, &NativeUtil::myVM(env)->allocator); return (jcharArray) res; END_EXCEPTION @@ -1711,7 +1712,7 @@ BEGIN_EXCEPTION ArraySInt16* res = 0; - res = ArraySInt16::acons(len, JavaArray::ofShort, NativeUtil::myVM(env)); + res = ArraySInt16::acons(len, JavaArray::ofShort, &NativeUtil::myVM(env)->allocator); return (jshortArray) res; END_EXCEPTION @@ -1724,7 +1725,7 @@ BEGIN_EXCEPTION ArraySInt32* res = 0; - res = ArraySInt32::acons(len, JavaArray::ofInt, NativeUtil::myVM(env)); + res = ArraySInt32::acons(len, JavaArray::ofInt, &NativeUtil::myVM(env)->allocator); return (jintArray) res; END_EXCEPTION @@ -1737,7 +1738,7 @@ BEGIN_EXCEPTION ArrayLong* res = 0; - res = ArrayLong::acons(len, JavaArray::ofLong, NativeUtil::myVM(env)); + res = ArrayLong::acons(len, JavaArray::ofLong, &NativeUtil::myVM(env)->allocator); return (jlongArray) res; END_EXCEPTION @@ -1750,7 +1751,7 @@ BEGIN_EXCEPTION ArrayFloat* res = 0; - res = ArrayFloat::acons(len, JavaArray::ofFloat, NativeUtil::myVM(env)); + res = ArrayFloat::acons(len, JavaArray::ofFloat, &NativeUtil::myVM(env)->allocator); return (jfloatArray) res; END_EXCEPTION @@ -1763,7 +1764,7 @@ BEGIN_EXCEPTION ArrayDouble* res = 0; - res = ArrayDouble::acons(len, JavaArray::ofDouble, NativeUtil::myVM(env)); + res = ArrayDouble::acons(len, JavaArray::ofDouble, &NativeUtil::myVM(env)->allocator); return (jdoubleArray) res; END_EXCEPTION Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Thu Aug 14 10:58:53 2008 @@ -15,8 +15,6 @@ #include #include #include -#include - #include "debug.h" #include "mvm/JIT.h" @@ -40,8 +38,6 @@ using namespace jnjvm; -Jnjvm* Jnjvm::bootstrapVM = 0; - #define DEF_UTF8(var) \ const UTF8* Jnjvm::var = 0 @@ -121,197 +117,6 @@ DECLARE_EXCEPTION(UnknownError); DECLARE_EXCEPTION(ClassNotFoundException); - -void Jnjvm::analyseClasspathEnv(const char* str) { - if (str != 0) { - unsigned int len = strlen(str); - char* buf = (char*)alloca(len + 1); - const char* cur = str; - int top = 0; - char c = 1; - while (c != 0) { - while (((c = cur[top]) != 0) && c != envSeparator[0]) { - top++; - } - if (top != 0) { - memcpy(buf, cur, top); - buf[top] = 0; - char* rp = (char*)malloc(PATH_MAX); - memset(rp, 0, PATH_MAX); - rp = realpath(buf, rp); - if (rp[PATH_MAX - 1] == 0 && strlen(rp) != 0) { - struct stat st; - stat(rp, &st); - if ((st.st_mode & S_IFMT) == S_IFDIR) { - unsigned int len = strlen(rp); - char* temp = (char*)malloc(len + 2); - memcpy(temp, rp, len); - temp[len] = dirSeparator[0]; - temp[len + 1] = 0; - bootClasspath.push_back(temp); - free(rp); - } else { - ArrayUInt8* bytes = Reader::openFile(this, rp); - free(rp); - if (bytes) { - ZipArchive *archive = new ZipArchive(bytes); - if (archive) { - bootArchives.push_back(archive); - } - } - } - } else { - free(rp); - } - } - cur = cur + top + 1; - top = 0; - } - } -} - -void Jnjvm::readParents(Class* cl, Reader& reader) { - JavaCtpInfo* ctpInfo = cl->ctpInfo; - unsigned short int superEntry = reader.readU2(); - const UTF8* super = superEntry ? - ctpInfo->resolveClassName(superEntry) : 0; - - unsigned short int nbI = reader.readU2(); - cl->superUTF8 = super; - for (int i = 0; i < nbI; i++) - cl->interfacesUTF8.push_back(ctpInfo->resolveClassName(reader.readU2())); - -} - -void Jnjvm::loadParents(Class* cl) { - const UTF8* super = cl->superUTF8; - int nbI = cl->interfacesUTF8.size(); - JavaObject* classLoader = cl->classLoader; - if (super == 0) { - cl->depth = 0; - cl->display = (CommonClass**)malloc(sizeof(CommonClass*)); - cl->display[0] = cl; - cl->virtualTableSize = VT_SIZE / sizeof(void*); - } else { - cl->super = loadName(super, classLoader, true, false, true); - int depth = cl->super->depth + 1; - cl->depth = depth; - cl->virtualTableSize = cl->super->virtualTableSize; - cl->display = (CommonClass**)malloc((depth + 1) * sizeof(CommonClass*)); - memcpy(cl->display, cl->super->display, depth * sizeof(CommonClass*)); - cl->display[cl->depth] = cl; - } - - for (int i = 0; i < nbI; i++) - cl->interfaces.push_back((Class*)loadName(cl->interfacesUTF8[i], - classLoader, true, false, true)); -} - -void Jnjvm::readAttributs(Class* cl, Reader& reader, - std::vector& attr) { - JavaCtpInfo* ctpInfo = cl->ctpInfo; - unsigned short int nba = reader.readU2(); - - for (int i = 0; i < nba; i++) { - const UTF8* attName = ctpInfo->UTF8At(reader.readU2()); - uint32 attLen = reader.readU4(); - Attribut* att = new Attribut(attName, attLen, reader.cursor); - attr.push_back(att); - reader.seek(attLen, Reader::SeekCur); - } -} - -void Jnjvm::readFields(Class* cl, Reader& reader) { - uint16 nbFields = reader.readU2(); - JavaCtpInfo* ctpInfo = cl->ctpInfo; - uint32 sindex = 0; - uint32 vindex = 0; - for (int i = 0; i < nbFields; i++) { - uint16 access = reader.readU2(); - const UTF8* name = ctpInfo->UTF8At(reader.readU2()); - const UTF8* type = ctpInfo->UTF8At(reader.readU2()); - JavaField* field = cl->constructField(name, type, access); - isStatic(access) ? - field->num = sindex++ : - field->num = vindex++; - readAttributs(cl, reader, field->attributs); - } -} - -void Jnjvm::readMethods(Class* cl, Reader& reader) { - uint16 nbMethods = reader.readU2(); - JavaCtpInfo* ctpInfo = cl->ctpInfo; - for (int i = 0; i < nbMethods; i++) { - uint16 access = reader.readU2(); - const UTF8* name = ctpInfo->UTF8At(reader.readU2()); - const UTF8* type = ctpInfo->UTF8At(reader.readU2()); - JavaMethod* meth = cl->constructMethod(name, type, access); - readAttributs(cl, reader, meth->attributs); - } -} - -void Jnjvm::readClass(Class* cl) { - - PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "; ", 0); - PRINT_DEBUG(JNJVM_LOAD, 0, LIGHT_GREEN, "reading ", 0); - PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "%s::%s\n", printString(), - cl->printString()); - - Reader reader(cl->bytes); - uint32 magic = reader.readU4(); - if (magic != Jnjvm::Magic) { - Jnjvm::error(ClassFormatError, "bad magic number %p", magic); - } - cl->minor = reader.readU2(); - cl->major = reader.readU2(); - JavaCtpInfo::read(this, cl, reader); - JavaCtpInfo* ctpInfo = cl->ctpInfo; - cl->access = reader.readU2(); - - const UTF8* thisClassName = - ctpInfo->resolveClassName(reader.readU2()); - - if (!(thisClassName->equals(cl->name))) { - error(ClassFormatError, "try to load %s and found class named %s", - cl->printString(), thisClassName->printString()); - } - - readParents(cl, reader); - readFields(cl, reader); - readMethods(cl, reader); - readAttributs(cl, reader, cl->attributs); -} - -ArrayUInt8* Jnjvm::openName(const UTF8* utf8) { - char* asciiz = utf8->UTF8ToAsciiz(); - uint32 alen = strlen(asciiz); - ArrayUInt8* res = 0; - - for (std::vector::iterator i = bootClasspath.begin(), - e = bootClasspath.end(); i != e; ++i) { - const char* str = *i; - unsigned int strLen = strlen(str); - char* buf = (char*)alloca(strLen + alen + 7); - - sprintf(buf, "%s%s.class", str, asciiz); - res = Reader::openFile(this, buf); - if (res) return res; - } - - for (std::vector::iterator i = bootArchives.begin(), - e = bootArchives.end(); i != e; ++i) { - - ZipArchive* archive = *i; - char* buf = (char*)alloca(alen + 7); - sprintf(buf, "%s.class", asciiz); - res = Reader::openZip(this, archive, buf); - if (res) return res; - } - - return 0; -} - - typedef void (*clinit_t)(Jnjvm* vm); void Jnjvm::initialiseClass(CommonClass* cl) { @@ -331,7 +136,7 @@ cl->super->initialiseClass(); } - TheModule->resolveStaticClass((Class*)cl); + cl->classLoader->TheModule->resolveStaticClass((Class*)cl); *status = inClinit; JavaMethod* meth = cl->lookupMethodDontThrow(clinitName, clinitType, true, @@ -379,106 +184,29 @@ } } -void Jnjvm::resolveClass(CommonClass* cl, bool doClinit) { - if (cl->status < resolved) { - cl->acquire(); - int status = cl->status; - if (status >= resolved) { - cl->release(); - } else if (status < loaded) { - cl->release(); - unknownError("try to resolve a not-read class"); - } else if (status == loaded || cl->ownerClass()) { - if (cl->isArray) { - ClassArray* arrayCl = (ClassArray*)cl; - CommonClass* baseClass = arrayCl->baseClass(); - baseClass->resolveClass(doClinit); - cl->status = resolved; - } else { - readClass((Class*)cl); - cl->status = classRead; - cl->release(); - loadParents((Class*)cl); - cl->acquire(); - cl->status = prepared; - TheModule->resolveVirtualClass((Class*)cl); - cl->status = resolved; - } - cl->release(); - cl->broadcastClass(); - } else { - while (status < resolved) { - cl->waitClass(); - } - cl->release(); - } - } - if (doClinit) cl->initialiseClass(); -} - -CommonClass* Jnjvm::loadName(const UTF8* name, JavaObject* loader, - bool doResolve, bool doClinit, bool doThrow) { - - - CommonClass* cl = lookupClass(name, loader); - const UTF8* bootstrapName = name; - - if (!cl || cl->status == hashed) { - if (!loader) { // I have to load it - ArrayUInt8* bytes = openName(name); - if (bytes) { - if (!cl) cl = bootstrapVM->constructClass(bootstrapName, loader); - if (cl->status == hashed) { - cl->acquire(); - if (cl->status == hashed) { - cl->status = loaded; - ((Class*)cl)->bytes = bytes; - } - cl->release(); - } - } else { - cl = 0; - } - } else { - cl = loadInClassLoader(name->internalToJava(this, 0, name->size), loader); - } - } - - if (!cl && doThrow) { - if (!memcmp(name->UTF8ToAsciiz(), NoClassDefFoundError, - strlen(NoClassDefFoundError))) { - unknownError("Unable to load NoClassDefFoundError"); - } - Jnjvm::error(NoClassDefFoundError, "unable to load %s", name->printString()); - } - - if (cl && doResolve) cl->resolveClass(doClinit); - - return cl; -} void Jnjvm::errorWithExcp(const char* className, const JavaObject* excp) { - Class* cl = (Class*) this->loadName(this->asciizConstructUTF8(className), - CommonClass::jnjvmClassLoader, - true, true, true); + JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; + Class* cl = (Class*) JCL->loadName(JCL->asciizConstructUTF8(className), + true, true, true); JavaObject* obj = cl->doNew(this); - JavaJIT::invokeOnceVoid(this, CommonClass::jnjvmClassLoader, className, "", + JavaJIT::invokeOnceVoid(this, JCL, className, "", "(Ljava/lang/Throwable;)V", ACC_VIRTUAL, obj, excp); JavaThread::throwException(obj); } void Jnjvm::error(const char* className, const char* fmt, ...) { + JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; char* tmp = (char*)alloca(4096); - Class* cl = (Class*) this->loadName(this->asciizConstructUTF8(className), - CommonClass::jnjvmClassLoader, - true, true, true); + Class* cl = (Class*) JCL->loadName(JCL->asciizConstructUTF8(className), + true, true, true); va_list ap; va_start(ap, fmt); vsnprintf(tmp, 4096, fmt, ap); va_end(ap); JavaObject* obj = cl->doNew(this); - JavaJIT::invokeOnceVoid(this, CommonClass::jnjvmClassLoader, className, "", + JavaJIT::invokeOnceVoid(this, JCL, className, "", "(Ljava/lang/String;)V", ACC_VIRTUAL, obj, this->asciizToStr(tmp)); JavaThread::throwException(obj); @@ -486,14 +214,14 @@ void Jnjvm::verror(const char* className, const char* fmt, va_list ap) { + JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; char* tmp = (char*)alloca(4096); - Class* cl = (Class*) this->loadName(this->asciizConstructUTF8(className), - CommonClass::jnjvmClassLoader, - true, true, true); + Class* cl = (Class*) JCL->loadName(JCL->asciizConstructUTF8(className), + true, true, true); vsnprintf(tmp, 4096, fmt, ap); va_end(ap); JavaObject* obj = cl->doNew(this); - JavaJIT::invokeOnceVoid(this, CommonClass::jnjvmClassLoader, className, "", + JavaJIT::invokeOnceVoid(this, JCL, className, "", "(Ljava/lang/String;)V", ACC_VIRTUAL, obj, this->asciizToStr(tmp)); @@ -571,221 +299,16 @@ verror(UnknownError, fmt, ap); } -CommonClass* Jnjvm::lookupClassFromUTF8(const UTF8* utf8, unsigned int start, - unsigned int len, JavaObject* loader, - bool doResolve, bool doClinit, - bool doThrow) { - uint32 origLen = len; - const UTF8* name = utf8->javaToInternal(this, start, len); - bool doLoop = true; - CommonClass* ret = 0; - - if (len == 0) { - return 0; - } else if (name->elements[0] == AssessorDesc::I_TAB) { - - while (doLoop) { - --len; - if (len == 0) { - doLoop = false; - } else { - ++start; - if (name->elements[start] != AssessorDesc::I_TAB) { - if (name->elements[start] == AssessorDesc::I_REF) { - uint32 size = (uint32)name->size; - if ((size == (start + 1)) || (size == (start + 2)) || - (name->elements[start + 1] == AssessorDesc::I_TAB) || - (utf8->elements[origLen - 1] != AssessorDesc::I_END_REF)) { - doLoop = false; - } else { - const UTF8* componentName = utf8->javaToInternal(this, start + 1, - len - 2); - if (loadName(componentName, loader, doResolve, doClinit, - doThrow)) { - ret = constructArray(name, loader); - if (doResolve) ret->resolveClass(doClinit); - doLoop = false; - } else { - doLoop = false; - } - } - } else { - uint16 cur = name->elements[start]; - if ((cur == AssessorDesc::I_BOOL || cur == AssessorDesc::I_BYTE || - cur == AssessorDesc::I_CHAR || cur == AssessorDesc::I_SHORT || - cur == AssessorDesc::I_INT || cur == AssessorDesc::I_FLOAT || - cur == AssessorDesc::I_DOUBLE || cur == AssessorDesc::I_LONG) - && ((uint32)name->size) == start + 1) { - - ret = constructArray(name, loader); - ret->resolveClass(doClinit); - doLoop = false; - } else { - doLoop = false; - } - } - } - } - } - - return ret; - - } else { - return loadName(name, loader, doResolve, doClinit, doThrow); - } -} - -CommonClass* Jnjvm::lookupClassFromJavaString(JavaString* str, - JavaObject* loader, - bool doResolve, bool doClinit, - bool doThrow) { - return lookupClassFromUTF8(str->value, str->offset, str->count, loader, - doResolve, doClinit, doThrow); -} - -CommonClass* Jnjvm::lookupClass(const UTF8* utf8, JavaObject* loader) { - if (loader) { -#ifndef SERVICE_VM - ClassMap* map = - (ClassMap*)(Classpath::vmdataClassLoader->getVirtualObjectField(loader)); - if (!map) { - map = vm_new(this, ClassMap)(); - Classpath::vmdataClassLoader->setVirtualObjectField(loader, (JavaObject*)map); - } -#else - ClassMap* map = 0; - ServiceDomain* vm = - (ServiceDomain*)(Classpath::vmdataClassLoader->getVirtualObjectField(loader)); - if (!vm) { - vm = ServiceDomain::allocateService((JavaIsolate*)Jnjvm::bootstrapVM); - Classpath::vmdataClassLoader->setVirtualObjectField(loader, (JavaObject*)vm); - } - map = vm->classes; -#endif - return map->lookup(utf8); - } else { - return bootstrapClasses->lookup(utf8); - } -} - -static CommonClass* arrayDup(const UTF8*& name, Jnjvm *vm) { - ClassArray* cl = vm_new(vm, ClassArray)(vm, name); - return cl; -} - -ClassArray* Jnjvm::constructArray(const UTF8* name, JavaObject* loader) { - if (loader != 0) - loader = ClassArray::arrayLoader(this, name, loader, 1, name->size - 1); - - if (loader) { -#ifndef SERVICE_VM - ClassMap* map = - (ClassMap*)(Classpath::vmdataClassLoader->getVirtualObjectField(loader)); - if (!map) { - map = vm_new(this, ClassMap)(); - Classpath::vmdataClassLoader->setVirtualObjectField(loader, (JavaObject*)map); - } - ClassArray* res = (ClassArray*)map->lookupOrCreate(name, this, arrayDup); -#else - ClassMap* map = 0; - ServiceDomain* vm = - (ServiceDomain*)(Classpath::vmdataClassLoader->getVirtualObjectField(loader)); - if (!vm) { - vm = ServiceDomain::allocateService((JavaIsolate*)Jnjvm::bootstrapVM); - Classpath::vmdataClassLoader->getVirtualObjectField(loader, (JavaObject*)vm); - } - map = vm->classes; - ClassArray* res = (ClassArray*)map->lookupOrCreate(name, vm, arrayDup); -#endif - if (!res->classLoader) res->classLoader = loader; - return res; - } else { - return (ClassArray*)bootstrapClasses->lookupOrCreate(name, this, arrayDup); - } -} - - -static CommonClass* classDup(const UTF8*& name, Jnjvm *vm) { - Class* cl = vm_new(vm, Class)(vm, name); - return cl; -} - -Class* Jnjvm::constructClass(const UTF8* name, JavaObject* loader) { - if (loader) { -#ifndef SERVICE_VM - ClassMap* map = - (ClassMap*)(Classpath::vmdataClassLoader->getVirtualObjectField(loader)); - if (!map) { - map = vm_new(this, ClassMap)(); - (Classpath::vmdataClassLoader->setVirtualObjectField(loader, (JavaObject*)map)); - } - Class* res = (Class*)map->lookupOrCreate(name, this, classDup); -#else - ClassMap* map = 0; - ServiceDomain* vm = - (ServiceDomain*)(Classpath::vmdataClassLoader->getVirtualObjectField(loader)); - if (!vm) { - vm = ServiceDomain::allocateService((JavaIsolate*)Jnjvm::bootstrapVM); - Classpath::vmdataClassLoader->setVirtualObjectField(loader, (JavaObject*)vm); - } - map = vm->classes; - Class* res = (Class*)map->lookupOrCreate(name, vm, classDup); -#endif - if (!res->classLoader) res->classLoader = loader; - return res; - } else { - return (Class*)bootstrapClasses->lookupOrCreate(name, this, classDup); - } -} - -const UTF8* Jnjvm::asciizConstructUTF8(const char* asciiz) { - return hashUTF8->lookupOrCreateAsciiz(this, asciiz); -} - -const UTF8* Jnjvm::readerConstructUTF8(const uint16* buf, uint32 size) { - return hashUTF8->lookupOrCreateReader(this, buf, size); -} - -Typedef* Jnjvm::constructType(const UTF8* name) { - Typedef* res = javaTypes->lookup(name); - if (res == 0) { - res = Typedef::typeDup(name, this); - javaTypes->lock->lock(); - Typedef* tmp = javaTypes->lookup(name); - if (tmp == 0) javaTypes->hash(name, res); - else res = tmp; - javaTypes->lock->unlock(); - } - 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*) - Classpath::loadInClassLoader->invokeJavaObjectVirtual(this, loader, str); - return (CommonClass*)(Classpath::vmdataClass->getVirtualObjectField(obj)); -} - JavaString* Jnjvm::UTF8ToStr(const UTF8* utf8) { JavaString* res = hashStr->lookupOrCreate(utf8, this, JavaString::stringDup); return res; } JavaString* Jnjvm::asciizToStr(const char* asciiz) { - const UTF8* var = asciizConstructUTF8(asciiz); + // asciizToStr is called by jnjvm code, so utf8s created + // by this method are stored in the bootstrap class loader + JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; + const UTF8* var = JCL->asciizConstructUTF8(asciiz); return UTF8ToStr(var); } @@ -837,21 +360,14 @@ delete GC; #endif - delete hashUTF8; - delete hashStr; - delete javaTypes; - + delete hashStr; delete globalRefsLock; - delete TheModuleProvider; } Jnjvm::Jnjvm() { #ifdef MULTIPLE_GC GC = 0; #endif - hashUTF8 = 0; hashStr = 0; - javaTypes = 0; globalRefsLock = 0; - TheModuleProvider = 0; } Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Thu Aug 14 10:58:53 2008 @@ -12,19 +12,15 @@ #include +#include "types.h" + #include "mvm/Object.h" #include "mvm/PrintBuffer.h" #include "mvm/VirtualMachine.h" #include "mvm/Threads/Cond.h" #include "mvm/Threads/Locks.h" -#include "types.h" - -#ifdef MULTIPLE_GC -#define vm_new(vm, cl) collector_new(cl, vm->GC) -#else -#define vm_new(vm, cl) gc_new(cl) -#endif +#include "JavaAllocator.h" namespace jnjvm { @@ -37,6 +33,7 @@ class JavaMethod; class JavaObject; class JavaString; +class JnjvmClassLoader; class JnjvmModule; class JnjvmModuleProvider; class Reader; @@ -63,8 +60,8 @@ #ifdef MULTIPLE_GC Collector* GC; #endif + JavaAllocator allocator; static VirtualTable* VT; - static Jnjvm* bootstrapVM; static const char* dirSeparator; static const char* envSeparator; @@ -179,45 +176,14 @@ static const UTF8* tanh; static const UTF8* finalize; - - void analyseClasspathEnv(const char*); - - // Loads a Class - CommonClass* loadName(const UTF8* name, JavaObject* loader, bool doResolve, - bool doClinit, bool doThrow); - - // Class lookup - CommonClass* lookupClassFromUTF8(const UTF8* utf8, unsigned int start, - unsigned int len, JavaObject* loader, - bool doResolve, bool doClinit, bool doThrow); - CommonClass* lookupClassFromJavaString(JavaString* str, JavaObject* loader, - bool doResolve, bool doClinit, - bool doThrow); - - void readParents(Class* cl, Reader& reader); - void loadParents(Class* cl); - void readAttributs(Class* cl, Reader& reader, std::vector & attr); - void readFields(Class* cl, Reader& reader); - void readMethods(Class* cl, Reader& reader); - void readClass(Class* cl); + void initialiseClass(CommonClass* cl); - void resolveClass(CommonClass* cl, bool doClinit); - ArrayUInt8* openName(const UTF8* utf8); - CommonClass* lookupClass(const UTF8* utf8, JavaObject* loader); - - ClassArray* constructArray(const UTF8* name, JavaObject* loader); - Class* constructClass(const UTF8* name, JavaObject* loader); - const UTF8* asciizConstructUTF8(const char* asciiz); - const UTF8* readerConstructUTF8(const uint16* buf, uint32 len); JavaString* asciizToStr(const char* asciiz); JavaString* UTF8ToStr(const UTF8* utf8); - Typedef* constructType(const UTF8 * name); - Signdef* constructSign(const UTF8 * name); JavaObject* getClassDelegatee(CommonClass*); - CommonClass* loadInClassLoader(const UTF8* utf8, JavaObject* loader); virtual void TRACER; virtual void print(mvm::PrintBuffer* buf) const { @@ -232,12 +198,10 @@ void* jniEnv; const void* javavmEnv; std::vector< std::pair > postProperties; - std::vector bootClasspath; - std::vector bootArchives; std::vector nativeLibs; const char* classpath; - const char* libClasspathEnv; - const char* bootClasspathEnv; + + std::vector > globalRefs; mvm::Lock* globalRefsLock; @@ -246,32 +210,14 @@ } const char* name; - JavaObject* appClassLoader; - UTF8Map * hashUTF8; + JnjvmClassLoader* appClassLoader; StringMap * hashStr; - ClassMap* bootstrapClasses; - TypeMap* javaTypes; - SignMap* javaSignatures; #ifdef MULTIPLE_VM StaticInstanceMap* statics; DelegateeMap* delegatees; #endif - JnjvmModuleProvider* TheModuleProvider; - JnjvmModule* TheModule; - - -#ifndef MULTIPLE_GC - void* allocateObject(unsigned int sz, VirtualTable* VT) { - return gc::operator new(sz, VT); - } -#else - void* allocateObject(unsigned int sz, VirtualTable* VT) { - return gc::operator new(sz, VT, GC); - } -#endif - virtual void runApplication(int argc, char** argv); }; Added: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=54779&view=auto ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (added) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Thu Aug 14 10:58:53 2008 @@ -0,0 +1,521 @@ +//===-- JnjvmClassLoader.cpp - Jnjvm representation of a class loader ------===// +// +// Jnjvm +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include + +#include "debug.h" + +#include "JavaAllocator.h" +#include "JavaConstantPool.h" +#include "JavaThread.h" +#include "JavaUpcalls.h" +#include "Jnjvm.h" +#include "JnjvmClassLoader.h" +#include "JnjvmModule.h" +#include "JnjvmModuleProvider.h" +#include "LockedMap.h" +#include "Reader.h" + +using namespace jnjvm; + +JnjvmBootstrapLoader* JnjvmClassLoader::bootstrapLoader = 0; + +extern const char* GNUClasspathGlibj; +extern const char* GNUClasspathLibs; + +JnjvmBootstrapLoader* JnjvmClassLoader::createBootstrapLoader() { + + JnjvmBootstrapLoader* JCL = gc_new(JnjvmBootstrapLoader)(); + JCL->TheModule = new JnjvmModule("Bootstrap JnJVM"); + JCL->TheModuleProvider = new JnjvmModuleProvider(JCL->TheModule); + JCL->TheModule->initialise(); + + JCL->allocator = new JavaAllocator(); + + JCL->hashUTF8 = new UTF8Map(JCL->allocator); + JCL->classes = allocator_new(allocator, ClassMap)(); + JCL->javaTypes = new TypeMap(); + JCL->javaSignatures = new SignMap(); + + JCL->bootClasspathEnv = getenv("JNJVM_BOOTCLASSPATH"); + if (!JCL->bootClasspathEnv) { + JCL->bootClasspathEnv = GNUClasspathGlibj; + } + + JCL->libClasspathEnv = getenv("JNJVM_LIBCLASSPATH"); + if (!JCL->libClasspathEnv) { + JCL->libClasspathEnv = GNUClasspathLibs; + } + + JCL->analyseClasspathEnv(JCL->bootClasspathEnv); + + return JCL; +} + +JnjvmClassLoader::JnjvmClassLoader(JnjvmClassLoader& JCL, JavaObject* loader, Jnjvm* I) { + TheModule = JCL.TheModule; + TheModuleProvider = JCL.TheModuleProvider; + + allocator = &(isolate->allocator); + + hashUTF8 = JCL.hashUTF8; + classes = allocator_new(allocator, ClassMap)(); + javaTypes = JCL.javaTypes; + javaSignatures = JCL.javaSignatures; + + javaLoader = loader; + isolate = I; + +} + +void JnjvmClassLoader::readParents(Class* cl, Reader& reader) { + JavaCtpInfo* ctpInfo = cl->ctpInfo; + unsigned short int superEntry = reader.readU2(); + const UTF8* super = superEntry ? + ctpInfo->resolveClassName(superEntry) : 0; + + unsigned short int nbI = reader.readU2(); + cl->superUTF8 = super; + for (int i = 0; i < nbI; i++) + cl->interfacesUTF8.push_back(ctpInfo->resolveClassName(reader.readU2())); + +} + +void JnjvmClassLoader::loadParents(Class* cl) { + const UTF8* super = cl->superUTF8; + int nbI = cl->interfacesUTF8.size(); + if (super == 0) { + cl->depth = 0; + cl->display = (CommonClass**)malloc(sizeof(CommonClass*)); + cl->display[0] = cl; + cl->virtualTableSize = VT_SIZE / sizeof(void*); + } else { + cl->super = loadName(super, true, false, true); + int depth = cl->super->depth + 1; + cl->depth = depth; + cl->virtualTableSize = cl->super->virtualTableSize; + cl->display = (CommonClass**)malloc((depth + 1) * sizeof(CommonClass*)); + memcpy(cl->display, cl->super->display, depth * sizeof(CommonClass*)); + cl->display[cl->depth] = cl; + } + + for (int i = 0; i < nbI; i++) + cl->interfaces.push_back((Class*)loadName(cl->interfacesUTF8[i], + true, false, true)); +} + +void JnjvmClassLoader::readAttributs(Class* cl, Reader& reader, + std::vector& attr) { + JavaCtpInfo* ctpInfo = cl->ctpInfo; + unsigned short int nba = reader.readU2(); + + for (int i = 0; i < nba; i++) { + const UTF8* attName = ctpInfo->UTF8At(reader.readU2()); + uint32 attLen = reader.readU4(); + Attribut* att = new Attribut(attName, attLen, reader.cursor); + attr.push_back(att); + reader.seek(attLen, Reader::SeekCur); + } +} + +void JnjvmClassLoader::readFields(Class* cl, Reader& reader) { + uint16 nbFields = reader.readU2(); + JavaCtpInfo* ctpInfo = cl->ctpInfo; + uint32 sindex = 0; + uint32 vindex = 0; + for (int i = 0; i < nbFields; i++) { + uint16 access = reader.readU2(); + const UTF8* name = ctpInfo->UTF8At(reader.readU2()); + const UTF8* type = ctpInfo->UTF8At(reader.readU2()); + JavaField* field = cl->constructField(name, type, access); + isStatic(access) ? + field->num = sindex++ : + field->num = vindex++; + readAttributs(cl, reader, field->attributs); + } +} + +void JnjvmClassLoader::readMethods(Class* cl, Reader& reader) { + uint16 nbMethods = reader.readU2(); + JavaCtpInfo* ctpInfo = cl->ctpInfo; + for (int i = 0; i < nbMethods; i++) { + uint16 access = reader.readU2(); + const UTF8* name = ctpInfo->UTF8At(reader.readU2()); + const UTF8* type = ctpInfo->UTF8At(reader.readU2()); + JavaMethod* meth = cl->constructMethod(name, type, access); + readAttributs(cl, reader, meth->attributs); + } +} + +void JnjvmClassLoader::readClass(Class* cl) { + + PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "; ", 0); + PRINT_DEBUG(JNJVM_LOAD, 0, LIGHT_GREEN, "reading ", 0); + PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "%s::%s\n", printString(), + cl->printString()); + + Reader reader(cl->bytes); + uint32 magic = reader.readU4(); + if (magic != Jnjvm::Magic) { + JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, "bad magic number %p", magic); + } + cl->minor = reader.readU2(); + cl->major = reader.readU2(); + JavaCtpInfo::read(cl, reader); + JavaCtpInfo* ctpInfo = cl->ctpInfo; + cl->access = reader.readU2(); + + const UTF8* thisClassName = + ctpInfo->resolveClassName(reader.readU2()); + + if (!(thisClassName->equals(cl->name))) { + JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, "try to load %s and found class named %s", + cl->printString(), thisClassName->printString()); + } + + readParents(cl, reader); + readFields(cl, reader); + readMethods(cl, reader); + readAttributs(cl, reader, cl->attributs); +} + +ArrayUInt8* JnjvmBootstrapLoader::openName(const UTF8* utf8) { + char* asciiz = utf8->UTF8ToAsciiz(); + uint32 alen = strlen(asciiz); + ArrayUInt8* res = 0; + + for (std::vector::iterator i = bootClasspath.begin(), + e = bootClasspath.end(); i != e; ++i) { + const char* str = *i; + unsigned int strLen = strlen(str); + char* buf = (char*)alloca(strLen + alen + 7); + + sprintf(buf, "%s%s.class", str, asciiz); + res = Reader::openFile(this, buf); + if (res) return res; + } + + for (std::vector::iterator i = bootArchives.begin(), + e = bootArchives.end(); i != e; ++i) { + + ZipArchive* archive = *i; + char* buf = (char*)alloca(alen + 7); + sprintf(buf, "%s.class", asciiz); + res = Reader::openZip(this, archive, buf); + if (res) return res; + } + + return 0; +} + + +void JnjvmClassLoader::resolveClass(CommonClass* cl, bool doClinit) { + if (cl->status < resolved) { + cl->acquire(); + int status = cl->status; + if (status >= resolved) { + cl->release(); + } else if (status < loaded) { + cl->release(); + JavaThread::get()->isolate->unknownError("try to resolve a not-read class"); + } else if (status == loaded || cl->ownerClass()) { + if (cl->isArray) { + ClassArray* arrayCl = (ClassArray*)cl; + CommonClass* baseClass = arrayCl->baseClass(); + baseClass->resolveClass(doClinit); + cl->status = resolved; + } else { + readClass((Class*)cl); + cl->status = classRead; + cl->release(); + loadParents((Class*)cl); + cl->acquire(); + cl->status = prepared; + TheModule->resolveVirtualClass((Class*)cl); + cl->status = resolved; + } + cl->release(); + cl->broadcastClass(); + } else { + while (status < resolved) { + cl->waitClass(); + } + cl->release(); + } + } + if (doClinit) cl->initialiseClass(); +} + +CommonClass* JnjvmBootstrapLoader::internalLoad(const UTF8* name) { + + CommonClass* cl = lookupClass(name); + + if (!cl || cl->status == hashed) { + ArrayUInt8* bytes = bootstrapLoader->openName(name); + if (bytes) { + if (!cl) cl = bootstrapLoader->constructClass(name); + if (cl->status == hashed) { + cl->acquire(); + if (cl->status == hashed) { + cl->status = loaded; + ((Class*)cl)->bytes = bytes; + } + cl->release(); + } + } else { + cl = 0; + } + } + + return cl; +} + +CommonClass* JnjvmClassLoader::internalLoad(const UTF8* name) { + CommonClass* cl = lookupClass(name); + + if (!cl || cl->status == hashed) { + const UTF8* javaName = name->internalToJava(hashUTF8, 0, name->size); + JavaString* str = isolate->UTF8ToStr(javaName); + JavaObject* obj = (JavaObject*) + Classpath::loadInClassLoader->invokeJavaObjectVirtual(isolate, javaLoader, + str); + cl = (CommonClass*)(Classpath::vmdataClass->getVirtualObjectField(obj)); + } + + return cl; +} + +CommonClass* JnjvmClassLoader::loadName(const UTF8* name, bool doResolve, + bool doClinit, bool doThrow) { + + + CommonClass* cl = internalLoad(name); + + if (!cl && doThrow) { + if (!memcmp(name->UTF8ToAsciiz(), Jnjvm::NoClassDefFoundError, + strlen(Jnjvm::NoClassDefFoundError))) { + JavaThread::get()->isolate->unknownError("Unable to load NoClassDefFoundError"); + } + JavaThread::get()->isolate->error(Jnjvm::NoClassDefFoundError, "unable to load %s", name->printString()); + } + + if (cl && doResolve) cl->resolveClass(doClinit); + + return cl; +} + +CommonClass* JnjvmClassLoader::lookupClassFromUTF8(const UTF8* utf8, unsigned int start, + unsigned int len, + bool doResolve, bool doClinit, + bool doThrow) { + uint32 origLen = len; + const UTF8* name = utf8->javaToInternal(hashUTF8, start, len); + bool doLoop = true; + CommonClass* ret = 0; + + if (len == 0) { + return 0; + } else if (name->elements[0] == AssessorDesc::I_TAB) { + + while (doLoop) { + --len; + if (len == 0) { + doLoop = false; + } else { + ++start; + if (name->elements[start] != AssessorDesc::I_TAB) { + if (name->elements[start] == AssessorDesc::I_REF) { + uint32 size = (uint32)name->size; + if ((size == (start + 1)) || (size == (start + 2)) || + (name->elements[start + 1] == AssessorDesc::I_TAB) || + (utf8->elements[origLen - 1] != AssessorDesc::I_END_REF)) { + doLoop = false; + } else { + const UTF8* componentName = utf8->javaToInternal(hashUTF8, + start + 1, + len - 2); + if (loadName(componentName, doResolve, doClinit, + doThrow)) { + ret = constructArray(name); + if (doResolve) ret->resolveClass(doClinit); + doLoop = false; + } else { + doLoop = false; + } + } + } else { + uint16 cur = name->elements[start]; + if ((cur == AssessorDesc::I_BOOL || cur == AssessorDesc::I_BYTE || + cur == AssessorDesc::I_CHAR || cur == AssessorDesc::I_SHORT || + cur == AssessorDesc::I_INT || cur == AssessorDesc::I_FLOAT || + cur == AssessorDesc::I_DOUBLE || cur == AssessorDesc::I_LONG) + && ((uint32)name->size) == start + 1) { + + ret = constructArray(name); + ret->resolveClass(doClinit); + doLoop = false; + } else { + doLoop = false; + } + } + } + } + } + + return ret; + + } else { + return loadName(name, doResolve, doClinit, doThrow); + } +} + +CommonClass* JnjvmClassLoader::lookupClassFromJavaString(JavaString* str, + bool doResolve, bool doClinit, + bool doThrow) { + return lookupClassFromUTF8(str->value, str->offset, str->count, + doResolve, doClinit, doThrow); +} + +CommonClass* JnjvmClassLoader::lookupClass(const UTF8* utf8) { + return classes->lookup(utf8); +} + +static CommonClass* arrayDup(const UTF8*& name, JnjvmClassLoader* loader) { + ClassArray* cl = allocator_new(loader->allocator, ClassArray)(loader, name); + return cl; +} + +ClassArray* JnjvmClassLoader::constructArray(const UTF8* name) { + if (javaLoader != 0) { + JnjvmClassLoader * ld = ClassArray::arrayLoader(name, this, 1, name->size - 1); + ClassArray* res = (ClassArray*)ld->classes->lookupOrCreate(name, this, arrayDup); + return res; + } else { + return (ClassArray*)classes->lookupOrCreate(name, this, arrayDup); + } +} + + +static CommonClass* classDup(const UTF8*& name, JnjvmClassLoader* loader) { + Class* cl = allocator_new(loader->allocator, Class)(loader, name); + return cl; +} + +Class* JnjvmClassLoader::constructClass(const UTF8* name) { + Class* res = (Class*)classes->lookupOrCreate(name, this, classDup); + return res; +} + +Typedef* JnjvmClassLoader::constructType(const UTF8* name) { + Typedef* res = javaTypes->lookup(name); + if (res == 0) { + res = new Typedef(name, this); + javaTypes->lock->lock(); + Typedef* tmp = javaTypes->lookup(name); + if (tmp == 0) javaTypes->hash(name, res); + else res = tmp; + javaTypes->lock->unlock(); + } + return res; +} + +Signdef* JnjvmClassLoader::constructSign(const UTF8* name) { + Signdef* res = javaSignatures->lookup(name); + if (res == 0) { + res = new Signdef(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; +} + + +JnjvmClassLoader* JnjvmClassLoader::getJnjvmLoaderFromJavaObject(JavaObject* loader) { + + if (loader == 0) + return bootstrapLoader; + + JnjvmClassLoader* JCL = + (JnjvmClassLoader*)(Classpath::vmdataClassLoader->getVirtualObjectField(loader)); + + if (!JCL) { + JCL = gc_new(JnjvmClassLoader)(*bootstrapLoader, loader, JavaThread::get()->isolate); + (Classpath::vmdataClassLoader->setVirtualObjectField(loader, (JavaObject*)JCL)); + } + + return JCL; +} + +const UTF8* JnjvmClassLoader::asciizConstructUTF8(const char* asciiz) { + return hashUTF8->lookupOrCreateAsciiz(asciiz); +} + +const UTF8* JnjvmClassLoader::readerConstructUTF8(const uint16* buf, uint32 size) { + return hashUTF8->lookupOrCreateReader(buf, size); +} + +JnjvmClassLoader::~JnjvmClassLoader() { + /*delete hashUTF8; + delete javaTypes; + delete javaSignatures; + delete TheModuleProvider;*/ +} + +void JnjvmBootstrapLoader::analyseClasspathEnv(const char* str) { + if (str != 0) { + unsigned int len = strlen(str); + char* buf = (char*)alloca(len + 1); + const char* cur = str; + int top = 0; + char c = 1; + while (c != 0) { + while (((c = cur[top]) != 0) && c != Jnjvm::envSeparator[0]) { + top++; + } + if (top != 0) { + memcpy(buf, cur, top); + buf[top] = 0; + char* rp = (char*)malloc(PATH_MAX); + memset(rp, 0, PATH_MAX); + rp = realpath(buf, rp); + if (rp[PATH_MAX - 1] == 0 && strlen(rp) != 0) { + struct stat st; + stat(rp, &st); + if ((st.st_mode & S_IFMT) == S_IFDIR) { + unsigned int len = strlen(rp); + char* temp = (char*)malloc(len + 2); + memcpy(temp, rp, len); + temp[len] = Jnjvm::dirSeparator[0]; + temp[len + 1] = 0; + bootClasspath.push_back(temp); + free(rp); + } else { + ArrayUInt8* bytes = + Reader::openFile(this, rp); + free(rp); + if (bytes) { + ZipArchive *archive = new ZipArchive(bytes); + if (archive) { + bootArchives.push_back(archive); + } + } + } + } else { + free(rp); + } + } + cur = cur + top + 1; + top = 0; + } + } +} + Added: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=54779&view=auto ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (added) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Thu Aug 14 10:58:53 2008 @@ -0,0 +1,158 @@ +//===-- JnjvmClassLoader.h - Jnjvm representation of a class loader -------===// +// +// Jnjvm +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + +#ifndef JNJVM_CLASSLOADER_H +#define JNJVM_CLASSLOADER_H + +#include + +#include "types.h" + +namespace jnjvm { + +class ArrayUInt8; +class Attribut; +class Class; +class ClassArray; +class ClassMap; +class CommonClass; +class JavaAllocator; +class JavaObject; +class JavaString; +class Jnjvm; +class JnjvmBootstrapLoader; +class JnjvmModule; +class JnjvmModuleProvider; +class Reader; +class Signdef; +class SignMap; +class Typedef; +class TypeMap; +class UTF8; +class UTF8Map; +class ZipArchive; + +class JnjvmClassLoader : public mvm::Object { +private: + virtual CommonClass* internalLoad(const UTF8* utf8); + +public: + + static VirtualTable* VT; + + virtual void TRACER; + virtual void print(mvm::PrintBuffer* buf) const { + buf->write("Java class loader<>"); + } + + Jnjvm* isolate; + JavaObject* javaLoader; + + JavaObject* getJavaClassLoader() { + return javaLoader; + } + + static JnjvmClassLoader* getJnjvmLoaderFromJavaObject(JavaObject*); + + ClassMap* classes; + + JavaAllocator* allocator; + JnjvmModule* TheModule; + JnjvmModuleProvider* TheModuleProvider; + + // Loads a Class + virtual CommonClass* loadName(const UTF8* name, bool doResolve, + bool doClinit, bool doThrow); + + // Class lookup + CommonClass* lookupClassFromUTF8(const UTF8* utf8, unsigned int start, + unsigned int len, + bool doResolve, bool doClinit, bool doThrow); + CommonClass* lookupClassFromJavaString(JavaString* str, + bool doResolve, bool doClinit, + bool doThrow); + + void readParents(Class* cl, Reader& reader); + void loadParents(Class* cl); + void readAttributs(Class* cl, Reader& reader, std::vector & attr); + void readFields(Class* cl, Reader& reader); + void readMethods(Class* cl, Reader& reader); + void readClass(Class* cl); + void initialiseClass(CommonClass* cl); + void resolveClass(CommonClass* cl, bool doClinit); + + CommonClass* lookupClass(const UTF8* utf8); + + ClassArray* constructArray(const UTF8* name); + Class* constructClass(const UTF8* name); + + + + TypeMap* javaTypes; + SignMap* javaSignatures; + UTF8Map * hashUTF8; + + static JnjvmBootstrapLoader* bootstrapLoader; + +#ifdef MULTIPLE_VM + static JnjvmClassLoader* SharedLoader; +#endif + + Typedef* constructType(const UTF8 * name); + Signdef* constructSign(const UTF8 * name); + + ~JnjvmClassLoader(); + JnjvmClassLoader() { + hashUTF8 = 0; + javaTypes = 0; + javaSignatures = 0; + TheModule = 0; + TheModuleProvider = 0; + isolate = 0; + } + + JnjvmClassLoader(JnjvmClassLoader& JCL, JavaObject* loader, Jnjvm* isolate); + static JnjvmBootstrapLoader* createBootstrapLoader(); + + + const UTF8* asciizConstructUTF8(const char* asciiz); + + const UTF8* readerConstructUTF8(const uint16* buf, uint32 size); + + +}; + + +class JnjvmBootstrapLoader : public JnjvmClassLoader { +private: + virtual CommonClass* internalLoad(const UTF8* utf8); + +public: + + static VirtualTable* VT; + + virtual void TRACER; + virtual void print(mvm::PrintBuffer* buf) const { + buf->write("Jnjvm bootstrap loader<>"); + } + + void analyseClasspathEnv(const char*); + + const char* libClasspathEnv; + const char* bootClasspathEnv; + std::vector bootClasspath; + std::vector bootArchives; + + ArrayUInt8* openName(const UTF8* utf8); +}; + +} // end namespace jnjvm + +#endif // JNJVM_CLASSLOADER_H Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Thu Aug 14 10:58:53 2008 @@ -135,7 +135,7 @@ classDef->isArray && classDef->isolate != Jnjvm::bootstrapVM) { // We know the array class can belong to bootstrap CommonClass* cl = Jnjvm::bootstrapVM->constructArray(classDef->name, 0); - return cl->isolate->TheModule->getClassInfo(cl)->getVar(jit); + return cl->classLoader->TheModule->getClassInfo(cl)->getVar(jit); } #endif @@ -147,7 +147,7 @@ varGV = new GlobalVariable(JnjvmModule::JavaClassType, true, GlobalValue::ExternalLinkage, cons, "", - classDef->isolate->TheModule); + classDef->classLoader->TheModule); } return new LoadInst(varGV, "", jit->currentBlock); } @@ -162,7 +162,7 @@ delegateeGV = new GlobalVariable(JnjvmModule::JavaObjectType, true, GlobalValue::ExternalLinkage, cons, "", - classDef->isolate->TheModule); + classDef->classLoader->TheModule); } return new LoadInst(delegateeGV, "", jit->currentBlock); #else @@ -195,7 +195,7 @@ if (meth->name->equals(Jnjvm::finalize)) { VT = allocateVT(cl, ++meths); meth->offset = 0; - Function* func = cl->isolate->TheModuleProvider->parseFunction(meth); + Function* func = cl->classLoader->TheModuleProvider->parseFunction(meth); if (!cl->super) meth->canBeInlined = true; Function::iterator BB = func->begin(); BasicBlock::iterator I = BB->begin(); @@ -280,7 +280,7 @@ Function* func = Function::Create(JnjvmModule::MarkAndTraceType, GlobalValue::ExternalLinkage, "markAndTraceObject", - cl->isolate->TheModule); + cl->classLoader->TheModule); Constant* zero = mvm::jit::constantZero; Argument* arg = func->arg_begin(); @@ -439,8 +439,8 @@ #ifndef MULTIPLE_VM JavaObject* val = - (JavaObject*)classDef->isolate->allocateObject(cl->staticSize, - cl->staticVT); + (JavaObject*)JavaThread::get()->isolate->allocator.allocateObject(cl->staticSize, + cl->staticVT); val->initialise(classDef); for (CommonClass::field_iterator i = cl->staticFields.begin(), e = cl->staticFields.end(); i!= e; ++i) { @@ -466,7 +466,7 @@ staticVarGV = new GlobalVariable(JnjvmModule::JavaObjectType, true, GlobalValue::ExternalLinkage, cons, "", - classDef->isolate->TheModule); + classDef->classLoader->TheModule); } return new LoadInst(staticVarGV, "", jit->currentBlock); @@ -490,7 +490,7 @@ virtualTableGV = new GlobalVariable(JnjvmModule::VTType, true, GlobalValue::ExternalLinkage, cons, "", - classDef->isolate->TheModule); + classDef->classLoader->TheModule); } return new LoadInst(virtualTableGV, "", jit->currentBlock); } @@ -520,12 +520,12 @@ Function* LLVMMethodInfo::getMethod() { if (!methodFunction) { - Jnjvm* vm = methodDef->classDef->isolate; + JnjvmClassLoader* JCL = methodDef->classDef->classLoader; methodFunction = Function::Create(getFunctionType(), GlobalValue::GhostLinkage, methodDef->printString(), - vm->TheModule); - vm->TheModuleProvider->addFunction(methodFunction, methodDef); + JCL->TheModule); + JCL->TheModuleProvider->addFunction(methodFunction, methodDef); } return methodFunction; } @@ -651,7 +651,7 @@ getStaticBufType(), GlobalValue::ExternalLinkage, signature->printString(), - signature->isolate->TheModule); + signature->initialLoader->TheModule); BasicBlock* currentBlock = BasicBlock::Create("enter", res); Function::arg_iterator i = res->arg_begin(); @@ -706,7 +706,7 @@ getStaticBufType(), GlobalValue::ExternalLinkage, signature->printString(), - signature->isolate->TheModule); + signature->initialLoader->TheModule); BasicBlock* currentBlock = BasicBlock::Create("enter", res); Function::arg_iterator i = res->arg_begin(); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Thu Aug 14 10:58:53 2008 @@ -156,7 +156,7 @@ llvm::Function* JnjvmModuleProvider::addCallback(Class* cl, uint32 index, Signdef* sign, bool stat) { const llvm::FunctionType* type = 0; - JnjvmModule* M = cl->isolate->TheModule; + JnjvmModule* M = cl->classLoader->TheModule; LLVMSignatureInfo* LSI = M->getSignatureInfo(sign); if (stat) { Modified: vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp Thu Aug 14 10:58:53 2008 @@ -9,6 +9,7 @@ #include +#include "JavaAllocator.h" #include "JavaArray.h" #include "JavaClass.h" #include "JavaString.h" @@ -74,7 +75,7 @@ } -const UTF8* UTF8Map::lookupOrCreateAsciiz(Jnjvm* vm, const char* asciiz) { +const UTF8* UTF8Map::lookupOrCreateAsciiz(const char* asciiz) { sint32 size = strlen(asciiz); uint32 key = asciizHasher(asciiz, size); const UTF8* res = 0; @@ -90,7 +91,7 @@ } if (res == 0) { - UTF8* tmp = (UTF8*)UTF8::acons(size, JavaArray::ofChar, vm); + UTF8* tmp = (UTF8*)UTF8::acons(size, JavaArray::ofChar, allocator); for (sint32 i = 0; i < size; i++) { tmp->elements[i] = asciiz[i]; } @@ -102,8 +103,7 @@ return res; } -const UTF8* UTF8Map::lookupOrCreateReader(Jnjvm* vm, const uint16* buf, - uint32 len) { +const UTF8* UTF8Map::lookupOrCreateReader(const uint16* buf, uint32 len) { sint32 size = (sint32)len; uint32 key = readerHasher(buf, size); const UTF8* res = 0; @@ -119,7 +119,7 @@ } if (res == 0) { - UTF8* tmp = (UTF8*)UTF8::acons(size, JavaArray::ofChar, vm); + UTF8* tmp = (UTF8*)UTF8::acons(size, JavaArray::ofChar, allocator); memcpy(tmp->elements, buf, len * sizeof(uint16)); res = (const UTF8*)tmp; map.insert(std::make_pair(key, res)); Modified: vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h Thu Aug 14 10:58:53 2008 @@ -29,7 +29,7 @@ namespace jnjvm { class JavaObject; -class Jnjvm; +class Allocator; struct ltutf8 { @@ -39,22 +39,22 @@ } }; -template +template class LockedMap : public mvm::Object { public: typedef typename std::map::iterator iterator; - typedef Container (*funcCreate)(Key& V, Jnjvm *vm); + typedef Container (*funcCreate)(Key& V, Meta meta); mvm::Lock* lock; std::map > > map; - inline Container lookupOrCreate(Key& V, Jnjvm *vm, funcCreate func) { + inline Container lookupOrCreate(Key& V, Meta meta, funcCreate func) { lock->lock(); iterator End = map.end(); iterator I = map.find(V); if (I == End) { - Container res = func(V, vm); + Container res = func(V, meta); map.insert(std::make_pair(V, res)); lock->unlock(); return res; @@ -96,14 +96,16 @@ typedef std::multimap::iterator iterator; mvm::Lock* lock; + JavaAllocator* allocator; std::multimap map; - const UTF8* lookupOrCreateAsciiz(Jnjvm* vm, const char* asciiz); - const UTF8* lookupOrCreateReader(Jnjvm* vm, const uint16* buf, uint32 size); + const UTF8* lookupOrCreateAsciiz(const char* asciiz); + const UTF8* lookupOrCreateReader(const uint16* buf, uint32 size); const UTF8* lookupAsciiz(const char* asciiz); const UTF8* lookupReader(const uint16* buf, uint32 size); - UTF8Map() { + UTF8Map(JavaAllocator* A) { lock = mvm::Lock::allocNormal(); + allocator = A; } ~UTF8Map() { @@ -124,7 +126,7 @@ }; class ClassMap : - public LockedMap { + public LockedMap { public: static VirtualTable* VT; @@ -244,7 +246,7 @@ }; class StaticInstanceMap : - public LockedMap*, std::less > { + public LockedMap*, std::less, Jnjvm* > { public: static VirtualTable* VT; @@ -263,7 +265,7 @@ }; class DelegateeMap : - public LockedMap > { + public LockedMap, Jnjvm* > { public: static VirtualTable* VT; Modified: vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp Thu Aug 14 10:58:53 2008 @@ -19,6 +19,7 @@ #include "JavaTypes.h" #include "JavaUpcalls.h" #include "Jnjvm.h" +#include "JnjvmClassLoader.h" #include "NativeUtil.h" #include "Reader.h" @@ -375,15 +376,15 @@ return; } -JavaObject* NativeUtil::getClassType(JavaObject* loader, Typedef* type) { +JavaObject* NativeUtil::getClassType(JnjvmClassLoader* loader, Typedef* type) { CommonClass* res = type->assocClass(loader); return res->getClassDelegatee(); } -ArrayObject* NativeUtil::getParameterTypes(JavaObject* loader, JavaMethod* meth) { +ArrayObject* NativeUtil::getParameterTypes(JnjvmClassLoader* loader, JavaMethod* meth) { std::vector& args = meth->getSignature()->args; ArrayObject* res = ArrayObject::acons(args.size(), Classpath::classArrayClass, - JavaThread::get()->isolate); + &(JavaThread::get()->isolate->allocator)); sint32 index = 0; for (std::vector::iterator i = args.begin(), e = args.end(); @@ -399,14 +400,14 @@ Attribut* exceptionAtt = meth->lookupAttribut(Attribut::exceptionsAttribut); if (exceptionAtt == 0) { return ArrayObject::acons(0, Classpath::classArrayClass, - JavaThread::get()->isolate); + &(JavaThread::get()->isolate->allocator)); } else { Class* cl = meth->classDef; JavaCtpInfo* ctp = cl->ctpInfo; Reader reader(exceptionAtt, cl->bytes); uint16 nbe = reader.readU2(); ArrayObject* res = ArrayObject::acons(nbe, Classpath::classArrayClass, - JavaThread::get()->isolate); + &(JavaThread::get()->isolate->allocator)); for (uint16 i = 0; i < nbe; ++i) { uint16 idx = reader.readU2(); Modified: vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.h?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.h Thu Aug 14 10:58:53 2008 @@ -19,6 +19,7 @@ class JavaMethod; class JavaObject; class Jnjvm; +class JnjvmClassLoader; class Signdef; class Typedef; @@ -32,8 +33,8 @@ static void decapsulePrimitive(Jnjvm *vm, void**&buf, JavaObject* obj, Typedef* signature); - static JavaObject* getClassType(JavaObject* loader, Typedef* type); - static ArrayObject* getParameterTypes(JavaObject* loader, JavaMethod* meth); + static JavaObject* getClassType(JnjvmClassLoader* loader, Typedef* type); + static ArrayObject* getParameterTypes(JnjvmClassLoader* loader, JavaMethod* meth); static ArrayObject* getExceptionTypes(JavaMethod* meth); }; Modified: vmkit/trunk/lib/JnJVM/VMCore/Reader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Reader.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Reader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Reader.cpp Thu Aug 14 10:58:53 2008 @@ -24,25 +24,25 @@ const int Reader::SeekCur = SEEK_CUR; const int Reader::SeekEnd = SEEK_END; -ArrayUInt8* Reader::openFile(Jnjvm* vm, char* path) { +ArrayUInt8* Reader::openFile(JnjvmClassLoader* loader, char* path) { FILE* fp = fopen(path, "r"); ArrayUInt8* res = 0; if (fp != 0) { fseek(fp, 0, SeekEnd); long nbb = ftell(fp); fseek(fp, 0, SeekSet); - res = ArrayUInt8::acons(nbb, JavaArray::ofByte, vm); + res = ArrayUInt8::acons(nbb, JavaArray::ofByte, loader->allocator); fread(res->elements, nbb, 1, fp); fclose(fp); } return res; } -ArrayUInt8* Reader::openZip(Jnjvm* vm, ZipArchive* archive, char* filename) { +ArrayUInt8* Reader::openZip(JnjvmClassLoader* loader, ZipArchive* archive, char* filename) { ArrayUInt8* ret = 0; ZipFile* file = archive->getFile(filename); if (file != 0) { - ArrayUInt8* res = ArrayUInt8::acons(file->ucsize, JavaArray::ofByte, vm); + ArrayUInt8* res = ArrayUInt8::acons(file->ucsize, JavaArray::ofByte, loader->allocator); if (archive->readFile(res, file) != 0) { ret = res; } Modified: vmkit/trunk/lib/JnJVM/VMCore/Reader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Reader.h?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Reader.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Reader.h Thu Aug 14 10:58:53 2008 @@ -19,7 +19,7 @@ namespace jnjvm { -class Jnjvm; +class JnjvmClassLoader; class ZipArchive; class Reader { @@ -76,8 +76,8 @@ static const int SeekCur; static const int SeekEnd; - static ArrayUInt8* openFile(Jnjvm* vm, char* path); - static ArrayUInt8* openZip(Jnjvm* vm, ZipArchive* archive, char* filename); + static ArrayUInt8* openFile(JnjvmClassLoader* loader, char* path); + static ArrayUInt8* openZip(JnjvmClassLoader* loader, ZipArchive* archive, char* filename); uint8 readU1() { return bytes->elements[cursor++]; Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Thu Aug 14 10:58:53 2008 @@ -16,6 +16,7 @@ #include "JavaObject.h" #include "JavaThread.h" #include "Jnjvm.h" +#include "JnjvmClassLoader.h" #include "LockedMap.h" #ifdef SERVICE_VM #include "ServiceDomain.h" @@ -37,6 +38,8 @@ INIT(StaticInstanceMap); INIT(JavaIsolate); INIT(DelegateeMap); + INIT(JnjvmBootstrapLoader); + INIT(JnjvmClassLoader); #ifdef SERVICE_VM INIT(ServiceDomain); #endif @@ -98,23 +101,18 @@ void Jnjvm::TRACER { appClassLoader->MARK_AND_TRACE; - bootstrapClasses->MARK_AND_TRACE; TRACE_VECTOR(JavaObject*, gc_allocator, globalRefs); #ifdef MULTIPLE_VM statics->MARK_AND_TRACE; delegatees->MARK_AND_TRACE; #endif - for (std::vector::iterator i = bootArchives.begin(), - e = bootArchives.end(); i != e; ++i) { - (*i)->bytes->MARK_AND_TRACE; - } - } void JavaIsolate::TRACER { Jnjvm::PARENT_TRACER; bootstrapThread->MARK_AND_TRACE; + JnjvmClassLoader::bootstrapLoader->MARK_AND_TRACE; } void ClassMap::TRACER { @@ -135,6 +133,21 @@ } } +void JnjvmClassLoader::TRACER { + javaLoader->MARK_AND_TRACE; + classes->MARK_AND_TRACE; + isolate->MARK_AND_TRACE; +} + +void JnjvmBootstrapLoader::TRACER { + classes->MARK_AND_TRACE; + + for (std::vector::iterator i = bootArchives.begin(), + e = bootArchives.end(); i != e; ++i) { + (*i)->bytes->MARK_AND_TRACE; + } +} + #ifdef SERVICE_VM void ServiceDomain::TRACER { JavaIsolate::PARENT_TRACER; Modified: vmkit/trunk/lib/JnJVM/VMCore/Zip.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Zip.h?rev=54779&r1=54778&r2=54779&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Zip.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Zip.h Thu Aug 14 10:58:53 2008 @@ -15,7 +15,7 @@ namespace jnjvm { class ArrayUInt8; -class Jnjvm; +class JnjvmBootstrapLoader; struct ZipFile { char* filename; @@ -31,7 +31,7 @@ class ZipArchive { - friend class Jnjvm; + friend class JnjvmBootstrapLoader; private: struct ltstr From tilmann.scheller at googlemail.com Sun Aug 17 06:27:07 2008 From: tilmann.scheller at googlemail.com (Tilmann Scheller) Date: Sun, 17 Aug 2008 13:27:07 -0000 Subject: [vmkit-commits] [vmkit] r54883 - in /vmkit/trunk/lib/N3/VMCore: Assembly.cpp CLIJit.cpp CLISignature.cpp VMClass.cpp Message-ID: <200808171327.m7HDR75T000781@zion.cs.uiuc.edu> Author: tilmann Date: Sun Aug 17 08:27:07 2008 New Revision: 54883 URL: http://llvm.org/viewvc/llvm-project?rev=54883&view=rev Log: fix bugs in generics implementation of N3 Modified: vmkit/trunk/lib/N3/VMCore/Assembly.cpp vmkit/trunk/lib/N3/VMCore/CLIJit.cpp vmkit/trunk/lib/N3/VMCore/CLISignature.cpp vmkit/trunk/lib/N3/VMCore/VMClass.cpp Modified: vmkit/trunk/lib/N3/VMCore/Assembly.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/Assembly.cpp?rev=54883&r1=54882&r2=54883&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/Assembly.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/Assembly.cpp Sun Aug 17 08:27:07 2008 @@ -1780,16 +1780,28 @@ case 3: VMThread::get()->vm->error("implement me %d", table); break; case 4: { VMClass* type = (VMClass*) readTypeSpec(vm, index); - type->resolveType(false, false); - + VMGenericClass* genClass = dynamic_cast (type); if (genClass) { + // temporarily store the current generic class, in case it's generic arguments + // are referenced in the current method + VMGenericClass* old = VMThread::get()->currGenericClass; + VMThread::get()->currGenericClass = genClass; + + type->resolveType(false, false); + bool virt = extractMethodSignature(offset, type, args); VMMethod* meth = instantiateGenericMethod(genArgs, type, name, args, token, virt); + + // restore previous generic class + VMThread::get()->currGenericClass = old; + return meth; } else { + type->resolveType(false, false); + VMMethod* meth = gc_new(VMMethod)() ; bool virt = extractMethodSignature(offset, type, args); bool structReturn = false; Modified: vmkit/trunk/lib/N3/VMCore/CLIJit.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIJit.cpp?rev=54883&r1=54882&r2=54883&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/CLIJit.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/CLIJit.cpp Sun Aug 17 08:27:07 2008 @@ -2237,7 +2237,7 @@ addPass(PM, llvm::createInstructionCombiningPass()); // Clean up after the unroller //addPass(PM, mvm::createArrayChecksPass()); addPass(PM, llvm::createGVNPass()); // GVN for load instructions - addPass(PM, llvm::createGCSEPass()); // Remove common subexprs + //addPass(PM, llvm::createGCSEPass()); // Remove common subexprs addPass(PM, llvm::createSCCPPass()); // Constant prop with SCCP addPass(PM, llvm::createPredicateSimplifierPass()); Modified: vmkit/trunk/lib/N3/VMCore/CLISignature.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLISignature.cpp?rev=54883&r1=54882&r2=54883&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/CLISignature.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/CLISignature.cpp Sun Aug 17 08:27:07 2008 @@ -142,6 +142,8 @@ static VMCommonClass* METHOD_ElementTypeVar(uint32 op, Assembly* ass, uint32& offset) { uint32 number = ass->uncompressSignature(offset); + assert(VMThread::get()->currGenericClass != NULL && "Current Generic Class not set!"); + return VMThread::get()->currGenericClass->genericParams[number]; } @@ -257,6 +259,10 @@ VMClass* cl = gc_new(VMClass)(); cl->token = number; cl->assembly = NULL; + cl->nameSpace = UTF8::asciizConstruct(VMThread::get()->vm, ""); + char *tmp = (char *) alloca(100); + snprintf(tmp, 100, "!!%d", number); + cl->name = UTF8::asciizConstruct(VMThread::get()->vm, tmp); return cl; } else { return VMThread::get()->currGenericMethod->genericParams[number]; Modified: vmkit/trunk/lib/N3/VMCore/VMClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.cpp?rev=54883&r1=54882&r2=54883&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMClass.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/VMClass.cpp Sun Aug 17 08:27:07 2008 @@ -474,8 +474,16 @@ } void VMCommonClass::resolveType(bool stat, bool clinit) { + // save previous current generic class to restore it later + VMGenericClass* old = VMThread::get()->currGenericClass; + // temporarily store the class being compiled in case it is a generic class + VMThread::get()->currGenericClass = dynamic_cast(this); + resolveVirtual(); if (stat) resolveStatic(clinit); + + // restore saved class + VMThread::get()->currGenericClass = old; } void VMCommonClass::resolveStatic(bool clinit) { From nicolas.geoffray at lip6.fr Mon Aug 18 00:42:01 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 18 Aug 2008 07:42:01 -0000 Subject: [vmkit-commits] [vmkit] r54909 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathVMClass.cpp.inc Classpath/ClasspathVMThread.cpp.inc VMCore/JavaClass.cpp VMCore/JavaConstantPool.cpp VMCore/JavaInitialise.cpp VMCore/JavaIsolate.cpp VMCore/JavaIsolate.h VMCore/JavaJIT.cpp VMCore/JavaUpcalls.cpp VMCore/JavaUpcalls.h VMCore/Jnjvm.cpp VMCore/Jnjvm.h VMCore/JnjvmClassLoader.cpp VMCore/JnjvmClassLoader.h VMCore/VirtualTables.cpp Message-ID: <200808180742.m7I7g1A8003574@zion.cs.uiuc.edu> Author: geoffray Date: Mon Aug 18 02:41:59 2008 New Revision: 54909 URL: http://llvm.org/viewvc/llvm-project?rev=54909&view=rev Log: Remove JavaIsolate class, everything is in the Jnjvm class now. Jnjvm now controls which exceptions are thrown internaly. Simplify & comment. Removed: vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.h Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc?rev=54909&r1=54908&r2=54909&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc Mon Aug 18 02:41:59 2008 @@ -62,8 +62,7 @@ } return (jclass)(cl->getClassDelegatee()); } else { - JavaThread::get()->isolate->error(Jnjvm::ClassNotFoundException, "unable to load %s", - ((JavaString*)str)->strToAsciiz()); + JavaThread::get()->isolate->classNotFoundException((JavaString*)str); return 0; } } Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc?rev=54909&r1=54908&r2=54909&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc Mon Aug 18 02:41:59 2008 @@ -15,7 +15,6 @@ #include "JavaArray.h" #include "JavaClass.h" -#include "JavaIsolate.h" #include "JavaJIT.h" #include "JavaObject.h" #include "JavaTypes.h" @@ -59,7 +58,7 @@ #endif CommonClass* vmthClass = vmThread->classOf; JavaObject* thread = ClasspathThread::assocThread->getVirtualObjectField(vmThread); - JavaIsolate* isolate = (JavaIsolate*)(intern->isolate); + Jnjvm* isolate = intern->isolate; ThreadSystem* ts = isolate->threadSystem; bool isDaemon = ClasspathThread::daemon->getVirtualInt8Field(thread); intern->threadID = (mvm::Thread::self() << 8) & 0x7FFFFF00; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=54909&r1=54908&r2=54909&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Mon Aug 18 02:41:59 2008 @@ -351,9 +351,7 @@ bool isStatic, bool recurse) { JavaMethod* res = lookupMethodDontThrow(name, type, isStatic, recurse); if (!res) { - JavaThread::get()->isolate->error(Jnjvm::NoSuchMethodError, - "unable to find %s in %s", - name->printString(), this->printString()); + JavaThread::get()->isolate->noSuchMethodError(this, name); } return res; } @@ -391,9 +389,7 @@ JavaField* res = lookupFieldDontThrow(name, type, isStatic, recurse); if (!res) { - JavaThread::get()->isolate->error(Jnjvm::NoSuchFieldError, - "unable to find %s in %s", - name->printString(), this->printString()); + JavaThread::get()->isolate->noSuchFieldError(this, name); } return res; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=54909&r1=54908&r2=54909&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Mon Aug 18 02:41:59 2008 @@ -45,7 +45,7 @@ static uint32 unimplemented(Class* cl, uint32 type, uint32 e, Reader& reader, sint32* ctpDef, void** ctpRes, uint8* ctpType) { - JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, + JavaThread::get()->isolate->classFormatError( "unknown constant pool type %d", type); return 1; @@ -227,7 +227,7 @@ const UTF8* JavaCtpInfo::UTF8At(uint32 entry) { if (! ((entry > 0) && (entry < ctpSize) && typeAt(entry) == ConstantUTF8)) { - JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, + JavaThread::get()->isolate->classFormatError( "bad constant pool number for utf8 at entry %d", entry); } return (const UTF8*)ctpRes[entry]; @@ -236,7 +236,7 @@ float JavaCtpInfo::FloatAt(uint32 entry) { if (! ((entry > 0) && (entry < ctpSize) && typeAt(entry) == ConstantFloat)) { - JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, + JavaThread::get()->isolate->classFormatError( "bad constant pool number for float at entry %d", entry); } return ((float*)ctpDef)[entry]; @@ -245,7 +245,7 @@ sint32 JavaCtpInfo::IntegerAt(uint32 entry) { if (! ((entry > 0) && (entry < ctpSize) && typeAt(entry) == ConstantInteger)) { - JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, + JavaThread::get()->isolate->classFormatError( "bad constant pool number for integer at entry %d", entry); } return ((sint32*)ctpDef)[entry]; @@ -254,7 +254,7 @@ sint64 JavaCtpInfo::LongAt(uint32 entry) { if (! ((entry > 0) && (entry < ctpSize) && typeAt(entry) == ConstantLong)) { - JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, + JavaThread::get()->isolate->classFormatError( "bad constant pool number for long at entry %d", entry); } return Reader::readLong(ctpDef[entry], ctpDef[entry + 1]); @@ -263,7 +263,7 @@ double JavaCtpInfo::DoubleAt(uint32 entry) { if (! ((entry > 0) && (entry < ctpSize) && typeAt(entry) == ConstantDouble)) { - JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, + JavaThread::get()->isolate->classFormatError( "bad constant pool number for double at entry %d", entry); } return Reader::readDouble(ctpDef[entry], ctpDef[entry + 1]); @@ -272,7 +272,7 @@ CommonClass* JavaCtpInfo::isLoadedClassOrClassName(uint32 entry) { if (! ((entry > 0) && (entry < ctpSize) && typeAt(entry) == ConstantClass)) { - JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, + JavaThread::get()->isolate->classFormatError( "bad constant pool number for class at entry %d", entry); } return (CommonClass*)ctpRes[entry]; @@ -314,7 +314,7 @@ void JavaCtpInfo::checkInfoOfClass(uint32 index) { if (typeAt(index) != ConstantClass) - JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, + JavaThread::get()->isolate->classFormatError( "bad constant pool number for class at entry %d", index); /*if (!(ctpRes[index])) ctpRes[index] = JavaJIT::newLookupLLVM;*/ @@ -324,7 +324,7 @@ void* res = ctpRes[index]; if (!res) { if (typeAt(index) != ConstantNameAndType) { - JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, + JavaThread::get()->isolate->classFormatError( "bad constant pool number for name/type at entry %d", index); } sint32 entry = ctpDef[index]; @@ -340,7 +340,7 @@ void* res = ctpRes[index]; if (!res) { if (typeAt(index) != ConstantNameAndType) { - JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, + JavaThread::get()->isolate->classFormatError( "bad constant pool number for name/type at entry %d", index); } sint32 entry = ctpDef[index]; @@ -354,7 +354,7 @@ Typedef* JavaCtpInfo::infoOfField(uint32 index) { if (typeAt(index) != ConstantFieldref) - JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, + JavaThread::get()->isolate->classFormatError( "bad constant pool number for field at entry %d", index); return resolveNameAndType(ctpDef[index] & 0xFFFF); } @@ -363,7 +363,7 @@ CommonClass*& cl, JavaMethod*& meth) { uint8 id = typeAt(index); if (id != ConstantMethodref && id != ConstantInterfaceMethodref) - JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, + JavaThread::get()->isolate->classFormatError( "bad constant pool number for method at entry %d", index); Signdef* sign = resolveNameAndSign(ctpDef[index] & 0xFFFF); @@ -390,7 +390,7 @@ Signdef*& sign) { uint8 id = typeAt(index); if (id != ConstantMethodref && id != ConstantInterfaceMethodref) - JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, + JavaThread::get()->isolate->classFormatError( "bad constant pool number for method at entry %d", index); sign = resolveNameAndSign(ctpDef[index] & 0xFFFF); @@ -406,7 +406,7 @@ JavaMethod*& meth) { uint8 id = typeAt(index); if (id != ConstantMethodref && id != ConstantInterfaceMethodref) - JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, + JavaThread::get()->isolate->classFormatError( "bad constant pool number for method at entry %d", index); sign = resolveNameAndSign(ctpDef[index] & 0xFFFF); @@ -445,7 +445,7 @@ uint8 id = typeAt(index); if (id != ConstantMethodref && id != ConstantInterfaceMethodref) - JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, + JavaThread::get()->isolate->classFormatError( "bad constant pool number for method at entry %d", index); Signdef* sign = resolveNameAndSign(ctpDef[index] & 0xFFFF); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp?rev=54909&r1=54908&r2=54909&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp Mon Aug 18 02:41:59 2008 @@ -16,7 +16,6 @@ #include "JavaCache.h" #include "JavaClass.h" #include "JavaConstantPool.h" -#include "JavaIsolate.h" #include "JavaJIT.h" #include "JavaObject.h" #include "JavaString.h" @@ -49,7 +48,6 @@ INIT(ClassMap); INIT(StaticInstanceMap); INIT(DelegateeMap); - INIT(JavaIsolate); INIT(JnjvmBootstrapLoader); INIT(JnjvmClassLoader); #ifdef SERVICE_VM @@ -72,7 +70,8 @@ static void initialiseStatics() { - JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader = JnjvmClassLoader::createBootstrapLoader(); + JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader = + JnjvmBootstrapLoader::createBootstrapLoader(); // Array initialization const UTF8* utf8OfChar = JCL->asciizConstructUTF8("[C"); @@ -80,8 +79,7 @@ ((UTF8*)utf8OfChar)->classOf = JavaArray::ofChar; - - + ClassArray::InterfacesArray.push_back( JCL->constructClass(JCL->asciizConstructUTF8("java/lang/Cloneable"))); @@ -136,6 +134,8 @@ Jnjvm::postlib = JCL->asciizConstructUTF8(".so"); #endif Jnjvm::mathName = JCL->asciizConstructUTF8("java/lang/Math"); + Jnjvm::NoClassDefFoundError = + JCL->asciizConstructUTF8("java/lang/NoClassDefFoundError"); #define DEF_UTF8(var) \ Jnjvm::var = JCL->asciizConstructUTF8(#var) @@ -182,8 +182,8 @@ } void Jnjvm::runApplication(int argc, char** argv) { - mvm::Thread::threadKey->set(((JavaIsolate*)this)->bootstrapThread); - ((JavaIsolate*)this)->runMain(argc, argv); + mvm::Thread::threadKey->set(this->bootstrapThread); + this->runMain(argc, argv); } mvm::VirtualMachine* mvm::VirtualMachine::createJVM() { @@ -191,7 +191,7 @@ ServiceDomain* vm = ServiceDomain::allocateService(); vm->startExecution(); #else - JavaIsolate* vm = JavaIsolate::allocateIsolate(); + Jnjvm* vm = Jnjvm::allocateIsolate(); #endif return vm; } Removed: vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp?rev=54908&view=auto ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp (removed) @@ -1,477 +0,0 @@ -//===------------ JavaIsolate.cpp - Start an isolate ----------------------===// -// -// JnJVM -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include - -#include "mvm/JIT.h" -#include "mvm/MvmMemoryManager.h" -#include "mvm/Threads/Locks.h" -#include "mvm/Threads/Cond.h" - -#include "JavaClass.h" -#include "JavaIsolate.h" -#include "JavaJIT.h" -#include "JavaString.h" -#include "JavaThread.h" -#include "JavaTypes.h" -#include "JavaUpcalls.h" -#include "JnjvmModuleProvider.h" -#include "LockedMap.h" -#include "Reader.h" -#include "Zip.h" - -#ifdef SERVICE_VM -#include "ServiceDomain.h" -#endif - -#define PATH_MANIFEST "META-INF/MANIFEST.MF" -#define MAIN_CLASS "Main-Class: " -#define PREMAIN_CLASS "Premain-Class: " -#define BOOT_CLASS_PATH "Boot-Class-Path: " -#define CAN_REDEFINE_CLASS_PATH "Can-Redefine-Classes: " - -#define LENGTH_MAIN_CLASS 12 -#define LENGTH_PREMAIN_CLASS 15 -#define LENGTH_BOOT_CLASS_PATH 17 - -using namespace jnjvm; - -extern "C" struct JNINativeInterface JNI_JNIEnvTable; -extern "C" const struct JNIInvokeInterface JNI_JavaVMTable; - -namespace jnjvm { - -class ClArgumentsInfo { -public: - uint32 appArgumentsPos; - char* className; - std::vector< std::pair > agents; - - void readArgs(int argc, char** argv, Jnjvm *vm); - void extractClassFromJar(Jnjvm* vm, int argc, char** argv, int i); - void javaAgent(char* cur); - - void printInformation(); - void nyi(); - void printVersion(); -}; - -} - -void ClArgumentsInfo::javaAgent(char* cur) { - assert(0 && "implement me"); -} - -extern "C" int sys_strnstr(const char *haystack, const char *needle) { - char * res = strstr(haystack, needle); - if (res) return res - haystack; - else return -1; -} - - -static char* findInformation(ArrayUInt8* manifest, const char* entry, uint32 len) { - uint8* ptr = manifest->elements; - sint32 index = sys_strnstr((char*)ptr, entry); - if (index != -1) { - index += len; - sint32 end = sys_strnstr((char*)&(ptr[index]), "\n"); - if (end == -1) end = manifest->size; - else end += index; - - sint32 length = end - index - 1; - char* name = (char*)malloc(length + 1); - memcpy(name, &(ptr[index]), length); - name[length] = 0; - return name; - } else { - return 0; - } -} - -void ClArgumentsInfo::extractClassFromJar(Jnjvm* vm, int argc, char** argv, - int i) { - char* jarFile = argv[i]; - char* temp = - (char*)malloc(2 + strlen(vm->classpath) + strlen(jarFile)); - - sprintf(temp, "%s:%s", vm->classpath, jarFile); - vm->setClasspath(temp); - - ArrayUInt8* bytes = Reader::openFile(JnjvmClassLoader::bootstrapLoader, - jarFile); - - ZipArchive archive(bytes); - if (archive.getOfscd() != -1) { - ZipFile* file = archive.getFile(PATH_MANIFEST); - if (file) { - ArrayUInt8* res = ArrayUInt8::acons(file->ucsize, JavaArray::ofByte, &vm->allocator); - int ok = archive.readFile(res, file); - if (ok) { - char* mainClass = findInformation(res, MAIN_CLASS, LENGTH_MAIN_CLASS); - if (mainClass) { - className = mainClass; - } else { - printf("No Main-Class: in Manifest of archive %s.\n", jarFile); - } - } else { - printf("Can't extract Manifest file from archive %s\n", jarFile); - } - } else { - printf("Can't find Manifest file in archive %s\n", jarFile); - } - } else { - printf("Can't find archive %s\n", jarFile); - } -} - -void ClArgumentsInfo::nyi() { - fprintf(stdout, "Not yet implemented\n"); -} - -void ClArgumentsInfo::printVersion() { - fprintf(stdout, "JnJVM for Java 1.1 -- 1.5\n"); -} - -void ClArgumentsInfo::printInformation() { - fprintf(stdout, - "Usage: java [-options] class [args...] (to execute a class)\n" - "or java [-options] -jar jarfile [args...]\n" - "(to execute a jar file) where options include:\n" - "-client to select the \"client\" VM\n" - "-server to select the \"server\" VM\n" - "-hotspot is a synonym for the \"client\" VM [deprecated]\n" - " The default VM is client.\n" - "\n" - "-cp \n" - "-classpath \n" - " A : separated list of directories, JAR archives,\n" - " and ZIP archives to search for class files.\n" - "-D=\n" - " set a system property\n" - "-verbose[:class|gc|jni]\n" - " enable verbose output\n" - "-version print product version and exit\n" - "-version:\n" - " require the specified version to run\n" - "-showversion print product version and continue\n" - "-jre-restrict-search | -jre-no-restrict-search\n" - " include/exclude user private JREs in the version search\n" - "-? -help print this help message\n" - "-X print help on non-standard options\n" - "-ea[:...|:]\n" - "-enableassertions[:...|:]\n" - " enable assertions\n" - "-da[:...|:]\n" - "-disableassertions[:...|:]\n" - " disable assertions\n" - "-esa | -enablesystemassertions\n" - " enable system assertions\n" - "-dsa | -disablesystemassertions\n" - " disable system assertions\n" - "-agentlib:[=]\n" - " load native agent library , e.g. -agentlib:hprof\n" - " see also, -agentlib:jdwp=help and -agentlib:hprof=help\n" - "-agentpath:[=]\n" - " load native agent library by full pathname\n" - "-javaagent:[=]\n" - " load Java programming language agent, see java.lang.instrument\n"); -} - -void ClArgumentsInfo::readArgs(int argc, char** argv, Jnjvm* vm) { - className = 0; - appArgumentsPos = 0; - sint32 i = 1; - if (i == argc) printInformation(); - while (i < argc) { - char* cur = argv[i]; - if (!(strcmp(cur, "-client"))) { - nyi(); - } else if (!(strcmp(cur, "-server"))) { - nyi(); - } else if (!(strcmp(cur, "-classpath"))) { - ++i; - if (i == argc) printInformation(); - else vm->setClasspath(argv[i]); - } else if (!(strcmp(cur, "-cp"))) { - ++i; - if (i == argc) printInformation(); - else vm->setClasspath(argv[i]); - } else if (!(strcmp(cur, "-debug"))) { - nyi(); - } else if (!(strncmp(cur, "-D", 2))) { - uint32 len = strlen(cur); - if (len == 2) { - printInformation(); - } else { - char* key = &cur[2]; - char* value = strchr(key, '='); - if (!value) { - printInformation(); - return; - } else { - value[0] = 0; - vm->addProperty(key, &value[1]); - } - } - } else if (!(strncmp(cur, "-Xbootclasspath:", 16))) { - uint32 len = strlen(cur); - if (len == 16) { - printInformation(); - } else { - char* path = &cur[16]; - JnjvmClassLoader::bootstrapLoader->analyseClasspathEnv(path); - } - } else if (!(strcmp(cur, "-enableassertions"))) { - nyi(); - } else if (!(strcmp(cur, "-ea"))) { - nyi(); - } else if (!(strcmp(cur, "-disableassertions"))) { - nyi(); - } else if (!(strcmp(cur, "-da"))) { - nyi(); - } else if (!(strcmp(cur, "-enablesystemassertions"))) { - nyi(); - } else if (!(strcmp(cur, "-esa"))) { - nyi(); - } else if (!(strcmp(cur, "-disablesystemassertions"))) { - nyi(); - } else if (!(strcmp(cur, "-dsa"))) { - nyi(); - } else if (!(strcmp(cur, "-jar"))) { - ++i; - if (i == argc) { - printInformation(); - } else { - extractClassFromJar(vm, argc, argv, i); - appArgumentsPos = i; - return; - } - } else if (!(strcmp(cur, "-jre-restrict-research"))) { - nyi(); - } else if (!(strcmp(cur, "-jre-no-restrict-research"))) { - nyi(); - } else if (!(strcmp(cur, "-noclassgc"))) { - nyi(); - } else if (!(strcmp(cur, "-ms"))) { - nyi(); - } else if (!(strcmp(cur, "-mx"))) { - nyi(); - } else if (!(strcmp(cur, "-ss"))) { - nyi(); - } else if (!(strcmp(cur, "-verbose"))) { - nyi(); - } else if (!(strcmp(cur, "-verbose:class"))) { - nyi(); - } else if (!(strcmp(cur, "-verbosegc"))) { - nyi(); - } else if (!(strcmp(cur, "-verbose:gc"))) { - nyi(); - } else if (!(strcmp(cur, "-verbose:jni"))) { - nyi(); - } else if (!(strcmp(cur, "-version"))) { - printVersion(); - } else if (!(strcmp(cur, "-showversion"))) { - nyi(); - } else if (!(strcmp(cur, "-?"))) { - printInformation(); - } else if (!(strcmp(cur, "-help"))) { - printInformation(); - } else if (!(strcmp(cur, "-X"))) { - nyi(); - } else if (!(strcmp(cur, "-agentlib"))) { - nyi(); - } else if (!(strcmp(cur, "-agentpath"))) { - nyi(); - } else if (cur[0] == '-') { - } else if (!(strcmp(cur, "-javaagent"))) { - javaAgent(cur); - } else { - className = cur; - appArgumentsPos = i; - return; - } - ++i; - } -} - - -void JavaIsolate::print(mvm::PrintBuffer* buf) const { - buf->write("Java isolate: "); - buf->write(name); - -} - -JnjvmClassLoader* JavaIsolate::loadAppClassLoader() { - if (appClassLoader == 0) { - JavaObject* loader = Classpath::getSystemClassLoader->invokeJavaObjectStatic(this); - appClassLoader = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader); - } - return appClassLoader; -} - -void JavaIsolate::mapInitialThread() { - ClasspathThread::mapInitialThread(this); -} - -void JavaIsolate::loadBootstrap() { - JnjvmClassLoader* loader = JnjvmClassLoader::bootstrapLoader; - loader->loadName(Classpath::newVMThrowable->name, - true, true, true); - loader->loadName(Classpath::newClass->name, - true, true, true); - loader->loadName(Classpath::newConstructor->name, - true, true, true); - loader->loadName(Classpath::newMethod->name, - true, true, true); - loader->loadName(Classpath::newField->name, - true, true, true); - loader->loadName(Classpath::newStackTraceElement->name, - true, true, true); - mapInitialThread(); - loadAppClassLoader(); - JavaObject* obj = JavaThread::currentThread(); - Classpath::setContextClassLoader->invokeIntSpecial(this, obj, appClassLoader->getJavaClassLoader()); - // load and initialise math since it is responsible for dlopen'ing - // libjavalang.so and we are optimizing some math operations - loader->loadName(loader->asciizConstructUTF8("java/lang/Math"), - true, true, true); -} - -void JavaIsolate::executeClass(const char* className, ArrayObject* args) { - try { - JavaJIT::invokeOnceVoid(this, appClassLoader, className, "main", - "([Ljava/lang/String;)V", ACC_STATIC, args); - }catch(...) { - } - - JavaObject* exc = JavaThread::get()->pendingException; - if (exc) { - JavaThread::clearException(); - JavaObject* obj = JavaThread::currentThread(); - JavaObject* group = - ClasspathThread::group->getVirtualObjectField(obj); - try{ - ClasspathThread::uncaughtException->invokeIntSpecial(this, group, obj, - exc); - }catch(...) { - printf("Even uncaught exception throwed an exception!\n"); - assert(0); - } - } -} - -void JavaIsolate::executePremain(const char* className, JavaString* args, - JavaObject* instrumenter) { - JavaJIT::invokeOnceVoid(this, appClassLoader, className, "premain", - "(Ljava/lang/String;Ljava/lang/instrument/Instrumentation;)V", - ACC_STATIC, args, instrumenter); -} - -void JavaIsolate::waitForExit() { - threadSystem->nonDaemonLock->lock(); - --(threadSystem->nonDaemonThreads); - - while (threadSystem->nonDaemonThreads) { - threadSystem->nonDaemonVar->wait(threadSystem->nonDaemonLock); - } - - threadSystem->nonDaemonLock->unlock(); - return; -} - -void JavaIsolate::runMain(int argc, char** argv) { - ClArgumentsInfo info; - - info.readArgs(argc, argv, this); - if (info.className) { - int pos = info.appArgumentsPos; - //llvm::cl::ParseCommandLineOptions(pos, argv, - // " JnJVM Java Virtual Machine\n"); - argv = argv + pos - 1; - argc = argc - pos + 1; - - loadBootstrap(); -#ifdef SERVICE_VM - ServiceDomain::initialise((ServiceDomain*)this); -#endif - - if (info.agents.size()) { - assert(0 && "implement me"); - JavaObject* instrumenter = 0;//createInstrumenter(); - for (std::vector< std::pair >::iterator i = info.agents.begin(), - e = info.agents.end(); i!= e; ++i) { - JavaString* args = asciizToStr(i->second); - executePremain(i->first, args, instrumenter); - } - } - - ArrayObject* args = ArrayObject::acons(argc - 2, JavaArray::ofString, &allocator); - for (int i = 2; i < argc; ++i) { - args->elements[i - 2] = (JavaObject*)asciizToStr(argv[i]); - } - - executeClass(info.className, args); - waitForExit(); - } -} - -void JavaIsolate::runIsolate(const char* className, ArrayObject* args) { - JavaIsolate *isolate = allocateIsolate(); - isolate->loadBootstrap(); - isolate->executeClass(className, args); - isolate->waitForExit(); -} - -JavaIsolate* JavaIsolate::allocateIsolate() { - JavaIsolate *isolate= gc_new(JavaIsolate)(); - -#ifdef MULTIPLE_GC - isolate->GC = Collector::allocate(); -#endif - isolate->classpath = getenv("CLASSPATH"); - if (!(isolate->classpath)) { - isolate->classpath = "."; - } - - isolate->bootstrapThread = gc_new(JavaThread)(); - isolate->bootstrapThread->initialise(0, isolate); - void* baseSP = mvm::Thread::get()->baseSP; - isolate->bootstrapThread->threadID = (mvm::Thread::self() << 8) & 0x7FFFFF00; - -#ifdef MULTIPLE_GC - isolate->bootstrapThread->GC = isolate->GC; - isolate->GC->inject_my_thread(baseSP); -#endif - isolate->bootstrapThread->baseSP = baseSP; - JavaThread::threadKey->set(isolate->bootstrapThread); - - isolate->threadSystem = new ThreadSystem(); - isolate->name = "isolate"; - isolate->appClassLoader = 0; - isolate->jniEnv = &JNI_JNIEnvTable; - isolate->javavmEnv = &JNI_JavaVMTable; - - // We copy so that bootstrap utf8 such as "" are unique - isolate->hashStr = new StringMap(); - isolate->globalRefsLock = mvm::Lock::allocNormal(); -#ifdef MULTIPLE_VM - isolate->statics = vm_new(isolate, StaticInstanceMap)(); - isolate->delegatees = vm_new(isolate, DelegateeMap)(); -#endif - - return isolate; -} - -JavaIsolate::~JavaIsolate() { - delete threadSystem; -} - -JavaIsolate::JavaIsolate() { - threadSystem = 0; -} Removed: vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.h?rev=54908&view=auto ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.h (removed) @@ -1,74 +0,0 @@ -//===---------------- JavaIsolate.h - Isolates ----------------------------===// -// -// JnJVM -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef JNJVM_JAVA_ISOLATE_H -#define JNJVM_JAVA_ISOLATE_H - - -#include "mvm/Object.h" -#include "mvm/Threads/Cond.h" -#include "mvm/Threads/Locks.h" - -#include "types.h" - -#include "Jnjvm.h" - -namespace jnjvm { - -class ArrayObject; -class JavaThread; -class JavaObject; -class ThreadSystem; - -class ThreadSystem { -public: - uint16 nonDaemonThreads; - mvm::Lock* nonDaemonLock; - mvm::Cond* nonDaemonVar; - - ThreadSystem() { - nonDaemonThreads = 1; - nonDaemonLock = mvm::Lock::allocNormal(); - nonDaemonVar = mvm::Cond::allocCond(); - } - - ~ThreadSystem() { - delete nonDaemonLock; - delete nonDaemonVar; - } - -}; - -class JavaIsolate : public Jnjvm { -public: - static VirtualTable* VT; - ThreadSystem* threadSystem; - JavaThread* bootstrapThread; - - virtual void print(mvm::PrintBuffer* buf) const; - virtual void TRACER; - ~JavaIsolate(); - JavaIsolate(); - - JnjvmClassLoader* loadAppClassLoader(); - void loadBootstrap(); - void executeClass(const char* className, ArrayObject* args); - void executePremain(const char* className, JavaString* args, - JavaObject* instrumenter); - void waitForExit(); - void runMain(int argc, char** argv); - void mapInitialThread(); - static void runIsolate(const char* className, ArrayObject* args); - static JavaIsolate* allocateIsolate(); - -}; - -} // end namespace jnjvm - -#endif Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=54909&r1=54908&r2=54909&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Mon Aug 18 02:41:59 2008 @@ -929,7 +929,7 @@ if (exc) { Jnjvm* vm = JavaThread::get()->isolate; - vm->errorWithExcp(Jnjvm::NoClassDefFoundError, exc); + vm->noClassDefFoundError(exc); } ex->catchClass = cl; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=54909&r1=54908&r2=54909&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Mon Aug 18 02:41:59 2008 @@ -111,6 +111,72 @@ Class* Classpath::vmStackWalker; +Class* ClasspathException::InvocationTargetException; +Class* ClasspathException::ArrayStoreException; +Class* ClasspathException::ClassCastException; +Class* ClasspathException::IllegalMonitorStateException; +Class* ClasspathException::IllegalArgumentException; +Class* ClasspathException::InterruptedException; +Class* ClasspathException::IndexOutOfBoundsException; +Class* ClasspathException::ArrayIndexOutOfBoundsException; +Class* ClasspathException::NegativeArraySizeException; +Class* ClasspathException::NullPointerException; +Class* ClasspathException::SecurityException; +Class* ClasspathException::ClassFormatError; +Class* ClasspathException::ClassCircularityError; +Class* ClasspathException::NoClassDefFoundError; +Class* ClasspathException::UnsupportedClassVersionError; +Class* ClasspathException::NoSuchFieldError; +Class* ClasspathException::NoSuchMethodError; +Class* ClasspathException::InstantiationError; +Class* ClasspathException::IllegalAccessError; +Class* ClasspathException::IllegalAccessException; +Class* ClasspathException::VerifyError; +Class* ClasspathException::ExceptionInInitializerError; +Class* ClasspathException::LinkageError; +Class* ClasspathException::AbstractMethodError; +Class* ClasspathException::UnsatisfiedLinkError; +Class* ClasspathException::InternalError; +Class* ClasspathException::OutOfMemoryError; +Class* ClasspathException::StackOverflowError; +Class* ClasspathException::UnknownError; +Class* ClasspathException::ClassNotFoundException; + +JavaMethod* ClasspathException::InitInvocationTargetException; +JavaMethod* ClasspathException::InitArrayStoreException; +JavaMethod* ClasspathException::InitClassCastException; +JavaMethod* ClasspathException::InitIllegalMonitorStateException; +JavaMethod* ClasspathException::InitIllegalArgumentException; +JavaMethod* ClasspathException::InitInterruptedException; +JavaMethod* ClasspathException::InitIndexOutOfBoundsException; +JavaMethod* ClasspathException::InitArrayIndexOutOfBoundsException; +JavaMethod* ClasspathException::InitNegativeArraySizeException; +JavaMethod* ClasspathException::InitNullPointerException; +JavaMethod* ClasspathException::InitSecurityException; +JavaMethod* ClasspathException::InitClassFormatError; +JavaMethod* ClasspathException::InitClassCircularityError; +JavaMethod* ClasspathException::InitNoClassDefFoundError; +JavaMethod* ClasspathException::InitUnsupportedClassVersionError; +JavaMethod* ClasspathException::InitNoSuchFieldError; +JavaMethod* ClasspathException::InitNoSuchMethodError; +JavaMethod* ClasspathException::InitInstantiationError; +JavaMethod* ClasspathException::InitIllegalAccessError; +JavaMethod* ClasspathException::InitIllegalAccessException; +JavaMethod* ClasspathException::InitVerifyError; +JavaMethod* ClasspathException::InitExceptionInInitializerError; +JavaMethod* ClasspathException::InitLinkageError; +JavaMethod* ClasspathException::InitAbstractMethodError; +JavaMethod* ClasspathException::InitUnsatisfiedLinkError; +JavaMethod* ClasspathException::InitInternalError; +JavaMethod* ClasspathException::InitOutOfMemoryError; +JavaMethod* ClasspathException::InitStackOverflowError; +JavaMethod* ClasspathException::InitUnknownError; +JavaMethod* ClasspathException::InitClassNotFoundException; + +JavaMethod* ClasspathException::ErrorWithExcpNoClassDefFoundError; +JavaMethod* ClasspathException::ErrorWithExcpExceptionInInitializerError; +JavaMethod* ClasspathException::ErrorWithExcpInvocationTargetException; + void ClasspathThread::initialise(JnjvmClassLoader* vm) { newThread = UPCALL_CLASS(vm, "java/lang/Thread"); @@ -168,6 +234,75 @@ "(Ljava/lang/Thread;Ljava/lang/Throwable;)V", ACC_VIRTUAL); } +void ClasspathException::initialise(JnjvmClassLoader* loader) { + UPCALL_REFLECT_CLASS_EXCEPTION(loader, InvocationTargetException); + UPCALL_CLASS_EXCEPTION(loader, ArrayStoreException); + UPCALL_CLASS_EXCEPTION(loader, ClassCastException); + UPCALL_CLASS_EXCEPTION(loader, IllegalMonitorStateException); + UPCALL_CLASS_EXCEPTION(loader, IllegalArgumentException); + UPCALL_CLASS_EXCEPTION(loader, InterruptedException); + UPCALL_CLASS_EXCEPTION(loader, IndexOutOfBoundsException); + UPCALL_CLASS_EXCEPTION(loader, ArrayIndexOutOfBoundsException); + UPCALL_CLASS_EXCEPTION(loader, NegativeArraySizeException); + UPCALL_CLASS_EXCEPTION(loader, NullPointerException); + UPCALL_CLASS_EXCEPTION(loader, SecurityException); + UPCALL_CLASS_EXCEPTION(loader, ClassFormatError); + UPCALL_CLASS_EXCEPTION(loader, ClassCircularityError); + UPCALL_CLASS_EXCEPTION(loader, NoClassDefFoundError); + UPCALL_CLASS_EXCEPTION(loader, UnsupportedClassVersionError); + UPCALL_CLASS_EXCEPTION(loader, NoSuchFieldError); + UPCALL_CLASS_EXCEPTION(loader, NoSuchMethodError); + UPCALL_CLASS_EXCEPTION(loader, InstantiationError); + UPCALL_CLASS_EXCEPTION(loader, IllegalAccessError); + UPCALL_CLASS_EXCEPTION(loader, IllegalAccessException); + UPCALL_CLASS_EXCEPTION(loader, VerifyError); + UPCALL_CLASS_EXCEPTION(loader, ExceptionInInitializerError); + UPCALL_CLASS_EXCEPTION(loader, LinkageError); + UPCALL_CLASS_EXCEPTION(loader, AbstractMethodError); + UPCALL_CLASS_EXCEPTION(loader, UnsatisfiedLinkError); + UPCALL_CLASS_EXCEPTION(loader, InternalError); + UPCALL_CLASS_EXCEPTION(loader, OutOfMemoryError); + UPCALL_CLASS_EXCEPTION(loader, StackOverflowError); + UPCALL_CLASS_EXCEPTION(loader, UnknownError); + UPCALL_CLASS_EXCEPTION(loader, ClassNotFoundException); + + UPCALL_METHOD_EXCEPTION(loader, InvocationTargetException); + UPCALL_METHOD_EXCEPTION(loader, ArrayStoreException); + UPCALL_METHOD_EXCEPTION(loader, ClassCastException); + UPCALL_METHOD_EXCEPTION(loader, IllegalMonitorStateException); + UPCALL_METHOD_EXCEPTION(loader, IllegalArgumentException); + UPCALL_METHOD_EXCEPTION(loader, InterruptedException); + UPCALL_METHOD_EXCEPTION(loader, IndexOutOfBoundsException); + UPCALL_METHOD_EXCEPTION(loader, ArrayIndexOutOfBoundsException); + UPCALL_METHOD_EXCEPTION(loader, NegativeArraySizeException); + UPCALL_METHOD_EXCEPTION(loader, NullPointerException); + UPCALL_METHOD_EXCEPTION(loader, SecurityException); + UPCALL_METHOD_EXCEPTION(loader, ClassFormatError); + UPCALL_METHOD_EXCEPTION(loader, ClassCircularityError); + UPCALL_METHOD_EXCEPTION(loader, NoClassDefFoundError); + UPCALL_METHOD_EXCEPTION(loader, UnsupportedClassVersionError); + UPCALL_METHOD_EXCEPTION(loader, NoSuchFieldError); + UPCALL_METHOD_EXCEPTION(loader, NoSuchMethodError); + UPCALL_METHOD_EXCEPTION(loader, InstantiationError); + UPCALL_METHOD_EXCEPTION(loader, IllegalAccessError); + UPCALL_METHOD_EXCEPTION(loader, IllegalAccessException); + UPCALL_METHOD_EXCEPTION(loader, VerifyError); + UPCALL_METHOD_EXCEPTION(loader, ExceptionInInitializerError); + UPCALL_METHOD_EXCEPTION(loader, LinkageError); + UPCALL_METHOD_EXCEPTION(loader, AbstractMethodError); + UPCALL_METHOD_EXCEPTION(loader, UnsatisfiedLinkError); + UPCALL_METHOD_EXCEPTION(loader, InternalError); + UPCALL_METHOD_EXCEPTION(loader, OutOfMemoryError); + UPCALL_METHOD_EXCEPTION(loader, StackOverflowError); + UPCALL_METHOD_EXCEPTION(loader, UnknownError); + UPCALL_METHOD_EXCEPTION(loader, ClassNotFoundException); + + UPCALL_METHOD_WITH_EXCEPTION(loader, NoClassDefFoundError); + UPCALL_METHOD_WITH_EXCEPTION(loader, ExceptionInInitializerError); + UPCALL_METHOD_WITH_EXCEPTION(loader, InvocationTargetException); +} + + void ClasspathThread::createInitialThread(Jnjvm* vm, JavaObject* th) { JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; JCL->loadName(newVMThread->name, true, true, true); @@ -387,6 +522,7 @@ vm->TheModule->setMethod(isArray, "isArray"); ClasspathThread::initialise(vm); + ClasspathException::initialise(vm); vm->loadName(vm->asciizConstructUTF8("java/lang/String"), true, false, false); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h?rev=54909&r1=54908&r2=54909&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h Mon Aug 18 02:41:59 2008 @@ -11,11 +11,11 @@ #define JNJVM_JAVA_UPCALLS_H -#define UPCALL_CLASS(vm, name) \ - vm->constructClass(vm->asciizConstructUTF8(name)) \ +#define UPCALL_CLASS(vm, name) \ + vm->constructClass(vm->asciizConstructUTF8(name)) -#define UPCALL_FIELD(vm, cl, name, type, acc) \ - UPCALL_CLASS(vm, cl)->constructField(vm->asciizConstructUTF8(name), \ +#define UPCALL_FIELD(vm, cl, name, type, acc) \ + UPCALL_CLASS(vm, cl)->constructField(vm->asciizConstructUTF8(name), \ vm->asciizConstructUTF8(type), acc) #define UPCALL_METHOD(vm, cl, name, type, acc) \ @@ -25,8 +25,23 @@ #define UPCALL_ARRAY_CLASS(vm, name, depth) \ vm->constructArray( \ AssessorDesc::constructArrayName(vm, 0, depth, \ - vm->asciizConstructUTF8(name))) \ + vm->asciizConstructUTF8(name))) +#define UPCALL_CLASS_EXCEPTION(loader, name) \ + name = UPCALL_CLASS(loader, "java/lang/"#name) + +#define UPCALL_REFLECT_CLASS_EXCEPTION(loader, name) \ + name = UPCALL_CLASS(loader, "java/lang/reflect/"#name) + +#define UPCALL_METHOD_EXCEPTION(loader, name) \ + Init##name = name->constructMethod(loader->asciizConstructUTF8(""), \ + loader->asciizConstructUTF8("(Ljava/lang/String;)V"), \ + ACC_VIRTUAL); + +#define UPCALL_METHOD_WITH_EXCEPTION(loader, name) \ + ErrorWithExcp##name = name->constructMethod(loader->asciizConstructUTF8(""), \ + loader->asciizConstructUTF8("(Ljava/lang/Throwable;)V"), \ + ACC_VIRTUAL); namespace jnjvm { @@ -60,6 +75,77 @@ static void mapInitialThread(Jnjvm* vm); }; +class ClasspathException { +public: + static void initialise(JnjvmClassLoader* vm); + + static Class* InvocationTargetException; + static Class* ArrayStoreException; + static Class* ClassCastException; + static Class* IllegalMonitorStateException; + static Class* IllegalArgumentException; + static Class* InterruptedException; + static Class* IndexOutOfBoundsException; + static Class* ArrayIndexOutOfBoundsException; + static Class* NegativeArraySizeException; + static Class* NullPointerException; + static Class* SecurityException; + static Class* ClassFormatError; + static Class* ClassCircularityError; + static Class* NoClassDefFoundError; + static Class* UnsupportedClassVersionError; + static Class* NoSuchFieldError; + static Class* NoSuchMethodError; + static Class* InstantiationError; + static Class* IllegalAccessError; + static Class* IllegalAccessException; + static Class* VerifyError; + static Class* ExceptionInInitializerError; + static Class* LinkageError; + static Class* AbstractMethodError; + static Class* UnsatisfiedLinkError; + static Class* InternalError; + static Class* OutOfMemoryError; + static Class* StackOverflowError; + static Class* UnknownError; + static Class* ClassNotFoundException; + + static JavaMethod* InitInvocationTargetException; + static JavaMethod* InitArrayStoreException; + static JavaMethod* InitClassCastException; + static JavaMethod* InitIllegalMonitorStateException; + static JavaMethod* InitIllegalArgumentException; + static JavaMethod* InitInterruptedException; + static JavaMethod* InitIndexOutOfBoundsException; + static JavaMethod* InitArrayIndexOutOfBoundsException; + static JavaMethod* InitNegativeArraySizeException; + static JavaMethod* InitNullPointerException; + static JavaMethod* InitSecurityException; + static JavaMethod* InitClassFormatError; + static JavaMethod* InitClassCircularityError; + static JavaMethod* InitNoClassDefFoundError; + static JavaMethod* InitUnsupportedClassVersionError; + static JavaMethod* InitNoSuchFieldError; + static JavaMethod* InitNoSuchMethodError; + static JavaMethod* InitInstantiationError; + static JavaMethod* InitIllegalAccessError; + static JavaMethod* InitIllegalAccessException; + static JavaMethod* InitVerifyError; + static JavaMethod* InitExceptionInInitializerError; + static JavaMethod* InitLinkageError; + static JavaMethod* InitAbstractMethodError; + static JavaMethod* InitUnsatisfiedLinkError; + static JavaMethod* InitInternalError; + static JavaMethod* InitOutOfMemoryError; + static JavaMethod* InitStackOverflowError; + static JavaMethod* InitUnknownError; + static JavaMethod* InitClassNotFoundException; + + static JavaMethod* ErrorWithExcpNoClassDefFoundError; + static JavaMethod* ErrorWithExcpExceptionInInitializerError; + static JavaMethod* ErrorWithExcpInvocationTargetException; +}; + class Classpath { public: static JavaMethod* getSystemClassLoader; Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=54909&r1=54908&r2=54909&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Mon Aug 18 02:41:59 2008 @@ -41,6 +41,7 @@ #define DEF_UTF8(var) \ const UTF8* Jnjvm::var = 0 + DEF_UTF8(NoClassDefFoundError); DEF_UTF8(initName); DEF_UTF8(clinitName); DEF_UTF8(clinitType); @@ -79,44 +80,6 @@ const char* Jnjvm::envSeparator = ":"; const unsigned int Jnjvm::Magic = 0xcafebabe; -#define DECLARE_EXCEPTION(EXCP) \ - const char* Jnjvm::EXCP = "java/lang/"#EXCP - -#define DECLARE_REFLECT_EXCEPTION(EXCP) \ - const char* Jnjvm::EXCP = "java/lang/reflect/"#EXCP - -DECLARE_EXCEPTION(ArithmeticException); -DECLARE_REFLECT_EXCEPTION(InvocationTargetException); -DECLARE_EXCEPTION(ArrayStoreException); -DECLARE_EXCEPTION(ClassCastException); -DECLARE_EXCEPTION(IllegalMonitorStateException); -DECLARE_EXCEPTION(IllegalArgumentException); -DECLARE_EXCEPTION(InterruptedException); -DECLARE_EXCEPTION(IndexOutOfBoundsException); -DECLARE_EXCEPTION(ArrayIndexOutOfBoundsException); -DECLARE_EXCEPTION(NegativeArraySizeException); -DECLARE_EXCEPTION(NullPointerException); -DECLARE_EXCEPTION(SecurityException); -DECLARE_EXCEPTION(ClassFormatError); -DECLARE_EXCEPTION(ClassCircularityError); -DECLARE_EXCEPTION(NoClassDefFoundError); -DECLARE_EXCEPTION(UnsupportedClassVersionError); -DECLARE_EXCEPTION(NoSuchFieldError); -DECLARE_EXCEPTION(NoSuchMethodError); -DECLARE_EXCEPTION(InstantiationError); -DECLARE_EXCEPTION(IllegalAccessError); -DECLARE_EXCEPTION(IllegalAccessException); -DECLARE_EXCEPTION(VerifyError); -DECLARE_EXCEPTION(ExceptionInInitializerError); -DECLARE_EXCEPTION(LinkageError); -DECLARE_EXCEPTION(AbstractMethodError); -DECLARE_EXCEPTION(UnsatisfiedLinkError); -DECLARE_EXCEPTION(InternalError); -DECLARE_EXCEPTION(OutOfMemoryError); -DECLARE_EXCEPTION(StackOverflowError); -DECLARE_EXCEPTION(UnknownError); -DECLARE_EXCEPTION(ClassNotFoundException); - typedef void (*clinit_t)(Jnjvm* vm); void Jnjvm::initialiseClass(CommonClass* cl) { @@ -185,59 +148,37 @@ } -void Jnjvm::errorWithExcp(const char* className, const JavaObject* excp) { - JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; - Class* cl = (Class*) JCL->loadName(JCL->asciizConstructUTF8(className), - true, true, true); +void Jnjvm::errorWithExcp(Class* cl, JavaMethod* init, const JavaObject* excp) { JavaObject* obj = cl->doNew(this); - JavaJIT::invokeOnceVoid(this, JCL, className, "", - "(Ljava/lang/Throwable;)V", ACC_VIRTUAL, obj, excp); + init->invokeIntSpecial(this, obj, excp); JavaThread::throwException(obj); } -void Jnjvm::error(const char* className, const char* fmt, ...) { - JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; +void Jnjvm::error(Class* cl, JavaMethod* init, const char* fmt, ...) { char* tmp = (char*)alloca(4096); - Class* cl = (Class*) JCL->loadName(JCL->asciizConstructUTF8(className), - true, true, true); va_list ap; va_start(ap, fmt); vsnprintf(tmp, 4096, fmt, ap); va_end(ap); - - JavaObject* obj = cl->doNew(this); - JavaJIT::invokeOnceVoid(this, JCL, className, "", - "(Ljava/lang/String;)V", ACC_VIRTUAL, obj, - this->asciizToStr(tmp)); - JavaThread::throwException(obj); -} - - -void Jnjvm::verror(const char* className, const char* fmt, va_list ap) { - JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; - char* tmp = (char*)alloca(4096); - Class* cl = (Class*) JCL->loadName(JCL->asciizConstructUTF8(className), - true, true, true); - vsnprintf(tmp, 4096, fmt, ap); - va_end(ap); + JavaObject* obj = cl->doNew(this); - JavaJIT::invokeOnceVoid(this, JCL, className, "", - "(Ljava/lang/String;)V", ACC_VIRTUAL, obj, - this->asciizToStr(tmp)); - + init->invokeIntSpecial(this, obj, asciizToStr(tmp)); JavaThread::throwException(obj); } void Jnjvm::arrayStoreException() { - error(ArrayStoreException, ""); + error(ClasspathException::ArrayStoreException, + ClasspathException::InitArrayStoreException, ""); } void Jnjvm::indexOutOfBounds(const JavaObject* obj, sint32 entry) { - error(ArrayIndexOutOfBoundsException, "%d", entry); + error(ClasspathException::ArrayIndexOutOfBoundsException, + ClasspathException::InitArrayIndexOutOfBoundsException, "%d", entry); } void Jnjvm::negativeArraySizeException(sint32 size) { - error(NegativeArraySizeException, "%d", size); + error(ClasspathException::NegativeArraySizeException, + ClasspathException::InitNegativeArraySizeException, "%d", size); } void Jnjvm::nullPointerException(const char* fmt, ...) { @@ -245,58 +186,116 @@ va_start(ap, fmt); char* val = va_arg(ap, char*); va_end(ap); - error(NullPointerException, fmt, val); + error(ClasspathException::NullPointerException, + ClasspathException::InitNullPointerException, fmt, val); } void Jnjvm::illegalAccessException(const char* msg) { - error(IllegalAccessException, msg); + error(ClasspathException::IllegalAccessException, + ClasspathException::InitIllegalAccessException, msg); } void Jnjvm::illegalMonitorStateException(const JavaObject* obj) { - error(IllegalMonitorStateException, ""); + error(ClasspathException::IllegalMonitorStateException, + ClasspathException::InitIllegalMonitorStateException, ""); } void Jnjvm::interruptedException(const JavaObject* obj) { - error(InterruptedException, ""); + error(ClasspathException::InterruptedException, + ClasspathException::InitInterruptedException, ""); } void Jnjvm::initializerError(const JavaObject* excp) { - errorWithExcp(ExceptionInInitializerError, excp); + errorWithExcp(ClasspathException::ExceptionInInitializerError, + ClasspathException::ErrorWithExcpExceptionInInitializerError, + excp); } void Jnjvm::invocationTargetException(const JavaObject* excp) { - errorWithExcp(InvocationTargetException, excp); + errorWithExcp(ClasspathException::InvocationTargetException, + ClasspathException::ErrorWithExcpInvocationTargetException, + excp); } void Jnjvm::outOfMemoryError(sint32 n) { - error(OutOfMemoryError, ""); + error(ClasspathException::OutOfMemoryError, + ClasspathException::InitOutOfMemoryError, "%d", n); } void Jnjvm::illegalArgumentExceptionForMethod(JavaMethod* meth, CommonClass* required, CommonClass* given) { - error(IllegalArgumentException, "for method %s", meth->printString()); + error(ClasspathException::IllegalArgumentException, + ClasspathException::InitIllegalArgumentException, + "for method %s", meth->printString()); } void Jnjvm::illegalArgumentExceptionForField(JavaField* field, CommonClass* required, CommonClass* given) { - error(IllegalArgumentException, "for field %s", field->printString()); + error(ClasspathException::IllegalArgumentException, + ClasspathException::InitIllegalArgumentException, + "for field %s", field->printString()); } void Jnjvm::illegalArgumentException(const char* msg) { - error(IllegalArgumentException, msg); + error(ClasspathException::IllegalArgumentException, + ClasspathException::InitIllegalArgumentException, + msg); } void Jnjvm::classCastException(const char* msg) { - error(ClassCastException, msg); + error(ClasspathException::ClassCastException, + ClasspathException::InitClassCastException, + msg); +} + +void Jnjvm::noSuchFieldError(CommonClass* cl, const UTF8* name) { + error(ClasspathException::NoSuchFieldError, + ClasspathException::InitNoSuchFieldError, + "unable to find %s in %s", + name->printString(), cl->printString()); + +} + +void Jnjvm::noSuchMethodError(CommonClass* cl, const UTF8* name) { + error(ClasspathException::NoSuchMethodError, + ClasspathException::InitNoSuchMethodError, + "unable to find %s in %s", + name->printString(), cl->printString()); + +} + +void Jnjvm::classFormatError(const char* msg, ...) { + error(ClasspathException::ClassFormatError, + ClasspathException::InitClassFormatError, + msg); +} + +void Jnjvm::noClassDefFoundError(JavaObject* obj) { + errorWithExcp(ClasspathException::NoClassDefFoundError, + ClasspathException::ErrorWithExcpNoClassDefFoundError, + obj); +} + +void Jnjvm::noClassDefFoundError(const char* fmt, ...) { + error(ClasspathException::NoClassDefFoundError, + ClasspathException::InitNoClassDefFoundError, + fmt); +} + +void Jnjvm::classNotFoundException(JavaString* str) { + error(ClasspathException::ClassNotFoundException, + ClasspathException::InitClassNotFoundException, + "unable to load %s", + str->strToAsciiz()); } void Jnjvm::unknownError(const char* fmt, ...) { - va_list ap; - va_start(ap, fmt); - verror(UnknownError, fmt, ap); + error(ClasspathException::UnknownError, + ClasspathException::InitUnknownError, + fmt); } JavaString* Jnjvm::UTF8ToStr(const UTF8* utf8) { @@ -362,6 +361,7 @@ delete hashStr; delete globalRefsLock; + delete threadSystem; } Jnjvm::Jnjvm() { @@ -370,4 +370,470 @@ #endif hashStr = 0; globalRefsLock = 0; + threadSystem = 0; +} + +#define PATH_MANIFEST "META-INF/MANIFEST.MF" +#define MAIN_CLASS "Main-Class: " +#define PREMAIN_CLASS "Premain-Class: " +#define BOOT_CLASS_PATH "Boot-Class-Path: " +#define CAN_REDEFINE_CLASS_PATH "Can-Redefine-Classes: " + +#define LENGTH_MAIN_CLASS 12 +#define LENGTH_PREMAIN_CLASS 15 +#define LENGTH_BOOT_CLASS_PATH 17 + +extern "C" struct JNINativeInterface JNI_JNIEnvTable; +extern "C" const struct JNIInvokeInterface JNI_JavaVMTable; + +namespace jnjvm { + +class ClArgumentsInfo { +public: + uint32 appArgumentsPos; + char* className; + std::vector< std::pair > agents; + + void readArgs(int argc, char** argv, Jnjvm *vm); + void extractClassFromJar(Jnjvm* vm, int argc, char** argv, int i); + void javaAgent(char* cur); + + void printInformation(); + void nyi(); + void printVersion(); +}; + +} + +void ClArgumentsInfo::javaAgent(char* cur) { + assert(0 && "implement me"); +} + +extern "C" int sys_strnstr(const char *haystack, const char *needle) { + char * res = strstr(haystack, needle); + if (res) return res - haystack; + else return -1; +} + + +static char* findInformation(ArrayUInt8* manifest, const char* entry, uint32 len) { + uint8* ptr = manifest->elements; + sint32 index = sys_strnstr((char*)ptr, entry); + if (index != -1) { + index += len; + sint32 end = sys_strnstr((char*)&(ptr[index]), "\n"); + if (end == -1) end = manifest->size; + else end += index; + + sint32 length = end - index - 1; + char* name = (char*)malloc(length + 1); + memcpy(name, &(ptr[index]), length); + name[length] = 0; + return name; + } else { + return 0; + } +} + +void ClArgumentsInfo::extractClassFromJar(Jnjvm* vm, int argc, char** argv, + int i) { + char* jarFile = argv[i]; + char* temp = + (char*)malloc(2 + strlen(vm->classpath) + strlen(jarFile)); + + sprintf(temp, "%s:%s", vm->classpath, jarFile); + vm->setClasspath(temp); + + ArrayUInt8* bytes = Reader::openFile(JnjvmClassLoader::bootstrapLoader, + jarFile); + + ZipArchive archive(bytes); + if (archive.getOfscd() != -1) { + ZipFile* file = archive.getFile(PATH_MANIFEST); + if (file) { + ArrayUInt8* res = ArrayUInt8::acons(file->ucsize, JavaArray::ofByte, &vm->allocator); + int ok = archive.readFile(res, file); + if (ok) { + char* mainClass = findInformation(res, MAIN_CLASS, LENGTH_MAIN_CLASS); + if (mainClass) { + className = mainClass; + } else { + printf("No Main-Class: in Manifest of archive %s.\n", jarFile); + } + } else { + printf("Can't extract Manifest file from archive %s\n", jarFile); + } + } else { + printf("Can't find Manifest file in archive %s\n", jarFile); + } + } else { + printf("Can't find archive %s\n", jarFile); + } +} + +void ClArgumentsInfo::nyi() { + fprintf(stdout, "Not yet implemented\n"); +} + +void ClArgumentsInfo::printVersion() { + fprintf(stdout, "JnJVM for Java 1.1 -- 1.5\n"); +} + +void ClArgumentsInfo::printInformation() { + fprintf(stdout, + "Usage: java [-options] class [args...] (to execute a class)\n" + "or java [-options] -jar jarfile [args...]\n" + "(to execute a jar file) where options include:\n" + "-client to select the \"client\" VM\n" + "-server to select the \"server\" VM\n" + "-hotspot is a synonym for the \"client\" VM [deprecated]\n" + " The default VM is client.\n" + "\n" + "-cp \n" + "-classpath \n" + " A : separated list of directories, JAR archives,\n" + " and ZIP archives to search for class files.\n" + "-D=\n" + " set a system property\n" + "-verbose[:class|gc|jni]\n" + " enable verbose output\n" + "-version print product version and exit\n" + "-version:\n" + " require the specified version to run\n" + "-showversion print product version and continue\n" + "-jre-restrict-search | -jre-no-restrict-search\n" + " include/exclude user private JREs in the version search\n" + "-? -help print this help message\n" + "-X print help on non-standard options\n" + "-ea[:...|:]\n" + "-enableassertions[:...|:]\n" + " enable assertions\n" + "-da[:...|:]\n" + "-disableassertions[:...|:]\n" + " disable assertions\n" + "-esa | -enablesystemassertions\n" + " enable system assertions\n" + "-dsa | -disablesystemassertions\n" + " disable system assertions\n" + "-agentlib:[=]\n" + " load native agent library , e.g. -agentlib:hprof\n" + " see also, -agentlib:jdwp=help and -agentlib:hprof=help\n" + "-agentpath:[=]\n" + " load native agent library by full pathname\n" + "-javaagent:[=]\n" + " load Java programming language agent, see java.lang.instrument\n"); +} + +void ClArgumentsInfo::readArgs(int argc, char** argv, Jnjvm* vm) { + className = 0; + appArgumentsPos = 0; + sint32 i = 1; + if (i == argc) printInformation(); + while (i < argc) { + char* cur = argv[i]; + if (!(strcmp(cur, "-client"))) { + nyi(); + } else if (!(strcmp(cur, "-server"))) { + nyi(); + } else if (!(strcmp(cur, "-classpath"))) { + ++i; + if (i == argc) printInformation(); + else vm->setClasspath(argv[i]); + } else if (!(strcmp(cur, "-cp"))) { + ++i; + if (i == argc) printInformation(); + else vm->setClasspath(argv[i]); + } else if (!(strcmp(cur, "-debug"))) { + nyi(); + } else if (!(strncmp(cur, "-D", 2))) { + uint32 len = strlen(cur); + if (len == 2) { + printInformation(); + } else { + char* key = &cur[2]; + char* value = strchr(key, '='); + if (!value) { + printInformation(); + return; + } else { + value[0] = 0; + vm->addProperty(key, &value[1]); + } + } + } else if (!(strncmp(cur, "-Xbootclasspath:", 16))) { + uint32 len = strlen(cur); + if (len == 16) { + printInformation(); + } else { + char* path = &cur[16]; + JnjvmClassLoader::bootstrapLoader->analyseClasspathEnv(path); + } + } else if (!(strcmp(cur, "-enableassertions"))) { + nyi(); + } else if (!(strcmp(cur, "-ea"))) { + nyi(); + } else if (!(strcmp(cur, "-disableassertions"))) { + nyi(); + } else if (!(strcmp(cur, "-da"))) { + nyi(); + } else if (!(strcmp(cur, "-enablesystemassertions"))) { + nyi(); + } else if (!(strcmp(cur, "-esa"))) { + nyi(); + } else if (!(strcmp(cur, "-disablesystemassertions"))) { + nyi(); + } else if (!(strcmp(cur, "-dsa"))) { + nyi(); + } else if (!(strcmp(cur, "-jar"))) { + ++i; + if (i == argc) { + printInformation(); + } else { + extractClassFromJar(vm, argc, argv, i); + appArgumentsPos = i; + return; + } + } else if (!(strcmp(cur, "-jre-restrict-research"))) { + nyi(); + } else if (!(strcmp(cur, "-jre-no-restrict-research"))) { + nyi(); + } else if (!(strcmp(cur, "-noclassgc"))) { + nyi(); + } else if (!(strcmp(cur, "-ms"))) { + nyi(); + } else if (!(strcmp(cur, "-mx"))) { + nyi(); + } else if (!(strcmp(cur, "-ss"))) { + nyi(); + } else if (!(strcmp(cur, "-verbose"))) { + nyi(); + } else if (!(strcmp(cur, "-verbose:class"))) { + nyi(); + } else if (!(strcmp(cur, "-verbosegc"))) { + nyi(); + } else if (!(strcmp(cur, "-verbose:gc"))) { + nyi(); + } else if (!(strcmp(cur, "-verbose:jni"))) { + nyi(); + } else if (!(strcmp(cur, "-version"))) { + printVersion(); + } else if (!(strcmp(cur, "-showversion"))) { + nyi(); + } else if (!(strcmp(cur, "-?"))) { + printInformation(); + } else if (!(strcmp(cur, "-help"))) { + printInformation(); + } else if (!(strcmp(cur, "-X"))) { + nyi(); + } else if (!(strcmp(cur, "-agentlib"))) { + nyi(); + } else if (!(strcmp(cur, "-agentpath"))) { + nyi(); + } else if (cur[0] == '-') { + } else if (!(strcmp(cur, "-javaagent"))) { + javaAgent(cur); + } else { + className = cur; + appArgumentsPos = i; + return; + } + ++i; + } +} + + +void Jnjvm::print(mvm::PrintBuffer* buf) const { + buf->write("Java isolate: "); + buf->write(name); + +} + +JnjvmClassLoader* Jnjvm::loadAppClassLoader() { + if (appClassLoader == 0) { + JavaObject* loader = Classpath::getSystemClassLoader->invokeJavaObjectStatic(this); + appClassLoader = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader); + } + return appClassLoader; +} + +void Jnjvm::mapInitialThread() { + ClasspathThread::mapInitialThread(this); +} + +void Jnjvm::loadBootstrap() { + JnjvmClassLoader* loader = JnjvmClassLoader::bootstrapLoader; +#define LOAD_CLASS(cl) \ + loader->loadName(cl->name, true, true, true); + LOAD_CLASS(Classpath::newClass); + LOAD_CLASS(Classpath::newConstructor); + LOAD_CLASS(Classpath::newMethod); + LOAD_CLASS(Classpath::newField); + LOAD_CLASS(Classpath::newStackTraceElement); + LOAD_CLASS(ClasspathException::InvocationTargetException); + LOAD_CLASS(ClasspathException::ArrayStoreException); + LOAD_CLASS(ClasspathException::ClassCastException); + LOAD_CLASS(ClasspathException::IllegalMonitorStateException); + LOAD_CLASS(ClasspathException::IllegalArgumentException); + LOAD_CLASS(ClasspathException::InterruptedException); + LOAD_CLASS(ClasspathException::IndexOutOfBoundsException); + LOAD_CLASS(ClasspathException::ArrayIndexOutOfBoundsException); + LOAD_CLASS(ClasspathException::NegativeArraySizeException); + LOAD_CLASS(ClasspathException::NullPointerException); + LOAD_CLASS(ClasspathException::SecurityException); + LOAD_CLASS(ClasspathException::ClassFormatError); + LOAD_CLASS(ClasspathException::ClassCircularityError); + LOAD_CLASS(ClasspathException::NoClassDefFoundError); + LOAD_CLASS(ClasspathException::UnsupportedClassVersionError); + LOAD_CLASS(ClasspathException::NoSuchFieldError); + LOAD_CLASS(ClasspathException::NoSuchMethodError); + LOAD_CLASS(ClasspathException::InstantiationError); + LOAD_CLASS(ClasspathException::IllegalAccessError); + LOAD_CLASS(ClasspathException::IllegalAccessException); + LOAD_CLASS(ClasspathException::VerifyError); + LOAD_CLASS(ClasspathException::ExceptionInInitializerError); + LOAD_CLASS(ClasspathException::LinkageError); + LOAD_CLASS(ClasspathException::AbstractMethodError); + LOAD_CLASS(ClasspathException::UnsatisfiedLinkError); + LOAD_CLASS(ClasspathException::InternalError); + LOAD_CLASS(ClasspathException::OutOfMemoryError); + LOAD_CLASS(ClasspathException::StackOverflowError); + LOAD_CLASS(ClasspathException::UnknownError); + LOAD_CLASS(ClasspathException::ClassNotFoundException); +#undef LOAD_CLASS + + mapInitialThread(); + loadAppClassLoader(); + JavaObject* obj = JavaThread::currentThread(); + Classpath::setContextClassLoader->invokeIntSpecial(this, obj, + appClassLoader->getJavaClassLoader()); + // load and initialise math since it is responsible for dlopen'ing + // libjavalang.so and we are optimizing some math operations + loader->loadName(loader->asciizConstructUTF8("java/lang/Math"), + true, true, true); +} + +void Jnjvm::executeClass(const char* className, ArrayObject* args) { + try { + JavaJIT::invokeOnceVoid(this, appClassLoader, className, "main", + "([Ljava/lang/String;)V", ACC_STATIC, args); + }catch(...) { + } + + JavaObject* exc = JavaThread::get()->pendingException; + if (exc) { + JavaThread::clearException(); + JavaObject* obj = JavaThread::currentThread(); + JavaObject* group = + ClasspathThread::group->getVirtualObjectField(obj); + try{ + ClasspathThread::uncaughtException->invokeIntSpecial(this, group, obj, + exc); + }catch(...) { + printf("Even uncaught exception throwed an exception!\n"); + assert(0); + } + } +} + +void Jnjvm::executePremain(const char* className, JavaString* args, + JavaObject* instrumenter) { + JavaJIT::invokeOnceVoid(this, appClassLoader, className, "premain", + "(Ljava/lang/String;Ljava/lang/instrument/Instrumentation;)V", + ACC_STATIC, args, instrumenter); +} + +void Jnjvm::waitForExit() { + threadSystem->nonDaemonLock->lock(); + --(threadSystem->nonDaemonThreads); + + while (threadSystem->nonDaemonThreads) { + threadSystem->nonDaemonVar->wait(threadSystem->nonDaemonLock); + } + + threadSystem->nonDaemonLock->unlock(); + return; +} + +void Jnjvm::runMain(int argc, char** argv) { + ClArgumentsInfo info; + + info.readArgs(argc, argv, this); + if (info.className) { + int pos = info.appArgumentsPos; + //llvm::cl::ParseCommandLineOptions(pos, argv, + // " JnJVM Java Virtual Machine\n"); + argv = argv + pos - 1; + argc = argc - pos + 1; + + loadBootstrap(); +#ifdef SERVICE_VM + ServiceDomain::initialise((ServiceDomain*)this); +#endif + + if (info.agents.size()) { + assert(0 && "implement me"); + JavaObject* instrumenter = 0;//createInstrumenter(); + for (std::vector< std::pair >::iterator i = + info.agents.begin(), + e = info.agents.end(); i!= e; ++i) { + JavaString* args = asciizToStr(i->second); + executePremain(i->first, args, instrumenter); + } + } + + ArrayObject* args = ArrayObject::acons(argc - 2, JavaArray::ofString, + &allocator); + for (int i = 2; i < argc; ++i) { + args->elements[i - 2] = (JavaObject*)asciizToStr(argv[i]); + } + + executeClass(info.className, args); + waitForExit(); + } +} + +void Jnjvm::runIsolate(const char* className, ArrayObject* args) { + Jnjvm *isolate = allocateIsolate(); + isolate->loadBootstrap(); + isolate->executeClass(className, args); + isolate->waitForExit(); +} + +Jnjvm* Jnjvm::allocateIsolate() { + Jnjvm *isolate= gc_new(Jnjvm)(); + +#ifdef MULTIPLE_GC + isolate->GC = Collector::allocate(); +#endif + isolate->classpath = getenv("CLASSPATH"); + if (!(isolate->classpath)) { + isolate->classpath = "."; + } + + isolate->bootstrapThread = gc_new(JavaThread)(); + isolate->bootstrapThread->initialise(0, isolate); + void* baseSP = mvm::Thread::get()->baseSP; + isolate->bootstrapThread->threadID = (mvm::Thread::self() << 8) & 0x7FFFFF00; + +#ifdef MULTIPLE_GC + isolate->bootstrapThread->GC = isolate->GC; + isolate->GC->inject_my_thread(baseSP); +#endif + isolate->bootstrapThread->baseSP = baseSP; + JavaThread::threadKey->set(isolate->bootstrapThread); + + isolate->threadSystem = new ThreadSystem(); + isolate->name = "isolate"; + isolate->appClassLoader = 0; + isolate->jniEnv = &JNI_JNIEnvTable; + isolate->javavmEnv = &JNI_JavaVMTable; + + isolate->hashStr = new StringMap(); + isolate->globalRefsLock = mvm::Lock::allocNormal(); +#ifdef MULTIPLE_VM + isolate->statics = vm_new(isolate, StaticInstanceMap)(); + isolate->delegatees = vm_new(isolate, DelegateeMap)(); +#endif + + return isolate; } Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=54909&r1=54908&r2=54909&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Mon Aug 18 02:41:59 2008 @@ -24,6 +24,7 @@ namespace jnjvm { +class ArrayObject; class ArrayUInt8; class Attribut; class Class; @@ -33,6 +34,7 @@ class JavaMethod; class JavaObject; class JavaString; +class JavaThread; class JnjvmClassLoader; class JnjvmModule; class JnjvmModuleProvider; @@ -55,95 +57,133 @@ class AllocationMap; class ZipArchive; +/// ThreadSystem - Thread management of a JVM. Each JVM has one thread +/// management system to count the number of non-daemon threads it owns. +/// The initial thread of the JVM is a non-daemon thread. When there are +/// no more non-daemon threads, the JVM stops executing. +/// +class ThreadSystem { +public: + /// nonDaemonThreads - Number of threads in the system that are not daemon + /// threads. + // + uint16 nonDaemonThreads; + + /// nonDaemonLock - Protection lock for the nonDaemonThreads variable. + /// + mvm::Lock* nonDaemonLock; + + /// nonDaemonVar - Condition variable to wake up the initial thread when it + /// waits for other non-daemon threads to end. The non-daemon thread that + /// decrements the nonDaemonThreads variable to zero wakes up the initial + /// thread. + /// + mvm::Cond* nonDaemonVar; + + /// ThreadSystem - Allocates a thread system management, initializing the + /// lock, the condition variable and setting the initial number of non + /// daemon threads to one, for the initial thread. + /// + ThreadSystem() { + nonDaemonThreads = 1; + nonDaemonLock = mvm::Lock::allocNormal(); + nonDaemonVar = mvm::Cond::allocCond(); + } + + /// ~ThreadSystem - Destroys the thread system manager. Destroys the lock and + /// the condition variable. + /// + ~ThreadSystem() { + delete nonDaemonLock; + delete nonDaemonVar; + } + +}; + +/// Jnjvm - A JVM. Each execution of a program allocates a Jnjvm. +/// class Jnjvm : public mvm::VirtualMachine { +private: + + /// bootstrapThread - The initial thread of this JVM. + /// + JavaThread* bootstrapThread; + + /// error - Throws an exception in the execution of a JVM for the thread + /// that calls this functions. This is used internally by Jnjvm to control + /// which pair class/method are used. + /// + void error(Class* cl, JavaMethod* meth, const char* fmt, ...); + + /// errorWithExcp - Throws an exception whose cause is the Java object excp. + /// + void errorWithExcp(Class* cl, JavaMethod* meth, const JavaObject* excp); + + /// loadAppClassLoader - Loads the application class loader, so that VMKit + /// knowns which loader has to load the main class. + /// + JnjvmClassLoader* loadAppClassLoader(); + + /// mapInitialThread - Maps the initial native thread to a java/lang/Thread + /// object. + /// + void mapInitialThread(); + + /// loadBootstrap - Bootstraps the JVM, getting the class loader, initializing + /// bootstrap classes (e.g. java/lang/Class, java/lang/*Exception) and + /// mapping the initial thread. + /// + void loadBootstrap(); + + /// executeClass - Executes in the given JVM this main class with the given + /// Java args. + /// + void executeClass(const char* className, ArrayObject* args); + + /// executePremain - Executes the premain class for the java/lang/instrument + /// feature. + /// + void executePremain(const char* className, JavaString* args, + JavaObject* instrumenter); + + /// waitForExit - Waits that there are no more non-daemon threads in this JVM. + /// + void waitForExit(); + + /// runMain - Runs the application with the given command line. + /// + void runMain(int argc, char** argv); + + public: -#ifdef MULTIPLE_GC - Collector* GC; -#endif - JavaAllocator allocator; + + /// VT - The virtual table of this class. + /// static VirtualTable* VT; - - static const char* dirSeparator; - static const char* envSeparator; - static const unsigned int Magic; - // Misc constants - static const double MaxDouble; - static const double MinDouble; - static const double MaxLongDouble; - static const double MinLongDouble; - static const double MaxIntDouble; - static const double MinIntDouble; - static const uint64 MaxLong; - static const uint64 MinLong; - static const uint32 MaxInt; - static const uint32 MinInt; - static const float MaxFloat; - static const float MinFloat; - static const float MaxIntFloat; - static const float MinIntFloat; - static const float MaxLongFloat; - static const float MinLongFloat; - static const float NaNFloat; - static const double NaNDouble; - - // Exceptions name - static const char* ArithmeticException; - static const char* ClassNotFoundException; - static const char* InvocationTargetException; - static const char* ArrayStoreException; - static const char* ClassCastException; - static const char* IllegalMonitorStateException; - static const char* IllegalArgumentException; - static const char* InterruptedException; - static const char* IndexOutOfBoundsException; - static const char* ArrayIndexOutOfBoundsException; - static const char* NegativeArraySizeException; - static const char* NullPointerException; - static const char* SecurityException; - static const char* ClassFormatError; - static const char* ClassCircularityError; - static const char* NoClassDefFoundError; - static const char* UnsupportedClassVersionError; - static const char* NoSuchFieldError; - static const char* NoSuchMethodError; - static const char* InstantiationError; - static const char* IllegalAccessError; - static const char* IllegalAccessException; - static const char* VerifyError; - static const char* ExceptionInInitializerError; - static const char* LinkageError; - static const char* AbstractMethodError; - static const char* UnsatisfiedLinkError; - static const char* InternalError; - static const char* OutOfMemoryError; - static const char* StackOverflowError; - static const char* UnknownError; + /// print - Prints the JVM for debugging purposes. + /// + virtual void print(mvm::PrintBuffer* buf) const; + /// tracer - Traces instances of this class. + /// + virtual void TRACER; - // Exceptions - void arrayStoreException(); - void indexOutOfBounds(const JavaObject* obj, sint32 entry); - void negativeArraySizeException(int size); - void nullPointerException(const char* fmt, ...); - void illegalAccessException(const char* msg); - void illegalMonitorStateException(const JavaObject* obj); - void interruptedException(const JavaObject* obj); - void initializerError(const JavaObject* excp); - void invocationTargetException(const JavaObject* obj); - void outOfMemoryError(sint32 n); - void illegalArgumentExceptionForMethod(JavaMethod* meth, CommonClass* required, - CommonClass* given); - void illegalArgumentExceptionForField(JavaField* field, CommonClass* required, - CommonClass* given); - void illegalArgumentException(const char* msg); - void classCastException(const char* msg); - void unknownError(const char* fmt, ...); - void error(const char* className, const char* fmt, ...); - void verror(const char* className, const char* fmt, va_list ap); - void errorWithExcp(const char* className, const JavaObject* excp); + /// dirSeparator - Directory separator for file paths, e.g. '\' for windows, + /// '/' for Unix. + /// + static const char* dirSeparator; + + /// envSeparator - Paths separator for environment variables, e.g. ':'. + /// + static const char* envSeparator; + /// Magic - The magic number at the beginning of each .class file. 0xcafebabe. + /// + static const unsigned int Magic; + /// Lists of UTF8s used internaly in VMKit. + static const UTF8* NoClassDefFoundError; static const UTF8* initName; static const UTF8* clinitName; static const UTF8* clinitType; @@ -176,49 +216,151 @@ static const UTF8* tanh; static const UTF8* finalize; - - void initialiseClass(CommonClass* cl); - - JavaString* asciizToStr(const char* asciiz); - JavaString* UTF8ToStr(const UTF8* utf8); - +#ifdef MULTIPLE_GC + /// GC - The garbage collector of this JVM. + /// + Collector* GC; +#endif - JavaObject* getClassDelegatee(CommonClass*); + /// threadSystem - The thread system to manage non-daemon threads and + /// control the end of the JVM's execution. + /// + ThreadSystem* threadSystem; - virtual void TRACER; - virtual void print(mvm::PrintBuffer* buf) const { - buf->write("Jnjvm<>"); - } + /// allocator - Memory allocator of this JVM. + /// + JavaAllocator allocator; - ~Jnjvm(); - Jnjvm(); - - void addProperty(char* key, char* value); - + /// jniEnv - The JNI environment of this JVM. + /// void* jniEnv; + + /// javavmEnv - The Java VM environment of this JVM. + /// const void* javavmEnv; + + /// postProperties - Properties set at runtime and in command line. + /// std::vector< std::pair > postProperties; + + /// nativeLibs - Native libraries (e.g. '.so') loaded by this JVM. + /// std::vector nativeLibs; - const char* classpath; + /// classpath - The CLASSPATH value, or the paths given in command line. + /// + const char* classpath; + /// globalRefs - Global references that JNI wants to protect. + /// std::vector > globalRefs; - mvm::Lock* globalRefsLock; - - void setClasspath(char* cp) { - classpath = cp; - } + /// globalRefsLock - Lock for adding a new global reference. + /// + mvm::Lock* globalRefsLock; + + /// name - The name of this JVM. + /// const char* name; + + /// appClassLoader - The bootstrap class loader. + /// JnjvmClassLoader* appClassLoader; + + /// hashStr - Hash map of java/lang/String objects allocated by this JVM. + /// StringMap * hashStr; + #ifdef MULTIPLE_VM + /// statics - The static instances of classes, in a multi-vm environment. + /// StaticInstanceMap* statics; + + /// delegatees - The java/lang/Class equivalents of internal classes. This is + /// also in a multi-vm environment. + /// DelegateeMap* delegatees; #endif + + + /// Exceptions - These are the only exceptions VMKit will make. + /// + void arrayStoreException(); + void indexOutOfBounds(const JavaObject* obj, sint32 entry); + void negativeArraySizeException(int size); + void nullPointerException(const char* fmt, ...); + void illegalAccessException(const char* msg); + void illegalMonitorStateException(const JavaObject* obj); + void interruptedException(const JavaObject* obj); + void initializerError(const JavaObject* excp); + void invocationTargetException(const JavaObject* obj); + void outOfMemoryError(sint32 n); + void illegalArgumentExceptionForMethod(JavaMethod* meth, CommonClass* required, + CommonClass* given); + void illegalArgumentExceptionForField(JavaField* field, CommonClass* required, + CommonClass* given); + void illegalArgumentException(const char* msg); + void classCastException(const char* msg); + void unknownError(const char* fmt, ...); + void noSuchFieldError(CommonClass* cl, const UTF8* name); + void noSuchMethodError(CommonClass* cl, const UTF8* name); + void classFormatError(const char* fmt, ...); + void noClassDefFoundError(JavaObject* obj); + void noClassDefFoundError(const char* fmt, ...); + void classNotFoundException(JavaString* str); + + + /// initialiseClass - Initialise the class for this JVM, and call the + /// "" function. + /// + void initialiseClass(CommonClass* cl); + + /// asciizToStr - Constructs a java/lang/String object from the given asciiz. + /// + JavaString* asciizToStr(const char* asciiz); + + /// UTF8ToStr - Constructs a java/lang/String object from the given UTF8. + /// + JavaString* UTF8ToStr(const UTF8* utf8); + + /// getClassDelegatee - Get the java/lang/Class object representing the + /// internal class. + /// + JavaObject* getClassDelegatee(CommonClass*); + + /// ~Jnjvm - Destroy the JVM. + /// + ~Jnjvm(); + + /// Jnjvm - Allocate a default JVM, for VT initialization. + /// + Jnjvm(); + /// addProperty - Adds a new property in the postProperties map. + /// + void addProperty(char* key, char* value); + + /// setClasspath - Sets the application classpath for the JVM. + /// + void setClasspath(char* cp) { + classpath = cp; + } + + /// allocateIsolate - Allocates a new JVM. + /// + static Jnjvm* allocateIsolate(); + + /// runIsolate - Runs an isolate with the given main class and with + /// these Java args. This should be called internaly by the javax.isolate + /// package. + /// + static void runIsolate(const char* className, ArrayObject* args); + /// runApplication - Runs the application with the given command line. + /// User-visible function, inherited by the VirtualMachine class. + /// virtual void runApplication(int argc, char** argv); + }; } // end namespace jnjvm Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=54909&r1=54908&r2=54909&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Mon Aug 18 02:41:59 2008 @@ -29,7 +29,7 @@ extern const char* GNUClasspathGlibj; extern const char* GNUClasspathLibs; -JnjvmBootstrapLoader* JnjvmClassLoader::createBootstrapLoader() { +JnjvmBootstrapLoader* JnjvmBootstrapLoader::createBootstrapLoader() { JnjvmBootstrapLoader* JCL = gc_new(JnjvmBootstrapLoader)(); JCL->TheModule = new JnjvmModule("Bootstrap JnJVM"); @@ -163,7 +163,7 @@ Reader reader(cl->bytes); uint32 magic = reader.readU4(); if (magic != Jnjvm::Magic) { - JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, "bad magic number %p", magic); + JavaThread::get()->isolate->classFormatError("bad magic number %p", magic); } cl->minor = reader.readU2(); cl->major = reader.readU2(); @@ -175,7 +175,7 @@ ctpInfo->resolveClassName(reader.readU2()); if (!(thisClassName->equals(cl->name))) { - JavaThread::get()->isolate->error(Jnjvm::ClassFormatError, "try to load %s and found class named %s", + JavaThread::get()->isolate->classFormatError("try to load %s and found class named %s", cl->printString(), thisClassName->printString()); } @@ -298,11 +298,10 @@ CommonClass* cl = internalLoad(name); if (!cl && doThrow) { - if (!memcmp(name->UTF8ToAsciiz(), Jnjvm::NoClassDefFoundError, - strlen(Jnjvm::NoClassDefFoundError))) { + if (!(name->equals(Jnjvm::NoClassDefFoundError))) { JavaThread::get()->isolate->unknownError("Unable to load NoClassDefFoundError"); } - JavaThread::get()->isolate->error(Jnjvm::NoClassDefFoundError, "unable to load %s", name->printString()); + JavaThread::get()->isolate->noClassDefFoundError("unable to load %s", name->printString()); } if (cl && doResolve) cl->resolveClass(doClinit); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=54909&r1=54908&r2=54909&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Mon Aug 18 02:41:59 2008 @@ -15,6 +15,8 @@ #include "types.h" +#include "mvm/Object.h" + namespace jnjvm { class ArrayUInt8; @@ -39,76 +41,193 @@ class UTF8Map; class ZipArchive; +/// JnjvmClassLoader - Runtime representation of a class loader. It contains +/// its own tables (signatures, UTF8, types) which are mapped to a single +/// table for non-isolate environments. +/// class JnjvmClassLoader : public mvm::Object { private: + + + /// isolate - Which isolate defined me? Null for the bootstrap class loader. + /// + Jnjvm* isolate; + + /// javaLoder - The Java representation of the class loader. Null for the + /// bootstrap class loader. + /// + JavaObject* javaLoader; + + /// internalLoad - Load the class with the given name. + /// virtual CommonClass* internalLoad(const UTF8* utf8); + + /// readParents - Reads the parents, i.e. super and interfaces, of the class. + /// + void readParents(Class* cl, Reader& reader); + + /// loadParents - Loads and resolves the parents, i.e. super and interfarces, + /// of the class. + /// + void loadParents(Class* cl); + + /// readAttributs - Reads the attributs of the class. + /// + void readAttributs(Class* cl, Reader& reader, std::vector & attr); + + /// readFields - Reads the fields of the class. + /// + void readFields(Class* cl, Reader& reader); + + /// readMethods - Reads the methods of the class. + /// + void readMethods(Class* cl, Reader& reader); + + /// readClass - Reads the class. + /// + void readClass(Class* cl); + + /// JnjvmClassLoader - Allocate a user-defined class loader. Called on + /// first use of a Java class loader. + /// + JnjvmClassLoader(JnjvmClassLoader& JCL, JavaObject* loader, Jnjvm* isolate); + +protected: + + /// classes - The classes this class loader has loaded. + /// + ClassMap* classes; + + /// javaTypes - Tables of Typedef defined by this class loader. Shared by all + /// class loaders in a no isolation configuration. + /// + TypeMap* javaTypes; + + /// javaSignatures - Tables of Signdef defined by this class loader. Shared + /// by all class loaders in a no isolation configuration. + /// + SignMap* javaSignatures; public: - + + /// VT - The virtual table of this class. + /// static VirtualTable* VT; + /// allocator - Reference to the memory allocator, which will allocate UTF8s, + /// signatures and types. + /// + JavaAllocator* allocator; + + + /// hashUTF8 - Tables of UTF8s defined by this class loader. Shared + /// by all class loaders in a no isolation configuration. + /// + UTF8Map * hashUTF8; + + /// TheModule - JIT module for compiling methods. + /// + JnjvmModule* TheModule; + + /// TheModuleProvider - JIT module provider for dynamic class loading and + /// lazy compilation. + /// + JnjvmModuleProvider* TheModuleProvider; + + /// tracer - Traces a JnjvmClassLoader for GC. + /// virtual void TRACER; + + /// print - String representation of the loader for debugging purposes. + /// virtual void print(mvm::PrintBuffer* buf) const { buf->write("Java class loader<>"); } - Jnjvm* isolate; - JavaObject* javaLoader; - + /// getJnjvmLoaderFromJavaObject - Return the Jnjvm runtime representation + /// of the given class loader. + /// + static JnjvmClassLoader* getJnjvmLoaderFromJavaObject(JavaObject*); + + /// getJavaClassLoader - Return the Java representation of this class loader. + /// JavaObject* getJavaClassLoader() { return javaLoader; } - static JnjvmClassLoader* getJnjvmLoaderFromJavaObject(JavaObject*); - - ClassMap* classes; - - JavaAllocator* allocator; - JnjvmModule* TheModule; - JnjvmModuleProvider* TheModuleProvider; - - // Loads a Class - virtual CommonClass* loadName(const UTF8* name, bool doResolve, - bool doClinit, bool doThrow); + /// loadName - Loads the class of the given name. + /// + CommonClass* loadName(const UTF8* name, bool doResolve, bool doClinit, + bool doThrow); - // Class lookup + /// lookupClassFromUTF8 - Lookup a class from an UTF8 name and load it. + /// CommonClass* lookupClassFromUTF8(const UTF8* utf8, unsigned int start, unsigned int len, bool doResolve, bool doClinit, bool doThrow); + + /// lookupClassFromJavaString - Lookup a class from a Java String and load it. + /// CommonClass* lookupClassFromJavaString(JavaString* str, bool doResolve, bool doClinit, bool doThrow); - - void readParents(Class* cl, Reader& reader); - void loadParents(Class* cl); - void readAttributs(Class* cl, Reader& reader, std::vector & attr); - void readFields(Class* cl, Reader& reader); - void readMethods(Class* cl, Reader& reader); - void readClass(Class* cl); - void initialiseClass(CommonClass* cl); + + /// resolveClass - Resolves the class. + /// void resolveClass(CommonClass* cl, bool doClinit); + /// lookupClass - Finds the class of th given name in the class loader's + /// table. + /// CommonClass* lookupClass(const UTF8* utf8); + /// constructArray - Hashes a runtime representation of a class with + /// the given name. + /// ClassArray* constructArray(const UTF8* name); + + /// constructClass - Hashes a runtime representation of a class with + /// the given name. + /// Class* constructClass(const UTF8* name); + /// constructType - Hashes a Typedef, an internal representation of a class + /// still not loaded. + /// + Typedef* constructType(const UTF8 * name); + /// constructSign - Hashes a Signdef, a method signature. + /// + Signdef* constructSign(const UTF8 * name); + + /// asciizConstructUTF8 - Hashes an UTF8 created from the given asciiz. + /// + const UTF8* asciizConstructUTF8(const char* asciiz); - TypeMap* javaTypes; - SignMap* javaSignatures; - UTF8Map * hashUTF8; + /// readerConstructUTF8 - Hashes an UTF8 created from the given Unicode + /// buffer. + /// + const UTF8* readerConstructUTF8(const uint16* buf, uint32 size); + /// bootstrapLoader - The bootstrap loader of the JVM. Loads the base + /// classes. + /// static JnjvmBootstrapLoader* bootstrapLoader; - + #ifdef MULTIPLE_VM + /// SharedLoader - Shared loader when multiple vms are executing. + /// static JnjvmClassLoader* SharedLoader; #endif - Typedef* constructType(const UTF8 * name); - Signdef* constructSign(const UTF8 * name); - + /// ~JnjvmClassLoader - Destroy the loader. Depending on the JVM + /// configuration, this may destroy the tables, JIT module and + /// module provider. + /// ~JnjvmClassLoader(); + + /// JnjvmClassLoader - Default constructor, zeroes the field. + /// JnjvmClassLoader() { hashUTF8 = 0; javaTypes = 0; @@ -118,39 +237,66 @@ isolate = 0; } - JnjvmClassLoader(JnjvmClassLoader& JCL, JavaObject* loader, Jnjvm* isolate); - static JnjvmBootstrapLoader* createBootstrapLoader(); - - - const UTF8* asciizConstructUTF8(const char* asciiz); - - const UTF8* readerConstructUTF8(const uint16* buf, uint32 size); - - }; +/// JnjvmBootstrapLoader - This class is for the bootstrap class loader, which +/// loads base classes, ie glibj.zip or rt.jar and -Xbootclasspath. +/// class JnjvmBootstrapLoader : public JnjvmClassLoader { private: + /// internalLoad - Load the class with the given name. + /// virtual CommonClass* internalLoad(const UTF8* utf8); + + /// bootClasspath - List of paths for the base classes. + /// + std::vector bootClasspath; + + /// bootArchives - List of .zip or .jar files that contain base classes. + /// + std::vector bootArchives; + + /// openName - Opens a file of the given name and returns it as an array + /// of byte. + /// + ArrayUInt8* openName(const UTF8* utf8); public: + /// VT - The virtual table of this class. + /// static VirtualTable* VT; + /// tracer - Traces instances of this class. + /// virtual void TRACER; + + /// print - String representation of the loader, for debugging purposes. + /// virtual void print(mvm::PrintBuffer* buf) const { buf->write("Jnjvm bootstrap loader<>"); } - void analyseClasspathEnv(const char*); - + /// libClasspathEnv - The paths for dynamic libraries of Classpath, separated + /// by ':'. + /// const char* libClasspathEnv; + + /// bootClasspathEnv - The path for base classes, seperated by '.'. + /// const char* bootClasspathEnv; - std::vector bootClasspath; - std::vector bootArchives; + + /// analyseClasspathEnv - Analyse the paths for base classes. + /// + void analyseClasspathEnv(const char*); + + /// createBootstrapLoader - Creates the bootstrap loader, first thing + /// to do before any execution of a JVM. + /// + static JnjvmBootstrapLoader* createBootstrapLoader(); + - ArrayUInt8* openName(const UTF8* utf8); }; } // end namespace jnjvm Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=54909&r1=54908&r2=54909&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Mon Aug 18 02:41:59 2008 @@ -12,7 +12,6 @@ #include "JavaArray.h" #include "JavaCache.h" #include "JavaClass.h" -#include "JavaIsolate.h" #include "JavaObject.h" #include "JavaThread.h" #include "Jnjvm.h" @@ -36,7 +35,6 @@ INIT(Jnjvm); INIT(ClassMap); INIT(StaticInstanceMap); - INIT(JavaIsolate); INIT(DelegateeMap); INIT(JnjvmBootstrapLoader); INIT(JnjvmClassLoader); @@ -106,13 +104,8 @@ statics->MARK_AND_TRACE; delegatees->MARK_AND_TRACE; #endif - -} - -void JavaIsolate::TRACER { - Jnjvm::PARENT_TRACER; bootstrapThread->MARK_AND_TRACE; - JnjvmClassLoader::bootstrapLoader->MARK_AND_TRACE; + JnjvmClassLoader::bootstrapLoader->MARK_AND_TRACE; } void ClassMap::TRACER { From nicolas.geoffray at lip6.fr Mon Aug 18 01:22:05 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 18 Aug 2008 08:22:05 -0000 Subject: [vmkit-commits] [vmkit] r54912 - in /vmkit/trunk/lib/JnJVM/VMCore: Jnjvm.cpp Jnjvm.h Message-ID: <200808180822.m7I8M6Sl016246@zion.cs.uiuc.edu> Author: geoffray Date: Mon Aug 18 03:22:05 2008 New Revision: 54912 URL: http://llvm.org/viewvc/llvm-project?rev=54912&view=rev Log: Make the nativeLibs static in a non mulit-vm environment, so that the vmkit command line tool does not complain of not finding a native function. Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=54912&r1=54911&r2=54912&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Mon Aug 18 03:22:05 2008 @@ -80,6 +80,11 @@ const char* Jnjvm::envSeparator = ":"; const unsigned int Jnjvm::Magic = 0xcafebabe; +#ifndef MULTIPLE_VM +/// If we're not in a multi-vm environment, this can be made static. +std::vector Jnjvm::nativeLibs; +#endif + typedef void (*clinit_t)(Jnjvm* vm); void Jnjvm::initialiseClass(CommonClass* cl) { Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=54912&r1=54911&r2=54912&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Mon Aug 18 03:22:05 2008 @@ -245,6 +245,9 @@ /// nativeLibs - Native libraries (e.g. '.so') loaded by this JVM. /// +#ifndef MULTIPLE_VM + static +#endif std::vector nativeLibs; /// classpath - The CLASSPATH value, or the paths given in command line. From nicolas.geoffray at lip6.fr Mon Aug 18 03:54:04 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 18 Aug 2008 10:54:04 -0000 Subject: [vmkit-commits] [vmkit] r54915 - /vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Message-ID: <200808181054.m7IAs4pl021700@zion.cs.uiuc.edu> Author: geoffray Date: Mon Aug 18 05:54:02 2008 New Revision: 54915 URL: http://llvm.org/viewvc/llvm-project?rev=54915&view=rev Log: Add a comment. Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll?rev=54915&r1=54914&r2=54915&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original) +++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Mon Aug 18 05:54:02 2008 @@ -89,7 +89,9 @@ ;;; forceInitialisationCheck - Force to check initialization. The difference ;;; between this function and the initialisationCheck function is that the -;;; latter is readnone and can thus be removed. +;;; latter is readnone and can thus be removed. This function is removed +;;; by Jnjvm after the GVN pass, therefore it does not have an actual +;;; implementation. declare void @forceInitialisationCheck(%JavaClass*) ;;; vtableLookup - Look up the offset in a virtual table of a specific From nicolas.geoffray at lip6.fr Mon Aug 18 03:55:46 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 18 Aug 2008 10:55:46 -0000 Subject: [vmkit-commits] [vmkit] r54916 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathVMClassLoader.cpp.inc VMCore/JavaClass.cpp VMCore/JavaJIT.cpp VMCore/Jnjvm.cpp VMCore/JnjvmModule.cpp VMCore/JnjvmModuleProvider.cpp VMCore/LowerConstantCalls.cpp Message-ID: <200808181055.m7IAtkDe021773@zion.cs.uiuc.edu> Author: geoffray Date: Mon Aug 18 05:55:46 2008 New Revision: 54916 URL: http://llvm.org/viewvc/llvm-project?rev=54916&view=rev Log: Compilation and bugfixes for a multi-vm environment. Removing the ForceInitializationCheck function call in LLVM IR is done by a separate pass and should be the last pass to run on the IR. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc?rev=54916&r1=54915&r2=54916&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc Mon Aug 18 05:55:46 2008 @@ -102,7 +102,7 @@ #ifndef MULTIPLE_VM cl->delegatee = (JavaObject*)pd; #else - vm->delegatees->hash(cl, (JavaObject*)pd); + JavaThread::get()->isolate->delegatees->hash(cl, (JavaObject*)pd); #endif } cl->release(); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=54916&r1=54915&r2=54916&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Mon Aug 18 05:55:46 2008 @@ -545,9 +545,10 @@ } void Class::createStaticInstance() { + JavaAllocator* allocator = &(JavaThread::get()->isolate->allocator); JavaObject* val = - (JavaObject*)JavaThread::get()->isolate->allocateObject(staticSize, - staticVT); + (JavaObject*)allocator->allocateObject(staticSize, staticVT); + val->initialise(this); for (field_iterator i = this->staticFields.begin(), e = this->staticFields.end(); i!= e; ++i) { Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=54916&r1=54915&r2=54916&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Mon Aug 18 05:55:46 2008 @@ -1559,14 +1559,17 @@ uint32 clIndex = ctpInfo->getClassIndexFromMethod(index); Class* mycl = (Class*)(ctpInfo->getMethodClassIfLoaded(clIndex)); - if (mycl && mycl->status >= resolved) { + Value* arg = 0; + if (mycl && mycl->isResolved()) { LLVMCommonClassInfo* LCI = module->getClassInfo(mycl); - Value* arg = LCI->getVar(this); + arg = LCI->getVar(this); arg = invoke(JnjvmModule::InitialisationCheckFunction, arg, "", currentBlock); - CallInst::Create(JnjvmModule::ForceInitialisationCheckFunction, arg, "", - currentBlock); + } else { + arg = getResolvedClass(clIndex, true); } + CallInst::Create(JnjvmModule::ForceInitialisationCheckFunction, arg, "", + currentBlock); #endif Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=54916&r1=54915&r2=54916&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Mon Aug 18 05:55:46 2008 @@ -674,6 +674,7 @@ LOAD_CLASS(Classpath::newMethod); LOAD_CLASS(Classpath::newField); LOAD_CLASS(Classpath::newStackTraceElement); + LOAD_CLASS(Classpath::newVMThrowable); LOAD_CLASS(ClasspathException::InvocationTargetException); LOAD_CLASS(ClasspathException::ArrayStoreException); LOAD_CLASS(ClasspathException::ClassCastException); @@ -815,7 +816,7 @@ isolate->classpath = "."; } - isolate->bootstrapThread = gc_new(JavaThread)(); + isolate->bootstrapThread = allocator_new(&isolate->allocator, JavaThread)(); isolate->bootstrapThread->initialise(0, isolate); void* baseSP = mvm::Thread::get()->baseSP; isolate->bootstrapThread->threadID = (mvm::Thread::self() << 8) & 0x7FFFFF00; @@ -836,8 +837,8 @@ isolate->hashStr = new StringMap(); isolate->globalRefsLock = mvm::Lock::allocNormal(); #ifdef MULTIPLE_VM - isolate->statics = vm_new(isolate, StaticInstanceMap)(); - isolate->delegatees = vm_new(isolate, DelegateeMap)(); + isolate->statics = allocator_new(&isolate->allocator, StaticInstanceMap)(); + isolate->delegatees = allocator_new(&isolate->allocator, DelegateeMap)(); #endif return isolate; Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=54916&r1=54915&r2=54916&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Aug 18 05:55:46 2008 @@ -131,10 +131,10 @@ Value* LLVMCommonClassInfo::getVar(JavaJIT* jit) { if (!varGV) { #ifdef MULTIPLE_VM - if (jit->compilingClass->isolate->TheModule == Jnjvm::bootstrapVM->TheModule && - classDef->isArray && classDef->isolate != Jnjvm::bootstrapVM) { + if (jit->compilingClass->classLoader->TheModule == JnjvmClassLoader::bootstrapLoader->TheModule && + classDef->isArray && classDef->classLoader != JnjvmClassLoader::bootstrapLoader) { // We know the array class can belong to bootstrap - CommonClass* cl = Jnjvm::bootstrapVM->constructArray(classDef->name, 0); + CommonClass* cl = JnjvmClassLoader::bootstrapLoader->constructArray(classDef->name); return cl->classLoader->TheModule->getClassInfo(cl)->getVar(jit); } #endif Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=54916&r1=54915&r2=54916&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Mon Aug 18 05:55:46 2008 @@ -181,6 +181,7 @@ namespace mvm { llvm::FunctionPass* createEscapeAnalysisPass(llvm::Function*); llvm::FunctionPass* createLowerConstantCallsPass(); + llvm::FunctionPass* createLowerForcedCallsPass(); } static void addPass(FunctionPassManager *PM, Pass *P) { @@ -228,8 +229,6 @@ addPass(PM, mvm::createEscapeAnalysisPass(JnjvmModule::JavaObjectAllocateFunction)); addPass(PM, mvm::createLowerConstantCallsPass()); - addPass(PM, createGVNPass()); // Remove redundancies - // Run instcombine after redundancy elimination to exploit opportunities // opened up by them. addPass(PM, createInstructionCombiningPass()); @@ -239,6 +238,8 @@ addPass(PM, createAggressiveDCEPass()); // Delete dead instructions addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs + addPass(PM, mvm::createLowerForcedCallsPass()); + } JnjvmModuleProvider::JnjvmModuleProvider(JnjvmModule *m) { Modified: vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=54916&r1=54915&r2=54916&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Mon Aug 18 05:55:46 2008 @@ -102,9 +102,6 @@ Value* Size = new LoadInst(SizePtr, "", CI); CI->replaceAllUsesWith(Size); CI->eraseFromParent(); - } else if (V == jnjvm::JnjvmModule::ForceInitialisationCheckFunction) { - Changed = true; - CI->eraseFromParent(); } else if (V == jnjvm::JnjvmModule::GetDepthFunction) { Changed = true; Value* val = CI->getOperand(1); @@ -253,4 +250,40 @@ FunctionPass* createLowerConstantCallsPass() { return new LowerConstantCalls(); } + +class VISIBILITY_HIDDEN LowerForcedCalls : public FunctionPass { + public: + static char ID; + LowerForcedCalls() : FunctionPass((intptr_t)&ID) { } + + virtual bool runOnFunction(Function &F); + private: + }; + char LowerForcedCalls::ID = 0; + static RegisterPass Y("LowerForcedCalls", + "Lower Forced calls"); + +bool LowerForcedCalls::runOnFunction(Function& F) { + bool Changed = false; + for (Function::iterator BI = F.begin(), BE = F.end(); BI != BE; BI++) { + BasicBlock *Cur = BI; + for (BasicBlock::iterator II = Cur->begin(), IE = Cur->end(); II != IE;) { + Instruction *I = II; + II++; + if (CallInst *CI = dyn_cast(I)) { + Value* V = CI->getOperand(0); + if (V == jnjvm::JnjvmModule::ForceInitialisationCheckFunction) { + Changed = true; + CI->eraseFromParent(); + } + } + } + } + return Changed; +} + +FunctionPass* createLowerForcedCallsPass() { + return new LowerForcedCalls(); +} + } From nicolas.geoffray at lip6.fr Mon Aug 18 04:40:52 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 18 Aug 2008 11:40:52 -0000 Subject: [vmkit-commits] [vmkit] r54917 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200808181140.m7IBercx022976@zion.cs.uiuc.edu> Author: geoffray Date: Mon Aug 18 06:40:51 2008 New Revision: 54917 URL: http://llvm.org/viewvc/llvm-project?rev=54917&view=rev Log: Arrays of bootstrap classes are loaded by the bootstrap loader. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=54917&r1=54916&r2=54917&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Aug 18 06:40:51 2008 @@ -130,14 +130,6 @@ Value* LLVMCommonClassInfo::getVar(JavaJIT* jit) { if (!varGV) { -#ifdef MULTIPLE_VM - if (jit->compilingClass->classLoader->TheModule == JnjvmClassLoader::bootstrapLoader->TheModule && - classDef->isArray && classDef->classLoader != JnjvmClassLoader::bootstrapLoader) { - // We know the array class can belong to bootstrap - CommonClass* cl = JnjvmClassLoader::bootstrapLoader->constructArray(classDef->name); - return cl->classLoader->TheModule->getClassInfo(cl)->getVar(jit); - } -#endif Constant* cons = ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, From nicolas.geoffray at lip6.fr Mon Aug 18 05:29:24 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 18 Aug 2008 12:29:24 -0000 Subject: [vmkit-commits] [vmkit] r54918 - /vmkit/trunk/lib/N3/README.txt Message-ID: <200808181229.m7ICTP7W024409@zion.cs.uiuc.edu> Author: geoffray Date: Mon Aug 18 07:29:21 2008 New Revision: 54918 URL: http://llvm.org/viewvc/llvm-project?rev=54918&view=rev Log: Remove old infos. Removed: vmkit/trunk/lib/N3/README.txt Removed: vmkit/trunk/lib/N3/README.txt URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/README.txt?rev=54917&view=auto ============================================================================== --- vmkit/trunk/lib/N3/README.txt (original) +++ vmkit/trunk/lib/N3/README.txt (removed) @@ -1,12 +0,0 @@ -1 - Install pnetlib-0.8.0 - -2 - Download pnet 0.8.0 - tar zxvf pnet-0.8.0.tar.gz - ./configure - make - -3 - Compile n3 - -4 - Run - export MSCORLIB={directory of pnetlib's mscorlib.dll} - n3 HelloWorld.exe From nicolas.geoffray at lip6.fr Mon Aug 18 05:36:17 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 18 Aug 2008 12:36:17 -0000 Subject: [vmkit-commits] [vmkit] r54919 - in /vmkit/trunk/lib/N3/VMCore: VMArray.cpp VMArray.h Message-ID: <200808181236.m7ICaISA024617@zion.cs.uiuc.edu> Author: geoffray Date: Mon Aug 18 07:36:17 2008 New Revision: 54919 URL: http://llvm.org/viewvc/llvm-project?rev=54919&view=rev Log: Avoid a warning. Modified: vmkit/trunk/lib/N3/VMCore/VMArray.cpp vmkit/trunk/lib/N3/VMCore/VMArray.h Modified: vmkit/trunk/lib/N3/VMCore/VMArray.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMArray.cpp?rev=54919&r1=54918&r2=54919&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMArray.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/VMArray.cpp Mon Aug 18 07:36:17 2008 @@ -201,7 +201,7 @@ return readerConstruct(vm, buf, len); } -const UTF8* UTF8::asciizConstruct(VirtualMachine* vm, char* asciiz) { +const UTF8* UTF8::asciizConstruct(VirtualMachine* vm, const char* asciiz) { return vm->asciizConstructUTF8(asciiz); } Modified: vmkit/trunk/lib/N3/VMCore/VMArray.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMArray.h?rev=54919&r1=54918&r2=54919&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMArray.h (original) +++ vmkit/trunk/lib/N3/VMCore/VMArray.h Mon Aug 18 07:36:17 2008 @@ -100,7 +100,7 @@ virtual void print(mvm::PrintBuffer* buf) const; char* UTF8ToAsciiz() const; - static const UTF8* asciizConstruct(VirtualMachine *vm, char* asciiz); + static const UTF8* asciizConstruct(VirtualMachine *vm, const char* asciiz); static const UTF8* readerConstruct(VirtualMachine *vm, uint16* buf, uint32 n); const UTF8* extract(VirtualMachine *vm, uint32 start, uint32 len) const; From tilmann.scheller at googlemail.com Mon Aug 18 15:22:16 2008 From: tilmann.scheller at googlemail.com (Tilmann Scheller) Date: Mon, 18 Aug 2008 22:22:16 -0000 Subject: [vmkit-commits] [vmkit] r54951 - in /vmkit/trunk/lib/N3: PNetLib/PNetLib.cpp PNetLib/PNetMSCorlib.cpp VMCore/Assembly.cpp VMCore/Assembly.h VMCore/CLIJit.cpp VMCore/CLIJit.h VMCore/CLIJitMeta.cpp VMCore/CLISignature.cpp VMCore/N3.cpp VMCore/N3ModuleProvider.cpp VMCore/NativeUtil.cpp VMCore/Opcodes.cpp VMCore/VMArray.cpp VMCore/VMArray.h VMCore/VMCache.cpp VMCore/VMClass.cpp VMCore/VMClass.h VMCore/VMThread.cpp VMCore/VMThread.h Message-ID: <200808182222.m7IMMGPM010536@zion.cs.uiuc.edu> Author: tilmann Date: Mon Aug 18 17:22:15 2008 New Revision: 54951 URL: http://llvm.org/viewvc/llvm-project?rev=54951&view=rev Log: remove global variables for current generic class and method, pass them around by parameters instead various fixes pointed out by Nicolas Geoffray Modified: vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp vmkit/trunk/lib/N3/VMCore/Assembly.cpp vmkit/trunk/lib/N3/VMCore/Assembly.h vmkit/trunk/lib/N3/VMCore/CLIJit.cpp vmkit/trunk/lib/N3/VMCore/CLIJit.h vmkit/trunk/lib/N3/VMCore/CLIJitMeta.cpp vmkit/trunk/lib/N3/VMCore/CLISignature.cpp vmkit/trunk/lib/N3/VMCore/N3.cpp vmkit/trunk/lib/N3/VMCore/N3ModuleProvider.cpp vmkit/trunk/lib/N3/VMCore/NativeUtil.cpp vmkit/trunk/lib/N3/VMCore/Opcodes.cpp vmkit/trunk/lib/N3/VMCore/VMArray.cpp vmkit/trunk/lib/N3/VMCore/VMArray.h vmkit/trunk/lib/N3/VMCore/VMCache.cpp vmkit/trunk/lib/N3/VMCore/VMClass.cpp vmkit/trunk/lib/N3/VMCore/VMClass.h vmkit/trunk/lib/N3/VMCore/VMThread.cpp vmkit/trunk/lib/N3/VMCore/VMThread.h Modified: vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp (original) +++ vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp Mon Aug 18 17:22:15 2008 @@ -712,11 +712,11 @@ extern "C" VMObject* System_Reflection_ClrMethod_Invoke(VMObject* Method, VMObject* obj, sint32 invokeAttr, VMObject* binder, ArrayObject* args, VMObject* culture) { VMMethod* meth = (VMMethod*)(*MSCorlib::methodMethodType)(Method).PointerVal; - meth->getSignature(); - meth->compiledPtr(); + meth->getSignature(NULL); + meth->compiledPtr(NULL); llvm::Function* func = CLIJit::compile(meth->classDef, meth); VMClass* type = meth->classDef; - type->resolveStatic(true); + type->resolveStatic(true, NULL); uint32 virt = meth->virt; if ((obj != 0) && virt) { Modified: vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp (original) +++ vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp Mon Aug 18 17:22:15 2008 @@ -25,9 +25,9 @@ vm->asciizConstructUTF8("System"), false, false, false, true); MSCorlib::pString = type; - MSCorlib::pObject->resolveType(true, false); + MSCorlib::pObject->resolveType(true, false, NULL); MSCorlib::pObject->resolveVT(); - type->resolveType(true, false); + type->resolveType(true, false, NULL); type->resolveVT(); uint64 size = mvm::jit::getTypeSize(type->virtualType->getContainedType(0)) + sizeof(const UTF8*) + sizeof(llvm::GlobalVariable*); @@ -59,7 +59,7 @@ #undef INIT { - MSCorlib::clrType->resolveType(false, false); + MSCorlib::clrType->resolveType(false, false, NULL); std::vector args; args.push_back(MSCorlib::pVoid); args.push_back(MSCorlib::clrType); @@ -68,7 +68,7 @@ } { - MSCorlib::assemblyReflection->resolveType(false, false); + MSCorlib::assemblyReflection->resolveType(false, false, NULL); std::vector args; args.push_back(MSCorlib::pVoid); args.push_back(MSCorlib::assemblyReflection); @@ -77,7 +77,7 @@ } { - MSCorlib::propertyType->resolveType(false, false); + MSCorlib::propertyType->resolveType(false, false, NULL); std::vector args; args.push_back(MSCorlib::pVoid); args.push_back(MSCorlib::propertyType); @@ -86,7 +86,7 @@ } { - MSCorlib::methodType->resolveType(false, false); + MSCorlib::methodType->resolveType(false, false, NULL); std::vector args; args.push_back(MSCorlib::pVoid); args.push_back(MSCorlib::methodType); @@ -95,7 +95,7 @@ } { - MSCorlib::resourceStreamType->resolveType(false, false); + MSCorlib::resourceStreamType->resolveType(false, false, NULL); std::vector args; args.push_back(MSCorlib::pVoid); args.push_back(MSCorlib::resourceStreamType); @@ -107,7 +107,7 @@ VMCommonClass* voidPtr = vm->coreAssembly->constructPointer(MSCorlib::pVoid, 1); #define INIT(var, cl, type) {\ - cl->resolveType(false, false); \ + cl->resolveType(false, false, NULL); \ var = cl->lookupField(vm->asciizConstructUTF8("value_"), type, false, false); \ } Modified: vmkit/trunk/lib/N3/VMCore/Assembly.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/Assembly.cpp?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/Assembly.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/Assembly.cpp Mon Aug 18 17:22:15 2008 @@ -394,10 +394,10 @@ VMField* Assembly::constructField(VMClass* cl, const UTF8* name, VMCommonClass* signature, - uint32 token) { + uint32 token, VMGenericClass* genClass, VMGenericMethod* genMethod) { VMField* field; - if (VMThread::get()->currGenericClass == 0) { + if (genClass == 0) { // we are not reading a generic class field = loadedTokenFields->lookupOrCreate(token, this, fieldDup); } else { @@ -428,10 +428,11 @@ } VMMethod* Assembly::constructMethod(VMClass* cl, const UTF8* name, - uint32 token, bool generic) { + uint32 token, bool generic, + std::vector* genMethodInstantiation, VMGenericClass* genClass) { VMMethod* meth; - if (VMThread::get()->currGenericClass == 0 && generic == false) { + if (genClass == 0 && generic == false) { // we are not reading a generic class meth = loadedTokenMethods->lookupOrCreate(token, this, methodDup); } else { @@ -441,11 +442,11 @@ if (generic) { // we are reading a generic method - if (VMThread::get()->genMethodInstantiation == NULL) { + if (genMethodInstantiation == NULL) { cl->genericMethods.push_back(meth); } else { VMGenericMethod* genMethod = genMethodDup(token, this); - genMethod->genericParams = *VMThread::get()->genMethodInstantiation; + genMethod->genericParams = *genMethodInstantiation; meth = genMethod; if (isStatic(meth->flags)) { cl->staticMethods.push_back(meth); @@ -887,7 +888,7 @@ return i + 1 + (CONSTANT_TypeDef << 24); } -VMCommonClass* Assembly::readTypeSpec(N3* vm, uint32 index) { +VMCommonClass* Assembly::readTypeSpec(N3* vm, uint32 index, VMGenericClass* genClass, VMGenericMethod* genMethod) { uint32 blobOffset = CLIHeader->blobStream->realOffset; Table* typeTable = CLIHeader->tables[CONSTANT_TypeSpec]; uint32* typeArray = (uint32*)alloca(sizeof(uint32) * typeTable->rowSize); @@ -896,7 +897,7 @@ uint32 signOffset = typeArray[CONSTANT_TYPESPEC_SIGNATURE]; uint32 offset = blobOffset + signOffset; - return extractTypeInSignature(offset); + return extractTypeInSignature(offset, genClass, genMethod); } @@ -1100,14 +1101,14 @@ } VMCommonClass* Assembly::loadType(N3* vm, uint32 token, bool resolve, - bool resolveStatic, bool clinit, bool dothrow) { - return loadType(vm, token, resolve, resolveStatic, clinit, dothrow, (std::vector) 0); + bool resolveStatic, bool clinit, bool dothrow, VMGenericClass* genClass, VMGenericMethod* genMethod) { + return loadType(vm, token, resolve, resolveStatic, clinit, dothrow, (std::vector) 0, genClass, genMethod); } VMCommonClass* Assembly::loadType(N3* vm, uint32 token, bool resolve, bool resolveStatic, bool clinit, bool dothrow, - std::vector genArgs) { + std::vector genArgs, VMGenericClass* genClass, VMGenericMethod* genMethod) { VMCommonClass* type = lookupClassFromToken(token); if (!type || type->status == hashed) { @@ -1119,7 +1120,7 @@ } else if (table == CONSTANT_TypeRef) { type = readTypeRef(vm, index); } else if (table == CONSTANT_TypeSpec) { - type = readTypeSpec(vm, index); + type = readTypeSpec(vm, index, genClass, genMethod); } else { VMThread::get()->vm->error("implement me %x", token); } @@ -1134,16 +1135,12 @@ type->release(); } - if (resolve) type->resolveType(resolveStatic, clinit); + if (resolve) type->resolveType(resolveStatic, clinit, genMethod); return type; } -void Assembly::readClass(VMCommonClass* cl) { - // temporarily store the class being read in case it is a generic class - VMGenericClass* old = VMThread::get()->currGenericClass; - VMThread::get()->currGenericClass = dynamic_cast(cl); - +void Assembly::readClass(VMCommonClass* cl, VMGenericMethod* genMethod) { uint32 index = cl->token & 0xffff; Table* typeTable = CLIHeader->tables[CONSTANT_TypeDef]; uint32 typeSize = typeTable->rowsNumber; @@ -1158,7 +1155,7 @@ Table* methodTable = CLIHeader->tables[CONSTANT_MethodDef]; uint32 methodSize = methodTable->rowsNumber; - getProperties(cl); + getProperties(cl, dynamic_cast(cl), genMethod); if (methodList && methodTable != 0 && methodList <= methodSize) { uint32 endMethod = (index == typeSize) ? @@ -1169,7 +1166,7 @@ uint32 nbMethods = endMethod - methodList; for (uint32 i = 0; i < nbMethods; ++i) { - VMMethod* meth = readMethodDef(i + methodList, cl); + VMMethod* meth = readMethodDef(i + methodList, cl, NULL, dynamic_cast(cl)); if (meth != NULL) { if (isStatic(meth->flags)) { @@ -1189,7 +1186,7 @@ uint32 nbFields = endField - fieldList; for (uint32 i = 0; i < nbFields; ++i) { - VMField* field = readField(i + fieldList, cl); + VMField* field = readField(i + fieldList, cl, dynamic_cast(cl), genMethod); if (isStatic(field->flags)) { cl->staticFields.push_back(field); } else { @@ -1197,9 +1194,6 @@ } } } - - // we have stopped reading a generic class - VMThread::get()->currGenericClass = old; } void Assembly::readCustomAttributes(uint32 offset, std::vector& args, VMMethod* meth) { @@ -1240,10 +1234,10 @@ VMThread::get()->vm->error("implement me"); break; case 2: - cons = getMethodFromToken(index + (CONSTANT_MethodDef << 24)); + cons = getMethodFromToken(index + (CONSTANT_MethodDef << 24), NULL, NULL); break; case 3: - cons = getMethodFromToken(index + (CONSTANT_MemberRef << 24)); + cons = getMethodFromToken(index + (CONSTANT_MemberRef << 24), NULL, NULL); break; } @@ -1266,7 +1260,7 @@ return res; } -void Assembly::getProperties(VMCommonClass* cl) { +void Assembly::getProperties(VMCommonClass* cl, VMGenericClass* genClass, VMGenericMethod *genMethod) { uint32 index = cl->token & 0xffff; Table* mapTable = CLIHeader->tables[CONSTANT_PropertyMap]; uint32 mapSize = mapTable->rowsNumber; @@ -1296,13 +1290,13 @@ uint32 nbProperties = endProperty - propertyList; for (uint32 j = 0; j < nbProperties; ++j) { - cl->properties.push_back(readProperty(j + propertyList, cl)); + cl->properties.push_back(readProperty(j + propertyList, cl, genClass, genMethod)); } } } -Property* Assembly::readProperty(uint32 index, VMCommonClass* cl) { +Property* Assembly::readProperty(uint32 index, VMCommonClass* cl, VMGenericClass* genClass, VMGenericMethod* genMethod) { uint32 stringOffset = CLIHeader->stringStream->realOffset; uint32 blobOffset = CLIHeader->blobStream->realOffset; @@ -1320,11 +1314,12 @@ prop->flags = flags; prop->type = cl; uint32 offset = blobOffset + type; - prop->virt = extractMethodSignature(offset, cl, prop->parameters); + prop->virt = extractMethodSignature(offset, cl, prop->parameters, genClass, genMethod); return prop; } -VMMethod* Assembly::readMethodDef(uint32 index, VMCommonClass* cl) { +VMMethod* Assembly::readMethodDef(uint32 index, VMCommonClass* cl, + std::vector* genMethodInstantiation, VMGenericClass* genClass) { uint32 token = index + (CONSTANT_MethodDef << 24); uint32 stringOffset = CLIHeader->stringStream->realOffset; uint32 blobOffset = CLIHeader->blobStream->realOffset; @@ -1349,14 +1344,12 @@ VMMethod* meth = constructMethod((VMClass*)cl, readString(cl->vm, (name + stringOffset)), - token, isGenericMethod(offset)); + token, isGenericMethod(offset), genMethodInstantiation, genClass); offset = blobOffset + signature; - VMGenericMethod* tmp = VMThread::get()->currGenericMethod; - VMThread::get()->currGenericMethod = dynamic_cast(meth); - meth->virt = extractMethodSignature(offset, cl, meth->parameters); - VMThread::get()->currGenericMethod = tmp; + meth->virt = extractMethodSignature(offset, cl, meth->parameters, genClass, + dynamic_cast (meth)); meth->flags = flags; meth->implFlags = implFlags; @@ -1384,7 +1377,7 @@ return meth; } -VMField* Assembly::readField(uint32 index, VMCommonClass* cl) { +VMField* Assembly::readField(uint32 index, VMCommonClass* cl, VMGenericClass* genClass, VMGenericMethod* genMethod) { uint32 token = index + (CONSTANT_Field << 24); uint32 stringOffset = CLIHeader->stringStream->realOffset; uint32 blobOffset = CLIHeader->blobStream->realOffset; @@ -1399,9 +1392,9 @@ uint32 signature = fieldArray[CONSTANT_FIELD_SIGNATURE]; uint32 offset = blobOffset + signature; - VMField* field = - constructField((VMClass*)cl, readString(cl->vm, (name + stringOffset)), - extractFieldSignature(offset), token); + VMField* field = constructField((VMClass*) cl, readString(cl->vm, (name + + stringOffset)), extractFieldSignature(offset, genClass, genMethod), + token, genClass, genMethod); field->flags = flags; return field; @@ -1447,13 +1440,13 @@ } } - if (resolve) cl->resolveType(unify, clinit); + if (resolve) cl->resolveType(unify, clinit, NULL); return cl; } void Assembly::readSignature(uint32 localVarSig, - std::vector& locals) { + std::vector& locals, VMGenericClass* genClass, VMGenericMethod* genMethod) { uint32 table = localVarSig >> 24; uint32 index = localVarSig & 0xffff; if (table != CONSTANT_StandaloneSig) { @@ -1467,10 +1460,10 @@ uint32 blobEntry = blobOffset + array[CONSTANT_STANDALONE_SIG_SIGNATURE]; - localVarSignature(blobEntry, locals); + localVarSignature(blobEntry, locals, genClass, genMethod); } -VMField* Assembly::getFieldFromToken(uint32 token, bool stat) { +VMField* Assembly::getFieldFromToken(uint32 token, bool stat, VMGenericClass* genClass, VMGenericMethod* genMethod) { VMField* field = lookupFieldFromToken(token); if (!field) { uint32 table = token >> 24; @@ -1481,7 +1474,7 @@ switch (newTable) { case CONSTANT_TypeDef : { loadType((N3*)(VMThread::get()->vm), typeToken, true, true, false, - true); + true, genClass, genMethod); field = lookupFieldFromToken(token); if (!field) { VMThread::get()->vm->error("implement me"); @@ -1496,7 +1489,7 @@ } case CONSTANT_MemberRef : { - field = readMemberRefAsField(token, stat); + field = readMemberRefAsField(token, stat, genClass, genMethod); break; } @@ -1505,7 +1498,7 @@ } } } - field->classDef->resolveType(stat, false); + field->classDef->resolveType(stat, false, genMethod); return field; } @@ -1557,7 +1550,7 @@ return size; } -VMField* Assembly::readMemberRefAsField(uint32 token, bool stat) { +VMField* Assembly::readMemberRefAsField(uint32 token, bool stat, VMGenericClass* genClass, VMGenericMethod* genMethod) { uint32 index = token & 0xffff; Table* memberTable = CLIHeader->tables[CONSTANT_MemberRef]; uint32* memberArray = (uint32*)alloca(sizeof(uint32) * memberTable->rowSize); @@ -1581,14 +1574,14 @@ case 0 : { uint32 typeToken = index + (CONSTANT_TypeDef << 24); type = loadType(((N3*)VMThread::get()->vm), typeToken, - true, false, false, true); + true, false, false, true, genClass, genMethod); break; } case 1 : { uint32 typeToken = index + (CONSTANT_TypeRef << 24); type = loadType(((N3*)VMThread::get()->vm), typeToken, - true, false, false, true); + true, false, false, true, genClass, genMethod); break; } @@ -1597,7 +1590,7 @@ case 4: { uint32 typeToken = index + (CONSTANT_TypeSpec << 24); type = loadType(((N3*)VMThread::get()->vm), typeToken, - true, false, false, true); + true, false, false, true, genClass, genMethod); break; } default: @@ -1607,24 +1600,15 @@ uint32 offset = blobOffset + memberArray[CONSTANT_MEMBERREF_SIGNATURE]; - VMGenericClass* genClass = dynamic_cast(type); - - if (genClass) { - // save previous generic class - VMGenericClass* old = VMThread::get()->currGenericClass; - - // set generic class this MemberRef is referring to - VMThread::get()->currGenericClass = genClass; - - VMCommonClass* signature = extractFieldSignature(offset); - - // restore saved class - VMThread::get()->currGenericClass = old; - - VMField* field = type->lookupField(name, signature, stat, true); - return field; + VMGenericClass* genericClass = dynamic_cast (type); + + if (genericClass) { + VMCommonClass* signature = extractFieldSignature(offset, genericClass, + genMethod); + VMField* field = type->lookupField(name, signature, stat, true); + return field; } else { - VMCommonClass* signature = extractFieldSignature(offset); + VMCommonClass* signature = extractFieldSignature(offset, genClass, genMethod); VMField* field = type->lookupField(name, signature, stat, true); return field; } @@ -1632,7 +1616,7 @@ } -VMMethod* Assembly::getMethodFromToken(uint32 token) { +VMMethod* Assembly::getMethodFromToken(uint32 token, VMGenericClass* genClass, VMGenericMethod* genMethod) { VMMethod* meth = lookupMethodFromToken(token); if (!meth) { @@ -1644,7 +1628,7 @@ switch (newTable) { case CONSTANT_TypeDef : { loadType((N3*)(VMThread::get()->vm), typeToken, true, true, false, - true); + true, genClass, genMethod); meth = lookupMethodFromToken(token); if (!meth) { VMThread::get()->vm->error("implement me"); @@ -1659,12 +1643,12 @@ } case CONSTANT_MemberRef : { - meth = readMemberRefAsMethod(token, NULL); + meth = readMemberRefAsMethod(token, NULL, genClass, genMethod); break; } case CONSTANT_MethodSpec : { - meth = readMethodSpec(token); + meth = readMethodSpec(token, genClass, genMethod); break; } @@ -1674,7 +1658,7 @@ } } - meth->getSignature(); + meth->getSignature(genMethod); return meth; } @@ -1704,8 +1688,8 @@ VMMethod *Assembly::instantiateGenericMethod( std::vector *genArgs, VMCommonClass *type, const UTF8 *& name, std::vector & args, uint32 token, - bool virt) { - VMMethod *meth; + bool virt, VMGenericClass* genClass) { + VMMethod *meth = NULL; if (genArgs != NULL) { VMClass* cl = dynamic_cast (type); @@ -1719,15 +1703,13 @@ for (uint i = 0; i < cl->genericMethods.size(); ++i) { VMMethod* genMethod = cl->genericMethods.at(i); - if (!name->equals(genMethod->name) || !genMethod->signatureEqualsGeneric( + if ((name != genMethod->name) || !genMethod->signatureEqualsGeneric( args)) { continue; } // use found token to create instance of generic method - VMThread::get()->genMethodInstantiation = genArgs; - meth = readMethodDef(genMethod->token & 0xFFFFFF, type); - VMThread::get()->genMethodInstantiation = NULL; + meth = readMethodDef(genMethod->token & 0xFFFFFF, type, genArgs, genClass); meth->token = token; } } else { @@ -1737,7 +1719,7 @@ return meth; } -VMMethod* Assembly::readMemberRefAsMethod(uint32 token, std::vector* genArgs) { +VMMethod* Assembly::readMemberRefAsMethod(uint32 token, std::vector* genArgs, VMGenericClass* genClass, VMGenericMethod* genMethod) { uint32 index = token & 0xffff; Table* memberTable = CLIHeader->tables[CONSTANT_MemberRef]; uint32* memberArray = (uint32*)alloca(sizeof(uint32) * memberTable->rowSize); @@ -1761,52 +1743,44 @@ switch (table) { case 0 : { uint32 typeToken = index + (CONSTANT_TypeDef << 24); - VMCommonClass* type = loadType(((N3*)(VMThread::get()->vm)), typeToken, true, false, false, true); - bool virt = extractMethodSignature(offset, type, args); - VMMethod *meth = instantiateGenericMethod(genArgs, type, name, args, token, virt); + VMCommonClass* type = loadType(((N3*)(VMThread::get()->vm)), typeToken, true, false, false, true, genClass, genMethod); + bool virt = extractMethodSignature(offset, type, args, genClass, genMethod); + VMMethod *meth = instantiateGenericMethod(genArgs, type, name, args, token, virt, genClass); return meth; } case 1 : { uint32 typeToken = index + (CONSTANT_TypeRef << 24); VMCommonClass* type = loadType(((N3*)VMThread::get()->vm), typeToken, - true, false, false, true); - bool virt = extractMethodSignature(offset, type, args); - VMMethod *meth = instantiateGenericMethod(genArgs, type, name, args, token, virt); + true, false, false, true, genClass, genMethod); + bool virt = extractMethodSignature(offset, type, args, genClass, genMethod); + VMMethod *meth = instantiateGenericMethod(genArgs, type, name, args, token, virt, genClass); return meth; } case 2: case 3: VMThread::get()->vm->error("implement me %d", table); break; case 4: { - VMClass* type = (VMClass*) readTypeSpec(vm, index); + VMClass* type = (VMClass*) readTypeSpec(vm, index, genClass, genMethod); VMGenericClass* genClass = dynamic_cast (type); if (genClass) { - // temporarily store the current generic class, in case it's generic arguments - // are referenced in the current method - VMGenericClass* old = VMThread::get()->currGenericClass; - VMThread::get()->currGenericClass = genClass; + type->resolveType(false, false, genMethod); - type->resolveType(false, false); - - bool virt = extractMethodSignature(offset, type, args); + bool virt = extractMethodSignature(offset, type, args, genClass, genMethod); VMMethod* meth = instantiateGenericMethod(genArgs, type, name, args, - token, virt); - - // restore previous generic class - VMThread::get()->currGenericClass = old; + token, virt, genClass); return meth; } else { - type->resolveType(false, false); + type->resolveType(false, false, genMethod); VMMethod* meth = gc_new(VMMethod)() ; - bool virt = extractMethodSignature(offset, type, args); + bool virt = extractMethodSignature(offset, type, args, genClass, genMethod); bool structReturn = false; const llvm::FunctionType* signature = VMMethod::resolveSignature(args, - virt, structReturn); + virt, structReturn, genMethod); meth->_signature = signature; meth->classDef = type; meth->name = name; @@ -1824,7 +1798,7 @@ return 0; } -VMMethod* Assembly::readMethodSpec(uint32 token) { +VMMethod* Assembly::readMethodSpec(uint32 token, VMGenericClass* genClass, VMGenericMethod* genMethod) { uint32 index = token & 0xffff; uint32 blobOffset = CLIHeader->blobStream->realOffset; @@ -1839,7 +1813,7 @@ uint32 offset = blobOffset + instantiation; std::vector genArgs; - methodSpecSignature(offset, genArgs); + methodSpecSignature(offset, genArgs, genClass, genMethod); uint32 table = method & 1; index = method >> 1; @@ -1854,7 +1828,7 @@ } case 1 : { methodToken = index + (CONSTANT_MemberRef << 24); - return readMemberRefAsMethod(methodToken, &genArgs); + return readMemberRefAsMethod(methodToken, &genArgs, genClass, genMethod); } default: VMThread::get()->vm->error("Invalid MethodSpec!"); Modified: vmkit/trunk/lib/N3/VMCore/Assembly.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/Assembly.h?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/Assembly.h (original) +++ vmkit/trunk/lib/N3/VMCore/Assembly.h Mon Aug 18 17:22:15 2008 @@ -49,6 +49,8 @@ class VMField; class VMMethod; class VMObject; +class VMGenericClass; +class VMGenericMethod; class Section : public mvm::Object { public: @@ -129,7 +131,7 @@ uint32 heapSizes); typedef VMCommonClass* (*signatureVector_t)(uint32 op, Assembly* ass, - uint32& offset); + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod); class Assembly : public mvm::Object { public: @@ -148,9 +150,9 @@ std::vector genArgs, uint32 token); VMField* constructField(VMClass* cl, const UTF8* name, - VMCommonClass* signature, uint32 token); + VMCommonClass* signature, uint32 token, VMGenericClass* genClass, VMGenericMethod* genMethod); VMMethod* constructMethod(VMClass* cl, const UTF8* name, - uint32 token, bool generic); + uint32 token, bool generic, std::vector* genMethodInstantiation, VMGenericClass* genClass); VMCommonClass* lookupClassFromName(const UTF8* name, const UTF8* nameSpace); VMCommonClass* lookupClassFromToken(uint32 token); VMMethod* lookupMethodFromToken(uint32 token); @@ -206,49 +208,50 @@ uint32 uncompressSignature(uint32& offset); uint32 getTypeDefTokenFromMethod(uint32 token); VMCommonClass* loadType(N3* vm, uint32 token, bool resolveFunc, bool resolve, - bool clinit, bool dothrow); + bool clinit, bool dothrow, VMGenericClass* genClass, VMGenericMethod* genMethod); VMCommonClass* loadType(N3* vm, uint32 token, bool resolveFunc, bool resolve, - bool clinit, bool dothrow, std::vector genArgs); + bool clinit, bool dothrow, std::vector genArgs, VMGenericClass* genClass, VMGenericMethod* genMethod); VMCommonClass* loadTypeFromName(const UTF8* name, const UTF8* nameSpace, bool resolveFunc, bool resolve, bool clinit, bool dothrow); - void readClass(VMCommonClass* cl); - void getProperties(VMCommonClass* cl); - Property* readProperty(uint32 index, VMCommonClass* cl); - VMMethod* readMethodDef(uint32 index, VMCommonClass* cl); - VMMethod* readMethodSpec(uint32 token); - VMField* readField(uint32 index, VMCommonClass* cl); + void readClass(VMCommonClass* cl, VMGenericMethod* genMethod); + void getProperties(VMCommonClass* cl, VMGenericClass* genClass, VMGenericMethod* genMethod); + Property* readProperty(uint32 index, VMCommonClass* cl, VMGenericClass* genClass, VMGenericMethod* genMethod); + VMMethod* readMethodDef(uint32 index, VMCommonClass* cl, + std::vector* genMethodInstantiation, VMGenericClass* genClass); + VMMethod* readMethodSpec(uint32 token, VMGenericClass* genClass, VMGenericMethod* genMethod); + VMField* readField(uint32 index, VMCommonClass* cl, VMGenericClass* genClass, VMGenericMethod* genMethod); Param* readParam(uint32 index, VMMethod* meth); VMClass* readTypeDef(N3* vm, uint32 index); VMClass* readTypeDef(N3* vm, uint32 index, std::vector genArgs); - VMCommonClass* readTypeSpec(N3* vm, uint32 index); + VMCommonClass* readTypeSpec(N3* vm, uint32 index, VMGenericClass* genClass, VMGenericMethod* genMethod); Assembly* readAssemblyRef(N3* vm, uint32 index); VMCommonClass* readTypeRef(N3* vm, uint32 index); - void readSignature(uint32 offset, std::vector& locals); + void readSignature(uint32 offset, std::vector& locals, VMGenericClass* genClass, VMGenericMethod* genMethod); void getInterfacesFromTokenType(std::vector& tokens, uint32 token); bool extractMethodSignature(uint32& offset, VMCommonClass* cl, - std::vector ¶ms); + std::vector ¶ms, VMGenericClass* genClass, VMGenericMethod* genMethod); bool isGenericMethod(uint32& offset); void localVarSignature(uint32& offset, - std::vector& locals); + std::vector& locals, VMGenericClass* genClass, VMGenericMethod* genMethod); void methodSpecSignature(uint32& offset, - std::vector& genArgs); - VMCommonClass* extractFieldSignature(uint32& offset); - VMCommonClass* extractTypeInSignature(uint32& offset); - VMCommonClass* exploreType(uint32& offset); + std::vector& genArgs, VMGenericClass* genClass, VMGenericMethod* genMethod); + VMCommonClass* extractFieldSignature(uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod); + VMCommonClass* extractTypeInSignature(uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod); + VMCommonClass* exploreType(uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod); VMCommonClass* getClassFromName(N3* vm, const UTF8* name, const UTF8* nameSpace); - VMField* getFieldFromToken(uint32 token, bool stat); + VMField* getFieldFromToken(uint32 token, bool stat, VMGenericClass* genClass, VMGenericMethod* genMethod); uint32 getTypedefTokenFromField(uint32 token); - VMField* readMemberRefAsField(uint32 token, bool stat); + VMField* readMemberRefAsField(uint32 token, bool stat, VMGenericClass* genClass, VMGenericMethod* genMethod); - VMMethod* getMethodFromToken(uint32 token); + VMMethod* getMethodFromToken(uint32 token, VMGenericClass* genClass, VMGenericMethod* genMethod); uint32 getTypedefTokenFromMethod(uint32 token); - VMMethod* readMemberRefAsMethod(uint32 token, std::vector* genArgs); + VMMethod* readMemberRefAsMethod(uint32 token, std::vector* genArgs, VMGenericClass* genClass, VMGenericMethod* genMethod); const UTF8* readUserString(uint32 token); uint32 getExplicitLayout(uint32 token); @@ -260,7 +263,7 @@ void readCustomAttributes(uint32 offset, std::vector& args, VMMethod* meth); ArrayObject* getCustomAttributes(uint32 token, VMCommonClass* cl); private: - VMMethod *instantiateGenericMethod(std::vector *genArgs, VMCommonClass *type, const UTF8 *& name, std::vector & args, uint32 token, bool virt); + VMMethod *instantiateGenericMethod(std::vector *genArgs, VMCommonClass *type, const UTF8 *& name, std::vector & args, uint32 token, bool virt, VMGenericClass* genClass); }; Modified: vmkit/trunk/lib/N3/VMCore/CLIJit.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIJit.cpp?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/CLIJit.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/CLIJit.cpp Mon Aug 18 17:22:15 2008 @@ -453,34 +453,25 @@ } Instruction* CLIJit::invokeInline(VMMethod* meth, - std::vector& args) { + std::vector& args, VMGenericClass* genClass, VMGenericMethod* genMethod) { CLIJit* jit = gc_new(CLIJit)(); jit->compilingClass = meth->classDef; jit->compilingMethod = meth; - // save previous current generic class to restore it later - VMGenericClass* old = VMThread::get()->currGenericClass; - // temporarily store the class being compiled in case it is a generic class - VMThread::get()->currGenericClass = dynamic_cast(jit->compilingClass); - - jit->unifiedUnreachable = unifiedUnreachable; jit->inlineMethods = inlineMethods; jit->inlineMethods[meth] = true; Instruction* ret = jit->inlineCompile(llvmFunction, currentBlock, - currentExceptionBlock, args); + currentExceptionBlock, args, dynamic_cast(jit->compilingClass), genMethod); inlineMethods[meth] = false; - // restore saved class - VMThread::get()->currGenericClass = old; - return ret; } -void CLIJit::invoke(uint32 value) { - VMMethod* meth = compilingClass->assembly->getMethodFromToken(value); +void CLIJit::invoke(uint32 value, VMGenericClass* genClass, VMGenericMethod* genMethod) { + VMMethod* meth = compilingClass->assembly->getMethodFromToken(value, genClass, genMethod); if (meth->classDef->isArray) { uint8 func = 0; @@ -530,7 +521,7 @@ } std::vector Args; - const llvm::FunctionType* type = meth->getSignature(); + const llvm::FunctionType* type = meth->getSignature(genMethod); makeArgs(type, Args, meth->structReturn); if (meth->classDef->nameSpace == N3::system && @@ -599,9 +590,9 @@ Value* res = 0; if (meth && meth->canBeInlined && meth != compilingMethod && inlineMethods[meth] == 0) { - res = invokeInline(meth, Args); + res = invokeInline(meth, Args, genClass, genMethod); } else { - Function* func = meth->compiledPtr(); + Function* func = meth->compiledPtr(genMethod); res = invoke(func, Args, "", currentBlock, meth->structReturn); } @@ -610,11 +601,11 @@ } } -void CLIJit::invokeNew(uint32 value) { +void CLIJit::invokeNew(uint32 value, VMGenericClass* genClass, VMGenericMethod* genMethod) { Assembly* ass = compilingClass->assembly; - VMMethod* meth = ass->getMethodFromToken(value); + VMMethod* meth = ass->getMethodFromToken(value, genClass, genMethod); VMClass* type = meth->classDef; - const FunctionType* funcType = meth->getSignature(); + const FunctionType* funcType = meth->getSignature(genMethod); Value* obj = 0; if (type->isPointer) { @@ -661,9 +652,9 @@ makeArgs(funcType, Args, meth->structReturn); if (meth && meth->canBeInlined && meth != compilingMethod && inlineMethods[meth] == 0) { - invokeInline(meth, Args); + invokeInline(meth, Args, genClass, genMethod); } else { - Function* func = meth->compiledPtr(); + Function* func = meth->compiledPtr(genMethod); invoke(func, Args, "", currentBlock, meth->structReturn); } @@ -676,8 +667,8 @@ } } -llvm::Value* CLIJit::getVirtualField(uint32 value) { - VMField* field = compilingClass->assembly->getFieldFromToken(value, false); +llvm::Value* CLIJit::getVirtualField(uint32 value, VMGenericClass* genClass, VMGenericMethod* genMethod) { + VMField* field = compilingClass->assembly->getFieldFromToken(value, false, genClass, genMethod); Value* obj = pop(); if ((field->classDef->super == MSCorlib::pValue || field->classDef->super == MSCorlib::pEnum) && @@ -699,10 +690,10 @@ } } -llvm::Value* CLIJit::getStaticField(uint32 value) { - VMField* field = compilingClass->assembly->getFieldFromToken(value, true); +llvm::Value* CLIJit::getStaticField(uint32 value, VMGenericClass* genClass, VMGenericMethod* genMethod) { + VMField* field = compilingClass->assembly->getFieldFromToken(value, true, genClass, genMethod); VMCommonClass* cl = field->classDef; - cl->resolveType(true, false); + cl->resolveType(true, false, genMethod); Value* arg = new LoadInst(cl->llvmVar(), "", currentBlock); Value* call = invoke(initialiseClassLLVM, arg, "", currentBlock, false); Value* staticCl = new BitCastInst(call, cl->staticType, "", currentBlock); @@ -717,8 +708,8 @@ } -void CLIJit::setVirtualField(uint32 value, bool isVolatile) { - VMField* field = compilingClass->assembly->getFieldFromToken(value, false); +void CLIJit::setVirtualField(uint32 value, bool isVolatile, VMGenericClass* genClass, VMGenericMethod* genMethod) { + VMField* field = compilingClass->assembly->getFieldFromToken(value, false, genClass, genMethod); Value* val = pop(); Value* obj = pop(); const Type* valType = val->getType(); @@ -765,8 +756,8 @@ } } -void CLIJit::setStaticField(uint32 value, bool isVolatile) { - VMField* field = compilingClass->assembly->getFieldFromToken(value, true); +void CLIJit::setStaticField(uint32 value, bool isVolatile, VMGenericClass* genClass, VMGenericMethod* genMethod) { + VMField* field = compilingClass->assembly->getFieldFromToken(value, true, genClass, genMethod); VMCommonClass* cl = field->classDef; Value* arg = new LoadInst(cl->llvmVar(), "", currentBlock); @@ -936,11 +927,11 @@ return 0; } -Function* CLIJit::compileNative() { +Function* CLIJit::compileNative(VMGenericMethod* genMethod) { PRINT_DEBUG(N3_COMPILE, 1, COLOR_NORMAL, "native compile %s\n", compilingMethod->printString()); - const FunctionType *funcType = compilingMethod->getSignature(); + const FunctionType *funcType = compilingMethod->getSignature(genMethod); Function* func = llvmFunction = compilingMethod->methPtr; currentBlock = createBasicBlock("start"); @@ -977,7 +968,7 @@ return llvmFunction; } -uint32 CLIJit::readExceptionTable(uint32 offset, bool fat) { +uint32 CLIJit::readExceptionTable(uint32 offset, bool fat, VMGenericClass* genClass, VMGenericMethod* genMethod) { Assembly* ass = compilingClass->assembly; ArrayUInt8* bytes = ass->bytes; uint32 nbe = 0; @@ -1027,7 +1018,7 @@ ex->test = createBasicBlock("testException"); if (classToken) { ex->catchClass = ass->loadType((N3*)VMThread::get()->vm, classToken, - true, false, false, true); + true, false, false, true, genClass, genMethod); } else { ex->catchClass = MSCorlib::pException; } @@ -1158,7 +1149,7 @@ } #endif -Function* CLIJit::compileFatOrTiny() { +Function* CLIJit::compileFatOrTiny(VMGenericClass* genClass, VMGenericMethod* genMethod) { PRINT_DEBUG(N3_COMPILE, 1, COLOR_NORMAL, "tiny or fat compile %s\n", compilingMethod->printString()); uint32 offset = compilingMethod->offset; @@ -1187,7 +1178,7 @@ bool synchro = isSynchro(compilingMethod->flags); */ - const FunctionType *funcType = compilingMethod->getSignature(); + const FunctionType *funcType = compilingMethod->getSignature(genMethod); Function* func = llvmFunction = compilingMethod->methPtr; currentBlock = createBasicBlock("start"); @@ -1212,7 +1203,7 @@ uint8 flags = READ_U1(bytes, excpOffset); nbe = readExceptionTable(excpOffset, - flags & CONSTANT_CorILMethod_Sect_FatFormat); + flags & CONSTANT_CorILMethod_Sect_FatFormat, genClass, genMethod); } } @@ -1228,12 +1219,12 @@ if (localVarSig) { std::vector temp; - compilingClass->assembly->readSignature(localVarSig, temp); + compilingClass->assembly->readSignature(localVarSig, temp, genClass, genMethod); for (std::vector::iterator i = temp.begin(), e = temp.end(); i!= e; ++i) { VMCommonClass* cl = *i; - cl->resolveType(false, false); + cl->resolveType(false, false, genMethod); AllocaInst* alloc = new AllocaInst(cl->naturalType, "", currentBlock); if (cl->naturalType->isSingleValueType()) { new StoreInst(Constant::getNullValue(cl->naturalType), alloc, false, @@ -1268,7 +1259,7 @@ endNode = PHINode::Create(lastType, "", endBlock); } - compileOpcodes(&compilingClass->assembly->bytes->elements[offset], codeLen); + compileOpcodes(&compilingClass->assembly->bytes->elements[offset], codeLen, genClass, genMethod); currentBlock = endBlock; pred_iterator PI = pred_begin(endBlock); @@ -1335,7 +1326,7 @@ Instruction* CLIJit::inlineCompile(Function* parentFunction, BasicBlock*& curBB, BasicBlock* endExBlock, - std::vector& args) { + std::vector& args, VMGenericClass* genClass, VMGenericMethod* genMethod) { PRINT_DEBUG(N3_COMPILE, 1, COLOR_NORMAL, "tiny or fat inline compile %s\n", compilingMethod->printString()); @@ -1364,7 +1355,7 @@ bool synchro = isSynchro(compilingMethod->flags); */ - const FunctionType *funcType = compilingMethod->getSignature(); + const FunctionType *funcType = compilingMethod->getSignature(genMethod); llvmFunction = parentFunction; currentBlock = curBB; @@ -1389,7 +1380,7 @@ uint8 flags = READ_U1(bytes, excpOffset); readExceptionTable(excpOffset, - flags & CONSTANT_CorILMethod_Sect_FatFormat); + flags & CONSTANT_CorILMethod_Sect_FatFormat, genClass, genMethod); } } @@ -1405,12 +1396,12 @@ if (localVarSig) { std::vector temp; - compilingClass->assembly->readSignature(localVarSig, temp); + compilingClass->assembly->readSignature(localVarSig, temp, genClass, genMethod); for (std::vector::iterator i = temp.begin(), e = temp.end(); i!= e; ++i) { VMCommonClass* cl = *i; - cl->resolveType(false, false); + cl->resolveType(false, false, genMethod); AllocaInst* alloc = new AllocaInst(cl->naturalType, "", currentBlock); if (cl->naturalType->isSingleValueType()) { new StoreInst(Constant::getNullValue(cl->naturalType), alloc, false, @@ -1445,7 +1436,7 @@ endNode = PHINode::Create(lastType, "", endBlock); } - compileOpcodes(&compilingClass->assembly->bytes->elements[offset], codeLen); + compileOpcodes(&compilingClass->assembly->bytes->elements[offset], codeLen, genClass, genMethod); curBB = endBlock; @@ -1462,41 +1453,26 @@ jit->compilingClass = cl; jit->compilingMethod = meth; - // save previous generic and method class - VMGenericClass* old = VMThread::get()->currGenericClass; - VMGenericMethod* oldMethod = VMThread::get()->currGenericMethod; - - // temporarily store the class of the method to be compiled - // in case it is a generic class - VMThread::get()->currGenericClass = dynamic_cast(cl); - - VMThread::get()->currGenericMethod = dynamic_cast(meth); - Function* func; - meth->getSignature(); + meth->getSignature(dynamic_cast(meth)); if (isInternal(meth->implFlags)) { - func = jit->compileNative(); + func = jit->compileNative(dynamic_cast(meth)); } else if (meth->offset == 0) { func = jit->compileIntern(); } else { - func = jit->compileFatOrTiny(); + func = jit->compileFatOrTiny(dynamic_cast(cl), dynamic_cast(meth)); } - // restore saved class - VMThread::get()->currGenericClass = old; - - VMThread::get()->currGenericMethod = oldMethod; - return func; } -llvm::Function *VMMethod::compiledPtr() { +llvm::Function *VMMethod::compiledPtr(VMGenericMethod* genMethod) { if (methPtr != 0) return methPtr; else { classDef->aquire(); if (methPtr == 0) { - methPtr = Function::Create(getSignature(), GlobalValue::GhostLinkage, + methPtr = Function::Create(getSignature(genMethod), GlobalValue::GhostLinkage, printString(), classDef->vm->module); classDef->vm->functions->hash(methPtr, this); } @@ -1522,7 +1498,7 @@ } extern "C" VMObject* initialiseClass(VMClass* cl) { - cl->clinitClass(); + cl->clinitClass(NULL); return cl->staticInstance; } Modified: vmkit/trunk/lib/N3/VMCore/CLIJit.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIJit.h?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/CLIJit.h (original) +++ vmkit/trunk/lib/N3/VMCore/CLIJit.h Mon Aug 18 17:22:15 2008 @@ -36,6 +36,8 @@ class VMCommonClass; class VMMethod; class VMObject; +class VMGenericClass; +class VMGenericMethod; class Exception : public mvm::Object { public: @@ -85,7 +87,7 @@ static VirtualTable* makeArrayVT(VMClassArray* cl); static void printExecution(char*, n3::VMMethod*); - void compileOpcodes(uint8*, uint32); + void compileOpcodes(uint8*, uint32, VMGenericClass* genClass, VMGenericMethod* genMethod); void exploreOpcodes(uint8*, uint32); llvm::Function* llvmFunction; @@ -121,18 +123,18 @@ llvm::BasicBlock* unifiedUnreachable; std::vector exceptions; std::vector finallyHandlers; - uint32 readExceptionTable(uint32 offset, bool fat); + uint32 readExceptionTable(uint32 offset, bool fat, VMGenericClass* genClass, VMGenericMethod* genMethod); std::vector leaves; llvm::Value* supplLocal; // calls - void invoke(uint32 value); - void invokeInterfaceOrVirtual(uint32 value); - void invokeNew(uint32 value); - llvm::Value* getVirtualField(uint32 value); - llvm::Value* getStaticField(uint32 value); - void setVirtualField(uint32 value, bool isVolatile); - void setStaticField(uint32 value, bool isVolatile); + void invoke(uint32 value, VMGenericClass* genClass, VMGenericMethod* genMethod); + void invokeInterfaceOrVirtual(uint32 value, VMGenericClass* genClass, VMGenericMethod* genMethod); + void invokeNew(uint32 value, VMGenericClass* genClass, VMGenericMethod* genMethod); + llvm::Value* getVirtualField(uint32 value, VMGenericClass* genClass, VMGenericMethod* genMethod); + llvm::Value* getStaticField(uint32 value, VMGenericClass* genClass, VMGenericMethod* genMethod); + void setVirtualField(uint32 value, bool isVolatile, VMGenericClass* genClass, VMGenericMethod* genMethod); + void setStaticField(uint32 value, bool isVolatile, VMGenericClass* genClass, VMGenericMethod* genMethod); void JITVerifyNull(llvm::Value* obj); @@ -174,8 +176,8 @@ static void initialiseAppDomain(N3* vm); static void initialiseBootstrapVM(N3* vm); - llvm::Function* compileNative(); - llvm::Function* compileFatOrTiny(); + llvm::Function* compileNative(VMGenericMethod* genMethod); + llvm::Function* compileFatOrTiny(VMGenericClass* genClass, VMGenericMethod* genMethod); llvm::Function* compileIntern(); llvm::Function* createDelegate(); @@ -211,12 +213,12 @@ llvm::Instruction* inlineCompile(llvm::Function* parentFunction, llvm::BasicBlock*& curBB, llvm::BasicBlock* endExBlock, - std::vector& args); + std::vector& args, VMGenericClass* genClass, VMGenericMethod* genMethod); std::map inlineMethods; llvm::Instruction* invokeInline(VMMethod* meth, - std::vector& args); + std::vector& args, VMGenericClass* genClass, VMGenericMethod* genMethod); }; Modified: vmkit/trunk/lib/N3/VMCore/CLIJitMeta.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIJitMeta.cpp?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/CLIJitMeta.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/CLIJitMeta.cpp Mon Aug 18 17:22:15 2008 @@ -29,14 +29,14 @@ VMObject* VMClass::operator()() { if (status < ready) - resolveType(true, true); + resolveType(true, true, NULL); return doNew(); } void VMField::operator()(VMObject* obj, float val) { if (classDef->status < ready) - classDef->resolveType(true, true); + classDef->resolveType(true, true, NULL); bool stat = isStatic(flags); if (stat) obj = classDef->staticInstance; @@ -54,7 +54,7 @@ void VMField::operator()(VMObject* obj, double val) { if (classDef->status < ready) - classDef->resolveType(true, true); + classDef->resolveType(true, true, NULL); bool stat = isStatic(flags); if (stat) obj = classDef->staticInstance; @@ -72,7 +72,7 @@ void VMField::operator()(VMObject* obj, sint64 val) { if (classDef->status < ready) - classDef->resolveType(true, true); + classDef->resolveType(true, true, NULL); bool stat = isStatic(flags); if (stat) obj = classDef->staticInstance; @@ -90,7 +90,7 @@ void VMField::operator()(VMObject* obj, sint32 val) { if (classDef->status < ready) - classDef->resolveType(true, true); + classDef->resolveType(true, true, NULL); bool stat = isStatic(flags); if (stat) obj = classDef->staticInstance; @@ -108,7 +108,7 @@ void VMField::operator()(VMObject* obj, VMObject* val) { if (classDef->status < ready) - classDef->resolveType(true, true); + classDef->resolveType(true, true, NULL); bool stat = isStatic(flags); if (stat) obj = classDef->staticInstance; @@ -125,7 +125,7 @@ void VMField::operator()(VMObject* obj, bool val) { if (classDef->status < ready) - classDef->resolveType(true, true); + classDef->resolveType(true, true, NULL); bool stat = isStatic(flags); if (stat) obj = classDef->staticInstance; @@ -143,7 +143,7 @@ GenericValue VMField::operator()(VMObject* obj) { if (classDef->status < ready) - classDef->resolveType(true, true); + classDef->resolveType(true, true, NULL); bool stat = isStatic(flags); if (stat) { @@ -193,9 +193,9 @@ GenericValue VMMethod::operator()(va_list ap) { if (classDef->status < ready) - classDef->resolveType(true, true); + classDef->resolveType(true, true, NULL); - Function* func = compiledPtr(); + Function* func = compiledPtr(NULL); std::vector args; for (Function::arg_iterator i = func->arg_begin(), e = func->arg_end(); @@ -237,9 +237,9 @@ GenericValue VMMethod::operator()(VMObject* obj, va_list ap) { if (classDef->status < ready) - classDef->resolveType(true, true); + classDef->resolveType(true, true, NULL); - Function* func = compiledPtr(); + Function* func = compiledPtr(NULL); std::vector args; GenericValue object(obj); @@ -301,9 +301,9 @@ GenericValue VMMethod::operator()(std::vector& args) { if (classDef->status < ready) - classDef->resolveType(true, true); + classDef->resolveType(true, true, NULL); - Function* func = compiledPtr(); + Function* func = compiledPtr(NULL); return mvm::jit::executionEngine->runFunction(func, args); } Modified: vmkit/trunk/lib/N3/VMCore/CLISignature.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLISignature.cpp?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/CLISignature.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/CLISignature.cpp Mon Aug 18 17:22:15 2008 @@ -22,133 +22,162 @@ // ECMA 335: page 150 23.1.16 Element types used in signatures -static VMCommonClass* METHOD_ElementTypeEnd(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeEnd(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { VMThread::get()->vm->error("implement me"); return 0; } -static VMCommonClass* METHOD_ElementTypeVoid(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeVoid(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return MSCorlib::pVoid; } -static VMCommonClass* METHOD_ElementTypeBoolean(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeBoolean(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return MSCorlib::pBoolean; } -static VMCommonClass* METHOD_ElementTypeChar(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeChar(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return MSCorlib::pChar; } -static VMCommonClass* METHOD_ElementTypeI1(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeI1(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return MSCorlib::pSInt8; } -static VMCommonClass* METHOD_ElementTypeU1(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeU1(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return MSCorlib::pUInt8; } -static VMCommonClass* METHOD_ElementTypeI2(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeI2(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return MSCorlib::pSInt16; } -static VMCommonClass* METHOD_ElementTypeU2(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeU2(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return MSCorlib::pUInt16; } -static VMCommonClass* METHOD_ElementTypeI4(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeI4(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return MSCorlib::pSInt32; } -static VMCommonClass* METHOD_ElementTypeU4(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeU4(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return MSCorlib::pUInt32; } -static VMCommonClass* METHOD_ElementTypeI8(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeI8(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return MSCorlib::pSInt64; } -static VMCommonClass* METHOD_ElementTypeU8(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeU8(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return MSCorlib::pUInt64; } -static VMCommonClass* METHOD_ElementTypeR4(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeR4(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return MSCorlib::pFloat; } -static VMCommonClass* METHOD_ElementTypeR8(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeR8(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return MSCorlib::pDouble; } -static VMCommonClass* METHOD_ElementTypeString(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeString(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return MSCorlib::pString; } -static VMCommonClass* METHOD_ElementTypePtr(uint32 op, Assembly* ass, uint32& offset) { - VMCommonClass* contains = ass->exploreType(offset); +static VMCommonClass* METHOD_ElementTypePtr(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { + VMCommonClass* contains = ass->exploreType(offset, genClass, genMethod); return ass->constructPointer(contains, 1); } -static VMCommonClass* METHOD_ElementTypeByRef(uint32 op, Assembly* ass, uint32& offset) { - VMCommonClass* contains = ass->exploreType(offset); +static VMCommonClass* METHOD_ElementTypeByRef(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { + VMCommonClass* contains = ass->exploreType(offset, genClass, genMethod); return ass->constructPointer(contains, 1); } static VMCommonClass* METHOD_ElementTypeValueType(uint32 op, Assembly* ass, - uint32& offset) { + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { uint32 value = ass->uncompressSignature(offset); uint32 table = value & 3; uint32 index = value >> 2; uint32 token = 0; - switch (table) { - case 0: table = CONSTANT_TypeDef; break; - case 1: table = CONSTANT_TypeRef; break; - case 2: table = CONSTANT_TypeSpec; break; - default: - VMThread::get()->vm->error("unknown TypeDefOrRefEncoded %d", index); - break; + case 0: + table = CONSTANT_TypeDef; + break; + case 1: + table = CONSTANT_TypeRef; + break; + case 2: + table = CONSTANT_TypeSpec; + break; + default: + VMThread::get()->vm->error("unknown TypeDefOrRefEncoded %d", index); + break; } token = (table << 24) + index; - VMCommonClass* cl = ass->loadType((N3*)(VMThread::get()->vm), token, false, - false, false, true); + VMCommonClass* cl = ass->loadType((N3*) (VMThread::get()->vm), token, false, + false, false, true, genClass, genMethod); return cl; } -static VMCommonClass* METHOD_ElementTypeClass(uint32 op, - Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeClass(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { uint32 value = ass->uncompressSignature(offset); uint32 table = value & 3; uint32 index = value >> 2; uint32 token = 0; - switch (table) { - case 0: table = CONSTANT_TypeDef; break; - case 1: table = CONSTANT_TypeRef; break; - case 2: table = CONSTANT_TypeSpec; break; - default: - VMThread::get()->vm->error("unknown TypeDefOrRefEncoded %d", index); - break; + case 0: + table = CONSTANT_TypeDef; + break; + case 1: + table = CONSTANT_TypeRef; + break; + case 2: + table = CONSTANT_TypeSpec; + break; + default: + VMThread::get()->vm->error("unknown TypeDefOrRefEncoded %d", index); + break; } token = (table << 24) + index; - VMCommonClass* cl = ass->loadType((N3*)(VMThread::get()->vm), token, false, - false, false, true); + VMCommonClass* cl = ass->loadType((N3*) (VMThread::get()->vm), token, false, + false, false, true, genClass, genMethod); return cl; } -static VMCommonClass* METHOD_ElementTypeVar(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeVar(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { uint32 number = ass->uncompressSignature(offset); - - assert(VMThread::get()->currGenericClass != NULL && "Current Generic Class not set!"); - - return VMThread::get()->currGenericClass->genericParams[number]; + + assert(genClass != NULL && "Current Generic Class not set!"); + + return genClass->genericParams[number]; } -static VMCommonClass* METHOD_ElementTypeArray(uint32 op, Assembly* ass, uint32& offset) { - VMCommonClass* cl = ass->exploreType(offset); +static VMCommonClass* METHOD_ElementTypeArray(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { + VMCommonClass* cl = ass->exploreType(offset, genClass, genMethod); uint32 rank = ass->uncompressSignature(offset); uint32 numSizes = ass->uncompressSignature(offset); @@ -162,17 +191,19 @@ } uint32 numObounds = ass->uncompressSignature(offset); - if (numObounds != 0) VMThread::get()->vm->error("implement me"); + if (numObounds != 0) + VMThread::get()->vm->error("implement me"); for (uint32 i = 0; i < numObounds; ++i) { ass->uncompressSignature(offset); } - + VMClassArray* array = ass->constructArray(cl, rank); return array; } -static VMCommonClass* METHOD_ElementTypeGenericInst(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeGenericInst(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { // offset points to (CLASS | VALUETYPE) TypeDefOrRefEncoded // skip generic type definition @@ -180,25 +211,25 @@ // save starting offset for later use uint32 genericTypeOffset = offset; - + ass->uncompressSignature(offset); // TypeDefOrRefEncoded //VMCommonClass* cl = ass->exploreType(offset); - + uint32 argCount = ass->uncompressSignature(offset); - + std::vector args; - + // Get generic arguments. for (uint32 i = 0; i < argCount; ++i) { - args.push_back(ass->exploreType(offset)); + args.push_back(ass->exploreType(offset, genClass, genMethod)); } // save offset uint32 endOffset = offset; // restore starting offset offset = genericTypeOffset; - + // TypeDefOrRefEncoded uint32 value = ass->uncompressSignature(offset); uint32 table = value & 3; @@ -206,57 +237,72 @@ uint32 token = 0; switch (table) { - case 0: table = CONSTANT_TypeDef; break; - case 1: table = CONSTANT_TypeRef; break; - case 2: table = CONSTANT_TypeSpec; break; - default: - VMThread::get()->vm->error("unknown TypeDefOrRefEncoded %d", index); - break; + case 0: + table = CONSTANT_TypeDef; + break; + case 1: + table = CONSTANT_TypeRef; + break; + case 2: + table = CONSTANT_TypeSpec; + break; + default: + VMThread::get()->vm->error("unknown TypeDefOrRefEncoded %d", index); + break; } token = (table << 24) + index; - VMCommonClass* cl = ass->loadType((N3*)(VMThread::get()->vm), token, false, - false, false, true, args); + VMCommonClass* cl = ass->loadType((N3*) (VMThread::get()->vm), token, false, + false, false, true, args, genClass, genMethod); // restore endOffset offset = endOffset; - + return cl; } -static VMCommonClass* METHOD_ElementTypeTypedByRef(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeTypedByRef(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return MSCorlib::typedReference; } -static VMCommonClass* METHOD_ElementTypeI(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeI(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return MSCorlib::pIntPtr; } -static VMCommonClass* METHOD_ElementTypeU(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeU(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return MSCorlib::pUIntPtr; } -static VMCommonClass* METHOD_ElementTypeFnptr(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeFnptr(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { VMThread::get()->vm->error("implement me"); return 0; } -static VMCommonClass* METHOD_ElementTypeObject(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeObject(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return MSCorlib::pObject; } -static VMCommonClass* METHOD_ElementTypeSzarray(uint32 op, Assembly* ass, uint32& offset) { - VMCommonClass* contains = ass->exploreType(offset); +static VMCommonClass* METHOD_ElementTypeSzarray(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { + VMCommonClass* contains = ass->exploreType(offset, genClass, genMethod); VMClassArray* res = ass->constructArray(contains, 1); return res; } -static VMCommonClass* METHOD_ElementTypeMvar(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeMvar(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod *currGenericMethod) { uint32 number = ass->uncompressSignature(offset); - - if (VMThread::get()->currGenericMethod == NULL) { - // return dummy VMClass, use the token field - // to store the generic argument number - VMClass* cl = gc_new(VMClass)(); + + if (currGenericMethod == NULL) { + // when reading in signatures which contain references to generic arguments + // of generic methods we need create a placeholder for each of them, + // this is done by creating a dummy VMClass which has the assembly field + // set to NULL, the token field is used to store the generic argument number + VMClass* cl = gc_new(VMClass)() ; cl->token = number; cl->assembly = NULL; cl->nameSpace = UTF8::asciizConstruct(VMThread::get()->vm, ""); @@ -265,159 +311,165 @@ cl->name = UTF8::asciizConstruct(VMThread::get()->vm, tmp); return cl; } else { - return VMThread::get()->currGenericMethod->genericParams[number]; + return currGenericMethod->genericParams[number]; } } -static VMCommonClass* METHOD_ElementTypeCmodReqd(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeCmodReqd(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { VMThread::get()->vm->error("implement me"); return 0; } -static VMCommonClass* METHOD_ElementTypeCmodOpt(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeCmodOpt(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { VMThread::get()->vm->error("implement me"); return 0; } -static VMCommonClass* METHOD_ElementTypeInternal(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeInternal(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { VMThread::get()->vm->error("implement me"); return 0; } -static VMCommonClass* METHOD_ElementTypeModifier(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeModifier(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { VMThread::get()->vm->error("implement me"); return 0; } -static VMCommonClass* METHOD_ElementTypeSentinel(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypeSentinel(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { VMThread::get()->vm->error("implement me"); return 0; } -static VMCommonClass* METHOD_ElementTypePinned(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* METHOD_ElementTypePinned(uint32 op, Assembly* ass, + uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { return 0; } -static VMCommonClass* unimplemented(uint32 op, Assembly* ass, uint32& offset) { +static VMCommonClass* unimplemented(uint32 op, Assembly* ass, uint32& offset, + VMGenericClass* genClass, VMGenericMethod* genMethod) { VMThread::get()->vm->error("unknown signature"); return 0; } -signatureVector_t Assembly::signatureVector[0x46] = { - METHOD_ElementTypeEnd, // 0x00 - METHOD_ElementTypeVoid, // 0x01 - METHOD_ElementTypeBoolean, // 0x02 - METHOD_ElementTypeChar, // 0x03 - METHOD_ElementTypeI1, // 0x04 - METHOD_ElementTypeU1, // 0x05 - METHOD_ElementTypeI2, // 0x06 - METHOD_ElementTypeU2, // 0x07 - METHOD_ElementTypeI4, // 0x08 - METHOD_ElementTypeU4, // 0x09 - METHOD_ElementTypeI8, // 0x0A - METHOD_ElementTypeU8, // 0x0B - METHOD_ElementTypeR4, // 0x0C - METHOD_ElementTypeR8, // 0x0D - METHOD_ElementTypeString, // 0x0E - METHOD_ElementTypePtr, // 0x1F - METHOD_ElementTypeByRef, // 0x10 - METHOD_ElementTypeValueType, // 0x11 - METHOD_ElementTypeClass, // 0x12 - METHOD_ElementTypeVar, // 0x13 - METHOD_ElementTypeArray, // 0x14 - METHOD_ElementTypeGenericInst, // 0x15 - METHOD_ElementTypeTypedByRef, // 0x16 - unimplemented, // 0x17 - METHOD_ElementTypeI, // 0x18 - METHOD_ElementTypeU, // 0x19 - unimplemented, // 0x1A - METHOD_ElementTypeFnptr, // 0x1B - METHOD_ElementTypeObject, // 0x1C - METHOD_ElementTypeSzarray, // 0x1D - METHOD_ElementTypeMvar, // 0x1E - METHOD_ElementTypeCmodReqd, // 0x1F - METHOD_ElementTypeCmodOpt, // 0x20 - METHOD_ElementTypeInternal, // 0x21 - METHOD_ElementTypeModifier, // 0x22 - unimplemented, // 0x23 - unimplemented, // 0x24 - unimplemented, // 0x25 - unimplemented, // 0x26 - unimplemented, // 0x27 - unimplemented, // 0x28 - unimplemented, // 0x29 - unimplemented, // 0x2A - unimplemented, // 0x2B - unimplemented, // 0x2C - unimplemented, // 0x2D - unimplemented, // 0x2E - unimplemented, // 0x2F - unimplemented, // 0x30 - unimplemented, // 0x31 - unimplemented, // 0x32 - unimplemented, // 0x33 - unimplemented, // 0x34 - unimplemented, // 0x35 - unimplemented, // 0x36 - unimplemented, // 0x37 - unimplemented, // 0x38 - unimplemented, // 0x39 - unimplemented, // 0x3A - unimplemented, // 0x3B - unimplemented, // 0x3C - unimplemented, // 0x3D - unimplemented, // 0x3E - unimplemented, // 0x3F - unimplemented, // 0x40 - METHOD_ElementTypeSentinel, // 0x41 - unimplemented, // 0x42 - unimplemented, // 0x43 - unimplemented, // 0x44 - METHOD_ElementTypePinned // 0x45 -}; +signatureVector_t Assembly::signatureVector[0x46] = { METHOD_ElementTypeEnd, // 0x00 + METHOD_ElementTypeVoid, // 0x01 + METHOD_ElementTypeBoolean, // 0x02 + METHOD_ElementTypeChar, // 0x03 + METHOD_ElementTypeI1, // 0x04 + METHOD_ElementTypeU1, // 0x05 + METHOD_ElementTypeI2, // 0x06 + METHOD_ElementTypeU2, // 0x07 + METHOD_ElementTypeI4, // 0x08 + METHOD_ElementTypeU4, // 0x09 + METHOD_ElementTypeI8, // 0x0A + METHOD_ElementTypeU8, // 0x0B + METHOD_ElementTypeR4, // 0x0C + METHOD_ElementTypeR8, // 0x0D + METHOD_ElementTypeString, // 0x0E + METHOD_ElementTypePtr, // 0x1F + METHOD_ElementTypeByRef, // 0x10 + METHOD_ElementTypeValueType, // 0x11 + METHOD_ElementTypeClass, // 0x12 + METHOD_ElementTypeVar, // 0x13 + METHOD_ElementTypeArray, // 0x14 + METHOD_ElementTypeGenericInst, // 0x15 + METHOD_ElementTypeTypedByRef, // 0x16 + unimplemented, // 0x17 + METHOD_ElementTypeI, // 0x18 + METHOD_ElementTypeU, // 0x19 + unimplemented, // 0x1A + METHOD_ElementTypeFnptr, // 0x1B + METHOD_ElementTypeObject, // 0x1C + METHOD_ElementTypeSzarray, // 0x1D + METHOD_ElementTypeMvar, // 0x1E + METHOD_ElementTypeCmodReqd, // 0x1F + METHOD_ElementTypeCmodOpt, // 0x20 + METHOD_ElementTypeInternal, // 0x21 + METHOD_ElementTypeModifier, // 0x22 + unimplemented, // 0x23 + unimplemented, // 0x24 + unimplemented, // 0x25 + unimplemented, // 0x26 + unimplemented, // 0x27 + unimplemented, // 0x28 + unimplemented, // 0x29 + unimplemented, // 0x2A + unimplemented, // 0x2B + unimplemented, // 0x2C + unimplemented, // 0x2D + unimplemented, // 0x2E + unimplemented, // 0x2F + unimplemented, // 0x30 + unimplemented, // 0x31 + unimplemented, // 0x32 + unimplemented, // 0x33 + unimplemented, // 0x34 + unimplemented, // 0x35 + unimplemented, // 0x36 + unimplemented, // 0x37 + unimplemented, // 0x38 + unimplemented, // 0x39 + unimplemented, // 0x3A + unimplemented, // 0x3B + unimplemented, // 0x3C + unimplemented, // 0x3D + unimplemented, // 0x3E + unimplemented, // 0x3F + unimplemented, // 0x40 + METHOD_ElementTypeSentinel, // 0x41 + unimplemented, // 0x42 + unimplemented, // 0x43 + unimplemented, // 0x44 + METHOD_ElementTypePinned // 0x45 + }; bool Assembly::extractMethodSignature(uint32& offset, VMCommonClass* cl, - std::vector& types) { + std::vector& types, VMGenericClass* genClass, VMGenericMethod* genMethod) { //uint32 count = uncompressSignature(offset); - uint32 call = uncompressSignature(offset); - + uint32 call = uncompressSignature(offset); + if (call & CONSTANT_Generic) { //uint32 genArgCount = uncompressSignature(offset); } - + uint32 paramCount = uncompressSignature(offset); uint32 hasThis = call & CONSTANT_HasThis ? 1 : 0; uint32 realCount = paramCount + hasThis; - VMCommonClass* ret = exploreType(offset); + VMCommonClass* ret = exploreType(offset, genClass, genMethod); types.push_back(ret); - + if (hasThis) { types.push_back(cl); } - + for (uint32 i = hasThis; i < realCount; ++i) { - VMCommonClass* cur = exploreType(offset); + VMCommonClass* cur = exploreType(offset, genClass, genMethod); types.push_back(cur); } - + return hasThis != 0; } // checks whether the MethodDefSig at offset contains generic parameters bool Assembly::isGenericMethod(uint32& offset) { uncompressSignature(offset); // count - + uint32 callingConvention = READ_U1(bytes, offset); - + return callingConvention & CONSTANT_Generic ? true : false; } void Assembly::methodSpecSignature(uint32& offset, - std::vector& genArgs) { + std::vector& genArgs, VMGenericClass* genClass, VMGenericMethod* genMethod) { uncompressSignature(offset); // count uint32 genericSig = uncompressSignature(offset); @@ -426,56 +478,58 @@ } uint32 genArgCount = uncompressSignature(offset); - + for (uint32 i = 0; i < genArgCount; i++) { - genArgs.push_back(exploreType(offset)); + genArgs.push_back(exploreType(offset, genClass, genMethod)); } } void Assembly::localVarSignature(uint32& offset, - std::vector& locals) { + std::vector& locals, VMGenericClass* genClass, VMGenericMethod* genMethod) { //uint32 count = uncompressSignature(offset); - uint32 localSig = uncompressSignature(offset); - uint32 nbLocals = uncompressSignature(offset); + uint32 localSig = uncompressSignature(offset); + uint32 nbLocals = uncompressSignature(offset); if (localSig != 0x7) { VMThread::get()->vm->error("unknown local sig %x", localSig); } - + for (uint32 i = 0; i < nbLocals; ++i) { - VMCommonClass* cl = exploreType(offset); - if (!cl) --i; // PINNED - else locals.push_back(cl); + VMCommonClass* cl = exploreType(offset, genClass, genMethod); + if (!cl) + --i; // PINNED + else + locals.push_back(cl); } } -VMCommonClass* Assembly::extractFieldSignature(uint32& offset) { +VMCommonClass* Assembly::extractFieldSignature(uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { //uint32 count = uncompressSignature(offset); - uint32 fieldSig = uncompressSignature(offset); - + uint32 fieldSig = uncompressSignature(offset); + if (fieldSig != 0x6) { VMThread::get()->vm->error("unknown field sig %x", fieldSig); } - + // TODO implement support for custom modifiers // see ECMA 335 23.2.4, 23.2.7 - return exploreType(offset); + return exploreType(offset, genClass, genMethod); } -VMCommonClass* Assembly::extractTypeInSignature(uint32& offset) { +VMCommonClass* Assembly::extractTypeInSignature(uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { //uint32 count = uncompressSignature(offset); - return exploreType(offset); + return exploreType(offset, genClass, genMethod); } -VMCommonClass* Assembly::exploreType(uint32& offset) { +VMCommonClass* Assembly::exploreType(uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod) { uint32 op = READ_U1(bytes, offset); assert(op < 0x46 && "unknown signature type"); - return (signatureVector[op])(op, this, offset); + return (signatureVector[op]) (op, this, offset, genClass, genMethod); } uint32 Assembly::uncompressSignature(uint32& offset) { Modified: vmkit/trunk/lib/N3/VMCore/N3.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/N3.cpp?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/N3.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/N3.cpp Mon Aug 18 17:22:15 2008 @@ -233,7 +233,7 @@ const UTF8* name = asciizConstructUTF8(_name); Assembly* assembly = loadAssembly(name, 0); if (assembly == 0) { - error("Can not found assembly %s", _name); + error("Can not find assembly %s", _name); } else { uint32 entryPoint = assembly->entryPoint; uint32 table = entryPoint >> 24; @@ -241,7 +241,7 @@ error("Entry point does not point to a method"); } else { uint32 typeToken = assembly->getTypeDefTokenFromMethod(entryPoint); - assembly->loadType(this, typeToken, true, true, true ,true); + assembly->loadType(this, typeToken, true, true, true ,true, NULL, NULL); VMMethod* mainMeth = assembly->lookupMethodFromToken(entryPoint); (*mainMeth)(args); } Modified: vmkit/trunk/lib/N3/VMCore/N3ModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/N3ModuleProvider.cpp?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/N3ModuleProvider.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/N3ModuleProvider.cpp Mon Aug 18 17:22:15 2008 @@ -44,7 +44,7 @@ code->setMetaInfo(meth); } meth->classDef->release(); - meth->classDef->resolveStatic(true); + meth->classDef->resolveStatic(true, NULL); } return false; } Modified: vmkit/trunk/lib/N3/VMCore/NativeUtil.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/NativeUtil.cpp?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/NativeUtil.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/NativeUtil.cpp Mon Aug 18 17:22:15 2008 @@ -67,7 +67,7 @@ buf = (char*)alloca(6 + strlen(name) + strlen(nameSpace) + strlen(methName) + 10); sprintf(buf, "%s_%s_%s_%d", nameSpace, name, methName, - meth->getSignature()->getNumParams()); + meth->getSignature(NULL)->getNumParams()); cliToInternal(buf); res = dlsym(0, buf); if (!res) { Modified: vmkit/trunk/lib/N3/VMCore/Opcodes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/Opcodes.cpp?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/Opcodes.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/Opcodes.cpp Mon Aug 18 17:22:15 2008 @@ -200,7 +200,7 @@ } } -void CLIJit::compileOpcodes(uint8* bytecodes, uint32 codeLength) { +void CLIJit::compileOpcodes(uint8* bytecodes, uint32 codeLength, VMGenericClass* genClass, VMGenericMethod* genMethod) { uint32 leaveIndex = 0; bool isVolatile = false; for(uint32 i = 0; i < codeLength; ++i) { @@ -364,7 +364,7 @@ case CALL: { uint32 value = readU4(bytecodes, i); - invoke(value); + invoke(value, genClass, genMethod); break; } @@ -1067,7 +1067,7 @@ } case RET : { - if (compilingMethod->getSignature()->getReturnType() != Type::VoidTy) { + if (compilingMethod->getSignature(genMethod)->getReturnType() != Type::VoidTy) { Value* val = pop(); if (val->getType() == PointerType::getUnqual(endNode->getType())) { // In case it's a struct @@ -1278,7 +1278,7 @@ Assembly* assembly = compilingClass->assembly; N3* vm = (N3*)(VMThread::get()->vm); VMCommonClass* type = assembly->loadType(vm, token, true, false, false, - true); + true, genClass, genMethod); assert(type); if (!type->isPrimitive) { @@ -1322,7 +1322,7 @@ case CALLVIRT : { uint32 value = readU4(bytecodes, i); - invokeInterfaceOrVirtual(value); + invokeInterfaceOrVirtual(value, genClass, genMethod); break; } @@ -1331,7 +1331,7 @@ N3* vm = (N3*)(VMThread::get()->vm); uint32 token = readU4(bytecodes, i); VMCommonClass* dcl = assembly->loadType(vm, token, true, false, - false, true); + false, true, genClass, genMethod); Value* obj = new BitCastInst(pop(), VMObject::llvmType, "", currentBlock); Value* cmp = new ICmpInst(ICmpInst::ICMP_EQ, obj, @@ -1380,7 +1380,7 @@ N3* vm = (N3*)(VMThread::get()->vm); uint32 token = readU4(bytecodes, i); VMCommonClass* dcl = assembly->loadType(vm, token, true, false, - false, true); + false, true, genClass, genMethod); Value* obj = pop(); Value* cmp = new ICmpInst(ICmpInst::ICMP_EQ, obj, @@ -1520,9 +1520,9 @@ N3* vm = (N3*)(VMThread::get()->vm); uint32 token = readU4(bytecodes, i); VMCommonClass* cl = assembly->loadType(vm, token, true, false, - false, true); + false, true, genClass, genMethod); VMClassArray* array = assembly->constructArray(cl, 1); - array->resolveType(false, false); + array->resolveType(false, false, genMethod); Value* index = pop(); Value* obj = pop(); Value* ptr = verifyAndComputePtr(obj, index, array->naturalType); @@ -1532,7 +1532,7 @@ case LDFLD : { uint32 value = readU4(bytecodes, i); - Value* val = getVirtualField(value); + Value* val = getVirtualField(value, genClass, genMethod); push(new LoadInst(val, "", isVolatile, currentBlock)); isVolatile = false; break; @@ -1540,7 +1540,7 @@ case LDFLDA : { uint32 value = readU4(bytecodes, i); - push(getVirtualField(value)); + push(getVirtualField(value, genClass, genMethod)); break; } @@ -1554,7 +1554,7 @@ N3* vm = (N3*)(VMThread::get()->vm); uint32 token = readU4(bytecodes, i); VMCommonClass* cl = assembly->loadType(vm, token, true, false, - false, true); + false, true, genClass, genMethod); if (!(cl->super == MSCorlib::pValue || cl->super == MSCorlib::pEnum)) { push(new LoadInst(pop(), "", isVolatile, currentBlock)); isVolatile = false; @@ -1564,7 +1564,7 @@ case LDSFLD : { uint32 value = readU4(bytecodes, i); - Value* val = getStaticField(value); + Value* val = getStaticField(value, genClass, genMethod); push(new LoadInst(val, "", isVolatile, currentBlock)); isVolatile = false; break; @@ -1572,7 +1572,7 @@ case LDSFLDA : { uint32 value = readU4(bytecodes, i); - push(getStaticField(value)); + push(getStaticField(value, genClass, genMethod)); break; } @@ -1600,7 +1600,7 @@ switch (table) { case CONSTANT_Field : { uint32 typeToken = assembly->getTypedefTokenFromField(token); - assembly->loadType(vm, typeToken, true, true, false, true); + assembly->loadType(vm, typeToken, true, true, false, true, genClass, genMethod); VMField* field = assembly->lookupFieldFromToken(token); if (!field) { VMThread::get()->vm->error("implement me"); @@ -1612,7 +1612,7 @@ case CONSTANT_MethodDef : { uint32 typeToken = assembly->getTypedefTokenFromMethod(token); - assembly->loadType(vm, typeToken, true, true, false, true); + assembly->loadType(vm, typeToken, true, true, false, true, genClass, genMethod); VMMethod* meth = assembly->lookupMethodFromToken(token); if (!meth) { VMThread::get()->vm->error("implement me"); @@ -1625,7 +1625,7 @@ case CONSTANT_TypeDef : case CONSTANT_TypeRef : { VMCommonClass* cl = assembly->loadType(vm, token, true, false, - false, true); + false, true, genClass, genMethod); Value* arg = new LoadInst(cl->llvmVar(), "", currentBlock); push(arg); break; @@ -1647,10 +1647,10 @@ Assembly* ass = compilingClass->assembly; VMCommonClass* baseType = ass->loadType((N3*)(VMThread::get()->vm), value, true, false, false, - true); + true, genClass, genMethod); VMClassArray* type = ass->constructArray(baseType, 1); - type->resolveType(false, false); + type->resolveType(false, false, genMethod); Value* var = new LoadInst(type->llvmVar(), "", currentBlock); std::vector args; args.push_back(var); @@ -1663,7 +1663,7 @@ case NEWOBJ : { uint32 value = readU4(bytecodes, i); - invokeNew(value); + invokeNew(value, genClass, genMethod); break; } @@ -1754,7 +1754,7 @@ case STFLD : { uint32 index = readU4(bytecodes, i); - setVirtualField(index, isVolatile); + setVirtualField(index, isVolatile, genClass, genMethod); isVolatile = false; break; } @@ -1767,7 +1767,7 @@ case STSFLD : { uint32 index = readU4(bytecodes, i); - setStaticField(index, isVolatile); + setStaticField(index, isVolatile, genClass, genMethod); isVolatile = false; break; } @@ -1791,7 +1791,7 @@ Assembly* assembly = compilingClass->assembly; N3* vm = (N3*)(VMThread::get()->vm); VMCommonClass* type = assembly->loadType(vm, token, true, false, false, - true); + true, genClass, genMethod); assert(type); Value* val = new AllocaInst(type->naturalType, "", currentBlock); @@ -1893,7 +1893,7 @@ uint32 table = token >> 24; if (table == CONSTANT_MethodDef) { uint32 typeToken = assembly->getTypedefTokenFromMethod(token); - assembly->loadType(vm, typeToken, true, false, false, true); + assembly->loadType(vm, typeToken, true, false, false, true, genClass, genMethod); VMMethod* meth = assembly->lookupMethodFromToken(token); if (!meth) VMThread::get()->vm->error("implement me"); Value* arg = new LoadInst(meth->llvmVar(), "", currentBlock); @@ -1955,7 +1955,7 @@ Assembly* assembly = compilingClass->assembly; N3* vm = (N3*)(VMThread::get()->vm); VMCommonClass* type = assembly->loadType(vm, token, true, false, false, - true); + true, genClass, genMethod); if (type->super == MSCorlib::pValue) { uint64 size = mvm::jit::getTypeSize(type->naturalType); Modified: vmkit/trunk/lib/N3/VMCore/VMArray.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMArray.cpp?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMArray.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/VMArray.cpp Mon Aug 18 17:22:15 2008 @@ -217,21 +217,3 @@ buf->setAt(size, 0); return buf->cString(); } - -bool UTF8::equals(const UTF8 *string) const -{ - if (size != string->size) { - return false; - } - - for (sint32 i = 0; i < size; ++i) { - if (at(i) != string->at(i)) { - return false; - } - } - - return true; -} - - - Modified: vmkit/trunk/lib/N3/VMCore/VMArray.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMArray.h?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMArray.h (original) +++ vmkit/trunk/lib/N3/VMCore/VMArray.h Mon Aug 18 17:22:15 2008 @@ -104,8 +104,6 @@ static const UTF8* readerConstruct(VirtualMachine *vm, uint16* buf, uint32 n); const UTF8* extract(VirtualMachine *vm, uint32 start, uint32 len) const; - - bool equals(const UTF8* string) const; }; } // end namespace n3 Modified: vmkit/trunk/lib/N3/VMCore/VMCache.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMCache.cpp?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMCache.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/VMCache.cpp Mon Aug 18 17:22:15 2008 @@ -66,10 +66,10 @@ return enveloppe; } -void CLIJit::invokeInterfaceOrVirtual(uint32 value) { +void CLIJit::invokeInterfaceOrVirtual(uint32 value, VMGenericClass* genClass, VMGenericMethod* genMethod) { - VMMethod* origMeth = compilingClass->assembly->getMethodFromToken(value); - const llvm::FunctionType* funcType = origMeth->getSignature(); + VMMethod* origMeth = compilingClass->assembly->getMethodFromToken(value, genClass, genMethod); + const llvm::FunctionType* funcType = origMeth->getSignature(genMethod); std::vector args; makeArgs(funcType, args, origMeth->structReturn); @@ -202,7 +202,7 @@ rcache = cache; } - Function* func = dmeth->compiledPtr(); + Function* func = dmeth->compiledPtr(NULL); rcache->methPtr = mvm::jit::executionEngine->getPointerToGlobal(func); rcache->lastCible = (VMClass*)ocl; rcache->box = (dmeth->classDef->super == MSCorlib::pValue); Modified: vmkit/trunk/lib/N3/VMCore/VMClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.cpp?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMClass.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/VMClass.cpp Mon Aug 18 17:22:15 2008 @@ -196,12 +196,12 @@ } -void VMCommonClass::loadParents() { +void VMCommonClass::loadParents(VMGenericClass* genClass, VMGenericMethod* genMethod) { if ((0xffff & superToken) == 0) { depth = 0; display.push_back(this); } else { - super = assembly->loadType((N3*)vm, superToken, true, false, false, true); + super = assembly->loadType((N3*)vm, superToken, true, false, false, true, genClass, genMethod); depth = super->depth + 1; for (uint32 i = 0; i < super->display.size(); ++i) { display.push_back(super->display[i]); @@ -212,14 +212,14 @@ for (std::vector::iterator i = interfacesToken.begin(), e = interfacesToken.end(); i!= e; ++i) { interfaces.push_back((VMClass*)assembly->loadType((N3*)vm, (*i), true, - false, false, true)); + false, false, true, genClass, genMethod)); } } typedef void (*clinit_t)(void); -void VMCommonClass::clinitClass() { +void VMCommonClass::clinitClass(VMGenericMethod* genMethod) { VMCommonClass* cl = this; if (cl->status < ready) { cl->aquire(); @@ -230,10 +230,10 @@ cl->status = clinitParent; cl->release(); if (cl->super) { - cl->super->resolveStatic(true); + cl->super->resolveStatic(true, genMethod); } for (uint32 i = 0; i < cl->interfaces.size(); i++) { - cl->interfaces[i]->resolveStatic(true); + cl->interfaces[i]->resolveStatic(true, genMethod); } cl->status = inClinit; @@ -249,7 +249,7 @@ cl->printString()); if (meth) { - llvm::Function* pred = meth->compiledPtr(); + llvm::Function* pred = meth->compiledPtr(genMethod); clinit_t res = (clinit_t) (intptr_t)mvm::jit::executionEngine->getPointerToGlobal(pred); res(); @@ -269,7 +269,7 @@ } } -void VMClass::resolveStaticFields() { +void VMClass::resolveStaticFields(VMGenericMethod* genMethod) { VMClass* cl = this; @@ -283,7 +283,7 @@ } for (std::vector::iterator i = cl->staticFields.begin(), e = cl->staticFields.end(); i!= e; ++i) { - (*i)->signature->resolveType(false, false); + (*i)->signature->resolveType(false, false, genMethod); fields.push_back((*i)->signature->naturalType); } @@ -302,16 +302,16 @@ } } -void VMClass::unifyTypes() { +void VMClass::unifyTypes(VMGenericClass* genClass, VMGenericMethod* genMethod) { PATypeHolder PA = naturalType; for (std::vector::iterator i = virtualFields.begin(), e = virtualFields.end(); i!= e; ++i) { - (*i)->signature->resolveVirtual(); + (*i)->signature->resolveVirtual(genClass, genMethod); } naturalType = PA.get(); } -void VMClass::resolveVirtualFields() { +void VMClass::resolveVirtualFields(VMGenericClass* genClass, VMGenericMethod* genMethod) { const llvm::Type* ResultTy = 0; if (hasExplicitLayout(flags)) { explicitLayoutSize = assembly->getExplicitLayout(token); @@ -362,7 +362,7 @@ naturalType = ResultTy; } - unifyTypes(); + unifyTypes(genClass, genMethod); if (super == MSCorlib::pValue) { std::vector Elts; @@ -398,9 +398,9 @@ naturalType = pType; } -void VMCommonClass::resolveVirtual() { +void VMCommonClass::resolveVirtual(VMGenericClass* genClass, VMGenericMethod *genMethod) { VMCommonClass* cl = this; - //printf("*** Resolving: %s\n", cl->printString()); + if (cl->status < virtual_resolved) { cl->aquire(); int status = cl->status; @@ -413,23 +413,23 @@ if (cl->isArray) { VMClassArray* arrayCl = (VMClassArray*)cl; VMCommonClass* baseClass = arrayCl->baseClass; - baseClass->resolveType(false, false); + baseClass->resolveType(false, false, genMethod); arrayCl->makeType(); cl->status = virtual_resolved; } else if (cl->isPointer) { VMClassPointer* pointerCl = (VMClassPointer*)cl; VMCommonClass* baseClass = pointerCl->baseClass; - baseClass->resolveType(false, false); + baseClass->resolveType(false, false, genMethod); pointerCl->makeType(); cl->status = virtual_resolved; } else { cl->release(); - cl->loadParents(); + cl->loadParents(genClass, genMethod); cl->aquire(); cl->status = prepared; - assembly->readClass(cl); + assembly->readClass(cl, genMethod); cl->status = readed; - ((VMClass*)cl)->resolveVirtualFields(); + ((VMClass*)cl)->resolveVirtualFields(genClass, genMethod); cl->status = virtual_resolved; } cl->release(); @@ -473,20 +473,12 @@ } } -void VMCommonClass::resolveType(bool stat, bool clinit) { - // save previous current generic class to restore it later - VMGenericClass* old = VMThread::get()->currGenericClass; - // temporarily store the class being compiled in case it is a generic class - VMThread::get()->currGenericClass = dynamic_cast(this); - - resolveVirtual(); - if (stat) resolveStatic(clinit); - - // restore saved class - VMThread::get()->currGenericClass = old; +void VMCommonClass::resolveType(bool stat, bool clinit, VMGenericMethod* genMethod) { + resolveVirtual(dynamic_cast(this), genMethod); + if (stat) resolveStatic(clinit, genMethod); } -void VMCommonClass::resolveStatic(bool clinit) { +void VMCommonClass::resolveStatic(bool clinit, VMGenericMethod* genMethod) { VMCommonClass* cl = this; if (cl->status < static_resolved) { cl->aquire(); @@ -500,15 +492,15 @@ if (cl->isArray) { VMClassArray* arrayCl = (VMClassArray*)cl; VMCommonClass* baseClass = arrayCl->baseClass; - baseClass->resolveStatic(false); + baseClass->resolveStatic(false, genMethod); cl->status = static_resolved; } else if (cl->isPointer) { VMClassPointer* pointerCl = (VMClassPointer*)cl; VMCommonClass* baseClass = pointerCl->baseClass; - baseClass->resolveStatic(false); + baseClass->resolveStatic(false, genMethod); cl->status = static_resolved; } else { - ((VMClass*)cl)->resolveStaticFields(); + ((VMClass*)cl)->resolveStaticFields(genMethod); cl->status = static_resolved; } cl->release(); @@ -521,7 +513,7 @@ cl->release(); } } - if (clinit) cl->clinitClass(); + if (clinit) cl->clinitClass(genMethod); } @@ -628,7 +620,7 @@ } VMObject* VMClass::doNew() { - if (status < inClinit) resolveType(true, true); + if (status < inClinit) resolveType(true, true, NULL); uint64 size = mvm::jit::getTypeSize(virtualType->getContainedType(0)); VMObject* res = (VMObject*) gc::operator new(size, virtualInstance->getVirtualTable()); @@ -637,7 +629,7 @@ } VMObject* VMClassArray::doNew(uint32 nb) { - if (status < inClinit) resolveType(true, true); + if (status < inClinit) resolveType(true, true, NULL); uint64 size = mvm::jit::getTypeSize(baseClass->naturalType); VMArray* res = (VMArray*) gc::operator new(size * nb + sizeof(VMObject) + sizeof(sint32), arrayVT); @@ -694,13 +686,13 @@ const llvm::FunctionType* VMMethod::resolveSignature( std::vector & parameters, bool isVirt, - bool& structRet) { + bool& structRet, VMGenericMethod* genMethod) { const llvm::Type* ret; std::vector args; std::vector::iterator i = parameters.begin(), e = parameters.end(); if ((*i)->naturalType->isAbstract()) { - (*i)->resolveType(false, false); + (*i)->resolveType(false, false, genMethod); } ret = (*i)->naturalType; ++i; @@ -709,7 +701,7 @@ VMCommonClass* cur = (*i); ++i; if (cur->naturalType->isAbstract()) { - cur->resolveType(false, false); + cur->resolveType(false, false, genMethod); } if (cur->super != MSCorlib::pValue && cur->super != MSCorlib::pEnum) { args.push_back(cur->naturalType); @@ -721,7 +713,7 @@ for ( ; i!= e; ++i) { VMCommonClass* cur = (*i); if (cur->naturalType->isAbstract()) { - cur->resolveType(false, false); + cur->resolveType(false, false, genMethod); } if (cur->naturalType->isSingleValueType()) { args.push_back(cur->naturalType); @@ -740,17 +732,17 @@ return llvm::FunctionType::get(ret, args, false); } -const llvm::FunctionType* VMMethod::getSignature() { +const llvm::FunctionType* VMMethod::getSignature(VMGenericMethod* genMethod) { if (!_signature) { - _signature = resolveSignature(parameters, !isStatic(flags), structReturn); + _signature = resolveSignature(parameters, !isStatic(flags), structReturn, genMethod); } return _signature; } -const llvm::FunctionType* Property::getSignature() { +const llvm::FunctionType* Property::getSignature(VMGenericMethod* genMethod) { if (!_signature) { bool structReturn = false; - _signature = VMMethod::resolveSignature(parameters, virt, structReturn); + _signature = VMMethod::resolveSignature(parameters, virt, structReturn, genMethod); } return _signature; } @@ -839,10 +831,15 @@ std::vector::iterator i = parameters.begin(), a = args.begin(), e = args.end(); + // dummy classes for generic arguments have a NULL assembly field + // check whether both i and a point to a dummy class if (((*i)->assembly == NULL && (*a)->assembly != NULL) || ((*i)->assembly != NULL && (*a)->assembly == NULL)) return false; + // dummy classes for generic arguments contain the + // argument number in the token field + // signature is only equal if the argument number matches if ((*i)->assembly == NULL && (*a)->assembly == NULL) { if ((*i)->token != (*a)->token) { return false; @@ -860,10 +857,15 @@ } for (; a != e; ++i, ++a) { + // dummy classes for generic arguments have a NULL assembly field + // check whether both i and a point to a dummy class if (((*i)->assembly == NULL && (*a)->assembly != NULL) || ((*i)->assembly != NULL && (*a)->assembly == NULL)) return false; + // dummy classes for generic arguments contain the + // argument number in the token field + // signature is only equal if the argument number matches if ((*i)->assembly == NULL && (*a)->assembly == NULL) { if ((*i)->token != (*a)->token) { return false; Modified: vmkit/trunk/lib/N3/VMCore/VMClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.h?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMClass.h (original) +++ vmkit/trunk/lib/N3/VMCore/VMClass.h Mon Aug 18 17:22:15 2008 @@ -35,6 +35,8 @@ class VMField; class VMMethod; class VMObject; +class VMGenericClass; +class VMGenericMethod; typedef enum VMClassState { hashed = 0, loaded, prepared, readed, virtual_resolved, static_resolved, clinitParent, inClinit, ready @@ -98,12 +100,12 @@ bool isAssignableFrom(VMCommonClass* cl); void assignType(); - void clinitClass(); - void resolveStatic(bool clinit); - void resolveVirtual(); + void clinitClass(VMGenericMethod* genMethod); + void resolveStatic(bool clinit, VMGenericMethod* genMethod); + void resolveVirtual(VMGenericClass* genClass, VMGenericMethod* genMethod); void resolveVT(); - void resolveType(bool stat, bool clinit); - void loadParents(); + void resolveType(bool stat, bool clinit, VMGenericMethod* genMethod); + void loadParents(VMGenericClass* genClass, VMGenericMethod* genMethod); VMMethod* lookupMethodDontThrow(const UTF8* name, std::vector& args, @@ -133,9 +135,9 @@ virtual void TRACER; void resolveFields(); - void resolveStaticFields(); - void resolveVirtualFields(); - void unifyTypes(); + void resolveStaticFields(VMGenericMethod* genMethod); + void resolveVirtualFields(VMGenericClass* genClass, VMGenericMethod* genMethod); + void unifyTypes(VMGenericClass* genClass, VMGenericMethod* genMethod); VMObject* staticInstance; VMObject* virtualInstance; @@ -150,6 +152,8 @@ uint32 explicitLayoutSize; }; +// FIXME try to get rid of this class +// add flag to VMClass instead class VMGenericClass : public VMClass { public: static VirtualTable* VT; @@ -210,7 +214,7 @@ std::vector > caches; std::vector parameters; VMClass* classDef; - llvm::Function* compiledPtr(); + llvm::Function* compiledPtr(VMGenericMethod* genMethod); llvm::Function* methPtr; const UTF8* name; const llvm::FunctionType* _signature; @@ -226,15 +230,17 @@ llvm::GenericValue operator()(std::vector& args); llvm::GenericValue run(...); - const llvm::FunctionType* getSignature(); + const llvm::FunctionType* getSignature(VMGenericMethod* genMethod); static const llvm::FunctionType* resolveSignature( - std::vector& params, bool isVirt, bool &structRet); + std::vector& params, bool isVirt, bool &structRet, VMGenericMethod* genMethod); bool signatureEquals(std::vector& args); bool signatureEqualsGeneric(std::vector& args); llvm::GlobalVariable* llvmVar(); llvm::GlobalVariable* _llvmVar; }; +// FIXME try to get rid of this class +// add flag to VMMethod instead class VMGenericMethod : public VMMethod { public: static VirtualTable* VT; @@ -298,7 +304,7 @@ std::vector parameters; VMCommonClass* type; const llvm::FunctionType* _signature; - const llvm::FunctionType* getSignature(); + const llvm::FunctionType* getSignature(VMGenericMethod* genMethod); bool virt; const UTF8* name; VMObject* delegatee; Modified: vmkit/trunk/lib/N3/VMCore/VMThread.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMThread.cpp?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMThread.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/VMThread.cpp Mon Aug 18 17:22:15 2008 @@ -60,9 +60,6 @@ key->pendingException = 0; key->perFunctionPasses = new llvm::FunctionPassManager(vm->TheModuleProvider); key->perFunctionPasses->add(new llvm::TargetData(vm->module)); - key->currGenericClass = NULL; - key->currGenericMethod = NULL; - key->genMethodInstantiation = NULL; AddStandardCompilePasses(key->perFunctionPasses); return key; } Modified: vmkit/trunk/lib/N3/VMCore/VMThread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMThread.h?rev=54951&r1=54950&r2=54951&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMThread.h (original) +++ vmkit/trunk/lib/N3/VMCore/VMThread.h Mon Aug 18 17:22:15 2008 @@ -41,14 +41,6 @@ unsigned int interruptFlag; unsigned int state; - // helper which points to the current generic class - VMGenericClass* currGenericClass; - // helper which contains the instantiation of the - // current generic method - std::vector* genMethodInstantiation; - // helper which points to the current generic method - VMGenericMethod* currGenericMethod; - static const unsigned int StateRunning; static const unsigned int StateWaiting; static const unsigned int StateInterrupted; From nicolas.geoffray at lip6.fr Tue Aug 19 08:44:19 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 19 Aug 2008 15:44:19 -0000 Subject: [vmkit-commits] [vmkit] r54989 - in /vmkit/trunk/tools: jnjvm/Makefile n3-mono/Makefile n3-pnetlib/Makefile vmkit/Makefile Message-ID: <200808191544.m7JFiLZE029693@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 19 10:44:06 2008 New Revision: 54989 URL: http://llvm.org/viewvc/llvm-project?rev=54989&view=rev Log: Only link with jit and nativecodegen, not the whole engine. Modified: vmkit/trunk/tools/jnjvm/Makefile vmkit/trunk/tools/n3-mono/Makefile vmkit/trunk/tools/n3-pnetlib/Makefile vmkit/trunk/tools/vmkit/Makefile Modified: vmkit/trunk/tools/jnjvm/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/jnjvm/Makefile?rev=54989&r1=54988&r2=54989&view=diff ============================================================================== --- vmkit/trunk/tools/jnjvm/Makefile (original) +++ vmkit/trunk/tools/jnjvm/Makefile Tue Aug 19 10:44:06 2008 @@ -12,6 +12,6 @@ TOOLNAME = jnjvm USEDLIBS = Allocator CommonThread Mvm JnJVM Classpath $(GCLIB) -LINK_COMPONENTS = engine scalaropts instrumentation ipa ipo +LINK_COMPONENTS = jit nativecodegen scalaropts instrumentation ipa ipo include $(LEVEL)/Makefile.common Modified: vmkit/trunk/tools/n3-mono/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/n3-mono/Makefile?rev=54989&r1=54988&r2=54989&view=diff ============================================================================== --- vmkit/trunk/tools/n3-mono/Makefile (original) +++ vmkit/trunk/tools/n3-mono/Makefile Tue Aug 19 10:44:06 2008 @@ -11,7 +11,7 @@ include $(LEVEL)/Makefile.config TOOLNAME = n3-mono -LINK_COMPONENTS = engine scalaropts instrumentation ipa ipo +LINK_COMPONENTS = jit nativecodegen scalaropts instrumentation ipa ipo USEDLIBS = Allocator CommonThread Mvm N3 $(GCLIB) Mono include $(LEVEL)/Makefile.common Modified: vmkit/trunk/tools/n3-pnetlib/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/n3-pnetlib/Makefile?rev=54989&r1=54988&r2=54989&view=diff ============================================================================== --- vmkit/trunk/tools/n3-pnetlib/Makefile (original) +++ vmkit/trunk/tools/n3-pnetlib/Makefile Tue Aug 19 10:44:06 2008 @@ -11,7 +11,7 @@ include $(LEVEL)/Makefile.config TOOLNAME = n3-pnetlib -LINK_COMPONENTS = engine scalaropts instrumentation ipa ipo +LINK_COMPONENTS = jit nativecodegen scalaropts instrumentation ipa ipo USEDLIBS = Allocator CommonThread Mvm N3 $(GCLIB) PNetLib include $(LEVEL)/Makefile.common Modified: vmkit/trunk/tools/vmkit/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmkit/Makefile?rev=54989&r1=54988&r2=54989&view=diff ============================================================================== --- vmkit/trunk/tools/vmkit/Makefile (original) +++ vmkit/trunk/tools/vmkit/Makefile Tue Aug 19 10:44:06 2008 @@ -21,7 +21,7 @@ USEDLIBS += N3 PNetLib endif -LINK_COMPONENTS = engine scalaropts instrumentation ipa ipo +LINK_COMPONENTS = jit nativecodegen scalaropts instrumentation ipa ipo include $(LEVEL)/Makefile.common From nicolas.geoffray at lip6.fr Tue Aug 19 09:26:56 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 19 Aug 2008 16:26:56 -0000 Subject: [vmkit-commits] [vmkit] r54990 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Message-ID: <200808191626.m7JGQvVJ030938@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 19 11:26:52 2008 New Revision: 54990 URL: http://llvm.org/viewvc/llvm-project?rev=54990&view=rev Log: Avoid warning when inlining getClassInfo. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=54990&r1=54989&r2=54990&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Tue Aug 19 11:26:52 2008 @@ -354,9 +354,9 @@ static LLVMCommonClassInfo* getClassInfo(CommonClass* cl) { if (cl->isArray || cl->isPrimitive) { return cl->getInfo(); - } else { - return cl->getInfo(); - } + } + + return cl->getInfo(); } static LLVMFieldInfo* getFieldInfo(JavaField* field) { From nicolas.geoffray at lip6.fr Tue Aug 19 09:29:03 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 19 Aug 2008 16:29:03 -0000 Subject: [vmkit-commits] [vmkit] r54991 - /vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Message-ID: <200808191629.m7JGT3Qp031007@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 19 11:29:02 2008 New Revision: 54991 URL: http://llvm.org/viewvc/llvm-project?rev=54991&view=rev Log: Do not register the frame registering function, LLVM already does it. Modified: vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Modified: vmkit/trunk/lib/Mvm/Runtime/JIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/JIT.cpp?rev=54991&r1=54990&r2=54991&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/JIT.cpp (original) +++ vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Tue Aug 19 11:29:02 2008 @@ -48,8 +48,6 @@ printf("%s\n", obj->printString()); } -extern "C" void __register_frame(void*); - namespace mvm { namespace llvm_runtime { #include "LLVMRuntime.inc" @@ -65,7 +63,6 @@ executionEngine = ExecutionEngine::createJIT(globalModuleProvider, 0, memoryManager); - executionEngine->InstallExceptionTableRegister(__register_frame); std::string str = executionEngine->getTargetData()->getStringRepresentation(); module->setDataLayout(str); From nicolas.geoffray at lip6.fr Wed Aug 20 00:25:30 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 20 Aug 2008 07:25:30 -0000 Subject: [vmkit-commits] [vmkit] r55040 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Message-ID: <200808200725.m7K7PUNH028504@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 20 02:25:29 2008 New Revision: 55040 URL: http://llvm.org/viewvc/llvm-project?rev=55040&view=rev Log: Shorten the number of optimization passes. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=55040&r1=55039&r2=55040&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Wed Aug 20 02:25:29 2008 @@ -196,11 +196,7 @@ addPass(PM, llvm::createCFGSimplificationPass()); // Clean up disgusting code addPass(PM, llvm::createPromoteMemoryToRegisterPass());// Kill useless allocas - addPass(PM, llvm::createInstructionCombiningPass()); // Clean up after IPCP & DAE - addPass(PM, llvm::createCFGSimplificationPass()); // Clean up after IPCP & DAE - addPass(PM, createTailDuplicationPass()); // Simplify cfg by copying code - addPass(PM, createSimplifyLibCallsPass()); // Library Call Optimizations addPass(PM, createInstructionCombiningPass()); // Cleanup for scalarrepl. addPass(PM, createJumpThreadingPass()); // Thread jumps. addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs @@ -208,21 +204,17 @@ addPass(PM, createInstructionCombiningPass()); // Combine silly seq's addPass(PM, createCondPropagationPass()); // Propagate conditionals - addPass(PM, createTailCallEliminationPass()); // Eliminate tail calls addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs //addPass(PM, createPredicateSimplifierPass()); addPass(PM, createReassociatePass()); // Reassociate expressions - addPass(PM, createLoopRotatePass()); addPass(PM, createLICMPass()); // Hoist loop invariants addPass(PM, createLoopUnswitchPass()); // Unswitch loops. - addPass(PM, createLoopIndexSplitPass()); // Index split loops. addPass(PM, createIndVarSimplifyPass()); // Canonicalize indvars addPass(PM, createLoopDeletionPass()); // Delete dead loops addPass(PM, createLoopUnrollPass()); // Unroll small loops*/ addPass(PM, createInstructionCombiningPass()); // Clean up after the unroller addPass(PM, createGVNPass()); // Remove redundancies - addPass(PM, createMemCpyOptPass()); // Remove memcpy / form memset addPass(PM, createSCCPPass()); // Constant prop with SCCP addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs From nicolas.geoffray at lip6.fr Wed Aug 20 03:26:05 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 20 Aug 2008 10:26:05 -0000 Subject: [vmkit-commits] [vmkit] r55043 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.h JavaInitialise.cpp JnjvmClassLoader.h VirtualTables.cpp Message-ID: <200808201026.m7KAQ6xk016358@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 20 05:26:03 2008 New Revision: 55043 URL: http://llvm.org/viewvc/llvm-project?rev=55043&view=rev Log: Rename sharedLoader and remove CommonClass::VT. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=55043&r1=55042&r2=55043&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Wed Aug 20 05:26:03 2008 @@ -416,11 +416,6 @@ /// CommonClass(JnjvmClassLoader* loader, const UTF8* name, bool isArray); - /// VT - The virtual table of instances of this class (TODO: should be - /// removed). - /// - static VirtualTable* VT; - /// ~CommonClass - Free memory used by this class, and remove it from /// metadata. /// @@ -442,6 +437,12 @@ return static_cast(JInfo); } +#ifdef MULTIPLE_VM + bool isSharedClass() { + return loader == JnjvmClassLoader::sharedLoader; + } +#endif + }; /// ClassPrimitive - This class represents internal classes for primitive Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp?rev=55043&r1=55042&r2=55043&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp Wed Aug 20 05:26:03 2008 @@ -40,7 +40,6 @@ X fake; \ X::VT = ((void**)(void*)(&fake))[0]; } - INIT(CommonClass); INIT(Class); INIT(ClassArray); INIT(JavaThread); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=55043&r1=55042&r2=55043&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Wed Aug 20 05:26:03 2008 @@ -215,9 +215,9 @@ static JnjvmBootstrapLoader* bootstrapLoader; #ifdef MULTIPLE_VM - /// SharedLoader - Shared loader when multiple vms are executing. + /// sharedLoader - Shared loader when multiple vms are executing. /// - static JnjvmClassLoader* SharedLoader; + static JnjvmClassLoader* sharedLoader; #endif /// ~JnjvmClassLoader - Destroy the loader. Depending on the JVM Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=55043&r1=55042&r2=55043&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Wed Aug 20 05:26:03 2008 @@ -27,7 +27,6 @@ INIT(JavaArray); INIT(ArrayObject); - INIT(CommonClass); INIT(Class); INIT(ClassArray); INIT(JavaObject); From nicolas.geoffray at lip6.fr Wed Aug 20 03:36:39 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 20 Aug 2008 10:36:39 -0000 Subject: [vmkit-commits] [vmkit] r55044 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.h JavaConstantPool.cpp Message-ID: <200808201036.m7KAad5v016661@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 20 05:36:39 2008 New Revision: 55044 URL: http://llvm.org/viewvc/llvm-project?rev=55044&view=rev Log: Typo, + verify a class is shared if it is referenced by a shared class in the constant pool. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=55044&r1=55043&r2=55044&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Wed Aug 20 05:36:39 2008 @@ -439,7 +439,7 @@ #ifdef MULTIPLE_VM bool isSharedClass() { - return loader == JnjvmClassLoader::sharedLoader; + return classLoader == JnjvmClassLoader::sharedLoader; } #endif Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=55044&r1=55043&r2=55044&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Wed Aug 20 05:36:39 2008 @@ -290,12 +290,17 @@ JnjvmClassLoader* loader = classDef->classLoader; const UTF8* name = UTF8At(ctpDef[index]); if (name->elements[0] == AssessorDesc::I_TAB) { - // Don't put into ctpRes because the class can be isolate specific temp = loader->constructArray(name); } else { // Put into ctpRes because there is only one representation of the class - ctpRes[index] = temp = loader->loadName(name, false, false, false); + temp = loader->loadName(name, false, false, false); } +#ifdef MULTIPLE_VM + if (classDef->isSharedClass() && !temp->isSharedClass()) { + JavaThread::get()->isolate->unknownError("Class sharing violation"); + } +#endif + ctpRes[index] = temp; } return temp; } @@ -309,6 +314,11 @@ if (!temp) temp = JnjvmClassLoader::bootstrapLoader->lookupClass(name); } +#ifdef MULTIPLE_VM + if (temp && classDef->isSharedClass() && !temp->isSharedClass()) { + JavaThread::get()->isolate->unknownError("Class sharing violation"); + } +#endif return temp; } From nicolas.geoffray at lip6.fr Wed Aug 20 05:44:41 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 20 Aug 2008 12:44:41 -0000 Subject: [vmkit-commits] [vmkit] r55045 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathVMClassLoader.cpp.inc VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/JavaConstantPool.cpp VMCore/Jnjvm.cpp VMCore/Jnjvm.h VMCore/JnjvmClassLoader.cpp VMCore/JnjvmClassLoader.h Message-ID: <200808201244.m7KCifv4020268@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 20 07:44:39 2008 New Revision: 55045 URL: http://llvm.org/viewvc/llvm-project?rev=55045&view=rev Log: Change how we get the delegatee of a class, and how classes are construcuted. They now require the array of bytes to construct them. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc 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/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc?rev=55045&r1=55044&r2=55045&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc Wed Aug 20 07:44:39 2008 @@ -92,22 +92,9 @@ JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader); JavaString* str = (JavaString*)_str; const UTF8* name = str->value->javaToInternal(JCL->hashUTF8, str->offset, str->count); - Class* cl = JCL->constructClass(name); + Class* cl = JCL->constructClass(name, (ArrayUInt8*)bytes); - if (cl->status == hashed) { - cl->acquire(); - if (cl->status == hashed) { - cl->bytes = (ArrayUInt8*)bytes; - cl->status = loaded; -#ifndef MULTIPLE_VM - cl->delegatee = (JavaObject*)pd; -#else - JavaThread::get()->isolate->delegatees->hash(cl, (JavaObject*)pd); -#endif - } - cl->release(); - } - return (jclass)(cl->getClassDelegatee()); + return (jclass)(cl->getClassDelegatee((JavaObject*)pd)); } JNIEXPORT void JNICALL Java_java_lang_VMClassLoader_resolveClass( Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=55045&r1=55044&r2=55045&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Wed Aug 20 07:44:39 2008 @@ -524,8 +524,8 @@ } -JavaObject* CommonClass::getClassDelegatee() { - return JavaThread::get()->isolate->getClassDelegatee(this); +JavaObject* CommonClass::getClassDelegatee(JavaObject* pd) { + return JavaThread::get()->isolate->getClassDelegatee(this, pd); } void CommonClass::resolveClass(bool doClinit) { Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=55045&r1=55044&r2=55045&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Wed Aug 20 07:44:39 2008 @@ -378,7 +378,7 @@ /// getClassDelegatee - Return the java/lang/Class representation of this /// class. /// - JavaObject* getClassDelegatee(); + JavaObject* getClassDelegatee(JavaObject* pd = 0); /// initialiseClass - If the class has a static initializer and has not been /// initialized yet, call it. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=55045&r1=55044&r2=55045&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Wed Aug 20 07:44:39 2008 @@ -296,7 +296,7 @@ temp = loader->loadName(name, false, false, false); } #ifdef MULTIPLE_VM - if (classDef->isSharedClass() && !temp->isSharedClass()) { + if (temp && classDef->isSharedClass() && !temp->isSharedClass()) { JavaThread::get()->isolate->unknownError("Class sharing violation"); } #endif Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55045&r1=55044&r2=55045&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Wed Aug 20 07:44:39 2008 @@ -321,37 +321,35 @@ } #ifndef MULTIPLE_VM -JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl) { +JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl, JavaObject* pd) { cl->acquire(); if (!(cl->delegatee)) { JavaObject* delegatee = Classpath::newClass->doNew(this); cl->delegatee = delegatee; - Classpath::initClass->invokeIntSpecial(this, delegatee, cl); - } else if (cl->delegatee->classOf != Classpath::newClass) { - JavaObject* pd = cl->delegatee; - JavaObject* delegatee = Classpath::newClass->doNew(this); - cl->delegatee = delegatee;; - Classpath::initClassWithProtectionDomain->invokeIntSpecial(this, delegatee, - cl, pd); + if (!pd) { + Classpath::initClass->invokeIntSpecial(this, delegatee, cl); + } else { + Classpath::initClassWithProtectionDomain->invokeIntSpecial(this, + delegatee, + cl, pd); + } } cl->release(); return cl->delegatee; } #else -JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl) { +JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl, JavaObject* pd) { cl->acquire(); - JavaObject* val = delegatees->lookup(cl); + JavaObject* val = this->delegatees->lookup(cl); if (!val) { val = Classpath::newClass->doNew(this); delegatees->hash(cl, val); - Classpath::initClass->invokeIntSpecial(this, val, cl); - } else if (val->classOf != Classpath::newClass) { - JavaObject* pd = val; - val = Classpath::newClass->doNew(this); - delegatees->remove(cl); - delegatees->hash(cl, val); - Classpath::initClassWithProtectionDomain->invokeIntSpecial(this, val, cl, + if (!pd) { + Classpath::initClass->invokeIntSpecial(this, val, cl); + } else { + Classpath::initClassWithProtectionDomain->invokeIntSpecial(this, val, cl, pd); + } } cl->release(); return val; Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=55045&r1=55044&r2=55045&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Wed Aug 20 07:44:39 2008 @@ -329,7 +329,7 @@ /// getClassDelegatee - Get the java/lang/Class object representing the /// internal class. /// - JavaObject* getClassDelegatee(CommonClass*); + JavaObject* getClassDelegatee(CommonClass* cl, JavaObject* pd = 0); /// ~Jnjvm - Destroy the JVM. /// Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55045&r1=55044&r2=55045&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Wed Aug 20 07:44:39 2008 @@ -26,6 +26,10 @@ JnjvmBootstrapLoader* JnjvmClassLoader::bootstrapLoader = 0; +#ifdef MULTIPLE_VM +JnjvmClassLoader* JnjvmClassLoader::sharedLoader = 0; +#endif + extern const char* GNUClasspathGlibj; extern const char* GNUClasspathLibs; @@ -256,10 +260,13 @@ CommonClass* cl = lookupClass(name); - if (!cl || cl->status == hashed) { - ArrayUInt8* bytes = bootstrapLoader->openName(name); + if (!cl) { + ArrayUInt8* bytes = openName(name); + if (bytes) + cl = constructClass(name, bytes); + } else if (cl->status == hashed) { + ArrayUInt8* bytes = openName(name); if (bytes) { - if (!cl) cl = bootstrapLoader->constructClass(name); if (cl->status == hashed) { cl->acquire(); if (cl->status == hashed) { @@ -401,13 +408,26 @@ } -static CommonClass* classDup(const UTF8*& name, JnjvmClassLoader* loader) { - Class* cl = allocator_new(loader->allocator, Class)(loader, name); - return cl; -} - -Class* JnjvmClassLoader::constructClass(const UTF8* name) { - Class* res = (Class*)classes->lookupOrCreate(name, this, classDup); +Class* JnjvmClassLoader::constructClass(const UTF8* name, ArrayUInt8* bytes) { + classes->lock->lock(); + ClassMap::iterator End = classes->map.end(); + ClassMap::iterator I = classes->map.find(name); + Class* res = 0; + if (I == End) { + res = allocator_new(allocator, Class)(this, name); + if (bytes) { + res->bytes = bytes; + res->status = loaded; + } + classes->map.insert(std::make_pair(name, res)); + } else { + res = ((Class*)(I->second)); + if (res->status == hashed && bytes) { + res->bytes = bytes; + res->status = loaded; + } + } + classes->lock->unlock(); return res; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=55045&r1=55044&r2=55045&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Wed Aug 20 07:44:39 2008 @@ -189,7 +189,7 @@ /// constructClass - Hashes a runtime representation of a class with /// the given name. /// - Class* constructClass(const UTF8* name); + Class* constructClass(const UTF8* name, ArrayUInt8* bytes = 0); /// constructType - Hashes a Typedef, an internal representation of a class /// still not loaded. From nicolas.geoffray at lip6.fr Wed Aug 20 06:02:16 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 20 Aug 2008 13:02:16 -0000 Subject: [vmkit-commits] [vmkit] r55046 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathVMClassLoader.cpp.inc VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/JavaConstantPool.cpp VMCore/Jnjvm.cpp VMCore/Jnjvm.h VMCore/JnjvmClassLoader.cpp VMCore/JnjvmClassLoader.h Message-ID: <200808201302.m7KD2GeO020812@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 20 08:02:15 2008 New Revision: 55046 URL: http://llvm.org/viewvc/llvm-project?rev=55046&view=rev Log: Revert 55045, it causes single vm to segfault. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc 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/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc?rev=55046&r1=55045&r2=55046&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc Wed Aug 20 08:02:15 2008 @@ -92,9 +92,22 @@ JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader); JavaString* str = (JavaString*)_str; const UTF8* name = str->value->javaToInternal(JCL->hashUTF8, str->offset, str->count); - Class* cl = JCL->constructClass(name, (ArrayUInt8*)bytes); + Class* cl = JCL->constructClass(name); - return (jclass)(cl->getClassDelegatee((JavaObject*)pd)); + if (cl->status == hashed) { + cl->acquire(); + if (cl->status == hashed) { + cl->bytes = (ArrayUInt8*)bytes; + cl->status = loaded; +#ifndef MULTIPLE_VM + cl->delegatee = (JavaObject*)pd; +#else + JavaThread::get()->isolate->delegatees->hash(cl, (JavaObject*)pd); +#endif + } + cl->release(); + } + return (jclass)(cl->getClassDelegatee()); } JNIEXPORT void JNICALL Java_java_lang_VMClassLoader_resolveClass( Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=55046&r1=55045&r2=55046&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Wed Aug 20 08:02:15 2008 @@ -524,8 +524,8 @@ } -JavaObject* CommonClass::getClassDelegatee(JavaObject* pd) { - return JavaThread::get()->isolate->getClassDelegatee(this, pd); +JavaObject* CommonClass::getClassDelegatee() { + return JavaThread::get()->isolate->getClassDelegatee(this); } void CommonClass::resolveClass(bool doClinit) { Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=55046&r1=55045&r2=55046&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Wed Aug 20 08:02:15 2008 @@ -378,7 +378,7 @@ /// getClassDelegatee - Return the java/lang/Class representation of this /// class. /// - JavaObject* getClassDelegatee(JavaObject* pd = 0); + JavaObject* getClassDelegatee(); /// initialiseClass - If the class has a static initializer and has not been /// initialized yet, call it. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=55046&r1=55045&r2=55046&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Wed Aug 20 08:02:15 2008 @@ -296,7 +296,7 @@ temp = loader->loadName(name, false, false, false); } #ifdef MULTIPLE_VM - if (temp && classDef->isSharedClass() && !temp->isSharedClass()) { + if (classDef->isSharedClass() && !temp->isSharedClass()) { JavaThread::get()->isolate->unknownError("Class sharing violation"); } #endif Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55046&r1=55045&r2=55046&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Wed Aug 20 08:02:15 2008 @@ -321,35 +321,37 @@ } #ifndef MULTIPLE_VM -JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl, JavaObject* pd) { +JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl) { cl->acquire(); if (!(cl->delegatee)) { JavaObject* delegatee = Classpath::newClass->doNew(this); cl->delegatee = delegatee; - if (!pd) { - Classpath::initClass->invokeIntSpecial(this, delegatee, cl); - } else { - Classpath::initClassWithProtectionDomain->invokeIntSpecial(this, - delegatee, - cl, pd); - } + Classpath::initClass->invokeIntSpecial(this, delegatee, cl); + } else if (cl->delegatee->classOf != Classpath::newClass) { + JavaObject* pd = cl->delegatee; + JavaObject* delegatee = Classpath::newClass->doNew(this); + cl->delegatee = delegatee;; + Classpath::initClassWithProtectionDomain->invokeIntSpecial(this, delegatee, + cl, pd); } cl->release(); return cl->delegatee; } #else -JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl, JavaObject* pd) { +JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl) { cl->acquire(); - JavaObject* val = this->delegatees->lookup(cl); + JavaObject* val = delegatees->lookup(cl); if (!val) { val = Classpath::newClass->doNew(this); delegatees->hash(cl, val); - if (!pd) { - Classpath::initClass->invokeIntSpecial(this, val, cl); - } else { - Classpath::initClassWithProtectionDomain->invokeIntSpecial(this, val, cl, + Classpath::initClass->invokeIntSpecial(this, val, cl); + } else if (val->classOf != Classpath::newClass) { + JavaObject* pd = val; + val = Classpath::newClass->doNew(this); + delegatees->remove(cl); + delegatees->hash(cl, val); + Classpath::initClassWithProtectionDomain->invokeIntSpecial(this, val, cl, pd); - } } cl->release(); return val; Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=55046&r1=55045&r2=55046&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Wed Aug 20 08:02:15 2008 @@ -329,7 +329,7 @@ /// getClassDelegatee - Get the java/lang/Class object representing the /// internal class. /// - JavaObject* getClassDelegatee(CommonClass* cl, JavaObject* pd = 0); + JavaObject* getClassDelegatee(CommonClass*); /// ~Jnjvm - Destroy the JVM. /// Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55046&r1=55045&r2=55046&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Wed Aug 20 08:02:15 2008 @@ -26,10 +26,6 @@ JnjvmBootstrapLoader* JnjvmClassLoader::bootstrapLoader = 0; -#ifdef MULTIPLE_VM -JnjvmClassLoader* JnjvmClassLoader::sharedLoader = 0; -#endif - extern const char* GNUClasspathGlibj; extern const char* GNUClasspathLibs; @@ -260,13 +256,10 @@ CommonClass* cl = lookupClass(name); - if (!cl) { - ArrayUInt8* bytes = openName(name); - if (bytes) - cl = constructClass(name, bytes); - } else if (cl->status == hashed) { - ArrayUInt8* bytes = openName(name); + if (!cl || cl->status == hashed) { + ArrayUInt8* bytes = bootstrapLoader->openName(name); if (bytes) { + if (!cl) cl = bootstrapLoader->constructClass(name); if (cl->status == hashed) { cl->acquire(); if (cl->status == hashed) { @@ -408,26 +401,13 @@ } -Class* JnjvmClassLoader::constructClass(const UTF8* name, ArrayUInt8* bytes) { - classes->lock->lock(); - ClassMap::iterator End = classes->map.end(); - ClassMap::iterator I = classes->map.find(name); - Class* res = 0; - if (I == End) { - res = allocator_new(allocator, Class)(this, name); - if (bytes) { - res->bytes = bytes; - res->status = loaded; - } - classes->map.insert(std::make_pair(name, res)); - } else { - res = ((Class*)(I->second)); - if (res->status == hashed && bytes) { - res->bytes = bytes; - res->status = loaded; - } - } - classes->lock->unlock(); +static CommonClass* classDup(const UTF8*& name, JnjvmClassLoader* loader) { + Class* cl = allocator_new(loader->allocator, Class)(loader, name); + return cl; +} + +Class* JnjvmClassLoader::constructClass(const UTF8* name) { + Class* res = (Class*)classes->lookupOrCreate(name, this, classDup); return res; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=55046&r1=55045&r2=55046&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Wed Aug 20 08:02:15 2008 @@ -189,7 +189,7 @@ /// constructClass - Hashes a runtime representation of a class with /// the given name. /// - Class* constructClass(const UTF8* name, ArrayUInt8* bytes = 0); + Class* constructClass(const UTF8* name); /// constructType - Hashes a Typedef, an internal representation of a class /// still not loaded. From nicolas.geoffray at lip6.fr Wed Aug 20 06:46:53 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 20 Aug 2008 13:46:53 -0000 Subject: [vmkit-commits] [vmkit] r55048 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathVMClassLoader.cpp.inc VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/Jnjvm.cpp VMCore/Jnjvm.h VMCore/JnjvmClassLoader.cpp VMCore/VirtualTables.cpp Message-ID: <200808201346.m7KDkrp0022117@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 20 08:46:53 2008 New Revision: 55048 URL: http://llvm.org/viewvc/llvm-project?rev=55048&view=rev Log: Give the protection domain as parameter to getClassDelegatee, by default set to 0. Also let the bootstrap class loader trace the delegatee of primitive classes. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc?rev=55048&r1=55047&r2=55048&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc Wed Aug 20 08:46:53 2008 @@ -99,15 +99,10 @@ if (cl->status == hashed) { cl->bytes = (ArrayUInt8*)bytes; cl->status = loaded; -#ifndef MULTIPLE_VM - cl->delegatee = (JavaObject*)pd; -#else - JavaThread::get()->isolate->delegatees->hash(cl, (JavaObject*)pd); -#endif } cl->release(); } - return (jclass)(cl->getClassDelegatee()); + return (jclass)(cl->getClassDelegatee((JavaObject*)pd)); } JNIEXPORT void JNICALL Java_java_lang_VMClassLoader_resolveClass( Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=55048&r1=55047&r2=55048&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Wed Aug 20 08:46:53 2008 @@ -524,8 +524,8 @@ } -JavaObject* CommonClass::getClassDelegatee() { - return JavaThread::get()->isolate->getClassDelegatee(this); +JavaObject* CommonClass::getClassDelegatee(JavaObject* pd) { + return JavaThread::get()->isolate->getClassDelegatee(this, pd); } void CommonClass::resolveClass(bool doClinit) { Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=55048&r1=55047&r2=55048&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Wed Aug 20 08:46:53 2008 @@ -378,7 +378,7 @@ /// getClassDelegatee - Return the java/lang/Class representation of this /// class. /// - JavaObject* getClassDelegatee(); + JavaObject* getClassDelegatee(JavaObject* pd = 0); /// initialiseClass - If the class has a static initializer and has not been /// initialized yet, call it. Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55048&r1=55047&r2=55048&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Wed Aug 20 08:46:53 2008 @@ -321,37 +321,35 @@ } #ifndef MULTIPLE_VM -JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl) { +JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl, JavaObject* pd) { cl->acquire(); if (!(cl->delegatee)) { JavaObject* delegatee = Classpath::newClass->doNew(this); cl->delegatee = delegatee; - Classpath::initClass->invokeIntSpecial(this, delegatee, cl); - } else if (cl->delegatee->classOf != Classpath::newClass) { - JavaObject* pd = cl->delegatee; - JavaObject* delegatee = Classpath::newClass->doNew(this); - cl->delegatee = delegatee;; - Classpath::initClassWithProtectionDomain->invokeIntSpecial(this, delegatee, - cl, pd); + if (!pd) { + Classpath::initClass->invokeIntSpecial(this, delegatee, cl); + } else { + Classpath::initClassWithProtectionDomain->invokeIntSpecial(this, + delegatee, + cl, pd); + } } cl->release(); return cl->delegatee; } #else -JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl) { +JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl, JavaObject* pd) { cl->acquire(); JavaObject* val = delegatees->lookup(cl); if (!val) { val = Classpath::newClass->doNew(this); delegatees->hash(cl, val); - Classpath::initClass->invokeIntSpecial(this, val, cl); - } else if (val->classOf != Classpath::newClass) { - JavaObject* pd = val; - val = Classpath::newClass->doNew(this); - delegatees->remove(cl); - delegatees->hash(cl, val); - Classpath::initClassWithProtectionDomain->invokeIntSpecial(this, val, cl, - pd); + if (!pd) { + Classpath::initClass->invokeIntSpecial(this, val, cl); + } else { + Classpath::initClassWithProtectionDomain->invokeIntSpecial(this, val, cl, + pd); + } } cl->release(); return val; Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=55048&r1=55047&r2=55048&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Wed Aug 20 08:46:53 2008 @@ -278,14 +278,15 @@ /// statics - The static instances of classes, in a multi-vm environment. /// StaticInstanceMap* statics; - + +private: /// delegatees - The java/lang/Class equivalents of internal classes. This is /// also in a multi-vm environment. /// DelegateeMap* delegatees; #endif - +public: /// Exceptions - These are the only exceptions VMKit will make. /// void arrayStoreException(); @@ -329,7 +330,7 @@ /// getClassDelegatee - Get the java/lang/Class object representing the /// internal class. /// - JavaObject* getClassDelegatee(CommonClass*); + JavaObject* getClassDelegatee(CommonClass* cl, JavaObject* pd = 0); /// ~Jnjvm - Destroy the JVM. /// Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55048&r1=55047&r2=55048&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Wed Aug 20 08:46:53 2008 @@ -26,6 +26,10 @@ JnjvmBootstrapLoader* JnjvmClassLoader::bootstrapLoader = 0; +#ifdef MULTIPLE_VM +JnjvmClassLoader* JnjvmClassLoader::sharedLoader = 0; +#endif + extern const char* GNUClasspathGlibj; extern const char* GNUClasspathLibs; Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=55048&r1=55047&r2=55048&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Wed Aug 20 08:46:53 2008 @@ -138,6 +138,21 @@ e = bootArchives.end(); i != e; ++i) { (*i)->bytes->MARK_AND_TRACE; } +#ifndef MULTIPLE_VM +#define TRACE_DELEGATEE(prim) \ + prim->classType->delegatee->MARK_AND_TRACE + + TRACE_DELEGATEE(AssessorDesc::dVoid); + TRACE_DELEGATEE(AssessorDesc::dBool); + TRACE_DELEGATEE(AssessorDesc::dByte); + TRACE_DELEGATEE(AssessorDesc::dChar); + TRACE_DELEGATEE(AssessorDesc::dShort); + TRACE_DELEGATEE(AssessorDesc::dInt); + TRACE_DELEGATEE(AssessorDesc::dFloat); + TRACE_DELEGATEE(AssessorDesc::dLong); + TRACE_DELEGATEE(AssessorDesc::dDouble); +#undef TRACE_DELEGATEE +#endif } #ifdef SERVICE_VM From nicolas.geoffray at lip6.fr Wed Aug 20 07:10:04 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 20 Aug 2008 14:10:04 -0000 Subject: [vmkit-commits] [vmkit] r55051 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathVMClassLoader.cpp.inc VMCore/JnjvmClassLoader.cpp VMCore/JnjvmClassLoader.h Message-ID: <200808201410.m7KEA47N022823@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 20 09:10:04 2008 New Revision: 55051 URL: http://llvm.org/viewvc/llvm-project?rev=55051&view=rev Log: Give the array of bytes when constructing a class. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc?rev=55051&r1=55050&r2=55051&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc Wed Aug 20 09:10:04 2008 @@ -92,16 +92,8 @@ JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader); JavaString* str = (JavaString*)_str; const UTF8* name = str->value->javaToInternal(JCL->hashUTF8, str->offset, str->count); - Class* cl = JCL->constructClass(name); + Class* cl = JCL->constructClass(name, (ArrayUInt8*)bytes); - if (cl->status == hashed) { - cl->acquire(); - if (cl->status == hashed) { - cl->bytes = (ArrayUInt8*)bytes; - cl->status = loaded; - } - cl->release(); - } return (jclass)(cl->getClassDelegatee((JavaObject*)pd)); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55051&r1=55050&r2=55051&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Wed Aug 20 09:10:04 2008 @@ -260,10 +260,14 @@ CommonClass* cl = lookupClass(name); - if (!cl || cl->status == hashed) { - ArrayUInt8* bytes = bootstrapLoader->openName(name); + if (!cl) { + ArrayUInt8* bytes = openName(name); + if (bytes) { + cl = constructClass(name, bytes); + } + } else if (cl->status == hashed) { + ArrayUInt8* bytes = openName(name); if (bytes) { - if (!cl) cl = bootstrapLoader->constructClass(name); if (cl->status == hashed) { cl->acquire(); if (cl->status == hashed) { @@ -405,13 +409,26 @@ } -static CommonClass* classDup(const UTF8*& name, JnjvmClassLoader* loader) { - Class* cl = allocator_new(loader->allocator, Class)(loader, name); - return cl; -} - -Class* JnjvmClassLoader::constructClass(const UTF8* name) { - Class* res = (Class*)classes->lookupOrCreate(name, this, classDup); +Class* JnjvmClassLoader::constructClass(const UTF8* name, ArrayUInt8* bytes) { + classes->lock->lock(); + ClassMap::iterator End = classes->map.end(); + ClassMap::iterator I = classes->map.find(name); + Class* res = 0; + if (I == End) { + res = allocator_new(allocator, Class)(this, name); + if (bytes) { + res->bytes = bytes; + res->status = loaded; + } + classes->map.insert(std::make_pair(name, res)); + } else { + res = ((Class*)(I->second)); + if (res->status == hashed && bytes) { + res->bytes = bytes; + res->status = loaded; + } + } + classes->lock->unlock(); return res; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=55051&r1=55050&r2=55051&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Wed Aug 20 09:10:04 2008 @@ -189,7 +189,7 @@ /// constructClass - Hashes a runtime representation of a class with /// the given name. /// - Class* constructClass(const UTF8* name); + Class* constructClass(const UTF8* name, ArrayUInt8* bytes = 0); /// constructType - Hashes a Typedef, an internal representation of a class /// still not loaded. From nicolas.geoffray at lip6.fr Wed Aug 20 08:52:07 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 20 Aug 2008 15:52:07 -0000 Subject: [vmkit-commits] [vmkit] r55056 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaInitialise.cpp JnjvmClassLoader.cpp JnjvmClassLoader.h VirtualTables.cpp Message-ID: <200808201552.m7KFq7DN025900@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 20 10:52:05 2008 New Revision: 55056 URL: http://llvm.org/viewvc/llvm-project?rev=55056&view=rev Log: Hooks for the shared loader. Add #includes for realpath. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp?rev=55056&r1=55055&r2=55056&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp Wed Aug 20 10:52:05 2008 @@ -49,6 +49,9 @@ INIT(DelegateeMap); INIT(JnjvmBootstrapLoader); INIT(JnjvmClassLoader); +#ifdef MULTIPLE_VM + INIT(JnjvmSharedLoader); +#endif #ifdef SERVICE_VM INIT(ServiceDomain); #endif Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55056&r1=55055&r2=55056&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Wed Aug 20 10:52:05 2008 @@ -7,6 +7,8 @@ // //===----------------------------------------------------------------------===// +#include +#include #include #include "debug.h" @@ -27,7 +29,7 @@ JnjvmBootstrapLoader* JnjvmClassLoader::bootstrapLoader = 0; #ifdef MULTIPLE_VM -JnjvmClassLoader* JnjvmClassLoader::sharedLoader = 0; +JnjvmSharedLoader* JnjvmClassLoader::sharedLoader = 0; #endif extern const char* GNUClasspathGlibj; @@ -62,6 +64,25 @@ return JCL; } +#ifdef MULTIPLE_VM +JnjvmSharedLoader* JnjvmSharedLoader::createSharedLoader() { + + JnjvmSharedLoader* JCL = gc_new(JnjvmSharedLoader)(); + JCL->TheModule = new JnjvmModule("Bootstrap JnJVM"); + JCL->TheModuleProvider = new JnjvmModuleProvider(JCL->TheModule); + JCL->TheModule->initialise(); + + JCL->allocator = new JavaAllocator(); + + JCL->hashUTF8 = new UTF8Map(JCL->allocator); + JCL->classes = allocator_new(allocator, ClassMap)(); + JCL->javaTypes = new TypeMap(); + JCL->javaSignatures = new SignMap(); + + return JCL; +} +#endif + JnjvmClassLoader::JnjvmClassLoader(JnjvmClassLoader& JCL, JavaObject* loader, Jnjvm* I) { TheModule = JCL.TheModule; TheModuleProvider = JCL.TheModuleProvider; @@ -400,16 +421,30 @@ ClassArray* JnjvmClassLoader::constructArray(const UTF8* name) { if (javaLoader != 0) { - JnjvmClassLoader * ld = ClassArray::arrayLoader(name, this, 1, name->size - 1); - ClassArray* res = (ClassArray*)ld->classes->lookupOrCreate(name, this, arrayDup); + JnjvmClassLoader * ld = + ClassArray::arrayLoader(name, this, 1, name->size - 1); + ClassArray* res = + (ClassArray*)ld->classes->lookupOrCreate(name, this, arrayDup); return res; } else { return (ClassArray*)classes->lookupOrCreate(name, this, arrayDup); } } +Class* JnjvmSharedLoader::constructSharedClass(const UTF8* name, + ArrayUInt8* bytes) { + + return 0; +} + Class* JnjvmClassLoader::constructClass(const UTF8* name, ArrayUInt8* bytes) { +#ifdef MULTIPLE_VM + if (this != bootstrapLoader && this != sharedLoader && bytes) { + Class* cl = sharedLoader->constructSharedClass(name, bytes); + if (cl) return cl; + } +#endif classes->lock->lock(); ClassMap::iterator End = classes->map.end(); ClassMap::iterator I = classes->map.find(name); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=55056&r1=55055&r2=55056&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Wed Aug 20 10:52:05 2008 @@ -41,6 +41,10 @@ class UTF8Map; class ZipArchive; +#ifdef MULTIPLE_VM +class JnjvmSharedLoader; +#endif + /// JnjvmClassLoader - Runtime representation of a class loader. It contains /// its own tables (signatures, UTF8, types) which are mapped to a single /// table for non-isolate environments. @@ -217,7 +221,7 @@ #ifdef MULTIPLE_VM /// sharedLoader - Shared loader when multiple vms are executing. /// - static JnjvmClassLoader* sharedLoader; + static JnjvmSharedLoader* sharedLoader; #endif /// ~JnjvmClassLoader - Destroy the loader. Depending on the JVM @@ -239,6 +243,32 @@ }; +class JnjvmSharedLoader : public JnjvmClassLoader { +private: + + /// internalLoad - Load the class with the given name. + /// + virtual CommonClass* internalLoad(const UTF8* utf8) { + fprintf(stderr, "Don't use me"); + exit(1); + } + +public: + + /// VT - The virtual table of this class. + /// + static VirtualTable* VT; + + + /// constructSharedClass - Create a shared representation of the class. + /// If two classes have the same name but not the same array of bytes, + /// raise an exception. + /// + Class* constructSharedClass(const UTF8* name, ArrayUInt8* bytes); + + static JnjvmSharedLoader* createSharedLoader(); +}; + /// JnjvmBootstrapLoader - This class is for the bootstrap class loader, which /// loads base classes, ie glibj.zip or rt.jar and -Xbootclasspath. Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=55056&r1=55055&r2=55056&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Wed Aug 20 10:52:05 2008 @@ -37,6 +37,9 @@ INIT(DelegateeMap); INIT(JnjvmBootstrapLoader); INIT(JnjvmClassLoader); +#ifdef MULTIPLE_VM + INIT(JnjvmSharedLoader); +#endif #ifdef SERVICE_VM INIT(ServiceDomain); #endif From tilmann.scheller at googlemail.com Wed Aug 20 12:40:26 2008 From: tilmann.scheller at googlemail.com (Tilmann Scheller) Date: Wed, 20 Aug 2008 19:40:26 -0000 Subject: [vmkit-commits] [vmkit] r55073 - /vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp Message-ID: <200808201940.m7KJeRHW032474@zion.cs.uiuc.edu> Author: tilmann Date: Wed Aug 20 14:40:25 2008 New Revision: 55073 URL: http://llvm.org/viewvc/llvm-project?rev=55073&view=rev Log: fix compilation errors in MonoMSCorlib.cpp Modified: vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp Modified: vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp?rev=55073&r1=55072&r2=55073&view=diff ============================================================================== --- vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp (original) +++ vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp Wed Aug 20 14:40:25 2008 @@ -25,9 +25,9 @@ vm->asciizConstructUTF8("System"), false, false, false, true); MSCorlib::pString = type; - MSCorlib::pObject->resolveType(true, false); + MSCorlib::pObject->resolveType(true, false, NULL); MSCorlib::pObject->resolveVT(); - type->resolveType(true, false); + type->resolveType(true, false, NULL); type->resolveVT(); uint64 size = mvm::jit::getTypeSize(type->virtualType->getContainedType(0)) + sizeof(const UTF8*) + sizeof(llvm::GlobalVariable*); @@ -64,7 +64,7 @@ #undef INIT { - MSCorlib::clrType->resolveType(false, false); + MSCorlib::clrType->resolveType(false, false, NULL); MSCorlib::typeClrType = realClrType->lookupField(vm->asciizConstructUTF8("_impl"), runtimeTypeHandle, false, false); } From nicolas.geoffray at lip6.fr Wed Aug 20 14:31:05 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 20 Aug 2008 23:31:05 +0200 Subject: [vmkit-commits] [vmkit] r55073 - /vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp In-Reply-To: <200808201940.m7KJeRHW032474@zion.cs.uiuc.edu> References: <200808201940.m7KJeRHW032474@zion.cs.uiuc.edu> Message-ID: <48AC8D19.20604@lip6.fr> Thanks Tilmann! However, I get a sigsegv when running HelloWorld on Mono. Apparently that's because Mono wants to construct an array of a "dummy" class (as you describe in CLISignature.cpp). Since it uses the assembly of the dummy class, which is null, to construct the array, it returns a sigsegv. I fixed it by assigning the current assembly to the dummy class. Does that make sense? Nicolas Tilmann Scheller wrote: > Author: tilmann > Date: Wed Aug 20 14:40:25 2008 > New Revision: 55073 > > URL: http://llvm.org/viewvc/llvm-project?rev=55073&view=rev > Log: > fix compilation errors in MonoMSCorlib.cpp > > Modified: > vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp > > Modified: vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp > URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp?rev=55073&r1=55072&r2=55073&view=diff > > ============================================================================== > --- vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp (original) > +++ vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp Wed Aug 20 14:40:25 2008 > @@ -25,9 +25,9 @@ > vm->asciizConstructUTF8("System"), > false, false, false, true); > MSCorlib::pString = type; > - MSCorlib::pObject->resolveType(true, false); > + MSCorlib::pObject->resolveType(true, false, NULL); > MSCorlib::pObject->resolveVT(); > - type->resolveType(true, false); > + type->resolveType(true, false, NULL); > type->resolveVT(); > > uint64 size = mvm::jit::getTypeSize(type->virtualType->getContainedType(0)) + sizeof(const UTF8*) + sizeof(llvm::GlobalVariable*); > @@ -64,7 +64,7 @@ > #undef INIT > > { > - MSCorlib::clrType->resolveType(false, false); > + MSCorlib::clrType->resolveType(false, false, NULL); > MSCorlib::typeClrType = realClrType->lookupField(vm->asciizConstructUTF8("_impl"), runtimeTypeHandle, false, false); > } > > > > _______________________________________________ > vmkit-commits mailing list > vmkit-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits > From nicolas.geoffray at lip6.fr Thu Aug 21 07:22:55 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 21 Aug 2008 14:22:55 -0000 Subject: [vmkit-commits] [vmkit] r55119 - /vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Message-ID: <200808211422.m7LEMwaQ016180@zion.cs.uiuc.edu> Author: geoffray Date: Thu Aug 21 09:22:37 2008 New Revision: 55119 URL: http://llvm.org/viewvc/llvm-project?rev=55119&view=rev Log: Remove unnecessary code. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=55119&r1=55118&r2=55119&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Thu Aug 21 09:22:37 2008 @@ -183,7 +183,6 @@ uint8* ctpType) { ctpDef[e + 1] = reader.readU4(); ctpDef[e] = reader.readU4(); - ctpType[e] = ConstantLong; PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, "; [%5d] %d %d\n", e, ctpDef[e], ctpDef[e + 1]); return 2; @@ -194,7 +193,6 @@ void** ctpRes, uint8* ctpType) { ctpDef[e + 1] = reader.readU4(); ctpDef[e] = reader.readU4(); - ctpType[e] = ConstantDouble; PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, "; [%5d] %d %d\n", e, ctpDef[e], ctpDef[e + 1]); return 2; From tilmann.scheller at googlemail.com Thu Aug 21 13:10:22 2008 From: tilmann.scheller at googlemail.com (Tilmann Scheller) Date: Thu, 21 Aug 2008 20:10:22 -0000 Subject: [vmkit-commits] [vmkit] r55136 - /vmkit/trunk/lib/N3/VMCore/CLISignature.cpp Message-ID: <200808212010.m7LKAMT6027432@zion.cs.uiuc.edu> Author: tilmann Date: Thu Aug 21 15:10:20 2008 New Revision: 55136 URL: http://llvm.org/viewvc/llvm-project?rev=55136&view=rev Log: fix bug in creation of dummy classes Modified: vmkit/trunk/lib/N3/VMCore/CLISignature.cpp Modified: vmkit/trunk/lib/N3/VMCore/CLISignature.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLISignature.cpp?rev=55136&r1=55135&r2=55136&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/CLISignature.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/CLISignature.cpp Thu Aug 21 15:10:20 2008 @@ -302,10 +302,10 @@ // of generic methods we need create a placeholder for each of them, // this is done by creating a dummy VMClass which has the assembly field // set to NULL, the token field is used to store the generic argument number - VMClass* cl = gc_new(VMClass)() ; + VMClass* cl = gc_new(VMClass)(); cl->token = number; - cl->assembly = NULL; - cl->nameSpace = UTF8::asciizConstruct(VMThread::get()->vm, ""); + cl->assembly = ass; + cl->nameSpace = ass->name; char *tmp = (char *) alloca(100); snprintf(tmp, 100, "!!%d", number); cl->name = UTF8::asciizConstruct(VMThread::get()->vm, tmp); From tilmann.scheller at googlemail.com Thu Aug 21 13:17:47 2008 From: tilmann.scheller at googlemail.com (Tilmann Scheller) Date: Thu, 21 Aug 2008 22:17:47 +0200 Subject: [vmkit-commits] [vmkit] r55073 - /vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp In-Reply-To: <48AC8D19.20604@lip6.fr> References: <200808201940.m7KJeRHW032474@zion.cs.uiuc.edu> <48AC8D19.20604@lip6.fr> Message-ID: On Wed, Aug 20, 2008 at 11:31 PM, Nicolas Geoffray wrote: > I fixed it by assigning the current assembly to the dummy class. > > Does that make sense? Yes, I've a commited a fix. However Hello World now triggers an LLVM assert in createDelegate() when compiling the InternalCancelHandler delegate in System.Console :) Greetings, Tilmann From nicolas.geoffray at lip6.fr Fri Aug 22 01:27:02 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 22 Aug 2008 08:27:02 -0000 Subject: [vmkit-commits] [vmkit] r55172 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaCache.cpp JavaCache.h JavaClass.cpp JavaClass.h JavaConstantPool.cpp JavaConstantPool.h JavaJIT.cpp JavaRuntimeJIT.cpp JnjvmClassLoader.cpp JnjvmModuleProvider.cpp NativeUtil.cpp Message-ID: <200808220827.m7M8R2tc030597@zion.cs.uiuc.edu> Author: geoffray Date: Fri Aug 22 03:27:01 2008 New Revision: 55172 URL: http://llvm.org/viewvc/llvm-project?rev=55172&view=rev Log: Rename JavaCtpInfo to JavaConstantPool and symplify & comment JavaConstantPool.h. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaCache.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaCache.h 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/JavaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaCache.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaCache.cpp?rev=55172&r1=55171&r2=55172&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaCache.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaCache.cpp Fri Aug 22 03:27:01 2008 @@ -44,10 +44,9 @@ enveloppe = E; } - Enveloppe::Enveloppe(JavaCtpInfo* ctp, uint32 i) { +Enveloppe::Enveloppe(JavaConstantPool* ctp, uint32 i) { firstCache = new CacheNode(this); cacheLock = mvm::Lock::allocNormal(); ctpInfo = ctp; index = i; } - Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaCache.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaCache.h?rev=55172&r1=55171&r2=55172&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaCache.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaCache.h Fri Aug 22 03:27:01 2008 @@ -31,7 +31,7 @@ class Class; class Enveloppe; -class JavaCtpInfo; +class JavaConstantPool; /// CacheNode - A {class, method pointer} pair. class CacheNode { @@ -67,7 +67,7 @@ /// ctpInfo - The constant pool info that owns the invokeinterface /// bytecode. This is used to resolve the interface call at its first /// occurence. - JavaCtpInfo* ctpInfo; + JavaConstantPool* ctpInfo; /// cacheLock - The linked list may be modified by concurrent thread. This /// lock ensures that the list stays consistent. @@ -79,7 +79,7 @@ /// Enveloppe - Allocates the linked list with the given constant pool info /// at the given index, so as the resolution process knows which interface /// method the invokeinterface bytecode references. - Enveloppe(JavaCtpInfo* info, uint32 index); + Enveloppe(JavaConstantPool* info, uint32 index); }; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=55172&r1=55171&r2=55172&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Fri Aug 22 03:27:01 2008 @@ -500,7 +500,7 @@ JnjvmModule::InitField(this, obj); } else { Reader reader(attribut, classDef->bytes); - JavaCtpInfo * ctpInfo = classDef->ctpInfo; + JavaConstantPool * ctpInfo = classDef->ctpInfo; uint16 idx = reader.readU2(); if (funcs == AssessorDesc::dLong) { JnjvmModule::InitField(this, obj, (uint64)ctpInfo->LongAt(idx)); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=55172&r1=55171&r2=55172&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Fri Aug 22 03:27:01 2008 @@ -31,7 +31,7 @@ class AssessorDesc; class Enveloppe; class Class; -class JavaCtpInfo; +class JavaConstantPool; class JavaField; class JavaJIT; class JavaMethod; @@ -478,7 +478,7 @@ /// ctpInfo - The constant pool info of this class. /// - JavaCtpInfo* ctpInfo; + JavaConstantPool* ctpInfo; /// attributs - JVM attributes of this class. /// Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=55172&r1=55171&r2=55172&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Fri Aug 22 03:27:01 2008 @@ -30,61 +30,56 @@ using namespace jnjvm; -const uint32 JavaCtpInfo::ConstantUTF8 = 1; -const uint32 JavaCtpInfo::ConstantInteger = 3; -const uint32 JavaCtpInfo::ConstantFloat = 4; -const uint32 JavaCtpInfo::ConstantLong = 5; -const uint32 JavaCtpInfo::ConstantDouble = 6; -const uint32 JavaCtpInfo::ConstantClass = 7; -const uint32 JavaCtpInfo::ConstantString = 8; -const uint32 JavaCtpInfo::ConstantFieldref = 9; -const uint32 JavaCtpInfo::ConstantMethodref = 10; -const uint32 JavaCtpInfo::ConstantInterfaceMethodref = 11; -const uint32 JavaCtpInfo::ConstantNameAndType = 12; +const uint32 JavaConstantPool::ConstantUTF8 = 1; +const uint32 JavaConstantPool::ConstantInteger = 3; +const uint32 JavaConstantPool::ConstantFloat = 4; +const uint32 JavaConstantPool::ConstantLong = 5; +const uint32 JavaConstantPool::ConstantDouble = 6; +const uint32 JavaConstantPool::ConstantClass = 7; +const uint32 JavaConstantPool::ConstantString = 8; +const uint32 JavaConstantPool::ConstantFieldref = 9; +const uint32 JavaConstantPool::ConstantMethodref = 10; +const uint32 JavaConstantPool::ConstantInterfaceMethodref = 11; +const uint32 JavaConstantPool::ConstantNameAndType = 12; -static uint32 unimplemented(Class* cl, uint32 type, uint32 e, Reader& reader, - sint32* ctpDef, void** ctpRes, uint8* ctpType) { +static uint32 unimplemented(JavaConstantPool* ctp, Reader& reader, uint32 index) { JavaThread::get()->isolate->classFormatError( - "unknown constant pool type %d", - type); + "unknown constant pool at index %d", + index); return 1; } -uint32 JavaCtpInfo::CtpReaderClass(Class* cl, uint32 type, uint32 e, - Reader& reader, sint32* ctpDef, - void** ctpRes, uint8* ctpType) { +uint32 JavaConstantPool::CtpReaderClass(JavaConstantPool* ctp, Reader& reader, + uint32 index) { uint16 entry = reader.readU2(); - ctpDef[e] = entry; + ctp->ctpDef[index] = entry; PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, "; [%5d] \t\tutf8 is at %d\n", e, entry); return 1; } -uint32 JavaCtpInfo::CtpReaderInteger(Class* cl, uint32 type, uint32 e, - Reader& reader, sint32* ctpDef, - void** ctpRes, uint8* ctpType) { +uint32 JavaConstantPool::CtpReaderInteger(JavaConstantPool* ctp, Reader& reader, + uint32 index) { uint32 val = reader.readU4(); - ctpDef[e] = val; + ctp->ctpDef[index] = val; PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, "; [%5d] \tinteger: %d\n", e, val); return 1; } -uint32 JavaCtpInfo::CtpReaderFloat(Class* cl, uint32 type, uint32 e, - Reader& reader, sint32* ctpDef, - void** ctpRes, uint8* ctpType) { +uint32 JavaConstantPool::CtpReaderFloat(JavaConstantPool* ctp, Reader& reader, + uint32 index) { uint32 val = reader.readU4(); - ctpDef[e] = val; + ctp->ctpDef[index] = val; PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, "; [%5d] \tfloat: %d\n", e, val); return 1; } -uint32 JavaCtpInfo::CtpReaderUTF8(Class* cl, uint32 type, uint32 e, - Reader& reader, sint32* ctpDef, void** ctpRes, - uint8* ctpType) { +uint32 JavaConstantPool::CtpReaderUTF8(JavaConstantPool* ctp, Reader& reader, + uint32 index) { uint16 len = reader.readU2(); uint16* buf = (uint16*)alloca(len * sizeof(uint16)); uint32 n = 0; @@ -111,118 +106,105 @@ buf[n] = ((uint16)cur); ++n; } - + + Class* cl = ctp->classDef; const UTF8* utf8 = cl->classLoader->hashUTF8->lookupOrCreateReader(buf, n); - ctpRes[e] = (UTF8*)utf8; + ctp->ctpRes[index] = (UTF8*)utf8; - PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, "; [%5d] \t\t\"%s\"\n", e, + PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, "; [%5d] \t\t\"%s\"\n", index, utf8->printString()); return 1; } -uint32 JavaCtpInfo::CtpReaderNameAndType(Class* cl, uint32 type, - uint32 e, Reader& reader, - sint32* ctpDef, void** ctpRes, - uint8* ctpType) { +uint32 JavaConstantPool::CtpReaderNameAndType(JavaConstantPool* ctp, Reader& reader, + uint32 index) { uint32 entry = reader.readU4(); - ctpDef[e] = entry; + ctp->ctpDef[index] = entry; PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, - "; [%5d] \tname is at %d, type is at %d\n", e, + "; [%5d] \tname is at %d, type is at %d\n", index, (entry >> 16), (entry & 0xffff)); return 1; } -uint32 JavaCtpInfo::CtpReaderFieldref(Class* cl, uint32 type, - uint32 e, Reader& reader, sint32* ctpDef, - void** ctpRes, uint8* ctpType) { +uint32 JavaConstantPool::CtpReaderFieldref(JavaConstantPool* ctp, Reader& reader, + uint32 index) { uint32 entry = reader.readU4(); - ctpDef[e] = entry; + ctp->ctpDef[index] = entry; PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, - "; [%5d] \tclass is at %d, name/type is at %d\n", e, + "; [%5d] \tclass is at %d, name/type is at %d\n", index, (entry >> 16), (entry & 0xffff)); return 1; } -uint32 JavaCtpInfo::CtpReaderString(Class* cl, uint32 type, uint32 e, - Reader& reader, sint32* ctpDef, - void** ctpRes, uint8* ctpType) { +uint32 JavaConstantPool::CtpReaderString(JavaConstantPool* ctp, Reader& reader, + uint32 index) { uint16 entry = reader.readU2(); - ctpDef[e] = entry; + ctp->ctpDef[index] = entry; PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, "; [%5d] \tutf8 is at %d\n", - e, entry); + index, entry); return 1; } -uint32 JavaCtpInfo::CtpReaderMethodref(Class* cl, uint32 type, - uint32 e, Reader& reader, sint32* ctpDef, - void** ctpRes, uint8* ctpType) { +uint32 JavaConstantPool::CtpReaderMethodref(JavaConstantPool* ctp, Reader& reader, + uint32 index) { uint32 entry = reader.readU4(); - ctpDef[e] = entry; + ctp->ctpDef[index] = entry; PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, - "; [%5d] \tclass is at %d, name/type is at %d\n", e, - (entry >> 16), (entry & 0xffff)); + "; [%5d] \tclass is at %d, name/type is at %d\n", + index, (entry >> 16), (entry & 0xffff)); return 1; } -uint32 JavaCtpInfo::CtpReaderInterfaceMethodref(Class* cl, - uint32 type, - uint32 e, Reader& reader, - sint32* ctpDef, void** ctpRes, - uint8* ctpType) { +uint32 JavaConstantPool::CtpReaderInterfaceMethodref(JavaConstantPool* ctp, + Reader& reader, + uint32 index) { uint32 entry = reader.readU4(); - ctpDef[e] = entry; + ctp->ctpDef[index] = entry; PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, "; [%5d] \tclass is at %d, name/type is at %d\n", - e, (entry >> 16), (entry & 0xffff)); + index, (entry >> 16), (entry & 0xffff)); return 1; } -uint32 JavaCtpInfo::CtpReaderLong(Class* cl, uint32 type, uint32 e, - Reader& reader, sint32* ctpDef, void** ctpRes, - uint8* ctpType) { - ctpDef[e + 1] = reader.readU4(); - ctpDef[e] = reader.readU4(); - PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, "; [%5d] %d %d\n", e, +uint32 JavaConstantPool::CtpReaderLong(JavaConstantPool* ctp, Reader& reader, + uint32 index) { + ctp->ctpDef[index + 1] = reader.readU4(); + ctp->ctpDef[index] = reader.readU4(); + PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, "; [%5d] %d %d\n", index, ctpDef[e], ctpDef[e + 1]); return 2; } -uint32 JavaCtpInfo::CtpReaderDouble(Class* cl, uint32 type, uint32 e, - Reader& reader, sint32* ctpDef, - void** ctpRes, uint8* ctpType) { - ctpDef[e + 1] = reader.readU4(); - ctpDef[e] = reader.readU4(); - PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, "; [%5d] %d %d\n", e, - ctpDef[e], ctpDef[e + 1]); +uint32 JavaConstantPool::CtpReaderDouble(JavaConstantPool* ctp, Reader& reader, + uint32 index) { + ctp->ctpDef[index + 1] = reader.readU4(); + ctp->ctpDef[index] = reader.readU4(); + PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, "; [%5d] %d %d\n", index, + ctp->ctpDef[index], ctp->ctpDef[index + 1]); return 2; } -void JavaCtpInfo::read(Class* cl, Reader& reader) { - uint32 nbCtp = reader.readU2(); - JavaCtpInfo* res = new JavaCtpInfo(); - - res->ctpRes = (void**)malloc(sizeof(void*)*nbCtp); - res->ctpDef = (sint32*)malloc(sizeof(sint32)*nbCtp); - res->ctpType = (uint8*)malloc(sizeof(uint8)*nbCtp); - memset(res->ctpRes, 0, sizeof(void**)*nbCtp); - memset(res->ctpDef, 0, sizeof(sint32)*nbCtp); - memset(res->ctpType, 0, sizeof(uint8)*nbCtp); - - res->ctpSize = nbCtp; - res->classDef = cl; - cl->ctpInfo = res; +JavaConstantPool::JavaConstantPool(Class* cl, Reader& reader) { + ctpSize = reader.readU2(); + classDef = cl; + + ctpRes = new void*[ctpSize]; + ctpDef = new sint32[ctpSize]; + ctpType = new uint8[ctpSize]; + memset(ctpRes, 0, sizeof(void**) * ctpSize); + memset(ctpDef, 0, sizeof(sint32) * ctpSize); + memset(ctpType, 0, sizeof(uint8) * ctpSize); uint32 cur = 1; - while (cur < nbCtp) { + while (cur < ctpSize) { uint8 curType = reader.readU1(); - res->ctpType[cur] = curType; - cur += ((funcsReader[curType])(cl, curType, cur, reader, res->ctpDef, - res->ctpRes, res->ctpType)); + ctpType[cur] = curType; + cur += ((funcsReader[curType])(this, reader, cur)); } } -const UTF8* JavaCtpInfo::UTF8At(uint32 entry) { +const UTF8* JavaConstantPool::UTF8At(uint32 entry) { if (! ((entry > 0) && (entry < ctpSize) && typeAt(entry) == ConstantUTF8)) { JavaThread::get()->isolate->classFormatError( @@ -231,7 +213,7 @@ return (const UTF8*)ctpRes[entry]; } -float JavaCtpInfo::FloatAt(uint32 entry) { +float JavaConstantPool::FloatAt(uint32 entry) { if (! ((entry > 0) && (entry < ctpSize) && typeAt(entry) == ConstantFloat)) { JavaThread::get()->isolate->classFormatError( @@ -240,7 +222,7 @@ return ((float*)ctpDef)[entry]; } -sint32 JavaCtpInfo::IntegerAt(uint32 entry) { +sint32 JavaConstantPool::IntegerAt(uint32 entry) { if (! ((entry > 0) && (entry < ctpSize) && typeAt(entry) == ConstantInteger)) { JavaThread::get()->isolate->classFormatError( @@ -249,7 +231,7 @@ return ((sint32*)ctpDef)[entry]; } -sint64 JavaCtpInfo::LongAt(uint32 entry) { +sint64 JavaConstantPool::LongAt(uint32 entry) { if (! ((entry > 0) && (entry < ctpSize) && typeAt(entry) == ConstantLong)) { JavaThread::get()->isolate->classFormatError( @@ -258,7 +240,7 @@ return Reader::readLong(ctpDef[entry], ctpDef[entry + 1]); } -double JavaCtpInfo::DoubleAt(uint32 entry) { +double JavaConstantPool::DoubleAt(uint32 entry) { if (! ((entry > 0) && (entry < ctpSize) && typeAt(entry) == ConstantDouble)) { JavaThread::get()->isolate->classFormatError( @@ -267,7 +249,7 @@ return Reader::readDouble(ctpDef[entry], ctpDef[entry + 1]); } -CommonClass* JavaCtpInfo::isLoadedClassOrClassName(uint32 entry) { +CommonClass* JavaConstantPool::isClassLoaded(uint32 entry) { if (! ((entry > 0) && (entry < ctpSize) && typeAt(entry) == ConstantClass)) { JavaThread::get()->isolate->classFormatError( @@ -276,14 +258,14 @@ return (CommonClass*)ctpRes[entry]; } -const UTF8* JavaCtpInfo::resolveClassName(uint32 index) { - CommonClass* cl = isLoadedClassOrClassName(index); +const UTF8* JavaConstantPool::resolveClassName(uint32 index) { + CommonClass* cl = isClassLoaded(index); if (cl) return cl->name; else return UTF8At(ctpDef[index]); } -CommonClass* JavaCtpInfo::loadClass(uint32 index) { - CommonClass* temp = isLoadedClassOrClassName(index); +CommonClass* JavaConstantPool::loadClass(uint32 index) { + CommonClass* temp = isClassLoaded(index); if (!temp) { JnjvmClassLoader* loader = classDef->classLoader; const UTF8* name = UTF8At(ctpDef[index]); @@ -293,18 +275,13 @@ // Put into ctpRes because there is only one representation of the class temp = loader->loadName(name, false, false, false); } -#ifdef MULTIPLE_VM - if (classDef->isSharedClass() && !temp->isSharedClass()) { - JavaThread::get()->isolate->unknownError("Class sharing violation"); - } -#endif ctpRes[index] = temp; } return temp; } -CommonClass* JavaCtpInfo::getMethodClassIfLoaded(uint32 index) { - CommonClass* temp = isLoadedClassOrClassName(index); +CommonClass* JavaConstantPool::getMethodClassIfLoaded(uint32 index) { + CommonClass* temp = isClassLoaded(index); if (!temp) { JnjvmClassLoader* loader = classDef->classLoader; const UTF8* name = UTF8At(ctpDef[index]); @@ -312,23 +289,10 @@ if (!temp) temp = JnjvmClassLoader::bootstrapLoader->lookupClass(name); } -#ifdef MULTIPLE_VM - if (temp && classDef->isSharedClass() && !temp->isSharedClass()) { - JavaThread::get()->isolate->unknownError("Class sharing violation"); - } -#endif return temp; } -void JavaCtpInfo::checkInfoOfClass(uint32 index) { - if (typeAt(index) != ConstantClass) - JavaThread::get()->isolate->classFormatError( - "bad constant pool number for class at entry %d", index); - /*if (!(ctpRes[index])) - ctpRes[index] = JavaJIT::newLookupLLVM;*/ -} - -Typedef* JavaCtpInfo::resolveNameAndType(uint32 index) { +Typedef* JavaConstantPool::resolveNameAndType(uint32 index) { void* res = ctpRes[index]; if (!res) { if (typeAt(index) != ConstantNameAndType) { @@ -344,7 +308,7 @@ return (Typedef*)res; } -Signdef* JavaCtpInfo::resolveNameAndSign(uint32 index) { +Signdef* JavaConstantPool::resolveNameAndSign(uint32 index) { void* res = ctpRes[index]; if (!res) { if (typeAt(index) != ConstantNameAndType) { @@ -360,15 +324,15 @@ return (Signdef*)res; } -Typedef* JavaCtpInfo::infoOfField(uint32 index) { +Typedef* JavaConstantPool::infoOfField(uint32 index) { if (typeAt(index) != ConstantFieldref) JavaThread::get()->isolate->classFormatError( "bad constant pool number for field at entry %d", index); return resolveNameAndType(ctpDef[index] & 0xFFFF); } -void JavaCtpInfo::infoOfMethod(uint32 index, uint32 access, - CommonClass*& cl, JavaMethod*& meth) { +void JavaConstantPool::infoOfMethod(uint32 index, uint32 access, + CommonClass*& cl, JavaMethod*& meth) { uint8 id = typeAt(index); if (id != ConstantMethodref && id != ConstantInterfaceMethodref) JavaThread::get()->isolate->classFormatError( @@ -386,13 +350,13 @@ } } -uint32 JavaCtpInfo::getClassIndexFromMethod(uint32 index) { +uint32 JavaConstantPool::getClassIndexFromMethod(uint32 index) { sint32 entry = ctpDef[index]; return (uint32)(entry >> 16); } -void JavaCtpInfo::nameOfStaticOrSpecialMethod(uint32 index, +void JavaConstantPool::nameOfStaticOrSpecialMethod(uint32 index, const UTF8*& cl, const UTF8*& name, Signdef*& sign) { @@ -408,15 +372,17 @@ cl = resolveClassName(entry >> 16); } -void* JavaCtpInfo::infoOfStaticOrSpecialMethod(uint32 index, - uint32 access, - Signdef*& sign, - JavaMethod*& meth) { +void* JavaConstantPool::infoOfStaticOrSpecialMethod(uint32 index, + uint32 access, + Signdef*& sign, + JavaMethod*& meth) { uint8 id = typeAt(index); if (id != ConstantMethodref && id != ConstantInterfaceMethodref) JavaThread::get()->isolate->classFormatError( "bad constant pool number for method at entry %d", index); + if (ctpRes[index]) return ctpRes[index]; + sign = resolveNameAndSign(ctpDef[index] & 0xFFFF); sint32 entry = ctpDef[index]; sint32 ntIndex = entry & 0xFFFF; @@ -436,20 +402,16 @@ } // Must be a callback - if (ctpRes[index]) { - return ctpRes[index]; - } else { - void* val = - classDef->classLoader->TheModuleProvider->addCallback(classDef, index, sign, - isStatic(access)); + void* val = + classDef->classLoader->TheModuleProvider->addCallback(classDef, index, sign, + isStatic(access)); - ctpRes[index] = val; - return val; - } + ctpRes[index] = val; + return val; } -Signdef* JavaCtpInfo::infoOfInterfaceOrVirtualMethod(uint32 index) { +Signdef* JavaConstantPool::infoOfInterfaceOrVirtualMethod(uint32 index) { uint8 id = typeAt(index); if (id != ConstantMethodref && id != ConstantInterfaceMethodref) @@ -461,28 +423,29 @@ return sign; } -void JavaCtpInfo::resolveInterfaceOrMethod(uint32 index, - CommonClass*& cl, const UTF8*& utf8, - Signdef*& sign) { +void JavaConstantPool::resolveMethod(uint32 index, CommonClass*& cl, + const UTF8*& utf8, Signdef*& sign) { sint32 entry = ctpDef[index]; sint32 ntIndex = entry & 0xFFFF; sign = (Signdef*)ctpRes[ntIndex]; + assert(sign && "No cached signature after JITting"); utf8 = UTF8At(ctpDef[ntIndex] >> 16); cl = loadClass(entry >> 16); cl->resolveClass(true); } -void JavaCtpInfo::resolveField(uint32 index, CommonClass*& cl, - const UTF8*& utf8, Typedef*& sign) { +void JavaConstantPool::resolveField(uint32 index, CommonClass*& cl, + const UTF8*& utf8, Typedef*& sign) { sint32 entry = ctpDef[index]; sint32 ntIndex = entry & 0xFFFF; sign = (Typedef*)ctpRes[ntIndex]; + assert(sign && "No cached Typedef after JITting"); utf8 = UTF8At(ctpDef[ntIndex] >> 16); cl = loadClass(entry >> 16); cl->resolveClass(true); } -JavaField* JavaCtpInfo::lookupField(uint32 index, bool stat) { +JavaField* JavaConstantPool::lookupField(uint32 index, bool stat) { if (!(ctpRes[index])) { sint32 entry = ctpDef[index]; sint32 ntIndex = entry & 0xFFFF; @@ -504,12 +467,12 @@ return (JavaField*)ctpRes[index]; } -JavaString* JavaCtpInfo::resolveString(const UTF8* utf8, uint16 index) { +JavaString* JavaConstantPool::resolveString(const UTF8* utf8, uint16 index) { JavaString* str = JavaThread::get()->isolate->UTF8ToStr(utf8); return str; } -ctpReader JavaCtpInfo::funcsReader[16] = { +JavaConstantPool::ctpReader JavaConstantPool::funcsReader[16] = { unimplemented, CtpReaderUTF8, unimplemented, Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h?rev=55172&r1=55171&r2=55172&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h Fri Aug 22 03:27:01 2008 @@ -19,6 +19,7 @@ class Class; class CommonClass; class Jnjvm; +class JavaConstantPool; class JavaField; class JavaMethod; class JavaString; @@ -27,16 +28,80 @@ class Typedef; class UTF8; -typedef uint32 (*ctpReader)(Class*, uint32, uint32, Reader&, sint32*, void**, uint8*); -class JavaCtpInfo { +/// JavaConstantPool - This class represents a Java constant pool, a place where +/// a Java class makes external references such as classes and methods and +/// stores constants such as integers or UTF8s. +class JavaConstantPool { public: + + /// classDef - The owning class of this constant pool. + /// Class* classDef; - void** ctpRes; - sint32* ctpDef; - uint8* ctpType; + + /// ctpSize - The number of entries in the constant pool. + /// uint32 ctpSize; + + /// ctpType - The types of the constant pool entries. + /// + uint8* ctpType; + + /// ctpDef - The values of the constant pool entries: may be constants or + /// references to other entries. + /// + sint32* ctpDef; + /// ctpRes - Objects resolved dynamically, e.g. UTF8s, classes, methods, + /// fields, strings. + /// + void** ctpRes; + + /// CtpReaderClass - Reads a class entry. + static uint32 CtpReaderClass(JavaConstantPool* ctp, Reader& reader, + uint32 index); + + /// CtpReaderInteger - Reads an integer entry. + static uint32 CtpReaderInteger(JavaConstantPool* ctp, Reader& reader, + uint32 index); + + /// CtpReaderFloat - Reads a float entry. + static uint32 CtpReaderFloat(JavaConstantPool* ctp, Reader& reader, + uint32 index); + + /// CtpReaderClass - Reads an UTF8 entry. + static uint32 CtpReaderUTF8(JavaConstantPool* ctp, Reader& reader, + uint32 index); + + /// CtpReaderNameAndType - Reads a name/signature entry. + static uint32 CtpReaderNameAndType(JavaConstantPool* ctp, Reader& reader, + uint32 index); + + /// CtpReaderFieldref - Reads a field entry. + static uint32 CtpReaderFieldref(JavaConstantPool* ctp, Reader& reader, + uint32 index); + + /// CtpReaderString - Reads a string entry. + static uint32 CtpReaderString(JavaConstantPool* ctp, Reader& reader, + uint32 index); + + /// CtpReaderMethodref - Reads a method entry. + static uint32 CtpReaderMethodref(JavaConstantPool* ctp, Reader& reader, + uint32 index); + + /// CtpReaderInterfaceMethodref - Reads a method of an interface entry. + static uint32 CtpReaderInterfaceMethodref(JavaConstantPool* ctp, + Reader& reader, + uint32 index); + + /// CtpReaderLong - Reads a long entry. + static uint32 CtpReaderLong(JavaConstantPool* ctp, Reader& reader, + uint32 index); + + /// CtpReaderClass - Reads a double entry. + static uint32 CtpReaderDouble(JavaConstantPool* ctp, Reader& reader, + uint32 index); + static const uint32 ConstantUTF8; static const uint32 ConstantInteger; static const uint32 ConstantFloat; @@ -48,94 +113,158 @@ static const uint32 ConstantMethodref; static const uint32 ConstantInterfaceMethodref; static const uint32 ConstantNameAndType; - - static ctpReader funcsReader[16]; - static uint32 CtpReaderClass(Class*, uint32 type, uint32 e, Reader& reader, - sint32* ctpDef, void** ctpRes, uint8* ctpType); - - static uint32 CtpReaderInteger(Class*, uint32 type, uint32 e, Reader& reader, - sint32* ctpDef, void** ctpRes, uint8* ctpType); - - static uint32 CtpReaderFloat(Class*, uint32 type, uint32 e, Reader& reader, - sint32* ctpDef, void** ctpRes, uint8* ctpType); - - static uint32 CtpReaderUTF8(Class*, uint32 type, uint32 e, Reader& reader, - sint32* ctpDef, void** ctpRes, uint8* ctpType); - - static uint32 CtpReaderNameAndType(Class*, uint32 type, uint32 e, Reader& reader, - sint32* ctpDef, void** ctpRes, - uint8* ctpType); - - static uint32 CtpReaderFieldref(Class*, uint32 type, uint32 e, Reader& reader, - sint32* ctpDef, void** ctpRes, uint8* ctpType); - - static uint32 CtpReaderString(Class*, uint32 type, uint32 e, Reader& reader, - sint32* ctpDef, void** ctpRes, uint8* ctpType); - - static uint32 CtpReaderMethodref(Class*, uint32 type, uint32 e, Reader& reader, - sint32* ctpDef, void** ctpRes, uint8* ctpType); - - static uint32 CtpReaderInterfaceMethodref(Class*, uint32 type, uint32 e, - Reader& reader, sint32* ctpDef, - void** ctpRes, uint8* ctpType); - - static uint32 CtpReaderLong(Class*, uint32 type, uint32 e, Reader& reader, - sint32* ctpDef, void** ctpRes, uint8* ctpType); - - static uint32 CtpReaderDouble(Class*, uint32 type, uint32 e, Reader& reader, - sint32* ctpDef, void** ctpRes, uint8* ctpType); + typedef uint32 (*ctpReader)(JavaConstantPool*, Reader&, uint32); - static void read(Class* cl, Reader& reader); + /// funcsReader - Array of CtpReader* functions. + /// + static ctpReader funcsReader[16]; + /// isAStaticCall - Is the name/type at the given entry a reference to a + /// static method? bool isAStaticCall(uint32 index) { return (ctpType[index] & 0x80) != 0; } - + + /// markAsStaticCall - Set the name/type entry as a reference to a static + /// method. void markAsStaticCall(uint32 index) { ctpType[index] |= 0x80; } + /// typeAt - Get the constant pool type of the given entry. + /// uint8 typeAt(uint32 index) { return ctpType[index] & 0x7F; } - + + /// UTF8At - Get the UTF8 at the given entry. + /// const UTF8* UTF8At(uint32 entry); + + /// FloatAt - Get the float at the given entry. + /// float FloatAt(uint32 entry); + + /// IntegerAt - Get the int at the given entry. + /// sint32 IntegerAt(uint32 entry); + + /// LongAt - Get the long at the given entry. + /// sint64 LongAt(uint32 entry); + + /// DoubleAt - Get the double at the given entry. + /// double DoubleAt(uint32 entry); - CommonClass* isLoadedClassOrClassName(uint32 index); + /// isClassLoaded - Is the class at the given entry already loaded? + /// + CommonClass* isClassLoaded(uint32 index); + + /// resolveClassName - Get the name of the class referenced and returns + /// it. + /// const UTF8* resolveClassName(uint32 index); - CommonClass* loadClass(uint32 index); - void checkInfoOfClass(uint32 index); + + /// resolveNameAndType - Resolve the name/type at the given index, + /// and returns the type. Typedef* resolveNameAndType(uint32 index); + + /// resolveNameAndSign - Resolve the name/sign at the given index, + /// and returns the signature. Signdef* resolveNameAndSign(uint32 index); - Typedef* infoOfField(uint32 index); + + /// infoOfInterfaceOrVirtualMethod - Get the signature of the method + /// referenced at the given entry. Signdef* infoOfInterfaceOrVirtualMethod(uint32 index); + + /// infoOfStaticOrSpecialMethod - Get the JIT representation of a + /// non-virtual method. Also returns its signature and the Jnjvm + /// representation. + /// void* infoOfStaticOrSpecialMethod(uint32 index, uint32 access, Signdef*& sign, JavaMethod*& meth); - + + /// nameOfStaticOrSpecialMethod - Get the name and the signature + /// of a non-virtual method. + /// void nameOfStaticOrSpecialMethod(uint32 index, const UTF8*& cl, const UTF8*& name, Signdef*& sign); + /// getClassIndexFromMethod - Get the entry of the class that owns + /// the referenced method. + /// uint32 getClassIndexFromMethod(uint32 index); + /// getMethodClassIfLoaded - Returns the class of the given method if + /// loaded, null if not. CommonClass* getMethodClassIfLoaded(uint32 index); - void resolveInterfaceOrMethod(uint32 index, CommonClass*& cl, - const UTF8*& utf8, Signdef*& sign); + + /// infoOfField - Get the Typedef representation of the field referenced + /// at the given entry. This does not involve any class loading. + /// + Typedef* infoOfField(uint32 index); + + /// infoOfMethod - Get the signature of the method referenced at the given + /// entry and try to find the method. This does not involve any class + /// loading. + /// void infoOfMethod(uint32 index, uint32 access, CommonClass*& cl, JavaMethod*& meth); - void resolveField(uint32 index, CommonClass*& cl, const UTF8*& utf8, - Typedef*& sign); + + /// lookupField - Lookup the field at the given entry. + /// + JavaField* lookupField(uint32 index, bool stat); + /// resolveString - Get the string referenced at the given + /// index from the UTF8. JavaString* resolveString(const UTF8* utf8, uint16 index); - JavaField* lookupField(uint32 index, bool stat); + /// resolveMethod - Resolve the class and the signature of the method. May + /// perform class loading. This function is called just in time, ie when + /// the method call is actually made and not yet resolved. + /// + void resolveMethod(uint32 index, CommonClass*& cl, + const UTF8*& utf8, Signdef*& sign); + + /// resolveField - Resolve the class and signature of the field. May + /// perform class loading. This function is called just in time, ie when + /// the field is accessed and not yet resolved. + /// + void resolveField(uint32 index, CommonClass*& cl, const UTF8*& utf8, + Typedef*& sign); + + /// loadClass - Loads the class and returns it. This is called just in time, + /// ie when the class will be used and not yet resolved, and also for + /// two special instructions when JIIting: exception comparisons, and + /// MULTIANEWARRAY. This function is also called by the classpath for + /// loading exception classes referenced by a method. + /// + CommonClass* loadClass(uint32 index); + /// JavaConstantPool - Default constructor. + /// + JavaConstantPool() { + ctpRes = 0; + ctpType = 0; + ctpDef = 0; + } + + /// JavaConstantPool - Reads the bytecode of the class to get + /// the initial types and constants definitions. + /// + JavaConstantPool(Class*, Reader& reader); + + /// ~JavaConstantPool - Delete the constant pool. + /// + ~JavaConstantPool() { + delete ctpRes; + delete ctpDef; + delete ctpType; + } }; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=55172&r1=55171&r2=55172&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Fri Aug 22 03:27:01 2008 @@ -52,7 +52,7 @@ void JavaJIT::invokeVirtual(uint16 index) { - JavaCtpInfo* ctpInfo = compilingClass->ctpInfo; + JavaConstantPool* ctpInfo = compilingClass->ctpInfo; CommonClass* cl = 0; JavaMethod* meth = 0; ctpInfo->infoOfMethod(index, ACC_VIRTUAL, cl, meth); @@ -849,7 +849,7 @@ std::vector exceptions; unsigned sync = isSynchro(compilingMethod->access) ? 1 : 0; nbe += sync; - JavaCtpInfo* ctpInfo = compilingClass->ctpInfo; + JavaConstantPool* ctpInfo = compilingClass->ctpInfo; if (nbe) { supplLocal = new AllocaInst(JnjvmModule::JavaObjectType, "exceptionVar", currentBlock); @@ -1084,10 +1084,10 @@ } void JavaJIT::_ldc(uint16 index) { - JavaCtpInfo* ctpInfo = compilingClass->ctpInfo; + JavaConstantPool* ctpInfo = compilingClass->ctpInfo; uint8 type = ctpInfo->typeAt(index); - if (type == JavaCtpInfo::ConstantString) { + if (type == JavaConstantPool::ConstantString) { Value* toPush = 0; if (ctpInfo->ctpRes[index] == 0) { compilingClass->acquire(); @@ -1136,19 +1136,19 @@ #else push(toPush, AssessorDesc::dRef); #endif - } else if (type == JavaCtpInfo::ConstantLong) { + } else if (type == JavaConstantPool::ConstantLong) { push(ConstantInt::get(Type::Int64Ty, ctpInfo->LongAt(index)), AssessorDesc::dLong); - } else if (type == JavaCtpInfo::ConstantDouble) { + } else if (type == JavaConstantPool::ConstantDouble) { push(ConstantFP::get(Type::DoubleTy, ctpInfo->DoubleAt(index)), AssessorDesc::dDouble); - } else if (type == JavaCtpInfo::ConstantInteger) { + } else if (type == JavaConstantPool::ConstantInteger) { push(ConstantInt::get(Type::Int32Ty, ctpInfo->IntegerAt(index)), AssessorDesc::dInt); - } else if (type == JavaCtpInfo::ConstantFloat) { + } else if (type == JavaConstantPool::ConstantFloat) { push(ConstantFP::get(Type::FloatTy, ctpInfo->FloatAt(index)), AssessorDesc::dFloat); - } else if (type == JavaCtpInfo::ConstantClass) { + } else if (type == JavaConstantPool::ConstantClass) { if (ctpInfo->ctpRes[index]) { CommonClass* cl = (CommonClass*)(ctpInfo->ctpRes[index]); LLVMCommonClassInfo* LCI = module->getClassInfo(cl); @@ -1486,7 +1486,7 @@ } void JavaJIT::invokeSpecial(uint16 index) { - JavaCtpInfo* ctpInfo = compilingClass->ctpInfo; + JavaConstantPool* ctpInfo = compilingClass->ctpInfo; JavaMethod* meth = 0; Signdef* signature = 0; const UTF8* name = 0; @@ -1531,7 +1531,7 @@ } void JavaJIT::invokeStatic(uint16 index) { - JavaCtpInfo* ctpInfo = compilingClass->ctpInfo; + JavaConstantPool* ctpInfo = compilingClass->ctpInfo; JavaMethod* meth = 0; Signdef* signature = 0; const UTF8* name = 0; @@ -1641,8 +1641,7 @@ } void JavaJIT::invokeNew(uint16 index) { - JavaCtpInfo* ctpInfo = compilingClass->ctpInfo; - ctpInfo->checkInfoOfClass(index); + JavaConstantPool* ctpInfo = compilingClass->ctpInfo; Class* cl = (Class*)(ctpInfo->getMethodClassIfLoaded(index)); Value* Size = 0; @@ -1710,7 +1709,7 @@ Value* JavaJIT::ldResolved(uint16 index, bool stat, Value* object, const Type* fieldType, const Type* fieldTypePtr) { - JavaCtpInfo* info = compilingClass->ctpInfo; + JavaConstantPool* info = compilingClass->ctpInfo; JavaField* field = info->lookupField(index, stat); if (field && field->classDef->isResolved() @@ -1962,7 +1961,7 @@ void JavaJIT::invokeInterfaceOrVirtual(uint16 index) { // Do the usual - JavaCtpInfo* ctpInfo = compilingClass->ctpInfo; + JavaConstantPool* ctpInfo = compilingClass->ctpInfo; Signdef* signature = ctpInfo->infoOfInterfaceOrVirtualMethod(index); LLVMSignatureInfo* LSI = module->getSignatureInfo(signature); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=55172&r1=55171&r2=55172&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Fri Aug 22 03:27:01 2008 @@ -37,14 +37,14 @@ extern "C" void* jnjvmVirtualLookup(CacheNode* cache, JavaObject *obj) { Enveloppe* enveloppe = cache->enveloppe; - JavaCtpInfo* ctpInfo = enveloppe->ctpInfo; + JavaConstantPool* ctpInfo = enveloppe->ctpInfo; CommonClass* ocl = obj->classOf; CommonClass* cl = 0; const UTF8* utf8 = 0; Signdef* sign = 0; uint32 index = enveloppe->index; - ctpInfo->resolveInterfaceOrMethod(index, cl, utf8, sign); + ctpInfo->resolveMethod(index, cl, utf8, sign); enveloppe->cacheLock->lock(); CacheNode* rcache = 0; @@ -88,7 +88,7 @@ extern "C" void* fieldLookup(JavaObject* obj, Class* caller, uint32 index, uint32 stat, void** ifStatic, uint32* offset) { - JavaCtpInfo* ctpInfo = caller->ctpInfo; + JavaConstantPool* ctpInfo = caller->ctpInfo; if (ctpInfo->ctpRes[index]) { JavaField* field = (JavaField*)(ctpInfo->ctpRes[index]); field->classDef->initialiseClass(); @@ -198,7 +198,7 @@ extern "C" Class* newLookup(Class* caller, uint32 index, Class** toAlloc, uint32 clinit) { - JavaCtpInfo* ctpInfo = caller->ctpInfo; + JavaConstantPool* ctpInfo = caller->ctpInfo; Class* cl = (Class*)ctpInfo->loadClass(index); cl->resolveClass(clinit); @@ -213,7 +213,7 @@ const UTF8* utf8 = 0; Signdef* sign = 0; - caller->ctpInfo->resolveInterfaceOrMethod(index, cl, utf8, sign); + caller->ctpInfo->resolveMethod(index, cl, utf8, sign); JavaMethod* dmeth = cl->lookupMethodDontThrow(utf8, sign->keyName, false, true); if (!dmeth) { Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55172&r1=55171&r2=55172&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Fri Aug 22 03:27:01 2008 @@ -100,7 +100,7 @@ } void JnjvmClassLoader::readParents(Class* cl, Reader& reader) { - JavaCtpInfo* ctpInfo = cl->ctpInfo; + JavaConstantPool* ctpInfo = cl->ctpInfo; unsigned short int superEntry = reader.readU2(); const UTF8* super = superEntry ? ctpInfo->resolveClassName(superEntry) : 0; @@ -137,7 +137,7 @@ void JnjvmClassLoader::readAttributs(Class* cl, Reader& reader, std::vector& attr) { - JavaCtpInfo* ctpInfo = cl->ctpInfo; + JavaConstantPool* ctpInfo = cl->ctpInfo; unsigned short int nba = reader.readU2(); for (int i = 0; i < nba; i++) { @@ -151,7 +151,7 @@ void JnjvmClassLoader::readFields(Class* cl, Reader& reader) { uint16 nbFields = reader.readU2(); - JavaCtpInfo* ctpInfo = cl->ctpInfo; + JavaConstantPool* ctpInfo = cl->ctpInfo; uint32 sindex = 0; uint32 vindex = 0; for (int i = 0; i < nbFields; i++) { @@ -168,7 +168,7 @@ void JnjvmClassLoader::readMethods(Class* cl, Reader& reader) { uint16 nbMethods = reader.readU2(); - JavaCtpInfo* ctpInfo = cl->ctpInfo; + JavaConstantPool* ctpInfo = cl->ctpInfo; for (int i = 0; i < nbMethods; i++) { uint16 access = reader.readU2(); const UTF8* name = ctpInfo->UTF8At(reader.readU2()); @@ -192,12 +192,11 @@ } cl->minor = reader.readU2(); cl->major = reader.readU2(); - JavaCtpInfo::read(cl, reader); - JavaCtpInfo* ctpInfo = cl->ctpInfo; + cl->ctpInfo = new JavaConstantPool(cl, reader); cl->access = reader.readU2(); const UTF8* thisClassName = - ctpInfo->resolveClassName(reader.readU2()); + cl->ctpInfo->resolveClassName(reader.readU2()); if (!(thisClassName->equals(cl->name))) { JavaThread::get()->isolate->classFormatError("try to load %s and found class named %s", Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=55172&r1=55171&r2=55172&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Fri Aug 22 03:27:01 2008 @@ -26,7 +26,7 @@ using namespace jnjvm; JavaMethod* JnjvmModuleProvider::staticLookup(Class* caller, uint32 index) { - JavaCtpInfo* ctpInfo = caller->ctpInfo; + JavaConstantPool* ctpInfo = caller->ctpInfo; bool isStatic = ctpInfo->isAStaticCall(index); @@ -35,7 +35,7 @@ const UTF8* utf8 = 0; Signdef* sign = 0; - ctpInfo->resolveInterfaceOrMethod(index, cl, utf8, sign); + ctpInfo->resolveMethod(index, cl, utf8, sign); JavaMethod* meth = cl->lookupMethod(utf8, sign->keyName, isStatic, true); Modified: vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp?rev=55172&r1=55171&r2=55172&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp Fri Aug 22 03:27:01 2008 @@ -403,7 +403,7 @@ &(JavaThread::get()->isolate->allocator)); } else { Class* cl = meth->classDef; - JavaCtpInfo* ctp = cl->ctpInfo; + JavaConstantPool* ctp = cl->ctpInfo; Reader reader(exceptionAtt, cl->bytes); uint16 nbe = reader.readU2(); ArrayObject* res = ArrayObject::acons(nbe, Classpath::classArrayClass, From nicolas.geoffray at lip6.fr Fri Aug 22 06:24:22 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 22 Aug 2008 13:24:22 -0000 Subject: [vmkit-commits] [vmkit] r55176 - in /vmkit/trunk/lib/JnJVM: LLVMRuntime/runtime-default.ll LLVMRuntime/runtime-isolate.ll VMCore/JavaConstantPool.cpp VMCore/JavaConstantPool.h VMCore/JavaJIT.cpp VMCore/JavaJIT.h VMCore/JavaRuntimeJIT.cpp VMCore/JnjvmModule.cpp VMCore/JnjvmModule.h VMCore/JnjvmModuleProvider.cpp VMCore/JnjvmModuleProvider.h Message-ID: <200808221324.m7MDONKq012690@zion.cs.uiuc.edu> Author: geoffray Date: Fri Aug 22 08:24:20 2008 New Revision: 55176 URL: http://llvm.org/viewvc/llvm-project?rev=55176&view=rev Log: Do not create global variables anymore, just use the constant pool cache. Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-isolate.ll vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp 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/JnjvmModuleProvider.h Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll?rev=55176&r1=55175&r2=55176&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original) +++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Fri Aug 22 08:24:20 2008 @@ -96,18 +96,16 @@ ;;; vtableLookup - Look up the offset in a virtual table of a specific ;;; function. This function takes a class and an index to lookup in the -;;; constant pool and returns and sets in the last argument the offset. -declare i32 @vtableLookup(%JavaObject*, %JavaClass*, i32, i32*) readnone +;;; constant pool and returns and stores it in the constant pool cache. +declare i32 @vtableLookup(%JavaObject*, %JavaClass*, i32) readnone ;;; newLookup - Look up a specific class. The function takes a class and an -;;; index to lookup in the constant pool and returns and sets in the third -;;; argument the found class. The last argument tells if the class has to be -;;; initialized. -declare %JavaClass* @newLookup(%JavaClass*, i32, %JavaClass**, i32) readnone +;;; index to lookup in the constant pool and returns and stores it in the +;;; constant pool cache. +declare %JavaClass* @newLookup(%JavaClass*, i32) readnone ;;; fieldLookup - Look up a specific field. -declare i8* @fieldLookup(%JavaObject*, %JavaClass*, i32, i32, i8**, i32*) - readnone +declare i8* @fieldLookup(%JavaObject*, %JavaClass*, i32, i32) readnone ;;; JavaObjectAquire - This function is called when starting a synchronized ;;; block or method. Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-isolate.ll URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-isolate.ll?rev=55176&r1=55175&r2=55176&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-isolate.ll (original) +++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-isolate.ll Fri Aug 22 08:24:20 2008 @@ -7,4 +7,4 @@ declare %JavaObject* @getStaticInstance(%JavaClass*, i8*) readnone ;;; runtimeUTF8ToStr - Convert the UTF8 in a string. -declare %JavaObject* @runtimeUTF8ToStr(%ArraySInt16*) +declare %JavaObject* @stringLookup(%JavaClass*, i32) Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=55176&r1=55175&r2=55176&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Fri Aug 22 08:24:20 2008 @@ -188,6 +188,7 @@ JavaConstantPool::JavaConstantPool(Class* cl, Reader& reader) { ctpSize = reader.readU2(); classDef = cl; + JInfo = 0; ctpRes = new void*[ctpSize]; ctpDef = new sint32[ctpSize]; @@ -271,9 +272,10 @@ const UTF8* name = UTF8At(ctpDef[index]); if (name->elements[0] == AssessorDesc::I_TAB) { temp = loader->constructArray(name); + loader->resolveClass(temp, false); } else { // Put into ctpRes because there is only one representation of the class - temp = loader->loadName(name, false, false, false); + temp = loader->loadName(name, true, false, false); } ctpRes[index] = temp; } @@ -381,8 +383,6 @@ JavaThread::get()->isolate->classFormatError( "bad constant pool number for method at entry %d", index); - if (ctpRes[index]) return ctpRes[index]; - sign = resolveNameAndSign(ctpDef[index] & 0xFFFF); sint32 entry = ctpDef[index]; sint32 ntIndex = entry & 0xFFFF; @@ -396,17 +396,15 @@ // don't throw if no meth, the exception will be thrown just in time JnjvmModule* M = classDef->classLoader->TheModule; void* F = M->getMethod(meth); - ctpRes[index] = (void*)F; return F; } } - // Must be a callback + // Return the callback. void* val = classDef->classLoader->TheModuleProvider->addCallback(classDef, index, sign, isStatic(access)); - ctpRes[index] = val; return val; } @@ -446,25 +444,29 @@ } JavaField* JavaConstantPool::lookupField(uint32 index, bool stat) { - if (!(ctpRes[index])) { - sint32 entry = ctpDef[index]; - sint32 ntIndex = entry & 0xFFFF; - Typedef* sign = (Typedef*)ctpRes[ntIndex]; - const UTF8* utf8 = UTF8At(ctpDef[ntIndex] >> 16); - CommonClass* cl = getMethodClassIfLoaded(entry >> 16); - if (cl && cl->status >= resolved) { - JavaField* field = cl->lookupFieldDontThrow(utf8, sign->keyName, stat, + sint32 entry = ctpDef[index]; + sint32 ntIndex = entry & 0xFFFF; + Typedef* sign = (Typedef*)ctpRes[ntIndex]; + const UTF8* utf8 = UTF8At(ctpDef[ntIndex] >> 16); + CommonClass* cl = getMethodClassIfLoaded(entry >> 16); + if (cl && cl->status >= resolved) { + JavaField* field = cl->lookupFieldDontThrow(utf8, sign->keyName, stat, true); - // don't throw if no field, the exception will be thrown just in time - if (field) { - ctpRes[index] = field; - return field; + // don't throw if no field, the exception will be thrown just in time + if (field) { + if (!stat) { + ctpRes[index] = (void*)field->ptrOffset; + } +#ifndef MULTIPLE_VM + else if (cl->isReady()) { + JavaObject* S = field->classDef->staticInstance(); + ctpRes[index] = (void*)((uint64)S + field->ptrOffset); } - } else { - return 0; +#endif } - } - return (JavaField*)ctpRes[index]; + return field; + } + return 0; } JavaString* JavaConstantPool::resolveString(const UTF8* utf8, uint16 index) { Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h?rev=55176&r1=55175&r2=55176&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h Fri Aug 22 08:24:20 2008 @@ -10,6 +10,7 @@ #ifndef JNJVM_JAVA_CONSTANT_POOL_H #define JNJVM_JAVA_CONSTANT_POOL_H +#include "mvm/JIT.h" #include "mvm/Object.h" #include "types.h" @@ -251,6 +252,7 @@ ctpRes = 0; ctpType = 0; ctpDef = 0; + JInfo = 0; } /// JavaConstantPool - Reads the bytecode of the class to get @@ -265,6 +267,18 @@ delete ctpDef; delete ctpType; } + + mvm::JITInfo* JInfo; + template + Ty *getInfo() { + if (!JInfo) { + JInfo = new Ty(this); + } + + assert((void*)dynamic_cast(JInfo) == (void*)JInfo && + "Invalid concrete type or multiple inheritence for getInfo"); + return static_cast(JInfo); + } }; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=55176&r1=55175&r2=55176&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Fri Aug 22 08:24:20 2008 @@ -80,12 +80,10 @@ LLVMMethodInfo* LMI = module->getMethodInfo(meth); indexes2.push_back(LMI->getOffset()); } else { - GlobalVariable* gv = - new GlobalVariable(Type::Int32Ty, false, GlobalValue::ExternalLinkage, - zero, "", module); - // set is volatile - Value* val = new LoadInst(gv, "", true, currentBlock); + Value* val = getConstantPoolAt(index); + val = new PtrToIntInst(val, Type::Int32Ty, "", currentBlock); + Value * cmp = new ICmpInst(ICmpInst::ICMP_NE, val, zero, "", currentBlock); BasicBlock* ifTrue = createBasicBlock("true vtable"); BasicBlock* ifFalse = createBasicBlock("false vtable"); @@ -105,7 +103,6 @@ Args.push_back(LCI->getVar(this)); Constant* CI = ConstantInt::get(Type::Int32Ty, index); Args.push_back(CI); - Args.push_back(gv); val = invoke(JnjvmModule::VirtualLookupFunction, Args, "", currentBlock); node->addIncoming(val, currentBlock); llvm::BranchInst::Create(endBlock, currentBlock); @@ -1088,54 +1085,49 @@ uint8 type = ctpInfo->typeAt(index); if (type == JavaConstantPool::ConstantString) { - Value* toPush = 0; - if (ctpInfo->ctpRes[index] == 0) { - compilingClass->acquire(); - if (ctpInfo->ctpRes[index] == 0) { - const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[index]); - void* val = 0; - GlobalVariable* gv = 0; -#ifndef MULTIPLE_VM - val = JavaThread::get()->isolate->UTF8ToStr(utf8); - gv = - new GlobalVariable(JnjvmModule::JavaObjectType, false, - GlobalValue::ExternalLinkage, - JnjvmModule::JavaObjectNullConstant, "", - module); -#else - val = (void*)utf8; - gv = - new GlobalVariable(JnjvmModule::JavaArrayUInt16Type, false, - GlobalValue::ExternalLinkage, - JnjvmModule::UTF8NullConstant, "", - module); -#endif - - // TODO: put an initialiser in here - void* ptr = mvm::jit::executionEngine->getPointerToGlobal(gv); - GenericValue Val = GenericValue(val); - llvm::GenericValue * Ptr = (llvm::GenericValue*)ptr; - mvm::jit::executionEngine->StoreValueToMemory(Val, Ptr, - JnjvmModule::JavaObjectType); - toPush = new LoadInst(gv, "", currentBlock); - ctpInfo->ctpRes[index] = gv; - compilingClass->release(); - } else { - compilingClass->release(); - toPush = new LoadInst((GlobalVariable*)ctpInfo->ctpRes[index], "", - currentBlock); - } - } else { - toPush = new LoadInst((GlobalVariable*)ctpInfo->ctpRes[index], "", - currentBlock); - } #ifdef MULTIPLE_VM - CallInst* C = llvm::CallInst::Create(JnjvmModule::RuntimeUTF8ToStrFunction, - toPush, "", currentBlock); - push(C, AssessorDesc::dRef); + // Lookup the constant pool cache + Constant* nil = mvm::jit::constantPtrNull; + Value* val = getConstantPoolAt(index); + Value* cmp = new ICmpInst(ICmpInst::ICMP_NE, nil, val, "", currentBlock); + BasicBlock* ifTrue = createBasicBlock("true string"); + BasicBlock* ifFalse = createBasicBlock("false string"); + BasicBlock* endBlock = createBasicBlock("end string"); + + PHINode * node = PHINode::Create(JnjvmModule::JavaObjectType, "", endBlock); + BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock); + + // ---------- In case we already resolved something --------------------- // + currentBlock = ifTrue; + val = new BitCastInst(val, JnjvmModule::JavaObjectType, "", currentBlock); + node->addIncoming(val, currentBlock); + BranchInst::Create(endBlock, currentBlock); + + // ---------------- In case we have to resolve -------------------------- // + currentBlock = ifFalse; + LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); + Value* v = LCI->getVar(this); + std::vector Args; + Args.push_back(v); + Args.push_back(ConstantInt::get(Type::Int32Ty, index)); + CallInst* C = llvm::CallInst::Create(JnjvmModule::StringLookupFunction, + Args.begin(), Args.end(), + "", currentBlock); + node->addIncoming(C, currentBlock); + BranchInst::Create(endBlock, currentBlock); + + // ---------------------------- The end ----------------------------------// + currentBlock = endBlock; + push(node, AssessorDesc::dRef); + #else - push(toPush, AssessorDesc::dRef); + const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[index]); + JavaString* str = JavaThread::get()->isolate->UTF8ToStr(utf8); + LLVMStringInfo* LSI = module->getStringInfo(str); + Value* val = LSI->getDelegatee(this); + push(val, AssessorDesc::dRef); #endif + } else if (type == JavaConstantPool::ConstantLong) { push(ConstantInt::get(Type::Int64Ty, ctpInfo->LongAt(index)), AssessorDesc::dLong); @@ -1590,16 +1582,28 @@ } } } - -Value* JavaJIT::getResolvedClass(uint16 index, bool clinit) { - GlobalVariable * gv = - new GlobalVariable(JnjvmModule::JavaClassType, false, - GlobalValue::ExternalLinkage, - JnjvmModule::JavaClassNullConstant, "", - module); +Value* JavaJIT::getConstantPoolAt(uint32 index) { + JavaConstantPool* ctp = compilingClass->ctpInfo; + LLVMConstantPoolInfo* LCPI = module->getConstantPoolInfo(ctp); + Value* CTP = LCPI->getDelegatee(this); + + std::vector indexes; //[3]; + indexes.push_back(ConstantInt::get(Type::Int32Ty, index)); + Value* arg1 = GetElementPtrInst::Create(CTP, indexes.begin(), + indexes.end(), + "", currentBlock); + // We set as volatile because "readnone" calls may alter + // the constant pool cache. + arg1 = new LoadInst(arg1, "", true, currentBlock); + + return arg1; +} + +Value* JavaJIT::getResolvedClass(uint16 index, bool clinit) { - Value* arg1 = new LoadInst(gv, "", false, currentBlock); + Value* arg1 = getConstantPoolAt(index); + arg1 = new BitCastInst(arg1, JnjvmModule::JavaClassType, "", currentBlock); Value* test = new ICmpInst(ICmpInst::ICMP_EQ, arg1, JnjvmModule::JavaClassNullConstant, "", currentBlock); @@ -1619,25 +1623,17 @@ Args.push_back(v); ConstantInt* CI = ConstantInt::get(Type::Int32Ty, index); Args.push_back(CI); - Args.push_back(gv); - if (clinit) { - Args.push_back(mvm::jit::constantOne); - } else { - Args.push_back(mvm::jit::constantZero); - } Value* res = invoke(JnjvmModule::ClassLookupFunction, Args, "", currentBlock); node->addIncoming(res, currentBlock); llvm::BranchInst::Create(trueCl, currentBlock); currentBlock = trueCl; -#ifdef MULTIPLE_VM if (clinit) return invoke(JnjvmModule::InitialisationCheckFunction, node, "", currentBlock); else -#endif - return node; + return node; } void JavaJIT::invokeNew(uint16 index) { @@ -1712,36 +1708,34 @@ JavaConstantPool* info = compilingClass->ctpInfo; JavaField* field = info->lookupField(index, stat); - if (field && field->classDef->isResolved() -#ifndef MULTIPLE_VM - && field->classDef->isReady() -#endif - ) { + if (field && field->classDef->isResolved()) { LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(field->classDef); + LLVMFieldInfo* LFI = module->getFieldInfo(field); + const Type* type = 0; if (stat) { - object = LCI->getStaticVar(this); + +#ifndef MULTIPLE_VM + if (field->classDef->isReady()) { +#endif + object = LCI->getStaticVar(this); + type = LCI->getStaticType(); + return fieldGetter(this, type, object, LFI->getOffset()); +#ifndef MULTIPLE_VM + } +#endif + } else { + type = LCI->getVirtualType(); + return fieldGetter(this, type, object, LFI->getOffset()); } - const Type* type = stat ? LCI->getStaticType() : - LCI->getVirtualType(); - LLVMFieldInfo* LFI = module->getFieldInfo(field); - return fieldGetter(this, type, object, LFI->getOffset()); - } else { + } + const Type* Pty = mvm::jit::arrayPtrType; - GlobalVariable* gvStaticInstance = - new GlobalVariable(mvm::jit::ptrType, false, - GlobalValue::ExternalLinkage, - mvm::jit::constantPtrNull, - "", module); - - Constant* zero = mvm::jit::constantZero; - GlobalVariable* gv = - new GlobalVariable(Type::Int32Ty, false, GlobalValue::ExternalLinkage, - zero, "", module); + Constant* nil = mvm::jit::constantPtrNull; - // set is volatile - Value* val = new LoadInst(gv, "", true, currentBlock); - Value * cmp = new ICmpInst(ICmpInst::ICMP_NE, val, zero, "", currentBlock); + Value* val = getConstantPoolAt(index); + // a virtual field can never be zero. + Value * cmp = new ICmpInst(ICmpInst::ICMP_NE, val, nil, "", currentBlock); BasicBlock* ifTrue = createBasicBlock("true ldResolved"); BasicBlock* ifFalse = createBasicBlock("false ldResolved"); BasicBlock* endBlock = createBasicBlock("end ldResolved"); @@ -1753,6 +1747,7 @@ Value* resPtr = 0; if (object) { Value* ptr = new BitCastInst(object, Pty, "", currentBlock); + val = new PtrToIntInst(val, Type::Int32Ty, "", currentBlock); std::vector gepArgs; // size = 1 gepArgs.push_back(zero); gepArgs.push_back(val); @@ -1760,7 +1755,7 @@ "", currentBlock); } else { - resPtr = new LoadInst(gvStaticInstance, "", currentBlock); + resPtr = val; } node->addIncoming(resPtr, currentBlock); @@ -1779,15 +1774,12 @@ Constant* CI = ConstantInt::get(Type::Int32Ty, index); args.push_back(CI); args.push_back(stat ? mvm::jit::constantOne : mvm::jit::constantZero); - args.push_back(gvStaticInstance); - args.push_back(gv); Value* tmp = invoke(JnjvmModule::FieldLookupFunction, args, "", currentBlock); node->addIncoming(tmp, currentBlock); llvm::BranchInst::Create(endBlock, currentBlock); currentBlock = endBlock;; return new BitCastInst(node, fieldTypePtr, "", currentBlock); - } } void JavaJIT::convertValue(Value*& val, const Type* t1, BasicBlock* currentBlock, Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h?rev=55176&r1=55175&r2=55176&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.h Fri Aug 22 08:24:20 2008 @@ -56,6 +56,10 @@ }; class JavaJIT { +private: + + llvm::Value* getConstantPoolAt(uint32 index); + public: JnjvmModule* module; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=55176&r1=55175&r2=55176&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Fri Aug 22 08:24:20 2008 @@ -30,10 +30,13 @@ using namespace jnjvm; -extern "C" JavaString* runtimeUTF8ToStr(const UTF8* val) { - Jnjvm* vm = JavaThread::get()->isolate; - return vm->UTF8ToStr(val); +#ifdef MULTIPLE_VM +extern "C" JavaString* stringLookup(Class* cl, uint32 index) { + const UTF8* utf8 = cl->ctpInfo->UTF8At(cl->ctpInfo->ctpDef[index]); + JavaString* str = JavaThread::get()->isolate->UTF8ToStr(utf8); + return str; } +#endif extern "C" void* jnjvmVirtualLookup(CacheNode* cache, JavaObject *obj) { Enveloppe* enveloppe = cache->enveloppe; @@ -87,18 +90,10 @@ } extern "C" void* fieldLookup(JavaObject* obj, Class* caller, uint32 index, - uint32 stat, void** ifStatic, uint32* offset) { + uint32 stat) { JavaConstantPool* ctpInfo = caller->ctpInfo; if (ctpInfo->ctpRes[index]) { - JavaField* field = (JavaField*)(ctpInfo->ctpRes[index]); - field->classDef->initialiseClass(); - if (stat) obj = field->classDef->staticInstance(); - void* ptr = (void*)(field->ptrOffset + (uint64)obj); -#ifndef MULTIPLE_VM - if (stat) *ifStatic = ptr; - *offset = (uint32)field->ptrOffset; -#endif - return ptr; + return ctpInfo->ctpRes[index]; } CommonClass* cl = 0; @@ -110,15 +105,17 @@ JavaField* field = cl->lookupField(utf8, sign->keyName, stat, true); field->classDef->initialiseClass(); - if (stat) obj = ((Class*)cl)->staticInstance(); - void* ptr = (void*)((uint64)obj + field->ptrOffset); - - ctpInfo->ctpRes[index] = field; + void* ptr = 0; + if (stat) { + ptr = (void*)(((uint64)((Class*)cl)->staticInstance()) + field->ptrOffset); #ifndef MULTIPLE_VM - if (stat) *ifStatic = ptr; - *offset = (uint32)field->ptrOffset; + ctpInfo->ctpRes[index] = ptr; #endif - + } else { + ptr = (void*)((uint64)obj + field->ptrOffset); + ctpInfo->ctpRes[index] = (void*)field->ptrOffset; + } + return ptr; } @@ -196,19 +193,14 @@ return vm->getClassDelegatee(cl); } -extern "C" Class* newLookup(Class* caller, uint32 index, Class** toAlloc, - uint32 clinit) { +extern "C" Class* newLookup(Class* caller, uint32 index) { JavaConstantPool* ctpInfo = caller->ctpInfo; Class* cl = (Class*)ctpInfo->loadClass(index); - cl->resolveClass(clinit); - - *toAlloc = cl; return cl; } #ifndef WITHOUT_VTABLE -extern "C" uint32 vtableLookup(JavaObject* obj, Class* caller, uint32 index, - uint32* offset) { +extern "C" uint32 vtableLookup(JavaObject* obj, Class* caller, uint32 index) { CommonClass* cl = 0; const UTF8* utf8 = 0; Signdef* sign = 0; @@ -220,10 +212,11 @@ // Arg, it should have been an invoke interface.... Perform the lookup // on the object class and do not update offset. dmeth = obj->classOf->lookupMethod(utf8, sign->keyName, false, true); - return dmeth->offset; + } else { + caller->ctpInfo->ctpRes[index] = (void*)dmeth->offset; } - *offset = dmeth->offset; - return *offset; + + return dmeth->offset; } #endif Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=55176&r1=55175&r2=55176&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Fri Aug 22 08:24:20 2008 @@ -102,8 +102,11 @@ llvm::Function* JnjvmModule::AquireObjectFunction = 0; llvm::Function* JnjvmModule::ReleaseObjectFunction = 0; llvm::Function* JnjvmModule::MultiCallNewFunction = 0; -llvm::Function* JnjvmModule::RuntimeUTF8ToStrFunction = 0; + +#ifdef MULTIPLE_VM +llvm::Function* JnjvmModule::StringLookupFunction = 0; llvm::Function* JnjvmModule::GetStaticInstanceFunction = 0; +#endif llvm::Function* JnjvmModule::GetClassDelegateeFunction = 0; llvm::Function* JnjvmModule::ArrayLengthFunction = 0; llvm::Function* JnjvmModule::GetVTFunction = 0; @@ -144,6 +147,20 @@ return new LoadInst(varGV, "", jit->currentBlock); } +Value* LLVMConstantPoolInfo::getDelegatee(JavaJIT* jit) { + if (!delegateeGV) { + void* ptr = ctp->ctpRes; + Constant* cons = + ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64(ptr)), + mvm::jit::ptrPtrType); + delegateeGV = new GlobalVariable(mvm::jit::ptrPtrType, true, + GlobalValue::ExternalLinkage, + cons, "", + ctp->classDef->classLoader->TheModule); + } + return new LoadInst(delegateeGV, "", jit->currentBlock); +} + Value* LLVMCommonClassInfo::getDelegatee(JavaJIT* jit) { #ifndef MULTIPLE_VM if (!delegateeGV) { @@ -864,6 +881,32 @@ #endif +LLVMStringInfo* JnjvmModule::getStringInfo(JavaString* str) { + string_iterator SI = stringMap.find(str); + if (SI != stringMap.end()) { + return SI->second; + } else { + LLVMStringInfo* LSI = new LLVMStringInfo(str); + stringMap.insert(std::make_pair(str, LSI)); + return LSI; + } +} + +Value* LLVMStringInfo::getDelegatee(JavaJIT* jit) { + if (!delegateeGV) { + void* ptr = str; + Constant* cons = + ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64(ptr)), + JnjvmModule::JavaObjectType); + delegateeGV = new GlobalVariable(JnjvmModule::JavaObjectType, true, + GlobalValue::ExternalLinkage, + cons, "", + jit->module); + } + return new LoadInst(delegateeGV, "", jit->currentBlock); +} + + namespace jnjvm { namespace llvm_runtime { #include "LLVMRuntime.inc" @@ -967,7 +1010,7 @@ #ifdef MULTIPLE_VM GetStaticInstanceFunction = module->getFunction("getStaticInstance"); - RuntimeUTF8ToStrFunction = module->getFunction("runtimeUTF8ToStr"); + StringLookupFunction = module->getFunction("stringLookup"); #endif #ifdef SERVICE_VM Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=55176&r1=55175&r2=55176&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Fri Aug 22 08:24:20 2008 @@ -23,6 +23,7 @@ #include "mvm/JIT.h" #include "JavaClass.h" +#include "JavaConstantPool.h" #include "JavaTypes.h" namespace jnjvm { @@ -223,10 +224,61 @@ }; #endif +class LLVMConstantPoolInfo : public mvm::JITInfo { +private: + JavaConstantPool* ctp; + llvm::GlobalVariable* delegateeGV; + +public: + llvm::Value* getDelegatee(JavaJIT* jit); + + LLVMConstantPoolInfo(JavaConstantPool* c) : + ctp(c), delegateeGV(0) {} +}; + +class LLVMStringInfo : public mvm::JITInfo { +private: + JavaString* str; + llvm::GlobalVariable* delegateeGV; + +public: + llvm::Value* getDelegatee(JavaJIT* jit); + + LLVMStringInfo(JavaString* c) : + str(c), delegateeGV(0) {} +}; + class JnjvmModule : public llvm::Module { friend class LLVMClassInfo; private: + std::map classMap; + std::map signatureMap; + std::map fieldMap; + std::map methodMap; + std::map stringMap; + +#ifdef SERVICE_VM + std::map serviceMap; + typedef std::map::iterator + class_iterator; +#endif + + typedef std::map::iterator + class_iterator; + typedef std::map::iterator + signature_iterator; + + typedef std::map::iterator + method_iterator; + + typedef std::map::iterator + field_iterator; + + typedef std::map::iterator + string_iterator; + + static VirtualTable* makeVT(Class* cl, bool stat); static VirtualTable* allocateVT(Class* cl, CommonClass::method_iterator meths); @@ -292,8 +344,12 @@ static llvm::Function* ServiceCallStopFunction; #endif static llvm::Function* MultiCallNewFunction; - static llvm::Function* RuntimeUTF8ToStrFunction; + +#ifdef MULTIPLE_VM + static llvm::Function* StringLookupFunction; static llvm::Function* GetStaticInstanceFunction; +#endif + static llvm::Function* GetClassDelegateeFunction; static llvm::Function* ArrayLengthFunction; static llvm::Function* GetVTFunction; @@ -367,6 +423,12 @@ return method->getInfo(); } + static LLVMConstantPoolInfo* getConstantPoolInfo(JavaConstantPool* ctp) { + return ctp->getInfo(); + } + + LLVMStringInfo* getStringInfo(JavaString* str); + #ifdef SERVICE_VM static LLVMServiceInfo* getServiceInfo(ServiceDomain* service) { return service->getInfo(); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=55176&r1=55175&r2=55176&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Fri Aug 22 08:24:20 2008 @@ -47,24 +47,21 @@ return meth; } -bool JnjvmModuleProvider::lookupCallback(Function* F, std::pair& res) { +std::pair* JnjvmModuleProvider::lookupCallback(Function* F) { callback_iterator CI = callbacks.find(F); if (CI != callbacks.end()) { - res.first = CI->second.first; - res.second = CI->second.second; - return true; + return &(CI->second); } else { - return false; + return 0; } } -bool JnjvmModuleProvider::lookupFunction(Function* F, JavaMethod*& meth) { +JavaMethod* JnjvmModuleProvider::lookupFunction(Function* F) { function_iterator CI = functions.find(F); if (CI != functions.end()) { - meth = CI->second; - return true; + return CI->second; } else { - return false; + return 0; } } @@ -77,14 +74,13 @@ if (!(F->hasNotBeenReadFromBitcode())) return false; - JavaMethod* meth = 0; - lookupFunction(F, meth); + JavaMethod* meth = lookupFunction(F); if (!meth) { // It's a callback - std::pair p; - lookupCallback(F, p); - meth = staticLookup(p.first, p.second); + std::pair * p = lookupCallback(F); + assert(p && "No callback where there should be one"); + meth = staticLookup(p->first, p->second); } void* val = meth->compiledPtr(); @@ -155,6 +151,14 @@ llvm::Function* JnjvmModuleProvider::addCallback(Class* cl, uint32 index, Signdef* sign, bool stat) { + + void* key = &(cl->ctpInfo->ctpRes[index]); + + reverse_callback_iterator CI = reverseCallbacks.find(key); + if (CI != reverseCallbacks.end()) { + return CI->second; + } + const llvm::FunctionType* type = 0; JnjvmModule* M = cl->classLoader->TheModule; LLVMSignatureInfo* LSI = M->getSignatureInfo(sign); @@ -164,12 +168,15 @@ } else { type = LSI->getVirtualType(); } + Function* func = llvm::Function::Create(type, llvm::GlobalValue::GhostLinkage, "callback", TheModule); callbacks.insert(std::make_pair(func, std::make_pair(cl, index))); + reverseCallbacks.insert(std::make_pair(key, func)); + return func; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h?rev=55176&r1=55175&r2=55176&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h Fri Aug 22 08:24:20 2008 @@ -28,15 +28,19 @@ std::map functions; std::map > callbacks; + std::map reverseCallbacks; - bool lookupCallback(llvm::Function*, std::pair&); - bool lookupFunction(llvm::Function*, JavaMethod*& meth); + std::pair* lookupCallback(llvm::Function*); + JavaMethod* lookupFunction(llvm::Function*); typedef std::map::iterator function_iterator; typedef std::map >::iterator callback_iterator; + + typedef std::map::iterator + reverse_callback_iterator; llvm::FunctionPassManager* perFunctionPasses; From nicolas.geoffray at lip6.fr Fri Aug 22 09:46:58 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 22 Aug 2008 16:46:58 -0000 Subject: [vmkit-commits] [vmkit] r55183 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathVMClass.cpp.inc Classpath/ClasspathVMClassLoader.cpp.inc VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/JavaConstantPool.cpp VMCore/JavaJIT.cpp VMCore/JavaMetaJIT.cpp VMCore/JavaRuntimeJIT.cpp VMCore/JavaTypes.cpp VMCore/JavaUpcalls.cpp VMCore/Jni.cpp VMCore/Jnjvm.cpp VMCore/JnjvmClassLoader.cpp VMCore/JnjvmClassLoader.h VMCore/JnjvmModuleProvider.cpp VMCore/NativeUtil.cpp Message-ID: <200808221646.m7MGkxXP024727@zion.cs.uiuc.edu> Author: geoffray Date: Fri Aug 22 11:46:57 2008 New Revision: 55183 URL: http://llvm.org/viewvc/llvm-project?rev=55183&view=rev Log: A class knows how to resolve itself, but not how to initialise itself. A virtual machine knows how to initialise a class. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc 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/JavaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc?rev=55183&r1=55182&r2=55183&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc Fri Aug 22 11:46:57 2008 @@ -55,7 +55,7 @@ JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader); CommonClass* cl = JCL->lookupClassFromJavaString((JavaString*)str, - true, false, false); + true, false); if (cl != 0) { if (clinit) { cl->initialiseClass(); @@ -244,7 +244,7 @@ CommonClass* cl2 = (CommonClass*)Classpath::vmdataClass->getVirtualObjectField((JavaObject*)Cl2); - cl2->resolveClass(false); + cl2->resolveClass(); return cl2->isAssignableFrom(cl1); } @@ -260,7 +260,7 @@ if (isInterface(cl->access)) return 0; else { - cl->resolveClass(false); + cl->resolveClass(); if (cl->super) return (jobject)JavaThread::get()->isolate->getClassDelegatee(cl->super); else return 0; } Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc?rev=55183&r1=55182&r2=55183&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc Fri Aug 22 11:46:57 2008 @@ -69,7 +69,7 @@ JavaString* str = (JavaString*)_str; JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; - CommonClass* cl = JCL->lookupClassFromJavaString(str, doResolve, false, false); + CommonClass* cl = JCL->lookupClassFromJavaString(str, doResolve, false); if (cl != 0) { return (jclass)cl->getClassDelegatee(); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=55183&r1=55182&r2=55183&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Fri Aug 22 11:46:57 2008 @@ -275,7 +275,7 @@ } else if (name->elements[start] == AssessorDesc::I_REF) { const UTF8* componentName = name->javaToInternal(loader->hashUTF8, start + 1, len - 2); - CommonClass* cl = loader->loadName(componentName, false, false, true); + CommonClass* cl = loader->loadName(componentName, false, true); return cl->classLoader; } else { return JnjvmClassLoader::bootstrapLoader; @@ -428,7 +428,7 @@ while (res && Tname->elements[prof] == AssessorDesc::I_TAB) { CommonClass* cl = ((ClassArray*)curS)->baseClass(); ++prof; - classLoader->resolveClass(cl, false); + classLoader->resolveClass(cl); res = curS->isArray && cl && (prof < len); curS = cl; } @@ -528,8 +528,8 @@ return JavaThread::get()->isolate->getClassDelegatee(this, pd); } -void CommonClass::resolveClass(bool doClinit) { - classLoader->resolveClass(this, doClinit); +void CommonClass::resolveClass() { + classLoader->resolveClass(this); } void CommonClass::initialiseClass() { Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=55183&r1=55182&r2=55183&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Fri Aug 22 11:46:57 2008 @@ -386,7 +386,7 @@ /// resolveClass - If the class has not been resolved yet, resolve it. /// - void resolveClass(bool doClinit); + void resolveClass(); #ifndef MULTIPLE_VM /// getStatus - Get the resolution/initialization status of this class. @@ -397,12 +397,12 @@ /// isReady - Has this class been initialized? /// bool isReady() { - return status == ready; + return status >= inClinit; } #else JavaState* getStatus(); bool isReady() { - return *getStatus() == ready; + return *getStatus() >= inClinit; } #endif Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=55183&r1=55182&r2=55183&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Fri Aug 22 11:46:57 2008 @@ -272,10 +272,10 @@ const UTF8* name = UTF8At(ctpDef[index]); if (name->elements[0] == AssessorDesc::I_TAB) { temp = loader->constructArray(name); - loader->resolveClass(temp, false); + loader->resolveClass(temp); } else { // Put into ctpRes because there is only one representation of the class - temp = loader->loadName(name, true, false, false); + temp = loader->loadName(name, true, false); } ctpRes[index] = temp; } @@ -429,7 +429,7 @@ assert(sign && "No cached signature after JITting"); utf8 = UTF8At(ctpDef[ntIndex] >> 16); cl = loadClass(entry >> 16); - cl->resolveClass(true); + cl->resolveClass(); } void JavaConstantPool::resolveField(uint32 index, CommonClass*& cl, @@ -440,7 +440,7 @@ assert(sign && "No cached Typedef after JITting"); utf8 = UTF8At(ctpDef[ntIndex] >> 16); cl = loadClass(entry >> 16); - cl->resolveClass(true); + cl->resolveClass(); } JavaField* JavaConstantPool::lookupField(uint32 index, bool stat) { Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=55183&r1=55182&r2=55183&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Fri Aug 22 11:46:57 2008 @@ -1655,9 +1655,14 @@ VT = LCI->getVirtualTable(this); Cl = LCI->getVar(this); #ifndef MULTIPLE_VM - if (!cl->isReady()) + if (!cl->isReady()) { +#endif + Cl = invoke(JnjvmModule::InitialisationCheckFunction, Cl, "", currentBlock); + CallInst::Create(JnjvmModule::ForceInitialisationCheckFunction, Cl, "", + currentBlock); +#ifndef MULTIPLE_VM + } #endif - Cl = invoke(JnjvmModule::InitialisationCheckFunction, Cl, "", currentBlock); } std::vector args; args.push_back(Size); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp?rev=55183&r1=55182&r2=55183&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp Fri Aug 22 11:46:57 2008 @@ -30,8 +30,9 @@ char const* sign, int access, ...) { CommonClass* cl = loader->loadName(loader->asciizConstructUTF8(className), - true, true, true); + true, true); + vm->initialiseClass(cl); bool stat = access == ACC_STATIC ? true : false; JavaMethod* method = cl->lookupMethod(loader->asciizConstructUTF8(func), loader->asciizConstructUTF8(sign), stat, @@ -91,9 +92,10 @@ #define INVOKE(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \ \ TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap) { \ - if (!classDef->isReady()) \ - classDef->classLoader->loadName(classDef->name, true, true, true); \ - \ + if (!classDef->isReady()) { \ + classDef->classLoader->loadName(classDef->name, true, true); \ + vm->initialiseClass(classDef); \ + } \ verifyNull(obj); \ Signdef* sign = getSignature(); \ void** buf = (void**)alloca(sign->args.size() * sizeof(uint64)); \ @@ -104,8 +106,10 @@ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap) {\ - if (!classDef->isReady())\ - classDef->classLoader->loadName(classDef->name, true, true, true);\ + if (!classDef->isReady()) { \ + classDef->classLoader->loadName(classDef->name, true, true); \ + vm->initialiseClass(classDef); \ + } \ \ verifyNull(obj);\ Signdef* sign = getSignature(); \ @@ -117,8 +121,10 @@ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, va_list ap) {\ - if (!classDef->isReady())\ - classDef->classLoader->loadName(classDef->name, true, true, true);\ + if (!classDef->isReady()) { \ + classDef->classLoader->loadName(classDef->name, true, true); \ + vm->initialiseClass(classDef); \ + } \ \ Signdef* sign = getSignature(); \ void** buf = (void**)alloca(sign->args.size() * sizeof(uint64)); \ @@ -129,8 +135,10 @@ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\ - if (!classDef->isReady())\ - classDef->classLoader->loadName(classDef->name, true, true, true);\ + if (!classDef->isReady()) { \ + classDef->classLoader->loadName(classDef->name, true, true); \ + vm->initialiseClass(classDef); \ + } \ \ verifyNull(obj);\ JavaMethod* meth = obj->classOf->lookupMethod(name, type, false, true);\ @@ -141,8 +149,10 @@ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\ - if (!classDef->isReady())\ - classDef->classLoader->loadName(classDef->name, true, true, true);\ + if (!classDef->isReady()) { \ + classDef->classLoader->loadName(classDef->name, true, true); \ + vm->initialiseClass(classDef); \ + } \ \ verifyNull(obj);\ void* func = this->compiledPtr();\ @@ -151,8 +161,10 @@ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, void* buf) {\ - if (!classDef->isReady())\ - classDef->classLoader->loadName(classDef->name, true, true, true);\ + if (!classDef->isReady()) { \ + classDef->classLoader->loadName(classDef->name, true, true); \ + vm->initialiseClass(classDef); \ + } \ \ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ @@ -188,8 +200,10 @@ #define INVOKE(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \ \ TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap) { \ - if (!classDef->isReady()) \ - classDef->classLoader->loadName(classDef->name, true, true, true); \ + if (!classDef->isReady()) { \ + classDef->classLoader->loadName(classDef->name, true, true); \ + vm->initialiseClass(classDef); \ + } \ \ verifyNull(obj); \ void* func = (((void***)obj)[0])[offset];\ @@ -198,8 +212,10 @@ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap) {\ - if (!classDef->isReady())\ - classDef->classLoader->loadName(classDef->name, true, true, true);\ + if (!classDef->isReady()) { \ + classDef->classLoader->loadName(classDef->name, true, true); \ + vm->initialiseClass(classDef); \ + } \ \ verifyNull(obj);\ void* func = this->compiledPtr();\ @@ -208,8 +224,10 @@ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, va_list ap) {\ - if (!classDef->isReady())\ - classDef->classLoader->loadName(classDef->name, true, true, true);\ + if (!classDef->isReady()) { \ + classDef->classLoader->loadName(classDef->name, true, true); \ + vm->initialiseClass(classDef); \ + } \ \ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ @@ -217,8 +235,10 @@ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\ - if (!classDef->isReady())\ - classDef->classLoader->loadName(classDef->name, true, true, true);\ + if (!classDef->isReady()) { \ + classDef->classLoader->loadName(classDef->name, true, true); \ + vm->initialiseClass(classDef); \ + } \ \ verifyNull(obj);\ void* func = (((void***)obj)[0])[offset];\ @@ -227,8 +247,10 @@ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\ - if (!classDef->isReady())\ - classDef->classLoader->loadName(classDef->name, true, true, true);\ + if (!classDef->isReady()) { \ + classDef->classLoader->loadName(classDef->name, true, true); \ + vm->initialiseClass(classDef); \ + } \ \ verifyNull(obj);\ void* func = this->compiledPtr();\ @@ -237,8 +259,10 @@ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, void* buf) {\ - if (!classDef->isReady())\ - classDef->classLoader->loadName(classDef->name, true, true, true);\ + if (!classDef->isReady()) { \ + classDef->classLoader->loadName(classDef->name, true, true); \ + vm->initialiseClass(classDef); \ + } \ \ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=55183&r1=55182&r2=55183&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Fri Aug 22 11:46:57 2008 @@ -48,6 +48,7 @@ uint32 index = enveloppe->index; ctpInfo->resolveMethod(index, cl, utf8, sign); + assert(obj->classOf->isReady() && "Class not ready in a virtual lookup."); enveloppe->cacheLock->lock(); CacheNode* rcache = 0; @@ -66,6 +67,8 @@ if (!rcache) { JavaMethod* dmeth = ocl->lookupMethod(utf8, sign->keyName, false, true); + assert(dmeth->classDef->isReady() && + "Class not ready in a virtual lookup."); if (cache->methPtr) { rcache = new CacheNode(enveloppe); } else { @@ -103,11 +106,12 @@ ctpInfo->resolveField(index, cl, utf8, sign); JavaField* field = cl->lookupField(utf8, sign->keyName, stat, true); - field->classDef->initialiseClass(); void* ptr = 0; if (stat) { - ptr = (void*)(((uint64)((Class*)cl)->staticInstance()) + field->ptrOffset); + Class* fieldCl = field->classDef; + JavaThread::get()->isolate->initialiseClass(fieldCl); + ptr = (void*)((uint64)(fieldCl->staticInstance()) + field->ptrOffset); #ifndef MULTIPLE_VM ctpInfo->ctpRes[index] = ptr; #endif @@ -208,6 +212,7 @@ caller->ctpInfo->resolveMethod(index, cl, utf8, sign); JavaMethod* dmeth = cl->lookupMethodDontThrow(utf8, sign->keyName, false, true); + assert(obj->classOf->isReady() && "Class not ready in a virtual lookup."); if (!dmeth) { // Arg, it should have been an invoke interface.... Perform the lookup // on the object class and do not update offset. @@ -216,6 +221,8 @@ caller->ctpInfo->ctpRes[index] = (void*)dmeth->offset; } + assert(dmeth->classDef->isReady() && "Class not ready in a virtual lookup."); + return dmeth->offset; } #endif Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp?rev=55183&r1=55182&r2=55183&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp Fri Aug 22 11:46:57 2008 @@ -302,15 +302,16 @@ analyseIntern(utf8, start, 1, funcs, intern); if (funcs != dTab) { - JavaThread::get()->isolate->unknownError("%s isn't an array", utf8->printString()); + Jnjvm* vm = JavaThread::get()->isolate; + vm->unknownError("%s isn't an array", utf8->printString()); } analyseIntern(utf8, intern, 0, funcs, pos); if (funcs == dRef) { ass = dRef; - res = loader->loadName(utf8->extract(loader->hashUTF8, intern + 1, pos - 1), false, - false, true); + const UTF8* temp = utf8->extract(loader->hashUTF8, intern + 1, pos - 1); + res = loader->loadName(temp, false, true); } else if (funcs == dTab) { ass = dTab; res = loader->constructArray(utf8->extract(loader->hashUTF8, intern, pos)); @@ -412,7 +413,7 @@ if (pseudoAssocClassName == 0) { return funcs->classType; } else if (funcs == AssessorDesc::dRef) { - return loader->loadName(pseudoAssocClassName, false, true, true); + return loader->loadName(pseudoAssocClassName, false, true); } else { return loader->constructArray(pseudoAssocClassName); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=55183&r1=55182&r2=55183&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Fri Aug 22 11:46:57 2008 @@ -305,7 +305,8 @@ void ClasspathThread::createInitialThread(Jnjvm* vm, JavaObject* th) { JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; - JCL->loadName(newVMThread->name, true, true, true); + JCL->loadName(newVMThread->name, true, true); + vm->initialiseClass(newVMThread); JavaObject* vmth = newVMThread->doNew(vm); name->setVirtualObjectField(th, (JavaObject*)vm->asciizToStr("main")); @@ -315,8 +316,8 @@ assocThread->setVirtualObjectField(vmth, th); running->setVirtualInt8Field(vmth, (uint32)1); - JCL->loadName(rootGroup->classDef->name, - true, true, true); + JCL->loadName(rootGroup->classDef->name, true, true); + vm->initialiseClass(rootGroup->classDef); JavaObject* RG = rootGroup->getStaticObjectField(); group->setVirtualObjectField(th, RG); groupAddThread->invokeIntSpecial(vm, RG, th); @@ -324,7 +325,8 @@ void ClasspathThread::mapInitialThread(Jnjvm* vm) { JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; - JCL->loadName(newThread->name, true, true, true); + JCL->loadName(newThread->name, true, true); + vm->initialiseClass(newThread); JavaObject* th = newThread->doNew(vm); createInitialThread(vm, th); JavaThread* myth = JavaThread::get(); @@ -525,10 +527,10 @@ ClasspathException::initialise(vm); vm->loadName(vm->asciizConstructUTF8("java/lang/String"), - true, false, false); + true, false); vm->loadName(vm->asciizConstructUTF8("java/lang/Object"), - true, false, false); + true, false); // Don't compile methods here, we still don't know where to allocate Java // strings. Modified: vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp?rev=55183&r1=55182&r2=55183&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp Fri Aug 22 11:46:57 2008 @@ -71,8 +71,8 @@ sint32 len = utf8->size; - CommonClass* cl = loader->lookupClassFromUTF8(utf8, 0, len, true, true, - true); + CommonClass* cl = loader->lookupClassFromUTF8(utf8, 0, len, true, true); + JavaThread::get()->isolate->initialiseClass(cl); return (jclass)(cl->getClassDelegatee()); END_EXCEPTION Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55183&r1=55182&r2=55183&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Fri Aug 22 11:46:57 2008 @@ -666,9 +666,12 @@ void Jnjvm::loadBootstrap() { JnjvmClassLoader* loader = JnjvmClassLoader::bootstrapLoader; #define LOAD_CLASS(cl) \ - loader->loadName(cl->name, true, true, true); + loader->loadName(cl->name, true, true);\ + initialiseClass(cl); + LOAD_CLASS(Classpath::newClass); LOAD_CLASS(Classpath::newConstructor); + LOAD_CLASS(Classpath::newString); LOAD_CLASS(Classpath::newMethod); LOAD_CLASS(Classpath::newField); LOAD_CLASS(Classpath::newStackTraceElement); @@ -712,8 +715,9 @@ appClassLoader->getJavaClassLoader()); // load and initialise math since it is responsible for dlopen'ing // libjavalang.so and we are optimizing some math operations - loader->loadName(loader->asciizConstructUTF8("java/lang/Math"), - true, true, true); + CommonClass* math = + loader->loadName(loader->asciizConstructUTF8("java/lang/Math"), true, true); + initialiseClass(math); } void Jnjvm::executeClass(const char* className, ArrayObject* args) { Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55183&r1=55182&r2=55183&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Fri Aug 22 11:46:57 2008 @@ -121,7 +121,7 @@ cl->display[0] = cl; cl->virtualTableSize = VT_SIZE / sizeof(void*); } else { - cl->super = loadName(super, true, false, true); + cl->super = loadName(super, true, true); int depth = cl->super->depth + 1; cl->depth = depth; cl->virtualTableSize = cl->super->virtualTableSize; @@ -132,7 +132,7 @@ for (int i = 0; i < nbI; i++) cl->interfaces.push_back((Class*)loadName(cl->interfacesUTF8[i], - true, false, true)); + true, true)); } void JnjvmClassLoader::readAttributs(Class* cl, Reader& reader, @@ -239,7 +239,7 @@ } -void JnjvmClassLoader::resolveClass(CommonClass* cl, bool doClinit) { +void JnjvmClassLoader::resolveClass(CommonClass* cl) { if (cl->status < resolved) { cl->acquire(); int status = cl->status; @@ -252,7 +252,7 @@ if (cl->isArray) { ClassArray* arrayCl = (ClassArray*)cl; CommonClass* baseClass = arrayCl->baseClass(); - baseClass->resolveClass(doClinit); + baseClass->resolveClass(); cl->status = resolved; } else { readClass((Class*)cl); @@ -273,7 +273,6 @@ cl->release(); } } - if (doClinit) cl->initialiseClass(); } CommonClass* JnjvmBootstrapLoader::internalLoad(const UTF8* name) { @@ -320,7 +319,7 @@ } CommonClass* JnjvmClassLoader::loadName(const UTF8* name, bool doResolve, - bool doClinit, bool doThrow) { + bool doThrow) { CommonClass* cl = internalLoad(name); @@ -332,14 +331,14 @@ JavaThread::get()->isolate->noClassDefFoundError("unable to load %s", name->printString()); } - if (cl && doResolve) cl->resolveClass(doClinit); + if (cl && doResolve) cl->resolveClass(); return cl; } CommonClass* JnjvmClassLoader::lookupClassFromUTF8(const UTF8* utf8, unsigned int start, unsigned int len, - bool doResolve, bool doClinit, + bool doResolve, bool doThrow) { uint32 origLen = len; const UTF8* name = utf8->javaToInternal(hashUTF8, start, len); @@ -367,10 +366,9 @@ const UTF8* componentName = utf8->javaToInternal(hashUTF8, start + 1, len - 2); - if (loadName(componentName, doResolve, doClinit, - doThrow)) { + if (loadName(componentName, doResolve, doThrow)) { ret = constructArray(name); - if (doResolve) ret->resolveClass(doClinit); + if (doResolve) ret->resolveClass(); doLoop = false; } else { doLoop = false; @@ -385,7 +383,7 @@ && ((uint32)name->size) == start + 1) { ret = constructArray(name); - ret->resolveClass(doClinit); + ret->resolveClass(); doLoop = false; } else { doLoop = false; @@ -398,15 +396,14 @@ return ret; } else { - return loadName(name, doResolve, doClinit, doThrow); + return loadName(name, doResolve, doThrow); } } CommonClass* JnjvmClassLoader::lookupClassFromJavaString(JavaString* str, - bool doResolve, bool doClinit, - bool doThrow) { + bool doResolve, bool doThrow) { return lookupClassFromUTF8(str->value, str->offset, str->count, - doResolve, doClinit, doThrow); + doResolve, doThrow); } CommonClass* JnjvmClassLoader::lookupClass(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=55183&r1=55182&r2=55183&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Fri Aug 22 11:46:57 2008 @@ -161,24 +161,22 @@ /// loadName - Loads the class of the given name. /// - CommonClass* loadName(const UTF8* name, bool doResolve, bool doClinit, - bool doThrow); + CommonClass* loadName(const UTF8* name, bool doResolve, bool doThrow); /// lookupClassFromUTF8 - Lookup a class from an UTF8 name and load it. /// CommonClass* lookupClassFromUTF8(const UTF8* utf8, unsigned int start, - unsigned int len, - bool doResolve, bool doClinit, bool doThrow); + unsigned int len, bool doResolve, + bool doThrow); /// lookupClassFromJavaString - Lookup a class from a Java String and load it. /// - CommonClass* lookupClassFromJavaString(JavaString* str, - bool doResolve, bool doClinit, + CommonClass* lookupClassFromJavaString(JavaString* str, bool doResolve, bool doThrow); /// resolveClass - Resolves the class. /// - void resolveClass(CommonClass* cl, bool doClinit); + void resolveClass(CommonClass* cl); /// lookupClass - Finds the class of th given name in the class loader's /// table. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=55183&r1=55182&r2=55183&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Fri Aug 22 11:46:57 2008 @@ -36,9 +36,11 @@ Signdef* sign = 0; ctpInfo->resolveMethod(index, cl, utf8, sign); - JavaMethod* meth = cl->lookupMethod(utf8, sign->keyName, isStatic, true); + if (!isVirtual(meth->access)) + JavaThread::get()->isolate->initialiseClass(cl); + meth->compiledPtr(); LLVMMethodInfo* LMI = ((JnjvmModule*)TheModule)->getMethodInfo(meth); @@ -86,15 +88,18 @@ void* val = meth->compiledPtr(); if (F->isDeclaration()) mvm::jit::executionEngine->updateGlobalMapping(F, val); - + if (isVirtual(meth->access)) { LLVMMethodInfo* LMI = ((JnjvmModule*)TheModule)->getMethodInfo(meth); uint64_t offset = LMI->getOffset()->getZExtValue(); assert(meth->classDef->isResolved() && "Class not resolved"); + assert(meth->classDef->isReady() && "Class not ready"); assert(meth->classDef->virtualVT && "Class has no VT"); assert(meth->classDef->virtualTableSize > offset && "The method's offset is greater than the virtual table size"); ((void**)meth->classDef->virtualVT)[offset] = val; + } else { + JavaThread::get()->isolate->initialiseClass(meth->classDef); } return false; Modified: vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp?rev=55183&r1=55182&r2=55183&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp Fri Aug 22 11:46:57 2008 @@ -229,7 +229,8 @@ CommonClass* NativeUtil::resolvedImplClass(jclass clazz, bool doClinit) { JavaObject *Cl = (JavaObject*)clazz; CommonClass* cl = (CommonClass*)Classpath::vmdataClass->getVirtualObjectField(Cl); - cl->resolveClass(doClinit); + cl->resolveClass(); + JavaThread::get()->isolate->initialiseClass(cl); return cl; } @@ -412,7 +413,7 @@ for (uint16 i = 0; i < nbe; ++i) { uint16 idx = reader.readU2(); CommonClass* cl = ctp->loadClass(idx); - cl->resolveClass(false); + cl->resolveClass(); JavaObject* obj = cl->getClassDelegatee(); res->elements[i] = obj; } From nicolas.geoffray at lip6.fr Fri Aug 22 10:19:54 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 22 Aug 2008 17:19:54 -0000 Subject: [vmkit-commits] [vmkit] r55185 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathConstructor.cpp.inc Classpath/ClasspathMethod.cpp.inc Classpath/ClasspathVMClass.cpp.inc VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/JavaRuntimeJIT.cpp VMCore/Jnjvm.cpp VMCore/JnjvmClassLoader.cpp VMCore/JnjvmClassLoader.h Message-ID: <200808221719.m7MHJsMh028707@zion.cs.uiuc.edu> Author: geoffray Date: Fri Aug 22 12:19:53 2008 New Revision: 55185 URL: http://llvm.org/viewvc/llvm-project?rev=55185&view=rev Log: A class knows how to read itself. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc?rev=55185&r1=55184&r2=55185&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc Fri Aug 22 12:19:53 2008 @@ -67,7 +67,7 @@ CommonClass* _cl = NativeUtil::resolvedImplClass(Clazz, false); if (!_cl->isArray) { Class* cl = (Class*)_cl; - cl->initialiseClass(); + vm->initialiseClass(cl); JavaObject* res = cl->doNew(vm); JavaObject** ptr = (JavaObject**)(void*)(args->elements); Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc?rev=55185&r1=55184&r2=55185&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc Fri Aug 22 12:19:53 2008 @@ -84,7 +84,7 @@ } } else { - cl->initialiseClass(); + vm->initialiseClass(cl); } JavaObject** ptr = (JavaObject**)(void*)(args->elements); Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc?rev=55185&r1=55184&r2=55185&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc Fri Aug 22 12:19:53 2008 @@ -58,7 +58,7 @@ true, false); if (cl != 0) { if (clinit) { - cl->initialiseClass(); + JavaThread::get()->isolate->initialiseClass(cl); } return (jclass)(cl->getClassDelegatee()); } else { Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=55185&r1=55184&r2=55185&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Fri Aug 22 12:19:53 2008 @@ -7,11 +7,14 @@ // //===----------------------------------------------------------------------===// +#define JNJVM_LOAD 0 + #include #include #include "mvm/JIT.h" +#include "debug.h" #include "types.h" #include "JavaArray.h" @@ -532,10 +535,6 @@ classLoader->resolveClass(this); } -void CommonClass::initialiseClass() { - return JavaThread::get()->isolate->initialiseClass(this); -} - #ifdef MULTIPLE_VM JavaObject* Class::staticInstance() { std::pair* val = @@ -629,3 +628,104 @@ } } +void Class::readParents(Reader& reader) { + unsigned short int superEntry = reader.readU2(); + const UTF8* super = superEntry ? + ctpInfo->resolveClassName(superEntry) : 0; + + unsigned short int nbI = reader.readU2(); + superUTF8 = super; + for (int i = 0; i < nbI; i++) + interfacesUTF8.push_back(ctpInfo->resolveClassName(reader.readU2())); + +} + +void Class::loadParents() { + int nbI = interfacesUTF8.size(); + if (superUTF8 == 0) { + depth = 0; + display = (CommonClass**)malloc(sizeof(CommonClass*)); + display[0] = this; + virtualTableSize = VT_SIZE / sizeof(void*); + } else { + super = classLoader->loadName(superUTF8, true, true); + depth = super->depth + 1; + virtualTableSize = super->virtualTableSize; + display = (CommonClass**)malloc((depth + 1) * sizeof(CommonClass*)); + memcpy(display, super->display, depth * sizeof(CommonClass*)); + display[depth] = this; + } + + for (int i = 0; i < nbI; i++) + interfaces.push_back((Class*)classLoader->loadName(interfacesUTF8[i], + true, true)); +} + +void Class::readAttributs(Reader& reader, std::vector& attr) { + unsigned short int nba = reader.readU2(); + + for (int i = 0; i < nba; i++) { + const UTF8* attName = ctpInfo->UTF8At(reader.readU2()); + uint32 attLen = reader.readU4(); + Attribut* att = new Attribut(attName, attLen, reader.cursor); + attr.push_back(att); + reader.seek(attLen, Reader::SeekCur); + } +} + +void Class::readFields(Reader& reader) { + uint16 nbFields = reader.readU2(); + uint32 sindex = 0; + uint32 vindex = 0; + for (int i = 0; i < nbFields; i++) { + uint16 access = reader.readU2(); + const UTF8* name = ctpInfo->UTF8At(reader.readU2()); + const UTF8* type = ctpInfo->UTF8At(reader.readU2()); + JavaField* field = constructField(name, type, access); + isStatic(access) ? + field->num = sindex++ : + field->num = vindex++; + readAttributs(reader, field->attributs); + } +} + +void Class::readMethods(Reader& reader) { + uint16 nbMethods = reader.readU2(); + for (int i = 0; i < nbMethods; i++) { + uint16 access = reader.readU2(); + const UTF8* name = ctpInfo->UTF8At(reader.readU2()); + const UTF8* type = ctpInfo->UTF8At(reader.readU2()); + JavaMethod* meth = constructMethod(name, type, access); + readAttributs(reader, meth->attributs); + } +} + +void Class::readClass() { + + PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "; ", 0); + PRINT_DEBUG(JNJVM_LOAD, 0, LIGHT_GREEN, "reading ", 0); + PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "%s\n", printString()); + + Reader reader(bytes); + uint32 magic = reader.readU4(); + if (magic != Jnjvm::Magic) { + JavaThread::get()->isolate->classFormatError("bad magic number %p", magic); + } + minor = reader.readU2(); + major = reader.readU2(); + ctpInfo = new JavaConstantPool(this, reader); + access = reader.readU2(); + + const UTF8* thisClassName = + ctpInfo->resolveClassName(reader.readU2()); + + if (!(thisClassName->equals(name))) { + JavaThread::get()->isolate->classFormatError("try to load %s and found class named %s", + printString(), thisClassName->printString()); + } + + readParents(reader); + readFields(reader); + readMethods(reader); + readAttributs(reader, attributs); +} Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=55185&r1=55184&r2=55185&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Fri Aug 22 12:19:53 2008 @@ -380,10 +380,6 @@ /// JavaObject* getClassDelegatee(JavaObject* pd = 0); - /// initialiseClass - If the class has a static initializer and has not been - /// initialized yet, call it. - void initialiseClass(); - /// resolveClass - If the class has not been resolved yet, resolve it. /// void resolveClass(); @@ -552,6 +548,30 @@ /// name. Class(JnjvmClassLoader* loader, const UTF8* name); + /// readParents - Reads the parents, i.e. super and interfaces, of the class. + /// + void readParents(Reader& reader); + + /// loadParents - Loads and resolves the parents, i.e. super and interfarces, + /// of the class. + /// + void loadParents(); + + /// readAttributs - Reads the attributs of the class. + /// + void readAttributs(Reader& reader, std::vector & attr); + + /// readFields - Reads the fields of the class. + /// + void readFields(Reader& reader); + + /// readMethods - Reads the methods of the class. + /// + void readMethods(Reader& reader); + + /// readClass - Reads the class. + /// + void readClass(); }; /// ClassArray - This class represents Java array classes. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=55185&r1=55184&r2=55185&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Fri Aug 22 12:19:53 2008 @@ -180,7 +180,7 @@ extern "C" JavaObject* getStaticInstance(Class* cl, Jnjvm* vm) { std::pair* val = vm->statics->lookup(cl); if (!val || !(val->second)) { - cl->initialiseClass(); + vm->initialiseClass(cl); val = vm->statics->lookup(cl); } return val->second; Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55185&r1=55184&r2=55185&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Fri Aug 22 12:19:53 2008 @@ -101,7 +101,7 @@ *status = clinitParent; cl->release(); if (cl->super) { - cl->super->initialiseClass(); + initialiseClass(cl->super); } cl->classLoader->TheModule->resolveStaticClass((Class*)cl); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55185&r1=55184&r2=55185&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Fri Aug 22 12:19:53 2008 @@ -99,116 +99,6 @@ } -void JnjvmClassLoader::readParents(Class* cl, Reader& reader) { - JavaConstantPool* ctpInfo = cl->ctpInfo; - unsigned short int superEntry = reader.readU2(); - const UTF8* super = superEntry ? - ctpInfo->resolveClassName(superEntry) : 0; - - unsigned short int nbI = reader.readU2(); - cl->superUTF8 = super; - for (int i = 0; i < nbI; i++) - cl->interfacesUTF8.push_back(ctpInfo->resolveClassName(reader.readU2())); - -} - -void JnjvmClassLoader::loadParents(Class* cl) { - const UTF8* super = cl->superUTF8; - int nbI = cl->interfacesUTF8.size(); - if (super == 0) { - cl->depth = 0; - cl->display = (CommonClass**)malloc(sizeof(CommonClass*)); - cl->display[0] = cl; - cl->virtualTableSize = VT_SIZE / sizeof(void*); - } else { - cl->super = loadName(super, true, true); - int depth = cl->super->depth + 1; - cl->depth = depth; - cl->virtualTableSize = cl->super->virtualTableSize; - cl->display = (CommonClass**)malloc((depth + 1) * sizeof(CommonClass*)); - memcpy(cl->display, cl->super->display, depth * sizeof(CommonClass*)); - cl->display[cl->depth] = cl; - } - - for (int i = 0; i < nbI; i++) - cl->interfaces.push_back((Class*)loadName(cl->interfacesUTF8[i], - true, true)); -} - -void JnjvmClassLoader::readAttributs(Class* cl, Reader& reader, - std::vector& attr) { - JavaConstantPool* ctpInfo = cl->ctpInfo; - unsigned short int nba = reader.readU2(); - - for (int i = 0; i < nba; i++) { - const UTF8* attName = ctpInfo->UTF8At(reader.readU2()); - uint32 attLen = reader.readU4(); - Attribut* att = new Attribut(attName, attLen, reader.cursor); - attr.push_back(att); - reader.seek(attLen, Reader::SeekCur); - } -} - -void JnjvmClassLoader::readFields(Class* cl, Reader& reader) { - uint16 nbFields = reader.readU2(); - JavaConstantPool* ctpInfo = cl->ctpInfo; - uint32 sindex = 0; - uint32 vindex = 0; - for (int i = 0; i < nbFields; i++) { - uint16 access = reader.readU2(); - const UTF8* name = ctpInfo->UTF8At(reader.readU2()); - const UTF8* type = ctpInfo->UTF8At(reader.readU2()); - JavaField* field = cl->constructField(name, type, access); - isStatic(access) ? - field->num = sindex++ : - field->num = vindex++; - readAttributs(cl, reader, field->attributs); - } -} - -void JnjvmClassLoader::readMethods(Class* cl, Reader& reader) { - uint16 nbMethods = reader.readU2(); - JavaConstantPool* ctpInfo = cl->ctpInfo; - for (int i = 0; i < nbMethods; i++) { - uint16 access = reader.readU2(); - const UTF8* name = ctpInfo->UTF8At(reader.readU2()); - const UTF8* type = ctpInfo->UTF8At(reader.readU2()); - JavaMethod* meth = cl->constructMethod(name, type, access); - readAttributs(cl, reader, meth->attributs); - } -} - -void JnjvmClassLoader::readClass(Class* cl) { - - PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "; ", 0); - PRINT_DEBUG(JNJVM_LOAD, 0, LIGHT_GREEN, "reading ", 0); - PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "%s::%s\n", printString(), - cl->printString()); - - Reader reader(cl->bytes); - uint32 magic = reader.readU4(); - if (magic != Jnjvm::Magic) { - JavaThread::get()->isolate->classFormatError("bad magic number %p", magic); - } - cl->minor = reader.readU2(); - cl->major = reader.readU2(); - cl->ctpInfo = new JavaConstantPool(cl, reader); - cl->access = reader.readU2(); - - const UTF8* thisClassName = - cl->ctpInfo->resolveClassName(reader.readU2()); - - if (!(thisClassName->equals(cl->name))) { - JavaThread::get()->isolate->classFormatError("try to load %s and found class named %s", - cl->printString(), thisClassName->printString()); - } - - readParents(cl, reader); - readFields(cl, reader); - readMethods(cl, reader); - readAttributs(cl, reader, cl->attributs); -} - ArrayUInt8* JnjvmBootstrapLoader::openName(const UTF8* utf8) { char* asciiz = utf8->UTF8ToAsciiz(); uint32 alen = strlen(asciiz); @@ -255,14 +145,15 @@ baseClass->resolveClass(); cl->status = resolved; } else { - readClass((Class*)cl); - cl->status = classRead; - cl->release(); - loadParents((Class*)cl); - cl->acquire(); - cl->status = prepared; - TheModule->resolveVirtualClass((Class*)cl); - cl->status = resolved; + Class* regCl = (Class*)cl; + regCl->readClass(); + regCl->status = classRead; + regCl->release(); + regCl->loadParents(); + regCl->acquire(); + regCl->status = prepared; + TheModule->resolveVirtualClass(regCl); + regCl->status = resolved; } cl->release(); cl->broadcastClass(); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=55185&r1=55184&r2=55185&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Fri Aug 22 12:19:53 2008 @@ -66,31 +66,6 @@ /// virtual CommonClass* internalLoad(const UTF8* utf8); - /// readParents - Reads the parents, i.e. super and interfaces, of the class. - /// - void readParents(Class* cl, Reader& reader); - - /// loadParents - Loads and resolves the parents, i.e. super and interfarces, - /// of the class. - /// - void loadParents(Class* cl); - - /// readAttributs - Reads the attributs of the class. - /// - void readAttributs(Class* cl, Reader& reader, std::vector & attr); - - /// readFields - Reads the fields of the class. - /// - void readFields(Class* cl, Reader& reader); - - /// readMethods - Reads the methods of the class. - /// - void readMethods(Class* cl, Reader& reader); - - /// readClass - Reads the class. - /// - void readClass(Class* cl); - /// JnjvmClassLoader - Allocate a user-defined class loader. Called on /// first use of a Java class loader. /// From nicolas.geoffray at lip6.fr Fri Aug 22 12:34:01 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 22 Aug 2008 19:34:01 -0000 Subject: [vmkit-commits] [vmkit] r55195 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaConstantPool.cpp Jnjvm.cpp JnjvmClassLoader.cpp JnjvmClassLoader.h Message-ID: <200808221934.m7MJY2gS012770@zion.cs.uiuc.edu> Author: geoffray Date: Fri Aug 22 14:34:01 2008 New Revision: 55195 URL: http://llvm.org/viewvc/llvm-project?rev=55195&view=rev Log: Let the class also resolve itself. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=55195&r1=55194&r2=55195&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Fri Aug 22 14:34:01 2008 @@ -431,7 +431,7 @@ while (res && Tname->elements[prof] == AssessorDesc::I_TAB) { CommonClass* cl = ((ClassArray*)curS)->baseClass(); ++prof; - classLoader->resolveClass(cl); + cl->resolveClass(); res = curS->isArray && cl && (prof < len); curS = cl; } @@ -531,10 +531,6 @@ return JavaThread::get()->isolate->getClassDelegatee(this, pd); } -void CommonClass::resolveClass() { - classLoader->resolveClass(this); -} - #ifdef MULTIPLE_VM JavaObject* Class::staticInstance() { std::pair* val = @@ -729,3 +725,40 @@ readMethods(reader); readAttributs(reader, attributs); } + +void CommonClass::resolveClass() { + if (status < resolved) { + acquire(); + if (status >= resolved) { + release(); + } else if (status < loaded) { + release(); + JavaThread::get()->isolate->unknownError("try to resolve a not-read class"); + } else if (status == loaded || ownerClass()) { + if (isArray) { + ClassArray* arrayCl = (ClassArray*)this; + CommonClass* baseClass = arrayCl->baseClass(); + baseClass->resolveClass(); + status = resolved; + // Primitives are resolved at boot time + } else { + Class* cl = (Class*)this; + cl->readClass(); + cl->status = classRead; + cl->release(); + cl->loadParents(); + cl->acquire(); + cl->status = prepared; + classLoader->TheModule->resolveVirtualClass(cl); + cl->status = resolved; + } + release(); + broadcastClass(); + } else { + while (status < resolved) { + waitClass(); + } + release(); + } + } +} Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=55195&r1=55194&r2=55195&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Fri Aug 22 14:34:01 2008 @@ -272,7 +272,7 @@ const UTF8* name = UTF8At(ctpDef[index]); if (name->elements[0] == AssessorDesc::I_TAB) { temp = loader->constructArray(name); - loader->resolveClass(temp); + temp->resolveClass(); } else { // Put into ctpRes because there is only one representation of the class temp = loader->loadName(name, true, false); Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55195&r1=55194&r2=55195&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Fri Aug 22 14:34:01 2008 @@ -89,7 +89,8 @@ void Jnjvm::initialiseClass(CommonClass* cl) { JavaState* status = cl->getStatus(); - if (cl->isArray || cl->isPrimitive) { + // Primitives are initialized at boot time + if (cl->isArray) { *status = ready; } else if (!(*status == ready)) { cl->acquire(); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55195&r1=55194&r2=55195&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Fri Aug 22 14:34:01 2008 @@ -129,43 +129,6 @@ } -void JnjvmClassLoader::resolveClass(CommonClass* cl) { - if (cl->status < resolved) { - cl->acquire(); - int status = cl->status; - if (status >= resolved) { - cl->release(); - } else if (status < loaded) { - cl->release(); - JavaThread::get()->isolate->unknownError("try to resolve a not-read class"); - } else if (status == loaded || cl->ownerClass()) { - if (cl->isArray) { - ClassArray* arrayCl = (ClassArray*)cl; - CommonClass* baseClass = arrayCl->baseClass(); - baseClass->resolveClass(); - cl->status = resolved; - } else { - Class* regCl = (Class*)cl; - regCl->readClass(); - regCl->status = classRead; - regCl->release(); - regCl->loadParents(); - regCl->acquire(); - regCl->status = prepared; - TheModule->resolveVirtualClass(regCl); - regCl->status = resolved; - } - cl->release(); - cl->broadcastClass(); - } else { - while (status < resolved) { - cl->waitClass(); - } - cl->release(); - } - } -} - CommonClass* JnjvmBootstrapLoader::internalLoad(const UTF8* name) { CommonClass* cl = lookupClass(name); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=55195&r1=55194&r2=55195&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Fri Aug 22 14:34:01 2008 @@ -149,10 +149,6 @@ CommonClass* lookupClassFromJavaString(JavaString* str, bool doResolve, bool doThrow); - /// resolveClass - Resolves the class. - /// - void resolveClass(CommonClass* cl); - /// lookupClass - Finds the class of th given name in the class loader's /// table. /// From nicolas.geoffray at lip6.fr Sun Aug 24 09:23:57 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 24 Aug 2008 16:23:57 -0000 Subject: [vmkit-commits] [vmkit] r55285 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathVMClass.cpp.inc Classpath/ClasspathVMThrowable.cpp.inc VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/JavaRuntimeJIT.cpp VMCore/JnjvmClassLoader.cpp VMCore/JnjvmModuleProvider.cpp VMCore/NativeUtil.cpp Message-ID: <200808241623.m7OGNvIL008946@zion.cs.uiuc.edu> Author: geoffray Date: Sun Aug 24 11:23:56 2008 New Revision: 55285 URL: http://llvm.org/viewvc/llvm-project?rev=55285&view=rev Log: Add assessors to fields in Class. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc?rev=55285&r1=55284&r2=55285&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc Sun Aug 24 11:23:56 2008 @@ -342,32 +342,6 @@ return (jobject)ret; } -static void resolveInnerOuterClasses(Class* cl) { - Attribut* attribut = cl->lookupAttribut(Attribut::innerClassesAttribut); - if (attribut != 0) { - Reader reader(attribut, cl->bytes); - - uint16 nbi = reader.readU2(); - for (uint16 i = 0; i < nbi; ++i) { - uint16 inner = reader.readU2(); - uint16 outer = reader.readU2(); - //uint16 innerName = - reader.readU2(); - uint16 accessFlags = reader.readU2(); - Class* clInner = (Class*)cl->ctpInfo->loadClass(inner); - Class* clOuter = (Class*)cl->ctpInfo->loadClass(outer); - - if (clInner == cl) { - cl->outerClass = clOuter; - } else if (clOuter == cl) { - clInner->innerAccess = accessFlags; - cl->innerClasses.push_back(clInner); - } - } - } - cl->innerOuterResolved = true; -} - JNIEXPORT jclass JNICALL Java_java_lang_VMClass_getDeclaringClass( #ifdef NATIVE_JNI @@ -377,10 +351,10 @@ jclass Cl) { Jnjvm* vm = JavaThread::get()->isolate; Class* cl = (Class*)NativeUtil::resolvedImplClass(Cl, false); - if (!(cl->innerOuterResolved)) - resolveInnerOuterClasses(cl); - if (cl->outerClass) { - return (jclass)vm->getClassDelegatee(cl->outerClass); + cl->resolveInnerOuterClasses(); + Class* outer = cl->getOuterClass(); + if (outer) { + return (jclass)vm->getClassDelegatee(outer); } else { return 0; } @@ -394,12 +368,12 @@ jclass Cl, bool publicOnly) { Jnjvm* vm = JavaThread::get()->isolate; Class* cl = (Class*)NativeUtil::resolvedImplClass(Cl, false); - if (!(cl->innerOuterResolved)) - resolveInnerOuterClasses(cl); - ArrayObject* res = ArrayObject::acons(cl->innerClasses.size(), Classpath::constructorArrayClass, &(vm->allocator)); + cl->resolveInnerOuterClasses(); + std::vector* innerClasses = cl->getInnerClasses(); + ArrayObject* res = ArrayObject::acons(innerClasses->size(), Classpath::constructorArrayClass, &(vm->allocator)); uint32 index = 0; - for (std::vector::iterator i = cl->innerClasses.begin(), - e = cl->innerClasses.end(); i!= e; i++) { + for (std::vector::iterator i = innerClasses->begin(), + e = innerClasses->end(); i!= e; i++) { res->elements[index++] = vm->getClassDelegatee(*i); } Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc?rev=55285&r1=55284&r2=55285&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc Sun Aug 24 11:23:56 2008 @@ -57,9 +57,9 @@ Attribut* sourceAtt = cl->lookupAttribut(Attribut::sourceFileAttribut); if (sourceAtt) { - Reader reader(sourceAtt, cl->bytes); + Reader reader(sourceAtt, cl->getBytes()); uint16 index = reader.readU2(); - sourceName = vm->UTF8ToStr(cl->ctpInfo->UTF8At(index)); + sourceName = vm->UTF8ToStr(cl->getConstantPool()->UTF8At(index)); } bool native = isNative(meth->access); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=55285&r1=55284&r2=55285&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Sun Aug 24 11:23:56 2008 @@ -762,3 +762,31 @@ } } } + +void Class::resolveInnerOuterClasses() { + if (!innerOuterResolved) { + Attribut* attribut = lookupAttribut(Attribut::innerClassesAttribut); + if (attribut != 0) { + Reader reader(attribut, bytes); + + uint16 nbi = reader.readU2(); + for (uint16 i = 0; i < nbi; ++i) { + uint16 inner = reader.readU2(); + uint16 outer = reader.readU2(); + //uint16 innerName = + reader.readU2(); + uint16 accessFlags = reader.readU2(); + Class* clInner = (Class*)ctpInfo->loadClass(inner); + Class* clOuter = (Class*)ctpInfo->loadClass(outer); + + if (clInner == this) { + outerClass = clOuter; + } else if (clOuter == this) { + clInner->innerAccess = accessFlags; + innerClasses.push_back(clInner); + } + } + } + innerOuterResolved = true; + } +} Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=55285&r1=55284&r2=55285&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Sun Aug 24 11:23:56 2008 @@ -572,6 +572,30 @@ /// readClass - Reads the class. /// void readClass(); + + + JavaConstantPool* getConstantPool() { + return ctpInfo; + } + + ArrayUInt8* getBytes() { + return bytes; + } + + void setBytes(ArrayUInt8* B) { + bytes = B; + status = loaded; + } + + void resolveInnerOuterClasses(); + + Class* getOuterClass() { + return outerClass; + } + + std::vector* getInnerClasses() { + return &innerClasses; + } }; /// ClassArray - This class represents Java array classes. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=55285&r1=55284&r2=55285&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Sun Aug 24 11:23:56 2008 @@ -32,7 +32,8 @@ #ifdef MULTIPLE_VM extern "C" JavaString* stringLookup(Class* cl, uint32 index) { - const UTF8* utf8 = cl->ctpInfo->UTF8At(cl->ctpInfo->ctpDef[index]); + JavaConstantPool* ctpInfo = cl->getConstantPool(); + const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[index]); JavaString* str = JavaThread::get()->isolate->UTF8ToStr(utf8); return str; } @@ -94,7 +95,7 @@ extern "C" void* fieldLookup(JavaObject* obj, Class* caller, uint32 index, uint32 stat) { - JavaConstantPool* ctpInfo = caller->ctpInfo; + JavaConstantPool* ctpInfo = caller->getConstantPool(); if (ctpInfo->ctpRes[index]) { return ctpInfo->ctpRes[index]; } @@ -198,7 +199,7 @@ } extern "C" Class* newLookup(Class* caller, uint32 index) { - JavaConstantPool* ctpInfo = caller->ctpInfo; + JavaConstantPool* ctpInfo = caller->getConstantPool(); Class* cl = (Class*)ctpInfo->loadClass(index); return cl; } @@ -209,7 +210,7 @@ const UTF8* utf8 = 0; Signdef* sign = 0; - caller->ctpInfo->resolveMethod(index, cl, utf8, sign); + caller->getConstantPool()->resolveMethod(index, cl, utf8, sign); JavaMethod* dmeth = cl->lookupMethodDontThrow(utf8, sign->keyName, false, true); assert(obj->classOf->isReady() && "Class not ready in a virtual lookup."); @@ -218,7 +219,7 @@ // on the object class and do not update offset. dmeth = obj->classOf->lookupMethod(utf8, sign->keyName, false, true); } else { - caller->ctpInfo->ctpRes[index] = (void*)dmeth->offset; + caller->getConstantPool()->ctpRes[index] = (void*)dmeth->offset; } assert(dmeth->classDef->isReady() && "Class not ready in a virtual lookup."); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55285&r1=55284&r2=55285&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Sun Aug 24 11:23:56 2008 @@ -144,8 +144,7 @@ if (cl->status == hashed) { cl->acquire(); if (cl->status == hashed) { - cl->status = loaded; - ((Class*)cl)->bytes = bytes; + ((Class*)cl)->setBytes(bytes); } cl->release(); } @@ -302,15 +301,13 @@ if (I == End) { res = allocator_new(allocator, Class)(this, name); if (bytes) { - res->bytes = bytes; - res->status = loaded; + res->setBytes(bytes); } classes->map.insert(std::make_pair(name, res)); } else { res = ((Class*)(I->second)); if (res->status == hashed && bytes) { - res->bytes = bytes; - res->status = loaded; + res->setBytes(bytes); } } classes->lock->unlock(); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=55285&r1=55284&r2=55285&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Sun Aug 24 11:23:56 2008 @@ -26,7 +26,7 @@ using namespace jnjvm; JavaMethod* JnjvmModuleProvider::staticLookup(Class* caller, uint32 index) { - JavaConstantPool* ctpInfo = caller->ctpInfo; + JavaConstantPool* ctpInfo = caller->getConstantPool(); bool isStatic = ctpInfo->isAStaticCall(index); @@ -157,7 +157,7 @@ llvm::Function* JnjvmModuleProvider::addCallback(Class* cl, uint32 index, Signdef* sign, bool stat) { - void* key = &(cl->ctpInfo->ctpRes[index]); + void* key = &(cl->getConstantPool()->ctpRes[index]); reverse_callback_iterator CI = reverseCallbacks.find(key); if (CI != reverseCallbacks.end()) { Modified: vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp?rev=55285&r1=55284&r2=55285&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp Sun Aug 24 11:23:56 2008 @@ -404,8 +404,8 @@ &(JavaThread::get()->isolate->allocator)); } else { Class* cl = meth->classDef; - JavaConstantPool* ctp = cl->ctpInfo; - Reader reader(exceptionAtt, cl->bytes); + JavaConstantPool* ctp = cl->getConstantPool(); + Reader reader(exceptionAtt, cl->getBytes()); uint16 nbe = reader.readU2(); ArrayObject* res = ArrayObject::acons(nbe, Classpath::classArrayClass, &(JavaThread::get()->isolate->allocator)); From nicolas.geoffray at lip6.fr Mon Aug 25 00:27:35 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 25 Aug 2008 07:27:35 -0000 Subject: [vmkit-commits] [vmkit] r55305 - /vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp Message-ID: <200808250727.m7P7Raog002557@zion.cs.uiuc.edu> Author: geoffray Date: Mon Aug 25 02:27:34 2008 New Revision: 55305 URL: http://llvm.org/viewvc/llvm-project?rev=55305&view=rev Log: Initialize only if doClinit is true. Modified: vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp?rev=55305&r1=55304&r2=55305&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/NativeUtil.cpp Mon Aug 25 02:27:34 2008 @@ -230,7 +230,7 @@ JavaObject *Cl = (JavaObject*)clazz; CommonClass* cl = (CommonClass*)Classpath::vmdataClass->getVirtualObjectField(Cl); cl->resolveClass(); - JavaThread::get()->isolate->initialiseClass(cl); + if (doClinit) JavaThread::get()->isolate->initialiseClass(cl); return cl; } From nicolas.geoffray at lip6.fr Mon Aug 25 01:02:39 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 25 Aug 2008 08:02:39 -0000 Subject: [vmkit-commits] [vmkit] r55306 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathVMClass.cpp.inc VMCore/JavaClass.cpp VMCore/JavaClass.h Message-ID: <200808250802.m7P82deZ015159@zion.cs.uiuc.edu> Author: geoffray Date: Mon Aug 25 03:02:38 2008 New Revision: 55306 URL: http://llvm.org/viewvc/llvm-project?rev=55306&view=rev Log: Move class-dependent code to JavaClass. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc?rev=55306&r1=55305&r2=55306&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc Mon Aug 25 03:02:38 2008 @@ -82,15 +82,8 @@ if (cl->isArray || isInterface(cl->access)) { return (jobject)ArrayObject::acons(0, Classpath::constructorArrayClass, &(vm->allocator)); } else { - CommonClass::method_map meths = cl->virtualMethods; std::vector res; - for (CommonClass::method_iterator i = meths.begin(), e = meths.end(); - i != e; ++i) { - JavaMethod* meth = i->second; - if (meth->name == Jnjvm::initName && (!publicOnly || isPublic(meth->access))) { - res.push_back(meth); - } - } + cl->getDeclaredConstructors(res, publicOnly); ArrayObject* ret = ArrayObject::acons(res.size(), Classpath::constructorArrayClass, &(vm->allocator)); sint32 index = 0; @@ -121,23 +114,8 @@ if (cl->isArray) { return (jobject)ArrayObject::acons(0, Classpath::methodArrayClass, &(vm->allocator)); } else { - CommonClass::method_map meths = cl->virtualMethods; std::vector res; - for (CommonClass::method_iterator i = meths.begin(), e = meths.end(); - i != e; ++i) { - JavaMethod* meth = i->second; - if (meth->name != Jnjvm::initName && (!publicOnly || isPublic(meth->access))) { - res.push_back(meth); - } - } - meths = cl->staticMethods; - for (CommonClass::method_iterator i = meths.begin(), e = meths.end(); - i != e; ++i) { - JavaMethod* meth = i->second; - if (meth->name != Jnjvm::clinitName && (!publicOnly || isPublic(meth->access))) { - res.push_back(meth); - } - } + cl->getDeclaredMethods(res, publicOnly); ArrayObject* ret = ArrayObject::acons(res.size(), Classpath::methodArrayClass, &(vm->allocator)); sint32 index = 0; @@ -289,23 +267,8 @@ if (cl->isArray) { return (jobject)ArrayObject::acons(0, Classpath::fieldArrayClass, &(vm->allocator)); } else { - CommonClass::field_map fields = cl->virtualFields; std::vector res; - for (CommonClass::field_iterator i = fields.begin(), e = fields.end(); - i != e; ++i) { - JavaField* field = i->second; - if (!publicOnly || isPublic(field->access)) { - res.push_back(field); - } - } - fields = cl->staticFields; - for (CommonClass::field_iterator i = fields.begin(), e = fields.end(); - i != e; ++i) { - JavaField* field = i->second; - if (!publicOnly || isPublic(field->access)) { - res.push_back(field); - } - } + cl->getDeclaredFields(res, publicOnly); ArrayObject* ret = ArrayObject::acons(res.size(), Classpath::fieldArrayClass, &(vm->allocator)); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=55306&r1=55305&r2=55306&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Mon Aug 25 03:02:38 2008 @@ -790,3 +790,55 @@ innerOuterResolved = true; } } + +void CommonClass::getDeclaredConstructors(std::vector& res, + bool publicOnly) { + for (CommonClass::method_iterator i = virtualMethods.begin(), + e = virtualMethods.end(); i != e; ++i) { + JavaMethod* meth = i->second; + bool pub = isPublic(meth->access); + if (meth->name == Jnjvm::initName && (!publicOnly || pub)) { + res.push_back(meth); + } + } +} + +void CommonClass::getDeclaredMethods(std::vector& res, + bool publicOnly) { + for (CommonClass::method_iterator i = virtualMethods.begin(), + e = virtualMethods.end(); i != e; ++i) { + JavaMethod* meth = i->second; + bool pub = isPublic(meth->access); + if (meth->name != Jnjvm::initName && (!publicOnly || pub)) { + res.push_back(meth); + } + } + + for (CommonClass::method_iterator i = staticMethods.begin(), + e = staticMethods.end(); i != e; ++i) { + JavaMethod* meth = i->second; + bool pub = isPublic(meth->access); + if (meth->name != Jnjvm::clinitName && (!publicOnly || pub)) { + res.push_back(meth); + } + } +} + +void CommonClass::getDeclaredFields(std::vector& res, + bool publicOnly) { + for (CommonClass::field_iterator i = virtualFields.begin(), + e = virtualFields.end(); i != e; ++i) { + JavaField* field = i->second; + if (!publicOnly || isPublic(field->access)) { + res.push_back(field); + } + } + + for (CommonClass::field_iterator i = staticFields.begin(), + e = staticFields.end(); i != e; ++i) { + JavaField* field = i->second; + if (!publicOnly || isPublic(field->access)) { + res.push_back(field); + } + } +} Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=55306&r1=55305&r2=55306&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Mon Aug 25 03:02:38 2008 @@ -438,7 +438,11 @@ return classLoader == JnjvmClassLoader::sharedLoader; } #endif - + + void getDeclaredConstructors(std::vector& res, bool publicOnly); + void getDeclaredMethods(std::vector& res, bool publicOnly); + void getDeclaredFields(std::vector& res, bool publicOnly); + }; /// ClassPrimitive - This class represents internal classes for primitive From nicolas.geoffray at lip6.fr Mon Aug 25 01:40:11 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 25 Aug 2008 08:40:11 -0000 Subject: [vmkit-commits] [vmkit] r55308 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaClass.h JavaInitialise.cpp JavaUpcalls.h JnjvmClassLoader.cpp JnjvmClassLoader.h Message-ID: <200808250840.m7P8eBcQ019262@zion.cs.uiuc.edu> Author: geoffray Date: Mon Aug 25 03:40:11 2008 New Revision: 55308 URL: http://llvm.org/viewvc/llvm-project?rev=55308&view=rev Log: Simplify things: a class can not be hashed without its bytes. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=55308&r1=55307&r2=55308&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Mon Aug 25 03:40:11 2008 @@ -210,7 +210,7 @@ name = n; this->lockVar = mvm::Lock::allocRecursive(); this->condVar = mvm::Cond::allocCond(); - this->status = hashed; + this->status = loaded; this->classLoader = loader; this->isArray = isArray; this->isPrimitive = false; @@ -229,8 +229,9 @@ access = ACC_ABSTRACT | ACC_FINAL | ACC_PUBLIC; } -Class::Class(JnjvmClassLoader* loader, const UTF8* n) : CommonClass(loader, n, false) { - bytes = 0; +Class::Class(JnjvmClassLoader* loader, const UTF8* n, ArrayUInt8* B) : + CommonClass(loader, n, false) { + bytes = B; super = 0; ctpInfo = 0; #ifndef MULTIPLE_VM @@ -248,7 +249,6 @@ display[0] = ClassArray::SuperArray; display[1] = this; access = ACC_FINAL | ACC_ABSTRACT; - status = loaded; } void Class::print(mvm::PrintBuffer* buf) const { Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=55308&r1=55307&r2=55308&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Mon Aug 25 03:40:11 2008 @@ -46,8 +46,7 @@ /// and accessing static fields of the class) when it is in the ready state. /// typedef enum JavaState { - hashed = 0, /// The class is hashed in a class loader table. - loaded, /// The .class file has been found. + loaded = 0, /// The .class file has been found. classRead, /// The .class file has been read. prepared, /// The parents of this class has been resolved. resolved, /// The class has been resolved. @@ -550,7 +549,7 @@ /// Class - Create a class in the given virtual machine and with the given /// name. - Class(JnjvmClassLoader* loader, const UTF8* name); + Class(JnjvmClassLoader* loader, const UTF8* name, ArrayUInt8* bytes); /// readParents - Reads the parents, i.e. super and interfaces, of the class. /// @@ -586,11 +585,6 @@ return bytes; } - void setBytes(ArrayUInt8* B) { - bytes = B; - status = loaded; - } - void resolveInnerOuterClasses(); Class* getOuterClass() { Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp?rev=55308&r1=55307&r2=55308&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp Mon Aug 25 03:40:11 2008 @@ -79,17 +79,18 @@ const UTF8* utf8OfChar = JCL->asciizConstructUTF8("[C"); JavaArray::ofChar = JCL->constructArray(utf8OfChar); ((UTF8*)utf8OfChar)->classOf = JavaArray::ofChar; - - - + ClassArray::InterfacesArray.push_back( - JCL->constructClass(JCL->asciizConstructUTF8("java/lang/Cloneable"))); + JCL->loadName(JCL->asciizConstructUTF8("java/lang/Cloneable"), false, + false)); ClassArray::InterfacesArray.push_back( - JCL->constructClass(JCL->asciizConstructUTF8("java/io/Serializable"))); + JCL->loadName(JCL->asciizConstructUTF8("java/io/Serializable"), false, + false)); ClassArray::SuperArray = - JCL->constructClass(JCL->asciizConstructUTF8("java/lang/Object")); + JCL->loadName(JCL->asciizConstructUTF8("java/lang/Object"), false, + false); JavaArray::ofChar->interfaces = ClassArray::InterfacesArray; JavaArray::ofChar->super = ClassArray::SuperArray; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h?rev=55308&r1=55307&r2=55308&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h Mon Aug 25 03:40:11 2008 @@ -12,7 +12,7 @@ #define UPCALL_CLASS(vm, name) \ - vm->constructClass(vm->asciizConstructUTF8(name)) + vm->loadName(vm->asciizConstructUTF8(name), false, false) #define UPCALL_FIELD(vm, cl, name, type, acc) \ UPCALL_CLASS(vm, cl)->constructField(vm->asciizConstructUTF8(name), \ Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55308&r1=55307&r2=55308&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Mon Aug 25 03:40:11 2008 @@ -129,7 +129,7 @@ } -CommonClass* JnjvmBootstrapLoader::internalLoad(const UTF8* name) { +Class* JnjvmBootstrapLoader::internalLoad(const UTF8* name) { CommonClass* cl = lookupClass(name); @@ -138,28 +138,16 @@ if (bytes) { cl = constructClass(name, bytes); } - } else if (cl->status == hashed) { - ArrayUInt8* bytes = openName(name); - if (bytes) { - if (cl->status == hashed) { - cl->acquire(); - if (cl->status == hashed) { - ((Class*)cl)->setBytes(bytes); - } - cl->release(); - } - } else { - cl = 0; - } } - - return cl; + + if (cl) assert(!cl->isArray); + return (Class*)cl; } -CommonClass* JnjvmClassLoader::internalLoad(const UTF8* name) { +Class* JnjvmClassLoader::internalLoad(const UTF8* name) { CommonClass* cl = lookupClass(name); - if (!cl || cl->status == hashed) { + if (!cl) { const UTF8* javaName = name->internalToJava(hashUTF8, 0, name->size); JavaString* str = isolate->UTF8ToStr(javaName); JavaObject* obj = (JavaObject*) @@ -168,14 +156,15 @@ cl = (CommonClass*)(Classpath::vmdataClass->getVirtualObjectField(obj)); } - return cl; + if (cl) assert(!cl->isArray); + return (Class*)cl; } -CommonClass* JnjvmClassLoader::loadName(const UTF8* name, bool doResolve, +Class* JnjvmClassLoader::loadName(const UTF8* name, bool doResolve, bool doThrow) { - CommonClass* cl = internalLoad(name); + Class* cl = internalLoad(name); if (!cl && doThrow) { if (!(name->equals(Jnjvm::NoClassDefFoundError))) { @@ -288,6 +277,7 @@ Class* JnjvmClassLoader::constructClass(const UTF8* name, ArrayUInt8* bytes) { + assert(bytes && "constructing a class without bytes"); #ifdef MULTIPLE_VM if (this != bootstrapLoader && this != sharedLoader && bytes) { Class* cl = sharedLoader->constructSharedClass(name, bytes); @@ -299,16 +289,10 @@ ClassMap::iterator I = classes->map.find(name); Class* res = 0; if (I == End) { - res = allocator_new(allocator, Class)(this, name); - if (bytes) { - res->setBytes(bytes); - } + res = allocator_new(allocator, Class)(this, name, bytes); classes->map.insert(std::make_pair(name, res)); } else { res = ((Class*)(I->second)); - if (res->status == hashed && bytes) { - res->setBytes(bytes); - } } classes->lock->unlock(); return res; Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=55308&r1=55307&r2=55308&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Mon Aug 25 03:40:11 2008 @@ -64,7 +64,7 @@ /// internalLoad - Load the class with the given name. /// - virtual CommonClass* internalLoad(const UTF8* utf8); + virtual Class* internalLoad(const UTF8* utf8); /// JnjvmClassLoader - Allocate a user-defined class loader. Called on /// first use of a Java class loader. @@ -136,7 +136,7 @@ /// loadName - Loads the class of the given name. /// - CommonClass* loadName(const UTF8* name, bool doResolve, bool doThrow); + Class* loadName(const UTF8* name, bool doResolve, bool doThrow); /// lookupClassFromUTF8 - Lookup a class from an UTF8 name and load it. /// @@ -162,7 +162,7 @@ /// constructClass - Hashes a runtime representation of a class with /// the given name. /// - Class* constructClass(const UTF8* name, ArrayUInt8* bytes = 0); + Class* constructClass(const UTF8* name, ArrayUInt8* bytes); /// constructType - Hashes a Typedef, an internal representation of a class /// still not loaded. @@ -217,7 +217,7 @@ /// internalLoad - Load the class with the given name. /// - virtual CommonClass* internalLoad(const UTF8* utf8) { + virtual Class* internalLoad(const UTF8* utf8) { fprintf(stderr, "Don't use me"); exit(1); } @@ -246,7 +246,7 @@ private: /// internalLoad - Load the class with the given name. /// - virtual CommonClass* internalLoad(const UTF8* utf8); + virtual Class* internalLoad(const UTF8* utf8); /// bootClasspath - List of paths for the base classes. /// From nicolas.geoffray at lip6.fr Mon Aug 25 01:56:20 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 25 Aug 2008 08:56:20 -0000 Subject: [vmkit-commits] [vmkit] r55309 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathVMThread.cpp.inc VMCore/JavaUpcalls.cpp VMCore/JavaUpcalls.h VMCore/Jnjvm.cpp Message-ID: <200808250856.m7P8uK1O019747@zion.cs.uiuc.edu> Author: geoffray Date: Mon Aug 25 03:56:20 2008 New Revision: 55309 URL: http://llvm.org/viewvc/llvm-project?rev=55309&view=rev Log: Put all classpath classes, fields, and methods into the same class. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc?rev=55309&r1=55308&r2=55309&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc Mon Aug 25 03:56:20 2008 @@ -57,10 +57,10 @@ Collector::inject_my_thread(&argc); #endif CommonClass* vmthClass = vmThread->classOf; - JavaObject* thread = ClasspathThread::assocThread->getVirtualObjectField(vmThread); + JavaObject* thread = Classpath::assocThread->getVirtualObjectField(vmThread); Jnjvm* isolate = intern->isolate; ThreadSystem* ts = isolate->threadSystem; - bool isDaemon = ClasspathThread::daemon->getVirtualInt8Field(thread); + bool isDaemon = Classpath::daemon->getVirtualInt8Field(thread); intern->threadID = (mvm::Thread::self() << 8) & 0x7FFFFF00; @@ -108,13 +108,13 @@ #endif jobject _vmThread, sint64 stackSize) { JavaObject* vmThread = (JavaObject*)_vmThread; - JavaObject* javaThread = ClasspathThread::assocThread->getVirtualObjectField(vmThread); + JavaObject* javaThread = Classpath::assocThread->getVirtualObjectField(vmThread); assert(javaThread); Jnjvm* vm = JavaThread::get()->isolate; JavaThread* th = allocator_new(vm->allocator, JavaThread)(); th->initialise(javaThread, vm); - ClasspathThread::vmdata->setVirtualObjectField(vmThread, (JavaObject*)th); + Classpath::vmdataVMThread->setVirtualObjectField(vmThread, (JavaObject*)th); int tid = 0; arg_thread_t* arg = (arg_thread_t*)malloc(sizeof(arg_thread_t)); arg->intern = th; @@ -133,10 +133,10 @@ jobject _vmthread) { JavaObject* vmthread = (JavaObject*)_vmthread; - while (ClasspathThread::vmdata->getVirtualObjectField(vmthread) == 0) + while (Classpath::vmdataVMThread->getVirtualObjectField(vmthread) == 0) mvm::Thread::yield(); - JavaThread* th = (JavaThread*)ClasspathThread::vmdata->getVirtualObjectField(vmthread); + JavaThread* th = (JavaThread*)Classpath::vmdataVMThread->getVirtualObjectField(vmthread); th->lock->lock(); th->interruptFlag = 1; @@ -167,7 +167,7 @@ #endif jobject _vmthread) { JavaObject* vmthread = (JavaObject*)_vmthread; - JavaThread* th = (JavaThread*)ClasspathThread::vmdata->getVirtualObjectField(vmthread); + JavaThread* th = (JavaThread*)Classpath::vmdataVMThread->getVirtualObjectField(vmthread); return (jboolean)th->interruptFlag; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=55309&r1=55308&r2=55309&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Mon Aug 25 03:56:20 2008 @@ -36,21 +36,21 @@ using namespace jnjvm; -Class* ClasspathThread::newThread; -Class* ClasspathThread::newVMThread; -JavaField* ClasspathThread::assocThread; -JavaField* ClasspathThread::vmdata; -JavaMethod* ClasspathThread::finaliseCreateInitialThread; -JavaMethod* ClasspathThread::initVMThread; -JavaMethod* ClasspathThread::groupAddThread; -JavaField* ClasspathThread::name; -JavaField* ClasspathThread::priority; -JavaField* ClasspathThread::daemon; -JavaField* ClasspathThread::group; -JavaField* ClasspathThread::running; -JavaField* ClasspathThread::rootGroup; -JavaField* ClasspathThread::vmThread; -JavaMethod* ClasspathThread::uncaughtException; +Class* Classpath::newThread; +Class* Classpath::newVMThread; +JavaField* Classpath::assocThread; +JavaField* Classpath::vmdataVMThread; +JavaMethod* Classpath::finaliseCreateInitialThread; +JavaMethod* Classpath::initVMThread; +JavaMethod* Classpath::groupAddThread; +JavaField* Classpath::name; +JavaField* Classpath::priority; +JavaField* Classpath::daemon; +JavaField* Classpath::group; +JavaField* Classpath::running; +JavaField* Classpath::rootGroup; +JavaField* Classpath::vmThread; +JavaMethod* Classpath::uncaughtException; JavaMethod* Classpath::setContextClassLoader; JavaMethod* Classpath::getSystemClassLoader; @@ -111,199 +111,73 @@ Class* Classpath::vmStackWalker; -Class* ClasspathException::InvocationTargetException; -Class* ClasspathException::ArrayStoreException; -Class* ClasspathException::ClassCastException; -Class* ClasspathException::IllegalMonitorStateException; -Class* ClasspathException::IllegalArgumentException; -Class* ClasspathException::InterruptedException; -Class* ClasspathException::IndexOutOfBoundsException; -Class* ClasspathException::ArrayIndexOutOfBoundsException; -Class* ClasspathException::NegativeArraySizeException; -Class* ClasspathException::NullPointerException; -Class* ClasspathException::SecurityException; -Class* ClasspathException::ClassFormatError; -Class* ClasspathException::ClassCircularityError; -Class* ClasspathException::NoClassDefFoundError; -Class* ClasspathException::UnsupportedClassVersionError; -Class* ClasspathException::NoSuchFieldError; -Class* ClasspathException::NoSuchMethodError; -Class* ClasspathException::InstantiationError; -Class* ClasspathException::IllegalAccessError; -Class* ClasspathException::IllegalAccessException; -Class* ClasspathException::VerifyError; -Class* ClasspathException::ExceptionInInitializerError; -Class* ClasspathException::LinkageError; -Class* ClasspathException::AbstractMethodError; -Class* ClasspathException::UnsatisfiedLinkError; -Class* ClasspathException::InternalError; -Class* ClasspathException::OutOfMemoryError; -Class* ClasspathException::StackOverflowError; -Class* ClasspathException::UnknownError; -Class* ClasspathException::ClassNotFoundException; - -JavaMethod* ClasspathException::InitInvocationTargetException; -JavaMethod* ClasspathException::InitArrayStoreException; -JavaMethod* ClasspathException::InitClassCastException; -JavaMethod* ClasspathException::InitIllegalMonitorStateException; -JavaMethod* ClasspathException::InitIllegalArgumentException; -JavaMethod* ClasspathException::InitInterruptedException; -JavaMethod* ClasspathException::InitIndexOutOfBoundsException; -JavaMethod* ClasspathException::InitArrayIndexOutOfBoundsException; -JavaMethod* ClasspathException::InitNegativeArraySizeException; -JavaMethod* ClasspathException::InitNullPointerException; -JavaMethod* ClasspathException::InitSecurityException; -JavaMethod* ClasspathException::InitClassFormatError; -JavaMethod* ClasspathException::InitClassCircularityError; -JavaMethod* ClasspathException::InitNoClassDefFoundError; -JavaMethod* ClasspathException::InitUnsupportedClassVersionError; -JavaMethod* ClasspathException::InitNoSuchFieldError; -JavaMethod* ClasspathException::InitNoSuchMethodError; -JavaMethod* ClasspathException::InitInstantiationError; -JavaMethod* ClasspathException::InitIllegalAccessError; -JavaMethod* ClasspathException::InitIllegalAccessException; -JavaMethod* ClasspathException::InitVerifyError; -JavaMethod* ClasspathException::InitExceptionInInitializerError; -JavaMethod* ClasspathException::InitLinkageError; -JavaMethod* ClasspathException::InitAbstractMethodError; -JavaMethod* ClasspathException::InitUnsatisfiedLinkError; -JavaMethod* ClasspathException::InitInternalError; -JavaMethod* ClasspathException::InitOutOfMemoryError; -JavaMethod* ClasspathException::InitStackOverflowError; -JavaMethod* ClasspathException::InitUnknownError; -JavaMethod* ClasspathException::InitClassNotFoundException; - -JavaMethod* ClasspathException::ErrorWithExcpNoClassDefFoundError; -JavaMethod* ClasspathException::ErrorWithExcpExceptionInInitializerError; -JavaMethod* ClasspathException::ErrorWithExcpInvocationTargetException; +Class* Classpath::InvocationTargetException; +Class* Classpath::ArrayStoreException; +Class* Classpath::ClassCastException; +Class* Classpath::IllegalMonitorStateException; +Class* Classpath::IllegalArgumentException; +Class* Classpath::InterruptedException; +Class* Classpath::IndexOutOfBoundsException; +Class* Classpath::ArrayIndexOutOfBoundsException; +Class* Classpath::NegativeArraySizeException; +Class* Classpath::NullPointerException; +Class* Classpath::SecurityException; +Class* Classpath::ClassFormatError; +Class* Classpath::ClassCircularityError; +Class* Classpath::NoClassDefFoundError; +Class* Classpath::UnsupportedClassVersionError; +Class* Classpath::NoSuchFieldError; +Class* Classpath::NoSuchMethodError; +Class* Classpath::InstantiationError; +Class* Classpath::IllegalAccessError; +Class* Classpath::IllegalAccessException; +Class* Classpath::VerifyError; +Class* Classpath::ExceptionInInitializerError; +Class* Classpath::LinkageError; +Class* Classpath::AbstractMethodError; +Class* Classpath::UnsatisfiedLinkError; +Class* Classpath::InternalError; +Class* Classpath::OutOfMemoryError; +Class* Classpath::StackOverflowError; +Class* Classpath::UnknownError; +Class* Classpath::ClassNotFoundException; + +JavaMethod* Classpath::InitInvocationTargetException; +JavaMethod* Classpath::InitArrayStoreException; +JavaMethod* Classpath::InitClassCastException; +JavaMethod* Classpath::InitIllegalMonitorStateException; +JavaMethod* Classpath::InitIllegalArgumentException; +JavaMethod* Classpath::InitInterruptedException; +JavaMethod* Classpath::InitIndexOutOfBoundsException; +JavaMethod* Classpath::InitArrayIndexOutOfBoundsException; +JavaMethod* Classpath::InitNegativeArraySizeException; +JavaMethod* Classpath::InitNullPointerException; +JavaMethod* Classpath::InitSecurityException; +JavaMethod* Classpath::InitClassFormatError; +JavaMethod* Classpath::InitClassCircularityError; +JavaMethod* Classpath::InitNoClassDefFoundError; +JavaMethod* Classpath::InitUnsupportedClassVersionError; +JavaMethod* Classpath::InitNoSuchFieldError; +JavaMethod* Classpath::InitNoSuchMethodError; +JavaMethod* Classpath::InitInstantiationError; +JavaMethod* Classpath::InitIllegalAccessError; +JavaMethod* Classpath::InitIllegalAccessException; +JavaMethod* Classpath::InitVerifyError; +JavaMethod* Classpath::InitExceptionInInitializerError; +JavaMethod* Classpath::InitLinkageError; +JavaMethod* Classpath::InitAbstractMethodError; +JavaMethod* Classpath::InitUnsatisfiedLinkError; +JavaMethod* Classpath::InitInternalError; +JavaMethod* Classpath::InitOutOfMemoryError; +JavaMethod* Classpath::InitStackOverflowError; +JavaMethod* Classpath::InitUnknownError; +JavaMethod* Classpath::InitClassNotFoundException; + +JavaMethod* Classpath::ErrorWithExcpNoClassDefFoundError; +JavaMethod* Classpath::ErrorWithExcpExceptionInInitializerError; +JavaMethod* Classpath::ErrorWithExcpInvocationTargetException; -void ClasspathThread::initialise(JnjvmClassLoader* vm) { - newThread = - UPCALL_CLASS(vm, "java/lang/Thread"); - - newVMThread = - UPCALL_CLASS(vm, "java/lang/VMThread"); - - assocThread = - UPCALL_FIELD(vm, "java/lang/VMThread", "thread", "Ljava/lang/Thread;", - ACC_VIRTUAL); - - vmdata = - UPCALL_FIELD(vm, "java/lang/VMThread", "vmdata", "Ljava/lang/Object;", - ACC_VIRTUAL); - - finaliseCreateInitialThread = - UPCALL_METHOD(vm, "java/lang/InheritableThreadLocal", "newChildThread", - "(Ljava/lang/Thread;)V", ACC_STATIC); - - initVMThread = - UPCALL_METHOD(vm, "java/lang/VMThread", "", - "(Ljava/lang/Thread;)V", ACC_VIRTUAL); - - groupAddThread = - UPCALL_METHOD(vm, "java/lang/ThreadGroup", "addThread", - "(Ljava/lang/Thread;)V", ACC_VIRTUAL); - - name = - UPCALL_FIELD(vm, "java/lang/Thread", "name", "Ljava/lang/String;", - ACC_VIRTUAL); - - priority = - UPCALL_FIELD(vm, "java/lang/Thread", "priority", "I", ACC_VIRTUAL); - - daemon = - UPCALL_FIELD(vm, "java/lang/Thread", "daemon", "Z", ACC_VIRTUAL); - - group = - UPCALL_FIELD(vm, "java/lang/Thread", "group", - "Ljava/lang/ThreadGroup;", ACC_VIRTUAL); - - running = - UPCALL_FIELD(vm, "java/lang/VMThread", "running", "Z", ACC_VIRTUAL); - - rootGroup = - UPCALL_FIELD(vm, "java/lang/ThreadGroup", "root", - "Ljava/lang/ThreadGroup;", ACC_STATIC); - - vmThread = - UPCALL_FIELD(vm, "java/lang/Thread", "vmThread", - "Ljava/lang/VMThread;", ACC_VIRTUAL); - - uncaughtException = - UPCALL_METHOD(vm, "java/lang/ThreadGroup", "uncaughtException", - "(Ljava/lang/Thread;Ljava/lang/Throwable;)V", ACC_VIRTUAL); -} - -void ClasspathException::initialise(JnjvmClassLoader* loader) { - UPCALL_REFLECT_CLASS_EXCEPTION(loader, InvocationTargetException); - UPCALL_CLASS_EXCEPTION(loader, ArrayStoreException); - UPCALL_CLASS_EXCEPTION(loader, ClassCastException); - UPCALL_CLASS_EXCEPTION(loader, IllegalMonitorStateException); - UPCALL_CLASS_EXCEPTION(loader, IllegalArgumentException); - UPCALL_CLASS_EXCEPTION(loader, InterruptedException); - UPCALL_CLASS_EXCEPTION(loader, IndexOutOfBoundsException); - UPCALL_CLASS_EXCEPTION(loader, ArrayIndexOutOfBoundsException); - UPCALL_CLASS_EXCEPTION(loader, NegativeArraySizeException); - UPCALL_CLASS_EXCEPTION(loader, NullPointerException); - UPCALL_CLASS_EXCEPTION(loader, SecurityException); - UPCALL_CLASS_EXCEPTION(loader, ClassFormatError); - UPCALL_CLASS_EXCEPTION(loader, ClassCircularityError); - UPCALL_CLASS_EXCEPTION(loader, NoClassDefFoundError); - UPCALL_CLASS_EXCEPTION(loader, UnsupportedClassVersionError); - UPCALL_CLASS_EXCEPTION(loader, NoSuchFieldError); - UPCALL_CLASS_EXCEPTION(loader, NoSuchMethodError); - UPCALL_CLASS_EXCEPTION(loader, InstantiationError); - UPCALL_CLASS_EXCEPTION(loader, IllegalAccessError); - UPCALL_CLASS_EXCEPTION(loader, IllegalAccessException); - UPCALL_CLASS_EXCEPTION(loader, VerifyError); - UPCALL_CLASS_EXCEPTION(loader, ExceptionInInitializerError); - UPCALL_CLASS_EXCEPTION(loader, LinkageError); - UPCALL_CLASS_EXCEPTION(loader, AbstractMethodError); - UPCALL_CLASS_EXCEPTION(loader, UnsatisfiedLinkError); - UPCALL_CLASS_EXCEPTION(loader, InternalError); - UPCALL_CLASS_EXCEPTION(loader, OutOfMemoryError); - UPCALL_CLASS_EXCEPTION(loader, StackOverflowError); - UPCALL_CLASS_EXCEPTION(loader, UnknownError); - UPCALL_CLASS_EXCEPTION(loader, ClassNotFoundException); - - UPCALL_METHOD_EXCEPTION(loader, InvocationTargetException); - UPCALL_METHOD_EXCEPTION(loader, ArrayStoreException); - UPCALL_METHOD_EXCEPTION(loader, ClassCastException); - UPCALL_METHOD_EXCEPTION(loader, IllegalMonitorStateException); - UPCALL_METHOD_EXCEPTION(loader, IllegalArgumentException); - UPCALL_METHOD_EXCEPTION(loader, InterruptedException); - UPCALL_METHOD_EXCEPTION(loader, IndexOutOfBoundsException); - UPCALL_METHOD_EXCEPTION(loader, ArrayIndexOutOfBoundsException); - UPCALL_METHOD_EXCEPTION(loader, NegativeArraySizeException); - UPCALL_METHOD_EXCEPTION(loader, NullPointerException); - UPCALL_METHOD_EXCEPTION(loader, SecurityException); - UPCALL_METHOD_EXCEPTION(loader, ClassFormatError); - UPCALL_METHOD_EXCEPTION(loader, ClassCircularityError); - UPCALL_METHOD_EXCEPTION(loader, NoClassDefFoundError); - UPCALL_METHOD_EXCEPTION(loader, UnsupportedClassVersionError); - UPCALL_METHOD_EXCEPTION(loader, NoSuchFieldError); - UPCALL_METHOD_EXCEPTION(loader, NoSuchMethodError); - UPCALL_METHOD_EXCEPTION(loader, InstantiationError); - UPCALL_METHOD_EXCEPTION(loader, IllegalAccessError); - UPCALL_METHOD_EXCEPTION(loader, IllegalAccessException); - UPCALL_METHOD_EXCEPTION(loader, VerifyError); - UPCALL_METHOD_EXCEPTION(loader, ExceptionInInitializerError); - UPCALL_METHOD_EXCEPTION(loader, LinkageError); - UPCALL_METHOD_EXCEPTION(loader, AbstractMethodError); - UPCALL_METHOD_EXCEPTION(loader, UnsatisfiedLinkError); - UPCALL_METHOD_EXCEPTION(loader, InternalError); - UPCALL_METHOD_EXCEPTION(loader, OutOfMemoryError); - UPCALL_METHOD_EXCEPTION(loader, StackOverflowError); - UPCALL_METHOD_EXCEPTION(loader, UnknownError); - UPCALL_METHOD_EXCEPTION(loader, ClassNotFoundException); - - UPCALL_METHOD_WITH_EXCEPTION(loader, NoClassDefFoundError); - UPCALL_METHOD_WITH_EXCEPTION(loader, ExceptionInInitializerError); - UPCALL_METHOD_WITH_EXCEPTION(loader, InvocationTargetException); -} - - -void ClasspathThread::createInitialThread(Jnjvm* vm, JavaObject* th) { +void Classpath::createInitialThread(Jnjvm* vm, JavaObject* th) { JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; JCL->loadName(newVMThread->name, true, true); vm->initialiseClass(newVMThread); @@ -323,7 +197,7 @@ groupAddThread->invokeIntSpecial(vm, RG, th); } -void ClasspathThread::mapInitialThread(Jnjvm* vm) { +void Classpath::mapInitialThread(Jnjvm* vm) { JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; JCL->loadName(newThread->name, true, true); vm->initialiseClass(newThread); @@ -332,223 +206,344 @@ JavaThread* myth = JavaThread::get(); myth->javaThread = th; JavaObject* vmth = vmThread->getVirtualObjectField(th); - vmdata->setVirtualObjectField(vmth, (JavaObject*)myth); + vmdataVMThread->setVirtualObjectField(vmth, (JavaObject*)myth); finaliseCreateInitialThread->invokeIntStatic(vm, th); } -void Classpath::initialiseClasspath(JnjvmClassLoader* vm) { +void Classpath::initialiseClasspath(JnjvmClassLoader* loader) { getSystemClassLoader = - UPCALL_METHOD(vm, "java/lang/ClassLoader", "getSystemClassLoader", + UPCALL_METHOD(loader, "java/lang/ClassLoader", "getSystemClassLoader", "()Ljava/lang/ClassLoader;", ACC_STATIC); setContextClassLoader = - UPCALL_METHOD(vm, "java/lang/Thread", "setContextClassLoader", + UPCALL_METHOD(loader, "java/lang/Thread", "setContextClassLoader", "(Ljava/lang/ClassLoader;)V", ACC_VIRTUAL); newString = - UPCALL_CLASS(vm, "java/lang/String"); + UPCALL_CLASS(loader, "java/lang/String"); newClass = - UPCALL_CLASS(vm, "java/lang/Class"); + UPCALL_CLASS(loader, "java/lang/Class"); newThrowable = - UPCALL_CLASS(vm, "java/lang/Throwable"); + UPCALL_CLASS(loader, "java/lang/Throwable"); newException = - UPCALL_CLASS(vm, "java/lang/Exception"); + UPCALL_CLASS(loader, "java/lang/Exception"); initClass = - UPCALL_METHOD(vm, "java/lang/Class", "", "(Ljava/lang/Object;)V", + UPCALL_METHOD(loader, "java/lang/Class", "", "(Ljava/lang/Object;)V", ACC_VIRTUAL); initClassWithProtectionDomain = - UPCALL_METHOD(vm, "java/lang/Class", "", + UPCALL_METHOD(loader, "java/lang/Class", "", "(Ljava/lang/Object;Ljava/security/ProtectionDomain;)V", ACC_VIRTUAL); vmdataClass = - UPCALL_FIELD(vm, "java/lang/Class", "vmdata", "Ljava/lang/Object;", + UPCALL_FIELD(loader, "java/lang/Class", "vmdata", "Ljava/lang/Object;", ACC_VIRTUAL); setProperty = - UPCALL_METHOD(vm, "java/util/Properties", "setProperty", + UPCALL_METHOD(loader, "java/util/Properties", "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;", ACC_VIRTUAL); initString = - UPCALL_METHOD(vm, "java/lang/String", "", "([CIIZ)V", ACC_VIRTUAL); + UPCALL_METHOD(loader, "java/lang/String", "", "([CIIZ)V", ACC_VIRTUAL); initConstructor = - UPCALL_METHOD(vm, "java/lang/reflect/Constructor", "", + UPCALL_METHOD(loader, "java/lang/reflect/Constructor", "", "(Ljava/lang/Class;I)V", ACC_VIRTUAL); newConstructor = - UPCALL_CLASS(vm, "java/lang/reflect/Constructor"); + UPCALL_CLASS(loader, "java/lang/reflect/Constructor"); constructorArrayClass = - UPCALL_ARRAY_CLASS(vm, "java/lang/reflect/Constructor", 1); + UPCALL_ARRAY_CLASS(loader, "java/lang/reflect/Constructor", 1); constructorArrayAnnotation = - UPCALL_ARRAY_CLASS(vm, "java/lang/annotation/Annotation", 1); + UPCALL_ARRAY_CLASS(loader, "java/lang/annotation/Annotation", 1); constructorSlot = - UPCALL_FIELD(vm, "java/lang/reflect/Constructor", "slot", "I", ACC_VIRTUAL); + UPCALL_FIELD(loader, "java/lang/reflect/Constructor", "slot", "I", ACC_VIRTUAL); initMethod = - UPCALL_METHOD(vm, "java/lang/reflect/Method", "", + UPCALL_METHOD(loader, "java/lang/reflect/Method", "", "(Ljava/lang/Class;Ljava/lang/String;I)V", ACC_VIRTUAL); newMethod = - UPCALL_CLASS(vm, "java/lang/reflect/Method"); + UPCALL_CLASS(loader, "java/lang/reflect/Method"); methodArrayClass = - UPCALL_ARRAY_CLASS(vm, "java/lang/reflect/Method", 1); + UPCALL_ARRAY_CLASS(loader, "java/lang/reflect/Method", 1); methodSlot = - UPCALL_FIELD(vm, "java/lang/reflect/Method", "slot", "I", ACC_VIRTUAL); + UPCALL_FIELD(loader, "java/lang/reflect/Method", "slot", "I", ACC_VIRTUAL); initField = - UPCALL_METHOD(vm, "java/lang/reflect/Field", "", + UPCALL_METHOD(loader, "java/lang/reflect/Field", "", "(Ljava/lang/Class;Ljava/lang/String;I)V", ACC_VIRTUAL); newField = - UPCALL_CLASS(vm, "java/lang/reflect/Field"); + UPCALL_CLASS(loader, "java/lang/reflect/Field"); fieldArrayClass = - UPCALL_ARRAY_CLASS(vm, "java/lang/reflect/Field", 1); + UPCALL_ARRAY_CLASS(loader, "java/lang/reflect/Field", 1); fieldSlot = - UPCALL_FIELD(vm, "java/lang/reflect/Field", "slot", "I", ACC_VIRTUAL); + UPCALL_FIELD(loader, "java/lang/reflect/Field", "slot", "I", ACC_VIRTUAL); classArrayClass = - UPCALL_ARRAY_CLASS(vm, "java/lang/Class", 1); + UPCALL_ARRAY_CLASS(loader, "java/lang/Class", 1); newVMThrowable = - UPCALL_CLASS(vm, "java/lang/VMThrowable"); + UPCALL_CLASS(loader, "java/lang/VMThrowable"); initVMThrowable = - UPCALL_METHOD(vm, "java/lang/VMThrowable", "", "()V", ACC_VIRTUAL); + UPCALL_METHOD(loader, "java/lang/VMThrowable", "", "()V", ACC_VIRTUAL); vmDataVMThrowable = - UPCALL_FIELD(vm, "java/lang/VMThrowable", "vmdata", "Ljava/lang/Object;", + UPCALL_FIELD(loader, "java/lang/VMThrowable", "vmdata", "Ljava/lang/Object;", ACC_VIRTUAL); bufferAddress = - UPCALL_FIELD(vm, "java/nio/Buffer", "address", "Lgnu/classpath/Pointer;", + UPCALL_FIELD(loader, "java/nio/Buffer", "address", "Lgnu/classpath/Pointer;", ACC_VIRTUAL); dataPointer32 = - UPCALL_FIELD(vm, "gnu/classpath/Pointer32", "data", "I", ACC_VIRTUAL); + UPCALL_FIELD(loader, "gnu/classpath/Pointer32", "data", "I", ACC_VIRTUAL); vmdataClassLoader = - UPCALL_FIELD(vm, "java/lang/ClassLoader", "vmdata", "Ljava/lang/Object;", + UPCALL_FIELD(loader, "java/lang/ClassLoader", "vmdata", "Ljava/lang/Object;", ACC_VIRTUAL); newStackTraceElement = - UPCALL_CLASS(vm, "java/lang/StackTraceElement"); + UPCALL_CLASS(loader, "java/lang/StackTraceElement"); stackTraceArray = - UPCALL_ARRAY_CLASS(vm, "java/lang/StackTraceElement", 1); + UPCALL_ARRAY_CLASS(loader, "java/lang/StackTraceElement", 1); initStackTraceElement = - UPCALL_METHOD(vm, "java/lang/StackTraceElement", "", + UPCALL_METHOD(loader, "java/lang/StackTraceElement", "", "(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Z)V", ACC_VIRTUAL); boolValue = - UPCALL_FIELD(vm, "java/lang/Boolean", "value", "Z", ACC_VIRTUAL); + UPCALL_FIELD(loader, "java/lang/Boolean", "value", "Z", ACC_VIRTUAL); byteValue = - UPCALL_FIELD(vm, "java/lang/Byte", "value", "B", ACC_VIRTUAL); + UPCALL_FIELD(loader, "java/lang/Byte", "value", "B", ACC_VIRTUAL); shortValue = - UPCALL_FIELD(vm, "java/lang/Short", "value", "S", ACC_VIRTUAL); + UPCALL_FIELD(loader, "java/lang/Short", "value", "S", ACC_VIRTUAL); charValue = - UPCALL_FIELD(vm, "java/lang/Character", "value", "C", ACC_VIRTUAL); + UPCALL_FIELD(loader, "java/lang/Character", "value", "C", ACC_VIRTUAL); intValue = - UPCALL_FIELD(vm, "java/lang/Integer", "value", "I", ACC_VIRTUAL); + UPCALL_FIELD(loader, "java/lang/Integer", "value", "I", ACC_VIRTUAL); longValue = - UPCALL_FIELD(vm, "java/lang/Long", "value", "J", ACC_VIRTUAL); + UPCALL_FIELD(loader, "java/lang/Long", "value", "J", ACC_VIRTUAL); floatValue = - UPCALL_FIELD(vm, "java/lang/Float", "value", "F", ACC_VIRTUAL); + UPCALL_FIELD(loader, "java/lang/Float", "value", "F", ACC_VIRTUAL); doubleValue = - UPCALL_FIELD(vm, "java/lang/Double", "value", "D", ACC_VIRTUAL); + UPCALL_FIELD(loader, "java/lang/Double", "value", "D", ACC_VIRTUAL); Classpath::voidClass = - UPCALL_CLASS(vm, "java/lang/Void"); + UPCALL_CLASS(loader, "java/lang/Void"); Classpath::boolClass = - UPCALL_CLASS(vm, "java/lang/Boolean"); + UPCALL_CLASS(loader, "java/lang/Boolean"); Classpath::byteClass = - UPCALL_CLASS(vm, "java/lang/Byte"); + UPCALL_CLASS(loader, "java/lang/Byte"); Classpath::shortClass = - UPCALL_CLASS(vm, "java/lang/Short"); + UPCALL_CLASS(loader, "java/lang/Short"); Classpath::charClass = - UPCALL_CLASS(vm, "java/lang/Character"); + UPCALL_CLASS(loader, "java/lang/Character"); Classpath::intClass = - UPCALL_CLASS(vm, "java/lang/Integer"); + UPCALL_CLASS(loader, "java/lang/Integer"); Classpath::floatClass = - UPCALL_CLASS(vm, "java/lang/Float"); + UPCALL_CLASS(loader, "java/lang/Float"); Classpath::doubleClass = - UPCALL_CLASS(vm, "java/lang/Double"); + UPCALL_CLASS(loader, "java/lang/Double"); Classpath::longClass = - UPCALL_CLASS(vm, "java/lang/Long"); + UPCALL_CLASS(loader, "java/lang/Long"); vmStackWalker = - UPCALL_CLASS(vm, "gnu/classpath/VMStackWalker"); + UPCALL_CLASS(loader, "gnu/classpath/VMStackWalker"); loadInClassLoader = - UPCALL_METHOD(vm, "java/lang/ClassLoader", "loadClass", + UPCALL_METHOD(loader, "java/lang/ClassLoader", "loadClass", "(Ljava/lang/String;Z)Ljava/lang/Class;", ACC_VIRTUAL); JavaMethod* internString = - UPCALL_METHOD(vm, "java/lang/VMString", "intern", + UPCALL_METHOD(loader, "java/lang/VMString", "intern", "(Ljava/lang/String;)Ljava/lang/String;", ACC_STATIC); - vm->TheModule->setMethod(internString, "internString"); + loader->TheModule->setMethod(internString, "internString"); JavaMethod* isArray = - UPCALL_METHOD(vm, "java/lang/Class", "isArray", "()Z", ACC_VIRTUAL); - vm->TheModule->setMethod(isArray, "isArray"); + UPCALL_METHOD(loader, "java/lang/Class", "isArray", "()Z", ACC_VIRTUAL); + loader->TheModule->setMethod(isArray, "isArray"); + + + UPCALL_REFLECT_CLASS_EXCEPTION(loader, InvocationTargetException); + UPCALL_CLASS_EXCEPTION(loader, ArrayStoreException); + UPCALL_CLASS_EXCEPTION(loader, ClassCastException); + UPCALL_CLASS_EXCEPTION(loader, IllegalMonitorStateException); + UPCALL_CLASS_EXCEPTION(loader, IllegalArgumentException); + UPCALL_CLASS_EXCEPTION(loader, InterruptedException); + UPCALL_CLASS_EXCEPTION(loader, IndexOutOfBoundsException); + UPCALL_CLASS_EXCEPTION(loader, ArrayIndexOutOfBoundsException); + UPCALL_CLASS_EXCEPTION(loader, NegativeArraySizeException); + UPCALL_CLASS_EXCEPTION(loader, NullPointerException); + UPCALL_CLASS_EXCEPTION(loader, SecurityException); + UPCALL_CLASS_EXCEPTION(loader, ClassFormatError); + UPCALL_CLASS_EXCEPTION(loader, ClassCircularityError); + UPCALL_CLASS_EXCEPTION(loader, NoClassDefFoundError); + UPCALL_CLASS_EXCEPTION(loader, UnsupportedClassVersionError); + UPCALL_CLASS_EXCEPTION(loader, NoSuchFieldError); + UPCALL_CLASS_EXCEPTION(loader, NoSuchMethodError); + UPCALL_CLASS_EXCEPTION(loader, InstantiationError); + UPCALL_CLASS_EXCEPTION(loader, IllegalAccessError); + UPCALL_CLASS_EXCEPTION(loader, IllegalAccessException); + UPCALL_CLASS_EXCEPTION(loader, VerifyError); + UPCALL_CLASS_EXCEPTION(loader, ExceptionInInitializerError); + UPCALL_CLASS_EXCEPTION(loader, LinkageError); + UPCALL_CLASS_EXCEPTION(loader, AbstractMethodError); + UPCALL_CLASS_EXCEPTION(loader, UnsatisfiedLinkError); + UPCALL_CLASS_EXCEPTION(loader, InternalError); + UPCALL_CLASS_EXCEPTION(loader, OutOfMemoryError); + UPCALL_CLASS_EXCEPTION(loader, StackOverflowError); + UPCALL_CLASS_EXCEPTION(loader, UnknownError); + UPCALL_CLASS_EXCEPTION(loader, ClassNotFoundException); + + UPCALL_METHOD_EXCEPTION(loader, InvocationTargetException); + UPCALL_METHOD_EXCEPTION(loader, ArrayStoreException); + UPCALL_METHOD_EXCEPTION(loader, ClassCastException); + UPCALL_METHOD_EXCEPTION(loader, IllegalMonitorStateException); + UPCALL_METHOD_EXCEPTION(loader, IllegalArgumentException); + UPCALL_METHOD_EXCEPTION(loader, InterruptedException); + UPCALL_METHOD_EXCEPTION(loader, IndexOutOfBoundsException); + UPCALL_METHOD_EXCEPTION(loader, ArrayIndexOutOfBoundsException); + UPCALL_METHOD_EXCEPTION(loader, NegativeArraySizeException); + UPCALL_METHOD_EXCEPTION(loader, NullPointerException); + UPCALL_METHOD_EXCEPTION(loader, SecurityException); + UPCALL_METHOD_EXCEPTION(loader, ClassFormatError); + UPCALL_METHOD_EXCEPTION(loader, ClassCircularityError); + UPCALL_METHOD_EXCEPTION(loader, NoClassDefFoundError); + UPCALL_METHOD_EXCEPTION(loader, UnsupportedClassVersionError); + UPCALL_METHOD_EXCEPTION(loader, NoSuchFieldError); + UPCALL_METHOD_EXCEPTION(loader, NoSuchMethodError); + UPCALL_METHOD_EXCEPTION(loader, InstantiationError); + UPCALL_METHOD_EXCEPTION(loader, IllegalAccessError); + UPCALL_METHOD_EXCEPTION(loader, IllegalAccessException); + UPCALL_METHOD_EXCEPTION(loader, VerifyError); + UPCALL_METHOD_EXCEPTION(loader, ExceptionInInitializerError); + UPCALL_METHOD_EXCEPTION(loader, LinkageError); + UPCALL_METHOD_EXCEPTION(loader, AbstractMethodError); + UPCALL_METHOD_EXCEPTION(loader, UnsatisfiedLinkError); + UPCALL_METHOD_EXCEPTION(loader, InternalError); + UPCALL_METHOD_EXCEPTION(loader, OutOfMemoryError); + UPCALL_METHOD_EXCEPTION(loader, StackOverflowError); + UPCALL_METHOD_EXCEPTION(loader, UnknownError); + UPCALL_METHOD_EXCEPTION(loader, ClassNotFoundException); + + UPCALL_METHOD_WITH_EXCEPTION(loader, NoClassDefFoundError); + UPCALL_METHOD_WITH_EXCEPTION(loader, ExceptionInInitializerError); + UPCALL_METHOD_WITH_EXCEPTION(loader, InvocationTargetException); + + + newThread = + UPCALL_CLASS(loader, "java/lang/Thread"); + + newVMThread = + UPCALL_CLASS(loader, "java/lang/VMThread"); + + assocThread = + UPCALL_FIELD(loader, "java/lang/VMThread", "thread", "Ljava/lang/Thread;", + ACC_VIRTUAL); + + vmdataVMThread = + UPCALL_FIELD(loader, "java/lang/VMThread", "vmdata", "Ljava/lang/Object;", + ACC_VIRTUAL); + + finaliseCreateInitialThread = + UPCALL_METHOD(loader, "java/lang/InheritableThreadLocal", "newChildThread", + "(Ljava/lang/Thread;)V", ACC_STATIC); + + initVMThread = + UPCALL_METHOD(loader, "java/lang/VMThread", "", + "(Ljava/lang/Thread;)V", ACC_VIRTUAL); + + groupAddThread = + UPCALL_METHOD(loader, "java/lang/ThreadGroup", "addThread", + "(Ljava/lang/Thread;)V", ACC_VIRTUAL); + + name = + UPCALL_FIELD(loader, "java/lang/Thread", "name", "Ljava/lang/String;", + ACC_VIRTUAL); + + priority = + UPCALL_FIELD(loader, "java/lang/Thread", "priority", "I", ACC_VIRTUAL); + + daemon = + UPCALL_FIELD(loader, "java/lang/Thread", "daemon", "Z", ACC_VIRTUAL); + + group = + UPCALL_FIELD(loader, "java/lang/Thread", "group", + "Ljava/lang/ThreadGroup;", ACC_VIRTUAL); + + running = + UPCALL_FIELD(loader, "java/lang/VMThread", "running", "Z", ACC_VIRTUAL); + + rootGroup = + UPCALL_FIELD(loader, "java/lang/ThreadGroup", "root", + "Ljava/lang/ThreadGroup;", ACC_STATIC); + + vmThread = + UPCALL_FIELD(loader, "java/lang/Thread", "vmThread", + "Ljava/lang/VMThread;", ACC_VIRTUAL); + + uncaughtException = + UPCALL_METHOD(loader, "java/lang/ThreadGroup", "uncaughtException", + "(Ljava/lang/Thread;Ljava/lang/Throwable;)V", ACC_VIRTUAL); + - ClasspathThread::initialise(vm); - ClasspathException::initialise(vm); - - vm->loadName(vm->asciizConstructUTF8("java/lang/String"), + loader->loadName(loader->asciizConstructUTF8("java/lang/String"), true, false); - vm->loadName(vm->asciizConstructUTF8("java/lang/Object"), + loader->loadName(loader->asciizConstructUTF8("java/lang/Object"), true, false); // Don't compile methods here, we still don't know where to allocate Java // strings. JavaMethod* getCallingClass = - UPCALL_METHOD(vm, "gnu/classpath/VMStackWalker", "getCallingClass", + UPCALL_METHOD(loader, "gnu/classpath/VMStackWalker", "getCallingClass", "()Ljava/lang/Class;", ACC_STATIC); - vm->TheModule->setMethod(getCallingClass, "getCallingClass"); + loader->TheModule->setMethod(getCallingClass, "getCallingClass"); JavaMethod* getCallingClassLoader = - UPCALL_METHOD(vm, "gnu/classpath/VMStackWalker", "getCallingClassLoader", + UPCALL_METHOD(loader, "gnu/classpath/VMStackWalker", "getCallingClassLoader", "()Ljava/lang/ClassLoader;", ACC_STATIC); - vm->TheModule->setMethod(getCallingClassLoader, "getCallingClassLoader"); + loader->TheModule->setMethod(getCallingClassLoader, "getCallingClassLoader"); JavaMethod* postProperties = - UPCALL_METHOD(vm, "gnu/classpath/VMSystemProperties", "postInit", + UPCALL_METHOD(loader, "gnu/classpath/VMSystemProperties", "postInit", "(Ljava/util/Properties;)V", ACC_STATIC); - vm->TheModule->setMethod(postProperties, "propertiesPostInit"); + loader->TheModule->setMethod(postProperties, "propertiesPostInit"); } extern "C" JavaString* internString(JavaString* obj) { Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h?rev=55309&r1=55308&r2=55309&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h Mon Aug 25 03:56:20 2008 @@ -51,14 +51,73 @@ class Class; class ClassArray; -class ClasspathThread { -public: - static void initialise(JnjvmClassLoader* vm); +class Classpath { +public: + static JavaMethod* getSystemClassLoader; + static JavaMethod* setContextClassLoader; + static Class* newString; + static Class* newClass; + static Class* newThrowable; + static Class* newException; + static JavaMethod* initClass; + static JavaMethod* initClassWithProtectionDomain; + static JavaField* vmdataClass; + static JavaMethod* setProperty; + static JavaMethod* initString; + static JavaMethod* getCallingClassLoader; + static JavaMethod* initConstructor; + static ClassArray* constructorArrayClass; + static ClassArray* constructorArrayAnnotation; + static Class* newConstructor; + static JavaField* constructorSlot; + static JavaMethod* initMethod; + static JavaMethod* initField; + static ClassArray* methodArrayClass; + static ClassArray* fieldArrayClass; + static Class* newMethod; + static Class* newField; + static JavaField* methodSlot; + static JavaField* fieldSlot; + static ClassArray* classArrayClass; + static JavaMethod* loadInClassLoader; + static JavaMethod* initVMThrowable; + static JavaField* vmDataVMThrowable; + static Class* newVMThrowable; + static JavaField* bufferAddress; + static JavaField* dataPointer32; + static JavaField* vmdataClassLoader; + + static JavaField* boolValue; + static JavaField* byteValue; + static JavaField* shortValue; + static JavaField* charValue; + static JavaField* intValue; + static JavaField* longValue; + static JavaField* floatValue; + static JavaField* doubleValue; + + static Class* newStackTraceElement; + static ClassArray* stackTraceArray; + static JavaMethod* initStackTraceElement; + + static void initialiseClasspath(JnjvmClassLoader* loader); + + static Class* voidClass; + static Class* boolClass; + static Class* byteClass; + static Class* shortClass; + static Class* charClass; + static Class* intClass; + static Class* floatClass; + static Class* doubleClass; + static Class* longClass; + + static Class* vmStackWalker; static Class* newThread; static Class* newVMThread; static JavaField* assocThread; - static JavaField* vmdata; + static JavaField* vmdataVMThread; static JavaMethod* finaliseCreateInitialThread; static JavaMethod* initVMThread; static JavaMethod* groupAddThread; @@ -71,14 +130,6 @@ static JavaField* vmThread; static JavaMethod* uncaughtException; - static void createInitialThread(Jnjvm* vm, JavaObject* th); - static void mapInitialThread(Jnjvm* vm); -}; - -class ClasspathException { -public: - static void initialise(JnjvmClassLoader* vm); - static Class* InvocationTargetException; static Class* ArrayStoreException; static Class* ClassCastException; @@ -144,70 +195,9 @@ static JavaMethod* ErrorWithExcpNoClassDefFoundError; static JavaMethod* ErrorWithExcpExceptionInInitializerError; static JavaMethod* ErrorWithExcpInvocationTargetException; -}; - -class Classpath { -public: - static JavaMethod* getSystemClassLoader; - static JavaMethod* setContextClassLoader; - static Class* newString; - static Class* newClass; - static Class* newThrowable; - static Class* newException; - static JavaMethod* initClass; - static JavaMethod* initClassWithProtectionDomain; - static JavaField* vmdataClass; - static JavaMethod* setProperty; - static JavaMethod* initString; - static JavaMethod* getCallingClassLoader; - static JavaMethod* initConstructor; - static ClassArray* constructorArrayClass; - static ClassArray* constructorArrayAnnotation; - static Class* newConstructor; - static JavaField* constructorSlot; - static JavaMethod* initMethod; - static JavaMethod* initField; - static ClassArray* methodArrayClass; - static ClassArray* fieldArrayClass; - static Class* newMethod; - static Class* newField; - static JavaField* methodSlot; - static JavaField* fieldSlot; - static ClassArray* classArrayClass; - static JavaMethod* loadInClassLoader; - static JavaMethod* initVMThrowable; - static JavaField* vmDataVMThrowable; - static Class* newVMThrowable; - static JavaField* bufferAddress; - static JavaField* dataPointer32; - static JavaField* vmdataClassLoader; - - static JavaField* boolValue; - static JavaField* byteValue; - static JavaField* shortValue; - static JavaField* charValue; - static JavaField* intValue; - static JavaField* longValue; - static JavaField* floatValue; - static JavaField* doubleValue; - - static Class* newStackTraceElement; - static ClassArray* stackTraceArray; - static JavaMethod* initStackTraceElement; - - static void initialiseClasspath(JnjvmClassLoader* loader); - - static Class* voidClass; - static Class* boolClass; - static Class* byteClass; - static Class* shortClass; - static Class* charClass; - static Class* intClass; - static Class* floatClass; - static Class* doubleClass; - static Class* longClass; - static Class* vmStackWalker; + static void createInitialThread(Jnjvm* vm, JavaObject* th); + static void mapInitialThread(Jnjvm* vm); }; Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55309&r1=55308&r2=55309&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Mon Aug 25 03:56:20 2008 @@ -173,18 +173,18 @@ } void Jnjvm::arrayStoreException() { - error(ClasspathException::ArrayStoreException, - ClasspathException::InitArrayStoreException, ""); + error(Classpath::ArrayStoreException, + Classpath::InitArrayStoreException, ""); } void Jnjvm::indexOutOfBounds(const JavaObject* obj, sint32 entry) { - error(ClasspathException::ArrayIndexOutOfBoundsException, - ClasspathException::InitArrayIndexOutOfBoundsException, "%d", entry); + error(Classpath::ArrayIndexOutOfBoundsException, + Classpath::InitArrayIndexOutOfBoundsException, "%d", entry); } void Jnjvm::negativeArraySizeException(sint32 size) { - error(ClasspathException::NegativeArraySizeException, - ClasspathException::InitNegativeArraySizeException, "%d", size); + error(Classpath::NegativeArraySizeException, + Classpath::InitNegativeArraySizeException, "%d", size); } void Jnjvm::nullPointerException(const char* fmt, ...) { @@ -192,115 +192,115 @@ va_start(ap, fmt); char* val = va_arg(ap, char*); va_end(ap); - error(ClasspathException::NullPointerException, - ClasspathException::InitNullPointerException, fmt, val); + error(Classpath::NullPointerException, + Classpath::InitNullPointerException, fmt, val); } void Jnjvm::illegalAccessException(const char* msg) { - error(ClasspathException::IllegalAccessException, - ClasspathException::InitIllegalAccessException, msg); + error(Classpath::IllegalAccessException, + Classpath::InitIllegalAccessException, msg); } void Jnjvm::illegalMonitorStateException(const JavaObject* obj) { - error(ClasspathException::IllegalMonitorStateException, - ClasspathException::InitIllegalMonitorStateException, ""); + error(Classpath::IllegalMonitorStateException, + Classpath::InitIllegalMonitorStateException, ""); } void Jnjvm::interruptedException(const JavaObject* obj) { - error(ClasspathException::InterruptedException, - ClasspathException::InitInterruptedException, ""); + error(Classpath::InterruptedException, + Classpath::InitInterruptedException, ""); } void Jnjvm::initializerError(const JavaObject* excp) { - errorWithExcp(ClasspathException::ExceptionInInitializerError, - ClasspathException::ErrorWithExcpExceptionInInitializerError, + errorWithExcp(Classpath::ExceptionInInitializerError, + Classpath::ErrorWithExcpExceptionInInitializerError, excp); } void Jnjvm::invocationTargetException(const JavaObject* excp) { - errorWithExcp(ClasspathException::InvocationTargetException, - ClasspathException::ErrorWithExcpInvocationTargetException, + errorWithExcp(Classpath::InvocationTargetException, + Classpath::ErrorWithExcpInvocationTargetException, excp); } void Jnjvm::outOfMemoryError(sint32 n) { - error(ClasspathException::OutOfMemoryError, - ClasspathException::InitOutOfMemoryError, "%d", n); + error(Classpath::OutOfMemoryError, + Classpath::InitOutOfMemoryError, "%d", n); } void Jnjvm::illegalArgumentExceptionForMethod(JavaMethod* meth, CommonClass* required, CommonClass* given) { - error(ClasspathException::IllegalArgumentException, - ClasspathException::InitIllegalArgumentException, + error(Classpath::IllegalArgumentException, + Classpath::InitIllegalArgumentException, "for method %s", meth->printString()); } void Jnjvm::illegalArgumentExceptionForField(JavaField* field, CommonClass* required, CommonClass* given) { - error(ClasspathException::IllegalArgumentException, - ClasspathException::InitIllegalArgumentException, + error(Classpath::IllegalArgumentException, + Classpath::InitIllegalArgumentException, "for field %s", field->printString()); } void Jnjvm::illegalArgumentException(const char* msg) { - error(ClasspathException::IllegalArgumentException, - ClasspathException::InitIllegalArgumentException, + error(Classpath::IllegalArgumentException, + Classpath::InitIllegalArgumentException, msg); } void Jnjvm::classCastException(const char* msg) { - error(ClasspathException::ClassCastException, - ClasspathException::InitClassCastException, + error(Classpath::ClassCastException, + Classpath::InitClassCastException, msg); } void Jnjvm::noSuchFieldError(CommonClass* cl, const UTF8* name) { - error(ClasspathException::NoSuchFieldError, - ClasspathException::InitNoSuchFieldError, + error(Classpath::NoSuchFieldError, + Classpath::InitNoSuchFieldError, "unable to find %s in %s", name->printString(), cl->printString()); } void Jnjvm::noSuchMethodError(CommonClass* cl, const UTF8* name) { - error(ClasspathException::NoSuchMethodError, - ClasspathException::InitNoSuchMethodError, + error(Classpath::NoSuchMethodError, + Classpath::InitNoSuchMethodError, "unable to find %s in %s", name->printString(), cl->printString()); } void Jnjvm::classFormatError(const char* msg, ...) { - error(ClasspathException::ClassFormatError, - ClasspathException::InitClassFormatError, + error(Classpath::ClassFormatError, + Classpath::InitClassFormatError, msg); } void Jnjvm::noClassDefFoundError(JavaObject* obj) { - errorWithExcp(ClasspathException::NoClassDefFoundError, - ClasspathException::ErrorWithExcpNoClassDefFoundError, + errorWithExcp(Classpath::NoClassDefFoundError, + Classpath::ErrorWithExcpNoClassDefFoundError, obj); } void Jnjvm::noClassDefFoundError(const char* fmt, ...) { - error(ClasspathException::NoClassDefFoundError, - ClasspathException::InitNoClassDefFoundError, + error(Classpath::NoClassDefFoundError, + Classpath::InitNoClassDefFoundError, fmt); } void Jnjvm::classNotFoundException(JavaString* str) { - error(ClasspathException::ClassNotFoundException, - ClasspathException::InitClassNotFoundException, + error(Classpath::ClassNotFoundException, + Classpath::InitClassNotFoundException, "unable to load %s", str->strToAsciiz()); } void Jnjvm::unknownError(const char* fmt, ...) { - error(ClasspathException::UnknownError, - ClasspathException::InitUnknownError, + error(Classpath::UnknownError, + Classpath::InitUnknownError, fmt); } @@ -661,13 +661,13 @@ } void Jnjvm::mapInitialThread() { - ClasspathThread::mapInitialThread(this); + Classpath::mapInitialThread(this); } void Jnjvm::loadBootstrap() { JnjvmClassLoader* loader = JnjvmClassLoader::bootstrapLoader; #define LOAD_CLASS(cl) \ - loader->loadName(cl->name, true, true);\ + cl->resolveClass(); \ initialiseClass(cl); LOAD_CLASS(Classpath::newClass); @@ -677,36 +677,36 @@ LOAD_CLASS(Classpath::newField); LOAD_CLASS(Classpath::newStackTraceElement); LOAD_CLASS(Classpath::newVMThrowable); - LOAD_CLASS(ClasspathException::InvocationTargetException); - LOAD_CLASS(ClasspathException::ArrayStoreException); - LOAD_CLASS(ClasspathException::ClassCastException); - LOAD_CLASS(ClasspathException::IllegalMonitorStateException); - LOAD_CLASS(ClasspathException::IllegalArgumentException); - LOAD_CLASS(ClasspathException::InterruptedException); - LOAD_CLASS(ClasspathException::IndexOutOfBoundsException); - LOAD_CLASS(ClasspathException::ArrayIndexOutOfBoundsException); - LOAD_CLASS(ClasspathException::NegativeArraySizeException); - LOAD_CLASS(ClasspathException::NullPointerException); - LOAD_CLASS(ClasspathException::SecurityException); - LOAD_CLASS(ClasspathException::ClassFormatError); - LOAD_CLASS(ClasspathException::ClassCircularityError); - LOAD_CLASS(ClasspathException::NoClassDefFoundError); - LOAD_CLASS(ClasspathException::UnsupportedClassVersionError); - LOAD_CLASS(ClasspathException::NoSuchFieldError); - LOAD_CLASS(ClasspathException::NoSuchMethodError); - LOAD_CLASS(ClasspathException::InstantiationError); - LOAD_CLASS(ClasspathException::IllegalAccessError); - LOAD_CLASS(ClasspathException::IllegalAccessException); - LOAD_CLASS(ClasspathException::VerifyError); - LOAD_CLASS(ClasspathException::ExceptionInInitializerError); - LOAD_CLASS(ClasspathException::LinkageError); - LOAD_CLASS(ClasspathException::AbstractMethodError); - LOAD_CLASS(ClasspathException::UnsatisfiedLinkError); - LOAD_CLASS(ClasspathException::InternalError); - LOAD_CLASS(ClasspathException::OutOfMemoryError); - LOAD_CLASS(ClasspathException::StackOverflowError); - LOAD_CLASS(ClasspathException::UnknownError); - LOAD_CLASS(ClasspathException::ClassNotFoundException); + LOAD_CLASS(Classpath::InvocationTargetException); + LOAD_CLASS(Classpath::ArrayStoreException); + LOAD_CLASS(Classpath::ClassCastException); + LOAD_CLASS(Classpath::IllegalMonitorStateException); + LOAD_CLASS(Classpath::IllegalArgumentException); + LOAD_CLASS(Classpath::InterruptedException); + LOAD_CLASS(Classpath::IndexOutOfBoundsException); + LOAD_CLASS(Classpath::ArrayIndexOutOfBoundsException); + LOAD_CLASS(Classpath::NegativeArraySizeException); + LOAD_CLASS(Classpath::NullPointerException); + LOAD_CLASS(Classpath::SecurityException); + LOAD_CLASS(Classpath::ClassFormatError); + LOAD_CLASS(Classpath::ClassCircularityError); + LOAD_CLASS(Classpath::NoClassDefFoundError); + LOAD_CLASS(Classpath::UnsupportedClassVersionError); + LOAD_CLASS(Classpath::NoSuchFieldError); + LOAD_CLASS(Classpath::NoSuchMethodError); + LOAD_CLASS(Classpath::InstantiationError); + LOAD_CLASS(Classpath::IllegalAccessError); + LOAD_CLASS(Classpath::IllegalAccessException); + LOAD_CLASS(Classpath::VerifyError); + LOAD_CLASS(Classpath::ExceptionInInitializerError); + LOAD_CLASS(Classpath::LinkageError); + LOAD_CLASS(Classpath::AbstractMethodError); + LOAD_CLASS(Classpath::UnsatisfiedLinkError); + LOAD_CLASS(Classpath::InternalError); + LOAD_CLASS(Classpath::OutOfMemoryError); + LOAD_CLASS(Classpath::StackOverflowError); + LOAD_CLASS(Classpath::UnknownError); + LOAD_CLASS(Classpath::ClassNotFoundException); #undef LOAD_CLASS mapInitialThread(); @@ -733,9 +733,9 @@ JavaThread::clearException(); JavaObject* obj = JavaThread::currentThread(); JavaObject* group = - ClasspathThread::group->getVirtualObjectField(obj); + Classpath::group->getVirtualObjectField(obj); try{ - ClasspathThread::uncaughtException->invokeIntSpecial(this, group, obj, + Classpath::uncaughtException->invokeIntSpecial(this, group, obj, exc); }catch(...) { printf("Even uncaught exception throwed an exception!\n"); From tilmann.scheller at googlemail.com Mon Aug 25 09:13:53 2008 From: tilmann.scheller at googlemail.com (Tilmann Scheller) Date: Mon, 25 Aug 2008 16:13:53 -0000 Subject: [vmkit-commits] [vmkit] r55313 - in /vmkit/trunk/lib/N3/VMCore: CLISignature.cpp VMClass.cpp VMClass.h Message-ID: <200808251613.m7PGDrMH000788@zion.cs.uiuc.edu> Author: tilmann Date: Mon Aug 25 11:13:52 2008 New Revision: 55313 URL: http://llvm.org/viewvc/llvm-project?rev=55313&view=rev Log: add flag for dummy classes Modified: vmkit/trunk/lib/N3/VMCore/CLISignature.cpp vmkit/trunk/lib/N3/VMCore/VMClass.cpp vmkit/trunk/lib/N3/VMCore/VMClass.h Modified: vmkit/trunk/lib/N3/VMCore/CLISignature.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLISignature.cpp?rev=55313&r1=55312&r2=55313&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/CLISignature.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/CLISignature.cpp Mon Aug 25 11:13:52 2008 @@ -300,9 +300,10 @@ if (currGenericMethod == NULL) { // when reading in signatures which contain references to generic arguments // of generic methods we need create a placeholder for each of them, - // this is done by creating a dummy VMClass which has the assembly field - // set to NULL, the token field is used to store the generic argument number + // this is done by creating a dummy VMClass, + // the token field is used to store the generic argument number VMClass* cl = gc_new(VMClass)(); + cl->isDummy = true; cl->token = number; cl->assembly = ass; cl->nameSpace = ass->name; Modified: vmkit/trunk/lib/N3/VMCore/VMClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.cpp?rev=55313&r1=55312&r2=55313&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMClass.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/VMClass.cpp Mon Aug 25 11:13:52 2008 @@ -168,6 +168,7 @@ this->isArray = isArray; this->isPointer = false; this->isPrimitive = false; + this->isDummy = false; this->naturalType = llvm::OpaqueType::get(); } @@ -831,16 +832,14 @@ std::vector::iterator i = parameters.begin(), a = args.begin(), e = args.end(); - // dummy classes for generic arguments have a NULL assembly field // check whether both i and a point to a dummy class - if (((*i)->assembly == NULL && (*a)->assembly != NULL) || - ((*i)->assembly != NULL && (*a)->assembly == NULL)) + if (((*i)->isDummy && !(*a)->isDummy) || (!(*i)->isDummy && (*a)->isDummy)) return false; // dummy classes for generic arguments contain the // argument number in the token field // signature is only equal if the argument number matches - if ((*i)->assembly == NULL && (*a)->assembly == NULL) { + if ((*i)->isDummy && (*a)->isDummy) { if ((*i)->token != (*a)->token) { return false; } @@ -857,16 +856,14 @@ } for (; a != e; ++i, ++a) { - // dummy classes for generic arguments have a NULL assembly field // check whether both i and a point to a dummy class - if (((*i)->assembly == NULL && (*a)->assembly != NULL) || - ((*i)->assembly != NULL && (*a)->assembly == NULL)) + if (((*i)->isDummy && !(*a)->isDummy) || (!(*i)->isDummy && (*a)->isDummy)) return false; // dummy classes for generic arguments contain the // argument number in the token field // signature is only equal if the argument number matches - if ((*i)->assembly == NULL && (*a)->assembly == NULL) { + if ((*i)->isDummy && (*a)->isDummy) { if ((*i)->token != (*a)->token) { return false; } else { Modified: vmkit/trunk/lib/N3/VMCore/VMClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.h?rev=55313&r1=55312&r2=55313&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/VMClass.h (original) +++ vmkit/trunk/lib/N3/VMCore/VMClass.h Mon Aug 25 11:13:52 2008 @@ -74,6 +74,7 @@ bool isArray; bool isPointer; bool isPrimitive; + bool isDummy; uint32 depth; VMClassState status; uint32 flags; From nicolas.geoffray at lip6.fr Tue Aug 26 02:14:38 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 26 Aug 2008 09:14:38 -0000 Subject: [vmkit-commits] [vmkit] r55366 - /vmkit/branches/ Message-ID: <200808260914.m7Q9EcMe016060@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 26 04:14:37 2008 New Revision: 55366 URL: http://llvm.org/viewvc/llvm-project?rev=55366&view=rev Log: Add a branch directory. Added: vmkit/branches/ From nicolas.geoffray at lip6.fr Tue Aug 26 02:16:18 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 26 Aug 2008 09:16:18 -0000 Subject: [vmkit-commits] [vmkit] r55367 - /vmkit/branches/isolate/ Message-ID: <200808260916.m7Q9GIYP016110@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 26 04:16:18 2008 New Revision: 55367 URL: http://llvm.org/viewvc/llvm-project?rev=55367&view=rev Log: Creating the isolate branch Added: vmkit/branches/isolate/ - copied from r55365, vmkit/trunk/ From nicolas.geoffray at lip6.fr Tue Aug 26 02:30:55 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 26 Aug 2008 09:30:55 -0000 Subject: [vmkit-commits] [vmkit] r55368 - in /vmkit/branches/isolate/lib/JnJVM: Classpath/ Isolate/ VMCore/ Message-ID: <200808260930.m7Q9Uud4016716@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 26 04:30:54 2008 New Revision: 55368 URL: http://llvm.org/viewvc/llvm-project?rev=55368&view=rev Log: Reorganizing code to be able to share Java code between isolates. SingleVM still works, MultiVM does not. Added: vmkit/branches/isolate/lib/JnJVM/Isolate/ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.cpp vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.h vmkit/branches/isolate/lib/JnJVM/Isolate/Makefile vmkit/branches/isolate/lib/JnJVM/Isolate/SharedMaps.h Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMField.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMObject.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystem.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/Makefile vmkit/branches/isolate/lib/JnJVM/VMCore/JavaArray.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaArray.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaObject.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaString.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaThread.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.h vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/LockedMap.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/LockedMap.h vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/Makefile vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.h vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp Tue Aug 26 04:30:54 2008 @@ -44,7 +44,7 @@ #endif jclass Cl) { - CommonClass* cl = NativeUtil::resolvedImplClass(Cl, true); + UserCommonClass* cl = NativeUtil::resolvedImplClass(Cl, true); if (cl->lookupMethodDontThrow(Jnjvm::clinitName, Jnjvm::clinitType, true, false)) return true; else @@ -57,8 +57,9 @@ jclass clazz, #endif jobject Field, jobject obj, jboolean val) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); - field->setVirtualInt8Field((JavaObject*)obj, (uint8)val); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); + field->setInt8Field((JavaObject*)obj, (uint8)val); } JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setByteNative( @@ -67,8 +68,9 @@ jclass clazz, #endif jobject Field, jobject obj, jbyte val) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); - field->setVirtualInt8Field((JavaObject*)obj, (uint8)val); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); + field->setInt8Field((JavaObject*)obj, (uint8)val); } JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setCharNative( @@ -77,8 +79,9 @@ jclass clazz, #endif jobject Field, jobject obj, jchar val) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); - field->setVirtualInt16Field((JavaObject*)obj, (uint16)val); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); + field->setInt16Field((JavaObject*)obj, (uint16)val); } JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setShortNative( @@ -87,8 +90,9 @@ jclass clazz, #endif jobject Field, jobject obj, jshort val) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); - field->setVirtualInt16Field((JavaObject*)obj, (sint16)val); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); + field->setInt16Field((JavaObject*)obj, (sint16)val); } JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setIntNative( @@ -97,8 +101,9 @@ jclass clazz, #endif jobject Field, jobject obj, jint val) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); - field->setVirtualInt32Field((JavaObject*)obj, (sint32)val); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); + field->setInt32Field((JavaObject*)obj, (sint32)val); } JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setLongNative( @@ -107,8 +112,9 @@ jclass clazz, #endif jobject Field, jobject obj, jlong val) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); - field->setVirtualLongField((JavaObject*)obj, (sint64)val); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); + field->setLongField((JavaObject*)obj, (sint64)val); } JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setFloatNative( @@ -117,8 +123,9 @@ jclass clazz, #endif jobject Field, jobject obj, jfloat val) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); - field->setVirtualFloatField((JavaObject*)obj, (float)val); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); + field->setFloatField((JavaObject*)obj, (float)val); } JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setDoubleNative( @@ -127,8 +134,9 @@ jclass clazz, #endif jobject Field, jobject obj, jdouble val) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); - field->setVirtualDoubleField((JavaObject*)obj, (double)val); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); + field->setDoubleField((JavaObject*)obj, (double)val); } JNIEXPORT void JNICALL Java_java_io_VMObjectStreamClass_setObjectNative( @@ -137,8 +145,9 @@ jclass clazz, #endif jobject Field, jobject obj, jobject val) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); - field->setVirtualObjectField((JavaObject*)obj, (JavaObject*)val); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); + field->setObjectField((JavaObject*)obj, (JavaObject*)val); } JNIEXPORT jobject JNICALL Java_java_io_VMObjectInputStream_allocateObject( @@ -148,9 +157,9 @@ #endif jclass target, jclass constr, jobject cons) { Jnjvm* vm = JavaThread::get()->isolate; - Class* cl = (Class*)NativeUtil::resolvedImplClass(target, true); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(target, true); JavaObject* res = cl->doNew(vm); - JavaMethod* meth = (JavaMethod*)(Classpath::constructorSlot->getVirtualInt32Field((JavaObject*)cons)); + JavaMethod* meth = (JavaMethod*)(vm->upcalls->constructorSlot->getInt32Field((JavaObject*)cons)); meth->invokeIntSpecial(vm, res); return (jobject)res; } @@ -165,11 +174,11 @@ jclass arrayType, jint arrayLength) { Jnjvm* vm = JavaThread::get()->isolate; - CommonClass* base = NativeUtil::resolvedImplClass(arrayType, true); + UserCommonClass* base = NativeUtil::resolvedImplClass(arrayType, true); JnjvmClassLoader* loader = base->classLoader; - const UTF8* name = base->name; + const UTF8* name = base->getName(); const UTF8* arrayName = AssessorDesc::constructArrayName(loader, 0, 1, name); - ClassArray* array = loader->constructArray(arrayName); + UserClassArray* array = loader->constructArray(arrayName); ArrayObject* res = ArrayObject::acons(arrayLength, array, &(vm->allocator)); return (jobject) res; Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc Tue Aug 26 04:30:54 2008 @@ -32,7 +32,8 @@ JNIEnv *env, #endif jobject cons) { - JavaMethod* meth = (JavaMethod*)(Classpath::constructorSlot->getVirtualInt32Field((JavaObject*)cons)); + Jnjvm* vm = JavaThread::get()->isolate; + JavaMethod* meth = (JavaMethod*)(vm->upcalls->constructorSlot->getInt32Field((JavaObject*)cons)); JnjvmClassLoader* loader = meth->classDef->classLoader; return (jobject)(NativeUtil::getParameterTypes(loader, meth)); } @@ -42,7 +43,8 @@ JNIEnv *env, #endif jobject cons) { - JavaMethod* meth = (JavaMethod*)(Classpath::constructorSlot->getVirtualInt32Field((JavaObject*)cons)); + Jnjvm* vm = JavaThread::get()->isolate; + JavaMethod* meth = (JavaMethod*)(vm->upcalls->constructorSlot->getInt32Field((JavaObject*)cons)); return meth->access; } @@ -64,10 +66,10 @@ void* _buf = (void*)buf; sint32 index = 0; if (nbArgs == size) { - CommonClass* _cl = NativeUtil::resolvedImplClass(Clazz, false); - if (!_cl->isArray) { - Class* cl = (Class*)_cl; - vm->initialiseClass(cl); + UserCommonClass* _cl = NativeUtil::resolvedImplClass(Clazz, false); + if (!_cl->isArray()) { + UserClass* cl = (UserClass*)_cl; + cl->initialiseClass(vm); JavaObject* res = cl->doNew(vm); JavaObject** ptr = (JavaObject**)(void*)(args->elements); @@ -84,8 +86,8 @@ JavaThread::clearException(); } if (excp) { - if (excp->classOf->isAssignableFrom(Classpath::newException)) { - JavaThread::get()->isolate->invocationTargetException(excp); + if (excp->classOf->isAssignableFrom(vm->upcalls->newException)) { + vm->invocationTargetException(excp); } else { JavaThread::throwException(excp); } @@ -104,7 +106,8 @@ #endif jobject cons) { verifyNull(cons); - JavaMethod* meth = (JavaMethod*)Classpath::constructorSlot->getVirtualInt32Field((JavaObject*)cons); + Jnjvm* vm = JavaThread::get()->isolate; + JavaMethod* meth = (JavaMethod*)vm->upcalls->constructorSlot->getInt32Field((JavaObject*)cons); return (jobjectArray)NativeUtil::getExceptionTypes(meth); } Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc Tue Aug 26 04:30:54 2008 @@ -30,8 +30,9 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif - jobject Meth) { - JavaMethod* meth = (JavaMethod*)Classpath::methodSlot->getVirtualInt32Field((JavaObject*)Meth); + jobject Meth) { + Jnjvm* vm = JavaThread::get()->isolate; + JavaMethod* meth = (JavaMethod*)vm->upcalls->methodSlot->getInt32Field((JavaObject*)Meth); return meth->access; } @@ -40,8 +41,15 @@ JNIEnv *env, #endif jobject Meth) { - JavaMethod* meth = (JavaMethod*)Classpath::methodSlot->getVirtualInt32Field((JavaObject*)Meth); + Jnjvm* vm = JavaThread::get()->isolate; + JavaMethod* meth = (JavaMethod*)vm->upcalls->methodSlot->getInt32Field((JavaObject*)Meth); +#ifdef MULTIPLE_VM + jclass Cl = (jclass)vm->upcalls->methodClass->getInt32Field((JavaObject*)Meth); + UserCommonClass* cl = NativeUtil::resolvedImplClass(Cl, false); + JnjvmClassLoader* loader = cl->classLoader; +#else JnjvmClassLoader* loader = meth->classDef->classLoader; +#endif return (jclass)NativeUtil::getClassType(loader, meth->getSignature()->ret); } @@ -52,7 +60,8 @@ #endif jobject Meth) { - JavaMethod* meth = (JavaMethod*)Classpath::methodSlot->getVirtualInt32Field((JavaObject*)Meth); + Jnjvm* vm = JavaThread::get()->isolate; + JavaMethod* meth = (JavaMethod*)vm->upcalls->methodSlot->getInt32Field((JavaObject*)Meth); JnjvmClassLoader* loader = meth->classDef->classLoader; return (jobject)(NativeUtil::getParameterTypes(loader, meth)); } @@ -74,17 +83,25 @@ void* _buf = (void*)buf; sint32 index = 0; if (nbArgs == size) { - CommonClass* _cl = NativeUtil::resolvedImplClass(Cl, false); - Class* cl = (Class*)_cl; + UserCommonClass* _cl = NativeUtil::resolvedImplClass(Cl, false); + UserClass* cl = (UserClass*)_cl; if (isVirtual(meth->access)) { verifyNull(obj); - if (!(obj->classOf->isAssignableFrom(meth->classDef))) { - vm->illegalArgumentExceptionForMethod(meth, meth->classDef, obj->classOf); + UserCommonClass* cl; +#ifdef MULTIPLE_VM + jclass Cl = (jclass)vm->upcalls->methodClass->getInt32Field((JavaObject*)Meth); + cl = NativeUtil::resolvedImplClass(Cl, false); + +#else + cl = meth->classDef; +#endif + if (!(obj->classOf->isAssignableFrom(cl))) { + vm->illegalArgumentExceptionForMethod(meth, cl, obj->classOf); } } else { - vm->initialiseClass(cl); + cl->initialiseClass(vm); } JavaObject** ptr = (JavaObject**)(void*)(args->elements); @@ -113,7 +130,7 @@ } \ \ if (exc) { \ - if (exc->classOf->isAssignableFrom(Classpath::newException)) { \ + if (exc->classOf->isAssignableFrom(vm->upcalls->newException)) { \ JavaThread::get()->isolate->invocationTargetException(exc); \ } else { \ JavaThread::throwException(exc); \ @@ -129,43 +146,43 @@ } else if (retType == AssessorDesc::dBool) { uint32 val = 0; RUN_METH(Int); - res = Classpath::boolClass->doNew(vm); - Classpath::boolValue->setVirtualInt8Field(res, val); + res = vm->upcalls->boolClass->doNew(vm); + vm->upcalls->boolValue->setInt8Field(res, val); } else if (retType == AssessorDesc::dByte) { uint32 val = 0; RUN_METH(Int); - res = Classpath::byteClass->doNew(vm); - Classpath::byteValue->setVirtualInt8Field(res, val); + res = vm->upcalls->byteClass->doNew(vm); + vm->upcalls->byteValue->setInt8Field(res, val); } else if (retType == AssessorDesc::dChar) { uint32 val = 0; RUN_METH(Int); - res = Classpath::charClass->doNew(vm); - Classpath::charValue->setVirtualInt16Field(res, val); + res = vm->upcalls->charClass->doNew(vm); + vm->upcalls->charValue->setInt16Field(res, val); } else if (retType == AssessorDesc::dShort) { uint32 val = 0; RUN_METH(Int); - res = Classpath::shortClass->doNew(vm); - Classpath::shortValue->setVirtualInt16Field(res, val); + res = vm->upcalls->shortClass->doNew(vm); + vm->upcalls->shortValue->setInt16Field(res, val); } else if (retType == AssessorDesc::dInt) { uint32 val = 0; RUN_METH(Int); - res = Classpath::intClass->doNew(vm); - Classpath::intValue->setVirtualInt32Field(res, val); + res = vm->upcalls->intClass->doNew(vm); + vm->upcalls->intValue->setInt32Field(res, val); } else if (retType == AssessorDesc::dLong) { sint64 val = 0; RUN_METH(Long); - res = Classpath::longClass->doNew(vm); - Classpath::longValue->setVirtualLongField(res, val); + res = vm->upcalls->longClass->doNew(vm); + vm->upcalls->longValue->setLongField(res, val); } else if (retType == AssessorDesc::dFloat) { float val = 0; RUN_METH(Float); - res = Classpath::floatClass->doNew(vm); - Classpath::floatValue->setVirtualFloatField(res, val); + res = vm->upcalls->floatClass->doNew(vm); + vm->upcalls->floatValue->setFloatField(res, val); } else if (retType == AssessorDesc::dDouble) { double val = 0; RUN_METH(Double); - res = Classpath::doubleClass->doNew(vm); - Classpath::doubleValue->setVirtualDoubleField(res, val); + res = vm->upcalls->doubleClass->doNew(vm); + vm->upcalls->doubleValue->setDoubleField(res, val); } else if (retType == AssessorDesc::dTab || retType == AssessorDesc::dRef) { JavaObject* val = 0; RUN_METH(JavaObject); @@ -187,7 +204,8 @@ #endif jobject _meth) { verifyNull(_meth); - JavaMethod* meth = (JavaMethod*)Classpath::methodSlot->getVirtualInt32Field((JavaObject*)_meth); + Jnjvm* vm = JavaThread::get()->isolate; + JavaMethod* meth = (JavaMethod*)vm->upcalls->methodSlot->getInt32Field((JavaObject*)_meth); return (jobjectArray)NativeUtil::getExceptionTypes(meth); } Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc Tue Aug 26 04:30:54 2008 @@ -35,10 +35,11 @@ #endif jobject klass) { - CommonClass* cl = - (CommonClass*)Classpath::vmdataClass->getVirtualObjectField((JavaObject*)klass); + Jnjvm* vm = JavaThread::get()->isolate; + UserCommonClass* cl = + (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField((JavaObject*)klass); - return cl->isArray; + return cl->isArray(); } @@ -52,17 +53,17 @@ jboolean clinit, jobject loader) { - + Jnjvm* vm = JavaThread::get()->isolate; JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader); - CommonClass* cl = JCL->lookupClassFromJavaString((JavaString*)str, + UserCommonClass* cl = JCL->lookupClassFromJavaString((JavaString*)str, true, false); if (cl != 0) { if (clinit) { - JavaThread::get()->isolate->initialiseClass(cl); + cl->initialiseClass(vm); } - return (jclass)(cl->getClassDelegatee()); + return (jclass)(cl->getClassDelegatee(vm)); } else { - JavaThread::get()->isolate->classNotFoundException((JavaString*)str); + vm->classNotFoundException((JavaString*)str); return 0; } } @@ -76,23 +77,23 @@ jclass Cl, jboolean publicOnly) { - CommonClass* cl = NativeUtil::resolvedImplClass(Cl, false); + UserCommonClass* cl = NativeUtil::resolvedImplClass(Cl, false); Jnjvm* vm = JavaThread::get()->isolate; - if (cl->isArray || isInterface(cl->access)) { - return (jobject)ArrayObject::acons(0, Classpath::constructorArrayClass, &(vm->allocator)); + if (cl->isArray() || cl->isInterface()) { + return (jobject)ArrayObject::acons(0, vm->upcalls->constructorArrayClass, &(vm->allocator)); } else { std::vector res; cl->getDeclaredConstructors(res, publicOnly); - ArrayObject* ret = ArrayObject::acons(res.size(), Classpath::constructorArrayClass, &(vm->allocator)); + ArrayObject* ret = ArrayObject::acons(res.size(), vm->upcalls->constructorArrayClass, &(vm->allocator)); sint32 index = 0; for (std::vector::iterator i = res.begin(), e = res.end(); i != e; ++i, ++index) { JavaMethod* meth = *i; // TODO: check parameter types - JavaObject* tmp = Classpath::newConstructor->doNew(vm); - Classpath::initConstructor->invokeIntSpecial(vm, tmp, Cl, meth); + JavaObject* tmp = vm->upcalls->newConstructor->doNew(vm); + vm->upcalls->initConstructor->invokeIntSpecial(vm, tmp, Cl, meth); ret->elements[index] = tmp; } return (jobject)ret; @@ -109,22 +110,22 @@ jboolean publicOnly) { Jnjvm* vm = JavaThread::get()->isolate; - CommonClass* cl = NativeUtil::resolvedImplClass(Cl, false); + UserCommonClass* cl = NativeUtil::resolvedImplClass(Cl, false); - if (cl->isArray) { - return (jobject)ArrayObject::acons(0, Classpath::methodArrayClass, &(vm->allocator)); + if (cl->isArray()) { + return (jobject)ArrayObject::acons(0, vm->upcalls->methodArrayClass, &(vm->allocator)); } else { std::vector res; cl->getDeclaredMethods(res, publicOnly); - ArrayObject* ret = ArrayObject::acons(res.size(), Classpath::methodArrayClass, &(vm->allocator)); + ArrayObject* ret = ArrayObject::acons(res.size(), vm->upcalls->methodArrayClass, &(vm->allocator)); sint32 index = 0; for (std::vector::iterator i = res.begin(), e = res.end(); i != e; ++i, ++index) { JavaMethod* meth = *i; // TODO: check parameter types - JavaObject* tmp = Classpath::newMethod->doNew(vm); - Classpath::initMethod->invokeIntSpecial(vm, tmp, Cl, + JavaObject* tmp = vm->upcalls->newMethod->doNew(vm); + vm->upcalls->initMethod->invokeIntSpecial(vm, tmp, Cl, vm->UTF8ToStr(meth->name), meth); ret->elements[index] = tmp; } @@ -140,8 +141,8 @@ jclass Cl, jboolean ignore) { - CommonClass* cl = NativeUtil::resolvedImplClass(Cl, false); - return cl->access; + UserCommonClass* cl = NativeUtil::resolvedImplClass(Cl, false); + return cl->getAccess(); } JNIEXPORT jobject JNICALL Java_java_lang_VMClass_getName( @@ -151,10 +152,10 @@ #endif jobject Cl) { Jnjvm* vm = JavaThread::get()->isolate; - CommonClass* cl = - (CommonClass*)Classpath::vmdataClass->getVirtualObjectField((JavaObject*)Cl); + UserCommonClass* cl = + (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField((JavaObject*)Cl); - const UTF8* iname = cl->name; + const UTF8* iname = cl->getName(); const UTF8* res = iname->internalToJava(cl->classLoader->hashUTF8, 0, iname->size); return (jobject)(vm->UTF8ToStr(res)); @@ -166,10 +167,11 @@ jclass clazz, #endif jclass Cl) { - CommonClass* cl = - (CommonClass*)Classpath::vmdataClass->getVirtualObjectField((JavaObject*)Cl); + Jnjvm* vm = JavaThread::get()->isolate; + UserCommonClass* cl = + (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField((JavaObject*)Cl); - return cl->isPrimitive; + return cl->isPrimitive(); } JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isInterface( @@ -178,9 +180,9 @@ jclass clazz, #endif jclass Cl) { - CommonClass* cl = NativeUtil::resolvedImplClass(Cl, false); + UserCommonClass* cl = NativeUtil::resolvedImplClass(Cl, false); - return isInterface(cl->access); + return cl->isInterface(); } JNIEXPORT jclass JNICALL Java_java_lang_VMClass_getComponentType( @@ -189,12 +191,13 @@ jclass clazz, #endif jclass Cl) { - CommonClass* cl = - (CommonClass*)Classpath::vmdataClass->getVirtualObjectField((JavaObject*)Cl); + Jnjvm* vm = JavaThread::get()->isolate; + UserCommonClass* cl = + (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField((JavaObject*)Cl); - if (cl->isArray) { - CommonClass* bc = ((ClassArray*)cl)->baseClass(); - return (jclass)(bc->getClassDelegatee()); + if (cl->isArray()) { + UserCommonClass* bc = ((UserClassArray*)cl)->baseClass(); + return (jclass)(bc->getClassDelegatee(vm)); } else { return 0; } @@ -206,8 +209,9 @@ jclass clazz, #endif jclass Cl) { - CommonClass* cl = - (CommonClass*)Classpath::vmdataClass->getVirtualObjectField((JavaObject*)Cl); + Jnjvm* vm = JavaThread::get()->isolate; + UserCommonClass* cl = + (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField((JavaObject*)Cl); return (jobject)cl->classLoader->getJavaClassLoader(); } @@ -217,10 +221,11 @@ jclass clazz, #endif jclass Cl1, jclass Cl2) { - CommonClass* cl1 = - (CommonClass*)Classpath::vmdataClass->getVirtualObjectField((JavaObject*)Cl1); - CommonClass* cl2 = - (CommonClass*)Classpath::vmdataClass->getVirtualObjectField((JavaObject*)Cl2); + Jnjvm* vm = JavaThread::get()->isolate; + UserCommonClass* cl1 = + (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField((JavaObject*)Cl1); + UserCommonClass* cl2 = + (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField((JavaObject*)Cl2); cl2->resolveClass(); return cl2->isAssignableFrom(cl1); @@ -233,13 +238,14 @@ jclass clazz, #endif jclass Cl) { - CommonClass* cl = - (CommonClass*)Classpath::vmdataClass->getVirtualObjectField((JavaObject*)Cl); - if (isInterface(cl->access)) + Jnjvm* vm = JavaThread::get()->isolate; + UserCommonClass* cl = + (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField((JavaObject*)Cl); + if (cl->isInterface()) return 0; else { cl->resolveClass(); - if (cl->super) return (jobject)JavaThread::get()->isolate->getClassDelegatee(cl->super); + if (cl->getSuper()) return (jobject)cl->getSuper()->getClassDelegatee(vm); else return 0; } } @@ -250,8 +256,9 @@ jclass clazz, #endif jclass Cl, jobject obj) { - CommonClass* cl = - (CommonClass*)Classpath::vmdataClass->getVirtualObjectField((JavaObject*)Cl); + Jnjvm* vm = JavaThread::get()->isolate; + UserCommonClass* cl = + (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField((JavaObject*)Cl); return ((JavaObject*)obj)->instanceOf(cl); } @@ -262,23 +269,23 @@ #endif jclass Cl, jboolean publicOnly) { Jnjvm* vm = JavaThread::get()->isolate; - CommonClass* cl = NativeUtil::resolvedImplClass(Cl, false); + UserCommonClass* cl = NativeUtil::resolvedImplClass(Cl, false); - if (cl->isArray) { - return (jobject)ArrayObject::acons(0, Classpath::fieldArrayClass, &(vm->allocator)); + if (cl->isArray()) { + return (jobject)ArrayObject::acons(0, vm->upcalls->fieldArrayClass, &(vm->allocator)); } else { std::vector res; cl->getDeclaredFields(res, publicOnly); ArrayObject* ret = ArrayObject::acons(res.size(), - Classpath::fieldArrayClass, &(vm->allocator)); + vm->upcalls->fieldArrayClass, &(vm->allocator)); sint32 index = 0; for (std::vector::iterator i = res.begin(), e = res.end(); i != e; ++i, ++index) { JavaField* field = *i; // TODO: check parameter types - JavaObject* tmp = Classpath::newField->doNew(vm); - Classpath::initField->invokeIntSpecial(vm, tmp, Cl, + JavaObject* tmp = vm->upcalls->newField->doNew(vm); + vm->upcalls->initField->invokeIntSpecial(vm, tmp, Cl, vm->UTF8ToStr(field->name), field); ret->elements[index] = tmp; } @@ -293,14 +300,14 @@ #endif jclass Cl) { Jnjvm* vm = JavaThread::get()->isolate; - CommonClass* cl = NativeUtil::resolvedImplClass(Cl, false); - std::vector & interfaces = cl->interfaces; - ArrayObject* ret = ArrayObject::acons(interfaces.size(), Classpath::classArrayClass, &(vm->allocator)); + UserCommonClass* cl = NativeUtil::resolvedImplClass(Cl, false); + std::vector * interfaces = cl->getInterfaces(); + ArrayObject* ret = ArrayObject::acons(interfaces->size(), vm->upcalls->classArrayClass, &(vm->allocator)); sint32 index = 0; - for (std::vector::iterator i = interfaces.begin(), e = interfaces.end(); + for (std::vector::iterator i = interfaces->begin(), e = interfaces->end(); i != e; ++i, ++index) { - Class* klass = *i; - ret->elements[index] = vm->getClassDelegatee(klass); + UserClass* klass = *i; + ret->elements[index] = klass->getClassDelegatee(vm); } return (jobject)ret; } @@ -313,11 +320,11 @@ #endif jclass Cl) { Jnjvm* vm = JavaThread::get()->isolate; - Class* cl = (Class*)NativeUtil::resolvedImplClass(Cl, false); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(Cl, false); cl->resolveInnerOuterClasses(); - Class* outer = cl->getOuterClass(); + UserClass* outer = cl->getOuterClass(); if (outer) { - return (jclass)vm->getClassDelegatee(outer); + return (jclass)outer->getClassDelegatee(vm); } else { return 0; } @@ -330,14 +337,14 @@ #endif jclass Cl, bool publicOnly) { Jnjvm* vm = JavaThread::get()->isolate; - Class* cl = (Class*)NativeUtil::resolvedImplClass(Cl, false); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(Cl, false); cl->resolveInnerOuterClasses(); - std::vector* innerClasses = cl->getInnerClasses(); - ArrayObject* res = ArrayObject::acons(innerClasses->size(), Classpath::constructorArrayClass, &(vm->allocator)); + std::vector* innerClasses = cl->getInnerClasses(); + ArrayObject* res = ArrayObject::acons(innerClasses->size(), vm->upcalls->constructorArrayClass, &(vm->allocator)); uint32 index = 0; - for (std::vector::iterator i = innerClasses->begin(), + for (std::vector::iterator i = innerClasses->begin(), e = innerClasses->end(); i!= e; i++) { - res->elements[index++] = vm->getClassDelegatee(*i); + res->elements[index++] = (*i)->getClassDelegatee(vm); } return (jobject)res; @@ -361,7 +368,7 @@ jclass Cl) { // TODO implement me Jnjvm* vm = JavaThread::get()->isolate; - ArrayObject* res = ArrayObject::acons(0, Classpath::constructorArrayAnnotation, &(vm->allocator)); + ArrayObject* res = ArrayObject::acons(0, vm->upcalls->constructorArrayAnnotation, &(vm->allocator)); return (jobjectArray)res; } } Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc Tue Aug 26 04:30:54 2008 @@ -37,7 +37,7 @@ if (!ass) vm->unknownError("unknown byte primitive %c", byteId); - return (jobject)ass->classType->getClassDelegatee(); + return (jobject)ass->classType->getClassDelegatee(vm); } @@ -53,9 +53,9 @@ JavaString* name = (JavaString*)_name; const UTF8* utf8 = name->strToUTF8(vm); JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader); - CommonClass* cl = JCL->lookupClass(utf8); + UserCommonClass* cl = JCL->lookupClass(utf8); - if (cl) return (jclass)(cl->getClassDelegatee()); + if (cl) return (jclass)(cl->getClassDelegatee(vm)); else return 0; } @@ -66,13 +66,14 @@ #endif jobject _str, jboolean doResolve) { + Jnjvm* vm = JavaThread::get()->isolate; JavaString* str = (JavaString*)_str; JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; - CommonClass* cl = JCL->lookupClassFromJavaString(str, doResolve, false); + UserCommonClass* cl = JCL->lookupClassFromJavaString(str, doResolve, false); if (cl != 0) { - return (jclass)cl->getClassDelegatee(); + return (jclass)cl->getClassDelegatee(vm); } else { return 0; } @@ -89,12 +90,13 @@ jint off, jint len, jobject pd) { + Jnjvm* vm = JavaThread::get()->isolate; JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader); JavaString* str = (JavaString*)_str; const UTF8* name = str->value->javaToInternal(JCL->hashUTF8, str->offset, str->count); - Class* cl = JCL->constructClass(name, (ArrayUInt8*)bytes); + UserClass* cl = JCL->constructClass(name, (ArrayUInt8*)bytes); - return (jclass)(cl->getClassDelegatee((JavaObject*)pd)); + return (jclass)(cl->getClassDelegatee(vm, (JavaObject*)pd)); } JNIEXPORT void JNICALL Java_java_lang_VMClassLoader_resolveClass( Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMField.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMField.cpp.inc?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMField.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMField.cpp.inc Tue Aug 26 04:30:54 2008 @@ -19,12 +19,24 @@ extern "C" { + +static UserClass* internalGetClass(Jnjvm* vm, JavaField* field, jobject Field) { +#ifdef MULTIPLE_VM + jclass Cl = (jclass)vm->upcalls->fieldClass->getInt32Field((JavaObject*)Field); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(Cl, false); + return cl; +#else + return field->classDef; +#endif +} + JNIEXPORT jint JNICALL Java_java_lang_reflect_Field_getModifiersInternal( #ifdef NATIVE_JNI JNIEnv *env, #endif jobject obj) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)obj); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)obj); return field->access; } @@ -33,10 +45,11 @@ JNIEnv *env, #endif jobject obj) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)obj); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)obj); JnjvmClassLoader* loader = field->classDef->classLoader; - CommonClass* cl = field->getSignature()->assocClass(loader); - return (jclass)cl->getClassDelegatee(); + UserCommonClass* cl = field->getSignature()->assocClass(loader); + return (jclass)cl->getClassDelegatee(vm); } JNIEXPORT jint JNICALL Java_java_lang_reflect_Field_getInt( @@ -44,29 +57,27 @@ JNIEnv *env, #endif jobject Field, jobject obj) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); const AssessorDesc* ass = field->getSignature()->funcs; - if (isStatic(field->access)) - JavaThread::get()->isolate->initialiseClass(field->classDef); + JavaObject* Obj = (JavaObject*)obj; + + if (isStatic(field->access)) { + UserClass* cl = internalGetClass(vm, field, Field); + cl->initialiseClass(vm); + Obj = cl->getStaticInstance(); + } switch (ass->numId) { case INT_ID : - return isStatic(field->access) ? - (sint32)field->getStaticInt32Field() : - (sint32)field->getVirtualInt32Field((JavaObject*)obj); + return (sint32)field->getInt32Field(Obj); case CHAR_ID : - return isStatic(field->access) ? - (uint32)field->getStaticInt16Field() : - (uint32)field->getVirtualInt16Field((JavaObject*)obj); + return (uint32)field->getInt16Field(Obj); case BYTE_ID : - return isStatic(field->access) ? - (sint32)field->getStaticInt8Field() : - (sint32)field->getVirtualInt8Field((JavaObject*)obj); + return (sint32)field->getInt8Field(Obj); case SHORT_ID : - return isStatic(field->access) ? - (sint32)field->getStaticInt16Field() : - (sint32)field->getVirtualInt16Field((JavaObject*)obj); + return (sint32)field->getInt16Field(Obj); default : JavaThread::get()->isolate->illegalArgumentException(""); } @@ -79,33 +90,29 @@ JNIEnv *env, #endif jobject Field, jobject obj) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); const AssessorDesc* ass = field->getSignature()->funcs; - if (isStatic(field->access)) - JavaThread::get()->isolate->initialiseClass(field->classDef); + JavaObject* Obj = (JavaObject*)obj; + + if (isStatic(field->access)) { + UserClass* cl = internalGetClass(vm, field, Field); + cl->initialiseClass(vm); + Obj = cl->getStaticInstance(); + } switch (ass->numId) { case INT_ID : - return isStatic(field->access) ? - (sint64)field->getStaticInt32Field() : - (sint64)field->getVirtualInt32Field((JavaObject*)obj); + return (sint64)field->getInt32Field(Obj); case CHAR_ID : - return isStatic(field->access) ? - (uint64)field->getStaticInt16Field() : - (uint64)field->getVirtualInt16Field((JavaObject*)obj); + return (uint64)field->getInt16Field(Obj); case BYTE_ID : - return isStatic(field->access) ? - (sint64)field->getStaticInt8Field() : - (sint64)field->getVirtualInt8Field((JavaObject*)obj); + return (sint64)field->getInt8Field(Obj); case SHORT_ID : - return isStatic(field->access) ? - (sint64)field->getStaticInt16Field() : - (sint64)field->getVirtualInt16Field((JavaObject*)obj); + return (sint64)field->getInt16Field(Obj); case LONG_ID : - return isStatic(field->access) ? - (sint64)field->getStaticLongField() : - (sint64)field->getVirtualLongField((JavaObject*)obj); + return (sint64)field->getLongField(Obj); default: JavaThread::get()->isolate->illegalArgumentException(""); } @@ -117,17 +124,21 @@ JNIEnv *env, #endif jobject Field, jobject obj) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); const AssessorDesc* ass = field->getSignature()->funcs; - if (isStatic(field->access)) - JavaThread::get()->isolate->initialiseClass(field->classDef); + JavaObject* Obj = (JavaObject*)obj; + + if (isStatic(field->access)) { + UserClass* cl = internalGetClass(vm, field, Field); + cl->initialiseClass(vm); + Obj = cl->getStaticInstance(); + } switch (ass->numId) { case BOOL_ID : - return isStatic(field->access) ? - (uint8)field->getStaticInt8Field() : - (uint8)field->getVirtualInt8Field((JavaObject*)obj); + return (uint8)field->getInt8Field(Obj); default: JavaThread::get()->isolate->illegalArgumentException(""); } @@ -141,37 +152,31 @@ JNIEnv *env, #endif jobject Field, jobject obj) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); const AssessorDesc* ass = field->getSignature()->funcs; - if (isStatic(field->access)) - JavaThread::get()->isolate->initialiseClass(field->classDef); + JavaObject* Obj = (JavaObject*)obj; + + if (isStatic(field->access)) { + UserClass* cl = internalGetClass(vm, field, Field); + cl->initialiseClass(vm); + Obj = cl->getStaticInstance(); + } switch (ass->numId) { case BYTE_ID : - return isStatic(field->access) ? - (jfloat)field->getStaticInt8Field() : - (jfloat)field->getVirtualInt8Field((JavaObject*)obj); + return (jfloat)field->getInt8Field(Obj); case INT_ID : - return isStatic(field->access) ? - (jfloat)field->getStaticInt32Field() : - (jfloat)field->getVirtualInt32Field((JavaObject*)obj); + return (jfloat)field->getInt32Field((JavaObject*)obj); case SHORT_ID : - return isStatic(field->access) ? - (jfloat)field->getStaticInt16Field() : - (jfloat)field->getVirtualInt16Field((JavaObject*)obj); + return (jfloat)field->getInt16Field((JavaObject*)obj); case LONG_ID : - return isStatic(field->access) ? - (jfloat)field->getStaticLongField() : - (jfloat)field->getVirtualLongField((JavaObject*)obj); + return (jfloat)field->getLongField((JavaObject*)obj); case CHAR_ID : - return isStatic(field->access) ? - (jfloat)(uint32)field->getStaticInt16Field() : - (jfloat)(uint32)field->getVirtualInt16Field((JavaObject*)obj); + return (jfloat)(uint32)field->getInt16Field((JavaObject*)obj); case FLOAT_ID : - return isStatic(field->access) ? - (jfloat)field->getStaticFloatField() : - (jfloat)field->getVirtualFloatField((JavaObject*)obj); + return (jfloat)field->getFloatField((JavaObject*)obj); default: JavaThread::get()->isolate->illegalArgumentException(""); } @@ -183,17 +188,21 @@ JNIEnv *env, #endif jobject Field, jobject obj) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); const AssessorDesc* ass = field->getSignature()->funcs; - if (isStatic(field->access)) - JavaThread::get()->isolate->initialiseClass(field->classDef); + JavaObject* Obj = (JavaObject*)obj; + + if (isStatic(field->access)) { + UserClass* cl = internalGetClass(vm, field, Field); + cl->initialiseClass(vm); + Obj = cl->getStaticInstance(); + } switch (ass->numId) { case BYTE_ID : - return isStatic(field->access) ? - (sint8)field->getStaticInt8Field() : - (sint8)field->getVirtualInt8Field((JavaObject*)obj); + return (sint8)field->getInt8Field(Obj); default : JavaThread::get()->isolate->illegalArgumentException(""); } @@ -206,17 +215,21 @@ JNIEnv *env, #endif jobject Field, jobject obj) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); const AssessorDesc* ass = field->getSignature()->funcs; - if (isStatic(field->access)) - JavaThread::get()->isolate->initialiseClass(field->classDef); + JavaObject* Obj = (JavaObject*)obj; + + if (isStatic(field->access)) { + UserClass* cl = internalGetClass(vm, field, Field); + cl->initialiseClass(vm); + Obj = cl->getStaticInstance(); + } switch (ass->numId) { case CHAR_ID : - return isStatic(field->access) ? - (uint16)field->getStaticInt16Field() : - (uint16)field->getVirtualInt16Field((JavaObject*)obj); + return (uint16)field->getInt16Field((JavaObject*)obj); default : JavaThread::get()->isolate->illegalArgumentException(""); } @@ -230,21 +243,23 @@ JNIEnv *env, #endif jobject Field, jobject obj) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); const AssessorDesc* ass = field->getSignature()->funcs; - if (isStatic(field->access)) - JavaThread::get()->isolate->initialiseClass(field->classDef); + JavaObject* Obj = (JavaObject*)obj; + + if (isStatic(field->access)) { + UserClass* cl = internalGetClass(vm, field, Field); + cl->initialiseClass(vm); + Obj = cl->getStaticInstance(); + } switch (ass->numId) { case SHORT_ID : - return isStatic(field->access) ? - (sint16)field->getStaticInt16Field() : - (sint16)field->getVirtualInt16Field((JavaObject*)obj); + return (sint16)field->getInt16Field(Obj); case BYTE_ID : - return isStatic(field->access) ? - (sint16)field->getStaticInt8Field() : - (sint16)field->getVirtualInt8Field((JavaObject*)obj); + return (sint16)field->getInt8Field(Obj); default : JavaThread::get()->isolate->illegalArgumentException(""); } @@ -257,41 +272,33 @@ JNIEnv *env, #endif jobject Field, jobject obj) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); const AssessorDesc* ass = field->getSignature()->funcs; - if (isStatic(field->access)) - JavaThread::get()->isolate->initialiseClass(field->classDef); + JavaObject* Obj = (JavaObject*)obj; + + if (isStatic(field->access)) { + UserClass* cl = internalGetClass(vm, field, Field); + cl->initialiseClass(vm); + Obj = cl->getStaticInstance(); + } switch (ass->numId) { case BYTE_ID : - return isStatic(field->access) ? - (jdouble)(sint64)field->getStaticInt8Field() : - (jdouble)(sint64)field->getVirtualInt8Field((JavaObject*)obj); + return (jdouble)(sint64)field->getInt8Field(Obj); case INT_ID : - return isStatic(field->access) ? - (jdouble)(sint64)field->getStaticInt32Field() : - (jdouble)(sint64)field->getVirtualInt32Field((JavaObject*)obj); + return (jdouble)(sint64)field->getInt32Field(Obj); case SHORT_ID : - return isStatic(field->access) ? - (jdouble)(sint64)field->getStaticInt16Field() : - (jdouble)(sint64)field->getVirtualInt16Field((JavaObject*)obj); + return (jdouble)(sint64)field->getInt16Field(Obj); case LONG_ID : - return isStatic(field->access) ? - (jdouble)(sint64)field->getStaticLongField() : - (jdouble)(sint64)field->getVirtualLongField((JavaObject*)obj); + return (jdouble)(sint64)field->getLongField(Obj); case CHAR_ID : - return isStatic(field->access) ? - (jdouble)(uint64)field->getStaticInt16Field() : - (jdouble)(uint64)field->getVirtualInt16Field((JavaObject*)obj); + return (jdouble)(uint64)field->getInt16Field(Obj); case FLOAT_ID : - return isStatic(field->access) ? - (jdouble)field->getStaticFloatField() : - (jdouble)field->getVirtualFloatField((JavaObject*)obj); + return (jdouble)field->getFloatField(Obj); case DOUBLE_ID : - return isStatic(field->access) ? - (jdouble)field->getStaticDoubleField() : - (jdouble)field->getVirtualDoubleField((JavaObject*)obj); + return (jdouble)field->getDoubleField(Obj); default : JavaThread::get()->isolate->illegalArgumentException(""); } @@ -303,86 +310,75 @@ JNIEnv *env, #endif jobject Field, jobject _obj) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); Typedef* type = field->getSignature(); const AssessorDesc* ass = type->funcs; - JavaObject* obj = (JavaObject*)_obj; - Jnjvm* vm = JavaThread::get()->isolate; + + JavaObject* Obj = (JavaObject*)_obj; + + if (isStatic(field->access)) { + UserClass* cl = internalGetClass(vm, field, Field); + cl->initialiseClass(vm); + Obj = cl->getStaticInstance(); + } if (isStatic(field->access)) - JavaThread::get()->isolate->initialiseClass(field->classDef); + field->classDef->initialiseClass(vm); JavaObject* res = 0; switch (ass->numId) { case BOOL_ID : { - uint8 val = (isStatic(field->access) ? - field->getStaticInt8Field() : - field->getVirtualInt8Field(obj)); - res = Classpath::boolClass->doNew(vm); - Classpath::boolValue->setVirtualInt8Field(res, val); + uint8 val = field->getInt8Field(Obj); + res = vm->upcalls->boolClass->doNew(vm); + vm->upcalls->boolValue->setInt8Field(res, val); break; } case BYTE_ID : { - sint8 val = (isStatic(field->access) ? - field->getStaticInt8Field() : - field->getVirtualInt8Field(obj)); - res = Classpath::byteClass->doNew(vm); - Classpath::byteValue->setVirtualInt8Field(res, val); + sint8 val = field->getInt8Field(Obj); + res = vm->upcalls->byteClass->doNew(vm); + vm->upcalls->byteValue->setInt8Field(res, val); break; } case CHAR_ID : { - uint16 val = (isStatic(field->access) ? - field->getStaticInt16Field() : - field->getVirtualInt16Field(obj)); - res = Classpath::charClass->doNew(vm); - Classpath::charValue->setVirtualInt16Field(res, val); + uint16 val = field->getInt16Field(Obj); + res = vm->upcalls->charClass->doNew(vm); + vm->upcalls->charValue->setInt16Field(res, val); break; } case SHORT_ID : { - sint16 val = (isStatic(field->access) ? - field->getStaticInt16Field() : - field->getVirtualInt16Field(obj)); - res = Classpath::shortClass->doNew(vm); - Classpath::shortValue->setVirtualInt16Field(res, val); + sint16 val = field->getInt16Field(Obj); + res = vm->upcalls->shortClass->doNew(vm); + vm->upcalls->shortValue->setInt16Field(res, val); break; } case INT_ID : { - sint32 val = (isStatic(field->access) ? - field->getStaticInt32Field() : - field->getVirtualInt32Field(obj)); - res = Classpath::intClass->doNew(vm); - Classpath::intValue->setVirtualInt32Field(res, val); + sint32 val = field->getInt32Field(Obj); + res = vm->upcalls->intClass->doNew(vm); + vm->upcalls->intValue->setInt32Field(res, val); break; } case LONG_ID : { - sint64 val = (isStatic(field->access) ? - field->getStaticLongField() : - field->getVirtualLongField(obj)); - res = Classpath::longClass->doNew(vm); - Classpath::longValue->setVirtualLongField(res, val); + sint64 val = field->getLongField(Obj); + res = vm->upcalls->longClass->doNew(vm); + vm->upcalls->longValue->setLongField(res, val); break; } case FLOAT_ID : { - float val = (isStatic(field->access) ? - field->getStaticFloatField() : - field->getVirtualFloatField(obj)); - res = Classpath::floatClass->doNew(vm); - Classpath::floatValue->setVirtualFloatField(res, val); + float val = field->getFloatField(Obj); + res = vm->upcalls->floatClass->doNew(vm); + vm->upcalls->floatValue->setFloatField(res, val); break; } case DOUBLE_ID : { - double val = (isStatic(field->access) ? - field->getStaticDoubleField() : - field->getVirtualDoubleField(obj)); - res = Classpath::doubleClass->doNew(vm); - Classpath::doubleValue->setVirtualDoubleField(res, val); + double val = field->getDoubleField(Obj); + res = vm->upcalls->doubleClass->doNew(vm); + vm->upcalls->doubleValue->setDoubleField(res, val); break; } case OBJECT_ID : case ARRAY_ID : - res = (isStatic(field->access) ? - field->getStaticObjectField() : - field->getVirtualObjectField(obj)); + res = field->getObjectField(Obj); break; default: JavaThread::get()->isolate->unknownError("should not be here"); @@ -395,54 +391,42 @@ JNIEnv *env, #endif jobject Field, jobject obj, jobject val) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); void** buf = (void**)alloca(sizeof(uint64)); void* _buf = (void*)buf; NativeUtil::decapsulePrimitive(JavaThread::get()->isolate, buf, (JavaObject*)val, field->getSignature()); const AssessorDesc* ass = field->getSignature()->funcs; - if (isStatic(field->access)) - JavaThread::get()->isolate->initialiseClass(field->classDef); + JavaObject* Obj = (JavaObject*)obj; + + if (isStatic(field->access)) { + UserClass* cl = internalGetClass(vm, field, Field); + cl->initialiseClass(vm); + Obj = cl->getStaticInstance(); + } switch (ass->numId) { case BOOL_ID : - return isStatic(field->access) ? - field->setStaticInt8Field(((uint8*)_buf)[0]) : - field->setVirtualInt8Field((JavaObject*)obj, ((uint8*)_buf)[0]); + return field->setInt8Field(Obj, ((uint8*)_buf)[0]); case BYTE_ID : - return isStatic(field->access) ? - field->setStaticInt8Field(((sint8*)_buf)[0]) : - field->setVirtualInt8Field((JavaObject*)obj, ((sint8*)_buf)[0]); + return field->setInt8Field(Obj, ((sint8*)_buf)[0]); case CHAR_ID : - return isStatic(field->access) ? - field->setStaticInt16Field(((uint16*)_buf)[0]) : - field->setVirtualInt16Field((JavaObject*)obj, ((uint16*)_buf)[0]); + return field->setInt16Field(Obj, ((uint16*)_buf)[0]); case SHORT_ID : - return isStatic(field->access) ? - field->setStaticInt16Field(((sint16*)_buf)[0]) : - field->setVirtualInt16Field((JavaObject*)obj, ((sint16*)_buf)[0]); + return field->setInt16Field(Obj, ((sint16*)_buf)[0]); case INT_ID : - return isStatic(field->access) ? - field->setStaticInt32Field(((sint32*)_buf)[0]) : - field->setVirtualInt32Field((JavaObject*)obj, ((sint32*)_buf)[0]); + return field->setInt32Field(Obj, ((sint32*)_buf)[0]); case LONG_ID : - return isStatic(field->access) ? - field->setStaticLongField(((sint64*)_buf)[0]) : - field->setVirtualLongField((JavaObject*)obj, ((sint64*)_buf)[0]); + return field->setLongField(Obj, ((sint64*)_buf)[0]); case FLOAT_ID : - return isStatic(field->access) ? - field->setStaticFloatField(((float*)_buf)[0]) : - field->setVirtualFloatField((JavaObject*)obj, ((float*)_buf)[0]); + return field->setFloatField(Obj, ((float*)_buf)[0]); case DOUBLE_ID : - return isStatic(field->access) ? - field->setStaticDoubleField(((double*)_buf)[0]) : - field->setVirtualDoubleField((JavaObject*)obj, ((double*)_buf)[0]); + return field->setDoubleField(Obj, ((double*)_buf)[0]); case ARRAY_ID : case OBJECT_ID : - return isStatic(field->access) ? - field->setStaticObjectField(((JavaObject**)_buf)[0]) : - field->setVirtualObjectField((JavaObject*)obj, ((JavaObject**)_buf)[0]); + return field->setObjectField(Obj, ((JavaObject**)_buf)[0]); default : JavaThread::get()->isolate->unknownError("should not be here"); } @@ -453,17 +437,20 @@ JNIEnv *env, #endif jobject Field, jobject obj, jboolean val) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); - const AssessorDesc* ass = field->getSignature()->funcs; - - if (isStatic(field->access)) - JavaThread::get()->isolate->initialiseClass(field->classDef); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); + const AssessorDesc* ass = field->getSignature()->funcs; + JavaObject* Obj = (JavaObject*)obj; + + if (isStatic(field->access)) { + UserClass* cl = internalGetClass(vm, field, Field); + cl->initialiseClass(vm); + Obj = cl->getStaticInstance(); + } switch (ass->numId) { case BOOL_ID : - return isStatic(field->access) ? - field->setStaticInt8Field((uint8)val) : - field->setVirtualInt8Field((JavaObject*)obj, (uint8)val); + return field->setInt8Field(Obj, (uint8)val); default : JavaThread::get()->isolate->illegalArgumentException(""); } @@ -474,39 +461,31 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject _obj, jbyte val) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); +jobject Field, jobject obj, jbyte val) { + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); const AssessorDesc* ass = field->getSignature()->funcs; - JavaObject* obj = (JavaObject*)_obj; + JavaObject* Obj = (JavaObject*)obj; - if (isStatic(field->access)) - JavaThread::get()->isolate->initialiseClass(field->classDef); + if (isStatic(field->access)) { + UserClass* cl = internalGetClass(vm, field, Field); + cl->initialiseClass(vm); + Obj = cl->getStaticInstance(); + } switch (ass->numId) { case BYTE_ID : - return isStatic(field->access) ? - field->setStaticInt8Field((sint8)val) : - field->setVirtualInt8Field((JavaObject*)obj, (sint8)val); + return field->setInt8Field(Obj, (sint8)val); case SHORT_ID : - return isStatic(field->access) ? - field->setStaticInt16Field((sint16)val) : - field->setVirtualInt16Field((JavaObject*)obj, (sint16)val); + return field->setInt16Field(Obj, (sint16)val); case INT_ID : - return isStatic(field->access) ? - field->setStaticInt32Field((sint32)val) : - field->setVirtualInt32Field((JavaObject*)obj, (sint32)val); + return field->setInt32Field(Obj, (sint32)val); case LONG_ID : - return isStatic(field->access) ? - field->setStaticLongField((sint64)val) : - field->setVirtualLongField((JavaObject*)obj, (sint64)val); + return field->setLongField(Obj, (sint64)val); case FLOAT_ID : - return isStatic(field->access) ? - field->setStaticFloatField((float)val) : - field->setVirtualFloatField((JavaObject*)obj, (float)val); + return field->setFloatField(Obj, (float)val); case DOUBLE_ID : - return isStatic(field->access) ? - field->setStaticDoubleField((double)val) : - field->setVirtualDoubleField((JavaObject*)obj, (double)val); + return field->setDoubleField(Obj, (double)val); default : JavaThread::get()->isolate->illegalArgumentException(""); } @@ -517,33 +496,29 @@ JNIEnv *env, #endif jobject Field, jobject obj, jchar val) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); const AssessorDesc* ass = field->getSignature()->funcs; - if (isStatic(field->access)) - JavaThread::get()->isolate->initialiseClass(field->classDef); + JavaObject* Obj = (JavaObject*)obj; + + if (isStatic(field->access)) { + UserClass* cl = internalGetClass(vm, field, Field); + cl->initialiseClass(vm); + Obj = cl->getStaticInstance(); + } switch (ass->numId) { case CHAR_ID : - return isStatic(field->access) ? - field->setStaticInt16Field((uint16)val) : - field->setVirtualDoubleField((JavaObject*)obj, (uint16)val); + return field->setInt16Field(Obj, (uint16)val); case INT_ID : - return isStatic(field->access) ? - field->setStaticInt32Field((uint32)val) : - field->setVirtualInt32Field((JavaObject*)obj, (uint32)val); + return field->setInt32Field(Obj, (uint32)val); case LONG_ID : - return isStatic(field->access) ? - field->setStaticLongField((uint64)val) : - field->setVirtualLongField((JavaObject*)obj, (uint64)val); + return field->setLongField(Obj, (uint64)val); case FLOAT_ID : - return isStatic(field->access) ? - field->setStaticFloatField((float)(uint32)val) : - field->setVirtualFloatField((JavaObject*)obj, (float)(uint32)val); + return field->setFloatField(Obj, (float)(uint32)val); case DOUBLE_ID : - return isStatic(field->access) ? - field->setStaticDoubleField((double)(uint64)val) : - field->setVirtualDoubleField((JavaObject*)obj, (double)(uint64)val); + return field->setDoubleField(Obj, (double)(uint64)val); default : JavaThread::get()->isolate->illegalArgumentException(""); } @@ -554,33 +529,29 @@ JNIEnv *env, #endif jobject Field, jobject obj, jshort val) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); const AssessorDesc* ass = field->getSignature()->funcs; - if (isStatic(field->access)) - JavaThread::get()->isolate->initialiseClass(field->classDef); + JavaObject* Obj = (JavaObject*)obj; + + if (isStatic(field->access)) { + UserClass* cl = internalGetClass(vm, field, Field); + cl->initialiseClass(vm); + Obj = cl->getStaticInstance(); + } switch (ass->numId) { case SHORT_ID : - return isStatic(field->access) ? - field->setStaticInt16Field((sint16)val) : - field->setVirtualInt16Field((JavaObject*)obj, (sint16)val); + return field->setInt16Field(Obj, (sint16)val); case INT_ID : - return isStatic(field->access) ? - field->setStaticInt32Field((sint32)val) : - field->setVirtualInt32Field((JavaObject*)obj, (sint32)val); + return field->setInt32Field(Obj, (sint32)val); case LONG_ID : - return isStatic(field->access) ? - field->setStaticLongField((sint64)val) : - field->setVirtualLongField((JavaObject*)obj, (sint64)val); + return field->setLongField(Obj, (sint64)val); case FLOAT_ID : - return isStatic(field->access) ? - field->setStaticFloatField((float)val) : - field->setVirtualFloatField((JavaObject*)obj, (float)val); + return field->setFloatField(Obj, (float)val); case DOUBLE_ID : - return isStatic(field->access) ? - field->setStaticDoubleField((double)val) : - field->setVirtualDoubleField((JavaObject*)obj, (double)val); + return field->setDoubleField(Obj, (double)val); default : JavaThread::get()->isolate->illegalArgumentException(""); } @@ -591,29 +562,26 @@ JNIEnv *env, #endif jobject Field, jobject obj, jint val) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); const AssessorDesc* ass = field->getSignature()->funcs; + JavaObject* Obj = (JavaObject*)obj; - if (isStatic(field->access)) - JavaThread::get()->isolate->initialiseClass(field->classDef); + if (isStatic(field->access)) { + UserClass* cl = internalGetClass(vm, field, Field); + cl->initialiseClass(vm); + Obj = cl->getStaticInstance(); + } switch (ass->numId) { case INT_ID : - return isStatic(field->access) ? - field->setStaticInt32Field((sint32)val) : - field->setVirtualInt32Field((JavaObject*)obj, (sint32)val); + return field->setInt32Field(Obj, (sint32)val); case LONG_ID : - return isStatic(field->access) ? - field->setStaticLongField((sint64)val) : - field->setVirtualLongField((JavaObject*)obj, (sint64)val); + return field->setLongField(Obj, (sint64)val); case FLOAT_ID : - return isStatic(field->access) ? - field->setStaticFloatField((float)val) : - field->setVirtualFloatField((JavaObject*)obj, (float)val); + return field->setFloatField(Obj, (float)val); case DOUBLE_ID : - return isStatic(field->access) ? - field->setStaticDoubleField((double)val) : - field->setVirtualDoubleField((JavaObject*)obj, (double)val); + return field->setDoubleField(Obj, (double)val); default : JavaThread::get()->isolate->illegalArgumentException(""); } @@ -624,25 +592,24 @@ JNIEnv *env, #endif jobject Field, jobject obj, jlong val) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); const AssessorDesc* ass = field->getSignature()->funcs; + JavaObject* Obj = (JavaObject*)obj; - if (isStatic(field->access)) - JavaThread::get()->isolate->initialiseClass(field->classDef); - + if (isStatic(field->access)) { + UserClass* cl = internalGetClass(vm, field, Field); + cl->initialiseClass(vm); + Obj = cl->getStaticInstance(); + } + switch (ass->numId) { case LONG_ID : - return isStatic(field->access) ? - field->setStaticLongField((sint64)val) : - field->setVirtualLongField((JavaObject*)obj, (sint64)val); + return field->setLongField(Obj, (sint64)val); case FLOAT_ID : - return isStatic(field->access) ? - field->setStaticFloatField((float)val) : - field->setVirtualFloatField((JavaObject*)obj, (float)val); + return field->setFloatField(Obj, (float)val); case DOUBLE_ID : - return isStatic(field->access) ? - field->setStaticDoubleField((double)val) : - field->setVirtualDoubleField((JavaObject*)obj, (double)val); + return field->setDoubleField(Obj, (double)val); default : JavaThread::get()->isolate->illegalArgumentException(""); } @@ -653,21 +620,22 @@ JNIEnv *env, #endif jobject Field, jobject obj, jfloat val) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); const AssessorDesc* ass = field->getSignature()->funcs; + JavaObject* Obj = (JavaObject*)obj; - if (isStatic(field->access)) - JavaThread::get()->isolate->initialiseClass(field->classDef); + if (isStatic(field->access)) { + UserClass* cl = internalGetClass(vm, field, Field); + cl->initialiseClass(vm); + Obj = cl->getStaticInstance(); + } switch (ass->numId) { case FLOAT_ID : - return isStatic(field->access) ? - field->setStaticFloatField((float)val) : - field->setVirtualFloatField((JavaObject*)obj, (float)val); + return field->setFloatField(Obj, (float)val); case DOUBLE_ID : - return isStatic(field->access) ? - field->setStaticDoubleField((double)val) : - field->setVirtualDoubleField((JavaObject*)obj, (double)val); + return field->setDoubleField(Obj, (double)val); default : JavaThread::get()->isolate->illegalArgumentException(""); } @@ -678,17 +646,20 @@ JNIEnv *env, #endif jobject Field, jobject obj, jdouble val) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); const AssessorDesc* ass = field->getSignature()->funcs; - - if (isStatic(field->access)) - JavaThread::get()->isolate->initialiseClass(field->classDef); + JavaObject* Obj = (JavaObject*)obj; + + if (isStatic(field->access)) { + UserClass* cl = internalGetClass(vm, field, Field); + cl->initialiseClass(vm); + Obj = cl->getStaticInstance(); + } switch (ass->numId) { case DOUBLE_ID : - return isStatic(field->access) ? - field->setStaticDoubleField((double)val) : - field->setVirtualDoubleField((JavaObject*)obj, (double)val); + return field->setDoubleField(Obj, (double)val); default : JavaThread::get()->isolate->illegalArgumentException(""); } @@ -700,7 +671,8 @@ #endif JavaObject* Unsafe, JavaObject* Field) { - JavaField* field = (JavaField*)Classpath::fieldSlot->getVirtualInt32Field((JavaObject*)Field); + Jnjvm* vm = JavaThread::get()->isolate; + JavaField* field = (JavaField*)vm->upcalls->fieldSlot->getInt32Field((JavaObject*)Field); return (jlong)field->ptrOffset; } Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMObject.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMObject.cpp.inc?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMObject.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMObject.cpp.inc Tue Aug 26 04:30:54 2008 @@ -31,13 +31,13 @@ jobject _src) { JavaObject* src = (JavaObject*)_src; - CommonClass* cl = src->classOf; + UserCommonClass* cl = src->classOf; uint64 size = 0; - if (cl->isArray) { + if (cl->isArray()) { size = sizeof(JavaArray) + ((JavaArray*)src)->size * - ((ClassArray*)cl)->baseClass()->virtualSize; + ((UserClassArray*)cl)->baseClass()->getVirtualSize(); } else { - size = cl->virtualSize; + size = cl->getVirtualSize(); } JavaObject* res = (JavaObject*) JavaThread::get()->isolate->allocator.allocateObject(size, src->getVirtualTable()); @@ -52,8 +52,10 @@ jclass clazz, #endif jobject _obj) { + JavaObject* obj = (JavaObject*)_obj; - return (jobject)(obj->classOf->getClassDelegatee()); + Jnjvm* vm = JavaThread::get()->isolate; + return (jobject)(obj->classOf->getClassDelegatee(vm)); } JNIEXPORT void JNICALL Java_java_lang_VMObject_notifyAll( Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc Tue Aug 26 04:30:54 2008 @@ -28,33 +28,33 @@ extern "C" { -ArrayObject* recGetClassContext(int** stack, uint32 size, uint32 first, uint32 rec) { +ArrayObject* recGetClassContext(Jnjvm* vm, int** stack, uint32 size, uint32 first, uint32 rec) { if (size != first) { JavaMethod* meth = JavaJIT::IPToJavaMethod(stack[first]); if (meth) { - ArrayObject* res = recGetClassContext(stack, size, first + 1, rec + 1); - res->elements[rec] = meth->classDef->getClassDelegatee(); + ArrayObject* res = recGetClassContext(vm, stack, size, first + 1, rec + 1); + res->elements[rec] = meth->classDef->getClassDelegatee(vm); return res; } else { - return recGetClassContext(stack, size, first + 1, rec); + return recGetClassContext(vm, stack, size, first + 1, rec); } } else { - Jnjvm* vm = JavaThread::get()->isolate; - return ArrayObject::acons(rec, Classpath::classArrayClass, &(vm->allocator)); + return ArrayObject::acons(rec, vm->upcalls->classArrayClass, &(vm->allocator)); } } - +#ifndef MULTIPLE_VM JNIEXPORT jobject JNICALL Java_gnu_classpath_VMStackWalker_getClassContext( #ifdef NATIVE_JNI JNIEnv *env, jclass clazz, #endif ) { + Jnjvm* vm = JavaThread::get()->isolate; int* ips[100]; int real_size = mvm::jit::getBacktrace((void**)(void*)ips, 100); int i = 0; int first = 0; - CommonClass* cl = Classpath::vmStackWalker; + UserCommonClass* cl = vm->upcalls->vmStackWalker; while (i < real_size) { JavaMethod* meth = JavaJIT::IPToJavaMethod(ips[i++]); @@ -64,7 +64,7 @@ } } - return (jobject)recGetClassContext(ips, real_size, first, 0); + return (jobject)recGetClassContext(vm, ips, real_size, first, 0); } JNIEXPORT jobject JNICALL Java_gnu_classpath_VMStackWalker_getClassLoader( @@ -73,14 +73,16 @@ jclass clazz, #endif jclass _Cl) { + Jnjvm* vm = JavaThread::get()->isolate; JavaObject* Cl = (JavaObject*)_Cl; - CommonClass* cl = (CommonClass*)Classpath::vmdataClass->getVirtualObjectField(Cl); + UserCommonClass* cl = (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField(Cl); return (jobject)cl->classLoader->getJavaClassLoader(); } +#endif extern "C" JavaObject* getCallingClass() { - Class* cl = JavaJIT::getCallingClass(); - if (cl) return cl->getClassDelegatee(); + UserClass* cl = JavaJIT::getCallingClass(); + if (cl) return cl->getClassDelegatee(JavaThread::get()->isolate); return 0; } Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystem.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystem.cpp.inc?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystem.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystem.cpp.inc Tue Aug 26 04:30:54 2008 @@ -40,17 +40,17 @@ verifyNull(src); verifyNull(dst); - if (!(src->classOf->isArray && dst->classOf->isArray)) { + if (!(src->classOf->isArray() && dst->classOf->isArray())) { vm->arrayStoreException(); } - ClassArray* ts = (ClassArray*)src->classOf; - ClassArray* td = (ClassArray*)dst->classOf; - CommonClass* dstType = td->baseClass(); + UserClassArray* ts = (UserClassArray*)src->classOf; + UserClassArray* td = (UserClassArray*)dst->classOf; + UserCommonClass* dstType = td->baseClass(); AssessorDesc* dstFuncs = td->funcs(); AssessorDesc* srcFuncs = ts->funcs(); - CommonClass* srcPrim = srcFuncs->classType; - CommonClass* dstPrim = dstFuncs->classType; + UserCommonClass* srcPrim = vm->getPrimitiveClass(srcFuncs); + UserCommonClass* dstPrim = vm->getPrimitiveClass(dstFuncs); if (len > src->size) { vm->indexOutOfBounds(src, len); Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc Tue Aug 26 04:30:54 2008 @@ -28,8 +28,8 @@ static void setProperty(Jnjvm* vm, JavaObject* prop, const char* key, const char* val) { - Classpath::setProperty->invokeIntSpecial(vm, prop, vm->asciizToStr(key), - vm->asciizToStr(val)); + vm->upcalls->setProperty->invokeIntSpecial(vm, prop, vm->asciizToStr(key), + vm->asciizToStr(val)); } static void setUnameProp(Jnjvm* vm, JavaObject* prop) { Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc Tue Aug 26 04:30:54 2008 @@ -56,11 +56,11 @@ #else Collector::inject_my_thread(&argc); #endif - CommonClass* vmthClass = vmThread->classOf; - JavaObject* thread = Classpath::assocThread->getVirtualObjectField(vmThread); + UserCommonClass* vmthClass = vmThread->classOf; Jnjvm* isolate = intern->isolate; + JavaObject* thread = isolate->upcalls->assocThread->getObjectField(vmThread); ThreadSystem* ts = isolate->threadSystem; - bool isDaemon = Classpath::daemon->getVirtualInt8Field(thread); + bool isDaemon = isolate->upcalls->daemon->getInt8Field(thread); intern->threadID = (mvm::Thread::self() << 8) & 0x7FFFFF00; @@ -107,14 +107,14 @@ JNIEnv *env, #endif jobject _vmThread, sint64 stackSize) { + Jnjvm* vm = JavaThread::get()->isolate; JavaObject* vmThread = (JavaObject*)_vmThread; - JavaObject* javaThread = Classpath::assocThread->getVirtualObjectField(vmThread); + JavaObject* javaThread = vm->upcalls->assocThread->getObjectField(vmThread); assert(javaThread); - Jnjvm* vm = JavaThread::get()->isolate; JavaThread* th = allocator_new(vm->allocator, JavaThread)(); th->initialise(javaThread, vm); - Classpath::vmdataVMThread->setVirtualObjectField(vmThread, (JavaObject*)th); + vm->upcalls->vmdataVMThread->setObjectField(vmThread, (JavaObject*)th); int tid = 0; arg_thread_t* arg = (arg_thread_t*)malloc(sizeof(arg_thread_t)); arg->intern = th; @@ -131,12 +131,13 @@ JNIEnv *env, #endif jobject _vmthread) { + Jnjvm* vm = JavaThread::get()->isolate; JavaObject* vmthread = (JavaObject*)_vmthread; - while (Classpath::vmdataVMThread->getVirtualObjectField(vmthread) == 0) + while (vm->upcalls->vmdataVMThread->getObjectField(vmthread) == 0) mvm::Thread::yield(); - JavaThread* th = (JavaThread*)Classpath::vmdataVMThread->getVirtualObjectField(vmthread); + JavaThread* th = (JavaThread*)vm->upcalls->vmdataVMThread->getObjectField(vmthread); th->lock->lock(); th->interruptFlag = 1; @@ -166,8 +167,9 @@ JNIEnv *env, #endif jobject _vmthread) { + Jnjvm* vm = JavaThread::get()->isolate; JavaObject* vmthread = (JavaObject*)_vmthread; - JavaThread* th = (JavaThread*)Classpath::vmdataVMThread->getVirtualObjectField(vmthread); + JavaThread* th = (JavaThread*)vm->upcalls->vmdataVMThread->getObjectField(vmthread); return (jboolean)th->interruptFlag; } Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc Tue Aug 26 04:30:54 2008 @@ -37,16 +37,17 @@ jclass clazz, #endif jobject throwable) { - //int** fp = (int**)__builtin_frame_address(0); Jnjvm* vm = JavaThread::get()->isolate; int** stack = (int**)malloc(sizeof(int*) * 100); int real_size = mvm::jit::getBacktrace((void**)stack, 100); stack[real_size] = 0; - JavaObject* vmThrowable = Classpath::newVMThrowable->doNew(vm); - ((JavaObject**)((uint64)vmThrowable + Classpath::vmDataVMThrowable->ptrOffset))[0] = (JavaObject*)stack; + JavaObject* vmThrowable = vm->upcalls->newVMThrowable->doNew(vm); + ((JavaObject**)((uint64)vmThrowable + vm->upcalls->vmDataVMThrowable->ptrOffset))[0] = (JavaObject*)stack; return (jobject)vmThrowable; } + +#ifndef MULTIPLE_VM JavaObject* consStackElement(JavaMethod* meth, int* ip) { Jnjvm* vm = JavaThread::get()->isolate; JavaObject* methodName = vm->UTF8ToStr(meth->name); @@ -64,8 +65,8 @@ bool native = isNative(meth->access); - JavaObject* res = Classpath::newStackTraceElement->doNew(vm); - Classpath::initStackTraceElement->invokeIntSpecial(vm, res, sourceName, + JavaObject* res = vm->upcalls->newStackTraceElement->doNew(vm); + vm->upcalls->initStackTraceElement->invokeIntSpecial(vm, res, sourceName, (uint32)ip, className, methodName, native); return res; @@ -83,7 +84,7 @@ return recGetStackTrace(stack, first + 1, rec); } } else { - return ArrayObject::acons(rec, Classpath::stackTraceArray, &(vm->allocator)); + return ArrayObject::acons(rec, vm->upcalls->stackTraceArray, &(vm->allocator)); } } @@ -92,13 +93,14 @@ JNIEnv *env, #endif jobject vmthrow, jobject throwable) { - int** stack = (int**)Classpath::vmDataVMThrowable->getVirtualObjectField((JavaObject*)vmthrow); + Jnjvm* vm = JavaThread::get()->isolate; + int** stack = (int**)vm->upcalls->vmDataVMThrowable->getObjectField((JavaObject*)vmthrow); uint32 first = 0; sint32 i = 0; while (stack[i] != 0) { JavaMethod* meth = JavaJIT::IPToJavaMethod(stack[i++]); - if (meth && !meth->classDef->subclassOf(Classpath::newThrowable)) { + if (meth && !meth->classDef->subclassOf(vm->upcalls->newThrowable)) { first = i - 1; break; } @@ -108,4 +110,6 @@ return res; } +#endif } + Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/Makefile?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/Makefile (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/Makefile Tue Aug 26 04:30:54 2008 @@ -9,6 +9,12 @@ LEVEL = ../../.. LIBRARYNAME = Classpath + +include $(LEVEL)/Makefile.config include $(LEVEL)/Makefile.common CXX.Flags += -I../VMCore $(CLASSPATH_FLAGS) + +ifeq ($(ISOLATE_BUILD), 1) + CXX.Flags += -I../Isolate +endif Added: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp?rev=55368&view=auto ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp (added) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp Tue Aug 26 04:30:54 2008 @@ -0,0 +1,49 @@ +//===--- IsolateCommonClass.cpp - User visible classes with isolates -------===// +// +// JnJVM +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "IsolateCommonClass.h" +#include "IsolateSharedLoader.h" +#include "JavaAllocator.h" +#include "JavaClass.h" + +using namespace jnjvm; + +UserClass::UserClass(JnjvmClassLoader* JCL, const UTF8* name, + ArrayUInt8* bytes) { + Class* cl = JnjvmSharedLoader::sharedLoader->constructSharedClass(name, bytes); + if (!cl) { + cl = allocator_new(JCL->allocator, Class)(JCL, name, bytes); + } + + classDef = cl; + classLoader = JCL; + delegatee = 0; + staticInstance = 0; +} + +UserClassArray::UserClassArray(JnjvmClassLoader* JCL, const UTF8* name) { + ClassArray* cl = JnjvmSharedLoader::sharedLoader->constructSharedClassArray(name); + if (!cl) { + cl = allocator_new(JCL->allocator, ClassArray)(JCL, name); + } + classDef = cl; + classLoader = JCL; + delegatee = 0; + baseClass = 0; +} + +UserClassPrimitive::UserClassPrimitive(JnjvmClassLoader* JCL, const UTF8* name) { + ClassPrimitive* cl = JnjvmSharedLoader::sharedLoader->constructSharedClassPrimitive(name); + if (!cl) { + cl = new ClassPrimitive(JCL, name); + } + classDef = cl; + classLoader = JCL; + delegatee = 0; +} Added: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h?rev=55368&view=auto ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h (added) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h Tue Aug 26 04:30:54 2008 @@ -0,0 +1,115 @@ +//===---- IsolateCommonClass.h - User visible classes with isolates -------===// +// +// JnJVM +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef ISOLATE_COMMON_CLASS_H +#define ISOLATE_COMMON_CLASS_H + +#include "mvm/Object.h" + +namespace jnjvm { + +class ArrayUInt8; +class AssessorDesc; +class CommonClass; +class Class; +class ClassArray; +class ClassPrimitive; +class JavaField; +class JavaMethod; +class JavaObject; +class Jnjvm; +class JnjvmClassLoader; +class UserClass; +class UTF8; + +class UserCommonClass : public mvm::Object { +public: + CommonClass* classDef; + JnjvmClassLoader* classLoader; + JavaObject* delegatee; + uint8 status; + + virtual void TRACER; + + bool isOfTypeName(const UTF8* name); + bool isAssignableFrom(UserCommonClass* cl); + + /// subclassOf - If this class is a regular class, is it a subclass of the + /// given class? + /// + bool subclassOf(UserCommonClass* cl); + + bool isArray(); + bool isPrimitive(); + bool isInterface(); + uint8 getAccess(); + const UTF8* getName(); + + void getDeclaredConstructors(std::vector& res, bool publicOnly); + void getDeclaredFields(std::vector& res, bool publicOnly); + void getDeclaredMethods(std::vector& res, bool publicOnly); + + void initialiseClass(Jnjvm* vm); + JavaObject* getClassDelegatee(Jnjvm* vm, JavaObject* pd = 0); + + void resolveClass(); + UserClass* getSuper(); + + std::vector* getInterfaces(); + + JavaMethod* lookupMethodDontThrow(const UTF8* name, const UTF8* type, + bool isStatic, bool recurse); + JavaMethod* lookupMethod(const UTF8* name, const UTF8* type, + bool isStatic, bool recurse); + + uint64 getVirtualSize(); +}; + +class UserClass : public UserCommonClass { +public: + static VirtualTable* VT; + JavaObject* staticInstance; + + virtual void TRACER; + + UserClass(JnjvmClassLoader* JCL, const UTF8* name, ArrayUInt8* bytes); + + JavaObject* doNew(Jnjvm* vm); + + std::vector* getInnerClasses(); + UserClass* getOuterClass(); + void resolveInnerOuterClasses(); + JavaObject* getStaticInstance(); + +}; + +class UserClassArray : public UserCommonClass { +public: + static VirtualTable* VT; + UserCommonClass* _baseClass; + + virtual void TRACER; + UserClassArray(JnjvmClassLoader* JCL, const UTF8* name); + + UserCommonClass* baseClass(); + + AssessorDesc* funcs(); +}; + +class UserClassPrimitive : public UserCommonClass { + static VirtualTable* VT; +public: + + virtual void TRACER; + UserClassPrimitive(JnjvmClassLoader* JCL, const UTF8* name); +}; + +} // end namespace jnjvm + +#endif // JNJVM_CLASS_ISOLATE_H Added: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.cpp?rev=55368&view=auto ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.cpp (added) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.cpp Tue Aug 26 04:30:54 2008 @@ -0,0 +1,82 @@ +//===---- IsolateSharedLoader.cpp - Shared loader for isolates ------------===// +// +// JnJVM +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "IsolateSharedLoader.h" +#include "JavaAllocator.h" +#include "JavaClass.h" +#include "JnjvmClassLoader.h" +#include "JnjvmModule.h" +#include "JnjvmModuleProvider.h" +#include "LockedMap.h" + +using namespace jnjvm; + +JnjvmSharedLoader* JnjvmSharedLoader::createSharedLoader() { + + JnjvmSharedLoader* JCL = gc_new(JnjvmSharedLoader)(); + JCL->TheModule = new JnjvmModule("Bootstrap JnJVM"); + JCL->TheModuleProvider = new JnjvmModuleProvider(JCL->TheModule); + + JCL->allocator = new JavaAllocator(); + + JCL->hashUTF8 = new UTF8Map(JCL->allocator, 0); + JCL->classes = allocator_new(allocator, ClassMap)(); + JCL->nameClasses = allocator_new(allocator, SharedClassNameMap)(); + JCL->byteClasses = allocator_new(allocator, SharedClassByteMap)(); + JCL->javaTypes = new TypeMap(); + JCL->javaSignatures = new SignMap(); + + return JCL; +} + +Class* JnjvmSharedLoader::constructSharedClass(const UTF8* name, + ArrayUInt8* bytes) { + byteClasses->lock->lock(); + SharedClassByteMap::iterator End = byteClasses->map.end(); + SharedClassByteMap::iterator I = byteClasses->map.find(bytes); + Class* res = 0; + if (I == End) { + res = allocator_new(allocator, Class)(this, name, bytes); + byteClasses->map.insert(std::make_pair(bytes, res)); + } else { + res = ((Class*)(I->second)); + } + byteClasses->lock->unlock(); + return res; +} + +ClassArray* JnjvmSharedLoader::constructSharedClassArray(const UTF8* name) { + nameClasses->lock->lock(); + SharedClassNameMap::iterator End = nameClasses->map.end(); + SharedClassNameMap::iterator I = nameClasses->map.find(name); + ClassArray* res = 0; + if (I == End) { + res = allocator_new(allocator, ClassArray)(this, name); + nameClasses->map.insert(std::make_pair(name, res)); + } else { + res = ((ClassArray*)(I->second)); + } + nameClasses->lock->unlock(); + return res; +} + +ClassPrimitive* JnjvmSharedLoader::constructSharedClassPrimitive(const UTF8* name) { + nameClasses->lock->lock(); + SharedClassNameMap::iterator End = nameClasses->map.end(); + SharedClassNameMap::iterator I = nameClasses->map.find(name); + ClassPrimitive* res = 0; + if (I == End) { + res = new ClassPrimitive(this, name); + nameClasses->map.insert(std::make_pair(name, res)); + } else { + res = ((ClassPrimitive*)(I->second)); + } + nameClasses->lock->unlock(); + return res; +} Added: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.h?rev=55368&view=auto ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.h (added) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.h Tue Aug 26 04:30:54 2008 @@ -0,0 +1,53 @@ +//===---- IsolateSharedLoader.h - Shared loader for isolates --------------===// +// +// JnJVM +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef ISOLATE_SHARED_LOADER_H +#define ISOLATE_SHARED_LOADER_H + +#include "JnjvmClassLoader.h" +#include "SharedMaps.h" + +namespace jnjvm { + +class JnjvmSharedLoader : public JnjvmClassLoader { +private: + + /// internalLoad - Load the class with the given name. + /// + virtual UserClass* internalLoad(const UTF8* utf8) { + fprintf(stderr, "Don't use me"); + exit(1); + } + + SharedClassByteMap* byteClasses; + SharedClassNameMap* nameClasses; + +public: + + /// VT - The virtual table of this class. + /// + static VirtualTable* VT; + + + /// constructSharedClass - Create a shared representation of the class. + /// If two classes have the same name but not the same array of bytes, + /// raise an exception. + /// + Class* constructSharedClass(const UTF8* name, ArrayUInt8* bytes); + ClassArray* constructSharedClassArray(const UTF8* name); + ClassPrimitive* constructSharedClassPrimitive(const UTF8* name); + + static JnjvmSharedLoader* createSharedLoader(); + + static JnjvmSharedLoader* sharedLoader; +}; + +} // end namespace jnjvm + +#endif //ISOLATE_SHARED_LOADER_H Added: vmkit/branches/isolate/lib/JnJVM/Isolate/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/Makefile?rev=55368&view=auto ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/Makefile (added) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/Makefile Tue Aug 26 04:30:54 2008 @@ -0,0 +1,14 @@ +##===- lib/JnJVM/Classpath/Makefile ------------------------*- Makefile -*-===## +# +# The vmkit project +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## +LEVEL = ../../.. + +LIBRARYNAME = Isolate +include $(LEVEL)/Makefile.common + +CXX.Flags += -I../VMCore Added: vmkit/branches/isolate/lib/JnJVM/Isolate/SharedMaps.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/SharedMaps.h?rev=55368&view=auto ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/SharedMaps.h (added) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/SharedMaps.h Tue Aug 26 04:30:54 2008 @@ -0,0 +1,58 @@ +//===------- SharedMaps.h - Maps for the shared class loader --------------===// +// +// JnJVM +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "LockedMap.h" + +using namespace jnjvm; + + +struct ltarray { + bool operator()(const ArrayUInt8* a1, const ArrayUInt8* a2) { + if (a1->size < a2->size) return true; + else if (a1->size > a2->size) return false; + else return memcmp((const char*)a1->elements, (const char*)a2->elements, + a1->size * sizeof(uint8)) < 0; + } +}; + + +class SharedClassByteMap : + public LockedMap { +public: + static VirtualTable* VT; + + SharedClassByteMap() { + lock = mvm::Lock::allocNormal(); + } + + ~SharedClassByteMap() { + delete lock; + } + + virtual void TRACER; +}; + + +class SharedClassNameMap : + public LockedMap { +public: + + static VirtualTable* VT; + + SharedClassNameMap() { + lock = mvm::Lock::allocNormal(); + } + + ~SharedClassNameMap() { + delete lock; + } + + virtual void TRACER; + +}; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaArray.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaArray.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaArray.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaArray.cpp Tue Aug 26 04:30:54 2008 @@ -34,37 +34,13 @@ const unsigned int JavaArray::T_INT = 10; const unsigned int JavaArray::T_LONG = 11; -ClassArray* JavaArray::ofByte = 0; -ClassArray* JavaArray::ofChar = 0; -ClassArray* JavaArray::ofInt = 0; -ClassArray* JavaArray::ofShort = 0; -ClassArray* JavaArray::ofBool = 0; -ClassArray* JavaArray::ofLong = 0; -ClassArray* JavaArray::ofFloat = 0; -ClassArray* JavaArray::ofDouble = 0; -ClassArray* JavaArray::ofString = 0; -ClassArray* JavaArray::ofObject = 0; - // This will force linking runtime methods extern "C" void negativeArraySizeException(sint32 val); extern "C" void outOfMemoryError(sint32 val); -#ifndef MULTIPLE_VM -#define ACONS(name, elmt, primSize, VT) \ - name *name::acons(sint32 n, ClassArray* atype, JavaAllocator* allocator) { \ - if (n < 0) \ - negativeArraySizeException(n); \ - else if (n > JavaArray::MaxArraySize) \ - outOfMemoryError(n); \ - name* res = (name*) \ - (Object*) allocator->allocateObject(sizeof(name) + n * primSize, VT); \ - res->initialise(atype); \ - res->size = n; \ - return res; \ - } -#else #define ACONS(name, elmt, primSize, VT) \ - name *name::acons(sint32 n, ClassArray* atype, JavaAllocator* allocator) { \ + name *name::acons(sint32 n, UserClassArray* atype, \ + JavaAllocator* allocator) { \ if (n < 0) \ negativeArraySizeException(n); \ else if (n > JavaArray::MaxArraySize) \ @@ -75,7 +51,6 @@ res->size = n; \ return res; \ } -#endif /// Each array class has its own element size for allocating arrays. ACONS(ArrayUInt8, uint8, 1, JavaArray::VT) @@ -160,7 +135,8 @@ free(obj); } -const UTF8* UTF8::acons(sint32 n, ClassArray* cl, JavaAllocator* allocator) { +const UTF8* UTF8::acons(sint32 n, UserClassArray* cl, + JavaAllocator* allocator) { if (n < 0) negativeArraySizeException(n); else if (n > JavaArray::MaxArraySize) Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaArray.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaArray.h?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaArray.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaArray.h Tue Aug 26 04:30:54 2008 @@ -68,18 +68,6 @@ static const unsigned int T_SHORT; static const unsigned int T_INT; static const unsigned int T_LONG; - - /// The Java class of Java arrays used in JnJVM. - static ClassArray* ofByte; - static ClassArray* ofChar; - static ClassArray* ofString; - static ClassArray* ofInt; - static ClassArray* ofShort; - static ClassArray* ofBool; - static ClassArray* ofLong; - static ClassArray* ofFloat; - static ClassArray* ofDouble; - static ClassArray* ofObject; /// tracer - The trace method of Java arrays of primitive types. Since their /// class lives throughout the lifetime of the application, there is no need @@ -92,7 +80,7 @@ #define ARRAYCLASS(name, elmt) \ class name : public TJavaArray { \ public: \ - static name* acons(sint32 n, ClassArray* cl, JavaAllocator* allocator); \ + static name* acons(sint32 n, UserClassArray* cl, JavaAllocator* allocator);\ } ARRAYCLASS(ArrayUInt8, uint8); @@ -117,7 +105,8 @@ /// acons - Allocates a Java array of objects. The class given as argument is /// the class of the array, not the class of its elements. - static ArrayObject* acons(sint32 n, ClassArray* cl, JavaAllocator* allocator); + static ArrayObject* acons(sint32 n, UserClassArray* cl, + JavaAllocator* allocator); /// tracer - The tracer method of Java arrays of objects. This method will /// trace all objects in the array. @@ -134,7 +123,8 @@ /// acons - Allocates an UTF8 in permanent memory. The class argument must be /// JavaArray::ofChar. - static const UTF8* acons(sint32 n, ClassArray* cl, JavaAllocator* allocator); + static const UTF8* acons(sint32 n, UserClassArray* cl, + JavaAllocator* allocator); /// internalToJava - Creates a copy of the UTF8 at its given offset and size /// woth all its '.' replaced by '/'. The JVM bytecode reference classes in @@ -156,7 +146,7 @@ /// equals - Returns whether two UTF8s are equals. When the JnJVM executes /// in single mode, equality is just a pointer comparison. When executing - /// in multiple mode, we compare the contents f the UTF8s. + /// in multiple mode, we compare the contents of the UTF8s. #ifndef MULTIPLE_VM bool equals(const UTF8* other) const { return this == other; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp Tue Aug 26 04:30:54 2008 @@ -212,8 +212,8 @@ this->condVar = mvm::Cond::allocCond(); this->status = loaded; this->classLoader = loader; - this->isArray = isArray; - this->isPrimitive = false; + this->array = isArray; + this->primitive = false; #ifndef MULTIPLE_VM this->delegatee = 0; #endif @@ -224,7 +224,7 @@ display = (CommonClass**)malloc(sizeof(CommonClass*)); display[0] = this; - isPrimitive = true; + primitive = true; status = ready; access = ACC_ABSTRACT | ACC_FINAL | ACC_PUBLIC; } @@ -407,7 +407,7 @@ bool CommonClass::inheritName(const UTF8* Tname) { if (name->equals(Tname)) { return true; - } else if (isPrimitive) { + } else if (isPrimitive()) { return false; } else if (super) { if (super->inheritName(Tname)) return true; @@ -422,7 +422,7 @@ bool CommonClass::isOfTypeName(const UTF8* Tname) { if (inheritName(Tname)) { return true; - } else if (isArray) { + } else if (isArray()) { CommonClass* curS = this; uint32 prof = 0; uint32 len = Tname->size; @@ -432,7 +432,7 @@ CommonClass* cl = ((ClassArray*)curS)->baseClass(); ++prof; cl->resolveClass(); - res = curS->isArray && cl && (prof < len); + res = curS->isArray() && cl && (prof < len); curS = cl; } @@ -461,11 +461,11 @@ bool CommonClass::instantiationOfArray(ClassArray* cl) { if (this == cl) return true; else { - if (isArray) { + if (isArray()) { CommonClass* baseThis = ((ClassArray*)this)->baseClass(); CommonClass* baseCl = ((ClassArray*)cl)->baseClass(); - if (isInterface(baseThis->access) && isInterface(baseCl->access)) { + if (baseThis->isInterface() && baseCl->isInterface()) { return baseThis->implements(baseCl); } else { return baseThis->isAssignableFrom(baseCl); @@ -486,9 +486,9 @@ bool CommonClass::isAssignableFrom(CommonClass* cl) { if (this == cl) { return true; - } else if (isInterface(cl->access)) { + } else if (cl->isInterface()) { return this->implements(cl); - } else if (cl->isArray) { + } else if (cl->isArray()) { return this->instantiationOfArray((ClassArray*)cl); } else { return this->subclassOf(cl); @@ -527,57 +527,6 @@ } -JavaObject* CommonClass::getClassDelegatee(JavaObject* pd) { - return JavaThread::get()->isolate->getClassDelegatee(this, pd); -} - -#ifdef MULTIPLE_VM -JavaObject* Class::staticInstance() { - std::pair* val = - JavaThread::get()->isolate->statics->lookup(this); - assert(val); - return val->second; -} - -void Class::createStaticInstance() { - JavaAllocator* allocator = &(JavaThread::get()->isolate->allocator); - JavaObject* val = - (JavaObject*)allocator->allocateObject(staticSize, staticVT); - - val->initialise(this); - for (field_iterator i = this->staticFields.begin(), - e = this->staticFields.end(); i!= e; ++i) { - - JavaField* cur = i->second; - cur->initField(val); - } - - Jnjvm* vm = JavaThread::get()->isolate; - std::pair* p = vm->statics->lookup(this); - assert(p); - assert(!p->second); - p->second = val; -} - -JavaState* CommonClass::getStatus() { - if (!this->isArray && - !this->isPrimitive) { - Class* cl = (Class*)this; - Jnjvm* vm = JavaThread::get()->isolate; - std::pair* val = vm->statics->lookup(cl); - if (!val) { - val = new std::pair(status, 0); - JavaThread::get()->isolate->statics->hash(cl, val); - } - if (val->first < status) val->first = status; - return (JavaState*)&(val->first); - } else { - return &status; - } -} -#endif - - JavaMethod* CommonClass::constructMethod(const UTF8* name, const UTF8* type, uint32 access) { method_map& map = isStatic(access) ? staticMethods : virtualMethods; @@ -735,7 +684,7 @@ release(); JavaThread::get()->isolate->unknownError("try to resolve a not-read class"); } else if (status == loaded || ownerClass()) { - if (isArray) { + if (isArray()) { ClassArray* arrayCl = (ClassArray*)this; CommonClass* baseClass = arrayCl->baseClass(); baseClass->resolveClass(); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h Tue Aug 26 04:30:54 2008 @@ -178,6 +178,10 @@ // //===----------------------------------------------------------------------===// + + uint32 getVirtualSize() { + return virtualSize; + } /// virtualTableSize - The size of the virtual table of this class. /// @@ -187,18 +191,42 @@ /// uint32 access; + uint32 getAccess() { + return access; + } + /// isArray - Is the class an array class? /// - bool isArray; + bool array; + bool isArray() { + return array; + } + /// isPrimitive - Is the class a primitive class? /// - bool isPrimitive; + bool primitive; + + bool isPrimitive() { + return primitive; + } + + bool isInterface() { + return jnjvm::isInterface(access); + } + + std::vector * getInterfaces() { + return &interfaces; + } /// name - The name of the class. /// const UTF8* name; + const UTF8* getName() { + return name; + } + /// status - The loading/resolve/initialization state of the class. /// JavaState status; @@ -206,6 +234,10 @@ /// super - The parent of this class. /// CommonClass * super; + + CommonClass* getSuper() { + return super; + } /// superUTF8 - The name of the parent of this class. /// @@ -377,29 +409,27 @@ /// getClassDelegatee - Return the java/lang/Class representation of this /// class. /// - JavaObject* getClassDelegatee(JavaObject* pd = 0); + JavaObject* getClassDelegatee(Jnjvm* vm, JavaObject* pd = 0); /// resolveClass - If the class has not been resolved yet, resolve it. /// void resolveClass(); -#ifndef MULTIPLE_VM + /// initialiseClass - If the class has not been initialized yet, + /// initialize it. + /// + void initialiseClass(Jnjvm* vm); + /// getStatus - Get the resolution/initialization status of this class. /// - JavaState* getStatus() { - return &status; + JavaState getStatus() { + return status; } /// isReady - Has this class been initialized? /// bool isReady() { return status >= inClinit; } -#else - JavaState* getStatus(); - bool isReady() { - return *getStatus() >= inClinit; - } -#endif /// isResolved - Has this class been resolved? /// @@ -432,12 +462,6 @@ return static_cast(JInfo); } -#ifdef MULTIPLE_VM - bool isSharedClass() { - return classLoader == JnjvmClassLoader::sharedLoader; - } -#endif - void getDeclaredConstructors(std::vector& res, bool publicOnly); void getDeclaredMethods(std::vector& res, bool publicOnly); void getDeclaredFields(std::vector& res, bool publicOnly); @@ -532,20 +556,11 @@ /// #ifndef MULTIPLE_VM JavaObject* _staticInstance; - JavaObject* staticInstance() { + JavaObject* getStaticInstance() { return _staticInstance; } - - /// createStaticInstance - Create the static instance of this class. This is - /// a no-op in a single environment because it is created only once when - /// creating the static type of the class. In a multiple environment, it is - /// called on each initialization of the class. - /// - void createStaticInstance() { } -#else - JavaObject* staticInstance(); - void createStaticInstance(); #endif + /// Class - Create a class in the given virtual machine and with the given /// name. @@ -893,46 +908,25 @@ /// getVritual*Field - Get a virtual field of an object. /// - #define GETVIRTUALFIELD(TYPE, TYPE_NAME) \ - TYPE getVirtual##TYPE_NAME##Field(JavaObject* obj) { \ - assert(*(classDef->getStatus()) >= inClinit); \ + #define GETFIELD(TYPE, TYPE_NAME) \ + TYPE get##TYPE_NAME##Field(JavaObject* obj) { \ + assert((classDef->getStatus()) >= inClinit); \ void* ptr = (void*)((uint64)obj + ptrOffset); \ return ((TYPE*)ptr)[0]; \ } - /// getStatic*Field - Get a static field in the defining class. + /// set*Field - Set a field of an object. /// - #define GETSTATICFIELD(TYPE, TYPE_NAME) \ - TYPE getStatic##TYPE_NAME##Field() { \ - assert(*(classDef->getStatus()) >= inClinit); \ - JavaObject* obj = classDef->staticInstance(); \ - void* ptr = (void*)((uint64)obj + ptrOffset); \ - return ((TYPE*)ptr)[0]; \ - } - - /// setVirtual*Field - Set a virtual of an object. - /// - #define SETVIRTUALFIELD(TYPE, TYPE_NAME) \ - void setVirtual##TYPE_NAME##Field(JavaObject* obj, TYPE val) { \ - assert(*(classDef->getStatus()) >= inClinit); \ - void* ptr = (void*)((uint64)obj + ptrOffset); \ - ((TYPE*)ptr)[0] = val; \ - } - - /// setStatic*Field - Set a static field in the defining class. - #define SETSTATICFIELD(TYPE, TYPE_NAME) \ - void setStatic##TYPE_NAME##Field(TYPE val) { \ - assert(*(classDef->getStatus()) >= inClinit); \ - JavaObject* obj = classDef->staticInstance(); \ + #define SETFIELD(TYPE, TYPE_NAME) \ + void set##TYPE_NAME##Field(JavaObject* obj, TYPE val) { \ + assert((classDef->getStatus()) >= inClinit); \ void* ptr = (void*)((uint64)obj + ptrOffset); \ ((TYPE*)ptr)[0] = val; \ } #define MK_ASSESSORS(TYPE, TYPE_NAME) \ - GETVIRTUALFIELD(TYPE, TYPE_NAME) \ - SETVIRTUALFIELD(TYPE, TYPE_NAME) \ - GETSTATICFIELD(TYPE, TYPE_NAME) \ - SETSTATICFIELD(TYPE, TYPE_NAME) \ + GETFIELD(TYPE, TYPE_NAME) \ + SETFIELD(TYPE, TYPE_NAME) \ MK_ASSESSORS(float, Float); MK_ASSESSORS(double, Double); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp Tue Aug 26 04:30:54 2008 @@ -459,7 +459,7 @@ } #ifndef MULTIPLE_VM else if (cl->isReady()) { - JavaObject* S = field->classDef->staticInstance(); + JavaObject* S = field->classDef->getStaticInstance(); ctpRes[index] = (void*)((uint64)S + field->ptrOffset); } #endif Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp Tue Aug 26 04:30:54 2008 @@ -45,8 +45,6 @@ INIT(JavaThread); INIT(Jnjvm); INIT(ClassMap); - INIT(StaticInstanceMap); - INIT(DelegateeMap); INIT(JnjvmBootstrapLoader); INIT(JnjvmClassLoader); #ifdef MULTIPLE_VM @@ -72,14 +70,15 @@ static void initialiseStatics() { - JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader = + JnjvmBootstrapLoader* JCL = JnjvmClassLoader::bootstrapLoader = JnjvmBootstrapLoader::createBootstrapLoader(); // Array initialization const UTF8* utf8OfChar = JCL->asciizConstructUTF8("[C"); - JavaArray::ofChar = JCL->constructArray(utf8OfChar); - ((UTF8*)utf8OfChar)->classOf = JavaArray::ofChar; - + JCL->upcalls->ArrayOfChar = JCL->constructArray(utf8OfChar); + ((UTF8*)utf8OfChar)->classOf = JCL->upcalls->ArrayOfChar; + JCL->hashUTF8->array = JCL->upcalls->ArrayOfChar; + ClassArray::InterfacesArray.push_back( JCL->loadName(JCL->asciizConstructUTF8("java/lang/Cloneable"), false, false)); @@ -92,27 +91,27 @@ JCL->loadName(JCL->asciizConstructUTF8("java/lang/Object"), false, false); - JavaArray::ofChar->interfaces = ClassArray::InterfacesArray; - JavaArray::ofChar->super = ClassArray::SuperArray; + JCL->upcalls->ArrayOfChar->interfaces = ClassArray::InterfacesArray; + JCL->upcalls->ArrayOfChar->super = ClassArray::SuperArray; - JavaArray::ofByte = JCL->constructArray(JCL->asciizConstructUTF8("[B")); - JavaArray::ofString = + JCL->upcalls->ArrayOfByte = JCL->constructArray(JCL->asciizConstructUTF8("[B")); + JCL->upcalls->ArrayOfString = JCL->constructArray(JCL->asciizConstructUTF8("[Ljava/lang/String;")); - JavaArray::ofObject = + JCL->upcalls->ArrayOfObject = JCL->constructArray(JCL->asciizConstructUTF8("[Ljava/lang/Object;")); - JavaArray::ofInt = JCL->constructArray(JCL->asciizConstructUTF8("[I")); + JCL->upcalls->ArrayOfInt = JCL->constructArray(JCL->asciizConstructUTF8("[I")); - JavaArray::ofBool = JCL->constructArray(JCL->asciizConstructUTF8("[Z")); + JCL->upcalls->ArrayOfBool = JCL->constructArray(JCL->asciizConstructUTF8("[Z")); - JavaArray::ofLong = JCL->constructArray(JCL->asciizConstructUTF8("[J")); + JCL->upcalls->ArrayOfLong = JCL->constructArray(JCL->asciizConstructUTF8("[J")); - JavaArray::ofFloat = JCL->constructArray(JCL->asciizConstructUTF8("[F")); + JCL->upcalls->ArrayOfFloat = JCL->constructArray(JCL->asciizConstructUTF8("[F")); - JavaArray::ofDouble = JCL->constructArray(JCL->asciizConstructUTF8("[D")); + JCL->upcalls->ArrayOfDouble = JCL->constructArray(JCL->asciizConstructUTF8("[D")); - JavaArray::ofShort = JCL->constructArray(JCL->asciizConstructUTF8("[S")); + JCL->upcalls->ArrayOfShort = JCL->constructArray(JCL->asciizConstructUTF8("[S")); // End array initialization @@ -170,17 +169,13 @@ #undef DEF_UTF8 + Classpath::initialiseClasspath(JCL); } -extern "C" void ClasspathBoot(); - void mvm::VirtualMachine::initialiseJVM() { if (!JnjvmClassLoader::bootstrapLoader) { initialiseVT(); - initialiseStatics(); - - ClasspathBoot(); - Classpath::initialiseClasspath(JnjvmClassLoader::bootstrapLoader); + initialiseStatics(); } } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h Tue Aug 26 04:30:54 2008 @@ -259,8 +259,8 @@ static const char* OpcodeNames[256]; - static Class* getCallingClass(); - static Class* getCallingClassWalker(); + static UserClass* getCallingClass(); + static UserClass* getCallingClassWalker(); static JavaObject* getCallingClassLoader(); static void printBacktrace(); static JavaMethod* IPToJavaMethod(void* ip); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Tue Aug 26 04:30:54 2008 @@ -2086,9 +2086,6 @@ for (sint32 v = 0; v < dim + 2; ++v) { Args.push_back(args[v]); } -#ifdef MULTIPLE_VM - Args.push_back(isolateLocal); -#endif push(invoke(JnjvmModule::MultiCallNewFunction, Args, "", currentBlock), AssessorDesc::dRef); break; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp Tue Aug 26 04:30:54 2008 @@ -32,7 +32,7 @@ CommonClass* cl = loader->loadName(loader->asciizConstructUTF8(className), true, true); - vm->initialiseClass(cl); + cl->initialiseClass(vm); bool stat = access == ACC_STATIC ? true : false; JavaMethod* method = cl->lookupMethod(loader->asciizConstructUTF8(func), loader->asciizConstructUTF8(sign), stat, @@ -94,7 +94,7 @@ TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap) { \ if (!classDef->isReady()) { \ classDef->classLoader->loadName(classDef->name, true, true); \ - vm->initialiseClass(classDef); \ + classDef->initialiseClass(vm); \ } \ verifyNull(obj); \ Signdef* sign = getSignature(); \ @@ -108,7 +108,7 @@ TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap) {\ if (!classDef->isReady()) { \ classDef->classLoader->loadName(classDef->name, true, true); \ - vm->initialiseClass(classDef); \ + classDef->initialiseClass(vm); \ } \ \ verifyNull(obj);\ @@ -123,7 +123,7 @@ TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, va_list ap) {\ if (!classDef->isReady()) { \ classDef->classLoader->loadName(classDef->name, true, true); \ - vm->initialiseClass(classDef); \ + classDef->initialiseClass(vm); \ } \ \ Signdef* sign = getSignature(); \ @@ -137,7 +137,7 @@ TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\ if (!classDef->isReady()) { \ classDef->classLoader->loadName(classDef->name, true, true); \ - vm->initialiseClass(classDef); \ + classDef->initialiseClass(vm); \ } \ \ verifyNull(obj);\ @@ -151,7 +151,7 @@ TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\ if (!classDef->isReady()) { \ classDef->classLoader->loadName(classDef->name, true, true); \ - vm->initialiseClass(classDef); \ + classDef->initialiseClass(vm); \ } \ \ verifyNull(obj);\ @@ -163,7 +163,7 @@ TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, void* buf) {\ if (!classDef->isReady()) { \ classDef->classLoader->loadName(classDef->name, true, true); \ - vm->initialiseClass(classDef); \ + classDef->initialiseClass(vm); \ } \ \ void* func = this->compiledPtr();\ @@ -202,7 +202,7 @@ TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap) { \ if (!classDef->isReady()) { \ classDef->classLoader->loadName(classDef->name, true, true); \ - vm->initialiseClass(classDef); \ + classDef->initialiseClass(vm); \ } \ \ verifyNull(obj); \ @@ -214,7 +214,7 @@ TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap) {\ if (!classDef->isReady()) { \ classDef->classLoader->loadName(classDef->name, true, true); \ - vm->initialiseClass(classDef); \ + classDef->initialiseClass(vm); \ } \ \ verifyNull(obj);\ @@ -226,7 +226,7 @@ TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, va_list ap) {\ if (!classDef->isReady()) { \ classDef->classLoader->loadName(classDef->name, true, true); \ - vm->initialiseClass(classDef); \ + classDef->initialiseClass(vm); \ } \ \ void* func = this->compiledPtr();\ @@ -237,7 +237,7 @@ TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\ if (!classDef->isReady()) { \ classDef->classLoader->loadName(classDef->name, true, true); \ - vm->initialiseClass(classDef); \ + classDef->initialiseClass(vm); \ } \ \ verifyNull(obj);\ @@ -249,7 +249,7 @@ TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\ if (!classDef->isReady()) { \ classDef->classLoader->loadName(classDef->name, true, true); \ - vm->initialiseClass(classDef); \ + classDef->initialiseClass(vm); \ } \ \ verifyNull(obj);\ @@ -261,7 +261,7 @@ TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, void* buf) {\ if (!classDef->isReady()) { \ classDef->classLoader->loadName(classDef->name, true, true); \ - vm->initialiseClass(classDef); \ + classDef->initialiseClass(vm); \ } \ \ void* func = this->compiledPtr();\ Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaObject.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaObject.h?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaObject.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaObject.h Tue Aug 26 04:30:54 2008 @@ -129,7 +129,7 @@ /// classOf - The class of this object. /// - CommonClass* classOf; + UserCommonClass* classOf; /// lock - The monitor of this object. Most of the time null. /// @@ -156,7 +156,7 @@ /// initialise - Initialises the object. /// - void initialise(CommonClass* cl) { + void initialise(UserCommonClass* cl) { this->classOf = cl; this->lock = 0; } @@ -170,7 +170,7 @@ /// instanceOf - Is this object's class of type the given class? /// - bool instanceOf(CommonClass* cl) { + bool instanceOf(UserCommonClass* cl) { if (!this) return false; else return this->classOf->isAssignableFrom(cl); } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Tue Aug 26 04:30:54 2008 @@ -31,7 +31,7 @@ using namespace jnjvm; #ifdef MULTIPLE_VM -extern "C" JavaString* stringLookup(Class* cl, uint32 index) { +extern "C" JavaString* stringLookup(UserClass* cl, uint32 index) { JavaConstantPool* ctpInfo = cl->getConstantPool(); const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[index]); JavaString* str = JavaThread::get()->isolate->UTF8ToStr(utf8); @@ -42,8 +42,8 @@ extern "C" void* jnjvmVirtualLookup(CacheNode* cache, JavaObject *obj) { Enveloppe* enveloppe = cache->enveloppe; JavaConstantPool* ctpInfo = enveloppe->ctpInfo; - CommonClass* ocl = obj->classOf; - CommonClass* cl = 0; + UserCommonClass* ocl = obj->classOf; + UserCommonClass* cl = 0; const UTF8* utf8 = 0; Signdef* sign = 0; uint32 index = enveloppe->index; @@ -77,7 +77,7 @@ } rcache->methPtr = dmeth->compiledPtr(); - rcache->lastCible = (Class*)ocl; + rcache->lastCible = (UserClass*)ocl; } @@ -93,14 +93,14 @@ return rcache->methPtr; } -extern "C" void* fieldLookup(JavaObject* obj, Class* caller, uint32 index, +extern "C" void* fieldLookup(JavaObject* obj, UserClass* caller, uint32 index, uint32 stat) { JavaConstantPool* ctpInfo = caller->getConstantPool(); if (ctpInfo->ctpRes[index]) { return ctpInfo->ctpRes[index]; } - CommonClass* cl = 0; + UserCommonClass* cl = 0; const UTF8* utf8 = 0; Typedef* sign = 0; @@ -110,9 +110,9 @@ void* ptr = 0; if (stat) { - Class* fieldCl = field->classDef; - JavaThread::get()->isolate->initialiseClass(fieldCl); - ptr = (void*)((uint64)(fieldCl->staticInstance()) + field->ptrOffset); + UserClass* fieldCl = field->classDef; + fieldCl->initialiseClass(JavaThread::get()->isolate); + ptr = (void*)((uint64)(fieldCl->getStaticInstance()) + field->ptrOffset); #ifndef MULTIPLE_VM ctpInfo->ctpRes[index] = ptr; #endif @@ -169,7 +169,7 @@ JavaThread::get()->isolate->outOfMemoryError(val); } -extern "C" void jnjvmClassCastException(JavaObject* obj, CommonClass* cl) { +extern "C" void jnjvmClassCastException(JavaObject* obj, UserCommonClass* cl) { JavaThread::get()->isolate->classCastException(""); } @@ -178,7 +178,7 @@ } #ifdef MULTIPLE_VM -extern "C" JavaObject* getStaticInstance(Class* cl, Jnjvm* vm) { +extern "C" JavaObject* getStaticInstance(UserClass* cl, Jnjvm* vm) { std::pair* val = vm->statics->lookup(cl); if (!val || !(val->second)) { vm->initialiseClass(cl); @@ -188,25 +188,25 @@ } #endif -extern "C" CommonClass* initialisationCheck(CommonClass* cl) { - JavaThread::get()->isolate->initialiseClass(cl); +extern "C" CommonClass* initialisationCheck(UserCommonClass* cl) { + cl->initialiseClass(JavaThread::get()->isolate); return cl; } -extern "C" JavaObject* getClassDelegatee(CommonClass* cl) { +extern "C" JavaObject* getClassDelegatee(UserCommonClass* cl) { Jnjvm* vm = JavaThread::get()->isolate; - return vm->getClassDelegatee(cl); + return cl->getClassDelegatee(vm); } -extern "C" Class* newLookup(Class* caller, uint32 index) { +extern "C" Class* newLookup(UserClass* caller, uint32 index) { JavaConstantPool* ctpInfo = caller->getConstantPool(); - Class* cl = (Class*)ctpInfo->loadClass(index); + UserClass* cl = (UserClass*)ctpInfo->loadClass(index); return cl; } #ifndef WITHOUT_VTABLE -extern "C" uint32 vtableLookup(JavaObject* obj, Class* caller, uint32 index) { - CommonClass* cl = 0; +extern "C" uint32 vtableLookup(JavaObject* obj, UserClass* caller, uint32 index) { + UserCommonClass* cl = 0; const UTF8* utf8 = 0; Signdef* sign = 0; @@ -229,7 +229,7 @@ #endif -static JavaArray* multiCallNewIntern(arrayCtor_t ctor, ClassArray* cl, +static JavaArray* multiCallNewIntern(arrayCtor_t ctor, UserClassArray* cl, uint32 len, sint32* dims, Jnjvm* vm) { @@ -237,9 +237,9 @@ JavaArray* _res = ctor(dims[0], cl, vm); if (len > 1) { ArrayObject* res = (ArrayObject*)_res; - CommonClass* _base = cl->baseClass(); - if (_base->isArray) { - ClassArray* base = (ClassArray*)_base; + UserCommonClass* _base = cl->baseClass(); + if (_base->isArray()) { + UserClassArray* base = (UserClassArray*)_base; AssessorDesc* func = base->funcs(); arrayCtor_t newCtor = func->arrayCtor; if (dims[0] > 0) { @@ -260,18 +260,14 @@ return _res; } -extern "C" JavaArray* multiCallNew(ClassArray* cl, uint32 len, ...) { +extern "C" JavaArray* multiCallNew(UserClassArray* cl, uint32 len, ...) { va_list ap; va_start(ap, len); sint32* dims = (sint32*)alloca(sizeof(sint32) * len); for (uint32 i = 0; i < len; ++i){ dims[i] = va_arg(ap, int); } -#ifdef MULTIPLE_VM - Jnjvm* vm = va_arg(ap, Jnjvm*); -#else - Jnjvm* vm = 0; -#endif + Jnjvm* vm = JavaThread::get()->isolate; return multiCallNewIntern((arrayCtor_t)ArrayObject::acons, cl, len, dims, vm); } @@ -309,19 +305,19 @@ } #endif -extern "C" bool instanceOf(JavaObject* obj, CommonClass* cl) { +extern "C" bool instanceOf(JavaObject* obj, UserCommonClass* cl) { return obj->instanceOf(cl); } -extern "C" bool instantiationOfArray(CommonClass* cl1, ClassArray* cl2) { +extern "C" bool instantiationOfArray(UserCommonClass* cl1, UserClassArray* cl2) { return cl1->instantiationOfArray(cl2); } -extern "C" bool implements(CommonClass* cl1, CommonClass* cl2) { +extern "C" bool implements(UserCommonClass* cl1, UserCommonClass* cl2) { return cl1->implements(cl2); } -extern "C" bool isAssignableFrom(CommonClass* cl1, CommonClass* cl2) { +extern "C" bool isAssignableFrom(UserCommonClass* cl1, UserCommonClass* cl2) { return cl1->isAssignableFrom(cl2); } @@ -337,7 +333,7 @@ return JavaThread::getJavaException(); } -extern "C" bool JavaThreadCompareException(Class* cl) { +extern "C" bool JavaThreadCompareException(UserClass* cl) { return JavaThread::compareException(cl); } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaString.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaString.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaString.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaString.cpp Tue Aug 26 04:30:54 2008 @@ -17,13 +17,13 @@ JavaString* JavaString::stringDup(const UTF8*& utf8, Jnjvm* vm) { - Class* cl = Classpath::newString; + Class* cl = vm->upcalls->newString; JavaString* res = (JavaString*)malloc(cl->virtualSize); ((void**)res)[0] = cl->virtualVT; res->classOf = cl; - // no need to call the function - // Classpath::initString->run(res, utf8, 0, utf8->size, true); + // No need to call the Java function: both the Java function and + // this function do the same thing. res->value = utf8; res->count = utf8->size; res->offset = 0; @@ -44,7 +44,8 @@ const UTF8* utf8 = this->value; if (offset || (offset + count <= utf8->size)) { // TODO find a way to get a relevant hashUTF8 - return utf8->extract(JnjvmClassLoader::bootstrapLoader->hashUTF8, offset, offset + count); + UTF8Map* map = vm->bootstrapLoader->hashUTF8; + return utf8->extract(map, offset, offset + count); } else { return utf8; } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaThread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaThread.h?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaThread.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaThread.h Tue Aug 26 04:30:54 2008 @@ -100,7 +100,7 @@ th->internalPendingException = 0; } - static bool compareException(Class* cl) { + static bool compareException(UserClass* cl) { JavaObject* pe = JavaThread::get()->pendingException; assert(pe && "no pending exception?"); bool val = pe->classOf->subclassOf(cl); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.cpp Tue Aug 26 04:30:54 2008 @@ -18,6 +18,7 @@ #include "JavaJIT.h" #include "JavaThread.h" #include "JavaTypes.h" +#include "JavaUpcalls.h" #include "Jnjvm.h" using namespace jnjvm; @@ -81,7 +82,7 @@ } } -void AssessorDesc::initialise(JnjvmClassLoader* vm) { +void AssessorDesc::initialise(JnjvmBootstrapLoader* vm) { dParg = new AssessorDesc(false, I_PARG, 0, 0, "(", vm, 0, 0, 0, 0); @@ -92,38 +93,38 @@ dBool = new AssessorDesc(false, I_BOOL, 1, 1, "boolean", vm, BOOL_ID, "java/lang/Boolean", - JavaArray::ofBool, + vm->upcalls->ArrayOfBool, (arrayCtor_t)ArrayUInt8::acons); dByte = new AssessorDesc(false, I_BYTE, 1, 1, "byte", vm, BYTE_ID, "java/lang/Byte", - JavaArray::ofByte, + vm->upcalls->ArrayOfByte, (arrayCtor_t)ArraySInt8::acons); dChar = new AssessorDesc(false, I_CHAR, 2, 1, "char", vm, CHAR_ID, "java/lang/Character", - JavaArray::ofChar, + vm->upcalls->ArrayOfChar, (arrayCtor_t)ArrayUInt16::acons); dShort = new AssessorDesc(false, I_SHORT, 2, 1, "short", vm, SHORT_ID, "java/lang/Short", - JavaArray::ofShort, + vm->upcalls->ArrayOfShort, (arrayCtor_t)ArraySInt16::acons); dInt = new AssessorDesc(false, I_INT, 4, 1, "int", vm, INT_ID, "java/lang/Integer", - JavaArray::ofInt, + vm->upcalls->ArrayOfInt, (arrayCtor_t)ArraySInt32::acons); dFloat = new AssessorDesc(false, I_FLOAT, 4, 1, "float", vm, FLOAT_ID, "java/lang/Float", - JavaArray::ofFloat, + vm->upcalls->ArrayOfFloat, (arrayCtor_t)ArrayFloat::acons); dLong = new AssessorDesc(false, I_LONG, 8, 2, "long", vm, LONG_ID, "java/lang/Long", - JavaArray::ofLong, + vm->upcalls->ArrayOfLong, (arrayCtor_t)ArrayLong::acons); dDouble = new AssessorDesc(false, I_DOUBLE, 8, 2, "double", vm, DOUBLE_ID, "java/lang/Double", - JavaArray::ofDouble, + vm->upcalls->ArrayOfDouble, (arrayCtor_t)ArrayDouble::acons); dTab = new AssessorDesc(true, I_TAB, sizeof(void*), 1, "array", vm, ARRAY_ID, 0, 0, @@ -378,23 +379,23 @@ AssessorDesc* AssessorDesc::classToPrimitive(CommonClass* cl) { const UTF8* name = cl->name; - if (name == dFloat->assocClassName) { + if (name->equals(dFloat->assocClassName)) { return dFloat; - } else if (name == dInt->assocClassName) { + } else if (name->equals(dInt->assocClassName)) { return dInt; - } else if (name == dShort->assocClassName) { + } else if (name->equals(dShort->assocClassName)) { return dShort; - } else if (name == dChar->assocClassName) { + } else if (name->equals(dChar->assocClassName)) { return dChar; - } else if (name == dDouble->assocClassName) { + } else if (name->equals(dDouble->assocClassName)) { return dDouble; - } else if (name == dByte->assocClassName) { + } else if (name->equals(dByte->assocClassName)) { return dByte; - } else if (name == dBool->assocClassName) { + } else if (name->equals(dBool->assocClassName)) { return dBool; - } else if (name == dLong->assocClassName) { + } else if (name->equals(dLong->assocClassName)) { return dLong; - } else if (name == dVoid->assocClassName) { + } else if (name->equals(dVoid->assocClassName)) { return dVoid; } else { return 0; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.h?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.h Tue Aug 26 04:30:54 2008 @@ -19,10 +19,12 @@ class ClassArray; class CommonClass; +class UserCommonClass; class JavaArray; class JavaJIT; class JavaObject; class Jnjvm; +class JnjvmBootstrapLoader; class JnjvmClassLoader; class UTF8; @@ -188,7 +190,7 @@ /// initialise - Construct all assessors. /// - static void initialise(JnjvmClassLoader* loader); + static void initialise(JnjvmBootstrapLoader* loader); /// printString - Print the assessor for debugging purposes. @@ -251,7 +253,7 @@ /// assocClass - Given the loaded, try to load the class represented by this /// Typedef. /// - CommonClass* assocClass(JnjvmClassLoader* loader); + UserCommonClass* assocClass(JnjvmClassLoader* loader); /// humanPrintArgs - Prints the list of typedef in a human readable form. /// Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp Tue Aug 26 04:30:54 2008 @@ -36,6 +36,7 @@ using namespace jnjvm; +#ifndef MULTIPLE_VM Class* Classpath::newThread; Class* Classpath::newVMThread; JavaField* Classpath::assocThread; @@ -177,36 +178,54 @@ JavaMethod* Classpath::ErrorWithExcpExceptionInInitializerError; JavaMethod* Classpath::ErrorWithExcpInvocationTargetException; +ClassArray* Classpath::ArrayOfByte; +ClassArray* Classpath::ArrayOfChar; +ClassArray* Classpath::ArrayOfString; +ClassArray* Classpath::ArrayOfInt; +ClassArray* Classpath::ArrayOfShort; +ClassArray* Classpath::ArrayOfBool; +ClassArray* Classpath::ArrayOfLong; +ClassArray* Classpath::ArrayOfFloat; +ClassArray* Classpath::ArrayOfDouble; +ClassArray* Classpath::ArrayOfObject; + +JavaField* Classpath::methodClass; +JavaField* Classpath::fieldClass; +JavaField* Classpath::constructorClass; + +#endif + void Classpath::createInitialThread(Jnjvm* vm, JavaObject* th) { JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; JCL->loadName(newVMThread->name, true, true); - vm->initialiseClass(newVMThread); + newVMThread->initialiseClass(vm); JavaObject* vmth = newVMThread->doNew(vm); - name->setVirtualObjectField(th, (JavaObject*)vm->asciizToStr("main")); - priority->setVirtualInt32Field(th, (uint32)1); - daemon->setVirtualInt8Field(th, (uint32)0); - vmThread->setVirtualObjectField(th, vmth); - assocThread->setVirtualObjectField(vmth, th); - running->setVirtualInt8Field(vmth, (uint32)1); + name->setObjectField(th, (JavaObject*)vm->asciizToStr("main")); + priority->setInt32Field(th, (uint32)1); + daemon->setInt8Field(th, (uint32)0); + vmThread->setObjectField(th, vmth); + assocThread->setObjectField(vmth, th); + running->setInt8Field(vmth, (uint32)1); JCL->loadName(rootGroup->classDef->name, true, true); - vm->initialiseClass(rootGroup->classDef); - JavaObject* RG = rootGroup->getStaticObjectField(); - group->setVirtualObjectField(th, RG); + rootGroup->classDef->initialiseClass(vm); + JavaObject* Stat = rootGroup->classDef->getStaticInstance(); + JavaObject* RG = rootGroup->getObjectField(Stat); + group->setObjectField(th, RG); groupAddThread->invokeIntSpecial(vm, RG, th); } void Classpath::mapInitialThread(Jnjvm* vm) { JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; JCL->loadName(newThread->name, true, true); - vm->initialiseClass(newThread); + newThread->initialiseClass(vm); JavaObject* th = newThread->doNew(vm); createInitialThread(vm, th); JavaThread* myth = JavaThread::get(); myth->javaThread = th; - JavaObject* vmth = vmThread->getVirtualObjectField(th); - vmdataVMThread->setVirtualObjectField(vmth, (JavaObject*)myth); + JavaObject* vmth = vmThread->getObjectField(th); + vmdataVMThread->setObjectField(vmth, (JavaObject*)myth); finaliseCreateInitialThread->invokeIntStatic(vm, th); } @@ -520,6 +539,18 @@ UPCALL_METHOD(loader, "java/lang/ThreadGroup", "uncaughtException", "(Ljava/lang/Thread;Ljava/lang/Throwable;)V", ACC_VIRTUAL); + + methodClass = + UPCALL_FIELD(loader, "java/lang/reflect/Method", "declaringClass", + "Ljava/lang/Class;", ACC_VIRTUAL); + + fieldClass = + UPCALL_FIELD(loader, "java/lang/reflect/Field", "declaringClass", + "Ljava/lang/Class;", ACC_VIRTUAL); + + constructorClass = + UPCALL_FIELD(loader, "java/lang/reflect/Constructor", "clazz", + "Ljava/lang/Class;", ACC_VIRTUAL); loader->loadName(loader->asciizConstructUTF8("java/lang/String"), true, false); @@ -554,7 +585,7 @@ extern "C" uint8 isArray(JavaObject* klass) { CommonClass* cl = - (CommonClass*)((Classpath::vmdataClass->getVirtualObjectField(klass))); + (CommonClass*)((Classpath::vmdataClass->getObjectField(klass))); - return (uint8)cl->isArray; + return (uint8)cl->isArray(); } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h Tue Aug 26 04:30:54 2008 @@ -10,6 +10,7 @@ #ifndef JNJVM_JAVA_UPCALLS_H #define JNJVM_JAVA_UPCALLS_H +#include "JnjvmConfig.h" #define UPCALL_CLASS(vm, name) \ vm->loadName(vm->asciizConstructUTF8(name), false, false) @@ -53,151 +54,167 @@ class Classpath { public: - static JavaMethod* getSystemClassLoader; - static JavaMethod* setContextClassLoader; - static Class* newString; - static Class* newClass; - static Class* newThrowable; - static Class* newException; - static JavaMethod* initClass; - static JavaMethod* initClassWithProtectionDomain; - static JavaField* vmdataClass; - static JavaMethod* setProperty; - static JavaMethod* initString; - static JavaMethod* getCallingClassLoader; - static JavaMethod* initConstructor; - static ClassArray* constructorArrayClass; - static ClassArray* constructorArrayAnnotation; - static Class* newConstructor; - static JavaField* constructorSlot; - static JavaMethod* initMethod; - static JavaMethod* initField; - static ClassArray* methodArrayClass; - static ClassArray* fieldArrayClass; - static Class* newMethod; - static Class* newField; - static JavaField* methodSlot; - static JavaField* fieldSlot; - static ClassArray* classArrayClass; - static JavaMethod* loadInClassLoader; - static JavaMethod* initVMThrowable; - static JavaField* vmDataVMThrowable; - static Class* newVMThrowable; - static JavaField* bufferAddress; - static JavaField* dataPointer32; - static JavaField* vmdataClassLoader; - - static JavaField* boolValue; - static JavaField* byteValue; - static JavaField* shortValue; - static JavaField* charValue; - static JavaField* intValue; - static JavaField* longValue; - static JavaField* floatValue; - static JavaField* doubleValue; - - static Class* newStackTraceElement; - static ClassArray* stackTraceArray; - static JavaMethod* initStackTraceElement; - - static void initialiseClasspath(JnjvmClassLoader* loader); - - static Class* voidClass; - static Class* boolClass; - static Class* byteClass; - static Class* shortClass; - static Class* charClass; - static Class* intClass; - static Class* floatClass; - static Class* doubleClass; - static Class* longClass; - - static Class* vmStackWalker; - - static Class* newThread; - static Class* newVMThread; - static JavaField* assocThread; - static JavaField* vmdataVMThread; - static JavaMethod* finaliseCreateInitialThread; - static JavaMethod* initVMThread; - static JavaMethod* groupAddThread; - static JavaField* name; - static JavaField* priority; - static JavaField* daemon; - static JavaField* group; - static JavaField* running; - static JavaField* rootGroup; - static JavaField* vmThread; - static JavaMethod* uncaughtException; - - static Class* InvocationTargetException; - static Class* ArrayStoreException; - static Class* ClassCastException; - static Class* IllegalMonitorStateException; - static Class* IllegalArgumentException; - static Class* InterruptedException; - static Class* IndexOutOfBoundsException; - static Class* ArrayIndexOutOfBoundsException; - static Class* NegativeArraySizeException; - static Class* NullPointerException; - static Class* SecurityException; - static Class* ClassFormatError; - static Class* ClassCircularityError; - static Class* NoClassDefFoundError; - static Class* UnsupportedClassVersionError; - static Class* NoSuchFieldError; - static Class* NoSuchMethodError; - static Class* InstantiationError; - static Class* IllegalAccessError; - static Class* IllegalAccessException; - static Class* VerifyError; - static Class* ExceptionInInitializerError; - static Class* LinkageError; - static Class* AbstractMethodError; - static Class* UnsatisfiedLinkError; - static Class* InternalError; - static Class* OutOfMemoryError; - static Class* StackOverflowError; - static Class* UnknownError; - static Class* ClassNotFoundException; - - static JavaMethod* InitInvocationTargetException; - static JavaMethod* InitArrayStoreException; - static JavaMethod* InitClassCastException; - static JavaMethod* InitIllegalMonitorStateException; - static JavaMethod* InitIllegalArgumentException; - static JavaMethod* InitInterruptedException; - static JavaMethod* InitIndexOutOfBoundsException; - static JavaMethod* InitArrayIndexOutOfBoundsException; - static JavaMethod* InitNegativeArraySizeException; - static JavaMethod* InitNullPointerException; - static JavaMethod* InitSecurityException; - static JavaMethod* InitClassFormatError; - static JavaMethod* InitClassCircularityError; - static JavaMethod* InitNoClassDefFoundError; - static JavaMethod* InitUnsupportedClassVersionError; - static JavaMethod* InitNoSuchFieldError; - static JavaMethod* InitNoSuchMethodError; - static JavaMethod* InitInstantiationError; - static JavaMethod* InitIllegalAccessError; - static JavaMethod* InitIllegalAccessException; - static JavaMethod* InitVerifyError; - static JavaMethod* InitExceptionInInitializerError; - static JavaMethod* InitLinkageError; - static JavaMethod* InitAbstractMethodError; - static JavaMethod* InitUnsatisfiedLinkError; - static JavaMethod* InitInternalError; - static JavaMethod* InitOutOfMemoryError; - static JavaMethod* InitStackOverflowError; - static JavaMethod* InitUnknownError; - static JavaMethod* InitClassNotFoundException; - - static JavaMethod* ErrorWithExcpNoClassDefFoundError; - static JavaMethod* ErrorWithExcpExceptionInInitializerError; - static JavaMethod* ErrorWithExcpInvocationTargetException; + ISOLATE_STATIC JavaMethod* getSystemClassLoader; + ISOLATE_STATIC JavaMethod* setContextClassLoader; + ISOLATE_STATIC UserClass* newString; + ISOLATE_STATIC UserClass* newClass; + ISOLATE_STATIC UserClass* newThrowable; + ISOLATE_STATIC UserClass* newException; + ISOLATE_STATIC JavaMethod* initClass; + ISOLATE_STATIC JavaMethod* initClassWithProtectionDomain; + ISOLATE_STATIC JavaField* vmdataClass; + ISOLATE_STATIC JavaMethod* setProperty; + ISOLATE_STATIC JavaMethod* initString; + ISOLATE_STATIC JavaMethod* getCallingClassLoader; + ISOLATE_STATIC JavaMethod* initConstructor; + ISOLATE_STATIC UserClassArray* constructorArrayClass; + ISOLATE_STATIC UserClassArray* constructorArrayAnnotation; + ISOLATE_STATIC UserClass* newConstructor; + ISOLATE_STATIC JavaField* constructorSlot; + ISOLATE_STATIC JavaMethod* initMethod; + ISOLATE_STATIC JavaMethod* initField; + ISOLATE_STATIC UserClassArray* methodArrayClass; + ISOLATE_STATIC UserClassArray* fieldArrayClass; + ISOLATE_STATIC UserClass* newMethod; + ISOLATE_STATIC UserClass* newField; + ISOLATE_STATIC JavaField* methodSlot; + ISOLATE_STATIC JavaField* fieldSlot; + ISOLATE_STATIC UserClassArray* classArrayClass; + ISOLATE_STATIC JavaMethod* loadInClassLoader; + ISOLATE_STATIC JavaMethod* initVMThrowable; + ISOLATE_STATIC JavaField* vmDataVMThrowable; + ISOLATE_STATIC UserClass* newVMThrowable; + ISOLATE_STATIC JavaField* bufferAddress; + ISOLATE_STATIC JavaField* dataPointer32; + ISOLATE_STATIC JavaField* vmdataClassLoader; + + ISOLATE_STATIC JavaField* boolValue; + ISOLATE_STATIC JavaField* byteValue; + ISOLATE_STATIC JavaField* shortValue; + ISOLATE_STATIC JavaField* charValue; + ISOLATE_STATIC JavaField* intValue; + ISOLATE_STATIC JavaField* longValue; + ISOLATE_STATIC JavaField* floatValue; + ISOLATE_STATIC JavaField* doubleValue; + + ISOLATE_STATIC UserClass* newStackTraceElement; + ISOLATE_STATIC UserClassArray* stackTraceArray; + ISOLATE_STATIC JavaMethod* initStackTraceElement; + + ISOLATE_STATIC void initialiseClasspath(JnjvmClassLoader* loader); + + ISOLATE_STATIC UserClass* voidClass; + ISOLATE_STATIC UserClass* boolClass; + ISOLATE_STATIC UserClass* byteClass; + ISOLATE_STATIC UserClass* shortClass; + ISOLATE_STATIC UserClass* charClass; + ISOLATE_STATIC UserClass* intClass; + ISOLATE_STATIC UserClass* floatClass; + ISOLATE_STATIC UserClass* doubleClass; + ISOLATE_STATIC UserClass* longClass; + + ISOLATE_STATIC UserClass* vmStackWalker; + + ISOLATE_STATIC UserClass* newThread; + ISOLATE_STATIC UserClass* newVMThread; + ISOLATE_STATIC JavaField* assocThread; + ISOLATE_STATIC JavaField* vmdataVMThread; + ISOLATE_STATIC JavaMethod* finaliseCreateInitialThread; + ISOLATE_STATIC JavaMethod* initVMThread; + ISOLATE_STATIC JavaMethod* groupAddThread; + ISOLATE_STATIC JavaField* name; + ISOLATE_STATIC JavaField* priority; + ISOLATE_STATIC JavaField* daemon; + ISOLATE_STATIC JavaField* group; + ISOLATE_STATIC JavaField* running; + ISOLATE_STATIC JavaField* rootGroup; + ISOLATE_STATIC JavaField* vmThread; + ISOLATE_STATIC JavaMethod* uncaughtException; + + ISOLATE_STATIC UserClass* InvocationTargetException; + ISOLATE_STATIC UserClass* ArrayStoreException; + ISOLATE_STATIC UserClass* ClassCastException; + ISOLATE_STATIC UserClass* IllegalMonitorStateException; + ISOLATE_STATIC UserClass* IllegalArgumentException; + ISOLATE_STATIC UserClass* InterruptedException; + ISOLATE_STATIC UserClass* IndexOutOfBoundsException; + ISOLATE_STATIC UserClass* ArrayIndexOutOfBoundsException; + ISOLATE_STATIC UserClass* NegativeArraySizeException; + ISOLATE_STATIC UserClass* NullPointerException; + ISOLATE_STATIC UserClass* SecurityException; + ISOLATE_STATIC UserClass* ClassFormatError; + ISOLATE_STATIC UserClass* ClassCircularityError; + ISOLATE_STATIC UserClass* NoClassDefFoundError; + ISOLATE_STATIC UserClass* UnsupportedClassVersionError; + ISOLATE_STATIC UserClass* NoSuchFieldError; + ISOLATE_STATIC UserClass* NoSuchMethodError; + ISOLATE_STATIC UserClass* InstantiationError; + ISOLATE_STATIC UserClass* IllegalAccessError; + ISOLATE_STATIC UserClass* IllegalAccessException; + ISOLATE_STATIC UserClass* VerifyError; + ISOLATE_STATIC UserClass* ExceptionInInitializerError; + ISOLATE_STATIC UserClass* LinkageError; + ISOLATE_STATIC UserClass* AbstractMethodError; + ISOLATE_STATIC UserClass* UnsatisfiedLinkError; + ISOLATE_STATIC UserClass* InternalError; + ISOLATE_STATIC UserClass* OutOfMemoryError; + ISOLATE_STATIC UserClass* StackOverflowError; + ISOLATE_STATIC UserClass* UnknownError; + ISOLATE_STATIC UserClass* ClassNotFoundException; + + ISOLATE_STATIC JavaMethod* InitInvocationTargetException; + ISOLATE_STATIC JavaMethod* InitArrayStoreException; + ISOLATE_STATIC JavaMethod* InitClassCastException; + ISOLATE_STATIC JavaMethod* InitIllegalMonitorStateException; + ISOLATE_STATIC JavaMethod* InitIllegalArgumentException; + ISOLATE_STATIC JavaMethod* InitInterruptedException; + ISOLATE_STATIC JavaMethod* InitIndexOutOfBoundsException; + ISOLATE_STATIC JavaMethod* InitArrayIndexOutOfBoundsException; + ISOLATE_STATIC JavaMethod* InitNegativeArraySizeException; + ISOLATE_STATIC JavaMethod* InitNullPointerException; + ISOLATE_STATIC JavaMethod* InitSecurityException; + ISOLATE_STATIC JavaMethod* InitClassFormatError; + ISOLATE_STATIC JavaMethod* InitClassCircularityError; + ISOLATE_STATIC JavaMethod* InitNoClassDefFoundError; + ISOLATE_STATIC JavaMethod* InitUnsupportedClassVersionError; + ISOLATE_STATIC JavaMethod* InitNoSuchFieldError; + ISOLATE_STATIC JavaMethod* InitNoSuchMethodError; + ISOLATE_STATIC JavaMethod* InitInstantiationError; + ISOLATE_STATIC JavaMethod* InitIllegalAccessError; + ISOLATE_STATIC JavaMethod* InitIllegalAccessException; + ISOLATE_STATIC JavaMethod* InitVerifyError; + ISOLATE_STATIC JavaMethod* InitExceptionInInitializerError; + ISOLATE_STATIC JavaMethod* InitLinkageError; + ISOLATE_STATIC JavaMethod* InitAbstractMethodError; + ISOLATE_STATIC JavaMethod* InitUnsatisfiedLinkError; + ISOLATE_STATIC JavaMethod* InitInternalError; + ISOLATE_STATIC JavaMethod* InitOutOfMemoryError; + ISOLATE_STATIC JavaMethod* InitStackOverflowError; + ISOLATE_STATIC JavaMethod* InitUnknownError; + ISOLATE_STATIC JavaMethod* InitClassNotFoundException; + + ISOLATE_STATIC JavaMethod* ErrorWithExcpNoClassDefFoundError; + ISOLATE_STATIC JavaMethod* ErrorWithExcpExceptionInInitializerError; + ISOLATE_STATIC JavaMethod* ErrorWithExcpInvocationTargetException; + + ISOLATE_STATIC void createInitialThread(Jnjvm* vm, JavaObject* th); + ISOLATE_STATIC void mapInitialThread(Jnjvm* vm); + + + ISOLATE_STATIC UserClassArray* ArrayOfByte; + ISOLATE_STATIC UserClassArray* ArrayOfChar; + ISOLATE_STATIC UserClassArray* ArrayOfString; + ISOLATE_STATIC UserClassArray* ArrayOfInt; + ISOLATE_STATIC UserClassArray* ArrayOfShort; + ISOLATE_STATIC UserClassArray* ArrayOfBool; + ISOLATE_STATIC UserClassArray* ArrayOfLong; + ISOLATE_STATIC UserClassArray* ArrayOfFloat; + ISOLATE_STATIC UserClassArray* ArrayOfDouble; + ISOLATE_STATIC UserClassArray* ArrayOfObject; - static void createInitialThread(Jnjvm* vm, JavaObject* th); - static void mapInitialThread(Jnjvm* vm); + ISOLATE_STATIC JavaField* methodClass; + ISOLATE_STATIC JavaField* fieldClass; + ISOLATE_STATIC JavaField* constructorClass; }; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp Tue Aug 26 04:30:54 2008 @@ -63,7 +63,7 @@ BEGIN_EXCEPTION JnjvmClassLoader* loader = 0; - Class* currentClass = JavaJIT::getCallingClass(); + UserClass* currentClass = JavaJIT::getCallingClass(); if (currentClass) loader = currentClass->classLoader; else loader = JnjvmClassLoader::bootstrapLoader; @@ -71,9 +71,10 @@ sint32 len = utf8->size; - CommonClass* cl = loader->lookupClassFromUTF8(utf8, 0, len, true, true); - JavaThread::get()->isolate->initialiseClass(cl); - return (jclass)(cl->getClassDelegatee()); + UserCommonClass* cl = loader->lookupClassFromUTF8(utf8, 0, len, true, true); + Jnjvm* vm = JavaThread::get()->isolate; + cl->initialiseClass(vm); + return (jclass)(cl->getClassDelegatee(vm)); END_EXCEPTION return 0; @@ -84,16 +85,17 @@ BEGIN_EXCEPTION + Jnjvm* vm = NativeUtil::myVM(env); + Classpath* upcalls = vm->upcalls; JavaObject* meth = (JavaObject*)method; - CommonClass* cl = meth->classOf; - if (cl == Classpath::newConstructor) { - return (jmethodID)Classpath::constructorSlot->getVirtualInt32Field(meth); - } else if (cl == Classpath::newMethod) { - return (jmethodID)Classpath::methodSlot->getVirtualInt32Field(meth); + UserCommonClass* cl = meth->classOf; + if (cl == upcalls->newConstructor) { + return (jmethodID)upcalls->constructorSlot->getInt32Field(meth); + } else if (cl == upcalls->newMethod) { + return (jmethodID)upcalls->methodSlot->getInt32Field(meth); } else { - JavaThread::get()->isolate->unknownError( - "%s is not a constructor or a method", - meth->printString()); + vm->unknownError("%s is not a constructor or a method", + meth->printString()); } END_EXCEPTION @@ -112,8 +114,8 @@ BEGIN_EXCEPTION - CommonClass* cl2 = NativeUtil::resolvedImplClass(sup, false); - CommonClass* cl1 = NativeUtil::resolvedImplClass(sub, false); + UserCommonClass* cl2 = NativeUtil::resolvedImplClass(sup, false); + UserCommonClass* cl1 = NativeUtil::resolvedImplClass(sub, false); return cl1->isAssignableFrom(cl2); @@ -135,9 +137,9 @@ JavaThread* th = JavaThread::get(); Jnjvm* vm = th->isolate; - CommonClass* cl = NativeUtil::resolvedImplClass(clazz, true); - if (cl->isArray) assert(0 && "implement me"); - JavaObject* res = ((Class*)cl)->doNew(vm); + UserCommonClass* cl = NativeUtil::resolvedImplClass(clazz, true); + if (cl->isArray()) assert(0 && "implement me"); + JavaObject* res = ((UserClass*)cl)->doNew(vm); JavaMethod* init = cl->lookupMethod(Jnjvm::initName, cl->classLoader->asciizConstructUTF8("(Ljava/lang/String;)V"), 0, 1); @@ -209,9 +211,9 @@ BEGIN_EXCEPTION - CommonClass* cl = NativeUtil::resolvedImplClass(clazz, true); - if (cl->isArray) JavaThread::get()->isolate->unknownError("implement me"); - return (jobject)((Class*)cl)->doNew(JavaThread::get()->isolate); + UserCommonClass* cl = NativeUtil::resolvedImplClass(clazz, true); + if (cl->isArray()) JavaThread::get()->isolate->unknownError("implement me"); + return (jobject)((UserClass*)cl)->doNew(JavaThread::get()->isolate); END_EXCEPTION return 0; @@ -224,7 +226,7 @@ va_list ap; va_start(ap, methodID); JavaMethod* meth = (JavaMethod*)methodID; - Class* cl = (Class*)NativeUtil::resolvedImplClass(clazz, true); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); Jnjvm* vm = JavaThread::get()->isolate; JavaObject* res = cl->doNew(vm); meth->invokeIntSpecialAP(vm, res, ap); @@ -255,7 +257,8 @@ BEGIN_EXCEPTION verifyNull((JavaObject*)obj); - return (jclass)((JavaObject*)obj)->classOf->getClassDelegatee(); + Jnjvm* vm = JavaThread::get()->isolate; + return (jclass)((JavaObject*)obj)->classOf->getClassDelegatee(vm); END_EXCEPTION return 0; @@ -294,7 +297,7 @@ BEGIN_EXCEPTION // TODO: find a better place for creating UTF8 - CommonClass* cl = NativeUtil::resolvedImplClass(clazz, true); + UserCommonClass* cl = NativeUtil::resolvedImplClass(clazz, true); const UTF8* name = cl->classLoader->asciizConstructUTF8(aname); const UTF8* type = cl->classLoader->asciizConstructUTF8(atype); JavaMethod* meth = cl->lookupMethod( @@ -830,7 +833,7 @@ BEGIN_EXCEPTION // TODO: find a better place to store the UTF8 - CommonClass* cl = NativeUtil::resolvedImplClass(clazz, true); + UserCommonClass* cl = NativeUtil::resolvedImplClass(clazz, true); return (jfieldID) cl->lookupField(cl->classLoader->asciizConstructUTF8(name), cl->classLoader->asciizConstructUTF8(sig), 0, 1); @@ -847,7 +850,7 @@ JavaField* field = (JavaField*)fieldID; JavaObject* o = (JavaObject*)obj; - return (jobject)field->getVirtualObjectField(o); + return (jobject)field->getObjectField(o); END_EXCEPTION return 0; @@ -860,7 +863,7 @@ JavaField* field = (JavaField*)fieldID; JavaObject* o = (JavaObject*)obj; - return (uint8)field->getVirtualInt8Field(o); + return (uint8)field->getInt8Field(o); END_EXCEPTION return 0; @@ -873,7 +876,7 @@ JavaField* field = (JavaField*)fieldID; JavaObject* o = (JavaObject*)obj; - return (sint8)field->getVirtualInt8Field(o); + return (sint8)field->getInt8Field(o); END_EXCEPTION return 0; @@ -886,7 +889,7 @@ JavaField* field = (JavaField*)fieldID; JavaObject* o = (JavaObject*)obj; - return (uint16)field->getVirtualInt16Field(o); + return (uint16)field->getInt16Field(o); END_EXCEPTION return 0; @@ -899,7 +902,7 @@ JavaField* field = (JavaField*)fieldID; JavaObject* o = (JavaObject*)obj; - return (sint16)field->getVirtualInt16Field(o); + return (sint16)field->getInt16Field(o); END_EXCEPTION return 0; @@ -912,7 +915,7 @@ JavaField* field = (JavaField*)fieldID; JavaObject* o = (JavaObject*)obj; - return (sint32)field->getVirtualInt32Field(o); + return (sint32)field->getInt32Field(o); END_EXCEPTION return 0; @@ -925,7 +928,7 @@ JavaField* field = (JavaField*)fieldID; JavaObject* o = (JavaObject*)obj; - return (sint64)field->getVirtualLongField(o); + return (sint64)field->getLongField(o); END_EXCEPTION return 0; @@ -938,7 +941,7 @@ JavaField* field = (JavaField*)fieldID; JavaObject* o = (JavaObject*)obj; - return field->getVirtualFloatField(o); + return field->getFloatField(o); END_EXCEPTION return 0; @@ -951,7 +954,7 @@ JavaField* field = (JavaField*)fieldID; JavaObject* o = (JavaObject*)obj; - return (jdouble)field->getVirtualDoubleField(o); + return (jdouble)field->getDoubleField(o); END_EXCEPTION return 0; @@ -964,7 +967,7 @@ JavaField* field = (JavaField*)fieldID; JavaObject* o = (JavaObject*)obj; - field->setVirtualObjectField(o, (JavaObject*)value); + field->setObjectField(o, (JavaObject*)value); END_EXCEPTION } @@ -977,7 +980,7 @@ JavaField* field = (JavaField*)fieldID; JavaObject* o = (JavaObject*)obj; - field->setVirtualInt8Field(o, (uint8)value); + field->setInt8Field(o, (uint8)value); END_EXCEPTION } @@ -989,7 +992,7 @@ JavaField* field = (JavaField*)fieldID; JavaObject* o = (JavaObject*)obj; - field->setVirtualInt8Field(o, (uint8)value); + field->setInt8Field(o, (uint8)value); END_EXCEPTION } @@ -1001,7 +1004,7 @@ JavaField* field = (JavaField*)fieldID; JavaObject* o = (JavaObject*)obj; - field->setVirtualInt16Field(o, (uint16)value); + field->setInt16Field(o, (uint16)value); END_EXCEPTION } @@ -1013,7 +1016,7 @@ JavaField* field = (JavaField*)fieldID; JavaObject* o = (JavaObject*)obj; - field->setVirtualInt16Field(o, (sint16)value); + field->setInt16Field(o, (sint16)value); END_EXCEPTION } @@ -1025,7 +1028,7 @@ JavaField* field = (JavaField*)fieldID; JavaObject* o = (JavaObject*)obj; - field->setVirtualInt32Field(o, (sint32)value); + field->setInt32Field(o, (sint32)value); END_EXCEPTION } @@ -1037,7 +1040,7 @@ JavaField* field = (JavaField*)fieldID; JavaObject* o = (JavaObject*)obj; - field->setVirtualLongField(o, (sint64)value); + field->setLongField(o, (sint64)value); END_EXCEPTION } @@ -1049,7 +1052,7 @@ JavaField* field = (JavaField*)fieldID; JavaObject* o = (JavaObject*)obj; - field->setVirtualFloatField(o, (float)value); + field->setFloatField(o, (float)value); END_EXCEPTION } @@ -1061,7 +1064,7 @@ JavaField* field = (JavaField*)fieldID; JavaObject* o = (JavaObject*)obj; - field->setVirtualDoubleField(o, (float)value); + field->setDoubleField(o, (float)value); END_EXCEPTION } @@ -1073,7 +1076,7 @@ BEGIN_EXCEPTION // TODO: find a better place to store the UTF8 - CommonClass* cl = NativeUtil::resolvedImplClass(clazz, true); + UserCommonClass* cl = NativeUtil::resolvedImplClass(clazz, true); const UTF8* name = cl->classLoader->asciizConstructUTF8(aname); const UTF8* type = cl->classLoader->asciizConstructUTF8(atype); JavaMethod* meth = cl->lookupMethod( @@ -1323,7 +1326,7 @@ BEGIN_EXCEPTION // TODO: find a better place to store the UTF8 - CommonClass* cl = NativeUtil::resolvedImplClass(clazz, true); + UserCommonClass* cl = NativeUtil::resolvedImplClass(clazz, true); return (jfieldID) cl->lookupField(cl->classLoader->asciizConstructUTF8(name), cl->classLoader->asciizConstructUTF8(sig), true, true); @@ -1338,7 +1341,9 @@ BEGIN_EXCEPTION JavaField* field = (JavaField*)fieldID; - return (jobject)field->getStaticObjectField(); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); + JavaObject* Stat = cl->getStaticInstance(); + return (jobject)field->getObjectField(Stat); END_EXCEPTION return 0; @@ -1350,7 +1355,9 @@ BEGIN_EXCEPTION JavaField* field = (JavaField*)fieldID; - return (jboolean)field->getStaticInt8Field(); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); + JavaObject* Stat = cl->getStaticInstance(); + return (jboolean)field->getInt8Field(Stat); END_EXCEPTION return 0; @@ -1362,7 +1369,9 @@ BEGIN_EXCEPTION JavaField* field = (JavaField*)fieldID; - return (jbyte)field->getStaticInt8Field(); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); + JavaObject* Stat = cl->getStaticInstance(); + return (jbyte)field->getInt8Field(Stat); END_EXCEPTION return 0; @@ -1374,7 +1383,9 @@ BEGIN_EXCEPTION JavaField* field = (JavaField*)fieldID; - return (jchar)field->getStaticInt16Field(); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); + JavaObject* Stat = cl->getStaticInstance(); + return (jchar)field->getInt16Field(Stat); END_EXCEPTION return 0; @@ -1386,7 +1397,9 @@ BEGIN_EXCEPTION JavaField* field = (JavaField*)fieldID; - return (jshort)field->getStaticInt16Field(); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); + JavaObject* Stat = cl->getStaticInstance(); + return (jshort)field->getInt16Field(Stat); END_EXCEPTION return 0; @@ -1398,7 +1411,9 @@ BEGIN_EXCEPTION JavaField* field = (JavaField*)fieldID; - return (jint)field->getStaticInt32Field(); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); + JavaObject* Stat = cl->getStaticInstance(); + return (jint)field->getInt32Field(Stat); END_EXCEPTION return 0; @@ -1410,7 +1425,9 @@ BEGIN_EXCEPTION JavaField* field = (JavaField*)fieldID; - return (jlong)field->getStaticLongField(); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); + JavaObject* Stat = cl->getStaticInstance(); + return (jlong)field->getLongField(Stat); END_EXCEPTION return 0; @@ -1422,7 +1439,9 @@ BEGIN_EXCEPTION JavaField* field = (JavaField*)fieldID; - return (jfloat)field->getStaticFloatField(); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); + JavaObject* Stat = cl->getStaticInstance(); + return (jfloat)field->getFloatField(Stat); END_EXCEPTION return 0; @@ -1434,7 +1453,9 @@ BEGIN_EXCEPTION JavaField* field = (JavaField*)fieldID; - return (jdouble)field->getStaticDoubleField(); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); + JavaObject* Stat = cl->getStaticInstance(); + return (jdouble)field->getDoubleField(Stat); END_EXCEPTION return 0; @@ -1447,7 +1468,9 @@ BEGIN_EXCEPTION JavaField* field = (JavaField*)fieldID; - field->setStaticObjectField((JavaObject*)value); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); + JavaObject* Stat = cl->getStaticInstance(); + field->setObjectField(Stat, (JavaObject*)value); END_EXCEPTION } @@ -1459,7 +1482,9 @@ BEGIN_EXCEPTION JavaField* field = (JavaField*)fieldID; - field->setStaticInt8Field((uint8)value); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); + JavaObject* Stat = cl->getStaticInstance(); + field->setInt8Field(Stat, (uint8)value); END_EXCEPTION } @@ -1471,7 +1496,9 @@ BEGIN_EXCEPTION JavaField* field = (JavaField*)fieldID; - field->setStaticInt8Field((sint8)value); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); + JavaObject* Stat = cl->getStaticInstance(); + field->setInt8Field(Stat, (sint8)value); END_EXCEPTION } @@ -1483,7 +1510,9 @@ BEGIN_EXCEPTION JavaField* field = (JavaField*)fieldID; - field->setStaticInt16Field((uint16)value); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); + JavaObject* Stat = cl->getStaticInstance(); + field->setInt16Field(Stat, (uint16)value); END_EXCEPTION } @@ -1495,7 +1524,9 @@ BEGIN_EXCEPTION JavaField* field = (JavaField*)fieldID; - field->setStaticInt16Field((sint16)value); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); + JavaObject* Stat = cl->getStaticInstance(); + field->setInt16Field(Stat, (sint16)value); END_EXCEPTION } @@ -1507,7 +1538,9 @@ BEGIN_EXCEPTION JavaField* field = (JavaField*)fieldID; - field->setStaticInt32Field((sint32)value); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); + JavaObject* Stat = cl->getStaticInstance(); + field->setInt32Field(Stat, (sint32)value); END_EXCEPTION } @@ -1519,7 +1552,9 @@ BEGIN_EXCEPTION JavaField* field = (JavaField*)fieldID; - field->setStaticLongField((sint64)value); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); + JavaObject* Stat = cl->getStaticInstance(); + field->setLongField(Stat, (sint64)value); END_EXCEPTION } @@ -1531,7 +1566,9 @@ BEGIN_EXCEPTION JavaField* field = (JavaField*)fieldID; - field->setStaticFloatField((float)value); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); + JavaObject* Stat = cl->getStaticInstance(); + field->setFloatField(Stat, (float)value); END_EXCEPTION } @@ -1543,7 +1580,9 @@ BEGIN_EXCEPTION JavaField* field = (JavaField*)fieldID; - field->setStaticDoubleField((double)value); + UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); + JavaObject* Stat = cl->getStaticInstance(); + field->setDoubleField(Stat, (double)value); END_EXCEPTION } @@ -1624,11 +1663,11 @@ Jnjvm* vm = NativeUtil::myVM(env); if (length < 0) vm->negativeArraySizeException(length); - CommonClass* base = NativeUtil::resolvedImplClass(elementClass, true); + UserCommonClass* base = NativeUtil::resolvedImplClass(elementClass, true); JnjvmClassLoader* loader = base->classLoader; const UTF8* name = base->name; const UTF8* arrayName = AssessorDesc::constructArrayName(loader, 0, 1, name); - ClassArray* array = loader->constructArray(arrayName); + UserClassArray* array = loader->constructArray(arrayName); ArrayObject* res = ArrayObject::acons(length, array, &(vm->allocator)); if (initialElement) { memset(res->elements, (int)initialElement, @@ -1673,7 +1712,9 @@ BEGIN_EXCEPTION ArrayUInt8* res = 0; - res = ArrayUInt8::acons(len, JavaArray::ofBool, &NativeUtil::myVM(env)->allocator); + Jnjvm* vm = NativeUtil::myVM(env); + res = ArrayUInt8::acons(len, vm->bootstrapLoader->upcalls->ArrayOfBool, + &vm->allocator); return (jbooleanArray)res; END_EXCEPTION @@ -1686,7 +1727,9 @@ BEGIN_EXCEPTION ArraySInt8* res = 0; - res = ArraySInt8::acons(len, JavaArray::ofByte, &NativeUtil::myVM(env)->allocator); + Jnjvm* vm = NativeUtil::myVM(env); + res = ArraySInt8::acons(len, vm->bootstrapLoader->upcalls->ArrayOfByte, + &vm->allocator); return (jbyteArray) res; END_EXCEPTION @@ -1699,7 +1742,9 @@ BEGIN_EXCEPTION ArrayUInt16* res = 0; - res = ArrayUInt16::acons(len, JavaArray::ofChar, &NativeUtil::myVM(env)->allocator); + Jnjvm* vm = NativeUtil::myVM(env); + res = ArrayUInt16::acons(len, vm->bootstrapLoader->upcalls->ArrayOfChar, + &vm->allocator); return (jcharArray) res; END_EXCEPTION @@ -1712,7 +1757,9 @@ BEGIN_EXCEPTION ArraySInt16* res = 0; - res = ArraySInt16::acons(len, JavaArray::ofShort, &NativeUtil::myVM(env)->allocator); + Jnjvm* vm = NativeUtil::myVM(env); + res = ArraySInt16::acons(len, vm->bootstrapLoader->upcalls->ArrayOfShort, + &vm->allocator); return (jshortArray) res; END_EXCEPTION @@ -1725,7 +1772,9 @@ BEGIN_EXCEPTION ArraySInt32* res = 0; - res = ArraySInt32::acons(len, JavaArray::ofInt, &NativeUtil::myVM(env)->allocator); + Jnjvm* vm = NativeUtil::myVM(env); + res = ArraySInt32::acons(len, vm->bootstrapLoader->upcalls->ArrayOfInt, + &vm->allocator); return (jintArray) res; END_EXCEPTION @@ -1738,7 +1787,9 @@ BEGIN_EXCEPTION ArrayLong* res = 0; - res = ArrayLong::acons(len, JavaArray::ofLong, &NativeUtil::myVM(env)->allocator); + Jnjvm* vm = NativeUtil::myVM(env); + res = ArrayLong::acons(len, vm->bootstrapLoader->upcalls->ArrayOfLong, + &vm->allocator); return (jlongArray) res; END_EXCEPTION @@ -1751,7 +1802,9 @@ BEGIN_EXCEPTION ArrayFloat* res = 0; - res = ArrayFloat::acons(len, JavaArray::ofFloat, &NativeUtil::myVM(env)->allocator); + Jnjvm* vm = NativeUtil::myVM(env); + res = ArrayFloat::acons(len, vm->bootstrapLoader->upcalls->ArrayOfFloat, + &vm->allocator); return (jfloatArray) res; END_EXCEPTION @@ -1764,7 +1817,9 @@ BEGIN_EXCEPTION ArrayDouble* res = 0; - res = ArrayDouble::acons(len, JavaArray::ofDouble, &NativeUtil::myVM(env)->allocator); + Jnjvm* vm = NativeUtil::myVM(env); + res = ArrayDouble::acons(len, vm->bootstrapLoader->upcalls->ArrayOfDouble, + &vm->allocator); return (jdoubleArray) res; END_EXCEPTION @@ -2143,10 +2198,11 @@ BEGIN_EXCEPTION + Jnjvm* vm = NativeUtil::myVM(env); JavaObject* buf = (JavaObject*)_buf; - JavaObject* address = Classpath::bufferAddress->getVirtualObjectField(buf); + JavaObject* address = vm->upcalls->bufferAddress->getObjectField(buf); if (address != 0) { - int res = Classpath::dataPointer32->getVirtualInt32Field(address); + int res = vm->upcalls->dataPointer32->getInt32Field(address); return (void*)res; } else { return 0; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp Tue Aug 26 04:30:54 2008 @@ -87,49 +87,45 @@ typedef void (*clinit_t)(Jnjvm* vm); -void Jnjvm::initialiseClass(CommonClass* cl) { - JavaState* status = cl->getStatus(); +void CommonClass::initialiseClass(Jnjvm* vm) { // Primitives are initialized at boot time - if (cl->isArray) { - *status = ready; - } else if (!(*status == ready)) { - cl->acquire(); - JavaState* status = cl->getStatus(); - if (*status == ready) { - cl->release(); - } else if (*status >= resolved && *status != clinitParent && - *status != inClinit) { - *status = clinitParent; - cl->release(); - if (cl->super) { - initialiseClass(cl->super); + if (isArray()) { + status = ready; + } else if (status != ready) { + acquire(); + if (status == ready) { + release(); + } else if (status >= resolved && status != clinitParent && + status != inClinit) { + status = clinitParent; + release(); + if (super) { + super->initialiseClass(vm); } - cl->classLoader->TheModule->resolveStaticClass((Class*)cl); + classLoader->TheModule->resolveStaticClass((Class*)this); - *status = inClinit; - JavaMethod* meth = cl->lookupMethodDontThrow(clinitName, clinitType, true, - false); + status = inClinit; + JavaMethod* meth = lookupMethodDontThrow(Jnjvm::clinitName, + Jnjvm::clinitType, true, + false); PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "; ", 0); PRINT_DEBUG(JNJVM_LOAD, 0, LIGHT_GREEN, "clinit ", 0); - PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "%s::%s\n", printString(), - cl->printString()); - - ((Class*)cl)->createStaticInstance(); + PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "%s\n", printString()); if (meth) { JavaObject* exc = 0; try{ clinit_t pred = (clinit_t)(intptr_t)meth->compiledPtr(); - pred(JavaThread::get()->isolate); + pred(vm); } catch(...) { exc = JavaThread::getJavaException(); assert(exc && "no exception?"); JavaThread::clearException(); } if (exc) { - if (exc->classOf->isAssignableFrom(Classpath::newException)) { + if (exc->classOf->isAssignableFrom(vm->upcalls->newException)) { JavaThread::get()->isolate->initializerError(exc); } else { JavaThread::throwException(exc); @@ -137,18 +133,18 @@ } } - *status = ready; - cl->broadcastClass(); - } else if (*status < resolved) { - cl->release(); - unknownError("try to clinit a not-read class..."); + status = ready; + broadcastClass(); + } else if (status < resolved) { + release(); + vm->unknownError("try to clinit a not-read class..."); } else { - if (!cl->ownerClass()) { - while (*status < ready) cl->waitClass(); - cl->release(); - initialiseClass(cl); + if (!ownerClass()) { + while (status < ready) waitClass(); + release(); + initialiseClass(vm); } - cl->release(); + release(); } } } @@ -173,18 +169,18 @@ } void Jnjvm::arrayStoreException() { - error(Classpath::ArrayStoreException, - Classpath::InitArrayStoreException, ""); + error(upcalls->ArrayStoreException, + upcalls->InitArrayStoreException, ""); } void Jnjvm::indexOutOfBounds(const JavaObject* obj, sint32 entry) { - error(Classpath::ArrayIndexOutOfBoundsException, - Classpath::InitArrayIndexOutOfBoundsException, "%d", entry); + error(upcalls->ArrayIndexOutOfBoundsException, + upcalls->InitArrayIndexOutOfBoundsException, "%d", entry); } void Jnjvm::negativeArraySizeException(sint32 size) { - error(Classpath::NegativeArraySizeException, - Classpath::InitNegativeArraySizeException, "%d", size); + error(upcalls->NegativeArraySizeException, + upcalls->InitNegativeArraySizeException, "%d", size); } void Jnjvm::nullPointerException(const char* fmt, ...) { @@ -192,115 +188,115 @@ va_start(ap, fmt); char* val = va_arg(ap, char*); va_end(ap); - error(Classpath::NullPointerException, - Classpath::InitNullPointerException, fmt, val); + error(upcalls->NullPointerException, + upcalls->InitNullPointerException, fmt, val); } void Jnjvm::illegalAccessException(const char* msg) { - error(Classpath::IllegalAccessException, - Classpath::InitIllegalAccessException, msg); + error(upcalls->IllegalAccessException, + upcalls->InitIllegalAccessException, msg); } void Jnjvm::illegalMonitorStateException(const JavaObject* obj) { - error(Classpath::IllegalMonitorStateException, - Classpath::InitIllegalMonitorStateException, ""); + error(upcalls->IllegalMonitorStateException, + upcalls->InitIllegalMonitorStateException, ""); } void Jnjvm::interruptedException(const JavaObject* obj) { - error(Classpath::InterruptedException, - Classpath::InitInterruptedException, ""); + error(upcalls->InterruptedException, + upcalls->InitInterruptedException, ""); } void Jnjvm::initializerError(const JavaObject* excp) { - errorWithExcp(Classpath::ExceptionInInitializerError, - Classpath::ErrorWithExcpExceptionInInitializerError, + errorWithExcp(upcalls->ExceptionInInitializerError, + upcalls->ErrorWithExcpExceptionInInitializerError, excp); } void Jnjvm::invocationTargetException(const JavaObject* excp) { - errorWithExcp(Classpath::InvocationTargetException, - Classpath::ErrorWithExcpInvocationTargetException, + errorWithExcp(upcalls->InvocationTargetException, + upcalls->ErrorWithExcpInvocationTargetException, excp); } void Jnjvm::outOfMemoryError(sint32 n) { - error(Classpath::OutOfMemoryError, - Classpath::InitOutOfMemoryError, "%d", n); + error(upcalls->OutOfMemoryError, + upcalls->InitOutOfMemoryError, "%d", n); } void Jnjvm::illegalArgumentExceptionForMethod(JavaMethod* meth, - CommonClass* required, - CommonClass* given) { - error(Classpath::IllegalArgumentException, - Classpath::InitIllegalArgumentException, + UserCommonClass* required, + UserCommonClass* given) { + error(upcalls->IllegalArgumentException, + upcalls->InitIllegalArgumentException, "for method %s", meth->printString()); } void Jnjvm::illegalArgumentExceptionForField(JavaField* field, - CommonClass* required, - CommonClass* given) { - error(Classpath::IllegalArgumentException, - Classpath::InitIllegalArgumentException, + UserCommonClass* required, + UserCommonClass* given) { + error(upcalls->IllegalArgumentException, + upcalls->InitIllegalArgumentException, "for field %s", field->printString()); } void Jnjvm::illegalArgumentException(const char* msg) { - error(Classpath::IllegalArgumentException, - Classpath::InitIllegalArgumentException, + error(upcalls->IllegalArgumentException, + upcalls->InitIllegalArgumentException, msg); } void Jnjvm::classCastException(const char* msg) { - error(Classpath::ClassCastException, - Classpath::InitClassCastException, + error(upcalls->ClassCastException, + upcalls->InitClassCastException, msg); } void Jnjvm::noSuchFieldError(CommonClass* cl, const UTF8* name) { - error(Classpath::NoSuchFieldError, - Classpath::InitNoSuchFieldError, + error(upcalls->NoSuchFieldError, + upcalls->InitNoSuchFieldError, "unable to find %s in %s", name->printString(), cl->printString()); } void Jnjvm::noSuchMethodError(CommonClass* cl, const UTF8* name) { - error(Classpath::NoSuchMethodError, - Classpath::InitNoSuchMethodError, + error(upcalls->NoSuchMethodError, + upcalls->InitNoSuchMethodError, "unable to find %s in %s", name->printString(), cl->printString()); } void Jnjvm::classFormatError(const char* msg, ...) { - error(Classpath::ClassFormatError, - Classpath::InitClassFormatError, + error(upcalls->ClassFormatError, + upcalls->InitClassFormatError, msg); } void Jnjvm::noClassDefFoundError(JavaObject* obj) { - errorWithExcp(Classpath::NoClassDefFoundError, - Classpath::ErrorWithExcpNoClassDefFoundError, + errorWithExcp(upcalls->NoClassDefFoundError, + upcalls->ErrorWithExcpNoClassDefFoundError, obj); } void Jnjvm::noClassDefFoundError(const char* fmt, ...) { - error(Classpath::NoClassDefFoundError, - Classpath::InitNoClassDefFoundError, + error(upcalls->NoClassDefFoundError, + upcalls->InitNoClassDefFoundError, fmt); } void Jnjvm::classNotFoundException(JavaString* str) { - error(Classpath::ClassNotFoundException, - Classpath::InitClassNotFoundException, + error(upcalls->ClassNotFoundException, + upcalls->InitClassNotFoundException, "unable to load %s", str->strToAsciiz()); } void Jnjvm::unknownError(const char* fmt, ...) { - error(Classpath::UnknownError, - Classpath::InitUnknownError, + error(upcalls->UnknownError, + upcalls->InitUnknownError, fmt); } @@ -312,8 +308,7 @@ JavaString* Jnjvm::asciizToStr(const char* asciiz) { // asciizToStr is called by jnjvm code, so utf8s created // by this method are stored in the bootstrap class loader - JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; - const UTF8* var = JCL->asciizConstructUTF8(asciiz); + const UTF8* var = bootstrapLoader->asciizConstructUTF8(asciiz); return UTF8ToStr(var); } @@ -321,41 +316,22 @@ postProperties.push_back(std::make_pair(key, value)); } -#ifndef MULTIPLE_VM -JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl, JavaObject* pd) { - cl->acquire(); - if (!(cl->delegatee)) { - JavaObject* delegatee = Classpath::newClass->doNew(this); - cl->delegatee = delegatee; - if (!pd) { - Classpath::initClass->invokeIntSpecial(this, delegatee, cl); - } else { - Classpath::initClassWithProtectionDomain->invokeIntSpecial(this, - delegatee, - cl, pd); - } - } - cl->release(); - return cl->delegatee; -} -#else -JavaObject* Jnjvm::getClassDelegatee(CommonClass* cl, JavaObject* pd) { - cl->acquire(); - JavaObject* val = delegatees->lookup(cl); - if (!val) { - val = Classpath::newClass->doNew(this); - delegatees->hash(cl, val); +JavaObject* CommonClass::getClassDelegatee(Jnjvm* vm, JavaObject* pd) { + acquire(); + if (!(delegatee)) { + JavaObject* delegatee = vm->upcalls->newClass->doNew(vm); if (!pd) { - Classpath::initClass->invokeIntSpecial(this, val, cl); + vm->upcalls->initClass->invokeIntSpecial(vm, delegatee, this); } else { - Classpath::initClassWithProtectionDomain->invokeIntSpecial(this, val, cl, - pd); + vm->upcalls->initClassWithProtectionDomain->invokeIntSpecial(vm, + delegatee, + this, pd); } + this->delegatee = delegatee; } - cl->release(); - return val; + release(); + return delegatee; } -#endif Jnjvm::~Jnjvm() { #ifdef MULTIPLE_GC @@ -455,7 +431,8 @@ if (archive.getOfscd() != -1) { ZipFile* file = archive.getFile(PATH_MANIFEST); if (file) { - ArrayUInt8* res = ArrayUInt8::acons(file->ucsize, JavaArray::ofByte, &vm->allocator); + ClassArray* array = vm->bootstrapLoader->upcalls->ArrayOfByte; + ArrayUInt8* res = ArrayUInt8::acons(file->ucsize, array, &vm->allocator); int ok = archive.readFile(res, file); if (ok) { char* mainClass = findInformation(res, MAIN_CLASS, LENGTH_MAIN_CLASS); @@ -654,71 +631,71 @@ JnjvmClassLoader* Jnjvm::loadAppClassLoader() { if (appClassLoader == 0) { - JavaObject* loader = Classpath::getSystemClassLoader->invokeJavaObjectStatic(this); + JavaObject* loader = upcalls->getSystemClassLoader->invokeJavaObjectStatic(this); appClassLoader = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader); } return appClassLoader; } void Jnjvm::mapInitialThread() { - Classpath::mapInitialThread(this); + upcalls->mapInitialThread(this); } void Jnjvm::loadBootstrap() { JnjvmClassLoader* loader = JnjvmClassLoader::bootstrapLoader; #define LOAD_CLASS(cl) \ cl->resolveClass(); \ - initialiseClass(cl); + cl->initialiseClass(this); - LOAD_CLASS(Classpath::newClass); - LOAD_CLASS(Classpath::newConstructor); - LOAD_CLASS(Classpath::newString); - LOAD_CLASS(Classpath::newMethod); - LOAD_CLASS(Classpath::newField); - LOAD_CLASS(Classpath::newStackTraceElement); - LOAD_CLASS(Classpath::newVMThrowable); - LOAD_CLASS(Classpath::InvocationTargetException); - LOAD_CLASS(Classpath::ArrayStoreException); - LOAD_CLASS(Classpath::ClassCastException); - LOAD_CLASS(Classpath::IllegalMonitorStateException); - LOAD_CLASS(Classpath::IllegalArgumentException); - LOAD_CLASS(Classpath::InterruptedException); - LOAD_CLASS(Classpath::IndexOutOfBoundsException); - LOAD_CLASS(Classpath::ArrayIndexOutOfBoundsException); - LOAD_CLASS(Classpath::NegativeArraySizeException); - LOAD_CLASS(Classpath::NullPointerException); - LOAD_CLASS(Classpath::SecurityException); - LOAD_CLASS(Classpath::ClassFormatError); - LOAD_CLASS(Classpath::ClassCircularityError); - LOAD_CLASS(Classpath::NoClassDefFoundError); - LOAD_CLASS(Classpath::UnsupportedClassVersionError); - LOAD_CLASS(Classpath::NoSuchFieldError); - LOAD_CLASS(Classpath::NoSuchMethodError); - LOAD_CLASS(Classpath::InstantiationError); - LOAD_CLASS(Classpath::IllegalAccessError); - LOAD_CLASS(Classpath::IllegalAccessException); - LOAD_CLASS(Classpath::VerifyError); - LOAD_CLASS(Classpath::ExceptionInInitializerError); - LOAD_CLASS(Classpath::LinkageError); - LOAD_CLASS(Classpath::AbstractMethodError); - LOAD_CLASS(Classpath::UnsatisfiedLinkError); - LOAD_CLASS(Classpath::InternalError); - LOAD_CLASS(Classpath::OutOfMemoryError); - LOAD_CLASS(Classpath::StackOverflowError); - LOAD_CLASS(Classpath::UnknownError); - LOAD_CLASS(Classpath::ClassNotFoundException); + LOAD_CLASS(upcalls->newClass); + LOAD_CLASS(upcalls->newConstructor); + LOAD_CLASS(upcalls->newString); + LOAD_CLASS(upcalls->newMethod); + LOAD_CLASS(upcalls->newField); + LOAD_CLASS(upcalls->newStackTraceElement); + LOAD_CLASS(upcalls->newVMThrowable); + LOAD_CLASS(upcalls->InvocationTargetException); + LOAD_CLASS(upcalls->ArrayStoreException); + LOAD_CLASS(upcalls->ClassCastException); + LOAD_CLASS(upcalls->IllegalMonitorStateException); + LOAD_CLASS(upcalls->IllegalArgumentException); + LOAD_CLASS(upcalls->InterruptedException); + LOAD_CLASS(upcalls->IndexOutOfBoundsException); + LOAD_CLASS(upcalls->ArrayIndexOutOfBoundsException); + LOAD_CLASS(upcalls->NegativeArraySizeException); + LOAD_CLASS(upcalls->NullPointerException); + LOAD_CLASS(upcalls->SecurityException); + LOAD_CLASS(upcalls->ClassFormatError); + LOAD_CLASS(upcalls->ClassCircularityError); + LOAD_CLASS(upcalls->NoClassDefFoundError); + LOAD_CLASS(upcalls->UnsupportedClassVersionError); + LOAD_CLASS(upcalls->NoSuchFieldError); + LOAD_CLASS(upcalls->NoSuchMethodError); + LOAD_CLASS(upcalls->InstantiationError); + LOAD_CLASS(upcalls->IllegalAccessError); + LOAD_CLASS(upcalls->IllegalAccessException); + LOAD_CLASS(upcalls->VerifyError); + LOAD_CLASS(upcalls->ExceptionInInitializerError); + LOAD_CLASS(upcalls->LinkageError); + LOAD_CLASS(upcalls->AbstractMethodError); + LOAD_CLASS(upcalls->UnsatisfiedLinkError); + LOAD_CLASS(upcalls->InternalError); + LOAD_CLASS(upcalls->OutOfMemoryError); + LOAD_CLASS(upcalls->StackOverflowError); + LOAD_CLASS(upcalls->UnknownError); + LOAD_CLASS(upcalls->ClassNotFoundException); #undef LOAD_CLASS mapInitialThread(); loadAppClassLoader(); JavaObject* obj = JavaThread::currentThread(); - Classpath::setContextClassLoader->invokeIntSpecial(this, obj, + upcalls->setContextClassLoader->invokeIntSpecial(this, obj, appClassLoader->getJavaClassLoader()); // load and initialise math since it is responsible for dlopen'ing // libjavalang.so and we are optimizing some math operations CommonClass* math = loader->loadName(loader->asciizConstructUTF8("java/lang/Math"), true, true); - initialiseClass(math); + math->initialiseClass(this); } void Jnjvm::executeClass(const char* className, ArrayObject* args) { @@ -733,9 +710,9 @@ JavaThread::clearException(); JavaObject* obj = JavaThread::currentThread(); JavaObject* group = - Classpath::group->getVirtualObjectField(obj); + upcalls->group->getObjectField(obj); try{ - Classpath::uncaughtException->invokeIntSpecial(this, group, obj, + upcalls->uncaughtException->invokeIntSpecial(this, group, obj, exc); }catch(...) { printf("Even uncaught exception throwed an exception!\n"); @@ -789,9 +766,9 @@ executePremain(i->first, args, instrumenter); } } - - ArrayObject* args = ArrayObject::acons(argc - 2, JavaArray::ofString, - &allocator); + + ClassArray* array = bootstrapLoader->upcalls->ArrayOfString; + ArrayObject* args = ArrayObject::acons(argc - 2, array, &allocator); for (int i = 2; i < argc; ++i) { args->elements[i - 2] = (JavaObject*)asciizToStr(argv[i]); } @@ -839,10 +816,8 @@ isolate->hashStr = new StringMap(); isolate->globalRefsLock = mvm::Lock::allocNormal(); -#ifdef MULTIPLE_VM - isolate->statics = allocator_new(&isolate->allocator, StaticInstanceMap)(); - isolate->delegatees = allocator_new(&isolate->allocator, DelegateeMap)(); -#endif + isolate->bootstrapLoader = JnjvmClassLoader::bootstrapLoader; + isolate->upcalls = isolate->bootstrapLoader->upcalls; return isolate; } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h Tue Aug 26 04:30:54 2008 @@ -21,20 +21,24 @@ #include "mvm/Threads/Locks.h" #include "JavaAllocator.h" +#include "JavaTypes.h" namespace jnjvm { class ArrayObject; class ArrayUInt8; class Attribut; -class Class; -class ClassArray; -class CommonClass; +class UserClass; +class UserClassArray; +class Classpath; +class UserCommonClass; +class UserClassPrimitive; class JavaField; class JavaMethod; class JavaObject; class JavaString; class JavaThread; +class JnjvmBootstrapLoader; class JnjvmClassLoader; class JnjvmModule; class JnjvmModuleProvider; @@ -113,11 +117,11 @@ /// that calls this functions. This is used internally by Jnjvm to control /// which pair class/method are used. /// - void error(Class* cl, JavaMethod* meth, const char* fmt, ...); + void error(UserClass* cl, JavaMethod* meth, const char* fmt, ...); /// errorWithExcp - Throws an exception whose cause is the Java object excp. /// - void errorWithExcp(Class* cl, JavaMethod* meth, const JavaObject* excp); + void errorWithExcp(UserClass* cl, JavaMethod* meth, const JavaObject* excp); /// loadAppClassLoader - Loads the application class loader, so that VMKit /// knowns which loader has to load the main class. @@ -222,6 +226,15 @@ Collector* GC; #endif + /// bootstraLoader - Bootstrap loader for base classes of this virtual + /// machine. + /// + JnjvmBootstrapLoader* bootstrapLoader; + + /// upcalls - Upcalls to call Java methods and access Java fields. + /// + Classpath* upcalls; + /// threadSystem - The thread system to manage non-daemon threads and /// control the end of the JVM's execution. /// @@ -274,18 +287,6 @@ /// StringMap * hashStr; -#ifdef MULTIPLE_VM - /// statics - The static instances of classes, in a multi-vm environment. - /// - StaticInstanceMap* statics; - -private: - /// delegatees - The java/lang/Class equivalents of internal classes. This is - /// also in a multi-vm environment. - /// - DelegateeMap* delegatees; -#endif - public: /// Exceptions - These are the only exceptions VMKit will make. /// @@ -299,26 +300,20 @@ void initializerError(const JavaObject* excp); void invocationTargetException(const JavaObject* obj); void outOfMemoryError(sint32 n); - void illegalArgumentExceptionForMethod(JavaMethod* meth, CommonClass* required, - CommonClass* given); - void illegalArgumentExceptionForField(JavaField* field, CommonClass* required, - CommonClass* given); + void illegalArgumentExceptionForMethod(JavaMethod* meth, UserCommonClass* required, + UserCommonClass* given); + void illegalArgumentExceptionForField(JavaField* field, UserCommonClass* required, + UserCommonClass* given); void illegalArgumentException(const char* msg); void classCastException(const char* msg); void unknownError(const char* fmt, ...); - void noSuchFieldError(CommonClass* cl, const UTF8* name); - void noSuchMethodError(CommonClass* cl, const UTF8* name); + void noSuchFieldError(UserCommonClass* cl, const UTF8* name); + void noSuchMethodError(UserCommonClass* cl, const UTF8* name); void classFormatError(const char* fmt, ...); void noClassDefFoundError(JavaObject* obj); void noClassDefFoundError(const char* fmt, ...); void classNotFoundException(JavaString* str); - - /// initialiseClass - Initialise the class for this JVM, and call the - /// "" function. - /// - void initialiseClass(CommonClass* cl); - /// asciizToStr - Constructs a java/lang/String object from the given asciiz. /// JavaString* asciizToStr(const char* asciiz); @@ -327,11 +322,6 @@ /// JavaString* UTF8ToStr(const UTF8* utf8); - /// getClassDelegatee - Get the java/lang/Class object representing the - /// internal class. - /// - JavaObject* getClassDelegatee(CommonClass* cl, JavaObject* pd = 0); - /// ~Jnjvm - Destroy the JVM. /// ~Jnjvm(); @@ -364,7 +354,14 @@ /// User-visible function, inherited by the VirtualMachine class. /// virtual void runApplication(int argc, char** argv); - + +#ifdef MULTIPLE_VM + UserClassPrimitive* getPrimitiveClass(const AssessorDesc* ass); +#else + UserClassPrimitive* getPrimitiveClass(const AssessorDesc* ass) { + return (UserClassPrimitive*)ass->classType; + } +#endif }; } // end namespace jnjvm Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Tue Aug 26 04:30:54 2008 @@ -14,6 +14,7 @@ #include "debug.h" #include "JavaAllocator.h" +#include "JavaClass.h" #include "JavaConstantPool.h" #include "JavaThread.h" #include "JavaUpcalls.h" @@ -28,10 +29,6 @@ JnjvmBootstrapLoader* JnjvmClassLoader::bootstrapLoader = 0; -#ifdef MULTIPLE_VM -JnjvmSharedLoader* JnjvmClassLoader::sharedLoader = 0; -#endif - extern const char* GNUClasspathGlibj; extern const char* GNUClasspathLibs; @@ -44,7 +41,7 @@ JCL->allocator = new JavaAllocator(); - JCL->hashUTF8 = new UTF8Map(JCL->allocator); + JCL->hashUTF8 = new UTF8Map(JCL->allocator, JCL->upcalls->ArrayOfChar); JCL->classes = allocator_new(allocator, ClassMap)(); JCL->javaTypes = new TypeMap(); JCL->javaSignatures = new SignMap(); @@ -64,25 +61,6 @@ return JCL; } -#ifdef MULTIPLE_VM -JnjvmSharedLoader* JnjvmSharedLoader::createSharedLoader() { - - JnjvmSharedLoader* JCL = gc_new(JnjvmSharedLoader)(); - JCL->TheModule = new JnjvmModule("Bootstrap JnJVM"); - JCL->TheModuleProvider = new JnjvmModuleProvider(JCL->TheModule); - JCL->TheModule->initialise(); - - JCL->allocator = new JavaAllocator(); - - JCL->hashUTF8 = new UTF8Map(JCL->allocator); - JCL->classes = allocator_new(allocator, ClassMap)(); - JCL->javaTypes = new TypeMap(); - JCL->javaSignatures = new SignMap(); - - return JCL; -} -#endif - JnjvmClassLoader::JnjvmClassLoader(JnjvmClassLoader& JCL, JavaObject* loader, Jnjvm* I) { TheModule = JCL.TheModule; TheModuleProvider = JCL.TheModuleProvider; @@ -129,9 +107,9 @@ } -Class* JnjvmBootstrapLoader::internalLoad(const UTF8* name) { +UserClass* JnjvmBootstrapLoader::internalLoad(const UTF8* name) { - CommonClass* cl = lookupClass(name); + UserCommonClass* cl = lookupClass(name); if (!cl) { ArrayUInt8* bytes = openName(name); @@ -140,31 +118,32 @@ } } - if (cl) assert(!cl->isArray); - return (Class*)cl; + if (cl) assert(!cl->isArray()); + return (UserClass*)cl; } -Class* JnjvmClassLoader::internalLoad(const UTF8* name) { - CommonClass* cl = lookupClass(name); +UserClass* JnjvmClassLoader::internalLoad(const UTF8* name) { + UserCommonClass* cl = lookupClass(name); if (!cl) { const UTF8* javaName = name->internalToJava(hashUTF8, 0, name->size); JavaString* str = isolate->UTF8ToStr(javaName); + Classpath* upcalls = bootstrapLoader->upcalls; JavaObject* obj = (JavaObject*) - Classpath::loadInClassLoader->invokeJavaObjectVirtual(isolate, javaLoader, + upcalls->loadInClassLoader->invokeJavaObjectVirtual(isolate, javaLoader, str); - cl = (CommonClass*)(Classpath::vmdataClass->getVirtualObjectField(obj)); + cl = (UserCommonClass*)(upcalls->vmdataClass->getObjectField(obj)); } - if (cl) assert(!cl->isArray); - return (Class*)cl; + if (cl) assert(!cl->isArray()); + return (UserClass*)cl; } -Class* JnjvmClassLoader::loadName(const UTF8* name, bool doResolve, +UserClass* JnjvmClassLoader::loadName(const UTF8* name, bool doResolve, bool doThrow) { - Class* cl = internalLoad(name); + UserClass* cl = internalLoad(name); if (!cl && doThrow) { if (!(name->equals(Jnjvm::NoClassDefFoundError))) { @@ -178,14 +157,14 @@ return cl; } -CommonClass* JnjvmClassLoader::lookupClassFromUTF8(const UTF8* utf8, unsigned int start, +UserCommonClass* JnjvmClassLoader::lookupClassFromUTF8(const UTF8* utf8, unsigned int start, unsigned int len, bool doResolve, bool doThrow) { uint32 origLen = len; const UTF8* name = utf8->javaToInternal(hashUTF8, start, len); bool doLoop = true; - CommonClass* ret = 0; + UserCommonClass* ret = 0; if (len == 0) { return 0; @@ -242,57 +221,44 @@ } } -CommonClass* JnjvmClassLoader::lookupClassFromJavaString(JavaString* str, +UserCommonClass* JnjvmClassLoader::lookupClassFromJavaString(JavaString* str, bool doResolve, bool doThrow) { return lookupClassFromUTF8(str->value, str->offset, str->count, doResolve, doThrow); } -CommonClass* JnjvmClassLoader::lookupClass(const UTF8* utf8) { +UserCommonClass* JnjvmClassLoader::lookupClass(const UTF8* utf8) { return classes->lookup(utf8); } -static CommonClass* arrayDup(const UTF8*& name, JnjvmClassLoader* loader) { - ClassArray* cl = allocator_new(loader->allocator, ClassArray)(loader, name); +static UserCommonClass* arrayDup(const UTF8*& name, JnjvmClassLoader* loader) { + UserClassArray* cl = allocator_new(loader->allocator, UserClassArray)(loader, name); return cl; } -ClassArray* JnjvmClassLoader::constructArray(const UTF8* name) { +UserClassArray* JnjvmClassLoader::constructArray(const UTF8* name) { if (javaLoader != 0) { JnjvmClassLoader * ld = ClassArray::arrayLoader(name, this, 1, name->size - 1); - ClassArray* res = + UserClassArray* res = (ClassArray*)ld->classes->lookupOrCreate(name, this, arrayDup); return res; } else { - return (ClassArray*)classes->lookupOrCreate(name, this, arrayDup); + return (UserClassArray*)classes->lookupOrCreate(name, this, arrayDup); } } -Class* JnjvmSharedLoader::constructSharedClass(const UTF8* name, - ArrayUInt8* bytes) { - - return 0; -} - - -Class* JnjvmClassLoader::constructClass(const UTF8* name, ArrayUInt8* bytes) { +UserClass* JnjvmClassLoader::constructClass(const UTF8* name, ArrayUInt8* bytes) { assert(bytes && "constructing a class without bytes"); -#ifdef MULTIPLE_VM - if (this != bootstrapLoader && this != sharedLoader && bytes) { - Class* cl = sharedLoader->constructSharedClass(name, bytes); - if (cl) return cl; - } -#endif classes->lock->lock(); ClassMap::iterator End = classes->map.end(); ClassMap::iterator I = classes->map.find(name); - Class* res = 0; + UserClass* res = 0; if (I == End) { - res = allocator_new(allocator, Class)(this, name, bytes); + res = allocator_new(allocator, UserClass)(this, name, bytes); classes->map.insert(std::make_pair(name, res)); } else { - res = ((Class*)(I->second)); + res = ((UserClass*)(I->second)); } classes->lock->unlock(); return res; @@ -329,13 +295,14 @@ if (loader == 0) return bootstrapLoader; - + + Classpath* upcalls = bootstrapLoader->upcalls; JnjvmClassLoader* JCL = - (JnjvmClassLoader*)(Classpath::vmdataClassLoader->getVirtualObjectField(loader)); + (JnjvmClassLoader*)(upcalls->vmdataClassLoader->getObjectField(loader)); if (!JCL) { JCL = gc_new(JnjvmClassLoader)(*bootstrapLoader, loader, JavaThread::get()->isolate); - (Classpath::vmdataClassLoader->setVirtualObjectField(loader, (JavaObject*)JCL)); + (upcalls->vmdataClassLoader->setObjectField(loader, (JavaObject*)JCL)); } return JCL; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.h Tue Aug 26 04:30:54 2008 @@ -16,15 +16,19 @@ #include "types.h" #include "mvm/Object.h" +#include "mvm/PrintBuffer.h" + +#include "JnjvmConfig.h" namespace jnjvm { class ArrayUInt8; class Attribut; -class Class; -class ClassArray; +class UserClass; +class UserClassArray; class ClassMap; -class CommonClass; +class Classpath; +class UserCommonClass; class JavaAllocator; class JavaObject; class JavaString; @@ -41,10 +45,6 @@ class UTF8Map; class ZipArchive; -#ifdef MULTIPLE_VM -class JnjvmSharedLoader; -#endif - /// JnjvmClassLoader - Runtime representation of a class loader. It contains /// its own tables (signatures, UTF8, types) which are mapped to a single /// table for non-isolate environments. @@ -64,7 +64,7 @@ /// internalLoad - Load the class with the given name. /// - virtual Class* internalLoad(const UTF8* utf8); + virtual UserClass* internalLoad(const UTF8* utf8); /// JnjvmClassLoader - Allocate a user-defined class loader. Called on /// first use of a Java class loader. @@ -136,33 +136,33 @@ /// loadName - Loads the class of the given name. /// - Class* loadName(const UTF8* name, bool doResolve, bool doThrow); + UserClass* loadName(const UTF8* name, bool doResolve, bool doThrow); /// lookupClassFromUTF8 - Lookup a class from an UTF8 name and load it. /// - CommonClass* lookupClassFromUTF8(const UTF8* utf8, unsigned int start, + UserCommonClass* lookupClassFromUTF8(const UTF8* utf8, unsigned int start, unsigned int len, bool doResolve, bool doThrow); /// lookupClassFromJavaString - Lookup a class from a Java String and load it. /// - CommonClass* lookupClassFromJavaString(JavaString* str, bool doResolve, + UserCommonClass* lookupClassFromJavaString(JavaString* str, bool doResolve, bool doThrow); /// lookupClass - Finds the class of th given name in the class loader's /// table. /// - CommonClass* lookupClass(const UTF8* utf8); + UserCommonClass* lookupClass(const UTF8* utf8); /// constructArray - Hashes a runtime representation of a class with /// the given name. /// - ClassArray* constructArray(const UTF8* name); + UserClassArray* constructArray(const UTF8* name); /// constructClass - Hashes a runtime representation of a class with /// the given name. /// - Class* constructClass(const UTF8* name, ArrayUInt8* bytes); + UserClass* constructClass(const UTF8* name, ArrayUInt8* bytes); /// constructType - Hashes a Typedef, an internal representation of a class /// still not loaded. @@ -187,12 +187,6 @@ /// static JnjvmBootstrapLoader* bootstrapLoader; -#ifdef MULTIPLE_VM - /// sharedLoader - Shared loader when multiple vms are executing. - /// - static JnjvmSharedLoader* sharedLoader; -#endif - /// ~JnjvmClassLoader - Destroy the loader. Depending on the JVM /// configuration, this may destroy the tables, JIT module and /// module provider. @@ -212,33 +206,6 @@ }; -class JnjvmSharedLoader : public JnjvmClassLoader { -private: - - /// internalLoad - Load the class with the given name. - /// - virtual Class* internalLoad(const UTF8* utf8) { - fprintf(stderr, "Don't use me"); - exit(1); - } - -public: - - /// VT - The virtual table of this class. - /// - static VirtualTable* VT; - - - /// constructSharedClass - Create a shared representation of the class. - /// If two classes have the same name but not the same array of bytes, - /// raise an exception. - /// - Class* constructSharedClass(const UTF8* name, ArrayUInt8* bytes); - - static JnjvmSharedLoader* createSharedLoader(); -}; - - /// JnjvmBootstrapLoader - This class is for the bootstrap class loader, which /// loads base classes, ie glibj.zip or rt.jar and -Xbootclasspath. /// @@ -246,7 +213,7 @@ private: /// internalLoad - Load the class with the given name. /// - virtual Class* internalLoad(const UTF8* utf8); + virtual UserClass* internalLoad(const UTF8* utf8); /// bootClasspath - List of paths for the base classes. /// @@ -295,7 +262,10 @@ /// static JnjvmBootstrapLoader* createBootstrapLoader(); - + /// upcalls - Upcall classes, fields and methods so that C++ code can call + /// Java code. + /// + Classpath* upcalls; }; } // end namespace jnjvm Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Tue Aug 26 04:30:54 2008 @@ -164,7 +164,7 @@ Value* LLVMCommonClassInfo::getDelegatee(JavaJIT* jit) { #ifndef MULTIPLE_VM if (!delegateeGV) { - JavaObject* obj = classDef->getClassDelegatee(); + JavaObject* obj = classDef->getClassDelegatee(JavaThread::get()->isolate); Constant* cons = ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64(obj)), JnjvmModule::JavaObjectType); @@ -175,9 +175,8 @@ } return new LoadInst(delegateeGV, "", jit->currentBlock); #else - Value* ld = getVar(jit); - return llvm::CallInst::Create(JnjvmModule::GetClassDelegateeFunction, ld, "", - jit->currentBlock); + fprintf(stderr, "implement me\n"); + abort(); #endif } @@ -409,7 +408,7 @@ const Type* LLVMClassInfo::getStaticType() { if (!staticType) { - Class* cl = (Class*)classDef; + UserClass* cl = (UserClass*)classDef; std::vector fields; JavaField** array = (JavaField**) alloca(sizeof(JavaField*) * (classDef->staticFields.size() + 1)); @@ -446,7 +445,6 @@ cl->staticSize = size; cl->staticVT = VT; -#ifndef MULTIPLE_VM JavaObject* val = (JavaObject*)JavaThread::get()->isolate->allocator.allocateObject(cl->staticSize, cl->staticVT); @@ -458,7 +456,6 @@ } cl->_staticInstance = val; -#endif } return staticType; } @@ -467,7 +464,7 @@ #ifndef MULTIPLE_VM if (!staticVarGV) { getStaticType(); - JavaObject* obj = ((Class*)classDef)->staticInstance(); + JavaObject* obj = ((Class*)classDef)->getStaticInstance(); Constant* cons = ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64_t (obj)), JnjvmModule::JavaObjectType); @@ -481,11 +478,8 @@ return new LoadInst(staticVarGV, "", jit->currentBlock); #else - Value* ld = getVar(jit); - ld = jit->invoke(JnjvmModule::InitialisationCheckFunction, ld, "", - jit->currentBlock); - return jit->invoke(JnjvmModule::GetStaticInstanceFunction, ld, - jit->isolateLocal, "", jit->currentBlock); + fprintf(stderr, "implement me\n"); + abort(); #endif } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h Tue Aug 26 04:30:54 2008 @@ -62,11 +62,9 @@ /// llvm::GlobalVariable* varGV; -#ifndef MULTIPLE_VM /// delegateeGV - The LLVM global variable representing the /// java/lang/Class instance of this class. llvm::GlobalVariable* delegateeGV; -#endif public: @@ -75,10 +73,8 @@ LLVMCommonClassInfo(CommonClass* cl) : classDef(cl), - varGV(0) -#ifndef MULTIPLE_VM - ,delegateeGV(0) -#endif + varGV(0), + delegateeGV(0) {} }; @@ -408,7 +404,7 @@ } static LLVMCommonClassInfo* getClassInfo(CommonClass* cl) { - if (cl->isArray || cl->isPrimitive) { + if (cl->isArray() || cl->isPrimitive()) { return cl->getInfo(); } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Tue Aug 26 04:30:54 2008 @@ -39,7 +39,7 @@ JavaMethod* meth = cl->lookupMethod(utf8, sign->keyName, isStatic, true); if (!isVirtual(meth->access)) - JavaThread::get()->isolate->initialiseClass(cl); + cl->initialiseClass(JavaThread::get()->isolate); meth->compiledPtr(); @@ -99,7 +99,7 @@ "The method's offset is greater than the virtual table size"); ((void**)meth->classDef->virtualVT)[offset] = val; } else { - JavaThread::get()->isolate->initialiseClass(meth->classDef); + meth->classDef->initialiseClass(JavaThread::get()->isolate); } return false; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/LockedMap.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/LockedMap.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/LockedMap.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/LockedMap.cpp Tue Aug 26 04:30:54 2008 @@ -91,7 +91,7 @@ } if (res == 0) { - UTF8* tmp = (UTF8*)UTF8::acons(size, JavaArray::ofChar, allocator); + UTF8* tmp = (UTF8*)UTF8::acons(size, array, allocator); for (sint32 i = 0; i < size; i++) { tmp->elements[i] = asciiz[i]; } @@ -119,7 +119,7 @@ } if (res == 0) { - UTF8* tmp = (UTF8*)UTF8::acons(size, JavaArray::ofChar, allocator); + UTF8* tmp = (UTF8*)UTF8::acons(size, array, allocator); memcpy(tmp->elements, buf, len * sizeof(uint16)); res = (const UTF8*)tmp; map.insert(std::make_pair(key, res)); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/LockedMap.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/LockedMap.h?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/LockedMap.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/LockedMap.h Tue Aug 26 04:30:54 2008 @@ -97,15 +97,17 @@ mvm::Lock* lock; JavaAllocator* allocator; + ClassArray* array; std::multimap map; const UTF8* lookupOrCreateAsciiz(const char* asciiz); const UTF8* lookupOrCreateReader(const uint16* buf, uint32 size); const UTF8* lookupAsciiz(const char* asciiz); const UTF8* lookupReader(const uint16* buf, uint32 size); - UTF8Map(JavaAllocator* A) { + UTF8Map(JavaAllocator* A, ClassArray* cl) { lock = mvm::Lock::allocNormal(); allocator = A; + array = cl; } ~UTF8Map() { @@ -126,7 +128,7 @@ }; class ClassMap : - public LockedMap { + public LockedMap { public: static VirtualTable* VT; @@ -245,41 +247,6 @@ }; -class StaticInstanceMap : - public LockedMap*, std::less, Jnjvm* > { -public: - static VirtualTable* VT; - - StaticInstanceMap() { - lock = mvm::Lock::allocNormal(); - } - - virtual void TRACER; - - ~StaticInstanceMap() { - for (iterator i = map.begin(), e = map.end(); i!= e; ++i) { - delete i->second; - } - delete lock; - } -}; - -class DelegateeMap : - public LockedMap, Jnjvm* > { -public: - static VirtualTable* VT; - - DelegateeMap() { - lock = mvm::Lock::allocNormal(); - } - - ~DelegateeMap() { - delete lock; - } - - virtual void TRACER; -}; - } // end namespace jnjvm #endif Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp Tue Aug 26 04:30:54 2008 @@ -175,7 +175,7 @@ args.begin(), args.end(), "", notEquals); node->addIncoming(cmp, notEquals); BranchInst::Create(ifTrue, notEquals); - } else if (cl->isArray) { + } else if (cl->isArray()) { std::vector args; args.push_back(objCl); args.push_back(CE); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Makefile?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Makefile (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Makefile Tue Aug 26 04:30:54 2008 @@ -9,6 +9,13 @@ LEVEL = ../../.. LIBRARYNAME = JnJVM + +include $(LEVEL)/Makefile.config + include $(LEVEL)/Makefile.common CXX.Flags += -I../LLVMRuntime $(CLASSPATH_FLAGS) + +ifeq ($(ISOLATE_BUILD), 1) + CXX.Flags += -I../Isolate +endif Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.cpp Tue Aug 26 04:30:54 2008 @@ -226,11 +226,13 @@ return res; } -CommonClass* NativeUtil::resolvedImplClass(jclass clazz, bool doClinit) { +UserCommonClass* NativeUtil::resolvedImplClass(jclass clazz, bool doClinit) { + Jnjvm* vm = JavaThread::get()->isolate; JavaObject *Cl = (JavaObject*)clazz; - CommonClass* cl = (CommonClass*)Classpath::vmdataClass->getVirtualObjectField(Cl); + UserCommonClass* cl = + (CommonClass*)vm->upcalls->vmdataClass->getObjectField(Cl); cl->resolveClass(); - if (doClinit) JavaThread::get()->isolate->initialiseClass(cl); + if (doClinit) cl->initialiseClass(vm); return cl; } @@ -258,12 +260,12 @@ if (funcs == AssessorDesc::dShort) { if (value == AssessorDesc::dShort) { - ((uint16*)buf)[0] = Classpath::shortValue->getVirtualInt16Field(obj); + ((uint16*)buf)[0] = vm->upcalls->shortValue->getInt16Field(obj); buf++; return; } else if (value == AssessorDesc::dByte) { ((sint16*)buf)[0] = - (sint16)Classpath::byteValue->getVirtualInt8Field(obj); + (sint16)vm->upcalls->byteValue->getInt8Field(obj); buf++; return; } else { @@ -271,7 +273,7 @@ } } else if (funcs == AssessorDesc::dByte) { if (value == AssessorDesc::dByte) { - ((uint8*)buf)[0] = Classpath::byteValue->getVirtualInt8Field(obj); + ((uint8*)buf)[0] = vm->upcalls->byteValue->getInt8Field(obj); buf++; return; } else { @@ -279,7 +281,7 @@ } } else if (funcs == AssessorDesc::dBool) { if (value == AssessorDesc::dBool) { - ((uint8*)buf)[0] = Classpath::boolValue->getVirtualInt8Field(obj); + ((uint8*)buf)[0] = vm->upcalls->boolValue->getInt8Field(obj); buf++; return; } else { @@ -288,13 +290,13 @@ } else if (funcs == AssessorDesc::dInt) { sint32 val = 0; if (value == AssessorDesc::dInt) { - val = Classpath::intValue->getVirtualInt32Field(obj); + val = vm->upcalls->intValue->getInt32Field(obj); } else if (value == AssessorDesc::dByte) { - val = (sint32)Classpath::byteValue->getVirtualInt8Field(obj); + val = (sint32)vm->upcalls->byteValue->getInt8Field(obj); } else if (value == AssessorDesc::dChar) { - val = (uint32)Classpath::charValue->getVirtualInt16Field(obj); + val = (uint32)vm->upcalls->charValue->getInt16Field(obj); } else if (value == AssessorDesc::dShort) { - val = (sint32)Classpath::shortValue->getVirtualInt16Field(obj); + val = (sint32)vm->upcalls->shortValue->getInt16Field(obj); } else { vm->illegalArgumentException(""); } @@ -304,7 +306,7 @@ } else if (funcs == AssessorDesc::dChar) { uint16 val = 0; if (value == AssessorDesc::dChar) { - val = (uint16)Classpath::charValue->getVirtualInt16Field(obj); + val = (uint16)vm->upcalls->charValue->getInt16Field(obj); } else { vm->illegalArgumentException(""); } @@ -314,17 +316,17 @@ } else if (funcs == AssessorDesc::dFloat) { float val = 0; if (value == AssessorDesc::dFloat) { - val = (float)Classpath::floatValue->getVirtualFloatField(obj); + val = (float)vm->upcalls->floatValue->getFloatField(obj); } else if (value == AssessorDesc::dByte) { - val = (float)(sint32)Classpath::byteValue->getVirtualInt8Field(obj); + val = (float)(sint32)vm->upcalls->byteValue->getInt8Field(obj); } else if (value == AssessorDesc::dChar) { - val = (float)(uint32)Classpath::charValue->getVirtualInt16Field(obj); + val = (float)(uint32)vm->upcalls->charValue->getInt16Field(obj); } else if (value == AssessorDesc::dShort) { - val = (float)(sint32)Classpath::shortValue->getVirtualInt16Field(obj); + val = (float)(sint32)vm->upcalls->shortValue->getInt16Field(obj); } else if (value == AssessorDesc::dInt) { - val = (float)(sint32)Classpath::intValue->getVirtualInt32Field(obj); + val = (float)(sint32)vm->upcalls->intValue->getInt32Field(obj); } else if (value == AssessorDesc::dLong) { - val = (float)Classpath::longValue->getVirtualLongField(obj); + val = (float)vm->upcalls->longValue->getLongField(obj); } else { vm->illegalArgumentException(""); } @@ -334,19 +336,19 @@ } else if (funcs == AssessorDesc::dDouble) { double val = 0; if (value == AssessorDesc::dDouble) { - val = (double)Classpath::doubleValue->getVirtualDoubleField(obj); + val = (double)vm->upcalls->doubleValue->getDoubleField(obj); } else if (value == AssessorDesc::dFloat) { - val = (double)Classpath::floatValue->getVirtualFloatField(obj); + val = (double)vm->upcalls->floatValue->getFloatField(obj); } else if (value == AssessorDesc::dByte) { - val = (double)(sint64)Classpath::byteValue->getVirtualInt8Field(obj); + val = (double)(sint64)vm->upcalls->byteValue->getInt8Field(obj); } else if (value == AssessorDesc::dChar) { - val = (double)(uint64)Classpath::charValue->getVirtualInt16Field(obj); + val = (double)(uint64)vm->upcalls->charValue->getInt16Field(obj); } else if (value == AssessorDesc::dShort) { - val = (double)(sint16)Classpath::shortValue->getVirtualInt16Field(obj); + val = (double)(sint16)vm->upcalls->shortValue->getInt16Field(obj); } else if (value == AssessorDesc::dInt) { - val = (double)(sint32)Classpath::intValue->getVirtualInt32Field(obj); + val = (double)(sint32)vm->upcalls->intValue->getInt32Field(obj); } else if (value == AssessorDesc::dLong) { - val = (double)(sint64)Classpath::longValue->getVirtualLongField(obj); + val = (double)(sint64)vm->upcalls->longValue->getLongField(obj); } else { vm->illegalArgumentException(""); } @@ -356,15 +358,15 @@ } else if (funcs == AssessorDesc::dLong) { sint64 val = 0; if (value == AssessorDesc::dByte) { - val = (sint64)Classpath::byteValue->getVirtualInt8Field(obj); + val = (sint64)vm->upcalls->byteValue->getInt8Field(obj); } else if (value == AssessorDesc::dChar) { - val = (sint64)(uint64)Classpath::charValue->getVirtualInt16Field(obj); + val = (sint64)(uint64)vm->upcalls->charValue->getInt16Field(obj); } else if (value == AssessorDesc::dShort) { - val = (sint64)Classpath::shortValue->getVirtualInt16Field(obj); + val = (sint64)vm->upcalls->shortValue->getInt16Field(obj); } else if (value == AssessorDesc::dInt) { - val = (sint64)Classpath::intValue->getVirtualInt32Field(obj); + val = (sint64)vm->upcalls->intValue->getInt32Field(obj); } else if (value == AssessorDesc::dLong) { - val = (sint64)Classpath::intValue->getVirtualLongField(obj); + val = (sint64)vm->upcalls->intValue->getLongField(obj); } else { vm->illegalArgumentException(""); } @@ -378,13 +380,15 @@ } JavaObject* NativeUtil::getClassType(JnjvmClassLoader* loader, Typedef* type) { + Jnjvm* vm = JavaThread::get()->isolate; CommonClass* res = type->assocClass(loader); - return res->getClassDelegatee(); + return res->getClassDelegatee(vm); } ArrayObject* NativeUtil::getParameterTypes(JnjvmClassLoader* loader, JavaMethod* meth) { + Jnjvm* vm = JavaThread::get()->isolate; std::vector& args = meth->getSignature()->args; - ArrayObject* res = ArrayObject::acons(args.size(), Classpath::classArrayClass, + ArrayObject* res = ArrayObject::acons(args.size(), vm->upcalls->classArrayClass, &(JavaThread::get()->isolate->allocator)); sint32 index = 0; @@ -399,22 +403,23 @@ ArrayObject* NativeUtil::getExceptionTypes(JavaMethod* meth) { Attribut* exceptionAtt = meth->lookupAttribut(Attribut::exceptionsAttribut); + Jnjvm* vm = JavaThread::get()->isolate; if (exceptionAtt == 0) { - return ArrayObject::acons(0, Classpath::classArrayClass, + return ArrayObject::acons(0, vm->upcalls->classArrayClass, &(JavaThread::get()->isolate->allocator)); } else { Class* cl = meth->classDef; JavaConstantPool* ctp = cl->getConstantPool(); Reader reader(exceptionAtt, cl->getBytes()); uint16 nbe = reader.readU2(); - ArrayObject* res = ArrayObject::acons(nbe, Classpath::classArrayClass, + ArrayObject* res = ArrayObject::acons(nbe, vm->upcalls->classArrayClass, &(JavaThread::get()->isolate->allocator)); for (uint16 i = 0; i < nbe; ++i) { uint16 idx = reader.readU2(); CommonClass* cl = ctp->loadClass(idx); cl->resolveClass(); - JavaObject* obj = cl->getClassDelegatee(); + JavaObject* obj = cl->getClassDelegatee(vm); res->elements[i] = obj; } return res; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.h?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.h Tue Aug 26 04:30:54 2008 @@ -29,7 +29,7 @@ static Jnjvm* myVM(JNIEnv* env); static void* nativeLookup(CommonClass* cl, JavaMethod* meth, bool& jnjvm); - static CommonClass* resolvedImplClass(jclass clazz, bool doClinit); + static UserCommonClass* resolvedImplClass(jclass clazz, bool doClinit); static void decapsulePrimitive(Jnjvm *vm, void**&buf, JavaObject* obj, Typedef* signature); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.cpp Tue Aug 26 04:30:54 2008 @@ -15,6 +15,7 @@ #include "Jnjvm.h" #include "JavaArray.h" #include "JavaThread.h" +#include "JavaUpcalls.h" #include "Reader.h" #include "Zip.h" @@ -31,18 +32,21 @@ fseek(fp, 0, SeekEnd); long nbb = ftell(fp); fseek(fp, 0, SeekSet); - res = ArrayUInt8::acons(nbb, JavaArray::ofByte, loader->allocator); + ClassArray* array = loader->bootstrapLoader->upcalls->ArrayOfByte; + res = ArrayUInt8::acons(nbb, array, loader->allocator); fread(res->elements, nbb, 1, fp); fclose(fp); } return res; } -ArrayUInt8* Reader::openZip(JnjvmClassLoader* loader, ZipArchive* archive, char* filename) { +ArrayUInt8* Reader::openZip(JnjvmClassLoader* loader, ZipArchive* archive, + char* filename) { ArrayUInt8* ret = 0; ZipFile* file = archive->getFile(filename); if (file != 0) { - ArrayUInt8* res = ArrayUInt8::acons(file->ucsize, JavaArray::ofByte, loader->allocator); + ClassArray* array = loader->bootstrapLoader->upcalls->ArrayOfByte; + ArrayUInt8* res = ArrayUInt8::acons(file->ucsize, array, loader->allocator); if (archive->readFile(res, file) != 0) { ret = res; } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp?rev=55368&r1=55367&r2=55368&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp Tue Aug 26 04:30:54 2008 @@ -33,8 +33,6 @@ INIT(JavaThread); INIT(Jnjvm); INIT(ClassMap); - INIT(StaticInstanceMap); - INIT(DelegateeMap); INIT(JnjvmBootstrapLoader); INIT(JnjvmClassLoader); #ifdef MULTIPLE_VM @@ -116,18 +114,6 @@ } } -void StaticInstanceMap::TRACER { - for (iterator i = map.begin(), e = map.end(); i!= e; ++i) { - i->second->second->MARK_AND_TRACE; - } -} - -void DelegateeMap::TRACER { - for (iterator i = map.begin(), e = map.end(); i!= e; ++i) { - i->second->MARK_AND_TRACE; - } -} - void JnjvmClassLoader::TRACER { javaLoader->MARK_AND_TRACE; classes->MARK_AND_TRACE; From nicolas.geoffray at lip6.fr Tue Aug 26 08:45:08 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 26 Aug 2008 15:45:08 -0000 Subject: [vmkit-commits] [vmkit] r55369 - in /vmkit/branches/isolate/lib/JnJVM: Classpath/ Isolate/ VMCore/ Message-ID: <200808261545.m7QFjA3v027621@zion.cs.uiuc.edu> Author: geoffray Date: Tue Aug 26 10:45:03 2008 New Revision: 55369 URL: http://llvm.org/viewvc/llvm-project?rev=55369&view=rev Log: New reorganization. SingleVM still compiles and runs normally, MultiVM compiles. Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystem.cpp.inc vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaBacktrace.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaObject.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaString.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.h vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/LockedMap.h vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc Tue Aug 26 10:45:03 2008 @@ -37,7 +37,7 @@ if (!ass) vm->unknownError("unknown byte primitive %c", byteId); - return (jobject)ass->classType->getClassDelegatee(vm); + return (jobject)ass->getPrimitiveClass()->getClassDelegatee(vm); } Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystem.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystem.cpp.inc?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystem.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystem.cpp.inc Tue Aug 26 10:45:03 2008 @@ -49,8 +49,8 @@ UserCommonClass* dstType = td->baseClass(); AssessorDesc* dstFuncs = td->funcs(); AssessorDesc* srcFuncs = ts->funcs(); - UserCommonClass* srcPrim = vm->getPrimitiveClass(srcFuncs); - UserCommonClass* dstPrim = vm->getPrimitiveClass(dstFuncs); + UserCommonClass* srcPrim = srcFuncs->getPrimitiveClass(); + UserCommonClass* dstPrim = dstFuncs->getPrimitiveClass(); if (len > src->size) { vm->indexOutOfBounds(src, len); Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h Tue Aug 26 10:45:03 2008 @@ -20,12 +20,14 @@ class Class; class ClassArray; class ClassPrimitive; +class JavaConstantPool; class JavaField; class JavaMethod; class JavaObject; class Jnjvm; class JnjvmClassLoader; class UserClass; +class UserClassArray; class UTF8; class UserCommonClass : public mvm::Object { @@ -48,6 +50,7 @@ bool isArray(); bool isPrimitive(); bool isInterface(); + bool isReady(); uint8 getAccess(); const UTF8* getName(); @@ -67,8 +70,28 @@ bool isStatic, bool recurse); JavaMethod* lookupMethod(const UTF8* name, const UTF8* type, bool isStatic, bool recurse); + JavaField* lookupField(const UTF8* name, const UTF8* type, + bool isStatic, bool recurse, + UserCommonClass*& fieldCl); uint64 getVirtualSize(); + VirtualTable* getVirtualVT(); + + void setInterfaces(std::vector Is); + void setSuper(UserClass* S); + + bool instantiationOfArray(UserClassArray* cl); + bool implements(UserCommonClass* cl); + + /// constructMethod - Add a new method in this class method map. + /// + JavaMethod* constructMethod(const UTF8* name, const UTF8* type, + uint32 access); + + /// constructField - Add a new field in this class field map. + /// + JavaField* constructField(const UTF8* name, const UTF8* type, + uint32 access); }; class UserClass : public UserCommonClass { @@ -86,7 +109,13 @@ UserClass* getOuterClass(); void resolveInnerOuterClasses(); JavaObject* getStaticInstance(); + JavaConstantPool* getConstantPool(); + + void setStaticSize(uint64 size); + void setStaticVT(VirtualTable* VT); + uint64 getStaticSize(); + VirtualTable* getStaticVT(); }; class UserClassArray : public UserCommonClass { @@ -107,7 +136,7 @@ public: virtual void TRACER; - UserClassPrimitive(JnjvmClassLoader* JCL, const UTF8* name); + UserClassPrimitive(JnjvmClassLoader* JCL, const UTF8* name, uint32 nb); }; } // end namespace jnjvm Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaBacktrace.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaBacktrace.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaBacktrace.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaBacktrace.cpp Tue Aug 26 10:45:03 2008 @@ -61,7 +61,8 @@ -Class* JavaJIT::getCallingClass() { +#ifndef MULTIPLE_VM +UserClass* JavaJIT::getCallingClass() { int* ips[10]; int real_size = mvm::jit::getBacktrace((void**)(void*)ips, 10); int n = 0; @@ -82,7 +83,7 @@ return 0; } -Class* JavaJIT::getCallingClassWalker() { +UserClass* JavaJIT::getCallingClassWalker() { int* ips[10]; int real_size = mvm::jit::getBacktrace((void**)(void*)ips, 10); int n = 0; @@ -102,9 +103,19 @@ } return 0; } +#else +UserClass* JavaJIT::getCallingClassWalker() { + fprintf(stderr, "implement me"); + abort(); +} +UserClass* JavaJIT::getCallingClass() { + fprintf(stderr, "implement me"); + abort(); +} +#endif JavaObject* JavaJIT::getCallingClassLoader() { - Class* cl = getCallingClassWalker(); + UserClass* cl = getCallingClassWalker(); if (!cl) return 0; else return cl->classLoader->getJavaClassLoader(); } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.h?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.h Tue Aug 26 10:45:03 2008 @@ -29,9 +29,9 @@ namespace jnjvm { -class Class; class Enveloppe; class JavaConstantPool; +class UserClass; /// CacheNode - A {class, method pointer} pair. class CacheNode { @@ -41,7 +41,7 @@ void* methPtr; /// lastCible - The class of this cache. - Class* lastCible; + UserClass* lastCible; /// next - The next cache. CacheNode* next; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp Tue Aug 26 10:45:03 2008 @@ -39,10 +39,6 @@ const UTF8* Attribut::innerClassesAttribut = 0; const UTF8* Attribut::sourceFileAttribut = 0; -CommonClass* ClassArray::SuperArray = 0; -std::vector ClassArray::InterfacesArray; - - Attribut::Attribut(const UTF8* name, uint32 length, uint32 offset) { @@ -219,7 +215,9 @@ #endif } -ClassPrimitive::ClassPrimitive(JnjvmClassLoader* loader, const UTF8* n) : +#ifndef MULTIPLE_VM +ClassPrimitive::ClassPrimitive(JnjvmClassLoader* loader, const UTF8* n, + uint32 nb) : CommonClass(loader, n, false) { display = (CommonClass**)malloc(sizeof(CommonClass*)); @@ -227,6 +225,7 @@ primitive = true; status = ready; access = ACC_ABSTRACT | ACC_FINAL | ACC_PUBLIC; + virtualSize = nb; } Class::Class(JnjvmClassLoader* loader, const UTF8* n, ArrayUInt8* B) : @@ -234,22 +233,21 @@ bytes = B; super = 0; ctpInfo = 0; -#ifndef MULTIPLE_VM _staticInstance = 0; -#endif } ClassArray::ClassArray(JnjvmClassLoader* loader, const UTF8* n) : CommonClass(loader, n, true) { _funcs = 0; _baseClass = 0; - super = ClassArray::SuperArray; - interfaces = ClassArray::InterfacesArray; + super = JnjvmBootstrapLoader::SuperArray; + interfaces = JnjvmBootstrapLoader::InterfacesArray; depth = 1; display = (CommonClass**)malloc(2 * sizeof(CommonClass*)); - display[0] = ClassArray::SuperArray; + display[0] = JnjvmBootstrapLoader::SuperArray; display[1] = this; access = ACC_FINAL | ACC_ABSTRACT; } +#endif void Class::print(mvm::PrintBuffer* buf) const { buf->write("Class<"); @@ -263,10 +261,12 @@ buf->write(">"); } +#ifndef MULTIPLE_VM void ClassArray::resolveComponent() { AssessorDesc::introspectArray(classLoader, name, 0, _funcs, _baseClass); } +#endif JnjvmClassLoader* ClassArray::arrayLoader(const UTF8* name, JnjvmClassLoader* loader, @@ -278,7 +278,7 @@ } else if (name->elements[start] == AssessorDesc::I_REF) { const UTF8* componentName = name->javaToInternal(loader->hashUTF8, start + 1, len - 2); - CommonClass* cl = loader->loadName(componentName, false, true); + UserCommonClass* cl = loader->loadName(componentName, false, true); return cl->classLoader; } else { return JnjvmClassLoader::bootstrapLoader; @@ -361,25 +361,36 @@ JavaField* CommonClass::lookupFieldDontThrow(const UTF8* name, const UTF8* type, bool isStatic, - bool recurse) { + bool recurse, + CommonClass*& definingClass) { FieldCmp CC(name, type); field_map& map = isStatic ? staticFields : virtualFields; field_iterator End = map.end(); field_iterator I = map.find(CC); - if (I != End) return I->second; + if (I != End) { + definingClass = this; + return I->second; + } JavaField *cur = 0; if (recurse) { if (super) cur = super->lookupFieldDontThrow(name, type, isStatic, - recurse); - if (cur) return cur; + recurse, definingClass); + if (cur) { + definingClass = (Class*)super; + return cur; + } if (isStatic) { for (std::vector::iterator i = interfaces.begin(), e = interfaces.end(); i!= e; i++) { - cur = (*i)->lookupFieldDontThrow(name, type, isStatic, recurse); - if (cur) return cur; + cur = (*i)->lookupFieldDontThrow(name, type, isStatic, recurse, + definingClass); + if (cur) { + definingClass = *i; + return cur; + } } } } @@ -388,21 +399,25 @@ } JavaField* CommonClass::lookupField(const UTF8* name, const UTF8* type, - bool isStatic, bool recurse) { + bool isStatic, bool recurse, + CommonClass*& definingClass) { - JavaField* res = lookupFieldDontThrow(name, type, isStatic, recurse); + JavaField* res = lookupFieldDontThrow(name, type, isStatic, recurse, + definingClass); if (!res) { JavaThread::get()->isolate->noSuchFieldError(this, name); } return res; } +#ifndef MULTIPLE_VM JavaObject* Class::doNew(Jnjvm* vm) { assert(this->isReady() && "Uninitialized class when allocating."); JavaObject* res = (JavaObject*)vm->allocator.allocateObject(virtualSize, virtualVT); res->classOf = this; return res; } +#endif bool CommonClass::inheritName(const UTF8* Tname) { if (name->equals(Tname)) { @@ -585,6 +600,7 @@ } +#ifndef MULTIPLE_VM void Class::loadParents() { int nbI = interfacesUTF8.size(); if (superUTF8 == 0) { @@ -605,6 +621,7 @@ interfaces.push_back((Class*)classLoader->loadName(interfacesUTF8[i], true, true)); } +#endif void Class::readAttributs(Reader& reader, std::vector& attr) { unsigned short int nba = reader.readU2(); @@ -712,7 +729,8 @@ } } -void Class::resolveInnerOuterClasses() { +#ifndef MULTIPLE_VM +void UserClass::resolveInnerOuterClasses() { if (!innerOuterResolved) { Attribut* attribut = lookupAttribut(Attribut::innerClassesAttribut); if (attribut != 0) { @@ -739,6 +757,7 @@ innerOuterResolved = true; } } +#endif void CommonClass::getDeclaredConstructors(std::vector& res, bool publicOnly) { Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h Tue Aug 26 10:45:03 2008 @@ -182,6 +182,10 @@ uint32 getVirtualSize() { return virtualSize; } + + VirtualTable* getVirtualVT() { + return virtualVT; + } /// virtualTableSize - The size of the virtual table of this class. /// @@ -215,9 +219,11 @@ return jnjvm::isInterface(access); } +#ifndef MULTIPLE_VM std::vector * getInterfaces() { return &interfaces; } +#endif /// name - The name of the class. /// @@ -230,7 +236,7 @@ /// status - The loading/resolve/initialization state of the class. /// JavaState status; - + /// super - The parent of this class. /// CommonClass * super; @@ -242,7 +248,7 @@ /// superUTF8 - The name of the parent of this class. /// const UTF8* superUTF8; - + /// interfaces - The interfaces this class implements. /// std::vector interfaces; @@ -360,12 +366,13 @@ /// not throw if the field is not found. /// JavaField* lookupFieldDontThrow(const UTF8* name, const UTF8* type, - bool isStatic, bool recurse); + bool isStatic, bool recurse, + CommonClass*& definingClass); /// lookupField - Lookup a field and throw an exception if not found. /// JavaField* lookupField(const UTF8* name, const UTF8* type, bool isStatic, - bool recurse); + bool recurse, CommonClass*& definingClass); /// print - Print the class for debugging purposes. /// @@ -465,7 +472,12 @@ void getDeclaredConstructors(std::vector& res, bool publicOnly); void getDeclaredMethods(std::vector& res, bool publicOnly); void getDeclaredFields(std::vector& res, bool publicOnly); - + void setInterfaces(std::vector I) { + interfaces = I; + } + void setSuper(CommonClass* S) { + super = S; + } }; /// ClassPrimitive - This class represents internal classes for primitive @@ -473,7 +485,7 @@ /// class ClassPrimitive : public CommonClass { public: - ClassPrimitive(JnjvmClassLoader* loader, const UTF8* name); + ClassPrimitive(JnjvmClassLoader* loader, const UTF8* name, uint32 nb); }; @@ -506,7 +518,8 @@ /// attributs - JVM attributes of this class. /// std::vector attributs; - + +#ifndef MULTIPLE_VM /// innerClasses - The inner classes of this class. /// std::vector innerClasses; @@ -514,6 +527,7 @@ /// outerClass - The outer class, if this class is an inner class. /// Class* outerClass; +#endif /// innerAccess - The access of this class, if this class is an inner class. /// @@ -531,9 +545,11 @@ /// VirtualTable* staticVT; +#ifndef MULTIPLE_VM /// doNew - Allocates a Java object whose class is this class. /// JavaObject* doNew(Jnjvm* vm); +#endif /// print - Prints a string representation of this class in the buffer. /// @@ -602,6 +618,7 @@ void resolveInnerOuterClasses(); +#ifndef MULTIPLE_VM Class* getOuterClass() { return outerClass; } @@ -609,6 +626,9 @@ std::vector* getInnerClasses() { return &innerClasses; } +#endif + + }; /// ClassArray - This class represents Java array classes. @@ -676,14 +696,6 @@ /// tracer - Tracer of array classes. /// virtual void TRACER; - - /// SuperArray - The super class of array classes. - /// - static CommonClass* SuperArray; - - /// InterfacesArray - The interfaces that array classes implement. - /// - static std::vector InterfacesArray; }; /// JavaMethod - This class represents Java methods. Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp Tue Aug 26 10:45:03 2008 @@ -265,6 +265,7 @@ else return UTF8At(ctpDef[index]); } +#ifndef MULTIPLE_VM CommonClass* JavaConstantPool::loadClass(uint32 index) { CommonClass* temp = isClassLoaded(index); if (!temp) { @@ -293,6 +294,7 @@ } return temp; } +#endif Typedef* JavaConstantPool::resolveNameAndType(uint32 index) { void* res = ctpRes[index]; @@ -421,7 +423,7 @@ return sign; } -void JavaConstantPool::resolveMethod(uint32 index, CommonClass*& cl, +void JavaConstantPool::resolveMethod(uint32 index, UserCommonClass*& cl, const UTF8*& utf8, Signdef*& sign) { sint32 entry = ctpDef[index]; sint32 ntIndex = entry & 0xFFFF; @@ -432,7 +434,7 @@ cl->resolveClass(); } -void JavaConstantPool::resolveField(uint32 index, CommonClass*& cl, +void JavaConstantPool::resolveField(uint32 index, UserCommonClass*& cl, const UTF8*& utf8, Typedef*& sign) { sint32 entry = ctpDef[index]; sint32 ntIndex = entry & 0xFFFF; @@ -450,8 +452,9 @@ const UTF8* utf8 = UTF8At(ctpDef[ntIndex] >> 16); CommonClass* cl = getMethodClassIfLoaded(entry >> 16); if (cl && cl->status >= resolved) { + CommonClass* fieldCl = 0; JavaField* field = cl->lookupFieldDontThrow(utf8, sign->keyName, stat, - true); + true, fieldCl); // don't throw if no field, the exception will be thrown just in time if (field) { if (!stat) { Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.h?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.h Tue Aug 26 10:45:03 2008 @@ -27,6 +27,7 @@ class Reader; class Signdef; class Typedef; +class UserCommonClass; class UTF8; @@ -228,14 +229,14 @@ /// perform class loading. This function is called just in time, ie when /// the method call is actually made and not yet resolved. /// - void resolveMethod(uint32 index, CommonClass*& cl, + void resolveMethod(uint32 index, UserCommonClass*& cl, const UTF8*& utf8, Signdef*& sign); /// resolveField - Resolve the class and signature of the field. May /// perform class loading. This function is called just in time, ie when /// the field is accessed and not yet resolved. /// - void resolveField(uint32 index, CommonClass*& cl, const UTF8*& utf8, + void resolveField(uint32 index, UserCommonClass*& cl, const UTF8*& utf8, Typedef*& sign); /// loadClass - Loads the class and returns it. This is called just in time, @@ -244,7 +245,7 @@ /// MULTIANEWARRAY. This function is also called by the classpath for /// loading exception classes referenced by a method. /// - CommonClass* loadClass(uint32 index); + UserCommonClass* loadClass(uint32 index); /// JavaConstantPool - Default constructor. /// Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp Tue Aug 26 10:45:03 2008 @@ -47,9 +47,6 @@ INIT(ClassMap); INIT(JnjvmBootstrapLoader); INIT(JnjvmClassLoader); -#ifdef MULTIPLE_VM - INIT(JnjvmSharedLoader); -#endif #ifdef SERVICE_VM INIT(ServiceDomain); #endif @@ -79,20 +76,20 @@ ((UTF8*)utf8OfChar)->classOf = JCL->upcalls->ArrayOfChar; JCL->hashUTF8->array = JCL->upcalls->ArrayOfChar; - ClassArray::InterfacesArray.push_back( + JCL->InterfacesArray.push_back( JCL->loadName(JCL->asciizConstructUTF8("java/lang/Cloneable"), false, false)); - ClassArray::InterfacesArray.push_back( + JCL->InterfacesArray.push_back( JCL->loadName(JCL->asciizConstructUTF8("java/io/Serializable"), false, false)); - ClassArray::SuperArray = + JCL->SuperArray = JCL->loadName(JCL->asciizConstructUTF8("java/lang/Object"), false, false); - JCL->upcalls->ArrayOfChar->interfaces = ClassArray::InterfacesArray; - JCL->upcalls->ArrayOfChar->super = ClassArray::SuperArray; + JCL->upcalls->ArrayOfChar->setInterfaces(JCL->InterfacesArray); + JCL->upcalls->ArrayOfChar->setSuper(JCL->SuperArray); JCL->upcalls->ArrayOfByte = JCL->constructArray(JCL->asciizConstructUTF8("[B")); JCL->upcalls->ArrayOfString = @@ -169,7 +166,7 @@ #undef DEF_UTF8 - Classpath::initialiseClasspath(JCL); + JCL->upcalls->initialiseClasspath(JCL); } void mvm::VirtualMachine::initialiseJVM() { Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp Tue Aug 26 10:45:03 2008 @@ -914,9 +914,9 @@ if (ex->catche) { JavaObject* exc = 0; - Class* cl = 0; + UserClass* cl = 0; try { - cl = (Class*)(ctpInfo->loadClass(ex->catche)); + cl = (UserClass*)(ctpInfo->loadClass(ex->catche)); } catch(...) { compilingClass->release(); exc = JavaThread::getJavaException(); @@ -931,7 +931,12 @@ ex->catchClass = cl; } else { +#ifdef MULTIPLE_VM + fprintf(stderr, "implement me"); + abort(); +#else ex->catchClass = Classpath::newThrowable; +#endif } ex->test = createBasicBlock("testException"); @@ -1024,8 +1029,13 @@ Value* cl = 0; currentBlock = cur->realTest; assert(cur->catchClass); +#ifdef MULTIPLE_VM + fprintf(stderr, "implement me"); + abort(); +#else LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(cur->catchClass); cl = LCI->getVar(this); +#endif Value* cmp = llvm::CallInst::Create(JnjvmModule::CompareExceptionFunction, cl, "", currentBlock); llvm::BranchInst::Create(cur->handler, bbNext, cmp, currentBlock); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h Tue Aug 26 10:45:03 2008 @@ -41,7 +41,7 @@ uint32 endpc; uint32 handlerpc; uint16 catche; - Class* catchClass; + UserClass* catchClass; llvm::BasicBlock* test; llvm::BasicBlock* realTest; llvm::BasicBlock* handler; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Tue Aug 26 10:45:03 2008 @@ -1820,7 +1820,7 @@ case NEWARRAY : case ANEWARRAY : { - ClassArray* dcl = 0; + UserClassArray* dcl = 0; ConstantInt* sizeElement = 0; GlobalVariable* TheVT = 0; JnjvmClassLoader* JCL = compilingClass->classLoader; @@ -1828,7 +1828,7 @@ if (bytecodes[i] == NEWARRAY) { uint8 id = bytecodes[++i]; AssessorDesc* ass = AssessorDesc::arrayType(id); - dcl = ass->arrayClass; + dcl = ass->getArrayClass(); TheVT = JnjvmModule::JavaObjectVirtualTableGV; LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[ass->numId]; sizeElement = LAI.sizeInBytesConstant; @@ -1844,10 +1844,14 @@ TheVT = JnjvmModule::ArrayObjectVirtualTableGV; sizeElement = mvm::jit::constantPtrSize; } - +#ifdef MULTIPLE_VM + llvm::Value* valCl = 0; + fprintf(stderr, "implement me"); + abort(); +#else LLVMCommonClassInfo* LCI = module->getClassInfo(dcl); llvm::Value* valCl = LCI->getVar(this); - +#endif llvm::Value* arg1 = popAsInt(); Value* cmp = new ICmpInst(ICmpInst::ICMP_SLT, arg1, @@ -2069,12 +2073,18 @@ const UTF8* className = compilingClass->ctpInfo->resolveClassName(index); - ClassArray* dcl = JCL->constructArray(className); + UserClassArray* dcl = JCL->constructArray(className); compilingClass->ctpInfo->loadClass(index); +#ifdef MULTIPLE_VM + llvm::Value* valCl = 0; + fprintf(stderr, "implement me %s", dcl->printString()); + abort(); +#else LLVMCommonClassInfo* LCI = module->getClassInfo(dcl); Value* valCl = LCI->getVar(this); +#endif Value** args = (Value**)alloca(sizeof(Value*) * (dim + 2)); args[0] = valCl; args[1] = ConstantInt::get(Type::Int32Ty, dim); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp Tue Aug 26 10:45:03 2008 @@ -29,8 +29,8 @@ char const* className, char const* func, char const* sign, int access, ...) { - CommonClass* cl = loader->loadName(loader->asciizConstructUTF8(className), - true, true); + UserCommonClass* cl = loader->loadName(loader->asciizConstructUTF8(className), + true, true); cl->initialiseClass(vm); bool stat = access == ACC_STATIC ? true : false; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaObject.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaObject.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaObject.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaObject.cpp Tue Aug 26 10:45:03 2008 @@ -159,7 +159,7 @@ void JavaObject::print(mvm::PrintBuffer* buf) const { buf->write("JavaObject<"); - CommonClass::printClassName(classOf->name, buf); + CommonClass::printClassName(classOf->getName(), buf); buf->write(">"); } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Tue Aug 26 10:45:03 2008 @@ -101,21 +101,19 @@ } UserCommonClass* cl = 0; + UserCommonClass* fieldCl = 0; const UTF8* utf8 = 0; Typedef* sign = 0; ctpInfo->resolveField(index, cl, utf8, sign); - JavaField* field = cl->lookupField(utf8, sign->keyName, stat, true); + JavaField* field = cl->lookupField(utf8, sign->keyName, stat, true, fieldCl); void* ptr = 0; if (stat) { - UserClass* fieldCl = field->classDef; fieldCl->initialiseClass(JavaThread::get()->isolate); - ptr = (void*)((uint64)(fieldCl->getStaticInstance()) + field->ptrOffset); -#ifndef MULTIPLE_VM + ptr = (void*)((uint64)(((UserClass*)fieldCl)->getStaticInstance()) + field->ptrOffset); ctpInfo->ctpRes[index] = ptr; -#endif } else { ptr = (void*)((uint64)obj + field->ptrOffset); ctpInfo->ctpRes[index] = (void*)field->ptrOffset; @@ -177,18 +175,7 @@ JavaThread::get()->isolate->indexOutOfBounds(obj, index); } -#ifdef MULTIPLE_VM -extern "C" JavaObject* getStaticInstance(UserClass* cl, Jnjvm* vm) { - std::pair* val = vm->statics->lookup(cl); - if (!val || !(val->second)) { - vm->initialiseClass(cl); - val = vm->statics->lookup(cl); - } - return val->second; -} -#endif - -extern "C" CommonClass* initialisationCheck(UserCommonClass* cl) { +extern "C" UserCommonClass* initialisationCheck(UserCommonClass* cl) { cl->initialiseClass(JavaThread::get()->isolate); return cl; } @@ -198,7 +185,7 @@ return cl->getClassDelegatee(vm); } -extern "C" Class* newLookup(UserClass* caller, uint32 index) { +extern "C" UserClass* newLookup(UserClass* caller, uint32 index) { JavaConstantPool* ctpInfo = caller->getConstantPool(); UserClass* cl = (UserClass*)ctpInfo->loadClass(index); return cl; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaString.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaString.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaString.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaString.cpp Tue Aug 26 10:45:03 2008 @@ -17,9 +17,9 @@ JavaString* JavaString::stringDup(const UTF8*& utf8, Jnjvm* vm) { - Class* cl = vm->upcalls->newString; - JavaString* res = (JavaString*)malloc(cl->virtualSize); - ((void**)res)[0] = cl->virtualVT; + UserClass* cl = vm->upcalls->newString; + JavaString* res = (JavaString*)malloc(cl->getVirtualSize()); + ((void**)res)[0] = cl->getVirtualVT(); res->classOf = cl; // No need to call the Java function: both the Java function and Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.cpp Tue Aug 26 10:45:03 2008 @@ -56,7 +56,7 @@ AssessorDesc::AssessorDesc(bool dt, char bid, uint32 nb, uint32 nw, const char* name, JnjvmClassLoader* loader, uint8 nid, - const char* assocName, ClassArray* cl, + const char* assocName, UserClassArray* cl, arrayCtor_t ctor) { AssessorDesc* res = this; res->numId = nid; @@ -75,10 +75,9 @@ res->assocClassName = 0; if (bid != I_PARG && bid != I_PARD && bid != I_REF && bid != I_TAB) { - res->classType = new ClassPrimitive(loader, res->UTF8Name); - res->classType->virtualSize = nb; + res->primitiveClass = new UserClassPrimitive(loader, res->UTF8Name, nb); } else { - res->classType = 0; + res->primitiveClass = 0; } } @@ -265,37 +264,9 @@ } } -/* -void AssessorDesc::introspectArrayName(Jnjvm *vm, const UTF8* utf8, - uint32 start, AssessorDesc*& ass, - const UTF8*& res) { - uint32 pos = 0; - uint32 intern = 0; - AssessorDesc* funcs = 0; - - analyseIntern(utf8, start, 1, funcs, intern); - - if (funcs != dTab) { - vm->unknownError("%s isn't an array", utf8->printString()); - } - - analyseIntern(utf8, intern, 0, funcs, pos); - - if (funcs == dRef) { - ass = dRef; - res = utf8->extract(vm, intern + 1, pos - 1); - } else if (funcs == dTab) { - ass = dTab; - res = utf8->extract(vm, intern, pos); - } else { - ass = funcs; - res = 0; - } -} -*/ void AssessorDesc::introspectArray(JnjvmClassLoader* loader, const UTF8* utf8, uint32 start, - AssessorDesc*& ass, CommonClass*& res) { + AssessorDesc*& ass, UserCommonClass*& res) { uint32 pos = 0; uint32 intern = 0; AssessorDesc* funcs = 0; @@ -318,7 +289,7 @@ res = loader->constructArray(utf8->extract(loader->hashUTF8, intern, pos)); } else { ass = funcs; - res = funcs->classType; + res = funcs->getPrimitiveClass(); } } @@ -377,8 +348,7 @@ } } -AssessorDesc* AssessorDesc::classToPrimitive(CommonClass* cl) { - const UTF8* name = cl->name; +AssessorDesc* AssessorDesc::classNameToPrimitive(const UTF8* name) { if (name->equals(dFloat->assocClassName)) { return dFloat; } else if (name->equals(dInt->assocClassName)) { @@ -410,9 +380,9 @@ return buf->contents()->cString(); } -CommonClass* Typedef::assocClass(JnjvmClassLoader* loader) { +UserCommonClass* Typedef::assocClass(JnjvmClassLoader* loader) { if (pseudoAssocClassName == 0) { - return funcs->classType; + return funcs->getPrimitiveClass(); } else if (funcs == AssessorDesc::dRef) { return loader->loadName(pseudoAssocClassName, false, true); } else { Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.h?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaTypes.h Tue Aug 26 10:45:03 2008 @@ -19,13 +19,15 @@ class ClassArray; class CommonClass; -class UserCommonClass; class JavaArray; class JavaJIT; class JavaObject; class Jnjvm; class JnjvmBootstrapLoader; class JnjvmClassLoader; +class UserClassArray; +class UserClassPrimitive; +class UserCommonClass; class UTF8; #define VOID_ID 0 @@ -41,7 +43,7 @@ #define OBJECT_ID 10 #define NUM_ASSESSORS 11 -typedef JavaArray* (*arrayCtor_t)(uint32 len, CommonClass* cl, Jnjvm* vm); +typedef JavaArray* (*arrayCtor_t)(uint32 len, UserClassArray* cl, Jnjvm* vm); /// AssessorDesc - Description of a Java assessor: these are the letters found @@ -95,10 +97,10 @@ /// const UTF8* UTF8Name; - /// classType - The primitive Java class of this assessor. This class + /// primitiveClass - The primitive Java class of this assessor. This class /// is internal to the JVM. /// - CommonClass* classType; + UserClassPrimitive* primitiveClass; /// assocClassName - The associated class name, e.g. "java/lang/Integer" for /// "I". @@ -107,7 +109,7 @@ /// arrayClass - The primitive array class of the assessor, e.g. I[] for "I". /// - ClassArray* arrayClass; + UserClassArray* arrayClass; /// arrayCtor - The constructor of an array of this assessor. /// @@ -184,7 +186,7 @@ AssessorDesc(bool dt, char bid, uint32 nb, uint32 nw, const char* name, JnjvmClassLoader* loader, uint8 nid, - const char* assocName, ClassArray* cl, + const char* assocName, UserClassArray* cl, arrayCtor_t ctor); @@ -204,19 +206,26 @@ static const UTF8* constructArrayName(JnjvmClassLoader* loader, AssessorDesc* ass, uint32 steps, const UTF8* className); - /* - static void introspectArrayName(const UTF8* utf8, uint32 start, - AssessorDesc*& ass, const UTF8*& res); - */ static void introspectArray(JnjvmClassLoader* loader, const UTF8* utf8, uint32 start, AssessorDesc*& ass, - CommonClass*& res); + UserCommonClass*& res); static AssessorDesc* arrayType(unsigned int t); static AssessorDesc* byteIdToPrimitive(const char id); - static AssessorDesc* classToPrimitive(CommonClass* cl); - + static AssessorDesc* classNameToPrimitive(const UTF8* name); + +#ifdef MULTIPLE_VM + UserClassArray* getArrayClass() const; + UserClassPrimitive* getPrimitiveClass() const; +#else + UserClassArray* getArrayClass() const { + return arrayClass; + } + UserClassPrimitive* getPrimitiveClass() const { + return primitiveClass; + } +#endif }; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp Tue Aug 26 10:45:03 2008 @@ -49,6 +49,7 @@ JavaField* Classpath::daemon; JavaField* Classpath::group; JavaField* Classpath::running; +Class* Classpath::threadGroup; JavaField* Classpath::rootGroup; JavaField* Classpath::vmThread; JavaMethod* Classpath::uncaughtException; @@ -197,7 +198,7 @@ void Classpath::createInitialThread(Jnjvm* vm, JavaObject* th) { JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; - JCL->loadName(newVMThread->name, true, true); + JCL->loadName(newVMThread->getName(), true, true); newVMThread->initialiseClass(vm); JavaObject* vmth = newVMThread->doNew(vm); @@ -208,9 +209,9 @@ assocThread->setObjectField(vmth, th); running->setInt8Field(vmth, (uint32)1); - JCL->loadName(rootGroup->classDef->name, true, true); - rootGroup->classDef->initialiseClass(vm); - JavaObject* Stat = rootGroup->classDef->getStaticInstance(); + JCL->loadName(threadGroup->getName(), true, true); + threadGroup->initialiseClass(vm); + JavaObject* Stat = threadGroup->getStaticInstance(); JavaObject* RG = rootGroup->getObjectField(Stat); group->setObjectField(th, RG); groupAddThread->invokeIntSpecial(vm, RG, th); @@ -218,7 +219,7 @@ void Classpath::mapInitialThread(Jnjvm* vm) { JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; - JCL->loadName(newThread->name, true, true); + JCL->loadName(newThread->getName(), true, true); newThread->initialiseClass(vm); JavaObject* th = newThread->doNew(vm); createInitialThread(vm, th); @@ -527,6 +528,9 @@ running = UPCALL_FIELD(loader, "java/lang/VMThread", "running", "Z", ACC_VIRTUAL); + threadGroup = + UPCALL_CLASS(loader, "java/lang/ThreadGroup"); + rootGroup = UPCALL_FIELD(loader, "java/lang/ThreadGroup", "root", "Ljava/lang/ThreadGroup;", ACC_STATIC); @@ -584,8 +588,9 @@ } extern "C" uint8 isArray(JavaObject* klass) { + Jnjvm* vm = JavaThread::get()->isolate; CommonClass* cl = - (CommonClass*)((Classpath::vmdataClass->getObjectField(klass))); + (CommonClass*)((vm->upcalls->vmdataClass->getObjectField(klass))); return (uint8)cl->isArray(); } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h Tue Aug 26 10:45:03 2008 @@ -127,6 +127,7 @@ ISOLATE_STATIC JavaField* daemon; ISOLATE_STATIC JavaField* group; ISOLATE_STATIC JavaField* running; + ISOLATE_STATIC UserClass* threadGroup; ISOLATE_STATIC JavaField* rootGroup; ISOLATE_STATIC JavaField* vmThread; ISOLATE_STATIC JavaMethod* uncaughtException; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp Tue Aug 26 10:45:03 2008 @@ -834,9 +834,10 @@ // TODO: find a better place to store the UTF8 UserCommonClass* cl = NativeUtil::resolvedImplClass(clazz, true); + UserCommonClass* realCl = 0; return (jfieldID) cl->lookupField(cl->classLoader->asciizConstructUTF8(name), - cl->classLoader->asciizConstructUTF8(sig), 0, 1); + cl->classLoader->asciizConstructUTF8(sig), 0, 1, realCl); END_EXCEPTION return 0; @@ -1327,9 +1328,11 @@ // TODO: find a better place to store the UTF8 UserCommonClass* cl = NativeUtil::resolvedImplClass(clazz, true); + UserCommonClass* realCl = 0; return (jfieldID) cl->lookupField(cl->classLoader->asciizConstructUTF8(name), - cl->classLoader->asciizConstructUTF8(sig), true, true); + cl->classLoader->asciizConstructUTF8(sig), true, true, + realCl); END_EXCEPTION return 0; @@ -1665,7 +1668,7 @@ UserCommonClass* base = NativeUtil::resolvedImplClass(elementClass, true); JnjvmClassLoader* loader = base->classLoader; - const UTF8* name = base->name; + const UTF8* name = base->getName(); const UTF8* arrayName = AssessorDesc::constructArrayName(loader, 0, 1, name); UserClassArray* array = loader->constructArray(arrayName); ArrayObject* res = ArrayObject::acons(length, array, &(vm->allocator)); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp Tue Aug 26 10:45:03 2008 @@ -87,6 +87,7 @@ typedef void (*clinit_t)(Jnjvm* vm); +#ifndef MULTIPLE_VM void CommonClass::initialiseClass(Jnjvm* vm) { // Primitives are initialized at boot time if (isArray()) { @@ -97,6 +98,7 @@ release(); } else if (status >= resolved && status != clinitParent && status != inClinit) { + Class* cl = (Class*)this; status = clinitParent; release(); if (super) { @@ -114,6 +116,16 @@ PRINT_DEBUG(JNJVM_LOAD, 0, LIGHT_GREEN, "clinit ", 0); PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "%s\n", printString()); + JavaObject* val = + (JavaObject*)vm->allocator.allocateObject(cl->staticSize, cl->staticVT); + val->initialise(cl); + for (CommonClass::field_iterator i = cl->staticFields.begin(), + e = cl->staticFields.end(); i!= e; ++i) { + i->second->initField(val); + } + + cl->_staticInstance = val; + if (meth) { JavaObject* exc = 0; try{ @@ -148,15 +160,16 @@ } } } +#endif -void Jnjvm::errorWithExcp(Class* cl, JavaMethod* init, const JavaObject* excp) { +void Jnjvm::errorWithExcp(UserClass* cl, JavaMethod* init, const JavaObject* excp) { JavaObject* obj = cl->doNew(this); init->invokeIntSpecial(this, obj, excp); JavaThread::throwException(obj); } -void Jnjvm::error(Class* cl, JavaMethod* init, const char* fmt, ...) { +void Jnjvm::error(UserClass* cl, JavaMethod* init, const char* fmt, ...) { char* tmp = (char*)alloca(4096); va_list ap; va_start(ap, fmt); @@ -316,6 +329,7 @@ postProperties.push_back(std::make_pair(key, value)); } +#ifndef MULTIPLE_VM JavaObject* CommonClass::getClassDelegatee(Jnjvm* vm, JavaObject* pd) { acquire(); if (!(delegatee)) { @@ -332,6 +346,7 @@ release(); return delegatee; } +#endif Jnjvm::~Jnjvm() { #ifdef MULTIPLE_GC @@ -431,7 +446,7 @@ if (archive.getOfscd() != -1) { ZipFile* file = archive.getFile(PATH_MANIFEST); if (file) { - ClassArray* array = vm->bootstrapLoader->upcalls->ArrayOfByte; + UserClassArray* array = vm->bootstrapLoader->upcalls->ArrayOfByte; ArrayUInt8* res = ArrayUInt8::acons(file->ucsize, array, &vm->allocator); int ok = archive.readFile(res, file); if (ok) { @@ -693,7 +708,7 @@ appClassLoader->getJavaClassLoader()); // load and initialise math since it is responsible for dlopen'ing // libjavalang.so and we are optimizing some math operations - CommonClass* math = + UserCommonClass* math = loader->loadName(loader->asciizConstructUTF8("java/lang/Math"), true, true); math->initialiseClass(this); } @@ -767,7 +782,7 @@ } } - ClassArray* array = bootstrapLoader->upcalls->ArrayOfString; + UserClassArray* array = bootstrapLoader->upcalls->ArrayOfString; ArrayObject* args = ArrayObject::acons(argc - 2, array, &allocator); for (int i = 2; i < argc; ++i) { args->elements[i - 2] = (JavaObject*)asciizToStr(argv[i]); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h Tue Aug 26 10:45:03 2008 @@ -26,13 +26,8 @@ namespace jnjvm { class ArrayObject; -class ArrayUInt8; -class Attribut; -class UserClass; -class UserClassArray; class Classpath; -class UserCommonClass; -class UserClassPrimitive; +class CommonClass; class JavaField; class JavaMethod; class JavaObject; @@ -40,26 +35,12 @@ class JavaThread; class JnjvmBootstrapLoader; class JnjvmClassLoader; -class JnjvmModule; -class JnjvmModuleProvider; -class Reader; -class Typedef; -class UTF8; -class UTF8Map; -class ClassMap; -class DelegateeMap; -class FieldMap; -class MethodMap; -class Signdef; -class SignMap; -class StaticInstanceMap; class StringMap; -class TypeMap; -class FunctionMap; -class FunctionDefMap; -class FunctionDefMap; -class AllocationMap; -class ZipArchive; +class UserClass; +class UserClassArray; +class UserClassPrimitive; +class UserCommonClass; +class UTF8; /// ThreadSystem - Thread management of a JVM. Each JVM has one thread /// management system to count the number of non-daemon threads it owns. @@ -307,8 +288,8 @@ void illegalArgumentException(const char* msg); void classCastException(const char* msg); void unknownError(const char* fmt, ...); - void noSuchFieldError(UserCommonClass* cl, const UTF8* name); - void noSuchMethodError(UserCommonClass* cl, const UTF8* name); + void noSuchFieldError(CommonClass* cl, const UTF8* name); + void noSuchMethodError(CommonClass* cl, const UTF8* name); void classFormatError(const char* fmt, ...); void noClassDefFoundError(JavaObject* obj); void noClassDefFoundError(const char* fmt, ...); @@ -355,13 +336,6 @@ /// virtual void runApplication(int argc, char** argv); -#ifdef MULTIPLE_VM - UserClassPrimitive* getPrimitiveClass(const AssessorDesc* ass); -#else - UserClassPrimitive* getPrimitiveClass(const AssessorDesc* ass) { - return (UserClassPrimitive*)ass->classType; - } -#endif }; } // end namespace jnjvm Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Tue Aug 26 10:45:03 2008 @@ -27,7 +27,12 @@ using namespace jnjvm; +#ifndef MULTIPLE_VM JnjvmBootstrapLoader* JnjvmClassLoader::bootstrapLoader = 0; +UserClass* JnjvmBootstrapLoader::SuperArray = 0; +std::vector JnjvmBootstrapLoader::InterfacesArray; +#endif + extern const char* GNUClasspathGlibj; extern const char* GNUClasspathLibs; @@ -241,7 +246,7 @@ JnjvmClassLoader * ld = ClassArray::arrayLoader(name, this, 1, name->size - 1); UserClassArray* res = - (ClassArray*)ld->classes->lookupOrCreate(name, this, arrayDup); + (UserClassArray*)ld->classes->lookupOrCreate(name, this, arrayDup); return res; } else { return (UserClassArray*)classes->lookupOrCreate(name, this, arrayDup); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.h Tue Aug 26 10:45:03 2008 @@ -266,6 +266,9 @@ /// Java code. /// Classpath* upcalls; + + ISOLATE_STATIC std::vector InterfacesArray; + ISOLATE_STATIC UserClass* SuperArray; }; } // end namespace jnjvm Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Tue Aug 26 10:45:03 2008 @@ -408,7 +408,7 @@ const Type* LLVMClassInfo::getStaticType() { if (!staticType) { - UserClass* cl = (UserClass*)classDef; + Class* cl = (Class*)classDef; std::vector fields; JavaField** array = (JavaField**) alloca(sizeof(JavaField*) * (classDef->staticFields.size() + 1)); @@ -444,18 +444,6 @@ uint64 size = mvm::jit::getTypeSize(structType); cl->staticSize = size; cl->staticVT = VT; - - JavaObject* val = - (JavaObject*)JavaThread::get()->isolate->allocator.allocateObject(cl->staticSize, - cl->staticVT); - val->initialise(classDef); - for (CommonClass::field_iterator i = cl->staticFields.begin(), - e = cl->staticFields.end(); i!= e; ++i) { - - i->second->initField(val); - } - - cl->_staticInstance = val; } return staticType; } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Tue Aug 26 10:45:03 2008 @@ -31,7 +31,7 @@ bool isStatic = ctpInfo->isAStaticCall(index); - CommonClass* cl = 0; + UserCommonClass* cl = 0; const UTF8* utf8 = 0; Signdef* sign = 0; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/LockedMap.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/LockedMap.h?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/LockedMap.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/LockedMap.h Tue Aug 26 10:45:03 2008 @@ -97,14 +97,14 @@ mvm::Lock* lock; JavaAllocator* allocator; - ClassArray* array; + UserClassArray* array; std::multimap map; const UTF8* lookupOrCreateAsciiz(const char* asciiz); const UTF8* lookupOrCreateReader(const uint16* buf, uint32 size); const UTF8* lookupAsciiz(const char* asciiz); const UTF8* lookupReader(const uint16* buf, uint32 size); - UTF8Map(JavaAllocator* A, ClassArray* cl) { + UTF8Map(JavaAllocator* A, UserClassArray* cl) { lock = mvm::Lock::allocNormal(); allocator = A; array = cl; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.cpp Tue Aug 26 10:45:03 2008 @@ -230,7 +230,7 @@ Jnjvm* vm = JavaThread::get()->isolate; JavaObject *Cl = (JavaObject*)clazz; UserCommonClass* cl = - (CommonClass*)vm->upcalls->vmdataClass->getObjectField(Cl); + (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField(Cl); cl->resolveClass(); if (doClinit) cl->initialiseClass(vm); return cl; @@ -251,8 +251,8 @@ } else if (obj == 0) { vm->illegalArgumentException(""); } else { - CommonClass* cl = obj->classOf; - AssessorDesc* value = AssessorDesc::classToPrimitive(cl); + UserCommonClass* cl = obj->classOf; + AssessorDesc* value = AssessorDesc::classNameToPrimitive(cl->getName()); if (value == 0) { vm->illegalArgumentException(""); @@ -381,7 +381,7 @@ JavaObject* NativeUtil::getClassType(JnjvmClassLoader* loader, Typedef* type) { Jnjvm* vm = JavaThread::get()->isolate; - CommonClass* res = type->assocClass(loader); + UserCommonClass* res = type->assocClass(loader); return res->getClassDelegatee(vm); } @@ -417,7 +417,7 @@ for (uint16 i = 0; i < nbe; ++i) { uint16 idx = reader.readU2(); - CommonClass* cl = ctp->loadClass(idx); + UserCommonClass* cl = ctp->loadClass(idx); cl->resolveClass(); JavaObject* obj = cl->getClassDelegatee(vm); res->elements[i] = obj; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.cpp Tue Aug 26 10:45:03 2008 @@ -32,7 +32,7 @@ fseek(fp, 0, SeekEnd); long nbb = ftell(fp); fseek(fp, 0, SeekSet); - ClassArray* array = loader->bootstrapLoader->upcalls->ArrayOfByte; + UserClassArray* array = loader->bootstrapLoader->upcalls->ArrayOfByte; res = ArrayUInt8::acons(nbb, array, loader->allocator); fread(res->elements, nbb, 1, fp); fclose(fp); @@ -45,7 +45,7 @@ ArrayUInt8* ret = 0; ZipFile* file = archive->getFile(filename); if (file != 0) { - ClassArray* array = loader->bootstrapLoader->upcalls->ArrayOfByte; + UserClassArray* array = loader->bootstrapLoader->upcalls->ArrayOfByte; ArrayUInt8* res = ArrayUInt8::acons(file->ucsize, array, loader->allocator); if (archive->readFile(res, file) != 0) { ret = res; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp?rev=55369&r1=55368&r2=55369&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp Tue Aug 26 10:45:03 2008 @@ -35,9 +35,6 @@ INIT(ClassMap); INIT(JnjvmBootstrapLoader); INIT(JnjvmClassLoader); -#ifdef MULTIPLE_VM - INIT(JnjvmSharedLoader); -#endif #ifdef SERVICE_VM INIT(ServiceDomain); #endif @@ -100,10 +97,6 @@ void Jnjvm::TRACER { appClassLoader->MARK_AND_TRACE; TRACE_VECTOR(JavaObject*, gc_allocator, globalRefs); -#ifdef MULTIPLE_VM - statics->MARK_AND_TRACE; - delegatees->MARK_AND_TRACE; -#endif bootstrapThread->MARK_AND_TRACE; JnjvmClassLoader::bootstrapLoader->MARK_AND_TRACE; } @@ -129,7 +122,7 @@ } #ifndef MULTIPLE_VM #define TRACE_DELEGATEE(prim) \ - prim->classType->delegatee->MARK_AND_TRACE + prim->primitiveClass->delegatee->MARK_AND_TRACE TRACE_DELEGATEE(AssessorDesc::dVoid); TRACE_DELEGATEE(AssessorDesc::dBool); From nicolas.geoffray at lip6.fr Wed Aug 27 06:19:14 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 27 Aug 2008 13:19:14 -0000 Subject: [vmkit-commits] [vmkit] r55411 - /vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Message-ID: <200808271319.m7RDJFVc020729@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 27 08:19:09 2008 New Revision: 55411 URL: http://llvm.org/viewvc/llvm-project?rev=55411&view=rev Log: Fix error message printing. Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55411&r1=55410&r2=55411&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Wed Aug 27 08:19:09 2008 @@ -261,7 +261,7 @@ error(Classpath::NoSuchFieldError, Classpath::InitNoSuchFieldError, "unable to find %s in %s", - name->printString(), cl->printString()); + name->UTF8ToAsciiz(), cl->printString()); } @@ -269,7 +269,7 @@ error(Classpath::NoSuchMethodError, Classpath::InitNoSuchMethodError, "unable to find %s in %s", - name->printString(), cl->printString()); + name->UTF8ToAsciiz(), cl->printString()); } From nicolas.geoffray at lip6.fr Wed Aug 27 08:43:13 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 27 Aug 2008 15:43:13 -0000 Subject: [vmkit-commits] [vmkit] r55416 - in /vmkit/branches/isolate/lib/JnJVM: Classpath/ Isolate/ VMCore/ Message-ID: <200808271543.m7RFhEnr025749@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 27 10:43:10 2008 New Revision: 55416 URL: http://llvm.org/viewvc/llvm-project?rev=55416&view=rev Log: Add a new parameter when making upcalls and calling Java method. This parameter is the cache constant pool. Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp Wed Aug 27 10:43:10 2008 @@ -160,7 +160,7 @@ UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(target, true); JavaObject* res = cl->doNew(vm); JavaMethod* meth = (JavaMethod*)(vm->upcalls->constructorSlot->getInt32Field((JavaObject*)cons)); - meth->invokeIntSpecial(vm, res); + meth->invokeIntSpecial(vm, cl, res); return (jobject)res; } Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc Wed Aug 27 10:43:10 2008 @@ -80,7 +80,7 @@ JavaObject* excp = 0; try { - meth->invokeIntSpecialBuf(vm, res, _buf); + meth->invokeIntSpecialBuf(vm, cl, res, _buf); }catch(...) { excp = JavaThread::getJavaException(); JavaThread::clearException(); Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc Wed Aug 27 10:43:10 2008 @@ -116,12 +116,12 @@ try{ \ if (isVirtual(meth->access)) { \ if (isPublic(meth->access)) { \ - val = meth->invoke##TYPE##VirtualBuf(vm, obj, _buf); \ + val = meth->invoke##TYPE##VirtualBuf(vm, cl, obj, _buf); \ } else { \ - val = meth->invoke##TYPE##SpecialBuf(vm, obj, _buf); \ + val = meth->invoke##TYPE##SpecialBuf(vm, cl, obj, _buf); \ } \ } else { \ - val = meth->invoke##TYPE##StaticBuf(vm, _buf); \ + val = meth->invoke##TYPE##StaticBuf(vm, cl, _buf); \ } \ }catch(...) { \ exc = JavaThread::getJavaException(); \ Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc Wed Aug 27 10:43:10 2008 @@ -92,8 +92,9 @@ i != e; ++i, ++index) { JavaMethod* meth = *i; // TODO: check parameter types - JavaObject* tmp = vm->upcalls->newConstructor->doNew(vm); - vm->upcalls->initConstructor->invokeIntSpecial(vm, tmp, Cl, meth); + UserClass* Cons = vm->upcalls->newConstructor; + JavaObject* tmp = Cons->doNew(vm); + vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp, Cl, meth); ret->elements[index] = tmp; } return (jobject)ret; @@ -124,8 +125,9 @@ i != e; ++i, ++index) { JavaMethod* meth = *i; // TODO: check parameter types - JavaObject* tmp = vm->upcalls->newMethod->doNew(vm); - vm->upcalls->initMethod->invokeIntSpecial(vm, tmp, Cl, + UserClass* Meth = vm->upcalls->newMethod; + JavaObject* tmp = Meth->doNew(vm); + vm->upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp, Cl, vm->UTF8ToStr(meth->name), meth); ret->elements[index] = tmp; } @@ -284,8 +286,9 @@ i != e; ++i, ++index) { JavaField* field = *i; // TODO: check parameter types - JavaObject* tmp = vm->upcalls->newField->doNew(vm); - vm->upcalls->initField->invokeIntSpecial(vm, tmp, Cl, + UserClass* Field = vm->upcalls->newField; + JavaObject* tmp = Field->doNew(vm); + vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp, Cl, vm->UTF8ToStr(field->name), field); ret->elements[index] = tmp; } Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc Wed Aug 27 10:43:10 2008 @@ -28,7 +28,9 @@ static void setProperty(Jnjvm* vm, JavaObject* prop, const char* key, const char* val) { - vm->upcalls->setProperty->invokeIntSpecial(vm, prop, vm->asciizToStr(key), + vm->upcalls->setProperty->invokeIntSpecial(vm, (UserClass*)prop->classOf, + prop, + vm->asciizToStr(key), vm->asciizToStr(val)); } Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc Wed Aug 27 10:43:10 2008 @@ -78,7 +78,7 @@ vm->lock->unlock(); #endif JavaMethod* method = vmthClass->lookupMethod(Jnjvm::runName, Jnjvm::clinitType, ACC_VIRTUAL, true); - method->invokeIntSpecial(isolate, vmThread); + method->invokeIntSpecial(isolate, (UserClass*)vmthClass, vmThread); if (!isDaemon) { Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc Wed Aug 27 10:43:10 2008 @@ -65,10 +65,12 @@ bool native = isNative(meth->access); - JavaObject* res = vm->upcalls->newStackTraceElement->doNew(vm); - vm->upcalls->initStackTraceElement->invokeIntSpecial(vm, res, sourceName, - (uint32)ip, className, - methodName, native); + UserClass* newS = vm->upcalls->newStackTraceElement; + JavaObject* res = newS->doNew(vm); + vm->upcalls->initStackTraceElement->invokeIntSpecial(vm, newS, res, + sourceName, + (uint32)ip, className, + methodName, native); return res; } Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h Wed Aug 27 10:43:10 2008 @@ -139,6 +139,9 @@ UserClassPrimitive(JnjvmClassLoader* JCL, const UTF8* name, uint32 nb); }; +class UserConstantPool { +}; + } // end namespace jnjvm #endif // JNJVM_CLASS_ISOLATE_H Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h Wed Aug 27 10:43:10 2008 @@ -31,6 +31,7 @@ class AssessorDesc; class Enveloppe; class Class; +class ClassArray; class JavaConstantPool; class JavaField; class JavaJIT; @@ -611,6 +612,13 @@ JavaConstantPool* getConstantPool() { return ctpInfo; } + + /// getCtpCache - A class does not have a ctp cache, hence + /// this method always returns 0. + /// + JavaConstantPool* getCtpCache() { + return 0; + } ArrayUInt8* getBytes() { return bytes; @@ -782,62 +790,62 @@ //===----------------------------------------------------------------------===// /// This class of methods takes a variable argument list. - uint32 invokeIntSpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap); - float invokeFloatSpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap); - double invokeDoubleSpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap); - sint64 invokeLongSpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap); - JavaObject* invokeJavaObjectSpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap); - - uint32 invokeIntVirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap); - float invokeFloatVirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap); - double invokeDoubleVirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap); - sint64 invokeLongVirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap); - JavaObject* invokeJavaObjectVirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap); - - uint32 invokeIntStaticAP(Jnjvm* vm, va_list ap); - float invokeFloatStaticAP(Jnjvm* vm, va_list ap); - double invokeDoubleStaticAP(Jnjvm* vm, va_list ap); - sint64 invokeLongStaticAP(Jnjvm* vm, va_list ap); - JavaObject* invokeJavaObjectStaticAP(Jnjvm* vm, va_list ap); + uint32 invokeIntSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap); + float invokeFloatSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap); + double invokeDoubleSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap); + sint64 invokeLongSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap); + JavaObject* invokeJavaObjectSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap); + + uint32 invokeIntVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap); + float invokeFloatVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap); + double invokeDoubleVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap); + sint64 invokeLongVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap); + JavaObject* invokeJavaObjectVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap); + + uint32 invokeIntStaticAP(Jnjvm* vm, UserClass*, va_list ap); + float invokeFloatStaticAP(Jnjvm* vm, UserClass*, va_list ap); + double invokeDoubleStaticAP(Jnjvm* vm, UserClass*, va_list ap); + sint64 invokeLongStaticAP(Jnjvm* vm, UserClass*, va_list ap); + JavaObject* invokeJavaObjectStaticAP(Jnjvm* vm, UserClass*, va_list ap); /// This class of methods takes a buffer which contain the arguments of the /// call. - uint32 invokeIntSpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf); - float invokeFloatSpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf); - double invokeDoubleSpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf); - sint64 invokeLongSpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf); - JavaObject* invokeJavaObjectSpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf); - - uint32 invokeIntVirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf); - float invokeFloatVirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf); - double invokeDoubleVirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf); - sint64 invokeLongVirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf); - JavaObject* invokeJavaObjectVirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf); - - uint32 invokeIntStaticBuf(Jnjvm* vm, void* buf); - float invokeFloatStaticBuf(Jnjvm* vm, void* buf); - double invokeDoubleStaticBuf(Jnjvm* vm, void* buf); - sint64 invokeLongStaticBuf(Jnjvm* vm, void* buf); - JavaObject* invokeJavaObjectStaticBuf(Jnjvm* vm, void* buf); + uint32 invokeIntSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf); + float invokeFloatSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf); + double invokeDoubleSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf); + sint64 invokeLongSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf); + JavaObject* invokeJavaObjectSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf); + + uint32 invokeIntVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf); + float invokeFloatVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf); + double invokeDoubleVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf); + sint64 invokeLongVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf); + JavaObject* invokeJavaObjectVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf); + + uint32 invokeIntStaticBuf(Jnjvm* vm, UserClass*, void* buf); + float invokeFloatStaticBuf(Jnjvm* vm, UserClass*, void* buf); + double invokeDoubleStaticBuf(Jnjvm* vm, UserClass*, void* buf); + sint64 invokeLongStaticBuf(Jnjvm* vm, UserClass*, void* buf); + JavaObject* invokeJavaObjectStaticBuf(Jnjvm* vm, UserClass*, void* buf); /// This class of methods is variadic. - uint32 invokeIntSpecial(Jnjvm* vm, JavaObject* obj, ...); - float invokeFloatSpecial(Jnjvm* vm, JavaObject* obj, ...); - double invokeDoubleSpecial(Jnjvm* vm, JavaObject* obj, ...); - sint64 invokeLongSpecial(Jnjvm* vm, JavaObject* obj, ...); - JavaObject* invokeJavaObjectSpecial(Jnjvm* vm, JavaObject* obj, ...); - - uint32 invokeIntVirtual(Jnjvm* vm, JavaObject* obj, ...); - float invokeFloatVirtual(Jnjvm* vm, JavaObject* obj, ...); - double invokeDoubleVirtual(Jnjvm* vm, JavaObject* obj, ...); - sint64 invokeLongVirtual(Jnjvm* vm, JavaObject* obj, ...); - JavaObject* invokeJavaObjectVirtual(Jnjvm* vm, JavaObject* obj, ...); - - uint32 invokeIntStatic(Jnjvm* vm, ...); - float invokeFloatStatic(Jnjvm* vm, ...); - double invokeDoubleStatic(Jnjvm* vm, ...); - sint64 invokeLongStatic(Jnjvm* vm, ...); - JavaObject* invokeJavaObjectStatic(Jnjvm* vm, ...); + uint32 invokeIntSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...); + float invokeFloatSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...); + double invokeDoubleSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...); + sint64 invokeLongSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...); + JavaObject* invokeJavaObjectSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...); + + uint32 invokeIntVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...); + float invokeFloatVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...); + double invokeDoubleVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...); + sint64 invokeLongVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...); + JavaObject* invokeJavaObjectVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...); + + uint32 invokeIntStatic(Jnjvm* vm, UserClass*, ...); + float invokeFloatStatic(Jnjvm* vm, UserClass*, ...); + double invokeDoubleStatic(Jnjvm* vm, UserClass*, ...); + sint64 invokeLongStatic(Jnjvm* vm, UserClass*, ...); + JavaObject* invokeJavaObjectStatic(Jnjvm* vm, UserClass*, ...); mvm::JITInfo* JInfo; template @@ -965,4 +973,9 @@ } // end namespace jnjvm + +#ifdef MULTIPLE_VM +#include "IsolateCommonClass.h" +#endif + #endif Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp Wed Aug 27 10:43:10 2008 @@ -62,7 +62,7 @@ return invokeSpecial(index); -#ifndef WITHOUT_VTABLE +#if !defined(WITHOUT_VTABLE) && !defined(MULTIPLE_VM) Constant* zero = mvm::jit::constantZero; Signdef* signature = ctpInfo->infoOfInterfaceOrVirtualMethod(index); std::vector args; // size = [signature->nbIn + 3]; @@ -70,9 +70,19 @@ const llvm::FunctionType* virtualType = LSI->getVirtualType(); FunctionType::param_iterator it = virtualType->param_end(); makeArgs(it, index, args, signature->args.size() + 1); - + + JITVerifyNull(args[0]); +#if defined(MULTIPLE_VM) + Value* cl = CallInst::Create(JnjvmModule::GetClassFunction, args[0], "", + currentBlock); + + Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheFunction, cl, "", + currentBlock); + args.push_back(newCtpCache); +#endif + Value* VT = CallInst::Create(JnjvmModule::GetVTFunction, args[0], "", currentBlock); std::vector indexes2; //[3]; @@ -159,15 +169,19 @@ BasicBlock* executeBlock = createBasicBlock("execute"); endBlock = createBasicBlock("end block"); -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) +#if defined(MULTIPLE_VM) Value* lastArg = 0; for (Function::arg_iterator i = func->arg_begin(), e = func->arg_end(); i != e; ++i) { lastArg = i; } #if !defined(SERVICE_VM) + ctpCache = lastArg; + lastArg--; isolateLocal = lastArg; #else + ctpCache = lastArg; + lastArg--; if (compilingClass->isolate == Jnjvm::bootstrapVM) { isolateLocal = lastArg; } else { @@ -510,8 +524,8 @@ uint32 index = 0; uint32 count = 0; -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) - uint32 max = args.size() - 1; +#if defined(MULTIPLE_VM) + uint32 max = args.size() - 2; #else uint32 max = args.size(); #endif @@ -551,12 +565,14 @@ } } -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) +#if defined(MULTIPLE_VM) #if !defined(SERVICE_VM) - isolateLocal = args[args.size() - 1]; + isolateLocal = args[args.size() - 2]; + ctpCache = args[args.size() - 1]; #else + ctpCache = args[args.size() - 1]; if (compilingClass->isolate == Jnjvm::bootstrapVM) { - isolateLocal = args[args.size() - 1]; + isolateLocal = args[args.size() - 2]; } else { JavaObject* loader = compilingClass->classLoader; ServiceDomain* vm = ServiceDomain::getDomainFromLoader(loader); @@ -569,7 +585,7 @@ BranchInst::Create(ifTrue, endBlock, cmp, currentBlock); currentBlock = ifTrue; std::vector Args; - Args.push_back(args[args.size()- 1]); + Args.push_back(args[args.size()- 2]); Args.push_back(isolateLocal); CallInst::Create(JnjvmModule::ServiceCallStartFunction, Args.begin(), Args.end(), "", currentBlock); @@ -674,8 +690,8 @@ uint32 index = 0; uint32 count = 0; -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) - uint32 max = func->arg_size() - 1; +#if defined(MULTIPLE_VM) + uint32 max = func->arg_size() - 2; #else uint32 max = func->arg_size(); #endif @@ -714,9 +730,11 @@ } } -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) +#if defined(MULTIPLE_VM) #if !defined(SERVICE_VM) isolateLocal = i; + i++; + ctpCache = i; #else if (compilingClass->isolate == Jnjvm::bootstrapVM) { isolateLocal = i; @@ -739,6 +757,8 @@ BranchInst::Create(endBlock, currentBlock); currentBlock = endBlock; } + i++; + ctpCache = i; #endif #endif @@ -912,6 +932,7 @@ ex->catche = reader.readU2(); +#ifndef MULTIPLE_VM if (ex->catche) { JavaObject* exc = 0; UserClass* cl = 0; @@ -931,13 +952,9 @@ ex->catchClass = cl; } else { -#ifdef MULTIPLE_VM - fprintf(stderr, "implement me"); - abort(); -#else ex->catchClass = Classpath::newThrowable; -#endif } +#endif ex->test = createBasicBlock("testException"); @@ -1028,11 +1045,13 @@ Value* cl = 0; currentBlock = cur->realTest; - assert(cur->catchClass); #ifdef MULTIPLE_VM - fprintf(stderr, "implement me"); - abort(); + // We're dealing with exceptions, don't catch the exception if the class can + // not be found. + if (catche) cl = getResolvedClass(cur->catche, false, false); + else cl = getJnjvmExceptionClass(); #else + assert(cur->catchClass); LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(cur->catchClass); cl = LCI->getVar(this); #endif @@ -1327,14 +1346,15 @@ void JavaJIT::makeArgs(FunctionType::param_iterator it, uint32 index, std::vector& Args, uint32 nb) { -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) - nb++; +#if defined(MULTIPLE_VM) + nb += 2; #endif Args.reserve(nb + 2); Value** args = (Value**)alloca(nb*sizeof(Value*)); -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) - args[nb - 1] = isolateLocal; - sint32 start = nb - 2; +#if defined(MULTIPLE_VM) + args[nb - 2] = isolateLocal; + sint32 start = nb - 3; + it--; it--; #else sint32 start = nb - 1; @@ -1509,6 +1529,14 @@ if (!val) { +#if defined(MULTIPLE_VM) + uint32 clIndex = ctpInfo->getClassIndexFromMethod(index); + Value* cl = getResolvedClass(clIndex, false); + + Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheFunction, cl, + "", currentBlock); + args.push_back(newCtpCache); +#endif Function* func = (Function*)ctpInfo->infoOfStaticOrSpecialMethod(index, ACC_VIRTUAL, signature, meth); @@ -1557,22 +1585,13 @@ ctpInfo->infoOfStaticOrSpecialMethod(index, ACC_STATIC, signature, meth); -#ifdef MULTIPLE_VM - +#if defined(MULTIPLE_VM) uint32 clIndex = ctpInfo->getClassIndexFromMethod(index); - Class* mycl = (Class*)(ctpInfo->getMethodClassIfLoaded(clIndex)); - Value* arg = 0; - if (mycl && mycl->isResolved()) { - LLVMCommonClassInfo* LCI = module->getClassInfo(mycl); - arg = LCI->getVar(this); - arg = invoke(JnjvmModule::InitialisationCheckFunction, arg, "", - currentBlock); - } else { - arg = getResolvedClass(clIndex, true); - } - CallInst::Create(JnjvmModule::ForceInitialisationCheckFunction, arg, "", - currentBlock); + Value* cl = getResolvedClass(clIndex, true); + Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheFunction, cl, + "", currentBlock); + args.push_back(newCtpCache); #endif if (meth && meth->canBeInlined && meth != compilingMethod && @@ -1610,7 +1629,7 @@ return arg1; } -Value* JavaJIT::getResolvedClass(uint16 index, bool clinit) { +Value* JavaJIT::getResolvedClass(uint16 index, bool clinit, bool doThrow) { Value* arg1 = getConstantPoolAt(index); arg1 = new BitCastInst(arg1, JnjvmModule::JavaClassType, "", currentBlock); @@ -1633,8 +1652,13 @@ Args.push_back(v); ConstantInt* CI = ConstantInt::get(Type::Int32Ty, index); Args.push_back(CI); - Value* res = invoke(JnjvmModule::ClassLookupFunction, Args, "", - currentBlock); + Value* res = 0; + if (doThrow) { + res = invoke(JnjvmModule::ClassLookupFunction, Args, "", currentBlock); + } else { + res = CallInst::Create(JnjvmModule::ClassLookupFunction, Args.begin(), + Args.end(), "", currentBlock); + } node->addIncoming(res, currentBlock); llvm::BranchInst::Create(trueCl, currentBlock); @@ -1660,18 +1684,23 @@ VT = CallInst::Create(JnjvmModule::GetVTFromClassFunction, Cl, "", currentBlock); } else { +#ifndef MULTIPLE_VM LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(cl); Size = LCI->getVirtualSize(this); VT = LCI->getVirtualTable(this); Cl = LCI->getVar(this); -#ifndef MULTIPLE_VM if (!cl->isReady()) { -#endif + Cl = invoke(JnjvmModule::InitialisationCheckFunction, Cl, "", currentBlock); + CallInst::Create(JnjvmModule::ForceInitialisationCheckFunction, Cl, "", + currentBlock); + } +#else + Cl = getResolvedClass(index, true); + Size = LCI->getVirtualSize(this); + VT = LCI->getVirtualTable(this); Cl = invoke(JnjvmModule::InitialisationCheckFunction, Cl, "", currentBlock); CallInst::Create(JnjvmModule::ForceInitialisationCheckFunction, Cl, "", currentBlock); -#ifndef MULTIPLE_VM - } #endif } std::vector args; @@ -1731,12 +1760,13 @@ #ifndef MULTIPLE_VM if (field->classDef->isReady()) { -#endif object = LCI->getStaticVar(this); type = LCI->getStaticType(); return fieldGetter(this, type, object, LFI->getOffset()); -#ifndef MULTIPLE_VM } +#else + // In a multi environment, we always need to get the ptr in the constant + // pool. Therefore, we do nothing here. #endif } else { type = LCI->getVirtualType(); @@ -2002,6 +2032,15 @@ JITVerifyNull(args[0]); +#if defined(MULTIPLE_VM) + Value* cl = CallInst::Create(JnjvmModule::GetClassFunction, args[0], "", + currentBlock); + + Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheFunction, cl, "", + currentBlock); + args.push_back(newCtpCache); +#endif + std::vector args1; args1.push_back(zero); args1.push_back(zero); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h Wed Aug 27 10:43:10 2008 @@ -208,7 +208,7 @@ llvm::Value* ldResolved(uint16 index, bool stat, llvm::Value* object, const llvm::Type* fieldType, const llvm::Type* fieldTypePtr); - llvm::Value* getResolvedClass(uint16 index, bool clinit); + llvm::Value* getResolvedClass(uint16 index, bool clinit, bool doThrow = true); // methods invoke void makeArgs(llvm::FunctionType::param_iterator it, Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Wed Aug 27 10:43:10 2008 @@ -1823,34 +1823,41 @@ UserClassArray* dcl = 0; ConstantInt* sizeElement = 0; GlobalVariable* TheVT = 0; - JnjvmClassLoader* JCL = compilingClass->classLoader; + Value* valCl = 0; if (bytecodes[i] == NEWARRAY) { uint8 id = bytecodes[++i]; AssessorDesc* ass = AssessorDesc::arrayType(id); +#ifndef MULTIPLE_VM dcl = ass->getArrayClass(); +#else + valCl = getJnjvmArrayCacheAt(ass->numId); +#endif + TheVT = JnjvmModule::JavaObjectVirtualTableGV; LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[ass->numId]; sizeElement = LAI.sizeInBytesConstant; } else { uint16 index = readU2(bytecodes, i); +#ifndef MULTIPLE_VM const UTF8* className = compilingClass->ctpInfo->resolveClassName(index); + JnjvmClassLoader* JCL = compilingClass->classLoader; const UTF8* arrayName = AssessorDesc::constructArrayName(JCL, 0, 1, className); dcl = JCL->constructArray(arrayName); +#else + + valCl = getResolvedClass(index, true); +#endif TheVT = JnjvmModule::ArrayObjectVirtualTableGV; sizeElement = mvm::jit::constantPtrSize; } -#ifdef MULTIPLE_VM - llvm::Value* valCl = 0; - fprintf(stderr, "implement me"); - abort(); -#else +#ifndef MULTIPLE_VM LLVMCommonClassInfo* LCI = module->getClassInfo(dcl); - llvm::Value* valCl = LCI->getVar(this); + valCl = LCI->getVar(this); #endif llvm::Value* arg1 = popAsInt(); @@ -2066,22 +2073,20 @@ } case MULTIANEWARRAY : { - JnjvmClassLoader* JCL = compilingClass->classLoader; uint16 index = readU2(bytecodes, i); uint8 dim = readU1(bytecodes, i); + +#ifdef MULTIPLE_VM + Value* valCl = getResolvedClass(index, true); +#else + JnjvmClassLoader* JCL = compilingClass->classLoader; const UTF8* className = compilingClass->ctpInfo->resolveClassName(index); UserClassArray* dcl = JCL->constructArray(className); compilingClass->ctpInfo->loadClass(index); - -#ifdef MULTIPLE_VM - llvm::Value* valCl = 0; - fprintf(stderr, "implement me %s", dcl->printString()); - abort(); -#else LLVMCommonClassInfo* LCI = module->getClassInfo(dcl); Value* valCl = LCI->getVar(this); #endif Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp Wed Aug 27 10:43:10 2008 @@ -40,10 +40,10 @@ va_list ap; va_start(ap, access); if (stat) { - method->invokeIntStaticAP(vm, ap); + method->invokeIntStaticAP(vm, (UserClass*)cl, ap); } else { JavaObject* obj = va_arg(ap, JavaObject*); - method->invokeIntSpecialAP(vm, obj, ap); + method->invokeIntSpecialAP(vm, (UserClass*)cl, obj, ap); } va_end(ap); } @@ -91,10 +91,10 @@ #if 1//defined(__PPC__) && !defined(__MACH__) #define INVOKE(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \ \ -TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap) { \ - if (!classDef->isReady()) { \ - classDef->classLoader->loadName(classDef->name, true, true); \ - classDef->initialiseClass(vm); \ +TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) { \ + if (!cl->isReady()) { \ + cl->classLoader->loadName(cl->getName(), true, true); \ + cl->initialiseClass(vm); \ } \ verifyNull(obj); \ Signdef* sign = getSignature(); \ @@ -102,13 +102,13 @@ void* _buf = (void*)buf; \ readArgs(buf, sign, ap); \ void* func = (((void***)obj)[0])[offset];\ - return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, func, obj, _buf);\ + return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, _buf);\ }\ \ -TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap) {\ - if (!classDef->isReady()) { \ - classDef->classLoader->loadName(classDef->name, true, true); \ - classDef->initialiseClass(vm); \ +TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) {\ + if (!cl->isReady()) { \ + cl->classLoader->loadName(cl->name, true, true); \ + cl->initialiseClass(vm); \ } \ \ verifyNull(obj);\ @@ -117,13 +117,13 @@ void* _buf = (void*)buf; \ readArgs(buf, sign, ap); \ void* func = this->compiledPtr();\ - return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, func, obj, _buf);\ + return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, _buf);\ }\ \ -TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, va_list ap) {\ - if (!classDef->isReady()) { \ - classDef->classLoader->loadName(classDef->name, true, true); \ - classDef->initialiseClass(vm); \ +TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, UserClass* cl, va_list ap) {\ + if (!cl->isReady()) { \ + cl->classLoader->loadName(cl->getName(), true, true); \ + cl->initialiseClass(vm); \ } \ \ Signdef* sign = getSignature(); \ @@ -131,13 +131,13 @@ void* _buf = (void*)buf; \ readArgs(buf, sign, ap); \ void* func = this->compiledPtr();\ - return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, func, _buf);\ + return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, cl->getCtpCache(), func, _buf);\ }\ \ -TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\ - if (!classDef->isReady()) { \ - classDef->classLoader->loadName(classDef->name, true, true); \ - classDef->initialiseClass(vm); \ +TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\ + if (!cl->isReady()) { \ + cl->classLoader->loadName(cl->getName(), true, true); \ + cl->initialiseClass(vm); \ } \ \ verifyNull(obj);\ @@ -145,52 +145,52 @@ \ Signdef* sign = getSignature(); \ void* func = meth->compiledPtr();\ - return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, func, obj, buf);\ + return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, buf);\ }\ \ -TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\ - if (!classDef->isReady()) { \ - classDef->classLoader->loadName(classDef->name, true, true); \ - classDef->initialiseClass(vm); \ +TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\ + if (!cl->isReady()) { \ + cl->classLoader->loadName(cl->getName(), true, true); \ + cl->initialiseClass(vm); \ } \ \ verifyNull(obj);\ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ - return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, func, obj, buf);\ + return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, buf);\ }\ \ -TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, void* buf) {\ - if (!classDef->isReady()) { \ - classDef->classLoader->loadName(classDef->name, true, true); \ - classDef->initialiseClass(vm); \ +TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, UserClass* cl, void* buf) {\ + if (!cl->isReady()) { \ + cl->classLoader->loadName(cl->getName(), true, true); \ + cl->initialiseClass(vm); \ } \ \ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ - return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, func, buf);\ + return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, cl->getCtpCache(), func, buf);\ }\ \ -TYPE JavaMethod::invoke##TYPE_NAME##Virtual(Jnjvm* vm, JavaObject* obj, ...) { \ +TYPE JavaMethod::invoke##TYPE_NAME##Virtual(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) { \ va_list ap;\ va_start(ap, obj);\ - TYPE res = invoke##TYPE_NAME##VirtualAP(vm, obj, ap);\ + TYPE res = invoke##TYPE_NAME##VirtualAP(vm, cl, obj, ap);\ va_end(ap); \ return res; \ }\ \ -TYPE JavaMethod::invoke##TYPE_NAME##Special(Jnjvm* vm, JavaObject* obj, ...) {\ +TYPE JavaMethod::invoke##TYPE_NAME##Special(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) {\ va_list ap;\ va_start(ap, obj);\ - TYPE res = invoke##TYPE_NAME##SpecialAP(vm, obj, ap);\ + TYPE res = invoke##TYPE_NAME##SpecialAP(vm, cl, obj, ap);\ va_end(ap); \ return res; \ }\ \ -TYPE JavaMethod::invoke##TYPE_NAME##Static(Jnjvm* vm, ...) {\ +TYPE JavaMethod::invoke##TYPE_NAME##Static(Jnjvm* vm, UserClass* cl, ...) {\ va_list ap;\ - va_start(ap, vm);\ - TYPE res = invoke##TYPE_NAME##StaticAP(vm, ap);\ + va_start(ap, cl);\ + TYPE res = invoke##TYPE_NAME##StaticAP(vm, cl, ap);\ va_end(ap); \ return res; \ }\ @@ -199,125 +199,125 @@ #define INVOKE(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \ \ -TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap) { \ - if (!classDef->isReady()) { \ - classDef->classLoader->loadName(classDef->name, true, true); \ - classDef->initialiseClass(vm); \ +TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) { \ + if (!cl->isReady()) { \ + cl->classLoader->loadName(cl->getName(), true, true); \ + cl->initialiseClass(vm); \ } \ \ verifyNull(obj); \ void* func = (((void***)obj)[0])[offset];\ Signdef* sign = getSignature(); \ - return ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(vm, func, obj, ap);\ + return ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(vm, cl->getCtpCache(), func, obj, ap);\ }\ \ -TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap) {\ - if (!classDef->isReady()) { \ - classDef->classLoader->loadName(classDef->name, true, true); \ - classDef->initialiseClass(vm); \ +TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) {\ + if (!cl->isReady()) { \ + cl->classLoader->loadName(cl->getName(), true, true); \ + cl->initialiseClass(vm); \ } \ \ verifyNull(obj);\ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ - return ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(vm, func, obj, ap);\ + return ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(vm, cl->getCtpCache(), func, obj, ap);\ }\ \ -TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, va_list ap) {\ - if (!classDef->isReady()) { \ - classDef->classLoader->loadName(classDef->name, true, true); \ - classDef->initialiseClass(vm); \ +TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, UserClass* cl, va_list ap) {\ + if (!cl->isReady()) { \ + cl->classLoader->loadName(cl->getName(), true, true); \ + cl->initialiseClass(vm); \ } \ \ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ - return ((FUNC_TYPE_STATIC_AP)sign->getStaticCallAP())(vm, func, ap);\ + return ((FUNC_TYPE_STATIC_AP)sign->getStaticCallAP())(vm, cl->getCtpCache(), func, ap);\ }\ \ -TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\ - if (!classDef->isReady()) { \ - classDef->classLoader->loadName(classDef->name, true, true); \ - classDef->initialiseClass(vm); \ +TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\ + if (!cl->isReady()) { \ + cl->classLoader->loadName(cl->getName(), true, true); \ + cl->initialiseClass(vm); \ } \ \ verifyNull(obj);\ void* func = (((void***)obj)[0])[offset];\ Signdef* sign = getSignature(); \ - return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, func, obj, buf);\ + return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, buf);\ }\ \ -TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\ - if (!classDef->isReady()) { \ - classDef->classLoader->loadName(classDef->name, true, true); \ - classDef->initialiseClass(vm); \ +TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\ + if (!cl->isReady()) { \ + cl->classLoader->loadName(cl->getName(), true, true); \ + cl->initialiseClass(vm); \ } \ \ verifyNull(obj);\ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ - return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, func, obj, buf);\ + return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, buf);\ }\ \ -TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, void* buf) {\ - if (!classDef->isReady()) { \ - classDef->classLoader->loadName(classDef->name, true, true); \ - classDef->initialiseClass(vm); \ +TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, UserClass* cl, void* buf) {\ + if (!cl->isReady()) { \ + cl->classLoader->loadName(cl->getName(), true, true); \ + cl->initialiseClass(vm); \ } \ \ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ - return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, func, buf);\ + return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, cl->getCtpCache(), func, buf);\ }\ \ -TYPE JavaMethod::invoke##TYPE_NAME##Virtual(Jnjvm* vm,JavaObject* obj, ...) { \ +TYPE JavaMethod::invoke##TYPE_NAME##Virtual(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) { \ va_list ap;\ va_start(ap, obj);\ - TYPE res = invoke##TYPE_NAME##VirtualAP(vm, obj, ap);\ + TYPE res = invoke##TYPE_NAME##VirtualAP(vm, cl, obj, ap);\ va_end(ap); \ return res; \ }\ \ -TYPE JavaMethod::invoke##TYPE_NAME##Special(Jnjvm* vm, JavaObject* obj, ...) {\ +TYPE JavaMethod::invoke##TYPE_NAME##Special(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) {\ va_list ap;\ va_start(ap, obj);\ - TYPE res = invoke##TYPE_NAME##SpecialAP(vm, obj, ap);\ + TYPE res = invoke##TYPE_NAME##SpecialAP(vm, cl, obj, ap);\ va_end(ap); \ return res; \ }\ \ -TYPE JavaMethod::invoke##TYPE_NAME##Static(Jnjvm* vm, ...) {\ +TYPE JavaMethod::invoke##TYPE_NAME##Static(Jnjvm* vm, UserClass* cl, ...) {\ va_list ap;\ - va_start(ap, this);\ - TYPE res = invoke##TYPE_NAME##StaticAP(vm, ap);\ + va_start(ap, cl);\ + TYPE res = invoke##TYPE_NAME##StaticAP(vm, cl, ap);\ va_end(ap); \ return res; \ }\ #endif -typedef uint32 (*uint32_virtual_ap)(Jnjvm*, void*, JavaObject*, va_list); -typedef sint64 (*sint64_virtual_ap)(Jnjvm*, void*, JavaObject*, va_list); -typedef float (*float_virtual_ap)(Jnjvm*, void*, JavaObject*, va_list); -typedef double (*double_virtual_ap)(Jnjvm*, void*, JavaObject*, va_list); -typedef JavaObject* (*object_virtual_ap)(Jnjvm*, void*, JavaObject*, va_list); - -typedef uint32 (*uint32_static_ap)(Jnjvm*, void*, va_list); -typedef sint64 (*sint64_static_ap)(Jnjvm*, void*, va_list); -typedef float (*float_static_ap)(Jnjvm*, void*, va_list); -typedef double (*double_static_ap)(Jnjvm*, void*, va_list); -typedef JavaObject* (*object_static_ap)(Jnjvm*, void*, va_list); - -typedef uint32 (*uint32_virtual_buf)(Jnjvm*, void*, JavaObject*, void*); -typedef sint64 (*sint64_virtual_buf)(Jnjvm*, void*, JavaObject*, void*); -typedef float (*float_virtual_buf)(Jnjvm*, void*, JavaObject*, void*); -typedef double (*double_virtual_buf)(Jnjvm*, void*, JavaObject*, void*); -typedef JavaObject* (*object_virtual_buf)(Jnjvm*, void*, JavaObject*, void*); - -typedef uint32 (*uint32_static_buf)(Jnjvm*, void*, void*); -typedef sint64 (*sint64_static_buf)(Jnjvm*, void*, void*); -typedef float (*float_static_buf)(Jnjvm*, void*, void*); -typedef double (*double_static_buf)(Jnjvm*, void*, void*); -typedef JavaObject* (*object_static_buf)(Jnjvm*, void*, void*); +typedef uint32 (*uint32_virtual_ap)(Jnjvm*, UserConstantPool*, void*, JavaObject*, va_list); +typedef sint64 (*sint64_virtual_ap)(Jnjvm*, UserConstantPool*, void*, JavaObject*, va_list); +typedef float (*float_virtual_ap)(Jnjvm*, UserConstantPool*, void*, JavaObject*, va_list); +typedef double (*double_virtual_ap)(Jnjvm*, UserConstantPool*, void*, JavaObject*, va_list); +typedef JavaObject* (*object_virtual_ap)(Jnjvm*, UserConstantPool*, void*, JavaObject*, va_list); + +typedef uint32 (*uint32_static_ap)(Jnjvm*, UserConstantPool*, void*, va_list); +typedef sint64 (*sint64_static_ap)(Jnjvm*, UserConstantPool*, void*, va_list); +typedef float (*float_static_ap)(Jnjvm*, UserConstantPool*, void*, va_list); +typedef double (*double_static_ap)(Jnjvm*, UserConstantPool*, void*, va_list); +typedef JavaObject* (*object_static_ap)(Jnjvm*, UserConstantPool*, void*, va_list); + +typedef uint32 (*uint32_virtual_buf)(Jnjvm*, UserConstantPool*, void*, JavaObject*, void*); +typedef sint64 (*sint64_virtual_buf)(Jnjvm*, UserConstantPool*, void*, JavaObject*, void*); +typedef float (*float_virtual_buf)(Jnjvm*, UserConstantPool*, void*, JavaObject*, void*); +typedef double (*double_virtual_buf)(Jnjvm*, UserConstantPool*, void*, JavaObject*, void*); +typedef JavaObject* (*object_virtual_buf)(Jnjvm*, UserConstantPool*, void*, JavaObject*, void*); + +typedef uint32 (*uint32_static_buf)(Jnjvm*, UserConstantPool*, void*, void*); +typedef sint64 (*sint64_static_buf)(Jnjvm*, UserConstantPool*, void*, void*); +typedef float (*float_static_buf)(Jnjvm*, UserConstantPool*, void*, void*); +typedef double (*double_static_buf)(Jnjvm*, UserConstantPool*, void*, void*); +typedef JavaObject* (*object_static_buf)(Jnjvm*, UserConstantPool*, void*, void*); INVOKE(uint32, Int, uint32_virtual_ap, uint32_static_ap, uint32_virtual_buf, uint32_static_buf) INVOKE(sint64, Long, sint64_virtual_ap, sint64_static_ap, sint64_virtual_buf, sint64_static_buf) Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp Wed Aug 27 10:43:10 2008 @@ -53,6 +53,7 @@ JavaField* Classpath::rootGroup; JavaField* Classpath::vmThread; JavaMethod* Classpath::uncaughtException; +Class* Classpath::inheritableThreadLocal; JavaMethod* Classpath::setContextClassLoader; JavaMethod* Classpath::getSystemClassLoader; @@ -87,6 +88,8 @@ JavaField* Classpath::bufferAddress; JavaField* Classpath::dataPointer32; JavaField* Classpath::vmdataClassLoader; +Class* Classpath::newClassLoader; + JavaField* Classpath::boolValue; JavaField* Classpath::byteValue; @@ -214,7 +217,7 @@ JavaObject* Stat = threadGroup->getStaticInstance(); JavaObject* RG = rootGroup->getObjectField(Stat); group->setObjectField(th, RG); - groupAddThread->invokeIntSpecial(vm, RG, th); + groupAddThread->invokeIntSpecial(vm, threadGroup, RG, th); } void Classpath::mapInitialThread(Jnjvm* vm) { @@ -227,10 +230,13 @@ myth->javaThread = th; JavaObject* vmth = vmThread->getObjectField(th); vmdataVMThread->setObjectField(vmth, (JavaObject*)myth); - finaliseCreateInitialThread->invokeIntStatic(vm, th); + finaliseCreateInitialThread->invokeIntStatic(vm, inheritableThreadLocal, th); } void Classpath::initialiseClasspath(JnjvmClassLoader* loader) { + newClassLoader = + UPCALL_CLASS(loader, "java/lang/ClassLoader"); + getSystemClassLoader = UPCALL_METHOD(loader, "java/lang/ClassLoader", "getSystemClassLoader", "()Ljava/lang/ClassLoader;", ACC_STATIC); @@ -499,6 +505,9 @@ UPCALL_FIELD(loader, "java/lang/VMThread", "vmdata", "Ljava/lang/Object;", ACC_VIRTUAL); + inheritableThreadLocal = + UPCALL_CLASS(loader, "java/lang/InheritableThreadLocal"); + finaliseCreateInitialThread = UPCALL_METHOD(loader, "java/lang/InheritableThreadLocal", "newChildThread", "(Ljava/lang/Thread;)V", ACC_STATIC); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h Wed Aug 27 10:43:10 2008 @@ -54,6 +54,7 @@ class Classpath { public: + ISOLATE_STATIC Class* newClassLoader; ISOLATE_STATIC JavaMethod* getSystemClassLoader; ISOLATE_STATIC JavaMethod* setContextClassLoader; ISOLATE_STATIC UserClass* newString; @@ -131,7 +132,9 @@ ISOLATE_STATIC JavaField* rootGroup; ISOLATE_STATIC JavaField* vmThread; ISOLATE_STATIC JavaMethod* uncaughtException; + ISOLATE_STATIC Class* inheritableThreadLocal; + ISOLATE_STATIC UserClass* InvocationTargetException; ISOLATE_STATIC UserClass* ArrayStoreException; ISOLATE_STATIC UserClass* ClassCastException; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp Wed Aug 27 10:43:10 2008 @@ -143,7 +143,7 @@ JavaMethod* init = cl->lookupMethod(Jnjvm::initName, cl->classLoader->asciizConstructUTF8("(Ljava/lang/String;)V"), 0, 1); - init->invokeIntSpecial(vm, res, vm->asciizToStr(msg)); + init->invokeIntSpecial(vm, (UserClass*)cl, res, vm->asciizToStr(msg)); th->pendingException = res; th->returnFromNative(); return 1; @@ -229,7 +229,7 @@ UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); Jnjvm* vm = JavaThread::get()->isolate; JavaObject* res = cl->doNew(vm); - meth->invokeIntSpecialAP(vm, res, ap); + meth->invokeIntSpecialAP(vm, cl, res, ap); va_end(ap); return (jobject)res; @@ -320,7 +320,13 @@ JavaObject* self = (JavaObject*)obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->isolate; - JavaObject* res = meth->invokeJavaObjectVirtualAP(vm, self, ap); + UserClass* cl = 0; +#ifdef MULTIPLE_VM + cl = self->classOf->lookupClassFromMethod(meth); +#else + cl = meth->classDef; +#endif + JavaObject* res = meth->invokeJavaObjectVirtualAP(vm, cl, self, ap); va_end(ap); return (jobject)res; @@ -352,7 +358,13 @@ JavaObject* self = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->isolate; - uint32 res = meth->invokeIntVirtualAP(vm, self, ap); + UserClass* cl = 0; +#ifdef MULTIPLE_VM + cl = self->classOf->lookupClassFromMethod(meth); +#else + cl = meth->classDef; +#endif + uint32 res = meth->invokeIntVirtualAP(vm, cl, self, ap); va_end(ap); return res; @@ -444,7 +456,13 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->isolate; - uint32 res = meth->invokeIntVirtualAP(vm, obj, ap); + UserClass* cl = 0; +#ifdef MULTIPLE_VM + cl = obj->classOf->lookupClassFromMethod(meth); +#else + cl = meth->classDef; +#endif + uint32 res = meth->invokeIntVirtualAP(vm, cl, obj, ap); va_end(ap); return res; @@ -498,7 +516,13 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->isolate; - jfloat res = meth->invokeFloatVirtualAP(vm, obj, ap); + UserClass* cl = 0; +#ifdef MULTIPLE_VM + cl = obj->classOf->lookupClassFromMethod(meth); +#else + cl = meth->classDef; +#endif + jfloat res = meth->invokeFloatVirtualAP(vm, cl, obj, ap); va_end(ap); return res; @@ -531,7 +555,13 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->isolate; - jdouble res = meth->invokeDoubleVirtualAP(vm, obj, ap); + UserClass* cl = 0; +#ifdef MULTIPLE_VM + cl = obj->classOf->lookupClassFromMethod(meth); +#else + cl = meth->classDef; +#endif + jdouble res = meth->invokeDoubleVirtualAP(vm, cl, obj, ap); va_end(ap); return res; @@ -548,7 +578,13 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->isolate; - return meth->invokeDoubleVirtualAP(vm, obj, args); + UserClass* cl = 0; +#ifdef MULTIPLE_VM + cl = obj->classOf->lookupClassFromMethod(meth); +#else + cl = meth->classDef; +#endif + return meth->invokeDoubleVirtualAP(vm, cl, obj, args); END_EXCEPTION return 0.0; @@ -573,7 +609,13 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->isolate; - meth->invokeIntVirtualAP(vm, obj, ap); + UserClass* cl = 0; +#ifdef MULTIPLE_VM + cl = obj->classOf->lookupClassFromMethod(meth); +#else + cl = meth->classDef; +#endif + meth->invokeIntVirtualAP(vm, cl, obj, ap); va_end(ap); END_EXCEPTION @@ -588,7 +630,13 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->isolate; - meth->invokeIntVirtualAP(vm, obj, args); + UserClass* cl = 0; +#ifdef MULTIPLE_VM + cl = obj->classOf->lookupClassFromMethod(meth); +#else + cl = meth->classDef; +#endif + meth->invokeIntVirtualAP(vm, cl, obj, args); END_EXCEPTION } @@ -808,7 +856,13 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->isolate; - meth->invokeIntSpecialAP(vm, obj, ap); + UserClass* cl = 0; +#ifdef MULTIPLE_VM + cl = obj->classOf->lookupClassFromMethod(meth); +#else + cl = meth->classDef; +#endif + meth->invokeIntSpecialAP(vm, cl, obj, ap); va_end(ap); END_EXCEPTION @@ -1120,7 +1174,13 @@ va_start(ap, methodID); JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->isolate; - uint32 res = meth->invokeIntStaticAP(vm, ap); + UserClass* cl = 0; +#ifdef MULTIPLE_VM + cl = NativeUtil::resolvedImplClass(clazz, true); +#else + cl = meth->classDef; +#endif + uint32 res = meth->invokeIntStaticAP(vm, cl, ap); va_end(ap); return res; @@ -1295,7 +1355,13 @@ va_start(ap, methodID); JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->isolate; - meth->invokeIntStaticAP(vm, ap); + UserClass* cl = 0; +#ifdef MULTIPLE_VM + cl = NativeUtil::resolvedImplClass(clazz, true); +#else + cl = meth->classDef; +#endif + meth->invokeIntStaticAP(vm, cl, ap); va_end(ap); END_EXCEPTION @@ -1309,7 +1375,13 @@ JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->isolate; - meth->invokeIntStaticAP(vm, args); + UserClass* cl = 0; +#ifdef MULTIPLE_VM + cl = NativeUtil::resolvedImplClass(clazz, true); +#else + cl = meth->classDef; +#endif + meth->invokeIntStaticAP(vm, cl, args); END_EXCEPTION } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp Wed Aug 27 10:43:10 2008 @@ -165,7 +165,7 @@ void Jnjvm::errorWithExcp(UserClass* cl, JavaMethod* init, const JavaObject* excp) { JavaObject* obj = cl->doNew(this); - init->invokeIntSpecial(this, obj, excp); + init->invokeIntSpecial(this, cl, obj, excp); JavaThread::throwException(obj); } @@ -177,7 +177,7 @@ va_end(ap); JavaObject* obj = cl->doNew(this); - init->invokeIntSpecial(this, obj, asciizToStr(tmp)); + init->invokeIntSpecial(this, cl, obj, asciizToStr(tmp)); JavaThread::throwException(obj); } @@ -333,13 +333,14 @@ JavaObject* CommonClass::getClassDelegatee(Jnjvm* vm, JavaObject* pd) { acquire(); if (!(delegatee)) { - JavaObject* delegatee = vm->upcalls->newClass->doNew(vm); + UserClass* cl = vm->upcalls->newClass; + JavaObject* delegatee = cl->doNew(vm); if (!pd) { - vm->upcalls->initClass->invokeIntSpecial(vm, delegatee, this); + vm->upcalls->initClass->invokeIntSpecial(vm, cl, delegatee, this); } else { - vm->upcalls->initClassWithProtectionDomain->invokeIntSpecial(vm, - delegatee, - this, pd); + vm->upcalls->initClassWithProtectionDomain->invokeIntSpecial(vm, cl, + delegatee, + this, pd); } this->delegatee = delegatee; } @@ -646,7 +647,9 @@ JnjvmClassLoader* Jnjvm::loadAppClassLoader() { if (appClassLoader == 0) { - JavaObject* loader = upcalls->getSystemClassLoader->invokeJavaObjectStatic(this); + UserClass* cl = upcalls->newClassLoader; + JavaObject* loader = + upcalls->getSystemClassLoader->invokeJavaObjectStatic(this, cl); appClassLoader = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader); } return appClassLoader; @@ -704,8 +707,9 @@ mapInitialThread(); loadAppClassLoader(); JavaObject* obj = JavaThread::currentThread(); - upcalls->setContextClassLoader->invokeIntSpecial(this, obj, - appClassLoader->getJavaClassLoader()); + JavaObject* javaLoader = appClassLoader->getJavaClassLoader(); + upcalls->setContextClassLoader->invokeIntSpecial(this, upcalls->newThread, + obj, javaLoader); // load and initialise math since it is responsible for dlopen'ing // libjavalang.so and we are optimizing some math operations UserCommonClass* math = @@ -727,8 +731,8 @@ JavaObject* group = upcalls->group->getObjectField(obj); try{ - upcalls->uncaughtException->invokeIntSpecial(this, group, obj, - exc); + upcalls->uncaughtException->invokeIntSpecial(this, upcalls->threadGroup, + group, obj, exc); }catch(...) { printf("Even uncaught exception throwed an exception!\n"); assert(0); @@ -834,5 +838,17 @@ isolate->bootstrapLoader = JnjvmClassLoader::bootstrapLoader; isolate->upcalls = isolate->bootstrapLoader->upcalls; +#ifdef MULTIPLE_VM + isolate->throwable = isolate->upcalls->newThrowable; + isolate->arrayClasses[1] = isolate->upcalls->ArrayOfBool; + isolate->arrayClasses[2] = isolate->upcalls->ArrayOfByte; + isolate->arrayClasses[3] = isolate->upcalls->ArrayOfChar; + isolate->arrayClasses[4] = isolate->upcalls->ArrayOfShort; + isolate->arrayClasses[5] = isolate->upcalls->ArrayOfInt; + isolate->arrayClasses[6] = isolate->upcalls->ArrayOfFloat; + isolate->arrayClasses[7] = isolate->upcalls->ArrayOfLong; + isolate->arrayClasses[8] = isolate->upcalls->ArrayOfDouble; +#endif + return isolate; } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h Wed Aug 27 10:43:10 2008 @@ -88,6 +88,17 @@ /// Jnjvm - A JVM. Each execution of a program allocates a Jnjvm. /// class Jnjvm : public mvm::VirtualMachine { +public: +#ifdef MULTIPLE_GC + /// GC - The garbage collector of this JVM. + /// + Collector* GC; +#endif + +#ifdef MULTIPLE_VM + UserClass* throwable; + UserClassArray* arrayClasses[9]; +#endif private: /// bootstrapThread - The initial thread of this JVM. @@ -200,13 +211,7 @@ static const UTF8* sinh; static const UTF8* tanh; static const UTF8* finalize; - -#ifdef MULTIPLE_GC - /// GC - The garbage collector of this JVM. - /// - Collector* GC; -#endif - + /// bootstraLoader - Bootstrap loader for base classes of this virtual /// machine. /// Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Wed Aug 27 10:43:10 2008 @@ -134,9 +134,15 @@ const UTF8* javaName = name->internalToJava(hashUTF8, 0, name->size); JavaString* str = isolate->UTF8ToStr(javaName); Classpath* upcalls = bootstrapLoader->upcalls; + UserClass* forCtp = 0; +#ifdef MULTIPLE_VM + forCtp = javaLoader->classOf->lookupClassInMethod(upcalls->loadInClassLoader); +#else + forCtp = upcalls->loadInClassLoader->classDef; +#endif JavaObject* obj = (JavaObject*) - upcalls->loadInClassLoader->invokeJavaObjectVirtual(isolate, javaLoader, - str); + upcalls->loadInClassLoader->invokeJavaObjectVirtual(isolate, forCtp, + javaLoader, str); cl = (UserCommonClass*)(upcalls->vmdataClass->getObjectField(obj)); } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=55416&r1=55415&r2=55416&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Aug 27 10:43:10 2008 @@ -448,8 +448,8 @@ return staticType; } -Value* LLVMClassInfo::getStaticVar(JavaJIT* jit) { #ifndef MULTIPLE_VM +Value* LLVMClassInfo::getStaticVar(JavaJIT* jit) { if (!staticVarGV) { getStaticType(); JavaObject* obj = ((Class*)classDef)->getStaticInstance(); @@ -464,12 +464,8 @@ } return new LoadInst(staticVarGV, "", jit->currentBlock); - -#else - fprintf(stderr, "implement me\n"); - abort(); -#endif } +#endif Value* LLVMClassInfo::getVirtualTable(JavaJIT* jit) { if (!virtualTableGV) { @@ -570,8 +566,9 @@ llvmArgs.push_back(LAI.llvmType); } -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) +#if defined(MULTIPLE_VM) llvmArgs.push_back(mvm::jit::ptrType); // domain + llvmArgs.push_back(mvm::jit::ptr32Type); // cached constant pool #endif uint8 id = signature->ret->funcs->numId; @@ -594,8 +591,9 @@ llvmArgs.push_back(LAI.llvmType); } -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) +#if defined(MULTIPLE_VM) llvmArgs.push_back(mvm::jit::ptrType); // domain + llvmArgs.push_back(mvm::jit::ptr32Type); // cached constant pool #endif uint8 id = signature->ret->funcs->numId; @@ -621,8 +619,9 @@ llvmArgs.push_back(LAI.llvmType); } -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) +#if defined(MULTIPLE_VM) llvmArgs.push_back(mvm::jit::ptrType); // domain + llvmArgs.push_back(mvm::jit::ptr32Type); // cached constant pool #endif uint8 id = signature->ret->funcs->numId; @@ -647,10 +646,14 @@ BasicBlock* currentBlock = BasicBlock::Create("enter", res); Function::arg_iterator i = res->arg_begin(); Value *obj, *ptr, *func; -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) +#if defined(MULTIPLE_VM) Value* vm = i; #endif ++i; +#if defined(MULTIPLE_VM) + Value* ctp = i; +#endif + ++i; func = i; ++i; if (virt) { @@ -676,8 +679,9 @@ } } -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) +#if defined(MULTIPLE_VM) Args.push_back(vm); + Args.push_back(ctp); #endif Value* val = CallInst::Create(func, Args.begin(), Args.end(), "", currentBlock); @@ -702,10 +706,14 @@ BasicBlock* currentBlock = BasicBlock::Create("enter", res); Function::arg_iterator i = res->arg_begin(); Value *obj, *ap, *func; -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) +#if defined(MULTIPLE_VM) Value* vm = i; #endif ++i; +#if defined(MULTIPLE_VM) + Value* ctp = i; +#endif + ++i; func = i; ++i; if (virt) { @@ -722,8 +730,9 @@ Args.push_back(new VAArgInst(ap, LAI.llvmType, "", currentBlock)); } -#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC) +#if defined(MULTIPLE_VM) Args.push_back(vm); + Args.push_back(ctp); #endif Value* val = CallInst::Create(func, Args.begin(), Args.end(), "", currentBlock); @@ -763,6 +772,7 @@ llvm::MutexGuard locked(mvm::jit::executionEngine->lock); std::vector Args2; Args2.push_back(mvm::jit::ptrType); // vm + Args2.push_back(mvm::jit::ptr32Type); // ctp Args2.push_back(getVirtualPtrType()); Args2.push_back(JnjvmModule::JavaObjectType); Args2.push_back(PointerType::getUnqual(Type::Int32Ty)); @@ -779,6 +789,7 @@ llvm::MutexGuard locked(mvm::jit::executionEngine->lock); std::vector Args; Args.push_back(mvm::jit::ptrType); // vm + Args.push_back(mvm::jit::ptr32Type); // ctp Args.push_back(getStaticPtrType()); Args.push_back(PointerType::getUnqual(Type::Int32Ty)); uint8 id = signature->ret->funcs->numId; From nicolas.geoffray at lip6.fr Wed Aug 27 14:44:41 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 27 Aug 2008 21:44:41 -0000 Subject: [vmkit-commits] [vmkit] r55437 - in /vmkit/branches/isolate/lib/JnJVM: LLVMRuntime/runtime-default.ll VMCore/JavaCache.cpp VMCore/JavaCache.h VMCore/JavaJIT.cpp VMCore/JavaRuntimeJIT.cpp VMCore/JnjvmModule.cpp VMCore/JnjvmModule.h Message-ID: <200808272144.m7RLigpK006465@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 27 16:44:41 2008 New Revision: 55437 URL: http://llvm.org/viewvc/llvm-project?rev=55437&view=rev Log: Constant pool lookups only take the class and index (except for vtableLookup to deal with a gcj/javac bug). Modified: vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h Modified: vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll?rev=55437&r1=55436&r2=55437&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll (original) +++ vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll Wed Aug 27 16:44:41 2008 @@ -97,15 +97,18 @@ ;;; vtableLookup - Look up the offset in a virtual table of a specific ;;; function. This function takes a class and an index to lookup in the ;;; constant pool and returns and stores it in the constant pool cache. -declare i32 @vtableLookup(%JavaObject*, %JavaClass*, i32) readnone +declare i32 @vtableLookup(%JavaClass*, i32, %JavaObject*) readnone ;;; newLookup - Look up a specific class. The function takes a class and an ;;; index to lookup in the constant pool and returns and stores it in the ;;; constant pool cache. -declare %JavaClass* @newLookup(%JavaClass*, i32) readnone +declare %JavaClass* @classLookup(%JavaClass*, i32) readnone ;;; fieldLookup - Look up a specific field. -declare i8* @fieldLookup(%JavaObject*, %JavaClass*, i32, i32) readnone +declare i32 @virtualFieldLookup(%JavaClass*, i32) readnone + +;;; fieldLookup - Look up a specific field. +declare i8* @staticFieldLookup(%JavaClass*, i32) readnone ;;; JavaObjectAquire - This function is called when starting a synchronized ;;; block or method. Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.cpp?rev=55437&r1=55436&r2=55437&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.cpp Wed Aug 27 16:44:41 2008 @@ -44,7 +44,7 @@ enveloppe = E; } -Enveloppe::Enveloppe(JavaConstantPool* ctp, uint32 i) { +Enveloppe::Enveloppe(UserConstantPool* ctp, uint32 i) { firstCache = new CacheNode(this); cacheLock = mvm::Lock::allocNormal(); ctpInfo = ctp; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.h?rev=55437&r1=55436&r2=55437&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.h Wed Aug 27 16:44:41 2008 @@ -27,11 +27,11 @@ #include "types.h" +#include "JnjvmConfig.h" + namespace jnjvm { class Enveloppe; -class JavaConstantPool; -class UserClass; /// CacheNode - A {class, method pointer} pair. class CacheNode { @@ -49,6 +49,12 @@ /// enveloppe - The container to which this class belongs to. Enveloppe* enveloppe; +#ifdef MULTIPLE_VM + ///definingClass - The class that defined the method being called. + /// + UserConstantPool* definingCtp; +#endif + /// CacheNode - Creates a CacheNode with empty values. CacheNode(Enveloppe* E); }; @@ -67,7 +73,7 @@ /// ctpInfo - The constant pool info that owns the invokeinterface /// bytecode. This is used to resolve the interface call at its first /// occurence. - JavaConstantPool* ctpInfo; + UserConstantPool* ctpInfo; /// cacheLock - The linked list may be modified by concurrent thread. This /// lock ensures that the list stays consistent. @@ -79,7 +85,7 @@ /// Enveloppe - Allocates the linked list with the given constant pool info /// at the given index, so as the resolution process knows which interface /// method the invokeinterface bytecode references. - Enveloppe(JavaConstantPool* info, uint32 index); + Enveloppe(UserConstantPool* info, uint32 index); }; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp?rev=55437&r1=55436&r2=55437&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp Wed Aug 27 16:44:41 2008 @@ -74,15 +74,6 @@ JITVerifyNull(args[0]); -#if defined(MULTIPLE_VM) - Value* cl = CallInst::Create(JnjvmModule::GetClassFunction, args[0], "", - currentBlock); - - Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheFunction, cl, "", - currentBlock); - args.push_back(newCtpCache); -#endif - Value* VT = CallInst::Create(JnjvmModule::GetVTFunction, args[0], "", currentBlock); std::vector indexes2; //[3]; @@ -107,12 +98,12 @@ currentBlock = ifFalse; std::vector Args; - Args.push_back(args[0]); LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); Args.push_back(LCI->getVar(this)); Constant* CI = ConstantInt::get(Type::Int32Ty, index); Args.push_back(CI); + Args.push_back(args[0]); val = invoke(JnjvmModule::VirtualLookupFunction, Args, "", currentBlock); node->addIncoming(val, currentBlock); llvm::BranchInst::Create(endBlock, currentBlock); @@ -1809,17 +1800,21 @@ // ---------- In case we have to resolve -------------------------------- // currentBlock = ifFalse; std::vector args; - if (object) { - args.push_back(object); - } else { - args.push_back(JnjvmModule::JavaObjectNullConstant); - } LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); args.push_back(LCI->getVar(this)); Constant* CI = ConstantInt::get(Type::Int32Ty, index); args.push_back(CI); - args.push_back(stat ? mvm::jit::constantOne : mvm::jit::constantZero); - Value* tmp = invoke(JnjvmModule::FieldLookupFunction, args, "", currentBlock); + Function* func = stat ? JnjvmModule::StaticFieldLookupFunction : + JnjvmModule::VirtualFieldLookupFunction; + Value* tmp = invoke(func, args, "", currentBlock); + if (!stat) { + Value* ptr = new BitCastInst(object, Pty, "", currentBlock); + args.clear(); + args.push_back(zero); + args.push_back(tmp); + tmp = GetElementPtrInst::Create(ptr, args.begin(), args.end(), "", + currentBlock); + } node->addIncoming(tmp, currentBlock); llvm::BranchInst::Create(endBlock, currentBlock); @@ -2016,29 +2011,23 @@ if (retType != Type::VoidTy) { node = PHINode::Create(retType, "", endBlock); } + + JITVerifyNull(args[0]); + + Value* zero = mvm::jit::constantZero; + Value* one = mvm::jit::constantOne; +#ifndef MULTIPLE_VM // ok now the cache Enveloppe* enveloppe = new Enveloppe(compilingClass->ctpInfo, index); compilingMethod->caches.push_back(enveloppe); - - Value* zero = mvm::jit::constantZero; - Value* one = mvm::jit::constantOne; - + Value* llvmEnv = ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64_t (enveloppe)), JnjvmModule::EnveloppeType); - - - JITVerifyNull(args[0]); - -#if defined(MULTIPLE_VM) - Value* cl = CallInst::Create(JnjvmModule::GetClassFunction, args[0], "", - currentBlock); - - Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheFunction, cl, "", - currentBlock); - args.push_back(newCtpCache); +#else + llvmEnv = getConstantPoolAt(index); #endif std::vector args1; @@ -2083,6 +2072,12 @@ _meth = new LoadInst(methPtr, "", currentBlock); meth = new BitCastInst(_meth, virtualPtrType, "", currentBlock); +#ifdef MULTIPLE_VM + cache = new LoadInst(cachePtr, "", currentBlock); + Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheNodeFunction, + cache, "", currentBlock); + args.push_back(newCtpCache); +#endif ret = invoke(meth, args, "", currentBlock); BranchInst::Create(endBlock, currentBlock); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=55437&r1=55436&r2=55437&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Wed Aug 27 16:44:41 2008 @@ -30,15 +30,6 @@ using namespace jnjvm; -#ifdef MULTIPLE_VM -extern "C" JavaString* stringLookup(UserClass* cl, uint32 index) { - JavaConstantPool* ctpInfo = cl->getConstantPool(); - const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[index]); - JavaString* str = JavaThread::get()->isolate->UTF8ToStr(utf8); - return str; -} -#endif - extern "C" void* jnjvmVirtualLookup(CacheNode* cache, JavaObject *obj) { Enveloppe* enveloppe = cache->enveloppe; JavaConstantPool* ctpInfo = enveloppe->ctpInfo; @@ -93,9 +84,29 @@ return rcache->methPtr; } -extern "C" void* fieldLookup(JavaObject* obj, UserClass* caller, uint32 index, - uint32 stat) { +extern "C" uint32 virtualFieldLookup(UserClass* caller, uint32 index) { + JavaConstantPool* ctpInfo = caller->getConstantPool(); + if (ctpInfo->ctpRes[index]) { + return (uint32)ctpInfo->ctpRes[index]; + } + + UserCommonClass* cl = 0; + UserCommonClass* fieldCl = 0; + const UTF8* utf8 = 0; + Typedef* sign = 0; + + ctpInfo->resolveField(index, cl, utf8, sign); + + JavaField* field = cl->lookupField(utf8, sign->keyName, false, true, fieldCl); + + ctpInfo->ctpRes[index] = (void*)field->ptrOffset; + + return field->ptrOffset; +} + +extern "C" void* staticFieldLookup(UserClass* caller, uint32 index) { JavaConstantPool* ctpInfo = caller->getConstantPool(); + if (ctpInfo->ctpRes[index]) { return ctpInfo->ctpRes[index]; } @@ -107,20 +118,56 @@ ctpInfo->resolveField(index, cl, utf8, sign); - JavaField* field = cl->lookupField(utf8, sign->keyName, stat, true, fieldCl); + JavaField* field = cl->lookupField(utf8, sign->keyName, true, true, fieldCl); + + fieldCl->initialiseClass(JavaThread::get()->isolate); + void* ptr = + (void*)((uint64)(((UserClass*)fieldCl)->getStaticInstance()) + field->ptrOffset); + ctpInfo->ctpRes[index] = ptr; - void* ptr = 0; - if (stat) { - fieldCl->initialiseClass(JavaThread::get()->isolate); - ptr = (void*)((uint64)(((UserClass*)fieldCl)->getStaticInstance()) + field->ptrOffset); - ctpInfo->ctpRes[index] = ptr; + return ptr; +} + +#ifdef MULTIPLE_VM +extern "C" JavaString* stringLookup(UserClass* cl, uint32 index) { + JavaConstantPool* ctpInfo = cl->getConstantPool(); + const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[index]); + JavaString* str = JavaThread::get()->isolate->UTF8ToStr(utf8); + ctpInfo->ctpRes[index] = str; + return str; +} +#endif + +#ifndef WITHOUT_VTABLE +extern "C" uint32 vtableLookup(UserClass* caller, uint32 index, JavaObject* obj) { + UserCommonClass* cl = 0; + const UTF8* utf8 = 0; + Signdef* sign = 0; + + caller->getConstantPool()->resolveMethod(index, cl, utf8, sign); + JavaMethod* dmeth = cl->lookupMethodDontThrow(utf8, sign->keyName, false, + true); + assert(obj->classOf->isReady() && "Class not ready in a virtual lookup."); + if (!dmeth) { + // Arg, it should have been an invoke interface.... Perform the lookup + // on the object class and do not update offset. + dmeth = obj->classOf->lookupMethod(utf8, sign->keyName, false, true); } else { - ptr = (void*)((uint64)obj + field->ptrOffset); - ctpInfo->ctpRes[index] = (void*)field->ptrOffset; + caller->getConstantPool()->ctpRes[index] = (void*)dmeth->offset; } - return ptr; + assert(dmeth->classDef->isReady() && "Class not ready in a virtual lookup."); + + return dmeth->offset; } +#endif + +extern "C" UserClass* classLookup(UserClass* caller, uint32 index) { + JavaConstantPool* ctpInfo = caller->getConstantPool(); + UserClass* cl = (UserClass*)ctpInfo->loadClass(index); + return cl; +} + extern "C" void printMethodStart(JavaMethod* meth) { printf("[%d] executing %s\n", mvm::Thread::self(), meth->printString()); @@ -185,37 +232,6 @@ return cl->getClassDelegatee(vm); } -extern "C" UserClass* newLookup(UserClass* caller, uint32 index) { - JavaConstantPool* ctpInfo = caller->getConstantPool(); - UserClass* cl = (UserClass*)ctpInfo->loadClass(index); - return cl; -} - -#ifndef WITHOUT_VTABLE -extern "C" uint32 vtableLookup(JavaObject* obj, UserClass* caller, uint32 index) { - UserCommonClass* cl = 0; - const UTF8* utf8 = 0; - Signdef* sign = 0; - - caller->getConstantPool()->resolveMethod(index, cl, utf8, sign); - JavaMethod* dmeth = cl->lookupMethodDontThrow(utf8, sign->keyName, false, - true); - assert(obj->classOf->isReady() && "Class not ready in a virtual lookup."); - if (!dmeth) { - // Arg, it should have been an invoke interface.... Perform the lookup - // on the object class and do not update offset. - dmeth = obj->classOf->lookupMethod(utf8, sign->keyName, false, true); - } else { - caller->getConstantPool()->ctpRes[index] = (void*)dmeth->offset; - } - - assert(dmeth->classDef->isReady() && "Class not ready in a virtual lookup."); - - return dmeth->offset; -} -#endif - - static JavaArray* multiCallNewIntern(arrayCtor_t ctor, UserClassArray* cl, uint32 len, sint32* dims, Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=55437&r1=55436&r2=55437&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Aug 27 16:44:41 2008 @@ -81,7 +81,8 @@ llvm::Function* JnjvmModule::OutOfMemoryErrorFunction = 0; llvm::Function* JnjvmModule::JavaObjectAllocateFunction = 0; llvm::Function* JnjvmModule::InterfaceLookupFunction = 0; -llvm::Function* JnjvmModule::FieldLookupFunction = 0; +llvm::Function* JnjvmModule::StaticFieldLookupFunction = 0; +llvm::Function* JnjvmModule::VirtualFieldLookupFunction = 0; #ifndef WITHOUT_VTABLE llvm::Function* JnjvmModule::VirtualLookupFunction = 0; #endif @@ -957,9 +958,10 @@ ArrayLengthFunction = module->getFunction("arrayLength"); GetVTFunction = module->getFunction("getVT"); GetClassFunction = module->getFunction("getClass"); - ClassLookupFunction = module->getFunction("newLookup"); + ClassLookupFunction = module->getFunction("classLookup"); GetVTFromClassFunction = module->getFunction("getVTFromClass"); - GetObjectSizeFromClassFunction = module->getFunction("getObjectSizeFromClass"); + GetObjectSizeFromClassFunction = + module->getFunction("getObjectSizeFromClass"); GetClassDelegateeFunction = module->getFunction("getClassDelegatee"); InstanceOfFunction = module->getFunction("instanceOf"); @@ -973,7 +975,8 @@ ReleaseObjectFunction = module->getFunction("JavaObjectRelease"); OverflowThinLockFunction = module->getFunction("overflowThinLock"); - FieldLookupFunction = module->getFunction("fieldLookup"); + VirtualFieldLookupFunction = module->getFunction("virtualFieldLookup"); + StaticFieldLookupFunction = module->getFunction("staticFieldLookup"); GetExceptionFunction = module->getFunction("JavaThreadGetException"); GetJavaExceptionFunction = module->getFunction("JavaThreadGetJavaException"); @@ -982,7 +985,8 @@ module->getFunction("jniProceedPendingException"); GetSJLJBufferFunction = module->getFunction("getSJLJBuffer"); - NullPointerExceptionFunction = module->getFunction("jnjvmNullPointerException"); + NullPointerExceptionFunction = + module->getFunction("jnjvmNullPointerException"); ClassCastExceptionFunction = module->getFunction("jnjvmClassCastException"); IndexOutOfBoundsExceptionFunction = module->getFunction("indexOutOfBoundsException"); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h?rev=55437&r1=55436&r2=55437&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h Wed Aug 27 16:44:41 2008 @@ -313,7 +313,8 @@ static llvm::Function* GetSJLJBufferFunction; static llvm::Function* InterfaceLookupFunction; - static llvm::Function* FieldLookupFunction; + static llvm::Function* VirtualFieldLookupFunction; + static llvm::Function* StaticFieldLookupFunction; static llvm::Function* PrintExecutionFunction; static llvm::Function* PrintMethodStartFunction; static llvm::Function* PrintMethodEndFunction; From nicolas.geoffray at lip6.fr Wed Aug 27 15:29:52 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 27 Aug 2008 22:29:52 -0000 Subject: [vmkit-commits] [vmkit] r55438 - in /vmkit/branches/isolate/lib/JnJVM/VMCore: JavaJIT.cpp JavaJIT.h Message-ID: <200808272229.m7RMTrwD008054@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 27 17:29:52 2008 New Revision: 55438 URL: http://llvm.org/viewvc/llvm-project?rev=55438&view=rev Log: Factorize code for getting constant pool values. Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp?rev=55438&r1=55437&r2=55438&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp Wed Aug 27 17:29:52 2008 @@ -63,7 +63,6 @@ #if !defined(WITHOUT_VTABLE) && !defined(MULTIPLE_VM) - Constant* zero = mvm::jit::constantZero; Signdef* signature = ctpInfo->infoOfInterfaceOrVirtualMethod(index); std::vector args; // size = [signature->nbIn + 3]; LLVMSignatureInfo* LSI = module->getSignatureInfo(signature); @@ -82,34 +81,9 @@ indexes2.push_back(LMI->getOffset()); } else { - Value* val = getConstantPoolAt(index); - val = new PtrToIntInst(val, Type::Int32Ty, "", currentBlock); - - Value * cmp = new ICmpInst(ICmpInst::ICMP_NE, val, zero, "", currentBlock); - BasicBlock* ifTrue = createBasicBlock("true vtable"); - BasicBlock* ifFalse = createBasicBlock("false vtable"); - BasicBlock* endBlock = createBasicBlock("end vtable"); - PHINode * node = llvm::PHINode::Create(Type::Int32Ty, "", endBlock); - llvm::BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock); - - currentBlock = ifTrue; - node->addIncoming(val, currentBlock); - llvm::BranchInst::Create(endBlock, currentBlock); - - currentBlock = ifFalse; - std::vector Args; - LLVMClassInfo* LCI = - (LLVMClassInfo*)module->getClassInfo(compilingClass); - Args.push_back(LCI->getVar(this)); - Constant* CI = ConstantInt::get(Type::Int32Ty, index); - Args.push_back(CI); - Args.push_back(args[0]); - val = invoke(JnjvmModule::VirtualLookupFunction, Args, "", currentBlock); - node->addIncoming(val, currentBlock); - llvm::BranchInst::Create(endBlock, currentBlock); - - currentBlock = endBlock; - indexes2.push_back(node); + Value* val = getConstantPoolAt(index, JnjvmModule::VirtualLookupFunction, + args[0], true); + indexes2.push_back(val); } Value* FuncPtr = GetElementPtrInst::Create(VT, indexes2.begin(), @@ -1107,39 +1081,9 @@ if (type == JavaConstantPool::ConstantString) { #ifdef MULTIPLE_VM // Lookup the constant pool cache - Constant* nil = mvm::jit::constantPtrNull; - Value* val = getConstantPoolAt(index); - Value* cmp = new ICmpInst(ICmpInst::ICMP_NE, nil, val, "", currentBlock); - BasicBlock* ifTrue = createBasicBlock("true string"); - BasicBlock* ifFalse = createBasicBlock("false string"); - BasicBlock* endBlock = createBasicBlock("end string"); - - PHINode * node = PHINode::Create(JnjvmModule::JavaObjectType, "", endBlock); - BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock); - - // ---------- In case we already resolved something --------------------- // - currentBlock = ifTrue; - val = new BitCastInst(val, JnjvmModule::JavaObjectType, "", currentBlock); - node->addIncoming(val, currentBlock); - BranchInst::Create(endBlock, currentBlock); - - // ---------------- In case we have to resolve -------------------------- // - currentBlock = ifFalse; - LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); - Value* v = LCI->getVar(this); - std::vector Args; - Args.push_back(v); - Args.push_back(ConstantInt::get(Type::Int32Ty, index)); - CallInst* C = llvm::CallInst::Create(JnjvmModule::StringLookupFunction, - Args.begin(), Args.end(), - "", currentBlock); - node->addIncoming(C, currentBlock); - BranchInst::Create(endBlock, currentBlock); - - // ---------------------------- The end ----------------------------------// - currentBlock = endBlock; - push(node, AssessorDesc::dRef); - + Value* val = getConstantPoolAt(index, JnjvmModule::StringLookupFunction, + 0, true); + push(node, AssessorDesc::dRef); #else const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[index]); JavaString* str = JavaThread::get()->isolate->UTF8ToStr(utf8); @@ -1603,7 +1547,9 @@ } } -Value* JavaJIT::getConstantPoolAt(uint32 index) { +Value* JavaJIT::getConstantPoolAt(uint32 index, Function* resolver, + Value* additionalArg, bool doThrow) { + const Type* returnType = resolver->getReturnType(); JavaConstantPool* ctp = compilingClass->ctpInfo; LLVMConstantPoolInfo* LCPI = module->getConstantPoolInfo(ctp); Value* CTP = LCPI->getDelegatee(this); @@ -1616,44 +1562,51 @@ // We set as volatile because "readnone" calls may alter // the constant pool cache. arg1 = new LoadInst(arg1, "", true, currentBlock); + Value* test = new ICmpInst(ICmpInst::ICMP_EQ, arg1, mvm::jit::constantPtrNull, + "", currentBlock); + + if (returnType == Type::Int32Ty) { + arg1 = new PtrToIntInst(arg1, returnType, "", currentBlock); + } else if (returnType != arg1->getType()) { + arg1 = new BitCastInst(arg1, returnType, "", currentBlock); + } + BasicBlock* trueCl = createBasicBlock("Ctp OK"); + BasicBlock* falseCl = createBasicBlock("Ctp Not OK"); + PHINode* node = llvm::PHINode::Create(returnType, "", trueCl); + node->addIncoming(arg1, currentBlock); + llvm::BranchInst::Create(falseCl, trueCl, test, currentBlock); + + currentBlock = falseCl; + std::vector Args; + LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); + Value* v = LCI->getVar(this); + Args.push_back(v); + ConstantInt* CI = ConstantInt::get(Type::Int32Ty, index); + Args.push_back(CI); + + if (additionalArg) + Args.push_back(additionalArg); + + Value* res = 0; + if (doThrow) { + res = invoke(resolver, Args, "", currentBlock); + } else { + res = CallInst::Create(resolver, Args.begin(), Args.end(), "", + currentBlock); + } + node->addIncoming(res, currentBlock); + + llvm::BranchInst::Create(trueCl, currentBlock); + currentBlock = trueCl; - return arg1; + return node; } Value* JavaJIT::getResolvedClass(uint16 index, bool clinit, bool doThrow) { - Value* arg1 = getConstantPoolAt(index); - arg1 = new BitCastInst(arg1, JnjvmModule::JavaClassType, "", currentBlock); - Value* test = new ICmpInst(ICmpInst::ICMP_EQ, arg1, - JnjvmModule::JavaClassNullConstant, "", - currentBlock); + Value* node = getConstantPoolAt(index, JnjvmModule::ClassLookupFunction, + 0, doThrow); - BasicBlock* trueCl = createBasicBlock("Cl OK"); - BasicBlock* falseCl = createBasicBlock("Cl Not OK"); - PHINode* node = llvm::PHINode::Create(JnjvmModule::JavaClassType, "", - trueCl); - node->addIncoming(arg1, currentBlock); - llvm::BranchInst::Create(falseCl, trueCl, test, currentBlock); - - currentBlock = falseCl; - - std::vector Args; - LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); - Value* v = LCI->getVar(this); - Args.push_back(v); - ConstantInt* CI = ConstantInt::get(Type::Int32Ty, index); - Args.push_back(CI); - Value* res = 0; - if (doThrow) { - res = invoke(JnjvmModule::ClassLookupFunction, Args, "", currentBlock); - } else { - res = CallInst::Create(JnjvmModule::ClassLookupFunction, Args.begin(), - Args.end(), "", currentBlock); - } - node->addIncoming(res, currentBlock); - - llvm::BranchInst::Create(trueCl, currentBlock); - currentBlock = trueCl; if (clinit) return invoke(JnjvmModule::InitialisationCheckFunction, node, "", currentBlock); @@ -1767,59 +1720,20 @@ const Type* Pty = mvm::jit::arrayPtrType; Constant* zero = mvm::jit::constantZero; - Constant* nil = mvm::jit::constantPtrNull; - - Value* val = getConstantPoolAt(index); - // a virtual field can never be zero. - Value * cmp = new ICmpInst(ICmpInst::ICMP_NE, val, nil, "", currentBlock); - BasicBlock* ifTrue = createBasicBlock("true ldResolved"); - BasicBlock* ifFalse = createBasicBlock("false ldResolved"); - BasicBlock* endBlock = createBasicBlock("end ldResolved"); - PHINode * node = llvm::PHINode::Create(mvm::jit::ptrType, "", endBlock); - llvm::BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock); - - // ---------- In case we already resolved something --------------------- // - currentBlock = ifTrue; - Value* resPtr = 0; - if (object) { - Value* ptr = new BitCastInst(object, Pty, "", currentBlock); - val = new PtrToIntInst(val, Type::Int32Ty, "", currentBlock); - std::vector gepArgs; // size = 1 - gepArgs.push_back(zero); - gepArgs.push_back(val); - resPtr = llvm::GetElementPtrInst::Create(ptr, gepArgs.begin(), gepArgs.end(), - "", currentBlock); - } else { - resPtr = val; - } - - node->addIncoming(resPtr, currentBlock); - llvm::BranchInst::Create(endBlock, currentBlock); - - // ---------- In case we have to resolve -------------------------------- // - currentBlock = ifFalse; - std::vector args; - LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); - args.push_back(LCI->getVar(this)); - Constant* CI = ConstantInt::get(Type::Int32Ty, index); - args.push_back(CI); Function* func = stat ? JnjvmModule::StaticFieldLookupFunction : JnjvmModule::VirtualFieldLookupFunction; - Value* tmp = invoke(func, args, "", currentBlock); + Value* ptr = getConstantPoolAt(index, func, 0, true); if (!stat) { - Value* ptr = new BitCastInst(object, Pty, "", currentBlock); - args.clear(); + Value* tmp = new BitCastInst(object, Pty, "", currentBlock); + std::vector args; args.push_back(zero); - args.push_back(tmp); - tmp = GetElementPtrInst::Create(ptr, args.begin(), args.end(), "", + args.push_back(ptr); + ptr = GetElementPtrInst::Create(tmp, args.begin(), args.end(), "", currentBlock); } - node->addIncoming(tmp, currentBlock); - llvm::BranchInst::Create(endBlock, currentBlock); - currentBlock = endBlock;; - return new BitCastInst(node, fieldTypePtr, "", currentBlock); + return new BitCastInst(ptr, fieldTypePtr, "", currentBlock); } void JavaJIT::convertValue(Value*& val, const Type* t1, BasicBlock* currentBlock, @@ -2027,7 +1941,8 @@ uint64_t (enveloppe)), JnjvmModule::EnveloppeType); #else - llvmEnv = getConstantPoolAt(index); + llvmEnv = getConstantPoolAt(index, JnjvmModule::EnveloppeLookupFunction, + 0, false); #endif std::vector args1; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h?rev=55438&r1=55437&r2=55438&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h Wed Aug 27 17:29:52 2008 @@ -58,7 +58,8 @@ class JavaJIT { private: - llvm::Value* getConstantPoolAt(uint32 index); + llvm::Value* getConstantPoolAt(uint32 index, llvm::Function* resolver, + llvm::Value* addArg, bool doThrow = true); public: From nicolas.geoffray at lip6.fr Wed Aug 27 15:43:27 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 27 Aug 2008 22:43:27 -0000 Subject: [vmkit-commits] [vmkit] r55445 - in /vmkit/branches/isolate/lib/JnJVM/VMCore: JavaJIT.cpp JavaJIT.h JnjvmModule.cpp Message-ID: <200808272243.m7RMhR4R008594@zion.cs.uiuc.edu> Author: geoffray Date: Wed Aug 27 17:43:27 2008 New Revision: 55445 URL: http://llvm.org/viewvc/llvm-project?rev=55445&view=rev Log: Make the ctpCache in a multi environment be a pointer to pointers. Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp?rev=55445&r1=55444&r2=55445&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp Wed Aug 27 17:43:27 2008 @@ -1550,10 +1550,13 @@ Value* JavaJIT::getConstantPoolAt(uint32 index, Function* resolver, Value* additionalArg, bool doThrow) { const Type* returnType = resolver->getReturnType(); +#ifdef MULTIPLE_VM + Value* CTP = ctpCache; +#else JavaConstantPool* ctp = compilingClass->ctpInfo; LLVMConstantPoolInfo* LCPI = module->getConstantPoolInfo(ctp); Value* CTP = LCPI->getDelegatee(this); - +#endif std::vector indexes; //[3]; indexes.push_back(ConstantInt::get(Type::Int32Ty, index)); Value* arg1 = GetElementPtrInst::Create(CTP, indexes.begin(), @@ -1578,8 +1581,13 @@ currentBlock = falseCl; std::vector Args; +#ifdef MULTIPLE_VM + Value* v = new LoadInst(ctpCache, "", currentBlock); + v = new BitCastInst(v, JnjvmModule::JavaClassType, "", currentBlock); +#else LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); Value* v = LCI->getVar(this); +#endif Args.push_back(v); ConstantInt* CI = ConstantInt::get(Type::Int32Ty, index); Args.push_back(CI); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h?rev=55445&r1=55444&r2=55445&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h Wed Aug 27 17:43:27 2008 @@ -257,6 +257,9 @@ llvm::Value* isolateLocal; #endif +#if defined(MULTIPLE_VM) + llvm::Value* ctpCache; +#endif static const char* OpcodeNames[256]; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=55445&r1=55444&r2=55445&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Aug 27 17:43:27 2008 @@ -569,7 +569,7 @@ #if defined(MULTIPLE_VM) llvmArgs.push_back(mvm::jit::ptrType); // domain - llvmArgs.push_back(mvm::jit::ptr32Type); // cached constant pool + llvmArgs.push_back(mvm::jit::ptrPtrType); // cached constant pool #endif uint8 id = signature->ret->funcs->numId; @@ -594,7 +594,7 @@ #if defined(MULTIPLE_VM) llvmArgs.push_back(mvm::jit::ptrType); // domain - llvmArgs.push_back(mvm::jit::ptr32Type); // cached constant pool + llvmArgs.push_back(mvm::jit::ptrPtrType); // cached constant pool #endif uint8 id = signature->ret->funcs->numId; @@ -622,7 +622,7 @@ #if defined(MULTIPLE_VM) llvmArgs.push_back(mvm::jit::ptrType); // domain - llvmArgs.push_back(mvm::jit::ptr32Type); // cached constant pool + llvmArgs.push_back(mvm::jit::ptrPtrType); // cached constant pool #endif uint8 id = signature->ret->funcs->numId; @@ -773,7 +773,7 @@ llvm::MutexGuard locked(mvm::jit::executionEngine->lock); std::vector Args2; Args2.push_back(mvm::jit::ptrType); // vm - Args2.push_back(mvm::jit::ptr32Type); // ctp + Args2.push_back(mvm::jit::ptrPtrType); // ctp Args2.push_back(getVirtualPtrType()); Args2.push_back(JnjvmModule::JavaObjectType); Args2.push_back(PointerType::getUnqual(Type::Int32Ty)); @@ -790,7 +790,7 @@ llvm::MutexGuard locked(mvm::jit::executionEngine->lock); std::vector Args; Args.push_back(mvm::jit::ptrType); // vm - Args.push_back(mvm::jit::ptr32Type); // ctp + Args.push_back(mvm::jit::ptrPtrType); // ctp Args.push_back(getStaticPtrType()); Args.push_back(PointerType::getUnqual(Type::Int32Ty)); uint8 id = signature->ret->funcs->numId; From nicolas.geoffray at lip6.fr Thu Aug 28 04:15:54 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 28 Aug 2008 11:15:54 -0000 Subject: [vmkit-commits] [vmkit] r55469 - in /vmkit/branches/isolate/lib/JnJVM: LLVMRuntime/runtime-default.ll LLVMRuntime/runtime-isolate.ll VMCore/JavaJIT.cpp VMCore/JavaJIT.h VMCore/JavaRuntimeJIT.cpp VMCore/JnjvmModule.cpp VMCore/JnjvmModule.h VMCore/LowerConstantCalls.cpp Message-ID: <200808281115.m7SBFsuS019283@zion.cs.uiuc.edu> Author: geoffray Date: Thu Aug 28 06:15:51 2008 New Revision: 55469 URL: http://llvm.org/viewvc/llvm-project?rev=55469&view=rev Log: Make the runtime lookup functions readnone to exploit compilation optimizations. Modified: vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp Modified: vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll?rev=55469&r1=55468&r2=55469&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll (original) +++ vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll Thu Aug 28 06:15:51 2008 @@ -94,21 +94,27 @@ ;;; implementation. declare void @forceInitialisationCheck(%JavaClass*) +;;; getConstantPoolAt - Get the value in the constant pool of this class. +;;; This function is removed by Jnjvm after the GVn pass, therefore it does +;;; not have an actual implementation. +declare i8* @getConstantPoolAt(i8* (%JavaClass*, i32, ...)*, i8**, %JavaClass*, + i32, ...) readnone + ;;; vtableLookup - Look up the offset in a virtual table of a specific ;;; function. This function takes a class and an index to lookup in the ;;; constant pool and returns and stores it in the constant pool cache. -declare i32 @vtableLookup(%JavaClass*, i32, %JavaObject*) readnone +declare i8* @vtableLookup(%JavaClass*, i32, ...) ;;; newLookup - Look up a specific class. The function takes a class and an ;;; index to lookup in the constant pool and returns and stores it in the ;;; constant pool cache. -declare %JavaClass* @classLookup(%JavaClass*, i32) readnone +declare i8* @classLookup(%JavaClass*, i32, ...) -;;; fieldLookup - Look up a specific field. -declare i32 @virtualFieldLookup(%JavaClass*, i32) readnone +;;; virtualFieldLookup - Look up a specific virtual field. +declare i8* @virtualFieldLookup(%JavaClass*, i32, ...) -;;; fieldLookup - Look up a specific field. -declare i8* @staticFieldLookup(%JavaClass*, i32) readnone +;;; staticFieldLookup - Look up a specific static field. +declare i8* @staticFieldLookup(%JavaClass*, i32, ...) ;;; JavaObjectAquire - This function is called when starting a synchronized ;;; block or method. Modified: vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll?rev=55469&r1=55468&r2=55469&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll (original) +++ vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll Thu Aug 28 06:15:51 2008 @@ -7,4 +7,4 @@ declare %JavaObject* @getStaticInstance(%JavaClass*, i8*) readnone ;;; runtimeUTF8ToStr - Convert the UTF8 in a string. -declare %JavaObject* @stringLookup(%JavaClass*, i32) +declare i8* @stringLookup(%JavaClass*, i32) Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp?rev=55469&r1=55468&r2=55469&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp Thu Aug 28 06:15:51 2008 @@ -82,7 +82,7 @@ } else { Value* val = getConstantPoolAt(index, JnjvmModule::VirtualLookupFunction, - args[0], true); + Type::Int32Ty, args[0], true); indexes2.push_back(val); } @@ -1082,7 +1082,7 @@ #ifdef MULTIPLE_VM // Lookup the constant pool cache Value* val = getConstantPoolAt(index, JnjvmModule::StringLookupFunction, - 0, true); + JnjvmModule::JavaObjectType, 0, true); push(node, AssessorDesc::dRef); #else const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[index]); @@ -1548,8 +1548,51 @@ } Value* JavaJIT::getConstantPoolAt(uint32 index, Function* resolver, + const Type* returnType, Value* additionalArg, bool doThrow) { - const Type* returnType = resolver->getReturnType(); + +// This makes unswitch loop very unhappy time-wise, but makes GVN happy +// number-wise. IMO, it's better to have this than Unswitch. +#if 1 +#ifdef MULTIPLE_VM + Value* CTP = ctpCache; + Value* Cl = new LoadInst(ctpCache, "", currentBlock); + Cl = new BitCastInst(v, JnjvmModule::JavaClassType, "", currentBlock); +#else + JavaConstantPool* ctp = compilingClass->ctpInfo; + LLVMConstantPoolInfo* LCPI = module->getConstantPoolInfo(ctp); + Value* CTP = LCPI->getDelegatee(this); + LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); + Value* Cl = LCI->getVar(this); +#endif + + std::vector Args; + Args.push_back(resolver); + Args.push_back(CTP); + Args.push_back(Cl); + Args.push_back(ConstantInt::get(Type::Int32Ty, index)); + if (additionalArg) Args.push_back(additionalArg); + + Value* res = 0; + if (doThrow) { + res = invoke(JnjvmModule::GetConstantPoolAtFunction, Args, "", + currentBlock); + } else { + res = CallInst::Create(JnjvmModule::GetConstantPoolAtFunction, Args.begin(), + Args.end(), "", currentBlock); + } + + const Type* realType = + JnjvmModule::GetConstantPoolAtFunction->getReturnType(); + if (returnType == Type::Int32Ty) { + return new PtrToIntInst(res, Type::Int32Ty, "", currentBlock); + } else if (returnType != realType) { + return new BitCastInst(res, returnType, "", currentBlock); + } + + return res; +#else + #ifdef MULTIPLE_VM Value* CTP = ctpCache; #else @@ -1568,14 +1611,9 @@ Value* test = new ICmpInst(ICmpInst::ICMP_EQ, arg1, mvm::jit::constantPtrNull, "", currentBlock); - if (returnType == Type::Int32Ty) { - arg1 = new PtrToIntInst(arg1, returnType, "", currentBlock); - } else if (returnType != arg1->getType()) { - arg1 = new BitCastInst(arg1, returnType, "", currentBlock); - } BasicBlock* trueCl = createBasicBlock("Ctp OK"); BasicBlock* falseCl = createBasicBlock("Ctp Not OK"); - PHINode* node = llvm::PHINode::Create(returnType, "", trueCl); + PHINode* node = llvm::PHINode::Create(mvm::jit::ptrType, "", trueCl); node->addIncoming(arg1, currentBlock); llvm::BranchInst::Create(falseCl, trueCl, test, currentBlock); @@ -1607,13 +1645,18 @@ llvm::BranchInst::Create(trueCl, currentBlock); currentBlock = trueCl; - return node; + if (returnType == Type::Int32Ty) { + return new PtrToIntInst(node, Type::Int32Ty, "", currentBlock); + } else { + return new BitCastInst(node, returnType, "", currentBlock); + } +#endif } Value* JavaJIT::getResolvedClass(uint16 index, bool clinit, bool doThrow) { Value* node = getConstantPoolAt(index, JnjvmModule::ClassLookupFunction, - 0, doThrow); + JnjvmModule::JavaClassType, 0, doThrow); if (clinit) return invoke(JnjvmModule::InitialisationCheckFunction, node, "", @@ -1731,7 +1774,14 @@ Function* func = stat ? JnjvmModule::StaticFieldLookupFunction : JnjvmModule::VirtualFieldLookupFunction; - Value* ptr = getConstantPoolAt(index, func, 0, true); + + const Type* returnType = 0; + if (stat) + returnType = mvm::jit::ptrType; + else + returnType = Type::Int32Ty; + + Value* ptr = getConstantPoolAt(index, func, returnType, 0, true); if (!stat) { Value* tmp = new BitCastInst(object, Pty, "", currentBlock); std::vector args; @@ -1950,7 +2000,7 @@ JnjvmModule::EnveloppeType); #else llvmEnv = getConstantPoolAt(index, JnjvmModule::EnveloppeLookupFunction, - 0, false); + JnjvmModule::EnveloppeType, 0, false); #endif std::vector args1; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h?rev=55469&r1=55468&r2=55469&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h Thu Aug 28 06:15:51 2008 @@ -59,6 +59,7 @@ private: llvm::Value* getConstantPoolAt(uint32 index, llvm::Function* resolver, + const llvm::Type* returnType, llvm::Value* addArg, bool doThrow = true); public: Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=55469&r1=55468&r2=55469&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Thu Aug 28 06:15:51 2008 @@ -84,10 +84,10 @@ return rcache->methPtr; } -extern "C" uint32 virtualFieldLookup(UserClass* caller, uint32 index) { +extern "C" void* virtualFieldLookup(UserClass* caller, uint32 index) { JavaConstantPool* ctpInfo = caller->getConstantPool(); if (ctpInfo->ctpRes[index]) { - return (uint32)ctpInfo->ctpRes[index]; + return ctpInfo->ctpRes[index]; } UserCommonClass* cl = 0; @@ -101,7 +101,7 @@ ctpInfo->ctpRes[index] = (void*)field->ptrOffset; - return field->ptrOffset; + return (void*)field->ptrOffset; } extern "C" void* staticFieldLookup(UserClass* caller, uint32 index) { @@ -129,17 +129,17 @@ } #ifdef MULTIPLE_VM -extern "C" JavaString* stringLookup(UserClass* cl, uint32 index) { +extern "C" void* stringLookup(UserClass* cl, uint32 index) { JavaConstantPool* ctpInfo = cl->getConstantPool(); const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[index]); JavaString* str = JavaThread::get()->isolate->UTF8ToStr(utf8); ctpInfo->ctpRes[index] = str; - return str; + return (void*)str; } #endif #ifndef WITHOUT_VTABLE -extern "C" uint32 vtableLookup(UserClass* caller, uint32 index, JavaObject* obj) { +extern "C" void* vtableLookup(UserClass* caller, uint32 index, ...) { UserCommonClass* cl = 0; const UTF8* utf8 = 0; Signdef* sign = 0; @@ -147,8 +147,12 @@ caller->getConstantPool()->resolveMethod(index, cl, utf8, sign); JavaMethod* dmeth = cl->lookupMethodDontThrow(utf8, sign->keyName, false, true); - assert(obj->classOf->isReady() && "Class not ready in a virtual lookup."); if (!dmeth) { + va_list ap; + va_start(ap, index); + JavaObject* obj = va_arg(ap, JavaObject*); + va_end(ap); + assert(obj->classOf->isReady() && "Class not ready in a virtual lookup."); // Arg, it should have been an invoke interface.... Perform the lookup // on the object class and do not update offset. dmeth = obj->classOf->lookupMethod(utf8, sign->keyName, false, true); @@ -158,14 +162,14 @@ assert(dmeth->classDef->isReady() && "Class not ready in a virtual lookup."); - return dmeth->offset; + return (void*)dmeth->offset; } #endif -extern "C" UserClass* classLookup(UserClass* caller, uint32 index) { +extern "C" void* classLookup(UserClass* caller, uint32 index) { JavaConstantPool* ctpInfo = caller->getConstantPool(); UserClass* cl = (UserClass*)ctpInfo->loadClass(index); - return cl; + return (void*)cl; } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=55469&r1=55468&r2=55469&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Thu Aug 28 06:15:51 2008 @@ -103,6 +103,7 @@ llvm::Function* JnjvmModule::AquireObjectFunction = 0; llvm::Function* JnjvmModule::ReleaseObjectFunction = 0; llvm::Function* JnjvmModule::MultiCallNewFunction = 0; +llvm::Function* JnjvmModule::GetConstantPoolAtFunction = 0; #ifdef MULTIPLE_VM llvm::Function* JnjvmModule::StringLookupFunction = 0; @@ -954,7 +955,8 @@ InitialisationCheckFunction = module->getFunction("initialisationCheck"); ForceInitialisationCheckFunction = module->getFunction("forceInitialisationCheck"); - + + GetConstantPoolAtFunction = module->getFunction("getConstantPoolAt"); ArrayLengthFunction = module->getFunction("arrayLength"); GetVTFunction = module->getFunction("getVT"); GetClassFunction = module->getFunction("getClass"); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h?rev=55469&r1=55468&r2=55469&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h Thu Aug 28 06:15:51 2008 @@ -334,6 +334,7 @@ static llvm::Function* GetDisplayFunction; static llvm::Function* AquireObjectFunction; static llvm::Function* ReleaseObjectFunction; + static llvm::Function* GetConstantPoolAtFunction; #ifdef SERVICE_VM static llvm::Function* AquireObjectInSharedDomainFunction; static llvm::Function* ReleaseObjectInSharedDomainFunction; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=55469&r1=55468&r2=55469&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp Thu Aug 28 06:15:51 2008 @@ -11,6 +11,7 @@ #include "llvm/Pass.h" #include "llvm/Function.h" #include "llvm/Instructions.h" +#include "llvm/Support/CallSite.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" @@ -18,6 +19,7 @@ #include "JnjvmModule.h" +#include using namespace llvm; using namespace jnjvm; @@ -34,7 +36,6 @@ char LowerConstantCalls::ID = 0; static RegisterPass X("LowerConstantCalls", "Lower Constant calls"); - bool LowerConstantCalls::runOnFunction(Function& F) { bool Changed = false; for (Function::iterator BI = F.begin(), BE = F.end(); BI != BE; BI++) { @@ -42,11 +43,13 @@ for (BasicBlock::iterator II = Cur->begin(), IE = Cur->end(); II != IE;) { Instruction *I = II; II++; - if (CallInst *CI = dyn_cast(I)) { - Value* V = CI->getOperand(0); + CallSite Call = CallSite::get(I); + Instruction* CI = Call.getInstruction(); + if (CI) { + Value* V = Call.getCalledValue(); if (V == jnjvm::JnjvmModule::ArrayLengthFunction) { Changed = true; - Value* val = CI->getOperand(1); // get the array + Value* val = Call.getArgument(0); // get the array Value* array = new BitCastInst(val, jnjvm::JnjvmModule::JavaArrayType, "", CI); std::vector args; //size= 2 @@ -59,7 +62,7 @@ CI->eraseFromParent(); } else if (V == jnjvm::JnjvmModule::GetVTFunction) { Changed = true; - Value* val = CI->getOperand(1); // get the object + Value* val = Call.getArgument(0); // get the object std::vector indexes; //[3]; indexes.push_back(mvm::jit::constantZero); indexes.push_back(mvm::jit::constantZero); @@ -70,7 +73,7 @@ CI->eraseFromParent(); } else if (V == jnjvm::JnjvmModule::GetClassFunction) { Changed = true; - Value* val = CI->getOperand(1); // get the object + Value* val = Call.getArgument(0); // get the object std::vector args2; args2.push_back(mvm::jit::constantZero); args2.push_back(jnjvm::JnjvmModule::JavaObjectClassOffsetConstant); @@ -82,7 +85,7 @@ CI->eraseFromParent(); } else if (V == jnjvm::JnjvmModule::GetVTFromClassFunction) { Changed = true; - Value* val = CI->getOperand(1); + Value* val = Call.getArgument(0); std::vector indexes; indexes.push_back(mvm::jit::constantZero); indexes.push_back(jnjvm::JnjvmModule::OffsetVTInClassConstant); @@ -93,7 +96,7 @@ CI->eraseFromParent(); } else if (V == jnjvm::JnjvmModule::GetObjectSizeFromClassFunction) { Changed = true; - Value* val = CI->getOperand(1); + Value* val = Call.getArgument(0); std::vector indexes; indexes.push_back(mvm::jit::constantZero); indexes.push_back(JnjvmModule::OffsetObjectSizeInClassConstant); @@ -104,7 +107,7 @@ CI->eraseFromParent(); } else if (V == jnjvm::JnjvmModule::GetDepthFunction) { Changed = true; - Value* val = CI->getOperand(1); + Value* val = Call.getArgument(0); std::vector indexes; indexes.push_back(mvm::jit::constantZero); indexes.push_back(JnjvmModule::OffsetDepthInClassConstant); @@ -115,7 +118,7 @@ CI->eraseFromParent(); } else if (V == jnjvm::JnjvmModule::GetDisplayFunction) { Changed = true; - Value* val = CI->getOperand(1); + Value* val = Call.getArgument(0); std::vector indexes; indexes.push_back(mvm::jit::constantZero); indexes.push_back(JnjvmModule::OffsetDisplayInClassConstant); @@ -126,21 +129,21 @@ CI->eraseFromParent(); } else if (V == jnjvm::JnjvmModule::GetClassInDisplayFunction) { Changed = true; - Value* val = CI->getOperand(1); - Value* depth = CI->getOperand(2); + Value* val = Call.getArgument(0); + Value* depth = Call.getArgument(1); Value* ClassPtr = GetElementPtrInst::Create(val, depth, "", CI); Value* Class = new LoadInst(ClassPtr, "", CI); CI->replaceAllUsesWith(Class); CI->eraseFromParent(); } else if (V == jnjvm::JnjvmModule::InstanceOfFunction) { - ConstantExpr* CE = dyn_cast(CI->getOperand(2)); + ConstantExpr* CE = dyn_cast(Call.getArgument(1)); if (CE) { ConstantInt* C = (ConstantInt*)CE->getOperand(0); CommonClass* cl = (CommonClass*)C->getZExtValue(); Changed = true; BasicBlock* NBB = II->getParent()->splitBasicBlock(II); I->getParent()->getTerminator()->eraseFromParent(); - Value* obj = CI->getOperand(1); + Value* obj = Call.getArgument(0); Instruction* cmp = new ICmpInst(ICmpInst::ICMP_EQ, obj, JnjvmModule::JavaObjectNullConstant, "", CI); @@ -225,10 +228,77 @@ break; } } + + else if (V == jnjvm::JnjvmModule::GetConstantPoolAtFunction) { + Function* resolver = dyn_cast(Call.getArgument(0)); + assert(resolver && "Wrong use of GetConstantPoolAt"); + const Type* returnType = resolver->getReturnType(); + Value* CTP = Call.getArgument(1); + Value* Index = Call.getArgument(3); + Changed = true; + BasicBlock* NBB = 0; + if (CI->getParent()->getTerminator() != CI) { + NBB = II->getParent()->splitBasicBlock(II); + CI->getParent()->getTerminator()->eraseFromParent(); + } else { + InvokeInst* Invoke = dyn_cast(CI); + assert(Invoke && "Last instruction is not an invoke"); + NBB = Invoke->getNormalDest(); + } + + std::vector indexes; //[3]; + indexes.push_back(Index); + Value* arg1 = GetElementPtrInst::Create(CTP, indexes.begin(), + indexes.end(), "", CI); + arg1 = new LoadInst(arg1, "", false, CI); + Value* test = new ICmpInst(ICmpInst::ICMP_EQ, arg1, + mvm::jit::constantPtrNull, "", CI); + + BasicBlock* trueCl = BasicBlock::Create("Ctp OK", &F); + BasicBlock* falseCl = BasicBlock::Create("Ctp Not OK", &F); + PHINode* node = llvm::PHINode::Create(returnType, "", trueCl); + node->addIncoming(arg1, CI->getParent()); + BranchInst::Create(falseCl, trueCl, test, CI); + + std::vector Args; + unsigned ArgSize = Call.arg_size(), i = 1; + while (++i < ArgSize) { + Args.push_back(Call.getArgument(i)); + } + + Value* res = 0; + if (InvokeInst* Invoke = dyn_cast(CI)) { + BasicBlock* UI = Invoke->getUnwindDest(); + res = InvokeInst::Create(resolver, trueCl, UI, Args.begin(), + Args.end(), "", falseCl); + + // For some reason, an LLVM pass may add PHI nodes to the + // exception destination. + BasicBlock::iterator Temp = UI->getInstList().begin(); + while (PHINode* PHI = dyn_cast(Temp)) { + Value* Val = PHI->getIncomingValueForBlock(CI->getParent()); + PHI->removeIncomingValue(CI->getParent(), false); + PHI->addIncoming(Val, falseCl); + Temp++; + } + } else { + res = CallInst::Create(resolver, Args.begin(), Args.end(), "", + falseCl); + BranchInst::Create(trueCl, falseCl); + } + + node->addIncoming(res, falseCl); + + + CI->replaceAllUsesWith(node); + CI->eraseFromParent(); + BranchInst::Create(NBB, trueCl); + break; + } #ifdef MULTIPLE_GC else if (V == jnjvm::JnjvmModule::GetCollectorFunction) { Changed = true; - Value* val = CI->getOperand(1); + Value* val = Call.getArgument(0); std::vector indexes; indexes.push_back(mvm::jit::constantOne); val = new BitCastInst(val, mvm::jit::ptrPtrType, "", CI); From nicolas.geoffray at lip6.fr Thu Aug 28 06:29:58 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 28 Aug 2008 13:29:58 -0000 Subject: [vmkit-commits] [vmkit] r55470 - in /vmkit/branches/isolate/lib/JnJVM: Isolate/IsolateCommonClass.h LLVMRuntime/runtime-default.ll LLVMRuntime/runtime-isolate.ll VMCore/JavaCache.h VMCore/JavaConstantPool.h VMCore/JavaJIT.cpp VMCore/JavaJITOpcodes.cpp VMCore/JavaMetaJIT.cpp VMCore/JavaRuntimeJIT.cpp VMCore/JavaUpcalls.h VMCore/Jni.cpp VMCore/JnjvmClassLoader.cpp VMCore/JnjvmModule.cpp VMCore/JnjvmModule.h VMCore/JnjvmModuleProvider.cpp Message-ID: <200808281329.m7SDTxH8023576@zion.cs.uiuc.edu> Author: geoffray Date: Thu Aug 28 08:29:55 2008 New Revision: 55470 URL: http://llvm.org/viewvc/llvm-project?rev=55470&view=rev Log: Make things compile on a multi environment. Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h?rev=55470&r1=55469&r2=55470&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h Thu Aug 28 08:29:55 2008 @@ -28,6 +28,7 @@ class JnjvmClassLoader; class UserClass; class UserClassArray; +class UserConstantPool; class UTF8; class UserCommonClass : public mvm::Object { @@ -92,6 +93,10 @@ /// JavaField* constructField(const UTF8* name, const UTF8* type, uint32 access); + + UserConstantPool* getCtpCache(); + + UserClass* lookupClassFromMethod(JavaMethod* meth); }; class UserClass : public UserCommonClass { @@ -109,7 +114,7 @@ UserClass* getOuterClass(); void resolveInnerOuterClasses(); JavaObject* getStaticInstance(); - JavaConstantPool* getConstantPool(); + UserConstantPool* getConstantPool(); void setStaticSize(uint64 size); void setStaticVT(VirtualTable* VT); @@ -140,6 +145,35 @@ }; class UserConstantPool { +public: + + /// ctpRes - Objects resolved dynamically, e.g. UTF8s, classes, methods, + /// fields, strings. + /// + void** ctpRes; + + /// resolveMethod - Resolve the class and the signature of the method. May + /// perform class loading. This function is called just in time, ie when + /// the method call is actually made and not yet resolved. + /// + void resolveMethod(uint32 index, UserCommonClass*& cl, + const UTF8*& utf8, Signdef*& sign); + + /// resolveField - Resolve the class and signature of the field. May + /// perform class loading. This function is called just in time, ie when + /// the field is accessed and not yet resolved. + /// + void resolveField(uint32 index, UserCommonClass*& cl, const UTF8*& utf8, + Typedef*& sign); + + /// UTF8At - Get the UTF8 referenced from this string entry. + /// + const UTF8* UTF8AtForString(uint32 entry); + + /// loadClass - Loads the class and returns it. This is called just in time, + /// ie when the class will be used and not yet resolved. + /// + UserCommonClass* loadClass(uint32 index); }; } // end namespace jnjvm Modified: vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll?rev=55470&r1=55469&r2=55470&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll (original) +++ vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll Thu Aug 28 08:29:55 2008 @@ -37,7 +37,6 @@ ;;; to lookup in the constant pool. %Enveloppe = type { %CacheNode*, i8*, i8*, i32 } - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; Constant calls for Jnjvm runtime internal objects field accesses ;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Modified: vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll?rev=55470&r1=55469&r2=55470&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll (original) +++ vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll Thu Aug 28 08:29:55 2008 @@ -2,9 +2,28 @@ ;;;;;;;;;;;;;;;;;;;;;;;; Isolate specific methods ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +%Jnjvm = type {%VT, %JavaClass*, [9 x %JavaClass*]} -;;; getStaticInstance - Get the static instance of a class. -declare %JavaObject* @getStaticInstance(%JavaClass*, i8*) readnone -;;; runtimeUTF8ToStr - Convert the UTF8 in a string. -declare i8* @stringLookup(%JavaClass*, i32) +;;; enveloppeLookup - Find the enveloppe for the current user class. +declare i8* @enveloppeLookup(%JavaClass*, i32, ...) + +;;; stringLookup - Find the isolate-specific string at the given offset in the +;;; constant pool. +declare i8* @stringLookup(%JavaClass*, i32, ...) + +;;; getCtpCacheNode - Get the constant pool cache of a cache node. This is a +;;; constant call because the cache node never changes. +declare i8** @getCtpCacheNode(%CacheNode*) readnone + +;;; getCtpCacheNode - Get the constant pool cache of a cache node. This is a +;;; constant call because the cache node never changes. +declare i8** @getCtpClass(%JavaClass*) readnone + +;;; getJnjvmExceptionClass - Get the exception user class for the given +;;; isolate. +declare %JavaClass* @getJnjvmExceptionClass(%Jnjvm*) readnone + +;;; getJnjvmArrayClass - Get the array user class of the index, for the given +;;; isolate. +declare %JavaClass* @getJnjvmArrayClass(%Jnjvm*, i32) readnone Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.h?rev=55470&r1=55469&r2=55470&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaCache.h Thu Aug 28 08:29:55 2008 @@ -32,6 +32,8 @@ namespace jnjvm { class Enveloppe; +class UserClass; +class UserConstantPool; /// CacheNode - A {class, method pointer} pair. class CacheNode { Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.h?rev=55470&r1=55469&r2=55470&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.h Thu Aug 28 08:29:55 2008 @@ -143,6 +143,12 @@ /// UTF8At - Get the UTF8 at the given entry. /// const UTF8* UTF8At(uint32 entry); + + /// UTF8At - Get the UTF8 referenced from this string entry. + /// + const UTF8* UTF8AtForString(uint32 entry) { + return UTF8At(ctpDef[entry]); + } /// FloatAt - Get the float at the given entry. /// Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp?rev=55470&r1=55469&r2=55470&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp Thu Aug 28 08:29:55 2008 @@ -831,7 +831,6 @@ std::vector exceptions; unsigned sync = isSynchro(compilingMethod->access) ? 1 : 0; nbe += sync; - JavaConstantPool* ctpInfo = compilingClass->ctpInfo; if (nbe) { supplLocal = new AllocaInst(JnjvmModule::JavaObjectType, "exceptionVar", currentBlock); @@ -902,7 +901,7 @@ JavaObject* exc = 0; UserClass* cl = 0; try { - cl = (UserClass*)(ctpInfo->loadClass(ex->catche)); + cl = (UserClass*)(compilingClass->ctpInfo->loadClass(ex->catche)); } catch(...) { compilingClass->release(); exc = JavaThread::getJavaException(); @@ -1013,8 +1012,9 @@ #ifdef MULTIPLE_VM // We're dealing with exceptions, don't catch the exception if the class can // not be found. - if (catche) cl = getResolvedClass(cur->catche, false, false); - else cl = getJnjvmExceptionClass(); + if (cur->catche) cl = getResolvedClass(cur->catche, false, false); + else cl = CallInst::Create(JnjvmModule::GetJnjvmExceptionClassFunction, + isolateLocal, "", currentBlock); #else assert(cur->catchClass); LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(cur->catchClass); @@ -1083,7 +1083,7 @@ // Lookup the constant pool cache Value* val = getConstantPoolAt(index, JnjvmModule::StringLookupFunction, JnjvmModule::JavaObjectType, 0, true); - push(node, AssessorDesc::dRef); + push(val, AssessorDesc::dRef); #else const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[index]); JavaString* str = JavaThread::get()->isolate->UTF8ToStr(utf8); @@ -1111,8 +1111,8 @@ push(LCI->getDelegatee(this), AssessorDesc::dRef); } else { Value* val = getResolvedClass(index, false); - Value* res = CallInst::Create(JnjvmModule::GetClassDelegateeFunction, val, "", - currentBlock); + Value* res = CallInst::Create(JnjvmModule::GetClassDelegateeFunction, + val, "", currentBlock); push(res, AssessorDesc::dRef); } } else { @@ -1468,7 +1468,7 @@ uint32 clIndex = ctpInfo->getClassIndexFromMethod(index); Value* cl = getResolvedClass(clIndex, false); - Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheFunction, cl, + Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpClassFunction, cl, "", currentBlock); args.push_back(newCtpCache); #endif @@ -1524,7 +1524,7 @@ uint32 clIndex = ctpInfo->getClassIndexFromMethod(index); Value* cl = getResolvedClass(clIndex, true); - Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheFunction, cl, + Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpClassFunction, cl, "", currentBlock); args.push_back(newCtpCache); #endif @@ -1557,7 +1557,7 @@ #ifdef MULTIPLE_VM Value* CTP = ctpCache; Value* Cl = new LoadInst(ctpCache, "", currentBlock); - Cl = new BitCastInst(v, JnjvmModule::JavaClassType, "", currentBlock); + Cl = new BitCastInst(Cl, JnjvmModule::JavaClassType, "", currentBlock); #else JavaConstantPool* ctp = compilingClass->ctpInfo; LLVMConstantPoolInfo* LCPI = module->getConstantPoolInfo(ctp); @@ -1605,9 +1605,7 @@ Value* arg1 = GetElementPtrInst::Create(CTP, indexes.begin(), indexes.end(), "", currentBlock); - // We set as volatile because "readnone" calls may alter - // the constant pool cache. - arg1 = new LoadInst(arg1, "", true, currentBlock); + arg1 = new LoadInst(arg1, "", false, currentBlock); Value* test = new ICmpInst(ICmpInst::ICMP_EQ, arg1, mvm::jit::constantPtrNull, "", currentBlock); @@ -1679,10 +1677,10 @@ VT = CallInst::Create(JnjvmModule::GetVTFromClassFunction, Cl, "", currentBlock); } else { -#ifndef MULTIPLE_VM LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(cl); Size = LCI->getVirtualSize(this); VT = LCI->getVirtualTable(this); +#ifndef MULTIPLE_VM Cl = LCI->getVar(this); if (!cl->isReady()) { Cl = invoke(JnjvmModule::InitialisationCheckFunction, Cl, "", currentBlock); @@ -1691,9 +1689,6 @@ } #else Cl = getResolvedClass(index, true); - Size = LCI->getVirtualSize(this); - VT = LCI->getVirtualTable(this); - Cl = invoke(JnjvmModule::InitialisationCheckFunction, Cl, "", currentBlock); CallInst::Create(JnjvmModule::ForceInitialisationCheckFunction, Cl, "", currentBlock); #endif @@ -1999,8 +1994,9 @@ uint64_t (enveloppe)), JnjvmModule::EnveloppeType); #else - llvmEnv = getConstantPoolAt(index, JnjvmModule::EnveloppeLookupFunction, - JnjvmModule::EnveloppeType, 0, false); + Value* llvmEnv = getConstantPoolAt(index, + JnjvmModule::EnveloppeLookupFunction, + JnjvmModule::EnveloppeType, 0, false); #endif std::vector args1; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp?rev=55470&r1=55469&r2=55470&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Thu Aug 28 08:29:55 2008 @@ -1820,7 +1820,9 @@ case NEWARRAY : case ANEWARRAY : { +#ifndef MULTIPLE_VM UserClassArray* dcl = 0; +#endif ConstantInt* sizeElement = 0; GlobalVariable* TheVT = 0; Value* valCl = 0; @@ -1831,7 +1833,11 @@ #ifndef MULTIPLE_VM dcl = ass->getArrayClass(); #else - valCl = getJnjvmArrayCacheAt(ass->numId); + std::vector args; + args.push_back(isolateLocal); + args.push_back(ConstantInt::get(Type::Int32Ty, ass->numId)); + valCl = CallInst::Create(JnjvmModule::GetJnjvmArrayClassFunction, + args.begin(), args.end(), "", currentBlock); #endif TheVT = JnjvmModule::JavaObjectVirtualTableGV; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp?rev=55470&r1=55469&r2=55470&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp Thu Aug 28 08:29:55 2008 @@ -107,7 +107,7 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) {\ if (!cl->isReady()) { \ - cl->classLoader->loadName(cl->name, true, true); \ + cl->classLoader->loadName(cl->getName(), true, true); \ cl->initialiseClass(vm); \ } \ \ Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=55470&r1=55469&r2=55470&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Thu Aug 28 08:29:55 2008 @@ -32,7 +32,7 @@ extern "C" void* jnjvmVirtualLookup(CacheNode* cache, JavaObject *obj) { Enveloppe* enveloppe = cache->enveloppe; - JavaConstantPool* ctpInfo = enveloppe->ctpInfo; + UserConstantPool* ctpInfo = enveloppe->ctpInfo; UserCommonClass* ocl = obj->classOf; UserCommonClass* cl = 0; const UTF8* utf8 = 0; @@ -85,7 +85,7 @@ } extern "C" void* virtualFieldLookup(UserClass* caller, uint32 index) { - JavaConstantPool* ctpInfo = caller->getConstantPool(); + UserConstantPool* ctpInfo = caller->getConstantPool(); if (ctpInfo->ctpRes[index]) { return ctpInfo->ctpRes[index]; } @@ -105,7 +105,7 @@ } extern "C" void* staticFieldLookup(UserClass* caller, uint32 index) { - JavaConstantPool* ctpInfo = caller->getConstantPool(); + UserConstantPool* ctpInfo = caller->getConstantPool(); if (ctpInfo->ctpRes[index]) { return ctpInfo->ctpRes[index]; @@ -130,12 +130,19 @@ #ifdef MULTIPLE_VM extern "C" void* stringLookup(UserClass* cl, uint32 index) { - JavaConstantPool* ctpInfo = cl->getConstantPool(); - const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[index]); + UserConstantPool* ctpInfo = cl->getConstantPool(); + const UTF8* utf8 = ctpInfo->UTF8AtForString(index); JavaString* str = JavaThread::get()->isolate->UTF8ToStr(utf8); ctpInfo->ctpRes[index] = str; return (void*)str; } + +extern "C" void* enveloppeLookup(UserClass* cl, uint32 index) { + UserConstantPool* ctpInfo = cl->getConstantPool(); + Enveloppe* enveloppe = new Enveloppe(ctpInfo, index); + ctpInfo->ctpRes[index] = enveloppe; + return (void*)enveloppe; +} #endif #ifndef WITHOUT_VTABLE @@ -153,8 +160,8 @@ JavaObject* obj = va_arg(ap, JavaObject*); va_end(ap); assert(obj->classOf->isReady() && "Class not ready in a virtual lookup."); - // Arg, it should have been an invoke interface.... Perform the lookup - // on the object class and do not update offset. + // Arg, the bytecode is buggy! Perform the lookup on the object class + // and do not update offset. dmeth = obj->classOf->lookupMethod(utf8, sign->keyName, false, true); } else { caller->getConstantPool()->ctpRes[index] = (void*)dmeth->offset; @@ -167,8 +174,12 @@ #endif extern "C" void* classLookup(UserClass* caller, uint32 index) { - JavaConstantPool* ctpInfo = caller->getConstantPool(); + UserConstantPool* ctpInfo = caller->getConstantPool(); UserClass* cl = (UserClass*)ctpInfo->loadClass(index); + // We can not initialize here, because bytecodes such as CHECKCAST + // or classes used in catch clauses do not trigger class initialization. + // This is really sad, because we need to insert class initialization checks + // in the LLVM code. return (void*)cl; } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h?rev=55470&r1=55469&r2=55470&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h Thu Aug 28 08:29:55 2008 @@ -54,7 +54,7 @@ class Classpath { public: - ISOLATE_STATIC Class* newClassLoader; + ISOLATE_STATIC UserClass* newClassLoader; ISOLATE_STATIC JavaMethod* getSystemClassLoader; ISOLATE_STATIC JavaMethod* setContextClassLoader; ISOLATE_STATIC UserClass* newString; @@ -132,7 +132,7 @@ ISOLATE_STATIC JavaField* rootGroup; ISOLATE_STATIC JavaField* vmThread; ISOLATE_STATIC JavaMethod* uncaughtException; - ISOLATE_STATIC Class* inheritableThreadLocal; + ISOLATE_STATIC UserClass* inheritableThreadLocal; ISOLATE_STATIC UserClass* InvocationTargetException; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp?rev=55470&r1=55469&r2=55470&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp Thu Aug 28 08:29:55 2008 @@ -1176,7 +1176,7 @@ Jnjvm* vm = JavaThread::get()->isolate; UserClass* cl = 0; #ifdef MULTIPLE_VM - cl = NativeUtil::resolvedImplClass(clazz, true); + cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); #else cl = meth->classDef; #endif @@ -1357,7 +1357,7 @@ Jnjvm* vm = JavaThread::get()->isolate; UserClass* cl = 0; #ifdef MULTIPLE_VM - cl = NativeUtil::resolvedImplClass(clazz, true); + cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); #else cl = meth->classDef; #endif @@ -1377,7 +1377,7 @@ Jnjvm* vm = JavaThread::get()->isolate; UserClass* cl = 0; #ifdef MULTIPLE_VM - cl = NativeUtil::resolvedImplClass(clazz, true); + cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true); #else cl = meth->classDef; #endif Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55470&r1=55469&r2=55470&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Thu Aug 28 08:29:55 2008 @@ -136,7 +136,7 @@ Classpath* upcalls = bootstrapLoader->upcalls; UserClass* forCtp = 0; #ifdef MULTIPLE_VM - forCtp = javaLoader->classOf->lookupClassInMethod(upcalls->loadInClassLoader); + forCtp = javaLoader->classOf->lookupClassFromMethod(upcalls->loadInClassLoader); #else forCtp = upcalls->loadInClassLoader->classDef; #endif Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=55470&r1=55469&r2=55470&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Thu Aug 28 08:29:55 2008 @@ -46,6 +46,11 @@ const llvm::Type* JnjvmModule::CacheNodeType = 0; const llvm::Type* JnjvmModule::EnveloppeType = 0; +#ifdef MULTIPLE_VM +const llvm::Type* JnjvmModule::JnjvmType = 0; +const llvm::Type* JnjvmModule::UserClassType = 0; +#endif + llvm::Constant* JnjvmModule::JavaObjectNullConstant; llvm::Constant* JnjvmModule::UTF8NullConstant; llvm::Constant* JnjvmModule::JavaClassNullConstant; @@ -107,7 +112,11 @@ #ifdef MULTIPLE_VM llvm::Function* JnjvmModule::StringLookupFunction = 0; -llvm::Function* JnjvmModule::GetStaticInstanceFunction = 0; +llvm::Function* JnjvmModule::GetCtpCacheNodeFunction = 0; +llvm::Function* JnjvmModule::GetCtpClassFunction = 0; +llvm::Function* JnjvmModule::EnveloppeLookupFunction = 0; +llvm::Function* JnjvmModule::GetJnjvmExceptionClassFunction = 0; +llvm::Function* JnjvmModule::GetJnjvmArrayClassFunction = 0; #endif llvm::Function* JnjvmModule::GetClassDelegateeFunction = 0; llvm::Function* JnjvmModule::ArrayLengthFunction = 0; @@ -913,6 +922,11 @@ jnjvm::llvm_runtime::makeLLVMModuleContents(module); VTType = module->getTypeByName("VT"); + +#ifdef MULTIPLE_VM + UserClassType = module->getTypeByName("UserClass"); + JnjvmType = module->getTypeByName("Jnjvm"); +#endif JavaObjectType = PointerType::getUnqual(module->getTypeByName("JavaObject")); @@ -1008,8 +1022,13 @@ #ifdef MULTIPLE_VM - GetStaticInstanceFunction = module->getFunction("getStaticInstance"); StringLookupFunction = module->getFunction("stringLookup"); + EnveloppeLookupFunction = module->getFunction("enveloppeLookup"); + GetCtpCacheNodeFunction = module->getFunction("getCtpCacheNode"); + GetCtpClassFunction = module->getFunction("getCtpClass"); + GetJnjvmExceptionClassFunction = + module->getFunction("getJnjvmExceptionClass"); + GetJnjvmArrayClassFunction = module->getFunction("getJnjvmArrayClass"); #endif #ifdef SERVICE_VM Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h?rev=55470&r1=55469&r2=55470&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h Thu Aug 28 08:29:55 2008 @@ -304,6 +304,11 @@ static const llvm::Type* JavaCacheType; static const llvm::Type* EnveloppeType; static const llvm::Type* CacheNodeType; + +#ifdef MULTIPLE_VM + static const llvm::Type* JnjvmType; + static const llvm::Type* UserClassType; +#endif #ifdef WITH_TRACER static llvm::Function* MarkAndTraceFunction; @@ -345,7 +350,11 @@ #ifdef MULTIPLE_VM static llvm::Function* StringLookupFunction; - static llvm::Function* GetStaticInstanceFunction; + static llvm::Function* GetCtpCacheNodeFunction; + static llvm::Function* GetCtpClassFunction; + static llvm::Function* EnveloppeLookupFunction; + static llvm::Function* GetJnjvmExceptionClassFunction; + static llvm::Function* GetJnjvmArrayClassFunction; #endif static llvm::Function* GetClassDelegateeFunction; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=55470&r1=55469&r2=55470&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Thu Aug 28 08:29:55 2008 @@ -37,10 +37,15 @@ ctpInfo->resolveMethod(index, cl, utf8, sign); JavaMethod* meth = cl->lookupMethod(utf8, sign->keyName, isStatic, true); - + +#ifndef MULTIPLE_VM + // A multi environment would have already initialized the class. Besides, + // a callback does not involve UserClass, therefore we wouldn't know + // which class to initialize. if (!isVirtual(meth->access)) cl->initialiseClass(JavaThread::get()->isolate); - +#endif + meth->compiledPtr(); LLVMMethodInfo* LMI = ((JnjvmModule*)TheModule)->getMethodInfo(meth); @@ -204,9 +209,9 @@ static void AddStandardCompilePasses(FunctionPassManager *PM) { llvm::MutexGuard locked(mvm::jit::executionEngine->lock); // LLVM does not allow calling functions from other modules in verifier - //PM->add(llvm::createVerifierPass()); // Verify that input is correct + //PM->add(llvm::createVerifierPass()); // Verify that input is correct - addPass(PM, llvm::createCFGSimplificationPass()); // Clean up disgusting code + addPass(PM, llvm::createCFGSimplificationPass()); // Clean up disgusting code addPass(PM, llvm::createPromoteMemoryToRegisterPass());// Kill useless allocas addPass(PM, createInstructionCombiningPass()); // Cleanup for scalarrepl. @@ -229,8 +234,9 @@ addPass(PM, createGVNPass()); // Remove redundancies addPass(PM, createSCCPPass()); // Constant prop with SCCP addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs - - addPass(PM, mvm::createEscapeAnalysisPass(JnjvmModule::JavaObjectAllocateFunction)); + + Function* func = JnjvmModule::JavaObjectAllocateFunction; + addPass(PM, mvm::createEscapeAnalysisPass(func)); addPass(PM, mvm::createLowerConstantCallsPass()); // Run instcombine after redundancy elimination to exploit opportunities From nicolas.geoffray at lip6.fr Thu Aug 28 07:51:36 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 28 Aug 2008 14:51:36 -0000 Subject: [vmkit-commits] [vmkit] r55472 - in /vmkit/branches/isolate/lib/JnJVM: Isolate/IsolateCommonClass.cpp Isolate/IsolateCommonClass.h LLVMRuntime/runtime-default.ll VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/JavaJITOpcodes.cpp VMCore/Jnjvm.cpp Message-ID: <200808281451.m7SEpbWm026230@zion.cs.uiuc.edu> Author: geoffray Date: Thu Aug 28 09:51:33 2008 New Revision: 55472 URL: http://llvm.org/viewvc/llvm-project?rev=55472&view=rev Log: Make getClassDelegatee and initialiseClass work for both UserCommonClass and CommonClass. Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp?rev=55472&r1=55471&r2=55472&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp Thu Aug 28 09:51:33 2008 @@ -14,6 +14,12 @@ using namespace jnjvm; +UserCommonClass::UserCommonClass() { + this->lockVar = mvm::Lock::allocRecursive(); + this->condVar = mvm::Cond::allocCond(); + this->status = loaded; +} + UserClass::UserClass(JnjvmClassLoader* JCL, const UTF8* name, ArrayUInt8* bytes) { Class* cl = JnjvmSharedLoader::sharedLoader->constructSharedClass(name, bytes); @@ -47,3 +53,5 @@ classLoader = JCL; delegatee = 0; } + + Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h?rev=55472&r1=55471&r2=55472&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h Thu Aug 28 09:51:33 2008 @@ -30,13 +30,54 @@ class UserClassArray; class UserConstantPool; class UTF8; +enum JavaState; class UserCommonClass : public mvm::Object { public: - CommonClass* classDef; + + //===----------------------------------------------------------------------===// +// +// Do not reorder these fields or add new ones! the LLVM runtime assumes that +// classes have the following beginning layout. +// +//===----------------------------------------------------------------------===// + + + /// virtualSize - The size of instances of this class. Array classes do + /// not need this information, but to simplify accessing this field in + /// the JIT, we put this in here. + /// + uint32 virtualSize; + + /// virtualVT - The virtual table of instances of this class. Like the + /// virtualSize field, array classes do not need this information. But we + /// simplify JIT generation to set it here. + /// + VirtualTable* virtualVT; + + /// display - The class hierarchy of supers for this class. Array classes + /// do not need it. + /// + CommonClass** display; + + /// depth - The depth of this class in its class hierarchy. + /// display[depth] contains the class. Array classes do not need it. + /// + uint32 depth; + + /// status - The loading/resolve/initialization state of the class. + /// + JavaState status; + +//===----------------------------------------------------------------------===// +// +// New fields can be added from now, or reordered. +// +//===----------------------------------------------------------------------===// + JnjvmClassLoader* classLoader; JavaObject* delegatee; - uint8 status; + CommonClass* classDef; virtual void TRACER; @@ -66,6 +107,9 @@ UserClass* getSuper(); std::vector* getInterfaces(); + CommonClass::field_map* getStaticFields(); + void resolveStaticClass(); + JavaMethod* lookupMethodDontThrow(const UTF8* name, const UTF8* type, bool isStatic, bool recurse); @@ -97,6 +141,47 @@ UserConstantPool* getCtpCache(); UserClass* lookupClassFromMethod(JavaMethod* meth); + + /// lockVar - When multiple threads want to initialize a class, + /// they must be synchronized so that it is only performed once + /// for a given class. + mvm::Lock* lockVar; + + /// condVar - Used to wake threads waiting on the initialization + /// process of this class, done by another thread. + mvm::Cond* condVar; + + /// acquire - Acquire this class lock. + /// + void acquire() { + lockVar->lock(); + } + + /// release - Release this class lock. + /// + void release() { + lockVar->unlock(); + } + + /// waitClass - Wait for the class to be loaded/initialized/resolved. + /// + void waitClass() { + condVar->wait(lockVar); + } + + /// broadcastClass - Unblock threads that were waiting on the class being + /// loaded/initialized/resolved. + /// + void broadcastClass() { + condVar->broadcast(); + } + + /// ownerClass - Is the current thread the owner of this thread? + /// + bool ownerClass() { + return mvm::Lock::selfOwner(lockVar); + } + }; class UserClass : public UserCommonClass { @@ -114,6 +199,7 @@ UserClass* getOuterClass(); void resolveInnerOuterClasses(); JavaObject* getStaticInstance(); + void setStaticInstance(JavaObject* obj); UserConstantPool* getConstantPool(); void setStaticSize(uint64 size); Modified: vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll?rev=55472&r1=55471&r2=55472&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll (original) +++ vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll Thu Aug 28 09:51:33 2008 @@ -5,14 +5,21 @@ ;;; A virtual table is an array of function pointers. %VT = type i32** +;;; The type of a constant pool. This is only used in a multi vm environment. +;;; Field 1 - The VT of constant pools. +;;; Field 2 - The constant pool cache. +%ConstantPool = type { %VT, i8** } + ;;; The type of internal classes. This is not complete, but we only need ;;; the first fields for now. ;;; Field 1 - The VT of a class C++ object. ;;; Field 2 - The size of instances of this class. ;;; Field 3 - The VT of instances of this class. ;;; Field 4 - The list of super classes of this class. -;;; Field 5 - The depth of the class in its super hierarchy -%JavaClass = type { %VT, i32, %VT ,%JavaClass**, i32} +;;; Field 5 - The depth of the class in its super hierarchy. +;;; Field 6 - The class state (resolved, initialized, ...) +;;; field 7 - The constant pool, only for multi vm environment. +%JavaClass = type { %VT, i32, %VT ,%JavaClass**, i32, i32, %ConstantPool* } ;;; The root of all Java Objects: a VT, a class and a lock. %JavaObject = type { %VT, %JavaClass*, i32 } @@ -30,12 +37,13 @@ %ArrayUInt32 = type { %JavaObject, i32, [0 x i32] } %ArrayUInt8 = type { %JavaObject, i32, [0 x i8] } -;;; The CacheNode type. The second field is the last called method -%CacheNode = type { i8*, %JavaClass*, %CacheNode*, %Enveloppe* } +;;; The CacheNode type. The second field is the last called method. The +;;; last field is for multi vm environment. +%CacheNode = type { i8*, %JavaClass*, %CacheNode*, %Enveloppe*, %ConstantPool* } ;;; The Enveloppe type, which contains the first cache and all the info ;;; to lookup in the constant pool. -%Enveloppe = type { %CacheNode*, i8*, i8*, i32 } +%Enveloppe = type { %CacheNode*, %ConstantPool*, i8*, i32 } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;; Constant calls for Jnjvm runtime internal objects field accesses ;;;;;;;;; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp?rev=55472&r1=55471&r2=55472&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp Thu Aug 28 09:51:33 2008 @@ -697,10 +697,7 @@ acquire(); if (status >= resolved) { release(); - } else if (status < loaded) { - release(); - JavaThread::get()->isolate->unknownError("try to resolve a not-read class"); - } else if (status == loaded || ownerClass()) { + } else if (status == loaded) { if (isArray()) { ClassArray* arrayCl = (ClassArray*)this; CommonClass* baseClass = arrayCl->baseClass(); @@ -810,3 +807,7 @@ } } } + +void Class::resolveStaticClass() { + classLoader->TheModule->resolveStaticClass((Class*)this); +} Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h?rev=55472&r1=55471&r2=55472&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h Thu Aug 28 09:51:33 2008 @@ -48,12 +48,13 @@ /// typedef enum JavaState { loaded = 0, /// The .class file has been found. - classRead, /// The .class file has been read. - prepared, /// The parents of this class has been resolved. - resolved, /// The class has been resolved. - clinitParent, /// The class is cliniting its parents. - inClinit, /// The class is cliniting. - ready /// The class is ready to be used. + classRead = 1, /// The .class file has been read. + prepared = 2, /// The parents of this class has been resolved. + resolved = 3, /// The class has been resolved. + clinitParent = 4, /// The class is cliniting its parents. + inClinit = 5, /// The class is cliniting. + ready = 6, /// The class is ready to be used. + dontuseenums = 0xffffffff /// dummy value to force the enum to be int32 }JavaState; @@ -172,6 +173,9 @@ /// uint32 depth; + /// status - The loading/resolve/initialization state of the class. + /// + JavaState status; //===----------------------------------------------------------------------===// // @@ -183,11 +187,11 @@ uint32 getVirtualSize() { return virtualSize; } - + VirtualTable* getVirtualVT() { return virtualVT; } - + /// virtualTableSize - The size of the virtual table of this class. /// uint32 virtualTableSize; @@ -233,10 +237,6 @@ const UTF8* getName() { return name; } - - /// status - The loading/resolve/initialization state of the class. - /// - JavaState status; /// super - The parent of this class. /// @@ -259,7 +259,7 @@ std::vector interfacesUTF8; /// lockVar - When multiple threads want to load/resolve/initialize a class, - /// they must be synchronized so that these steps are only performned once + /// they must be synchronized so that these steps are only performed once /// for a given class. mvm::Lock* lockVar; @@ -306,6 +306,9 @@ /// method_map staticMethods; + field_map* getStaticFields() { return &staticFields; } + field_map* getVirtualFields() { return &virtualFields; } + /// constructMethod - Add a new method in this class method map. /// JavaMethod* constructMethod(const UTF8* name, const UTF8* type, @@ -427,6 +430,7 @@ /// initialize it. /// void initialiseClass(Jnjvm* vm); + /// getStatus - Get the resolution/initialization status of this class. /// @@ -545,12 +549,25 @@ /// staticVT - The virtual table of the static instance of this class. /// VirtualTable* staticVT; + + uint32 getStaticSize() { + return staticSize; + } + + VirtualTable* getStaticVT() { + return staticVT; + } + #ifndef MULTIPLE_VM /// doNew - Allocates a Java object whose class is this class. /// JavaObject* doNew(Jnjvm* vm); #endif + + /// resolveStaticClass - Resolve the static type of the class. + /// + void resolveStaticClass(); /// print - Prints a string representation of this class in the buffer. /// @@ -573,9 +590,14 @@ /// #ifndef MULTIPLE_VM JavaObject* _staticInstance; + JavaObject* getStaticInstance() { return _staticInstance; } + + void setStaticInstance(JavaObject* val) { + _staticInstance = val; + } #endif Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp?rev=55472&r1=55471&r2=55472&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Thu Aug 28 09:51:33 2008 @@ -1974,8 +1974,10 @@ case CHECKCAST : { uint16 index = readU2(bytecodes, i); +#ifndef MULTIPLE_VM CommonClass* dcl = compilingClass->ctpInfo->getMethodClassIfLoaded(index); +#endif Value* obj = top(); @@ -1989,12 +1991,14 @@ BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock); currentBlock = ifFalse; Value* clVar = 0; +#ifndef MULTIPLE_VM if (dcl) { LLVMCommonClassInfo* LCI = module->getClassInfo(dcl); clVar = LCI->getVar(this); - } else { + } else +#endif clVar = getResolvedClass(index, false); - } + std::vector args; args.push_back(obj); args.push_back(clVar); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55472&r1=55471&r2=55472&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp Thu Aug 28 09:51:33 2008 @@ -87,8 +87,7 @@ typedef void (*clinit_t)(Jnjvm* vm); -#ifndef MULTIPLE_VM -void CommonClass::initialiseClass(Jnjvm* vm) { +void UserCommonClass::initialiseClass(Jnjvm* vm) { // Primitives are initialized at boot time if (isArray()) { status = ready; @@ -98,14 +97,15 @@ release(); } else if (status >= resolved && status != clinitParent && status != inClinit) { - Class* cl = (Class*)this; + UserClass* cl = (UserClass*)this; status = clinitParent; release(); + UserCommonClass* super = getSuper(); if (super) { super->initialiseClass(vm); } - - classLoader->TheModule->resolveStaticClass((Class*)this); + + cl->resolveStaticClass(); status = inClinit; JavaMethod* meth = lookupMethodDontThrow(Jnjvm::clinitName, @@ -117,14 +117,16 @@ PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "%s\n", printString()); JavaObject* val = - (JavaObject*)vm->allocator.allocateObject(cl->staticSize, cl->staticVT); + (JavaObject*)vm->allocator.allocateObject(cl->getStaticSize(), + cl->getStaticVT()); val->initialise(cl); - for (CommonClass::field_iterator i = cl->staticFields.begin(), - e = cl->staticFields.end(); i!= e; ++i) { + CommonClass::field_map* map = cl->getStaticFields(); + for (CommonClass::field_iterator i = map->begin(), e = map->end(); i!= e; + ++i) { i->second->initField(val); } - cl->_staticInstance = val; + cl->setStaticInstance(val); if (meth) { JavaObject* exc = 0; @@ -160,7 +162,6 @@ } } } -#endif void Jnjvm::errorWithExcp(UserClass* cl, JavaMethod* init, const JavaObject* excp) { @@ -329,8 +330,7 @@ postProperties.push_back(std::make_pair(key, value)); } -#ifndef MULTIPLE_VM -JavaObject* CommonClass::getClassDelegatee(Jnjvm* vm, JavaObject* pd) { +JavaObject* UserCommonClass::getClassDelegatee(Jnjvm* vm, JavaObject* pd) { acquire(); if (!(delegatee)) { UserClass* cl = vm->upcalls->newClass; @@ -347,7 +347,6 @@ release(); return delegatee; } -#endif Jnjvm::~Jnjvm() { #ifdef MULTIPLE_GC From nicolas.geoffray at lip6.fr Thu Aug 28 09:08:51 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 28 Aug 2008 16:08:51 -0000 Subject: [vmkit-commits] [vmkit] r55473 - in /vmkit/trunk/lib/JnJVM/VMCore: Jnjvm.cpp Jnjvm.h Message-ID: <200808281608.m7SG8p2L028652@zion.cs.uiuc.edu> Author: geoffray Date: Thu Aug 28 11:08:48 2008 New Revision: 55473 URL: http://llvm.org/viewvc/llvm-project?rev=55473&view=rev Log: Get the key only if we're the first isolate. Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55473&r1=55472&r2=55473&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Thu Aug 28 11:08:48 2008 @@ -802,13 +802,14 @@ } void Jnjvm::runIsolate(const char* className, ArrayObject* args) { - Jnjvm *isolate = allocateIsolate(); + int stack; + Jnjvm *isolate = allocateIsolate(&stack); isolate->loadBootstrap(); isolate->executeClass(className, args); isolate->waitForExit(); } -Jnjvm* Jnjvm::allocateIsolate() { +Jnjvm* Jnjvm::allocateIsolate(void* sp) { Jnjvm *isolate= gc_new(Jnjvm)(); #ifdef MULTIPLE_GC @@ -821,16 +822,19 @@ isolate->bootstrapThread = allocator_new(&isolate->allocator, JavaThread)(); isolate->bootstrapThread->initialise(0, isolate); - void* baseSP = mvm::Thread::get()->baseSP; - isolate->bootstrapThread->threadID = (mvm::Thread::self() << 8) & 0x7FFFFF00; + void* baseSP = sp ? sp : mvm::Thread::get()->baseSP; #ifdef MULTIPLE_GC isolate->bootstrapThread->GC = isolate->GC; isolate->GC->inject_my_thread(baseSP); -#endif +#else + if (sp) Collector::inject_my_thread(baseSP); +#endif + isolate->bootstrapThread->baseSP = baseSP; JavaThread::threadKey->set(isolate->bootstrapThread); + isolate->bootstrapThread->threadID = (mvm::Thread::self() << 8) & 0x7FFFFF00; isolate->threadSystem = new ThreadSystem(); isolate->name = "isolate"; isolate->appClassLoader = 0; Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=55473&r1=55472&r2=55473&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Thu Aug 28 11:08:48 2008 @@ -352,7 +352,7 @@ /// allocateIsolate - Allocates a new JVM. /// - static Jnjvm* allocateIsolate(); + static Jnjvm* allocateIsolate(void* sp = 0); /// runIsolate - Runs an isolate with the given main class and with /// these Java args. This should be called internaly by the javax.isolate From nicolas.geoffray at lip6.fr Thu Aug 28 09:28:18 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 28 Aug 2008 16:28:18 -0000 Subject: [vmkit-commits] [vmkit] r55474 - in /vmkit/branches/isolate/lib/JnJVM: Classpath/ClasspathVMField.cpp.inc Classpath/ClasspathVMSystemProperties.cpp.inc Isolate/IsolateCommonClass.cpp Isolate/IsolateCommonClass.h VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/JnjvmModule.cpp Message-ID: <200808281628.m7SGSIRI029384@zion.cs.uiuc.edu> Author: geoffray Date: Thu Aug 28 11:28:17 2008 New Revision: 55474 URL: http://llvm.org/viewvc/llvm-project?rev=55474&view=rev Log: Implement more functions for multi-vm. Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMField.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMField.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMField.cpp.inc?rev=55474&r1=55473&r2=55474&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMField.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMField.cpp.inc Thu Aug 28 11:28:17 2008 @@ -323,9 +323,6 @@ Obj = cl->getStaticInstance(); } - if (isStatic(field->access)) - field->classDef->initialiseClass(vm); - JavaObject* res = 0; switch (ass->numId) { case BOOL_ID : { Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc?rev=55474&r1=55473&r2=55474&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc Thu Aug 28 11:28:17 2008 @@ -73,7 +73,7 @@ if (!tmp) tmp = ""; setProperty(vm, prop, "java.home", tmp); - JnjvmBootstrapLoader* JCL = JnjvmClassLoader::bootstrapLoader; + JnjvmBootstrapLoader* JCL = vm->bootstrapLoader; setProperty(vm, prop, "java.class.version", "49.0"); setProperty(vm, prop, "java.class.path", vm->classpath); setProperty(vm, prop, "java.boot.class.path", JCL->bootClasspathEnv); Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp?rev=55474&r1=55473&r2=55474&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp Thu Aug 28 11:28:17 2008 @@ -54,4 +54,56 @@ delegatee = 0; } - +void UserCommonClass::resolveClass() { + if (status < resolved) { + acquire(); + if (status >= resolved) { + release(); + } else if (status == loaded) { + if (isArray()) { + UserClassArray* arrayCl = (UserClassArray*)this; + UserCommonClass* baseClass = arrayCl->baseClass(); + baseClass->resolveClass(); + status = resolved; + } else { + UserClass* cl = (UserClass*)this; + Class* def = (Class*)classDef; + if (classDef->status < resolved) { + classDef->acquire(); + if (classDef->status == loaded) { + def->readClass(); + def->status = classRead; + status = classRead; + def->release(); + release(); + cl->loadParents(); + acquire(); + def->acquire(); + def->status = prepared; + status = prepared; + def->classLoader->TheModule->resolveVirtualClass(cl); + def->status = resolved; + status = resolved; + classDef->broadcastClass(); + } else { + while (classDef->status < resolved) { + classDef->waitClass(); + } + classDef->release(); + } + } else { + release(); + status = classRead, + cl->loadParents(); + status = resolved; + broadcastClass(); + } + } + } else { + while (status < resolved) { + waitClass(); + } + release(); + } + } +} Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h?rev=55474&r1=55473&r2=55474&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h Thu Aug 28 11:28:17 2008 @@ -58,7 +58,7 @@ /// display - The class hierarchy of supers for this class. Array classes /// do not need it. /// - CommonClass** display; + UserCommonClass** display; /// depth - The depth of this class in its class hierarchy. /// display[depth] contains the class. Array classes do not need it. @@ -78,9 +78,12 @@ JnjvmClassLoader* classLoader; JavaObject* delegatee; CommonClass* classDef; + UserClass* super; + std::vector interfaces; virtual void TRACER; - + + bool inheritName(const UTF8* Tname); bool isOfTypeName(const UTF8* name); bool isAssignableFrom(UserCommonClass* cl); @@ -89,41 +92,97 @@ /// bool subclassOf(UserCommonClass* cl); - bool isArray(); - bool isPrimitive(); - bool isInterface(); - bool isReady(); - uint8 getAccess(); - const UTF8* getName(); - - void getDeclaredConstructors(std::vector& res, bool publicOnly); - void getDeclaredFields(std::vector& res, bool publicOnly); - void getDeclaredMethods(std::vector& res, bool publicOnly); + bool isArray() { + return classDef->isArray(); + } + bool isPrimitive() { + return classDef->isPrimitive(); + } + + bool isInterface() { + return classDef->isInterface(); + } + + bool isReady() { + return status >= inClinit; + } + + uint8 getAccess() { + return classDef->access; + } + + const UTF8* getName() { + return classDef->name; + } + + void getDeclaredConstructors(std::vector& res, bool publicOnly) { + classDef->getDeclaredConstructors(res, publicOnly); + } + + void getDeclaredFields(std::vector& res, bool publicOnly) { + classDef->getDeclaredFields(res, publicOnly); + } + + void getDeclaredMethods(std::vector& res, bool publicOnly) { + classDef->getDeclaredMethods(res, publicOnly); + } void initialiseClass(Jnjvm* vm); JavaObject* getClassDelegatee(Jnjvm* vm, JavaObject* pd = 0); void resolveClass(); - UserClass* getSuper(); - std::vector* getInterfaces(); - CommonClass::field_map* getStaticFields(); - void resolveStaticClass(); + UserClass* getSuper() { + return super; + } + + std::vector* getInterfaces() { + return &interfaces; + } + + CommonClass::field_map* getStaticFields() { + return classDef->getStaticFields(); + } + + void resolveStaticClass() { + ((Class*)classDef)->resolveStaticClass(); + } JavaMethod* lookupMethodDontThrow(const UTF8* name, const UTF8* type, - bool isStatic, bool recurse); + bool isStatic, bool recurse) { + return classDef->lookupMethodDontThrow(name, type, isStatic, recurse); + } + JavaMethod* lookupMethod(const UTF8* name, const UTF8* type, - bool isStatic, bool recurse); + bool isStatic, bool recurse) { + return classDef->lookupMethod(name, type, isStatic, recurse); + } + JavaField* lookupField(const UTF8* name, const UTF8* type, bool isStatic, bool recurse, - UserCommonClass*& fieldCl); + UserCommonClass*& fieldCl) { + CommonClass* cl = 0; + JavaField* field = classDef->lookupField(name, type, isStatic, recurse, cl); + fieldCl = getUserClass(cl); + return field; + } - uint64 getVirtualSize(); - VirtualTable* getVirtualVT(); + uint64 getVirtualSize() { + return virtualSize; + } + + VirtualTable* getVirtualVT() { + return virtualVT; + } - void setInterfaces(std::vector Is); - void setSuper(UserClass* S); + void setInterfaces(std::vector Is) { + interfaces = Is; + } + + void setSuper(UserClass* S) { + super = S; + } bool instantiationOfArray(UserClassArray* cl); bool implements(UserCommonClass* cl); @@ -131,16 +190,21 @@ /// constructMethod - Add a new method in this class method map. /// JavaMethod* constructMethod(const UTF8* name, const UTF8* type, - uint32 access); + uint32 access) { + return classDef->constructMethod(name, type, access); + } /// constructField - Add a new field in this class field map. /// JavaField* constructField(const UTF8* name, const UTF8* type, - uint32 access); + uint32 access) { + return classDef->constructField(name, type, access); + } UserConstantPool* getCtpCache(); UserClass* lookupClassFromMethod(JavaMethod* meth); + UserCommonClass* getUserClass(CommonClass* cl); /// lockVar - When multiple threads want to initialize a class, /// they must be synchronized so that it is only performed once @@ -182,6 +246,14 @@ return mvm::Lock::selfOwner(lockVar); } + const UTF8* getSuperUTF8(){ + return classDef->superUTF8; + } + + std::vector* getInterfacesUTF8(){ + return &classDef->interfacesUTF8; + } + }; class UserClass : public UserCommonClass { @@ -195,29 +267,74 @@ JavaObject* doNew(Jnjvm* vm); - std::vector* getInnerClasses(); - UserClass* getOuterClass(); + std::vector innerClasses; + UserClass* outerClass; + + std::vector* getInnerClasses() { + return &innerClasses; + } + + UserClass* getOuterClass() { + return outerClass; + } + + bool innerOuterResolved; + void resolveInnerOuterClasses(); - JavaObject* getStaticInstance(); - void setStaticInstance(JavaObject* obj); + + void setInnerAccess(uint32 access) { + ((Class*)classDef)->setInnerAccess(access); + } + + JavaObject* getStaticInstance() { + return staticInstance; + } + + void setStaticInstance(JavaObject* obj) { + staticInstance = obj; + } + + UserConstantPool* ctpInfo; UserConstantPool* getConstantPool(); - void setStaticSize(uint64 size); - void setStaticVT(VirtualTable* VT); + uint64 getStaticSize() { + return ((Class*)classDef)->getStaticSize(); + } + + VirtualTable* getStaticVT() { + return ((Class*)classDef)->getStaticVT(); + } - uint64 getStaticSize(); - VirtualTable* getStaticVT(); + /// loadParents - Loads and resolves the parents, i.e. super and interfarces, + /// of the class. + /// + void loadParents(); + + Attribut* lookupAttribut(const UTF8* Att) { + return ((Class*)classDef)->lookupAttribut(Att); + } + + ArrayUInt8* getBytes() { + return ((Class*)classDef)->bytes; + } }; class UserClassArray : public UserCommonClass { public: static VirtualTable* VT; UserCommonClass* _baseClass; - + AssessorDesc* _funcs; + virtual void TRACER; UserClassArray(JnjvmClassLoader* JCL, const UTF8* name); + + void resolveComponent(); - UserCommonClass* baseClass(); + UserCommonClass* baseClass() { + if (_baseClass == 0) + resolveComponent(); + return _baseClass; + } AssessorDesc* funcs(); }; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp?rev=55474&r1=55473&r2=55474&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp Thu Aug 28 11:28:17 2008 @@ -261,12 +261,10 @@ buf->write(">"); } -#ifndef MULTIPLE_VM -void ClassArray::resolveComponent() { - AssessorDesc::introspectArray(classLoader, name, 0, _funcs, +void UserClassArray::resolveComponent() { + AssessorDesc::introspectArray(classLoader, getName(), 0, _funcs, _baseClass); } -#endif JnjvmClassLoader* ClassArray::arrayLoader(const UTF8* name, JnjvmClassLoader* loader, @@ -410,22 +408,21 @@ return res; } -#ifndef MULTIPLE_VM -JavaObject* Class::doNew(Jnjvm* vm) { +JavaObject* UserClass::doNew(Jnjvm* vm) { assert(this->isReady() && "Uninitialized class when allocating."); - JavaObject* res = (JavaObject*)vm->allocator.allocateObject(virtualSize, virtualVT); + JavaObject* res = (JavaObject*)vm->allocator.allocateObject(getVirtualSize(), + getVirtualVT()); res->classOf = this; return res; } -#endif -bool CommonClass::inheritName(const UTF8* Tname) { - if (name->equals(Tname)) { +bool UserCommonClass::inheritName(const UTF8* Tname) { + if (getName()->equals(Tname)) { return true; } else if (isPrimitive()) { return false; } else if (super) { - if (super->inheritName(Tname)) return true; + if (getSuper()->inheritName(Tname)) return true; } for (uint32 i = 0; i < interfaces.size(); ++i) { @@ -434,17 +431,17 @@ return false; } -bool CommonClass::isOfTypeName(const UTF8* Tname) { +bool UserCommonClass::isOfTypeName(const UTF8* Tname) { if (inheritName(Tname)) { return true; } else if (isArray()) { - CommonClass* curS = this; + UserCommonClass* curS = this; uint32 prof = 0; uint32 len = Tname->size; bool res = true; while (res && Tname->elements[prof] == AssessorDesc::I_TAB) { - CommonClass* cl = ((ClassArray*)curS)->baseClass(); + UserCommonClass* cl = ((UserClassArray*)curS)->baseClass(); ++prof; cl->resolveClass(); res = curS->isArray() && cl && (prof < len); @@ -458,10 +455,10 @@ } } -bool CommonClass::implements(CommonClass* cl) { +bool UserCommonClass::implements(UserCommonClass* cl) { if (this == cl) return true; else { - for (std::vector::iterator i = interfaces.begin(), + for (std::vector::iterator i = interfaces.begin(), e = interfaces.end(); i!= e; i++) { if (*i == cl) return true; else if ((*i)->implements(cl)) return true; @@ -473,12 +470,12 @@ return false; } -bool CommonClass::instantiationOfArray(ClassArray* cl) { +bool UserCommonClass::instantiationOfArray(UserClassArray* cl) { if (this == cl) return true; else { if (isArray()) { - CommonClass* baseThis = ((ClassArray*)this)->baseClass(); - CommonClass* baseCl = ((ClassArray*)cl)->baseClass(); + UserCommonClass* baseThis = ((UserClassArray*)this)->baseClass(); + UserCommonClass* baseCl = ((UserClassArray*)cl)->baseClass(); if (baseThis->isInterface() && baseCl->isInterface()) { return baseThis->implements(baseCl); @@ -490,7 +487,7 @@ return false; } -bool CommonClass::subclassOf(CommonClass* cl) { +bool UserCommonClass::subclassOf(UserCommonClass* cl) { if (cl->depth <= depth) { return display[cl->depth] == cl; } else { @@ -498,13 +495,13 @@ } } -bool CommonClass::isAssignableFrom(CommonClass* cl) { +bool UserCommonClass::isAssignableFrom(UserCommonClass* cl) { if (this == cl) { return true; } else if (cl->isInterface()) { return this->implements(cl); } else if (cl->isArray()) { - return this->instantiationOfArray((ClassArray*)cl); + return this->instantiationOfArray((UserClassArray*)cl); } else { return this->subclassOf(cl); } @@ -600,28 +597,26 @@ } -#ifndef MULTIPLE_VM -void Class::loadParents() { - int nbI = interfacesUTF8.size(); +void UserClass::loadParents() { + std::vector* interfacesUTF8 = getInterfacesUTF8(); + unsigned nbI = interfacesUTF8->size(); + const UTF8* superUTF8 = getSuperUTF8(); if (superUTF8 == 0) { depth = 0; - display = (CommonClass**)malloc(sizeof(CommonClass*)); + display = (UserCommonClass**)malloc(sizeof(UserCommonClass*)); display[0] = this; - virtualTableSize = VT_SIZE / sizeof(void*); } else { super = classLoader->loadName(superUTF8, true, true); depth = super->depth + 1; - virtualTableSize = super->virtualTableSize; - display = (CommonClass**)malloc((depth + 1) * sizeof(CommonClass*)); - memcpy(display, super->display, depth * sizeof(CommonClass*)); + display = (UserCommonClass**)malloc((depth + 1) * sizeof(UserCommonClass*)); + memcpy(display, super->display, depth * sizeof(UserCommonClass*)); display[depth] = this; } - for (int i = 0; i < nbI; i++) - interfaces.push_back((Class*)classLoader->loadName(interfacesUTF8[i], - true, true)); + for (unsigned i = 0; i < nbI; i++) + interfaces.push_back((UserClass*)classLoader->loadName((*interfacesUTF8)[i], + true, true)); } -#endif void Class::readAttributs(Reader& reader, std::vector& attr) { unsigned short int nba = reader.readU2(); @@ -692,6 +687,7 @@ readAttributs(reader, attributs); } +#ifndef MULTIPLE_VM void CommonClass::resolveClass() { if (status < resolved) { acquire(); @@ -725,13 +721,13 @@ } } } +#endif -#ifndef MULTIPLE_VM void UserClass::resolveInnerOuterClasses() { if (!innerOuterResolved) { Attribut* attribut = lookupAttribut(Attribut::innerClassesAttribut); if (attribut != 0) { - Reader reader(attribut, bytes); + Reader reader(attribut, getBytes()); uint16 nbi = reader.readU2(); for (uint16 i = 0; i < nbi; ++i) { @@ -740,13 +736,13 @@ //uint16 innerName = reader.readU2(); uint16 accessFlags = reader.readU2(); - Class* clInner = (Class*)ctpInfo->loadClass(inner); - Class* clOuter = (Class*)ctpInfo->loadClass(outer); + UserClass* clInner = (UserClass*)ctpInfo->loadClass(inner); + UserClass* clOuter = (UserClass*)ctpInfo->loadClass(outer); if (clInner == this) { outerClass = clOuter; } else if (clOuter == this) { - clInner->innerAccess = accessFlags; + clInner->setInnerAccess(accessFlags); innerClasses.push_back(clInner); } } @@ -754,7 +750,6 @@ innerOuterResolved = true; } } -#endif void CommonClass::getDeclaredConstructors(std::vector& res, bool publicOnly) { Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h?rev=55474&r1=55473&r2=55474&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h Thu Aug 28 11:28:17 2008 @@ -250,6 +250,10 @@ /// const UTF8* superUTF8; + const UTF8* getSuperUTF8() { + return superUTF8; + } + /// interfaces - The interfaces this class implements. /// std::vector interfaces; @@ -258,6 +262,10 @@ /// std::vector interfacesUTF8; + std::vector* getInterfacesUTF8() { + return &interfacesUTF8; + } + /// lockVar - When multiple threads want to load/resolve/initialize a class, /// they must be synchronized so that these steps are only performed once /// for a given class. @@ -538,6 +546,10 @@ /// uint32 innerAccess; + void setInnerAccess(uint32 access) { + innerAccess = access; + } + /// innerOuterResolved - Is the inner/outer resolution done? /// bool innerOuterResolved; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=55474&r1=55473&r2=55474&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Thu Aug 28 11:28:17 2008 @@ -262,6 +262,11 @@ memcpy(res, JavaObject::VT, VT_SIZE); #ifndef WITHOUT_VTABLE } else { + if (cl->super) { + cl->virtualTableSize = cl->super->virtualTableSize; + } else { + cl->virtualTableSize = VT_SIZE / sizeof(void*); + } res = allocateVT(cl, cl->virtualMethods.begin()); if (!(cl->super)) { From nicolas.geoffray at lip6.fr Thu Aug 28 10:49:33 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 28 Aug 2008 17:49:33 -0000 Subject: [vmkit-commits] [vmkit] r55477 - /vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Message-ID: <200808281749.m7SHnXIE032099@zion.cs.uiuc.edu> Author: geoffray Date: Thu Aug 28 12:49:33 2008 New Revision: 55477 URL: http://llvm.org/viewvc/llvm-project?rev=55477&view=rev Log: Set the key before registering to the GC. Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55477&r1=55476&r2=55477&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Thu Aug 28 12:49:33 2008 @@ -823,6 +823,7 @@ isolate->bootstrapThread = allocator_new(&isolate->allocator, JavaThread)(); isolate->bootstrapThread->initialise(0, isolate); void* baseSP = sp ? sp : mvm::Thread::get()->baseSP; + JavaThread::threadKey->set(isolate->bootstrapThread); #ifdef MULTIPLE_GC isolate->bootstrapThread->GC = isolate->GC; @@ -832,7 +833,6 @@ #endif isolate->bootstrapThread->baseSP = baseSP; - JavaThread::threadKey->set(isolate->bootstrapThread); isolate->bootstrapThread->threadID = (mvm::Thread::self() << 8) & 0x7FFFFF00; isolate->threadSystem = new ThreadSystem(); From nicolas.geoffray at lip6.fr Thu Aug 28 23:13:41 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 29 Aug 2008 06:13:41 -0000 Subject: [vmkit-commits] [vmkit] r55527 - in /vmkit/branches/isolate/lib/JnJVM: ./ Classpath/ Isolate/ LLVMRuntime/ VMCore/ Message-ID: <200808290613.m7T6DgJE024077@zion.cs.uiuc.edu> Author: geoffray Date: Fri Aug 29 01:13:39 2008 New Revision: 55527 URL: http://llvm.org/viewvc/llvm-project?rev=55527&view=rev Log: Single VM runs as usual and Multi VM creates an exe! Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp.inc vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.cpp vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.h vmkit/branches/isolate/lib/JnJVM/Isolate/SharedMaps.h vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll vmkit/branches/isolate/lib/JnJVM/Makefile vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.h vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.h vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc Fri Aug 29 01:13:39 2008 @@ -108,7 +108,15 @@ verifyNull(cons); Jnjvm* vm = JavaThread::get()->isolate; JavaMethod* meth = (JavaMethod*)vm->upcalls->constructorSlot->getInt32Field((JavaObject*)cons); - return (jobjectArray)NativeUtil::getExceptionTypes(meth); + UserClass* cl = 0; +#ifdef MULTIPLE_VM + jclass Cl = (jclass)vm->upcalls->methodClass->getInt32Field((JavaObject*)cons); + cl = (UserClass*)NativeUtil::resolvedImplClass(Cl, false); +#else + cl = meth->classDef; +#endif + + return (jobjectArray)NativeUtil::getExceptionTypes(cl, meth); } } Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc Fri Aug 29 01:13:39 2008 @@ -206,7 +206,14 @@ verifyNull(_meth); Jnjvm* vm = JavaThread::get()->isolate; JavaMethod* meth = (JavaMethod*)vm->upcalls->methodSlot->getInt32Field((JavaObject*)_meth); - return (jobjectArray)NativeUtil::getExceptionTypes(meth); + UserClass* cl = 0; +#ifdef MULTIPLE_VM + jclass Cl = (jclass)vm->upcalls->methodClass->getInt32Field((JavaObject*)_meth); + cl = (UserClass*)NativeUtil::resolvedImplClass(Cl, false); +#else + cl = meth->classDef; +#endif + return (jobjectArray)NativeUtil::getExceptionTypes(cl, meth); } } Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc Fri Aug 29 01:13:39 2008 @@ -54,7 +54,7 @@ jobject loader) { Jnjvm* vm = JavaThread::get()->isolate; - JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader); + JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader, vm); UserCommonClass* cl = JCL->lookupClassFromJavaString((JavaString*)str, true, false); if (cl != 0) { Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc Fri Aug 29 01:13:39 2008 @@ -52,7 +52,7 @@ Jnjvm* vm = JavaThread::get()->isolate; JavaString* name = (JavaString*)_name; const UTF8* utf8 = name->strToUTF8(vm); - JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader); + JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader, vm); UserCommonClass* cl = JCL->lookupClass(utf8); if (cl) return (jclass)(cl->getClassDelegatee(vm)); @@ -69,7 +69,7 @@ Jnjvm* vm = JavaThread::get()->isolate; JavaString* str = (JavaString*)_str; - JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; + JnjvmClassLoader* JCL = vm->bootstrapLoader; UserCommonClass* cl = JCL->lookupClassFromJavaString(str, doResolve, false); if (cl != 0) { @@ -91,7 +91,7 @@ jint len, jobject pd) { Jnjvm* vm = JavaThread::get()->isolate; - JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader); + JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader, vm); JavaString* str = (JavaString*)_str; const UTF8* name = str->value->javaToInternal(JCL->hashUTF8, str->offset, str->count); UserClass* cl = JCL->constructClass(name, (ArrayUInt8*)bytes); Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp.inc?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp.inc Fri Aug 29 01:13:39 2008 @@ -52,7 +52,7 @@ memmove(&(elements[lgPre + lgLib]), vm->postlib->elements, lgPost * sizeof(uint16)); // TODO: find a better place to store the UTF8 - const UTF8* res = JnjvmClassLoader::bootstrapLoader->readerConstructUTF8(elements, size); + const UTF8* res = vm->bootstrapLoader->readerConstructUTF8(elements, size); return (jobject)(vm->UTF8ToStr(res)); Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc (original) +++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc Fri Aug 29 01:13:39 2008 @@ -28,6 +28,7 @@ extern "C" { +#ifndef MULTIPLE_VM ArrayObject* recGetClassContext(Jnjvm* vm, int** stack, uint32 size, uint32 first, uint32 rec) { if (size != first) { JavaMethod* meth = JavaJIT::IPToJavaMethod(stack[first]); @@ -42,7 +43,7 @@ return ArrayObject::acons(rec, vm->upcalls->classArrayClass, &(vm->allocator)); } } -#ifndef MULTIPLE_VM + JNIEXPORT jobject JNICALL Java_gnu_classpath_VMStackWalker_getClassContext( #ifdef NATIVE_JNI JNIEnv *env, Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp Fri Aug 29 01:13:39 2008 @@ -7,10 +7,11 @@ // //===----------------------------------------------------------------------===// -#include "IsolateCommonClass.h" + #include "IsolateSharedLoader.h" #include "JavaAllocator.h" #include "JavaClass.h" +#include "JnjvmModule.h" using namespace jnjvm; @@ -41,13 +42,16 @@ classDef = cl; classLoader = JCL; delegatee = 0; - baseClass = 0; + _baseClass = 0; + _funcs = 0; } -UserClassPrimitive::UserClassPrimitive(JnjvmClassLoader* JCL, const UTF8* name) { - ClassPrimitive* cl = JnjvmSharedLoader::sharedLoader->constructSharedClassPrimitive(name); +UserClassPrimitive::UserClassPrimitive(JnjvmClassLoader* JCL, const UTF8* name, + uint32 nb) { + ClassPrimitive* cl = + JnjvmSharedLoader::sharedLoader->constructSharedClassPrimitive(name, nb); if (!cl) { - cl = new ClassPrimitive(JCL, name); + cl = new ClassPrimitive(JCL, name, nb); } classDef = cl; classLoader = JCL; @@ -81,7 +85,7 @@ def->acquire(); def->status = prepared; status = prepared; - def->classLoader->TheModule->resolveVirtualClass(cl); + def->classLoader->TheModule->resolveVirtualClass(def); def->status = resolved; status = resolved; classDef->broadcastClass(); @@ -107,3 +111,84 @@ } } } + +UserConstantPool* UserClass::getCtpCache() { + fprintf(stderr, "implement me"); + abort(); + return 0; +} + +UserConstantPool* UserClass::getConstantPool() { + fprintf(stderr, "implement me"); + abort(); + return 0; +} + +UserClass* UserCommonClass::lookupClassFromMethod(JavaMethod* meth) { + fprintf(stderr, "implement me"); + abort(); + return 0; +} + +UserCommonClass* UserCommonClass::getUserClass(CommonClass* cl) { + fprintf(stderr, "implement me"); + abort(); + return 0; +} + +UserCommonClass* UserConstantPool::loadClass(uint32 index) { + fprintf(stderr, "implement me"); + abort(); + return 0; +} + +void UserConstantPool::resolveMethod(uint32 index, UserCommonClass*& cl, + const UTF8*& utf8, Signdef*& sign) { + fprintf(stderr, "implement me"); + abort(); +} + +void UserConstantPool::resolveField(uint32 index, UserCommonClass*& cl, + const UTF8*& utf8, Typedef*& sign) { + fprintf(stderr, "implement me"); + abort(); +} + +const UTF8* UserConstantPool::UTF8AtForString(uint32 entry) { + fprintf(stderr, "implement me"); + abort(); +} + +AssessorDesc* UserClassArray::funcs() { + fprintf(stderr, "implement me"); + abort(); + return 0; +} + + +UserClassPrimitive* AssessorDesc::getPrimitiveClass() const { + fprintf(stderr, "implement me"); + abort(); + return 0; +} + +UserClassArray* AssessorDesc::getArrayClass() const { + fprintf(stderr, "implement me"); + abort(); + return 0; +} + +Class::Class(JnjvmClassLoader*, const UTF8*, ArrayUInt8*) { + fprintf(stderr, "implement me"); + abort(); +} + +ClassPrimitive::ClassPrimitive(JnjvmClassLoader*, const UTF8*, uint32) { + fprintf(stderr, "implement me"); + abort(); +} + +ClassArray::ClassArray(JnjvmClassLoader*, const UTF8*) { + fprintf(stderr, "implement me"); + abort(); +} Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h Fri Aug 29 01:13:39 2008 @@ -7,6 +7,10 @@ // //===----------------------------------------------------------------------===// +#ifndef JNJVM_JAVA_CLASS_H +#error "Never use directly, but include " +#endif + #ifndef ISOLATE_COMMON_CLASS_H #define ISOLATE_COMMON_CLASS_H @@ -81,8 +85,6 @@ UserClass* super; std::vector interfaces; - virtual void TRACER; - bool inheritName(const UTF8* Tname); bool isOfTypeName(const UTF8* name); bool isAssignableFrom(UserCommonClass* cl); @@ -201,7 +203,6 @@ return classDef->constructField(name, type, access); } - UserConstantPool* getCtpCache(); UserClass* lookupClassFromMethod(JavaMethod* meth); UserCommonClass* getUserClass(CommonClass* cl); @@ -254,6 +255,7 @@ return &classDef->interfacesUTF8; } + UserCommonClass(); }; class UserClass : public UserCommonClass { @@ -264,7 +266,8 @@ virtual void TRACER; UserClass(JnjvmClassLoader* JCL, const UTF8* name, ArrayUInt8* bytes); - + UserClass() {} + JavaObject* doNew(Jnjvm* vm); std::vector innerClasses; @@ -296,6 +299,7 @@ UserConstantPool* ctpInfo; UserConstantPool* getConstantPool(); + UserConstantPool* getCtpCache(); uint64 getStaticSize() { return ((Class*)classDef)->getStaticSize(); @@ -327,6 +331,7 @@ virtual void TRACER; UserClassArray(JnjvmClassLoader* JCL, const UTF8* name); + UserClassArray() {} void resolveComponent(); Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.cpp?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.cpp Fri Aug 29 01:13:39 2008 @@ -17,6 +17,8 @@ using namespace jnjvm; +JnjvmSharedLoader* JnjvmSharedLoader::sharedLoader; + JnjvmSharedLoader* JnjvmSharedLoader::createSharedLoader() { JnjvmSharedLoader* JCL = gc_new(JnjvmSharedLoader)(); @@ -66,13 +68,14 @@ return res; } -ClassPrimitive* JnjvmSharedLoader::constructSharedClassPrimitive(const UTF8* name) { +ClassPrimitive* +JnjvmSharedLoader::constructSharedClassPrimitive(const UTF8* name, uint32 nb) { nameClasses->lock->lock(); SharedClassNameMap::iterator End = nameClasses->map.end(); SharedClassNameMap::iterator I = nameClasses->map.find(name); ClassPrimitive* res = 0; if (I == End) { - res = new ClassPrimitive(this, name); + res = new ClassPrimitive(this, name, nb); nameClasses->map.insert(std::make_pair(name, res)); } else { res = ((ClassPrimitive*)(I->second)); Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.h?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.h (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.h Fri Aug 29 01:13:39 2008 @@ -33,7 +33,8 @@ /// VT - The virtual table of this class. /// static VirtualTable* VT; - + + virtual void TRACER; /// constructSharedClass - Create a shared representation of the class. /// If two classes have the same name but not the same array of bytes, @@ -41,7 +42,7 @@ /// Class* constructSharedClass(const UTF8* name, ArrayUInt8* bytes); ClassArray* constructSharedClassArray(const UTF8* name); - ClassPrimitive* constructSharedClassPrimitive(const UTF8* name); + ClassPrimitive* constructSharedClassPrimitive(const UTF8* name, uint32 nb); static JnjvmSharedLoader* createSharedLoader(); Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/SharedMaps.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/SharedMaps.h?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/SharedMaps.h (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/SharedMaps.h Fri Aug 29 01:13:39 2008 @@ -9,7 +9,10 @@ #include "LockedMap.h" -using namespace jnjvm; +#ifndef ISOLATE_JNJVM_SHARED_MAPS_H +#define ISOLATE_JNJVM_SHARED_MAPS_H + +namespace jnjvm { struct ltarray { @@ -56,3 +59,7 @@ virtual void TRACER; }; + +} // end namespace jnjvm + +#endif //ISOLATE_JNJVM_SHARED_MAPS_H Modified: vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll (original) +++ vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll Fri Aug 29 01:13:39 2008 @@ -16,8 +16,8 @@ ;;; constant call because the cache node never changes. declare i8** @getCtpCacheNode(%CacheNode*) readnone -;;; getCtpCacheNode - Get the constant pool cache of a cache node. This is a -;;; constant call because the cache node never changes. +;;; getCtpCacheNode - Get the constant pool cache of a class. This is a +;;; constant call because the constant pool never changes. declare i8** @getCtpClass(%JavaClass*) readnone ;;; getJnjvmExceptionClass - Get the exception user class for the given Modified: vmkit/branches/isolate/lib/JnJVM/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Makefile?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Makefile (original) +++ vmkit/branches/isolate/lib/JnJVM/Makefile Fri Aug 29 01:13:39 2008 @@ -10,5 +10,13 @@ DIRS = LLVMRuntime VMCore Classpath +include $(LEVEL)/Makefile.config + +ifeq ($(ISOLATE_BUILD), 1) + DIRS += Isolate +endif + + + include $(LEVEL)/Makefile.common Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp Fri Aug 29 01:13:39 2008 @@ -279,7 +279,7 @@ UserCommonClass* cl = loader->loadName(componentName, false, true); return cl->classLoader; } else { - return JnjvmClassLoader::bootstrapLoader; + return JavaThread::get()->isolate->bootstrapLoader; } } @@ -721,6 +721,11 @@ } } } +#else +void CommonClass::resolveClass() { + assert(status >= resolved && + "Asking to resolve a not resolved-class in a isolate environment"); +} #endif void UserClass::resolveInnerOuterClasses() { Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp Fri Aug 29 01:13:39 2008 @@ -265,9 +265,9 @@ else return UTF8At(ctpDef[index]); } -#ifndef MULTIPLE_VM CommonClass* JavaConstantPool::loadClass(uint32 index) { CommonClass* temp = isClassLoaded(index); +#ifndef MULTIPLE_VM if (!temp) { JnjvmClassLoader* loader = classDef->classLoader; const UTF8* name = UTF8At(ctpDef[index]); @@ -280,21 +280,24 @@ } ctpRes[index] = temp; } +#endif return temp; } CommonClass* JavaConstantPool::getMethodClassIfLoaded(uint32 index) { CommonClass* temp = isClassLoaded(index); +#ifndef MULTIPLE_VM if (!temp) { JnjvmClassLoader* loader = classDef->classLoader; + assert(loader && "Class has no loader?"); const UTF8* name = UTF8At(ctpDef[index]); temp = loader->lookupClass(name); if (!temp) temp = JnjvmClassLoader::bootstrapLoader->lookupClass(name); } +#endif return temp; } -#endif Typedef* JavaConstantPool::resolveNameAndType(uint32 index) { void* res = ctpRes[index]; @@ -423,7 +426,7 @@ return sign; } -void JavaConstantPool::resolveMethod(uint32 index, UserCommonClass*& cl, +void JavaConstantPool::resolveMethod(uint32 index, CommonClass*& cl, const UTF8*& utf8, Signdef*& sign) { sint32 entry = ctpDef[index]; sint32 ntIndex = entry & 0xFFFF; @@ -434,7 +437,7 @@ cl->resolveClass(); } -void JavaConstantPool::resolveField(uint32 index, UserCommonClass*& cl, +void JavaConstantPool::resolveField(uint32 index, CommonClass*& cl, const UTF8*& utf8, Typedef*& sign) { sint32 entry = ctpDef[index]; sint32 ntIndex = entry & 0xFFFF; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.h?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.h Fri Aug 29 01:13:39 2008 @@ -27,7 +27,6 @@ class Reader; class Signdef; class Typedef; -class UserCommonClass; class UTF8; @@ -235,14 +234,14 @@ /// perform class loading. This function is called just in time, ie when /// the method call is actually made and not yet resolved. /// - void resolveMethod(uint32 index, UserCommonClass*& cl, + void resolveMethod(uint32 index, CommonClass*& cl, const UTF8*& utf8, Signdef*& sign); /// resolveField - Resolve the class and signature of the field. May /// perform class loading. This function is called just in time, ie when /// the field is accessed and not yet resolved. /// - void resolveField(uint32 index, UserCommonClass*& cl, const UTF8*& utf8, + void resolveField(uint32 index, CommonClass*& cl, const UTF8*& utf8, Typedef*& sign); /// loadClass - Loads the class and returns it. This is called just in time, @@ -251,7 +250,7 @@ /// MULTIANEWARRAY. This function is also called by the classpath for /// loading exception classes referenced by a method. /// - UserCommonClass* loadClass(uint32 index); + CommonClass* loadClass(uint32 index); /// JavaConstantPool - Default constructor. /// Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp Fri Aug 29 01:13:39 2008 @@ -32,6 +32,11 @@ #include "ServiceDomain.h" #endif +#ifdef MULTIPLE_VM +#include "SharedMaps.h" +#include "IsolateSharedLoader.h" +#endif + using namespace jnjvm; static void initialiseVT() { @@ -50,6 +55,13 @@ #ifdef SERVICE_VM INIT(ServiceDomain); #endif +#ifdef MULTIPLE_VM + INIT(JnjvmSharedLoader); + INIT(SharedClassByteMap); + INIT(SharedClassNameMap); + INIT(UserClass); + INIT(UserClassArray); +#endif #undef INIT #define INIT(X) { \ @@ -65,9 +77,9 @@ #undef INIT } -static void initialiseStatics() { +void Jnjvm::initialiseStatics() { - JnjvmBootstrapLoader* JCL = JnjvmClassLoader::bootstrapLoader = + JnjvmBootstrapLoader* JCL = bootstrapLoader = JnjvmBootstrapLoader::createBootstrapLoader(); // Array initialization @@ -170,10 +182,15 @@ } void mvm::VirtualMachine::initialiseJVM() { +#ifndef MULTIPLE_VM if (!JnjvmClassLoader::bootstrapLoader) { initialiseVT(); - initialiseStatics(); + Jnjvm::initialiseStatics(); + JnjvmClassLoader::bootstrapLoader = Jnjvm::bootstrapLoader; } +#else + initialiseVT(); +#endif } void Jnjvm::runApplication(int argc, char** argv) { Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp Fri Aug 29 01:13:39 2008 @@ -390,14 +390,26 @@ currentBlock = EndUnlock; } +#ifdef MULTIPLE_VM +Value* JavaJIT::getStaticInstanceCtp() { + /// get the -1 offset of the ctp + fprintf(stderr, "implement me"); + abort(); +} +#endif + void JavaJIT::beginSynchronize() { Value* obj = 0; if (isVirtual(compilingMethod->access)) { obj = llvmFunction->arg_begin(); } else { +#ifndef MULTIPLE_VM LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); obj = LCI->getStaticVar(this); +#else + obj = getStaticInstanceCtp(); +#endif } #ifndef SERVICE_VM monitorEnter(obj); @@ -417,9 +429,13 @@ if (isVirtual(compilingMethod->access)) { obj = llvmFunction->arg_begin(); } else { +#ifndef MULTIPLE_VM LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); obj = LCI->getStaticVar(this); +#else + obj = getStaticInstanceCtp(); +#endif } #ifndef SERVICE_VM monitorExit(obj); @@ -850,8 +866,12 @@ if (isVirtual(compilingMethod->access)) { argsSync.push_back(llvmFunction->arg_begin()); } else { +#ifndef MULTIPLE_VM LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); Value* arg = LCI->getStaticVar(this); +#else + Value* arg = getStaticInstanceCtp(); +#endif argsSync.push_back(arg); } llvm::CallInst::Create(JnjvmModule::ReleaseObjectFunction, argsSync.begin(), argsSync.end(), Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h Fri Aug 29 01:13:39 2008 @@ -260,6 +260,7 @@ #if defined(MULTIPLE_VM) llvm::Value* ctpCache; + llvm::Value* getStaticInstanceCtp(); #endif static const char* OpcodeNames[256]; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp Fri Aug 29 01:13:39 2008 @@ -200,7 +200,7 @@ #endif void Classpath::createInitialThread(Jnjvm* vm, JavaObject* th) { - JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; + JnjvmClassLoader* JCL = vm->bootstrapLoader; JCL->loadName(newVMThread->getName(), true, true); newVMThread->initialiseClass(vm); @@ -221,7 +221,7 @@ } void Classpath::mapInitialThread(Jnjvm* vm) { - JnjvmClassLoader* JCL = JnjvmClassLoader::bootstrapLoader; + JnjvmClassLoader* JCL = vm->bootstrapLoader; JCL->loadName(newThread->getName(), true, true); newThread->initialiseClass(vm); JavaObject* th = newThread->doNew(vm); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp Fri Aug 29 01:13:39 2008 @@ -63,16 +63,16 @@ BEGIN_EXCEPTION JnjvmClassLoader* loader = 0; + Jnjvm* vm = JavaThread::get()->isolate; UserClass* currentClass = JavaJIT::getCallingClass(); if (currentClass) loader = currentClass->classLoader; - else loader = JnjvmClassLoader::bootstrapLoader; + else loader = vm->bootstrapLoader; const UTF8* utf8 = loader->asciizConstructUTF8(asciiz); sint32 len = utf8->size; UserCommonClass* cl = loader->lookupClassFromUTF8(utf8, 0, len, true, true); - Jnjvm* vm = JavaThread::get()->isolate; cl->initialiseClass(vm); return (jclass)(cl->getClassDelegatee(vm)); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp Fri Aug 29 01:13:39 2008 @@ -83,6 +83,7 @@ #ifndef MULTIPLE_VM /// If we're not in a multi-vm environment, this can be made static. std::vector Jnjvm::nativeLibs; +JnjvmBootstrapLoader* Jnjvm::bootstrapLoader; #endif typedef void (*clinit_t)(Jnjvm* vm); @@ -439,7 +440,7 @@ sprintf(temp, "%s:%s", vm->classpath, jarFile); vm->setClasspath(temp); - ArrayUInt8* bytes = Reader::openFile(JnjvmClassLoader::bootstrapLoader, + ArrayUInt8* bytes = Reader::openFile(vm->bootstrapLoader, jarFile); ZipArchive archive(bytes); @@ -562,7 +563,7 @@ printInformation(); } else { char* path = &cur[16]; - JnjvmClassLoader::bootstrapLoader->analyseClasspathEnv(path); + vm->bootstrapLoader->analyseClasspathEnv(path); } } else if (!(strcmp(cur, "-enableassertions"))) { nyi(); @@ -649,7 +650,8 @@ UserClass* cl = upcalls->newClassLoader; JavaObject* loader = upcalls->getSystemClassLoader->invokeJavaObjectStatic(this, cl); - appClassLoader = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader); + appClassLoader = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, + this); } return appClassLoader; } @@ -659,7 +661,7 @@ } void Jnjvm::loadBootstrap() { - JnjvmClassLoader* loader = JnjvmClassLoader::bootstrapLoader; + JnjvmClassLoader* loader = bootstrapLoader; #define LOAD_CLASS(cl) \ cl->resolveClass(); \ cl->initialiseClass(this); @@ -834,7 +836,11 @@ isolate->hashStr = new StringMap(); isolate->globalRefsLock = mvm::Lock::allocNormal(); - isolate->bootstrapLoader = JnjvmClassLoader::bootstrapLoader; + +#ifdef MULTIPLE_VM + isolate->initialiseStatics(); +#endif + isolate->upcalls = isolate->bootstrapLoader->upcalls; #ifdef MULTIPLE_VM Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h Fri Aug 29 01:13:39 2008 @@ -22,6 +22,7 @@ #include "JavaAllocator.h" #include "JavaTypes.h" +#include "JnjvmConfig.h" namespace jnjvm { @@ -215,7 +216,7 @@ /// bootstraLoader - Bootstrap loader for base classes of this virtual /// machine. /// - JnjvmBootstrapLoader* bootstrapLoader; + ISOLATE_STATIC JnjvmBootstrapLoader* bootstrapLoader; /// upcalls - Upcalls to call Java methods and access Java fields. /// @@ -325,6 +326,11 @@ void setClasspath(char* cp) { classpath = cp; } + + /// initialiseStatics - Initializes the isolate. The function initialize + /// static variables in a single environment. + /// + ISOLATE_STATIC void initialiseStatics(); /// allocateIsolate - Allocates a new JVM. /// Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Fri Aug 29 01:13:39 2008 @@ -302,17 +302,17 @@ } -JnjvmClassLoader* JnjvmClassLoader::getJnjvmLoaderFromJavaObject(JavaObject* loader) { +JnjvmClassLoader* JnjvmClassLoader::getJnjvmLoaderFromJavaObject(JavaObject* loader, Jnjvm* vm) { if (loader == 0) - return bootstrapLoader; + return vm->bootstrapLoader; - Classpath* upcalls = bootstrapLoader->upcalls; + Classpath* upcalls = vm->bootstrapLoader->upcalls; JnjvmClassLoader* JCL = (JnjvmClassLoader*)(upcalls->vmdataClassLoader->getObjectField(loader)); if (!JCL) { - JCL = gc_new(JnjvmClassLoader)(*bootstrapLoader, loader, JavaThread::get()->isolate); + JCL = gc_new(JnjvmClassLoader)(*vm->bootstrapLoader, loader, JavaThread::get()->isolate); (upcalls->vmdataClassLoader->setObjectField(loader, (JavaObject*)JCL)); } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.h Fri Aug 29 01:13:39 2008 @@ -126,7 +126,7 @@ /// getJnjvmLoaderFromJavaObject - Return the Jnjvm runtime representation /// of the given class loader. /// - static JnjvmClassLoader* getJnjvmLoaderFromJavaObject(JavaObject*); + static JnjvmClassLoader* getJnjvmLoaderFromJavaObject(JavaObject*, Jnjvm *vm); /// getJavaClassLoader - Return the Java representation of this class loader. /// @@ -185,7 +185,7 @@ /// bootstrapLoader - The bootstrap loader of the JVM. Loads the base /// classes. /// - static JnjvmBootstrapLoader* bootstrapLoader; + ISOLATE_STATIC JnjvmBootstrapLoader* bootstrapLoader; /// ~JnjvmClassLoader - Destroy the loader. Depending on the JVM /// configuration, this may destroy the tables, JIT module and Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Fri Aug 29 01:13:39 2008 @@ -31,7 +31,7 @@ bool isStatic = ctpInfo->isAStaticCall(index); - UserCommonClass* cl = 0; + CommonClass* cl = 0; const UTF8* utf8 = 0; Signdef* sign = 0; @@ -104,7 +104,9 @@ "The method's offset is greater than the virtual table size"); ((void**)meth->classDef->virtualVT)[offset] = val; } else { +#ifndef MULTIPLE_VM meth->classDef->initialiseClass(JavaThread::get()->isolate); +#endif } return false; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.cpp?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.cpp Fri Aug 29 01:13:39 2008 @@ -401,15 +401,14 @@ } -ArrayObject* NativeUtil::getExceptionTypes(JavaMethod* meth) { +ArrayObject* NativeUtil::getExceptionTypes(UserClass* cl, JavaMethod* meth) { Attribut* exceptionAtt = meth->lookupAttribut(Attribut::exceptionsAttribut); Jnjvm* vm = JavaThread::get()->isolate; if (exceptionAtt == 0) { return ArrayObject::acons(0, vm->upcalls->classArrayClass, &(JavaThread::get()->isolate->allocator)); } else { - Class* cl = meth->classDef; - JavaConstantPool* ctp = cl->getConstantPool(); + UserConstantPool* ctp = cl->getConstantPool(); Reader reader(exceptionAtt, cl->getBytes()); uint16 nbe = reader.readU2(); ArrayObject* res = ArrayObject::acons(nbe, vm->upcalls->classArrayClass, Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.h?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/NativeUtil.h Fri Aug 29 01:13:39 2008 @@ -35,7 +35,7 @@ static JavaObject* getClassType(JnjvmClassLoader* loader, Typedef* type); static ArrayObject* getParameterTypes(JnjvmClassLoader* loader, JavaMethod* meth); - static ArrayObject* getExceptionTypes(JavaMethod* meth); + static ArrayObject* getExceptionTypes(UserClass* cl, JavaMethod* meth); }; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp?rev=55527&r1=55526&r2=55527&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp Fri Aug 29 01:13:39 2008 @@ -20,6 +20,10 @@ #ifdef SERVICE_VM #include "ServiceDomain.h" #endif +#ifdef MULTIPLE_VM +#include "SharedMaps.h" +#include "IsolateSharedLoader.h" +#endif using namespace jnjvm; @@ -35,6 +39,13 @@ INIT(ClassMap); INIT(JnjvmBootstrapLoader); INIT(JnjvmClassLoader); +#ifdef MULTIPLE_VM + INIT(JnjvmSharedLoader); + INIT(SharedClassByteMap); + INIT(SharedClassNameMap); + INIT(UserClass); + INIT(UserClassArray); +#endif #ifdef SERVICE_VM INIT(ServiceDomain); #endif @@ -98,7 +109,7 @@ appClassLoader->MARK_AND_TRACE; TRACE_VECTOR(JavaObject*, gc_allocator, globalRefs); bootstrapThread->MARK_AND_TRACE; - JnjvmClassLoader::bootstrapLoader->MARK_AND_TRACE; + bootstrapLoader->MARK_AND_TRACE; } void ClassMap::TRACER { @@ -137,6 +148,38 @@ #endif } +#ifdef MULTIPLE_VM +void UserClass::TRACER { + classLoader->MARK_AND_TRACE; + delegatee->MARK_AND_TRACE; + staticInstance->MARK_AND_TRACE; +} + +void UserClassPrimitive::TRACER { + classLoader->MARK_AND_TRACE; + delegatee->MARK_AND_TRACE; +} + +void UserClassArray::TRACER { + classLoader->MARK_AND_TRACE; + delegatee->MARK_AND_TRACE; +} + +void SharedClassByteMap::TRACER { + for (iterator i = map.begin(), e = map.end(); i!= e; ++i) { + i->first->MARK_AND_TRACE; + } +} + +void SharedClassNameMap::TRACER { +} + +void JnjvmSharedLoader::TRACER { + byteClasses->MARK_AND_TRACE; + nameClasses->MARK_AND_TRACE; +} +#endif + #ifdef SERVICE_VM void ServiceDomain::TRACER { JavaIsolate::PARENT_TRACER; From nicolas.geoffray at lip6.fr Fri Aug 29 00:41:47 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 29 Aug 2008 07:41:47 -0000 Subject: [vmkit-commits] [vmkit] r55532 - /vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmConfig.h Message-ID: <200808290741.m7T7flpc029918@zion.cs.uiuc.edu> Author: geoffray Date: Fri Aug 29 02:41:47 2008 New Revision: 55532 URL: http://llvm.org/viewvc/llvm-project?rev=55532&view=rev Log: Ooops, forfot to commit that file. Added: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmConfig.h Added: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmConfig.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmConfig.h?rev=55532&view=auto ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmConfig.h (added) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmConfig.h Fri Aug 29 02:41:47 2008 @@ -0,0 +1,36 @@ +//===---------- JnjvmConfig.h - Jnjvm configuration file ------------------===// +// +// JnJVM +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + +#ifndef JNJVM_CONFIG_H +#define JNJVM_CONFIG_H + +#ifdef MULTIPLE_VM +#define ISOLATE_STATIC +#else + +namespace jnjvm { + +class ClassArray; +class ClassPrimitive; +class Class; +class CommonClass; +class JavaConstantPool; + +#define UserClassArray ClassArray +#define UserClassPrimitive ClassPrimitive +#define UserClass Class +#define UserCommonClass CommonClass +#define UserConstantPool JavaConstantPool + +} +#define ISOLATE_STATIC static +#endif + +#endif // JNJVM_CONFIG_H From nicolas.geoffray at lip6.fr Fri Aug 29 04:53:07 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 29 Aug 2008 11:53:07 -0000 Subject: [vmkit-commits] [vmkit] r55535 - in /vmkit/branches/isolate/lib/JnJVM: Isolate/ LLVMRuntime/ VMCore/ Message-ID: <200808291153.m7TBr8jI016890@zion.cs.uiuc.edu> Author: geoffray Date: Fri Aug 29 06:53:04 2008 New Revision: 55535 URL: http://llvm.org/viewvc/llvm-project?rev=55535&view=rev Log: Refactorize a bit, and materialize user constant pools. Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.cpp vmkit/branches/isolate/lib/JnJVM/Isolate/SharedMaps.h vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.h vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp Fri Aug 29 06:53:04 2008 @@ -11,6 +11,8 @@ #include "IsolateSharedLoader.h" #include "JavaAllocator.h" #include "JavaClass.h" +#include "JavaThread.h" +#include "Jnjvm.h" #include "JnjvmModule.h" using namespace jnjvm; @@ -23,7 +25,8 @@ UserClass::UserClass(JnjvmClassLoader* JCL, const UTF8* name, ArrayUInt8* bytes) { - Class* cl = JnjvmSharedLoader::sharedLoader->constructSharedClass(name, bytes); + Class* cl = JnjvmSharedLoader::sharedLoader->constructSharedClass(name, + bytes); if (!cl) { cl = allocator_new(JCL->allocator, Class)(JCL, name, bytes); } @@ -32,6 +35,7 @@ classLoader = JCL; delegatee = 0; staticInstance = 0; + ctpInfo = new(JCL->allocator, cl->ctpInfo->ctpSize) UserConstantPool(this); } UserClassArray::UserClassArray(JnjvmClassLoader* JCL, const UTF8* name) { @@ -112,18 +116,6 @@ } } -UserConstantPool* UserClass::getCtpCache() { - fprintf(stderr, "implement me"); - abort(); - return 0; -} - -UserConstantPool* UserClass::getConstantPool() { - fprintf(stderr, "implement me"); - abort(); - return 0; -} - UserClass* UserCommonClass::lookupClassFromMethod(JavaMethod* meth) { fprintf(stderr, "implement me"); abort(); @@ -159,6 +151,11 @@ abort(); } +void* UserConstantPool::operator new(size_t sz, JavaAllocator* alloc, + uint32 size){ + return alloc->allocateObject(sz + size * sizeof(void*), VT); +} + AssessorDesc* UserClassArray::funcs() { fprintf(stderr, "implement me"); abort(); @@ -178,17 +175,95 @@ return 0; } -Class::Class(JnjvmClassLoader*, const UTF8*, ArrayUInt8*) { - fprintf(stderr, "implement me"); - abort(); +JavaMethod* UserCommonClass::lookupMethodDontThrow(const UTF8* name, + const UTF8* type, + bool isStatic, + bool recurse) { + + CommonClass::FieldCmp CC(name, type); + CommonClass::method_map* map = isStatic ? getStaticMethods() : + getVirtualMethods(); + CommonClass::method_iterator End = map->end(); + CommonClass::method_iterator I = map->find(CC); + if (I != End) return I->second; + + JavaMethod *cur = 0; + + if (recurse) { + if (super) cur = super->lookupMethodDontThrow(name, type, isStatic, + recurse); + if (cur) return cur; + if (isStatic) { + std::vector* interfaces = getInterfaces(); + for (std::vector::iterator i = interfaces->begin(), + e = interfaces->end(); i!= e; i++) { + cur = (*i)->lookupMethodDontThrow(name, type, isStatic, recurse); + if (cur) return cur; + } + } + } + + return 0; } -ClassPrimitive::ClassPrimitive(JnjvmClassLoader*, const UTF8*, uint32) { - fprintf(stderr, "implement me"); - abort(); +JavaMethod* UserCommonClass::lookupMethod(const UTF8* name, const UTF8* type, + bool isStatic, bool recurse) { + JavaMethod* res = lookupMethodDontThrow(name, type, isStatic, recurse); + if (!res) { + JavaThread::get()->isolate->noSuchMethodError(this->classDef, name); + } + return res; } -ClassArray::ClassArray(JnjvmClassLoader*, const UTF8*) { - fprintf(stderr, "implement me"); - abort(); +JavaField* +UserCommonClass::lookupFieldDontThrow(const UTF8* name, const UTF8* type, + bool isStatic, bool recurse, + UserCommonClass*& definingClass) { + + CommonClass::FieldCmp CC(name, type); + CommonClass::field_map* map = isStatic ? getStaticFields() : + getVirtualFields(); + CommonClass::field_iterator End = map->end(); + CommonClass::field_iterator I = map->find(CC); + if (I != End) { + definingClass = this; + return I->second; + } + + JavaField *cur = 0; + + if (recurse) { + if (super) cur = super->lookupFieldDontThrow(name, type, isStatic, + recurse, definingClass); + if (cur) { + definingClass = (UserClass*)super; + return cur; + } + if (isStatic) { + std::vector* interfaces = getInterfaces(); + for (std::vector::iterator i = interfaces->begin(), + e = interfaces->end(); i!= e; i++) { + cur = (*i)->lookupFieldDontThrow(name, type, isStatic, recurse, + definingClass); + if (cur) { + definingClass = *i; + return cur; + } + } + } + } + + return 0; +} + +JavaField* UserCommonClass::lookupField(const UTF8* name, const UTF8* type, + bool isStatic, bool recurse, + UserCommonClass*& definingClass) { + + JavaField* res = lookupFieldDontThrow(name, type, isStatic, recurse, + definingClass); + if (!res) { + JavaThread::get()->isolate->noSuchFieldError(this->classDef, name); + } + return res; } Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h Fri Aug 29 06:53:04 2008 @@ -72,6 +72,10 @@ /// status - The loading/resolve/initialization state of the class. /// JavaState status; + + /// ctpInfo - The private constant pool of this class. + /// + UserConstantPool* ctpInfo; //===----------------------------------------------------------------------===// // @@ -146,29 +150,37 @@ return classDef->getStaticFields(); } + CommonClass::field_map* getVirtualFields() { + return classDef->getVirtualFields(); + } + + CommonClass::method_map* getStaticMethods() { + return classDef->getStaticMethods(); + } + + CommonClass::method_map* getVirtualMethods() { + return classDef->getVirtualMethods(); + } + void resolveStaticClass() { ((Class*)classDef)->resolveStaticClass(); } JavaMethod* lookupMethodDontThrow(const UTF8* name, const UTF8* type, - bool isStatic, bool recurse) { - return classDef->lookupMethodDontThrow(name, type, isStatic, recurse); - } + bool isStatic, bool recurse); JavaMethod* lookupMethod(const UTF8* name, const UTF8* type, - bool isStatic, bool recurse) { - return classDef->lookupMethod(name, type, isStatic, recurse); - } + bool isStatic, bool recurse); JavaField* lookupField(const UTF8* name, const UTF8* type, bool isStatic, bool recurse, - UserCommonClass*& fieldCl) { - CommonClass* cl = 0; - JavaField* field = classDef->lookupField(name, type, isStatic, recurse, cl); - fieldCl = getUserClass(cl); - return field; - } + UserCommonClass*& fieldCl); + + JavaField* lookupFieldDontThrow(const UTF8* name, const UTF8* type, + bool isStatic, bool recurse, + UserCommonClass*& fieldCl); + uint64 getVirtualSize() { return virtualSize; @@ -297,9 +309,9 @@ staticInstance = obj; } - UserConstantPool* ctpInfo; - UserConstantPool* getConstantPool(); - UserConstantPool* getCtpCache(); + UserConstantPool* getConstantPool() { + return ctpInfo; + } uint64 getStaticSize() { return ((Class*)classDef)->getStaticSize(); @@ -352,13 +364,14 @@ UserClassPrimitive(JnjvmClassLoader* JCL, const UTF8* name, uint32 nb); }; -class UserConstantPool { +class UserConstantPool : public mvm::Object { public: + static VirtualTable* VT; /// ctpRes - Objects resolved dynamically, e.g. UTF8s, classes, methods, /// fields, strings. /// - void** ctpRes; + void* ctpRes[1]; /// resolveMethod - Resolve the class and the signature of the method. May /// perform class loading. This function is called just in time, ie when @@ -382,6 +395,14 @@ /// ie when the class will be used and not yet resolved. /// UserCommonClass* loadClass(uint32 index); + + void* operator new(size_t sz, JavaAllocator* alloc, uint32 size); + + UserConstantPool(){} + + UserConstantPool(UserClass* cl) { + ctpRes[0] = cl; + } }; } // end namespace jnjvm Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.cpp?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateSharedLoader.cpp Fri Aug 29 06:53:04 2008 @@ -29,7 +29,7 @@ JCL->hashUTF8 = new UTF8Map(JCL->allocator, 0); JCL->classes = allocator_new(allocator, ClassMap)(); - JCL->nameClasses = allocator_new(allocator, SharedClassNameMap)(); + JCL->nameClasses = new SharedClassNameMap(); JCL->byteClasses = allocator_new(allocator, SharedClassByteMap)(); JCL->javaTypes = new TypeMap(); JCL->javaSignatures = new SignMap(); @@ -44,7 +44,7 @@ SharedClassByteMap::iterator I = byteClasses->map.find(bytes); Class* res = 0; if (I == End) { - res = allocator_new(allocator, Class)(this, name, bytes); + res = new Class(this, name, bytes); byteClasses->map.insert(std::make_pair(bytes, res)); } else { res = ((Class*)(I->second)); @@ -59,7 +59,7 @@ SharedClassNameMap::iterator I = nameClasses->map.find(name); ClassArray* res = 0; if (I == End) { - res = allocator_new(allocator, ClassArray)(this, name); + res = new ClassArray(this, name); nameClasses->map.insert(std::make_pair(name, res)); } else { res = ((ClassArray*)(I->second)); Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/SharedMaps.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/SharedMaps.h?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/SharedMaps.h (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/SharedMaps.h Fri Aug 29 06:53:04 2008 @@ -46,8 +46,6 @@ public LockedMap { public: - static VirtualTable* VT; - SharedClassNameMap() { lock = mvm::Lock::allocNormal(); } @@ -55,8 +53,6 @@ ~SharedClassNameMap() { delete lock; } - - virtual void TRACER; }; Modified: vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll (original) +++ vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-default.ll Fri Aug 29 06:53:04 2008 @@ -5,10 +5,10 @@ ;;; A virtual table is an array of function pointers. %VT = type i32** -;;; The type of a constant pool. This is only used in a multi vm environment. -;;; Field 1 - The VT of constant pools. -;;; Field 2 - The constant pool cache. -%ConstantPool = type { %VT, i8** } +;;; The type of a constant pool. Jnjvm will make this into a i8** +%ConstantPool = type i8* + +%Jnjvm = type {%VT, %JavaClass*, [9 x %JavaClass*]} ;;; The type of internal classes. This is not complete, but we only need ;;; the first fields for now. @@ -104,8 +104,8 @@ ;;; getConstantPoolAt - Get the value in the constant pool of this class. ;;; This function is removed by Jnjvm after the GVn pass, therefore it does ;;; not have an actual implementation. -declare i8* @getConstantPoolAt(i8* (%JavaClass*, i32, ...)*, i8**, %JavaClass*, - i32, ...) readnone +declare i8* @getConstantPoolAt(i8* (%JavaClass*, i32, ...)*, %ConstantPool*, + %JavaClass*, i32, ...) readnone ;;; vtableLookup - Look up the offset in a virtual table of a specific ;;; function. This function takes a class and an index to lookup in the Modified: vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll (original) +++ vmkit/branches/isolate/lib/JnJVM/LLVMRuntime/runtime-isolate.ll Fri Aug 29 06:53:04 2008 @@ -2,9 +2,6 @@ ;;;;;;;;;;;;;;;;;;;;;;;; Isolate specific methods ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -%Jnjvm = type {%VT, %JavaClass*, [9 x %JavaClass*]} - - ;;; enveloppeLookup - Find the enveloppe for the current user class. declare i8* @enveloppeLookup(%JavaClass*, i32, ...) @@ -14,11 +11,11 @@ ;;; getCtpCacheNode - Get the constant pool cache of a cache node. This is a ;;; constant call because the cache node never changes. -declare i8** @getCtpCacheNode(%CacheNode*) readnone +declare %ConstantPool* @getCtpCacheNode(%CacheNode*) readnone ;;; getCtpCacheNode - Get the constant pool cache of a class. This is a ;;; constant call because the constant pool never changes. -declare i8** @getCtpClass(%JavaClass*) readnone +declare %ConstantPool* @getCtpClass(%JavaClass*) readnone ;;; getJnjvmExceptionClass - Get the exception user class for the given ;;; isolate. Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.cpp Fri Aug 29 06:53:04 2008 @@ -39,6 +39,9 @@ const UTF8* Attribut::innerClassesAttribut = 0; const UTF8* Attribut::sourceFileAttribut = 0; +CommonClass* ClassArray::SuperArray; +std::vector ClassArray::InterfacesArray; + Attribut::Attribut(const UTF8* name, uint32 length, uint32 offset) { @@ -210,18 +213,20 @@ this->classLoader = loader; this->array = isArray; this->primitive = false; + this->JInfo = 0; #ifndef MULTIPLE_VM this->delegatee = 0; #endif } -#ifndef MULTIPLE_VM ClassPrimitive::ClassPrimitive(JnjvmClassLoader* loader, const UTF8* n, uint32 nb) : CommonClass(loader, n, false) { - + +#ifndef MULTIPLE_VM display = (CommonClass**)malloc(sizeof(CommonClass*)); display[0] = this; +#endif primitive = true; status = ready; access = ACC_ABSTRACT | ACC_FINAL | ACC_PUBLIC; @@ -233,21 +238,24 @@ bytes = B; super = 0; ctpInfo = 0; +#ifndef MULTIPLE_VM _staticInstance = 0; +#endif } ClassArray::ClassArray(JnjvmClassLoader* loader, const UTF8* n) : CommonClass(loader, n, true) { _funcs = 0; _baseClass = 0; - super = JnjvmBootstrapLoader::SuperArray; - interfaces = JnjvmBootstrapLoader::InterfacesArray; + super = ClassArray::SuperArray; + interfaces = ClassArray::InterfacesArray; +#ifndef MULTIPLE_VM depth = 1; display = (CommonClass**)malloc(2 * sizeof(CommonClass*)); display[0] = JnjvmBootstrapLoader::SuperArray; display[1] = this; +#endif access = ACC_FINAL | ACC_ABSTRACT; } -#endif void Class::print(mvm::PrintBuffer* buf) const { buf->write("Class<"); @@ -321,13 +329,15 @@ } JavaMethod* CommonClass::lookupMethodDontThrow(const UTF8* name, - const UTF8* type, bool isStatic, + const UTF8* type, + bool isStatic, bool recurse) { - FieldCmp CC(name, type); - method_map& map = isStatic ? staticMethods : virtualMethods; - method_iterator End = map.end(); - method_iterator I = map.find(CC); + CommonClass::FieldCmp CC(name, type); + CommonClass::method_map* map = isStatic ? getStaticMethods() : + getVirtualMethods(); + CommonClass::method_iterator End = map->end(); + CommonClass::method_iterator I = map->find(CC); if (I != End) return I->second; JavaMethod *cur = 0; @@ -337,8 +347,9 @@ recurse); if (cur) return cur; if (isStatic) { - for (std::vector::iterator i = interfaces.begin(), - e = interfaces.end(); i!= e; i++) { + std::vector* interfaces = getInterfaces(); + for (std::vector::iterator i = interfaces->begin(), + e = interfaces->end(); i!= e; i++) { cur = (*i)->lookupMethodDontThrow(name, type, isStatic, recurse); if (cur) return cur; } @@ -357,15 +368,16 @@ return res; } -JavaField* CommonClass::lookupFieldDontThrow(const UTF8* name, - const UTF8* type, bool isStatic, - bool recurse, - CommonClass*& definingClass) { - - FieldCmp CC(name, type); - field_map& map = isStatic ? staticFields : virtualFields; - field_iterator End = map.end(); - field_iterator I = map.find(CC); +JavaField* +CommonClass::lookupFieldDontThrow(const UTF8* name, const UTF8* type, + bool isStatic, bool recurse, + CommonClass*& definingClass) { + + CommonClass::FieldCmp CC(name, type); + CommonClass::field_map* map = isStatic ? getStaticFields() : + getVirtualFields(); + CommonClass::field_iterator End = map->end(); + CommonClass::field_iterator I = map->find(CC); if (I != End) { definingClass = this; return I->second; @@ -381,8 +393,9 @@ return cur; } if (isStatic) { - for (std::vector::iterator i = interfaces.begin(), - e = interfaces.end(); i!= e; i++) { + std::vector* interfaces = getInterfaces(); + for (std::vector::iterator i = interfaces->begin(), + e = interfaces->end(); i!= e; i++) { cur = (*i)->lookupFieldDontThrow(name, type, isStatic, recurse, definingClass); if (cur) { Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h Fri Aug 29 06:53:04 2008 @@ -120,6 +120,9 @@ /// class loader finalizer method will be defined. /// class CommonClass : public mvm::Object { +#ifdef MULTIPLE_VM +friend class UserCommonClass; +#endif private: @@ -138,7 +141,7 @@ FieldCmp(const UTF8* n, const UTF8* t) : name(n), type(t) {} - inline bool operator<(const FieldCmp &cmp) const; + bool operator<(const FieldCmp &cmp) const; }; public: @@ -223,12 +226,14 @@ bool isInterface() { return jnjvm::isInterface(access); } - -#ifndef MULTIPLE_VM + + /// interfaces - The interfaces this class implements. + /// + std::vector interfaces; + std::vector * getInterfaces() { return &interfaces; } -#endif /// name - The name of the class. /// @@ -254,10 +259,6 @@ return superUTF8; } - /// interfaces - The interfaces this class implements. - /// - std::vector interfaces; - /// interfacesUTF8 - The names of the interfaces this class implements. /// std::vector interfacesUTF8; @@ -316,6 +317,8 @@ field_map* getStaticFields() { return &staticFields; } field_map* getVirtualFields() { return &virtualFields; } + method_map* getStaticMethods() { return &staticMethods; } + method_map* getVirtualMethods() { return &virtualMethods; } /// constructMethod - Add a new method in this class method map. /// @@ -647,13 +650,6 @@ return ctpInfo; } - /// getCtpCache - A class does not have a ctp cache, hence - /// this method always returns 0. - /// - JavaConstantPool* getCtpCache() { - return 0; - } - ArrayUInt8* getBytes() { return bytes; } @@ -738,6 +734,9 @@ /// tracer - Tracer of array classes. /// virtual void TRACER; + + static CommonClass* SuperArray; + static std::vector InterfacesArray; }; /// JavaMethod - This class represents Java methods. Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaInitialise.cpp Fri Aug 29 06:53:04 2008 @@ -58,9 +58,9 @@ #ifdef MULTIPLE_VM INIT(JnjvmSharedLoader); INIT(SharedClassByteMap); - INIT(SharedClassNameMap); INIT(UserClass); INIT(UserClassArray); + INIT(UserConstantPool); #endif #undef INIT @@ -78,6 +78,12 @@ } void Jnjvm::initialiseStatics() { + +#ifdef MULTIPLE_VM + if (!JnjvmSharedLoader::sharedLoader) { + JnjvmSharedLoader::sharedLoader = JnjvmSharedLoader::createSharedLoader(); + } +#endif JnjvmBootstrapLoader* JCL = bootstrapLoader = JnjvmBootstrapLoader::createBootstrapLoader(); @@ -100,6 +106,17 @@ JCL->loadName(JCL->asciizConstructUTF8("java/lang/Object"), false, false); +#ifdef MULTIPLE_VM + if (!ClassArray::SuperArray) { + ClassArray::SuperArray = JCL->SuperArray->classDef; + ClassArray::InterfacesArray.push_back((Class*)JCL->InterfacesArray[0]->classDef); + ClassArray::InterfacesArray.push_back((Class*)JCL->InterfacesArray[1]->classDef); + } +#else + ClassArray::SuperArray = JCL->SuperArray; + ClassArray::InterfacesArray = JCL->InterfacesArray; +#endif + JCL->upcalls->ArrayOfChar->setInterfaces(JCL->InterfacesArray); JCL->upcalls->ArrayOfChar->setSuper(JCL->SuperArray); @@ -179,6 +196,7 @@ #undef DEF_UTF8 JCL->upcalls->initialiseClasspath(JCL); + } void mvm::VirtualMachine::initialiseJVM() { Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp Fri Aug 29 06:53:04 2008 @@ -1302,13 +1302,13 @@ void JavaJIT::makeArgs(FunctionType::param_iterator it, uint32 index, std::vector& Args, uint32 nb) { #if defined(MULTIPLE_VM) - nb += 2; + nb += 1; #endif Args.reserve(nb + 2); Value** args = (Value**)alloca(nb*sizeof(Value*)); #if defined(MULTIPLE_VM) - args[nb - 2] = isolateLocal; - sint32 start = nb - 3; + args[nb - 1] = isolateLocal; + sint32 start = nb - 2; it--; it--; #else @@ -1574,10 +1574,16 @@ // This makes unswitch loop very unhappy time-wise, but makes GVN happy // number-wise. IMO, it's better to have this than Unswitch. #if 1 + std::vector Args; #ifdef MULTIPLE_VM Value* CTP = ctpCache; - Value* Cl = new LoadInst(ctpCache, "", currentBlock); + std::vector Args; + Args.push_back(mvm::jit::constantOne); + Value* Cl = GetElementPtrInst::Create(CTP, Args.begin(), Args.end(), "", + currentBlock); + Cl = new LoadInst(Cl, "", currentBlock); Cl = new BitCastInst(Cl, JnjvmModule::JavaClassType, "", currentBlock); + Args.clear(); #else JavaConstantPool* ctp = compilingClass->ctpInfo; LLVMConstantPoolInfo* LCPI = module->getConstantPoolInfo(ctp); @@ -1586,11 +1592,15 @@ Value* Cl = LCI->getVar(this); #endif - std::vector Args; Args.push_back(resolver); Args.push_back(CTP); Args.push_back(Cl); +#ifndef MULTIPLE_VM Args.push_back(ConstantInt::get(Type::Int32Ty, index)); +#else + // Add one to the index because of the VT + Args.push_back(ConstantInt::get(Type::Int32Ty, index + 1)); +#endif if (additionalArg) Args.push_back(additionalArg); Value* res = 0; @@ -1621,7 +1631,12 @@ Value* CTP = LCPI->getDelegatee(this); #endif std::vector indexes; //[3]; +#ifndef MULTIPLE_VM indexes.push_back(ConstantInt::get(Type::Int32Ty, index)); +#else + // Add one to the index because of the VT + indexes.push_back(ConstantInt::get(Type::Int32Ty, index + 1)); +#endif Value* arg1 = GetElementPtrInst::Create(CTP, indexes.begin(), indexes.end(), "", currentBlock); @@ -1638,7 +1653,11 @@ currentBlock = falseCl; std::vector Args; #ifdef MULTIPLE_VM - Value* v = new LoadInst(ctpCache, "", currentBlock); + std::vector Args; + Args.push_back(mvm::jit::constantOne); + Value* v = GetElementPtrInst::Create(ctpCache, Args.begin(), Args.end(), "", + currentBlock); + v = new LoadInst(v, "", currentBlock); v = new BitCastInst(v, JnjvmModule::JavaClassType, "", currentBlock); #else LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(compilingClass); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp Fri Aug 29 06:53:04 2008 @@ -102,7 +102,7 @@ void* _buf = (void*)buf; \ readArgs(buf, sign, ap); \ void* func = (((void***)obj)[0])[offset];\ - return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, _buf);\ + return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getConstantPool(), func, obj, _buf);\ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) {\ @@ -117,7 +117,7 @@ void* _buf = (void*)buf; \ readArgs(buf, sign, ap); \ void* func = this->compiledPtr();\ - return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, _buf);\ + return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getConstantPool(), func, obj, _buf);\ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, UserClass* cl, va_list ap) {\ @@ -131,7 +131,7 @@ void* _buf = (void*)buf; \ readArgs(buf, sign, ap); \ void* func = this->compiledPtr();\ - return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, cl->getCtpCache(), func, _buf);\ + return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, cl->getConstantPool(), func, _buf);\ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\ @@ -145,7 +145,7 @@ \ Signdef* sign = getSignature(); \ void* func = meth->compiledPtr();\ - return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, buf);\ + return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getConstantPool(), func, obj, buf);\ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\ @@ -157,7 +157,7 @@ verifyNull(obj);\ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ - return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, buf);\ + return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getConstantPool(), func, obj, buf);\ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, UserClass* cl, void* buf) {\ @@ -168,7 +168,7 @@ \ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ - return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, cl->getCtpCache(), func, buf);\ + return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, cl->getConstantPool(), func, buf);\ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##Virtual(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) { \ @@ -208,7 +208,7 @@ verifyNull(obj); \ void* func = (((void***)obj)[0])[offset];\ Signdef* sign = getSignature(); \ - return ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(vm, cl->getCtpCache(), func, obj, ap);\ + return ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(vm, cl->getConstantPool(), func, obj, ap);\ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) {\ @@ -220,7 +220,7 @@ verifyNull(obj);\ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ - return ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(vm, cl->getCtpCache(), func, obj, ap);\ + return ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(vm, cl->getConstantPool(), func, obj, ap);\ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, UserClass* cl, va_list ap) {\ @@ -231,7 +231,7 @@ \ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ - return ((FUNC_TYPE_STATIC_AP)sign->getStaticCallAP())(vm, cl->getCtpCache(), func, ap);\ + return ((FUNC_TYPE_STATIC_AP)sign->getStaticCallAP())(vm, cl->getConstantPool(), func, ap);\ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\ @@ -243,7 +243,7 @@ verifyNull(obj);\ void* func = (((void***)obj)[0])[offset];\ Signdef* sign = getSignature(); \ - return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, buf);\ + return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getConstantPool(), func, obj, buf);\ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\ @@ -255,7 +255,7 @@ verifyNull(obj);\ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ - return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, buf);\ + return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getConstantPool(), func, obj, buf);\ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, UserClass* cl, void* buf) {\ @@ -266,7 +266,7 @@ \ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ - return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, cl->getCtpCache(), func, buf);\ + return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, cl->getConstantPool(), func, buf);\ }\ \ TYPE JavaMethod::invoke##TYPE_NAME##Virtual(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) { \ Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp Fri Aug 29 06:53:04 2008 @@ -86,7 +86,7 @@ JnjvmBootstrapLoader* Jnjvm::bootstrapLoader; #endif -typedef void (*clinit_t)(Jnjvm* vm); +typedef void (*clinit_t)(Jnjvm* vm, UserConstantPool*); void UserCommonClass::initialiseClass(Jnjvm* vm) { // Primitives are initialized at boot time @@ -133,7 +133,7 @@ JavaObject* exc = 0; try{ clinit_t pred = (clinit_t)(intptr_t)meth->compiledPtr(); - pred(vm); + pred(vm, cl->getConstantPool()); } catch(...) { exc = JavaThread::getJavaException(); assert(exc && "no exception?"); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Fri Aug 29 06:53:04 2008 @@ -46,7 +46,7 @@ JCL->allocator = new JavaAllocator(); - JCL->hashUTF8 = new UTF8Map(JCL->allocator, JCL->upcalls->ArrayOfChar); + JCL->hashUTF8 = new UTF8Map(JCL->allocator, 0); JCL->classes = allocator_new(allocator, ClassMap)(); JCL->javaTypes = new TypeMap(); JCL->javaSignatures = new SignMap(); @@ -62,7 +62,8 @@ } JCL->analyseClasspathEnv(JCL->bootClasspathEnv); - + + JCL->upcalls = new Classpath(); return JCL; } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Fri Aug 29 06:53:04 2008 @@ -45,11 +45,8 @@ const llvm::Type* JnjvmModule::JavaArrayObjectType = 0; const llvm::Type* JnjvmModule::CacheNodeType = 0; const llvm::Type* JnjvmModule::EnveloppeType = 0; - -#ifdef MULTIPLE_VM const llvm::Type* JnjvmModule::JnjvmType = 0; -const llvm::Type* JnjvmModule::UserClassType = 0; -#endif +const llvm::Type* JnjvmModule::ConstantPoolType = 0; llvm::Constant* JnjvmModule::JavaObjectNullConstant; llvm::Constant* JnjvmModule::UTF8NullConstant; @@ -62,6 +59,8 @@ llvm::ConstantInt* JnjvmModule::OffsetVTInClassConstant; llvm::ConstantInt* JnjvmModule::OffsetDepthInClassConstant; llvm::ConstantInt* JnjvmModule::OffsetDisplayInClassConstant; +llvm::ConstantInt* JnjvmModule::OffsetStatusInClassConstant; +llvm::ConstantInt* JnjvmModule::OffsetCtpInClassConstant; const llvm::Type* JnjvmModule::JavaClassType; const llvm::Type* JnjvmModule::VTType; llvm::ConstantInt* JnjvmModule::JavaArrayElementsOffsetConstant; @@ -583,8 +582,8 @@ } #if defined(MULTIPLE_VM) - llvmArgs.push_back(mvm::jit::ptrType); // domain - llvmArgs.push_back(mvm::jit::ptrPtrType); // cached constant pool + llvmArgs.push_back(JnjvmModule::JnjvmType); // vm + llvmArgs.push_back(JnjvmModule::ConstantPoolType); // cached constant pool #endif uint8 id = signature->ret->funcs->numId; @@ -608,8 +607,8 @@ } #if defined(MULTIPLE_VM) - llvmArgs.push_back(mvm::jit::ptrType); // domain - llvmArgs.push_back(mvm::jit::ptrPtrType); // cached constant pool + llvmArgs.push_back(JnjvmModule::JnjvmType); // vm + llvmArgs.push_back(JnjvmModule::ConstantPoolType); // cached constant pool #endif uint8 id = signature->ret->funcs->numId; @@ -636,8 +635,8 @@ } #if defined(MULTIPLE_VM) - llvmArgs.push_back(mvm::jit::ptrType); // domain - llvmArgs.push_back(mvm::jit::ptrPtrType); // cached constant pool + llvmArgs.push_back(JnjvmModule::JnjvmType); // vm + llvmArgs.push_back(JnjvmModule::ConstantPoolType); // cached constant pool #endif uint8 id = signature->ret->funcs->numId; @@ -787,8 +786,8 @@ // Lock here because we are called by arbitrary code llvm::MutexGuard locked(mvm::jit::executionEngine->lock); std::vector Args2; - Args2.push_back(mvm::jit::ptrType); // vm - Args2.push_back(mvm::jit::ptrPtrType); // ctp + Args2.push_back(JnjvmModule::JnjvmType); // vm + Args2.push_back(JnjvmModule::ConstantPoolType); // ctp Args2.push_back(getVirtualPtrType()); Args2.push_back(JnjvmModule::JavaObjectType); Args2.push_back(PointerType::getUnqual(Type::Int32Ty)); @@ -804,8 +803,8 @@ // Lock here because we are called by arbitrary code llvm::MutexGuard locked(mvm::jit::executionEngine->lock); std::vector Args; - Args.push_back(mvm::jit::ptrType); // vm - Args.push_back(mvm::jit::ptrPtrType); // ctp + Args.push_back(JnjvmModule::JnjvmType); // vm + Args.push_back(JnjvmModule::ConstantPoolType); // ctp Args.push_back(getStaticPtrType()); Args.push_back(PointerType::getUnqual(Type::Int32Ty)); uint8 id = signature->ret->funcs->numId; @@ -928,10 +927,10 @@ VTType = module->getTypeByName("VT"); -#ifdef MULTIPLE_VM - UserClassType = module->getTypeByName("UserClass"); - JnjvmType = module->getTypeByName("Jnjvm"); -#endif + JnjvmType = + PointerType::getUnqual(module->getTypeByName("Jnjvm")); + ConstantPoolType = + PointerType::getUnqual(module->getTypeByName("ConstantPool")); JavaObjectType = PointerType::getUnqual(module->getTypeByName("JavaObject")); @@ -1097,6 +1096,8 @@ OffsetVTInClassConstant = mvm::jit::constantTwo; OffsetDisplayInClassConstant = mvm::jit::constantThree; OffsetDepthInClassConstant = mvm::jit::constantFour; + OffsetStatusInClassConstant = mvm::jit::constantFive; + OffsetCtpInClassConstant = mvm::jit::constantSix; LLVMAssessorInfo::initialise(); } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.h Fri Aug 29 06:53:04 2008 @@ -304,11 +304,8 @@ static const llvm::Type* JavaCacheType; static const llvm::Type* EnveloppeType; static const llvm::Type* CacheNodeType; - -#ifdef MULTIPLE_VM static const llvm::Type* JnjvmType; - static const llvm::Type* UserClassType; -#endif + static const llvm::Type* ConstantPoolType; #ifdef WITH_TRACER static llvm::Function* MarkAndTraceFunction; @@ -376,6 +373,8 @@ static llvm::ConstantInt* OffsetVTInClassConstant; static llvm::ConstantInt* OffsetDepthInClassConstant; static llvm::ConstantInt* OffsetDisplayInClassConstant; + static llvm::ConstantInt* OffsetStatusInClassConstant; + static llvm::ConstantInt* OffsetCtpInClassConstant; static llvm::Constant* JavaClassNullConstant; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp Fri Aug 29 06:53:04 2008 @@ -310,6 +310,21 @@ CI->eraseFromParent(); } #endif + +#ifdef MULTIPLE_VM + else if (V == jnjvm::JnjvmModule::GetCtpClassFunction) { + Changed = true; + Value* val = Call.getArgument(0); + std::vector indexes; + indexes.push_back(mvm::jit::constantZero); + indexes.push_back(jnjvm::JnjvmModule::OffsetCtpInClassConstant); + Value* VTPtr = GetElementPtrInst::Create(val, indexes.begin(), + indexes.end(), "", CI); + Value* VT = new LoadInst(VTPtr, "", CI); + CI->replaceAllUsesWith(VT); + CI->eraseFromParent(); + } +#endif } } } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.cpp?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.cpp Fri Aug 29 06:53:04 2008 @@ -25,14 +25,14 @@ const int Reader::SeekCur = SEEK_CUR; const int Reader::SeekEnd = SEEK_END; -ArrayUInt8* Reader::openFile(JnjvmClassLoader* loader, char* path) { +ArrayUInt8* Reader::openFile(JnjvmBootstrapLoader* loader, char* path) { FILE* fp = fopen(path, "r"); ArrayUInt8* res = 0; if (fp != 0) { fseek(fp, 0, SeekEnd); long nbb = ftell(fp); fseek(fp, 0, SeekSet); - UserClassArray* array = loader->bootstrapLoader->upcalls->ArrayOfByte; + UserClassArray* array = loader->upcalls->ArrayOfByte; res = ArrayUInt8::acons(nbb, array, loader->allocator); fread(res->elements, nbb, 1, fp); fclose(fp); @@ -40,12 +40,12 @@ return res; } -ArrayUInt8* Reader::openZip(JnjvmClassLoader* loader, ZipArchive* archive, +ArrayUInt8* Reader::openZip(JnjvmBootstrapLoader* loader, ZipArchive* archive, char* filename) { ArrayUInt8* ret = 0; ZipFile* file = archive->getFile(filename); if (file != 0) { - UserClassArray* array = loader->bootstrapLoader->upcalls->ArrayOfByte; + UserClassArray* array = loader->upcalls->ArrayOfByte; ArrayUInt8* res = ArrayUInt8::acons(file->ucsize, array, loader->allocator); if (archive->readFile(res, file) != 0) { ret = res; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.h?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/Reader.h Fri Aug 29 06:53:04 2008 @@ -19,7 +19,7 @@ namespace jnjvm { -class JnjvmClassLoader; +class JnjvmBootstrapLoader; class ZipArchive; class Reader { @@ -76,8 +76,8 @@ static const int SeekCur; static const int SeekEnd; - static ArrayUInt8* openFile(JnjvmClassLoader* loader, char* path); - static ArrayUInt8* openZip(JnjvmClassLoader* loader, ZipArchive* archive, char* filename); + static ArrayUInt8* openFile(JnjvmBootstrapLoader* loader, char* path); + static ArrayUInt8* openZip(JnjvmBootstrapLoader* loader, ZipArchive* archive, char* filename); uint8 readU1() { return bytes->elements[cursor++]; Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp?rev=55535&r1=55534&r2=55535&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/VirtualTables.cpp Fri Aug 29 06:53:04 2008 @@ -42,9 +42,9 @@ #ifdef MULTIPLE_VM INIT(JnjvmSharedLoader); INIT(SharedClassByteMap); - INIT(SharedClassNameMap); INIT(UserClass); INIT(UserClassArray); + INIT(UserConstantPool); #endif #ifdef SERVICE_VM INIT(ServiceDomain); @@ -153,6 +153,7 @@ classLoader->MARK_AND_TRACE; delegatee->MARK_AND_TRACE; staticInstance->MARK_AND_TRACE; + ctpInfo->MARK_AND_TRACE; } void UserClassPrimitive::TRACER { @@ -171,12 +172,8 @@ } } -void SharedClassNameMap::TRACER { -} - void JnjvmSharedLoader::TRACER { byteClasses->MARK_AND_TRACE; - nameClasses->MARK_AND_TRACE; } #endif From nicolas.geoffray at lip6.fr Sun Aug 31 02:51:27 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 31 Aug 2008 09:51:27 -0000 Subject: [vmkit-commits] [vmkit] r55584 - /vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200808310951.m7V9pR3n002035@zion.cs.uiuc.edu> Author: geoffray Date: Sun Aug 31 04:51:27 2008 New Revision: 55584 URL: http://llvm.org/viewvc/llvm-project?rev=55584&view=rev Log: Only copy the usefull VTs. Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=55584&r1=55583&r2=55584&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Sun Aug 31 04:51:27 2008 @@ -275,17 +275,8 @@ memcpy((void*)((unsigned)CLASS::VT + VT_SIZE), \ (void*)((unsigned)res + VT_SIZE), size); + COPY(JavaArray) COPY(JavaObject) - COPY(ArrayUInt8) - COPY(ArraySInt8) - COPY(ArrayUInt16) - COPY(ArraySInt16) - COPY(ArrayUInt32) - COPY(ArraySInt32) - COPY(ArrayLong) - COPY(ArrayFloat) - COPY(ArrayDouble) - COPY(UTF8) COPY(ArrayObject) #undef COPY From nicolas.geoffray at lip6.fr Sun Aug 31 02:51:48 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 31 Aug 2008 09:51:48 -0000 Subject: [vmkit-commits] [vmkit] r55585 - /vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp Message-ID: <200808310951.m7V9pmZ6002054@zion.cs.uiuc.edu> Author: geoffray Date: Sun Aug 31 04:51:48 2008 New Revision: 55585 URL: http://llvm.org/viewvc/llvm-project?rev=55585&view=rev Log: Typo. Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp?rev=55585&r1=55584&r2=55585&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp Sun Aug 31 04:51:48 2008 @@ -1577,7 +1577,6 @@ std::vector Args; #ifdef MULTIPLE_VM Value* CTP = ctpCache; - std::vector Args; Args.push_back(mvm::jit::constantOne); Value* Cl = GetElementPtrInst::Create(CTP, Args.begin(), Args.end(), "", currentBlock); @@ -1595,12 +1594,7 @@ Args.push_back(resolver); Args.push_back(CTP); Args.push_back(Cl); -#ifndef MULTIPLE_VM Args.push_back(ConstantInt::get(Type::Int32Ty, index)); -#else - // Add one to the index because of the VT - Args.push_back(ConstantInt::get(Type::Int32Ty, index + 1)); -#endif if (additionalArg) Args.push_back(additionalArg); Value* res = 0; From nicolas.geoffray at lip6.fr Sun Aug 31 02:52:28 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 31 Aug 2008 09:52:28 -0000 Subject: [vmkit-commits] [vmkit] r55586 - /vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp Message-ID: <200808310952.m7V9qSvV002093@zion.cs.uiuc.edu> Author: geoffray Date: Sun Aug 31 04:52:28 2008 New Revision: 55586 URL: http://llvm.org/viewvc/llvm-project?rev=55586&view=rev Log: Implement GetJnjvmArrayClassFunction and bugfix for GetConstantPoolAtFunction. Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=55586&r1=55585&r2=55586&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp Sun Aug 31 04:52:28 2008 @@ -247,7 +247,14 @@ } std::vector indexes; //[3]; +#ifdef MULTIPLE_VM + ConstantInt* Cons = dyn_cast(Index); + assert(CI && "Wrong use of GetConstantPoolAt"); + uint64 val = Cons->getZExtValue(); + indexes.push_back(ConstantInt::get(Type::Int32Ty, val + 1)); +#else indexes.push_back(Index); +#endif Value* arg1 = GetElementPtrInst::Create(CTP, indexes.begin(), indexes.end(), "", CI); arg1 = new LoadInst(arg1, "", false, CI); @@ -323,6 +330,19 @@ Value* VT = new LoadInst(VTPtr, "", CI); CI->replaceAllUsesWith(VT); CI->eraseFromParent(); + } else if (V == jnjvm::JnjvmModule::GetJnjvmArrayClassFunction) { + Changed = true; + Value* val = Call.getArgument(0); + Value* index = Call.getArgument(1); + std::vector indexes; + indexes.push_back(mvm::jit::constantZero); + indexes.push_back(mvm::jit::constantTwo); + indexes.push_back(index); + Value* VTPtr = GetElementPtrInst::Create(val, indexes.begin(), + indexes.end(), "", CI); + Value* VT = new LoadInst(VTPtr, "", CI); + CI->replaceAllUsesWith(VT); + CI->eraseFromParent(); } #endif } From nicolas.geoffray at lip6.fr Sun Aug 31 02:53:46 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 31 Aug 2008 09:53:46 -0000 Subject: [vmkit-commits] [vmkit] r55587 - in /vmkit/branches/isolate/lib/JnJVM/Isolate: IsolateCommonClass.cpp IsolateCommonClass.h Message-ID: <200808310953.m7V9rkx0002147@zion.cs.uiuc.edu> Author: geoffray Date: Sun Aug 31 04:53:46 2008 New Revision: 55587 URL: http://llvm.org/viewvc/llvm-project?rev=55587&view=rev Log: Implement UserConstantPool::loadClass ::resolveMethod and ::resolveField. Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp?rev=55587&r1=55586&r2=55587&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp Sun Aug 31 04:53:46 2008 @@ -35,7 +35,7 @@ classLoader = JCL; delegatee = 0; staticInstance = 0; - ctpInfo = new(JCL->allocator, cl->ctpInfo->ctpSize) UserConstantPool(this); + ctpInfo = 0; } UserClassArray::UserClassArray(JnjvmClassLoader* JCL, const UTF8* name) { @@ -82,11 +82,15 @@ def->readClass(); def->status = classRead; status = classRead; - def->release(); - release(); + cl->ctpInfo = + new(classLoader->allocator, def->ctpInfo->ctpSize) UserConstantPool(cl); cl->loadParents(); - acquire(); - def->acquire(); + if (cl->super) + def->super = cl->super->classDef; + for (std::vector::iterator i = interfaces.begin(), + e = interfaces.end(); i != e; ++i) { + def->interfaces.push_back((Class*)((*i)->classDef)); + } def->status = prepared; status = prepared; def->classLoader->TheModule->resolveVirtualClass(def); @@ -100,6 +104,8 @@ classDef->release(); } } else { + cl->ctpInfo = + new(classLoader->allocator, def->ctpInfo->ctpSize) UserConstantPool(cl); release(); status = classRead, cl->loadParents(); @@ -128,27 +134,58 @@ return 0; } + +UserCommonClass* UserConstantPool::isClassLoaded(uint32 entry) { + JavaConstantPool* ctpInfo = getSharedPool(); + if (! ((entry > 0) && (entry < ctpInfo->ctpSize) && + ctpInfo->typeAt(entry) == JavaConstantPool::ConstantClass)) { + JavaThread::get()->isolate->classFormatError( + "bad constant pool number for class at entry %d", entry); + } + return (UserCommonClass*)ctpRes[entry]; +} + UserCommonClass* UserConstantPool::loadClass(uint32 index) { - fprintf(stderr, "implement me"); - abort(); - return 0; + UserCommonClass* temp = isClassLoaded(index); + if (!temp) { + JavaConstantPool* ctpInfo = getSharedPool(); + JnjvmClassLoader* loader = getClass()->classLoader; + const UTF8* name = ctpInfo->UTF8At(ctpInfo->ctpDef[index]); + if (name->elements[0] == AssessorDesc::I_TAB) { + temp = loader->constructArray(name); + temp->resolveClass(); + } else { + // Put into ctpRes because there is only one representation of the class + temp = loader->loadName(name, true, false); + } + ctpRes[index] = temp; + ctpInfo->ctpRes[index] = getClass()->classDef; + } + return temp; } void UserConstantPool::resolveMethod(uint32 index, UserCommonClass*& cl, const UTF8*& utf8, Signdef*& sign) { - fprintf(stderr, "implement me"); - abort(); + JavaConstantPool* ctpInfo = getSharedPool(); + sint32 entry = ctpInfo->ctpDef[index]; + sint32 ntIndex = entry & 0xFFFF; + sign = (Signdef*)ctpInfo->ctpRes[ntIndex]; + assert(sign && "No cached signature after JITting"); + utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[ntIndex] >> 16); + cl = loadClass(entry >> 16); + assert(cl && cl->isResolved() && "No resolved class when resolving method"); } void UserConstantPool::resolveField(uint32 index, UserCommonClass*& cl, const UTF8*& utf8, Typedef*& sign) { - fprintf(stderr, "implement me"); - abort(); -} - -const UTF8* UserConstantPool::UTF8AtForString(uint32 entry) { - fprintf(stderr, "implement me"); - abort(); + JavaConstantPool* ctpInfo = getSharedPool(); + sint32 entry = ctpInfo->ctpDef[index]; + sint32 ntIndex = entry & 0xFFFF; + sign = (Typedef*)ctpInfo->ctpRes[ntIndex]; + assert(sign && "No cached Typedef after JITting"); + utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[ntIndex] >> 16); + cl = loadClass(entry >> 16); + assert(cl && cl->isResolved() && "No resolved class when resolving field"); } void* UserConstantPool::operator new(size_t sz, JavaAllocator* alloc, Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h?rev=55587&r1=55586&r2=55587&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h Sun Aug 31 04:53:46 2008 @@ -16,6 +16,8 @@ #include "mvm/Object.h" +#include "JavaConstantPool.h" + namespace jnjvm { class ArrayUInt8; @@ -112,6 +114,10 @@ bool isReady() { return status >= inClinit; } + + bool isResolved() { + return status >= resolved; + } uint8 getAccess() { return classDef->access; @@ -386,10 +392,20 @@ /// void resolveField(uint32 index, UserCommonClass*& cl, const UTF8*& utf8, Typedef*& sign); + + UserClass* getClass() { + return (UserClass*)ctpRes[0]; + } + + JavaConstantPool* getSharedPool() { + return ((Class*)(getClass()->classDef))->ctpInfo; + } /// UTF8At - Get the UTF8 referenced from this string entry. /// - const UTF8* UTF8AtForString(uint32 entry); + const UTF8* UTF8AtForString(uint32 entry) { + return getSharedPool()->UTF8AtForString(entry); + } /// loadClass - Loads the class and returns it. This is called just in time, /// ie when the class will be used and not yet resolved. @@ -403,6 +419,9 @@ UserConstantPool(UserClass* cl) { ctpRes[0] = cl; } + + UserCommonClass* isClassLoaded(uint32 entry); + }; } // end namespace jnjvm From nicolas.geoffray at lip6.fr Sun Aug 31 13:43:03 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 31 Aug 2008 20:43:03 -0000 Subject: [vmkit-commits] [vmkit] r55592 - in /vmkit/branches/isolate: include/mvm/Object.h lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200808312043.m7VKh4kX022540@zion.cs.uiuc.edu> Author: geoffray Date: Sun Aug 31 15:43:03 2008 New Revision: 55592 URL: http://llvm.org/viewvc/llvm-project?rev=55592&view=rev Log: Major bugfix when copying virtual tables. The java/lang/object had 11 entries, not 12. Modified: vmkit/branches/isolate/include/mvm/Object.h vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Modified: vmkit/branches/isolate/include/mvm/Object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/include/mvm/Object.h?rev=55592&r1=55591&r2=55592&view=diff ============================================================================== --- vmkit/branches/isolate/include/mvm/Object.h (original) +++ vmkit/branches/isolate/include/mvm/Object.h Sun Aug 31 15:43:03 2008 @@ -23,6 +23,7 @@ #define VT_TRACER_OFFSET 2 #define VT_PRINT_OFFSET 3 #define VT_HASHCODE_OFFSET 4 +#define VT_NB_FUNCS 5 #define VT_SIZE 5 * sizeof(void*) Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=55592&r1=55591&r2=55592&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Sun Aug 31 15:43:03 2008 @@ -264,13 +264,12 @@ if (cl->super) { cl->virtualTableSize = cl->super->virtualTableSize; } else { - cl->virtualTableSize = VT_SIZE / sizeof(void*); + cl->virtualTableSize = VT_NB_FUNCS; } res = allocateVT(cl, cl->virtualMethods.begin()); if (!(cl->super)) { - // 12 = number of virtual methods in java/lang/Object (!!!) - uint32 size = 12 * sizeof(void*); + uint32 size = (cl->virtualTableSize - VT_NB_FUNCS) * sizeof(void*); #define COPY(CLASS) \ memcpy((void*)((unsigned)CLASS::VT + VT_SIZE), \ (void*)((unsigned)res + VT_SIZE), size); From nicolas.geoffray at lip6.fr Sun Aug 31 22:47:17 2008 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 01 Sep 2008 05:47:17 -0000 Subject: [vmkit-commits] [vmkit] r55595 - in /vmkit/branches/isolate/lib/JnJVM: Isolate/IsolateCommonClass.cpp Isolate/IsolateCommonClass.h VMCore/JavaClass.h VMCore/JavaConstantPool.cpp VMCore/JavaJIT.cpp VMCore/JavaRuntimeJIT.cpp VMCore/JnjvmModuleProvider.cpp VMCore/LowerConstantCalls.cpp Message-ID: <200809010547.m815lIpx006507@zion.cs.uiuc.edu> Author: geoffray Date: Mon Sep 1 00:47:17 2008 New Revision: 55595 URL: http://llvm.org/viewvc/llvm-project?rev=55595&view=rev Log: Small bugfixes, assertion correction and improvements for the isolate environment. Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp?rev=55595&r1=55594&r2=55595&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp Mon Sep 1 00:47:17 2008 @@ -94,6 +94,8 @@ def->status = prepared; status = prepared; def->classLoader->TheModule->resolveVirtualClass(def); + virtualSize = def->virtualSize; + virtualVT = def->virtualVT; def->status = resolved; status = resolved; classDef->broadcastClass(); @@ -159,7 +161,7 @@ temp = loader->loadName(name, true, false); } ctpRes[index] = temp; - ctpInfo->ctpRes[index] = getClass()->classDef; + ctpInfo->ctpRes[index] = temp->classDef; } return temp; } Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h?rev=55595&r1=55594&r2=55595&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h (original) +++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h Mon Sep 1 00:47:17 2008 @@ -188,7 +188,7 @@ UserCommonClass*& fieldCl); - uint64 getVirtualSize() { + uint32 getVirtualSize() { return virtualSize; } @@ -319,7 +319,7 @@ return ctpInfo; } - uint64 getStaticSize() { + uint32 getStaticSize() { return ((Class*)classDef)->getStaticSize(); } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h?rev=55595&r1=55594&r2=55595&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h Mon Sep 1 00:47:17 2008 @@ -963,7 +963,7 @@ /// #define GETFIELD(TYPE, TYPE_NAME) \ TYPE get##TYPE_NAME##Field(JavaObject* obj) { \ - assert((classDef->getStatus()) >= inClinit); \ + assert(classDef->isResolved()); \ void* ptr = (void*)((uint64)obj + ptrOffset); \ return ((TYPE*)ptr)[0]; \ } @@ -972,7 +972,7 @@ /// #define SETFIELD(TYPE, TYPE_NAME) \ void set##TYPE_NAME##Field(JavaObject* obj, TYPE val) { \ - assert((classDef->getStatus()) >= inClinit); \ + assert(classDef->isResolved()); \ void* ptr = (void*)((uint64)obj + ptrOffset); \ ((TYPE*)ptr)[0] = val; \ } Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=55595&r1=55594&r2=55595&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaConstantPool.cpp Mon Sep 1 00:47:17 2008 @@ -434,7 +434,7 @@ assert(sign && "No cached signature after JITting"); utf8 = UTF8At(ctpDef[ntIndex] >> 16); cl = loadClass(entry >> 16); - cl->resolveClass(); + assert(cl && cl->isResolved() && "No class after loadClass"); } void JavaConstantPool::resolveField(uint32 index, CommonClass*& cl, @@ -445,7 +445,7 @@ assert(sign && "No cached Typedef after JITting"); utf8 = UTF8At(ctpDef[ntIndex] >> 16); cl = loadClass(entry >> 16); - cl->resolveClass(); + assert(cl && cl->isResolved() && "No class after loadClass"); } JavaField* JavaConstantPool::lookupField(uint32 index, bool stat) { Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp?rev=55595&r1=55594&r2=55595&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp Mon Sep 1 00:47:17 2008 @@ -2060,6 +2060,12 @@ "", ifFalse); Value* meth = new BitCastInst(_meth, virtualPtrType, "", currentBlock); +#ifdef MULTIPLE_VM + cache = new LoadInst(cachePtr, "", currentBlock); + Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheNodeFunction, + cache, "", currentBlock); + args.push_back(newCtpCache); +#endif Value* ret = invoke(meth, args, "", currentBlock); if (node) { node->addIncoming(ret, currentBlock); @@ -2075,9 +2081,10 @@ meth = new BitCastInst(_meth, virtualPtrType, "", currentBlock); #ifdef MULTIPLE_VM + args.pop_back(); cache = new LoadInst(cachePtr, "", currentBlock); - Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheNodeFunction, - cache, "", currentBlock); + newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheNodeFunction, + cache, "", currentBlock); args.push_back(newCtpCache); #endif ret = invoke(meth, args, "", currentBlock); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=55595&r1=55594&r2=55595&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Mon Sep 1 00:47:17 2008 @@ -58,9 +58,13 @@ } if (!rcache) { +#ifndef MULTIPLE_VM JavaMethod* dmeth = ocl->lookupMethod(utf8, sign->keyName, false, true); assert(dmeth->classDef->isReady() && "Class not ready in a virtual lookup."); +#else + JavaMethod* dmeth = ocl->lookupMethod(utf8, sign->keyName, false, true); +#endif if (cache->methPtr) { rcache = new CacheNode(enveloppe); } else { Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=55595&r1=55594&r2=55595&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Mon Sep 1 00:47:17 2008 @@ -98,7 +98,9 @@ LLVMMethodInfo* LMI = ((JnjvmModule*)TheModule)->getMethodInfo(meth); uint64_t offset = LMI->getOffset()->getZExtValue(); assert(meth->classDef->isResolved() && "Class not resolved"); +#ifndef MULTIPLE_VM assert(meth->classDef->isReady() && "Class not ready"); +#endif assert(meth->classDef->virtualVT && "Class has no VT"); assert(meth->classDef->virtualTableSize > offset && "The method's offset is greater than the virtual table size"); Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=55595&r1=55594&r2=55595&view=diff ============================================================================== --- vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original) +++ vmkit/branches/isolate/lib/JnJVM/VMCore/LowerConstantCalls.cpp Mon Sep 1 00:47:17 2008 @@ -330,6 +330,17 @@ Value* VT = new LoadInst(VTPtr, "", CI); CI->replaceAllUsesWith(VT); CI->eraseFromParent(); + } else if (V == jnjvm::JnjvmModule::GetCtpCacheNodeFunction) { + Changed = true; + Value* val = Call.getArgument(0); + std::vector indexes; + indexes.push_back(mvm::jit::constantZero); + indexes.push_back(mvm::jit::constantFour); + Value* VTPtr = GetElementPtrInst::Create(val, indexes.begin(), + indexes.end(), "", CI); + Value* VT = new LoadInst(VTPtr, "", CI); + CI->replaceAllUsesWith(VT); + CI->eraseFromParent(); } else if (V == jnjvm::JnjvmModule::GetJnjvmArrayClassFunction) { Changed = true; Value* val = Call.getArgument(0);