From nicolas.geoffray at lip6.fr Thu Jan 1 09:50:52 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 01 Jan 2009 17:50:52 -0000 Subject: [vmkit-commits] [vmkit] r61543 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaClass.h JavaJIT.cpp Message-ID: <200901011750.n01HoqmJ003481@zion.cs.uiuc.edu> Author: geoffray Date: Thu Jan 1 11:50:51 2009 New Revision: 61543 URL: http://llvm.org/viewvc/llvm-project?rev=61543&view=rev Log: Initialization optimisation when a class does not have a clinit method and static fields. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=61543&r1=61542&r2=61543&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Thu Jan 1 11:50:51 2009 @@ -896,6 +896,9 @@ Mod->resolveVirtualClass(this); Mod->resolveStaticClass(this); setResolved(); + if (!needsInitialisationCheck()) { + setInitializationState(ready); + } broadcastClass(); release(); } else { @@ -1228,3 +1231,24 @@ return false; } + +bool UserClass::needsInitialisationCheck() { + + if (!isClassRead()) return true; + + if (isReady()) return false; + + if (super && super->needsInitialisationCheck()) + return true; + + if (nbStaticFields) return true; + + JavaMethod* meth = + lookupMethodDontThrow(classLoader->bootstrapLoader->clinitName, + classLoader->bootstrapLoader->clinitType, + true, false, 0); + + if (meth) return true; + + return false; +} Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=61543&r1=61542&r2=61543&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Thu Jan 1 11:50:51 2009 @@ -806,11 +806,15 @@ IsolateInfo[0].status = classRead; } - /// isResolving - IS the class currently being resolved? + /// isResolving - Is the class currently being resolved? /// bool isResolving() { return IsolateInfo[0].status == classRead; } + + bool isClassRead() { + return IsolateInfo[0].status >= classRead; + } #else TaskClassMirror& getCurrentTaskClassMirror(); @@ -831,6 +835,10 @@ getCurrentTaskClassMirror().status = st; } + bool isClassRead() { + return getCurrentTaskClassMirror().status >= classRead; + } + bool isReady() { return getCurrentTaskClassMirror().status == ready; } @@ -874,7 +882,13 @@ } #endif + /// isNativeOverloaded - Is the method overloaded with a native function? + /// bool isNativeOverloaded(JavaMethod* meth); + + /// needsInitialisationCheck - Does the method need an initialisation check? + /// + bool needsInitialisationCheck(); }; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=61543&r1=61542&r2=61543&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Thu Jan 1 11:50:51 2009 @@ -48,7 +48,19 @@ #ifdef SERVICE return true; #else - return !(cl->isReadyForCompilation() || compilingClass->subclassOf(cl)); + + if (cl->isReadyForCompilation() || compilingClass->subclassOf(cl)) { + return false; + } + + if (!cl->needsInitialisationCheck()) { + if (!cl->isReady()) { + cl->setInitializationState(ready); + } + return false; + } + + return true; #endif } From nicolas.geoffray at lip6.fr Thu Jan 1 10:46:12 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 01 Jan 2009 18:46:12 -0000 Subject: [vmkit-commits] [vmkit] r61544 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaClass.h JavaJIT.cpp Message-ID: <200901011846.n01IkCwH005228@zion.cs.uiuc.edu> Author: geoffray Date: Thu Jan 1 12:46:12 2009 New Revision: 61544 URL: http://llvm.org/viewvc/llvm-project?rev=61544&view=rev Log: Resolve exceptions of a method when resolving a class, so that we don't need to resolve the exceptions when compiling. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=61544&r1=61543&r2=61544&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Thu Jan 1 12:46:12 2009 @@ -780,6 +780,44 @@ true, true)); } + +static void internalLoadExceptions(JavaMethod& meth) { + + Attribut* codeAtt = meth.lookupAttribut(Attribut::codeAttribut); + + if (codeAtt) { + Reader reader(codeAtt, meth.classDef->bytes); + //uint16 maxStack = + reader.readU2(); + //uint16 maxLocals = + reader.readU2(); + uint16 codeLen = reader.readU4(); + + reader.seek(codeLen, Reader::SeekCur); + + uint16 nbe = reader.readU2(); + for (uint16 i = 0; i < nbe; ++i) { + //startpc = + reader.readU2(); + //endpc= + reader.readU2(); + //handlerpc = + reader.readU2(); + + uint16 catche = reader.readU2(); + if (catche) meth.classDef->ctpInfo->loadClass(catche); + } + } +} + +void UserClass::loadExceptions() { + for (uint32 i = 0; i < nbVirtualMethods; ++i) + internalLoadExceptions(virtualMethods[i]); + + for (uint32 i = 0; i < nbStaticMethods; ++i) + internalLoadExceptions(staticMethods[i]); +} + Attribut* Class::readAttributs(Reader& reader, uint16& size) { uint16 nba = reader.readU2(); @@ -888,9 +926,11 @@ if (isResolved()) { release(); } else if (!isResolving()) { + setOwnerClass(JavaThread::get()); readClass(); release(); loadParents(); + loadExceptions(); acquire(); JnjvmModule *Mod = classLoader->getModule(); Mod->resolveVirtualClass(this); @@ -899,9 +939,10 @@ if (!needsInitialisationCheck()) { setInitializationState(ready); } + setOwnerClass(0); broadcastClass(); release(); - } else { + } else if (JavaThread::get() != getOwnerClass()) { while (!isResolved()) { waitClass(); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=61544&r1=61543&r2=61544&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Thu Jan 1 12:46:12 2009 @@ -651,6 +651,11 @@ /// of the class. /// void loadParents(); + + /// loadExceptions - Loads and resolves the exception classes used in catch + /// clauses of methods defined in this class. + /// + void loadExceptions(); /// readAttributs - Reads the attributs of the class. /// Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=61544&r1=61543&r2=61544&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Thu Jan 1 12:46:12 2009 @@ -910,6 +910,7 @@ if (ex->catche) { UserClass* cl = (UserClass*)(compilingClass->ctpInfo->isClassLoaded(ex->catche)); + assert(cl && "exception class has not been loaded"); ex->catchClass = cl; } else { ex->catchClass = Classpath::newThrowable; From nicolas.geoffray at lip6.fr Fri Jan 2 03:00:00 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 02 Jan 2009 11:00:00 -0000 Subject: [vmkit-commits] [vmkit] r61568 - /vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp Message-ID: <200901021100.n02B01ax013228@zion.cs.uiuc.edu> Author: geoffray Date: Fri Jan 2 04:59:53 2009 New Revision: 61568 URL: http://llvm.org/viewvc/llvm-project?rev=61568&view=rev Log: Name of variable overriden. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp?rev=61568&r1=61567&r2=61568&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp Fri Jan 2 04:59:53 2009 @@ -445,7 +445,7 @@ jobject Field, jobject _obj) { - jobject res = 0; + jobject result = 0; BEGIN_NATIVE_EXCEPTION(0) @@ -510,10 +510,12 @@ } else { res = field->getObjectField(Obj); } + + result = (jobject) res; END_NATIVE_EXCEPTION - return (jobject)res; + return (jobject)result; } JNIEXPORT void JNICALL Java_java_lang_reflect_Field_set( From nicolas.geoffray at lip6.fr Fri Jan 2 05:01:26 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 02 Jan 2009 13:01:26 -0000 Subject: [vmkit-commits] [vmkit] r61573 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaTypes.h JnjvmModule.h Message-ID: <200901021301.n02D1QUB016951@zion.cs.uiuc.edu> Author: geoffray Date: Fri Jan 2 07:01:25 2009 New Revision: 61573 URL: http://llvm.org/viewvc/llvm-project?rev=61573&view=rev Log: Fix includes. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h?rev=61573&r1=61572&r2=61573&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h Fri Jan 2 07:01:25 2009 @@ -13,7 +13,6 @@ #include "types.h" #include "mvm/Allocator.h" -#include "mvm/JIT.h" #include "mvm/Object.h" #include "JnjvmClassLoader.h" @@ -274,7 +273,7 @@ public: - /// initialLoader - The loader that first loaded this typedef. + /// initialLoader - The loader that first loaded this signdef. /// JnjvmClassLoader* initialLoader; Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=61573&r1=61572&r2=61573&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Fri Jan 2 07:01:25 2009 @@ -12,6 +12,8 @@ #include +#include "mvm/JIT.h" + #include "JavaClass.h" #include "JavaConstantPool.h" #include "JavaTypes.h" From nicolas.geoffray at lip6.fr Fri Jan 2 05:12:50 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 02 Jan 2009 13:12:50 -0000 Subject: [vmkit-commits] [vmkit] r61574 - /vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Message-ID: <200901021312.n02DCoHw017369@zion.cs.uiuc.edu> Author: geoffray Date: Fri Jan 2 07:12:49 2009 New Revision: 61574 URL: http://llvm.org/viewvc/llvm-project?rev=61574&view=rev Log: Remove includes. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=61574&r1=61573&r2=61574&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Fri Jan 2 07:12:49 2009 @@ -7,18 +7,14 @@ // //===----------------------------------------------------------------------===// -#include - #include "ClasspathReflect.h" #include "JavaAccess.h" #include "JavaClass.h" #include "JavaObject.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(), \ From nicolas.geoffray at lip6.fr Fri Jan 2 05:43:28 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 02 Jan 2009 13:43:28 -0000 Subject: [vmkit-commits] [vmkit] r61575 - in /vmkit/trunk/lib/JnJVM/VMCore: JnjvmModule.cpp JnjvmModule.h LowerConstantCalls.cpp Message-ID: <200901021343.n02DhT7c018219@zion.cs.uiuc.edu> Author: geoffray Date: Fri Jan 2 07:43:28 2009 New Revision: 61575 URL: http://llvm.org/viewvc/llvm-project?rev=61575&view=rev Log: Correct handling of initialization states when static compiling. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61575&r1=61574&r2=61575&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Fri Jan 2 07:43:28 2009 @@ -134,6 +134,26 @@ } } +GlobalVariable* JnjvmModule::getInitializationState(Value* value) { + + initialization_iterator End = initializationStates.end(); + initialization_iterator I = initializationStates.find(value); + if (I == End) { + GlobalVariable* varGV = new GlobalVariable(Type::Int1Ty, false, + GlobalValue::ExternalLinkage, + 0, "", this); + + initializationStates.insert(std::make_pair(value, varGV)); + + varGV->setInitializer(ConstantInt::getFalse()); + + return varGV; + + } else { + return I->second; + } +} + Constant* JnjvmModule::getConstantPool(JavaConstantPool* ctp) { if (staticCompilation) { llvm::Constant* varGV = 0; Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=61575&r1=61574&r2=61575&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Fri Jan 2 07:43:28 2009 @@ -190,6 +190,10 @@ std::map enveloppes; std::map nativeFunctions; std::map utf8s; + std::map initializationStates; + + typedef std::map::iterator + initialization_iterator; typedef std::map::iterator native_class_iterator; @@ -404,6 +408,7 @@ llvm::Constant* getString(JavaString* str); llvm::Constant* getConstantPool(JavaConstantPool* ctp); llvm::Constant* getNativeFunction(JavaMethod* meth, void* natPtr); + llvm::GlobalVariable* getInitializationState(llvm::Value* Cl); llvm::Constant* getReferenceArrayVT(); llvm::Constant* getPrimitiveArrayVT(); Modified: vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=61575&r1=61574&r2=61575&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Fri Jan 2 07:43:28 2009 @@ -268,19 +268,25 @@ assert(Invoke && "Last instruction is not an invoke"); NBB = Invoke->getNormalDest(); } - + + Value* StatusPtr = 0; + Value* test = 0; Value* Cl = Call.getArgument(0); - Value* TCM = getTCM(module, Call.getArgument(0), CI); - Value* GEP[2] = { module->constantZero, - module->OffsetStatusInTaskClassMirrorConstant }; - Value* StatusPtr = GetElementPtrInst::Create(TCM, GEP, GEP + 2, "", - CI); - - Value* Status = new LoadInst(StatusPtr, "", CI); - - Value* test = new ICmpInst(ICmpInst::ICMP_EQ, Status, - jnjvm::JnjvmModule::ClassReadyConstant, - "", CI); + if (module->isStaticCompiling()) { + StatusPtr = module->getInitializationState(Cl); + test = new LoadInst(StatusPtr, "", CI); + } else { + Value* TCM = getTCM(module, Call.getArgument(0), CI); + Value* GEP[2] = { module->constantZero, + module->OffsetStatusInTaskClassMirrorConstant }; + StatusPtr = GetElementPtrInst::Create(TCM, GEP, GEP + 2, "", CI); + + Value* Status = new LoadInst(StatusPtr, "", CI); + test = new ICmpInst(ICmpInst::ICMP_EQ, Status, + jnjvm::JnjvmModule::ClassReadyConstant, + "", CI); + } + BasicBlock* trueCl = BasicBlock::Create("Initialized", &F); BasicBlock* falseCl = BasicBlock::Create("Uninitialized", &F); @@ -293,8 +299,16 @@ if (InvokeInst* Invoke = dyn_cast(CI)) { Value* Args[1] = { Cl }; BasicBlock* UI = Invoke->getUnwindDest(); + + BasicBlock* normalDest = 0; + if (module->isStaticCompiling()) { + normalDest = BasicBlock::Create("Static Initialized", &F); + } else { + normalDest = trueCl; + } + res = InvokeInst::Create(module->InitialiseClassFunction, - trueCl, UI, Args, Args + 1, + normalDest, UI, Args, Args + 1, "", falseCl); // For some reason, an LLVM pass may add PHI nodes to the @@ -316,9 +330,18 @@ PHI->addIncoming(Val, trueCl); Temp++; } + + if (module->isStaticCompiling()) { + new StoreInst(ConstantInt::getTrue(), StatusPtr, normalDest); + BranchInst::Create(trueCl, normalDest); + falseCl = normalDest; + } + } else { res = CallInst::Create(module->InitialiseClassFunction, Cl, "", falseCl); + if (module->isStaticCompiling()) + new StoreInst(ConstantInt::getTrue(), StatusPtr, falseCl); BranchInst::Create(trueCl, falseCl); } From nicolas.geoffray at lip6.fr Fri Jan 2 05:53:55 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 02 Jan 2009 13:53:55 -0000 Subject: [vmkit-commits] [vmkit] r61577 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901021353.n02Drt1U018545@zion.cs.uiuc.edu> Author: geoffray Date: Fri Jan 2 07:53:55 2009 New Revision: 61577 URL: http://llvm.org/viewvc/llvm-project?rev=61577&view=rev Log: Give a name to global variables of Java classes. 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=61577&r1=61576&r2=61577&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Fri Jan 2 07:53:55 2009 @@ -104,7 +104,8 @@ } GlobalVariable* varGV = - new GlobalVariable(Ty, true, GlobalValue::ExternalLinkage, 0, "", this); + new GlobalVariable(Ty, true, GlobalValue::ExternalLinkage, 0, + classDef->printString(), this); nativeClasses.insert(std::make_pair(classDef, varGV)); From nicolas.geoffray at lip6.fr Fri Jan 2 06:44:27 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 02 Jan 2009 14:44:27 -0000 Subject: [vmkit-commits] [vmkit] r61578 - /vmkit/trunk/tools/vmjc/vmjc.cpp Message-ID: <200901021444.n02EiSXx020025@zion.cs.uiuc.edu> Author: geoffray Date: Fri Jan 2 08:44:27 2009 New Revision: 61578 URL: http://llvm.org/viewvc/llvm-project?rev=61578&view=rev Log: Fix doc. Modified: vmkit/trunk/tools/vmjc/vmjc.cpp Modified: vmkit/trunk/tools/vmjc/vmjc.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmjc/vmjc.cpp?rev=61578&r1=61577&r2=61578&view=diff ============================================================================== --- vmkit/trunk/tools/vmjc/vmjc.cpp (original) +++ vmkit/trunk/tools/vmjc/vmjc.cpp Fri Jan 2 08:44:27 2009 @@ -8,8 +8,8 @@ //===----------------------------------------------------------------------===// // // This utility may be invoked in the following manner: -// vmjc [options] x.bc - Read Java bytecode from the x.class file, write llvm -// asm to the x.ll file. +// vmjc [options] x - Read Java bytecode from the x.class file, write llvm +// bytecode to the x.bc file. // Options: // --help - Output information about command line switches // From nicolas.geoffray at lip6.fr Fri Jan 2 06:46:13 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 02 Jan 2009 14:46:13 -0000 Subject: [vmkit-commits] [vmkit] r61579 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaTypes.cpp JavaTypes.h Jnjvm.cpp JnjvmModule.cpp Message-ID: <200901021446.n02EkDk7020094@zion.cs.uiuc.edu> Author: geoffray Date: Fri Jan 2 08:46:13 2009 New Revision: 61579 URL: http://llvm.org/viewvc/llvm-project?rev=61579&view=rev Log: Also output native to Java stubs. Modified: 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/JnjvmModule.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp?rev=61579&r1=61578&r2=61579&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp Fri Jan 2 08:46:13 2009 @@ -56,12 +56,13 @@ buf->write(")"); } -const char* Signdef::printString() const { +const char* Signdef::printString(const char* ext) const { mvm::PrintBuffer *buf= mvm::PrintBuffer::alloc(); buf->write("Signature<"); getReturnType()->tPrintBuf(buf); buf->write("..."); humanPrintArgs(buf); + buf->write(ext); buf->write(">"); return buf->contents()->cString(); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h?rev=61579&r1=61578&r2=61579&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h Fri Jan 2 08:46:13 2009 @@ -281,9 +281,9 @@ /// const UTF8* keyName; - /// printString - Print the signature for debugging purposes. + /// printString - Print the signature with the following extension. /// - const char* printString() const; + const char* printString(const char* ext = "") const; /// printWithSign - Print the signature of a method with the method's class /// and name. @@ -353,6 +353,15 @@ // End of inlined methods of getting dynamically generated functions. // //===----------------------------------------------------------------------===// + + /// compileAllStubs - Compile all the native -> Java stubs. + /// + void compileAllStubs() { + getStaticCallBuf(); + getStaticCallAP(); + getVirtualCallBuf(); + getVirtualCallAP(); + } /// JInfo - Holds info useful for the JIT. Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=61579&r1=61578&r2=61579&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Fri Jan 2 08:46:13 2009 @@ -1100,12 +1100,14 @@ JavaMethod& meth = cl->virtualMethods[i]; if (!isAbstract(meth.access)) cl->classLoader->getModuleProvider()->parseFunction(&meth); + meth.getSignature()->compileAllStubs(); } for (uint32 i = 0; i < cl->nbStaticMethods; ++i) { JavaMethod& meth = cl->staticMethods[i]; if (!isAbstract(meth.access)) cl->classLoader->getModuleProvider()->parseFunction(&meth); + meth.getSignature()->compileAllStubs(); } } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61579&r1=61578&r2=61579&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Fri Jan 2 08:46:13 2009 @@ -1512,11 +1512,18 @@ std::vector Args; + JnjvmModule* Mod = signature->initialLoader->getModule(); + const char* name = 0; + if (Mod->isStaticCompiling()) { + name = virt ? signature->printString("virtual_buf") : + signature->printString("static_buf"); + } else { + name = ""; + } + Function* res = Function::Create(virt ? getVirtualBufType() : getStaticBufType(), - GlobalValue::ExternalLinkage, - signature->printString(), - signature->initialLoader->TheModule); + GlobalValue::ExternalLinkage, name, Mod); BasicBlock* currentBlock = BasicBlock::Create("enter", res); Function::arg_iterator i = res->arg_begin(); @@ -1562,12 +1569,19 @@ Function* LLVMSignatureInfo::createFunctionCallAP(bool virt) { std::vector Args; + + JnjvmModule* Mod = signature->initialLoader->getModule(); + const char* name = 0; + if (Mod->isStaticCompiling()) { + name = virt ? signature->printString("virtual_ap") : + signature->printString("static_ap"); + } else { + name = ""; + } Function* res = Function::Create(virt ? getVirtualBufType() : getStaticBufType(), - GlobalValue::ExternalLinkage, - signature->printString(), - signature->initialLoader->TheModule); + GlobalValue::ExternalLinkage, name, Mod); BasicBlock* currentBlock = BasicBlock::Create("enter", res); Function::arg_iterator i = res->arg_begin(); @@ -1665,8 +1679,9 @@ virtualBufFunction = createFunctionCallBuf(true); signature->setVirtualCallBuf((intptr_t) mvm::MvmModule::executionEngine->getPointerToGlobal(virtualBufFunction)); - // Now that it's compiled, we don't need the IR anymore - virtualBufFunction->deleteBody(); + if (!signature->initialLoader->getModule()->isStaticCompiling()) + // Now that it's compiled, we don't need the IR anymore + virtualBufFunction->deleteBody(); } return virtualBufFunction; } @@ -1678,8 +1693,9 @@ virtualAPFunction = createFunctionCallAP(true); signature->setVirtualCallAP((intptr_t) mvm::MvmModule::executionEngine->getPointerToGlobal(virtualAPFunction)); - // Now that it's compiled, we don't need the IR anymore - virtualAPFunction->deleteBody(); + if (!signature->initialLoader->getModule()->isStaticCompiling()) + // Now that it's compiled, we don't need the IR anymore + virtualAPFunction->deleteBody(); } return virtualAPFunction; } @@ -1691,8 +1707,9 @@ staticBufFunction = createFunctionCallBuf(false); signature->setStaticCallBuf((intptr_t) mvm::MvmModule::executionEngine->getPointerToGlobal(staticBufFunction)); - // Now that it's compiled, we don't need the IR anymore - staticBufFunction->deleteBody(); + if (!signature->initialLoader->getModule()->isStaticCompiling()) + // Now that it's compiled, we don't need the IR anymore + staticBufFunction->deleteBody(); } return staticBufFunction; } @@ -1704,8 +1721,9 @@ staticAPFunction = createFunctionCallAP(false); signature->setStaticCallAP((intptr_t) mvm::MvmModule::executionEngine->getPointerToGlobal(staticAPFunction)); - // Now that it's compiled, we don't need the IR anymore - staticAPFunction->deleteBody(); + if (!signature->initialLoader->getModule()->isStaticCompiling()) + // Now that it's compiled, we don't need the IR anymore + staticAPFunction->deleteBody(); } return staticAPFunction; } From nicolas.geoffray at lip6.fr Fri Jan 2 09:05:18 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 02 Jan 2009 17:05:18 -0000 Subject: [vmkit-commits] [vmkit] r61587 - in /vmkit/trunk/lib/JnJVM/VMCore: Jnjvm.cpp JnjvmModule.cpp JnjvmModule.h Message-ID: <200901021705.n02H5I1v024896@zion.cs.uiuc.edu> Author: geoffray Date: Fri Jan 2 11:05:18 2009 New Revision: 61587 URL: http://llvm.org/viewvc/llvm-project?rev=61587&view=rev Log: Do not define external values when static compiling. Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=61587&r1=61586&r2=61587&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Fri Jan 2 11:05:18 2009 @@ -1095,6 +1095,11 @@ static void compileClass(Class* cl) { + // Use the owner class field of the class so that we know if the class + // belongs to the list of classes that we are static compiling. + cl->setOwnerClass(JavaThread::get()); + llvm::Value* LCL = cl->classLoader->getModule()->getNativeClass(cl); + cl->classLoader->getModule()->getInitializationState(LCL); for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) { JavaMethod& meth = cl->virtualMethods[i]; Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61587&r1=61586&r2=61587&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Fri Jan 2 11:05:18 2009 @@ -87,6 +87,12 @@ llvm::ConstantInt* JnjvmModule::JavaObjectLockOffsetConstant; llvm::ConstantInt* JnjvmModule::JavaObjectClassOffsetConstant; + +static bool isCompiling(Class* cl) { + // A class is being static compiled if owner class is not null. + return (cl->getOwnerClass() != 0); +} + Constant* JnjvmModule::getNativeClass(CommonClass* classDef) { if (staticCompilation) { @@ -109,16 +115,18 @@ nativeClasses.insert(std::make_pair(classDef, varGV)); - Constant* C = 0; - if (classDef->isClass()) { - C = CreateConstantFromClass((Class*)classDef); - } else if (classDef->isPrimitive()) { - C = CreateConstantFromClassPrimitive((ClassPrimitive*)classDef); - } else { - C = CreateConstantFromClassArray((ClassArray*)classDef); - } + if (classDef->isClass() && isCompiling(classDef->asClass())) { + Constant* C = 0; + if (classDef->isClass()) { + C = CreateConstantFromClass((Class*)classDef); + } else if (classDef->isPrimitive()) { + C = CreateConstantFromClassPrimitive((ClassPrimitive*)classDef); + } else { + C = CreateConstantFromClassArray((ClassArray*)classDef); + } - varGV->setInitializer(C); + varGV->setInitializer(C); + } return varGV; @@ -246,7 +254,9 @@ JavaObjectType); javaClasses.insert(std::make_pair(cl, res)); - varGV->setInitializer(CreateConstantFromJavaClass(cl)); + if (cl->isClass() && isCompiling(cl->asClass())) { + varGV->setInitializer(CreateConstantFromJavaClass(cl)); + } return res; } else { return I->second; @@ -309,6 +319,11 @@ virtual_table_iterator End = virtualTables.end(); virtual_table_iterator I = virtualTables.find(classDef); if (I == End) { + + if (isCompiling(classDef)) { + classDef->virtualVT = makeVT(classDef); + } + const ArrayType* ATy = dyn_cast(VTType->getContainedType(0)); const PointerType* PTy = dyn_cast(ATy->getContainedType(0)); ATy = ArrayType::get(PTy, classDef->virtualTableSize); @@ -318,13 +333,16 @@ res = ConstantExpr::getCast(Instruction::BitCast, varGV, VTType); virtualTables.insert(std::make_pair(classDef, res)); - - Function* Finalizer = ((Function**)classDef->virtualVT)[0]; - Function* Tracer = LCI->getVirtualTracer(); - Constant* C = CreateConstantFromVT(classDef->virtualVT, - classDef->virtualTableSize, Finalizer, - Tracer); - varGV->setInitializer(C); + + if (isCompiling(classDef)) { + classDef->virtualVT = makeVT(classDef); + Function* Finalizer = ((Function**)classDef->virtualVT)[0]; + Function* Tracer = LCI->getVirtualTracer(); + Constant* C = CreateConstantFromVT(classDef->virtualVT, + classDef->virtualTableSize, + Finalizer, Tracer); + varGV->setInitializer(C); + } return res; } else { @@ -1076,7 +1094,7 @@ ClassElts.push_back(Constant::getNullValue(ptrType)); // staticTracer - Function* F = (Function*)(uintptr_t)cl->staticTracer; + Function* F = makeTracer(cl, true); const Type* FTy = STy->getContainedType(STy->getNumContainedTypes() - 1); Constant* staticTracer = ConstantExpr::getCast(Instruction::BitCast, F, FTy); ClassElts.push_back(staticTracer); @@ -1169,6 +1187,10 @@ memcpy(VT, JavaObjectVT, VT_SIZE); #else if (cl->super) { + if (isStaticCompiling() && !cl->super->virtualVT) { + cl->super->virtualVT = makeVT(cl->super); + } + cl->virtualTableSize = cl->super->virtualTableSize; } else { cl->virtualTableSize = VT_NB_FUNCS; @@ -1284,9 +1306,10 @@ virtualSizeConstant = ConstantInt::get(Type::Int32Ty, size); JnjvmModule* Mod = classDef->classLoader->getModule(); - classDef->virtualVT = Mod->makeVT((Class*)classDef); + if (!Mod->isStaticCompiling()) { + classDef->virtualVT = Mod->makeVT((Class*)classDef); + } - } return virtualType; @@ -1321,10 +1344,8 @@ cl->staticSize = size; JnjvmModule* Mod = cl->classLoader->getModule(); - Function* F = Mod->makeTracer(cl, true); - if (Mod->isStaticCompiling()) { - cl->staticTracer = (void (*)(void*)) (uintptr_t) F; - } else { + if (!Mod->isStaticCompiling()) { + Function* F = Mod->makeTracer(cl, true); cl->staticTracer = (void (*)(void*)) (uintptr_t) Mod->executionEngine->getPointerToFunction(F); F->deleteBody(); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=61587&r1=61586&r2=61587&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Fri Jan 2 11:05:18 2009 @@ -421,7 +421,9 @@ llvm::Value* getIsolate(Jnjvm* vm, llvm::Value* Where); #endif - + + void cleanupStaticCompiler(JnjvmClassLoader* loader); + private: static llvm::Module* initialModule; From nicolas.geoffray at lip6.fr Fri Jan 2 09:22:24 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 02 Jan 2009 17:22:24 -0000 Subject: [vmkit-commits] [vmkit] r61588 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.h Jnjvm.cpp JnjvmModule.cpp JnjvmModuleProvider.cpp Message-ID: <200901021722.n02HMOC5025387@zion.cs.uiuc.edu> Author: geoffray Date: Fri Jan 2 11:22:24 2009 New Revision: 61588 URL: http://llvm.org/viewvc/llvm-project?rev=61588&view=rev Log: Set names to global variables. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=61588&r1=61587&r2=61588&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Fri Jan 2 11:22:24 2009 @@ -260,9 +260,10 @@ /// printString - Prints the class. /// - char *printString() const { + const char *printString(const char* ext = "") const { mvm::PrintBuffer *buf = mvm::PrintBuffer::alloc(); print(buf); + buf->write(ext); return buf->contents()->cString(); } Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=61588&r1=61587&r2=61588&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Fri Jan 2 11:22:24 2009 @@ -1099,7 +1099,8 @@ // belongs to the list of classes that we are static compiling. cl->setOwnerClass(JavaThread::get()); llvm::Value* LCL = cl->classLoader->getModule()->getNativeClass(cl); - cl->classLoader->getModule()->getInitializationState(LCL); + if (cl->needsInitialisationCheck()) + cl->classLoader->getModule()->getInitializationState(LCL); for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) { JavaMethod& meth = cl->virtualMethods[i]; Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61588&r1=61587&r2=61588&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Fri Jan 2 11:22:24 2009 @@ -142,15 +142,17 @@ return ConstantExpr::getIntToPtr(CI, Ty); } } - GlobalVariable* JnjvmModule::getInitializationState(Value* value) { initialization_iterator End = initializationStates.end(); initialization_iterator I = initializationStates.find(value); if (I == End) { + const char* clName = value->getName().c_str(); + char* newName = (char*)alloca(strlen(clName) + 9); + sprintf(newName, "%s", clName); GlobalVariable* varGV = new GlobalVariable(Type::Int1Ty, false, GlobalValue::ExternalLinkage, - 0, "", this); + 0, newName, this); initializationStates.insert(std::make_pair(value, varGV)); @@ -248,7 +250,8 @@ GlobalVariable* varGV = new GlobalVariable(Ty->getContainedType(0), false, - GlobalValue::ExternalLinkage, 0, "", this); + GlobalValue::ExternalLinkage, 0, + cl->printString(""), this); Constant* res = ConstantExpr::getCast(Instruction::BitCast, varGV, JavaObjectType); @@ -284,7 +287,7 @@ const Type* Ty = LCI->getStaticType(); varGV = new GlobalVariable(Ty->getContainedType(0), false, GlobalValue::ExternalLinkage, - 0, "", this); + 0, classDef->printString(""), this); Constant* res = ConstantExpr::getCast(Instruction::BitCast, varGV, ptrType); @@ -329,7 +332,9 @@ ATy = ArrayType::get(PTy, classDef->virtualTableSize); GlobalVariable* varGV = new GlobalVariable(ATy, true, GlobalValue::ExternalLinkage, - 0, "", this); + 0, + classDef->printString(""), + this); res = ConstantExpr::getCast(Instruction::BitCast, varGV, VTType); virtualTables.insert(std::make_pair(classDef, res)); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=61588&r1=61587&r2=61588&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Fri Jan 2 11:22:24 2009 @@ -139,7 +139,7 @@ Function* func = 0; LLVMSignatureInfo* LSI = M->getSignatureInfo(sign); if (!stat) { - char* name = cl->printString(); + const char* name = cl->printString(); char* key = (char*)alloca(strlen(name) + 2); sprintf(key, "%s%d", name, index); Function* F = TheModule->getFunction(key); From nicolas.geoffray at lip6.fr Sat Jan 3 04:48:41 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sat, 03 Jan 2009 12:48:41 -0000 Subject: [vmkit-commits] [vmkit] r61605 - /vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Message-ID: <200901031248.n03CmgBt007354@zion.cs.uiuc.edu> Author: geoffray Date: Sat Jan 3 06:48:35 2009 New Revision: 61605 URL: http://llvm.org/viewvc/llvm-project?rev=61605&view=rev Log: Indentation fix. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp?rev=61605&r1=61604&r2=61605&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Sat Jan 3 06:48:35 2009 @@ -2085,7 +2085,7 @@ node->addIncoming(ConstantInt::getFalse(), notEquals); Value* inDisplay = CallInst::Create(module->GetDisplayFunction, - objCl, "", supDepth); + objCl, "", supDepth); Value* displayArgs[2] = { inDisplay, depthCl }; Value* clInDisplay = @@ -2094,9 +2094,9 @@ cmp = new ICmpInst(ICmpInst::ICMP_EQ, clInDisplay, clVar, "", supDepth); - BranchInst::Create(ifTrue, supDepth); + BranchInst::Create(ifTrue, supDepth); - node->addIncoming(cmp, supDepth); + node->addIncoming(cmp, supDepth); } } From nicolas.geoffray at lip6.fr Sat Jan 3 04:53:19 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sat, 03 Jan 2009 12:53:19 -0000 Subject: [vmkit-commits] [vmkit] r61606 - in /vmkit/trunk/lib/JnJVM/VMCore: Jnjvm.cpp JnjvmModule.cpp JnjvmModule.h LowerConstantCalls.cpp Message-ID: <200901031253.n03CrKWI007501@zion.cs.uiuc.edu> Author: geoffray Date: Sat Jan 3 06:53:19 2009 New Revision: 61606 URL: http://llvm.org/viewvc/llvm-project?rev=61606&view=rev Log: We don't need to set a class as being constant, we are already getting the constant values when compiling. This enables static initialization and java.lang.Class objects to be checked directly on the class object. Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=61606&r1=61605&r2=61606&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Sat Jan 3 06:53:19 2009 @@ -1098,9 +1098,7 @@ // Use the owner class field of the class so that we know if the class // belongs to the list of classes that we are static compiling. cl->setOwnerClass(JavaThread::get()); - llvm::Value* LCL = cl->classLoader->getModule()->getNativeClass(cl); - if (cl->needsInitialisationCheck()) - cl->classLoader->getModule()->getInitializationState(LCL); + cl->classLoader->getModule()->getNativeClass(cl); for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) { JavaMethod& meth = cl->virtualMethods[i]; Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61606&r1=61605&r2=61606&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Sat Jan 3 06:53:19 2009 @@ -110,7 +110,7 @@ } GlobalVariable* varGV = - new GlobalVariable(Ty, true, GlobalValue::ExternalLinkage, 0, + new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage, 0, classDef->printString(), this); nativeClasses.insert(std::make_pair(classDef, varGV)); @@ -142,28 +142,6 @@ return ConstantExpr::getIntToPtr(CI, Ty); } } -GlobalVariable* JnjvmModule::getInitializationState(Value* value) { - - initialization_iterator End = initializationStates.end(); - initialization_iterator I = initializationStates.find(value); - if (I == End) { - const char* clName = value->getName().c_str(); - char* newName = (char*)alloca(strlen(clName) + 9); - sprintf(newName, "%s", clName); - GlobalVariable* varGV = new GlobalVariable(Type::Int1Ty, false, - GlobalValue::ExternalLinkage, - 0, newName, this); - - initializationStates.insert(std::make_pair(value, varGV)); - - varGV->setInitializer(ConstantInt::getFalse()); - - return varGV; - - } else { - return I->second; - } -} Constant* JnjvmModule::getConstantPool(JavaConstantPool* ctp) { if (staticCompilation) { Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=61606&r1=61605&r2=61606&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Sat Jan 3 06:53:19 2009 @@ -190,11 +190,7 @@ std::map enveloppes; std::map nativeFunctions; std::map utf8s; - std::map initializationStates; - typedef std::map::iterator - initialization_iterator; - typedef std::map::iterator native_class_iterator; @@ -408,7 +404,6 @@ llvm::Constant* getString(JavaString* str); llvm::Constant* getConstantPool(JavaConstantPool* ctp); llvm::Constant* getNativeFunction(JavaMethod* meth, void* natPtr); - llvm::GlobalVariable* getInitializationState(llvm::Value* Cl); llvm::Constant* getReferenceArrayVT(); llvm::Constant* getPrimitiveArrayVT(); Modified: vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=61606&r1=61605&r2=61606&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Sat Jan 3 06:53:19 2009 @@ -269,25 +269,18 @@ NBB = Invoke->getNormalDest(); } - Value* StatusPtr = 0; - Value* test = 0; Value* Cl = Call.getArgument(0); - if (module->isStaticCompiling()) { - StatusPtr = module->getInitializationState(Cl); - test = new LoadInst(StatusPtr, "", CI); - } else { - Value* TCM = getTCM(module, Call.getArgument(0), CI); - Value* GEP[2] = { module->constantZero, - module->OffsetStatusInTaskClassMirrorConstant }; - StatusPtr = GetElementPtrInst::Create(TCM, GEP, GEP + 2, "", CI); - - Value* Status = new LoadInst(StatusPtr, "", CI); - test = new ICmpInst(ICmpInst::ICMP_EQ, Status, - jnjvm::JnjvmModule::ClassReadyConstant, - "", CI); - } + Value* TCM = getTCM(module, Call.getArgument(0), CI); + Value* GEP[2] = { module->constantZero, + module->OffsetStatusInTaskClassMirrorConstant }; + Value* StatusPtr = GetElementPtrInst::Create(TCM, GEP, GEP + 2, "", + CI); + + Value* Status = new LoadInst(StatusPtr, "", CI); + Value* test = new ICmpInst(ICmpInst::ICMP_EQ, Status, + module->ClassReadyConstant, + "", CI); - BasicBlock* trueCl = BasicBlock::Create("Initialized", &F); BasicBlock* falseCl = BasicBlock::Create("Uninitialized", &F); PHINode* node = llvm::PHINode::Create(JnjvmModule::JavaClassType, "", trueCl); @@ -300,15 +293,8 @@ Value* Args[1] = { Cl }; BasicBlock* UI = Invoke->getUnwindDest(); - BasicBlock* normalDest = 0; - if (module->isStaticCompiling()) { - normalDest = BasicBlock::Create("Static Initialized", &F); - } else { - normalDest = trueCl; - } - res = InvokeInst::Create(module->InitialiseClassFunction, - normalDest, UI, Args, Args + 1, + trueCl, UI, Args, Args + 1, "", falseCl); // For some reason, an LLVM pass may add PHI nodes to the @@ -331,17 +317,9 @@ Temp++; } - if (module->isStaticCompiling()) { - new StoreInst(ConstantInt::getTrue(), StatusPtr, normalDest); - BranchInst::Create(trueCl, normalDest); - falseCl = normalDest; - } - } else { res = CallInst::Create(module->InitialiseClassFunction, Cl, "", falseCl); - if (module->isStaticCompiling()) - new StoreInst(ConstantInt::getTrue(), StatusPtr, falseCl); BranchInst::Create(trueCl, falseCl); } From nicolas.geoffray at lip6.fr Sat Jan 3 05:08:04 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sat, 03 Jan 2009 13:08:04 -0000 Subject: [vmkit-commits] [vmkit] r61607 - /vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Message-ID: <200901031308.n03D85wB008009@zion.cs.uiuc.edu> Author: geoffray Date: Sat Jan 3 07:07:59 2009 New Revision: 61607 URL: http://llvm.org/viewvc/llvm-project?rev=61607&view=rev Log: Remove null check after calling gcmalloc. Modified: vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=61607&r1=61606&r2=61607&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Sat Jan 3 07:07:59 2009 @@ -123,9 +123,18 @@ II++; if (ICmpInst* Cmp = dyn_cast(I)) { - if (isVirtual(meth->access)) { - if (Cmp->getOperand(1) == module->JavaObjectNullConstant && - Cmp->getOperand(0) == F.arg_begin()) { + if (Cmp->getOperand(1) == module->JavaObjectNullConstant) { + Value* Arg = Cmp->getOperand(0); + if (isVirtual(meth->access) && Arg == F.arg_begin()) { + Changed = true; + Cmp->replaceAllUsesWith(ConstantInt::getFalse()); + Cmp->eraseFromParent(); + break; + } + + CallSite Ca = CallSite::get(Arg); + Instruction* CI = Ca.getInstruction(); + if (CI && Ca.getCalledValue() == module->JavaObjectAllocateFunction) { Changed = true; Cmp->replaceAllUsesWith(ConstantInt::getFalse()); Cmp->eraseFromParent(); From nicolas.geoffray at lip6.fr Sat Jan 3 05:49:37 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sat, 03 Jan 2009 13:49:37 -0000 Subject: [vmkit-commits] [vmkit] r61608 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaJIT.cpp JnjvmModule.cpp JnjvmModule.h Message-ID: <200901031349.n03DnbYF009168@zion.cs.uiuc.edu> Author: geoffray Date: Sat Jan 3 07:49:35 2009 New Revision: 61608 URL: http://llvm.org/viewvc/llvm-project?rev=61608&view=rev Log: Add an array class map for array classes. There are no good places to allocate them, so we leave the matter of allocation to the to-be-provided vmjc static initializer. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=61608&r1=61607&r2=61608&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Sat Jan 3 07:49:35 2009 @@ -1192,7 +1192,7 @@ Value* res = getResolvedCommonClass(index, false, &cl); #ifndef ISOLATE - if (cl) res = module->getJavaClass(cl); + if (cl && !module->isStaticCompiling()) res = module->getJavaClass(cl); else #endif @@ -1688,6 +1688,9 @@ if (cl && (!cl->isClass() || cl->asClass()->isResolved())) { if (alreadyResolved) *alreadyResolved = cl; node = module->getNativeClass(cl); + if (module->isStaticCompiling() && cl->isArray()) { + node = new LoadInst(node, "", currentBlock); + } if (node->getType() != module->JavaCommonClassType) { node = new BitCastInst(node, module->JavaCommonClassType, "", currentBlock); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61608&r1=61607&r2=61608&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Sat Jan 3 07:49:35 2009 @@ -96,44 +96,50 @@ Constant* JnjvmModule::getNativeClass(CommonClass* classDef) { if (staticCompilation) { - native_class_iterator End = nativeClasses.end(); - native_class_iterator I = nativeClasses.find(classDef); - if (I == End) { - const llvm::Type* Ty = 0; + + if (classDef->isClass()) { + native_class_iterator End = nativeClasses.end(); + native_class_iterator I = nativeClasses.find((Class*)classDef); + if (I == End) { + const llvm::Type* Ty = 0; - if (classDef->isClass()) { Ty = JavaClassType->getContainedType(0); - } else if (classDef->isPrimitive()) { - Ty = JavaClassPrimitiveType->getContainedType(0); - } else { - Ty = JavaClassArrayType->getContainedType(0); - } - GlobalVariable* varGV = - new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage, 0, - classDef->printString(), this); + GlobalVariable* varGV = + new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage, 0, + classDef->printString(), this); - nativeClasses.insert(std::make_pair(classDef, varGV)); + nativeClasses.insert(std::make_pair((Class*)classDef, varGV)); - if (classDef->isClass() && isCompiling(classDef->asClass())) { - Constant* C = 0; - if (classDef->isClass()) { - C = CreateConstantFromClass((Class*)classDef); - } else if (classDef->isPrimitive()) { - C = CreateConstantFromClassPrimitive((ClassPrimitive*)classDef); - } else { - C = CreateConstantFromClassArray((ClassArray*)classDef); + if (isCompiling(classDef->asClass())) { + Constant* C = CreateConstantFromClass((Class*)classDef); + varGV->setInitializer(C); } - varGV->setInitializer(C); - } - - return varGV; + return varGV; - } else { - return I->second; + } else { + return I->second; + } + } else if (classDef->isArray()) { + array_class_iterator End = arrayClasses.end(); + array_class_iterator I = arrayClasses.find((ClassArray*)classDef); + if (I == End) { + const llvm::Type* Ty = JavaClassArrayType; + + GlobalVariable* varGV = + new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage, 0, + "", this); + + arrayClasses.insert(std::make_pair((ClassArray*)classDef, varGV)); + return varGV; + } else { + return I->second; + } + } else if (classDef->isPrimitive()) { + assert(0 && "implement me"); } - + return 0; } else { const llvm::Type* Ty = classDef->isClass() ? JavaClassType : JavaCommonClassType; @@ -1893,6 +1899,8 @@ (unsigned long long int) nativeClasses.size()); fprintf(stderr, "Number of Java classes : %llu\n", (unsigned long long int) javaClasses.size()); + fprintf(stderr, "Number of array classes : %llu\n", + (unsigned long long int) arrayClasses.size()); fprintf(stderr, "Number of virtual tables : %llu\n", (unsigned long long int) virtualTables.size()); fprintf(stderr, "Number of static instances : %llu\n", Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=61608&r1=61607&r2=61608&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Sat Jan 3 07:49:35 2009 @@ -181,7 +181,8 @@ class JnjvmModule : public mvm::MvmModule { friend class LLVMClassInfo; private: - std::map nativeClasses; + std::map nativeClasses; + std::map arrayClasses; std::map javaClasses; std::map virtualTables; std::map staticInstances; @@ -191,9 +192,12 @@ std::map nativeFunctions; std::map utf8s; - typedef std::map::iterator + typedef std::map::iterator native_class_iterator; + typedef std::map::iterator + array_class_iterator; + typedef std::map::iterator java_class_iterator; From nicolas.geoffray at lip6.fr Sat Jan 3 15:16:16 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sat, 03 Jan 2009 23:16:16 -0000 Subject: [vmkit-commits] [vmkit] r61615 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaJIT.cpp JnjvmModule.cpp JnjvmModule.h Message-ID: <200901032316.n03NGGPo031418@zion.cs.uiuc.edu> Author: geoffray Date: Sat Jan 3 17:16:15 2009 New Revision: 61615 URL: http://llvm.org/viewvc/llvm-project?rev=61615&view=rev Log: Still static initialize array classes and Java class objects for classes that we are compiling. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=61615&r1=61614&r2=61615&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Sat Jan 3 17:16:15 2009 @@ -1192,7 +1192,8 @@ Value* res = getResolvedCommonClass(index, false, &cl); #ifndef ISOLATE - if (cl && !module->isStaticCompiling()) res = module->getJavaClass(cl); + if (cl || (module->isStaticCompiling() && module->isCompiling(cl))) + res = module->getJavaClass(cl); else #endif Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61615&r1=61614&r2=61615&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Sat Jan 3 17:16:15 2009 @@ -88,22 +88,33 @@ llvm::ConstantInt* JnjvmModule::JavaObjectClassOffsetConstant; -static bool isCompiling(Class* cl) { - // A class is being static compiled if owner class is not null. - return (cl->getOwnerClass() != 0); +bool JnjvmModule::isCompiling(CommonClass* cl) { + if (cl->isClass()) { + // A class is being static compiled if owner class is not null. + return (cl->asClass()->getOwnerClass() != 0); + } else if (cl->isArray()) { + return isCompiling(cl->asArrayClass()->baseClass()); + } else { + return false; + } } Constant* JnjvmModule::getNativeClass(CommonClass* classDef) { if (staticCompilation) { - if (classDef->isClass()) { + if (classDef->isClass() || + (classDef->isArray() && isCompiling(classDef))) { native_class_iterator End = nativeClasses.end(); - native_class_iterator I = nativeClasses.find((Class*)classDef); + native_class_iterator I = nativeClasses.find(classDef); if (I == End) { const llvm::Type* Ty = 0; - - Ty = JavaClassType->getContainedType(0); + + if (classDef->isArray()) { + Ty = JavaClassArrayType->getContainedType(0); + } else { + Ty = JavaClassType->getContainedType(0); + } GlobalVariable* varGV = new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage, 0, @@ -111,9 +122,12 @@ nativeClasses.insert(std::make_pair((Class*)classDef, varGV)); - if (isCompiling(classDef->asClass())) { + if (classDef->isClass() && isCompiling(classDef->asClass())) { Constant* C = CreateConstantFromClass((Class*)classDef); varGV->setInitializer(C); + } else if (classDef->isArray()) { + Constant* C = CreateConstantFromClassArray((ClassArray*)classDef); + varGV->setInitializer(C); } return varGV; @@ -1895,23 +1909,23 @@ void JnjvmModule::printStats() { fprintf(stderr, "----------------- Info from the module -----------------\n"); - fprintf(stderr, "Number of native classes : %llu\n", + fprintf(stderr, "Number of native classes : %llu\n", (unsigned long long int) nativeClasses.size()); - fprintf(stderr, "Number of Java classes : %llu\n", + fprintf(stderr, "Number of Java classes : %llu\n", (unsigned long long int) javaClasses.size()); - fprintf(stderr, "Number of array classes : %llu\n", + fprintf(stderr, "Number of external array classes : %llu\n", (unsigned long long int) arrayClasses.size()); - fprintf(stderr, "Number of virtual tables : %llu\n", + fprintf(stderr, "Number of virtual tables : %llu\n", (unsigned long long int) virtualTables.size()); - fprintf(stderr, "Number of static instances : %llu\n", + fprintf(stderr, "Number of static instances : %llu\n", (unsigned long long int) staticInstances.size()); - fprintf(stderr, "Number of constant pools : %llu\n", + fprintf(stderr, "Number of constant pools : %llu\n", (unsigned long long int) constantPools.size()); - fprintf(stderr, "Number of strings : %llu\n", + fprintf(stderr, "Number of strings : %llu\n", (unsigned long long int) strings.size()); - fprintf(stderr, "Number of enveloppes : %llu\n", + fprintf(stderr, "Number of enveloppes : %llu\n", (unsigned long long int) enveloppes.size()); - fprintf(stderr, "Number of native functions : %llu\n", + fprintf(stderr, "Number of native functions : %llu\n", (unsigned long long int) nativeFunctions.size()); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=61615&r1=61614&r2=61615&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Sat Jan 3 17:16:15 2009 @@ -181,7 +181,7 @@ class JnjvmModule : public mvm::MvmModule { friend class LLVMClassInfo; private: - std::map nativeClasses; + std::map nativeClasses; std::map arrayClasses; std::map javaClasses; std::map virtualTables; @@ -192,7 +192,7 @@ std::map nativeFunctions; std::map utf8s; - typedef std::map::iterator + typedef std::map::iterator native_class_iterator; typedef std::map::iterator @@ -421,7 +421,7 @@ #endif - void cleanupStaticCompiler(JnjvmClassLoader* loader); + bool isCompiling(CommonClass* cl); private: static llvm::Module* initialModule; From nicolas.geoffray at lip6.fr Sat Jan 3 15:43:53 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sat, 03 Jan 2009 23:43:53 -0000 Subject: [vmkit-commits] [vmkit] r61616 - in /vmkit/trunk/lib/JnJVM/VMCore: JnjvmClassLoader.cpp JnjvmClassLoader.h JnjvmModule.cpp Message-ID: <200901032343.n03Nhsoo032258@zion.cs.uiuc.edu> Author: geoffray Date: Sat Jan 3 17:43:53 2009 New Revision: 61616 URL: http://llvm.org/viewvc/llvm-project?rev=61616&view=rev Log: Provide static values for native class arrays so that static-compiled code can reference them directly. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=61616&r1=61615&r2=61616&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Sat Jan 3 17:43:53 2009 @@ -46,6 +46,15 @@ using namespace jnjvm; +ClassArray ArrayOfBool; +ClassArray ArrayOfByte; +ClassArray ArrayOfChar; +ClassArray ArrayOfShort; +ClassArray ArrayOfInt; +ClassArray ArrayOfFloat; +ClassArray ArrayOfDouble; +ClassArray ArrayOfLong; + JnjvmBootstrapLoader::JnjvmBootstrapLoader(bool staticCompilation) { TheModule = new JnjvmModule("Bootstrap JnJVM", staticCompilation); @@ -81,7 +90,8 @@ upcalls->OfChar = UPCALL_PRIMITIVE_CLASS(this, "char", 2); // Create the char array. - upcalls->ArrayOfChar = constructArray(utf8OfChar, upcalls->OfChar); + upcalls->ArrayOfChar = constructPrimitiveArray(ArrayOfChar, utf8OfChar, + upcalls->OfChar); // Alright, now we can repair the damage: set the class to the UTF8s created // and set the array class of UTF8s. @@ -91,8 +101,9 @@ // Create the byte array, so that bytes for classes can be created. upcalls->OfByte = UPCALL_PRIMITIVE_CLASS(this, "byte", 1); - upcalls->ArrayOfByte = constructArray(asciizConstructUTF8("[B"), - upcalls->OfByte); + upcalls->ArrayOfByte = constructPrimitiveArray(ArrayOfByte, + asciizConstructUTF8("[B"), + upcalls->OfByte); InterfacesArray = (Class**)allocator.Allocate(2 * sizeof(UserClass*)); @@ -130,23 +141,29 @@ upcalls->OfVoid = UPCALL_PRIMITIVE_CLASS(this, "void", 0); // And finally create the primitive arrays. - upcalls->ArrayOfInt = constructArray(asciizConstructUTF8("[I"), - upcalls->OfInt); - - upcalls->ArrayOfBool = constructArray(asciizConstructUTF8("[Z"), - upcalls->OfBool); - - upcalls->ArrayOfLong = constructArray(asciizConstructUTF8("[J"), - upcalls->OfLong); - - upcalls->ArrayOfFloat = constructArray(asciizConstructUTF8("[F"), - upcalls->OfFloat); - - upcalls->ArrayOfDouble = constructArray(asciizConstructUTF8("[D"), - upcalls->OfDouble); - - upcalls->ArrayOfShort = constructArray(asciizConstructUTF8("[S"), - upcalls->OfShort); + upcalls->ArrayOfInt = constructPrimitiveArray(ArrayOfInt, + asciizConstructUTF8("[I"), + upcalls->OfInt); + + upcalls->ArrayOfBool = constructPrimitiveArray(ArrayOfBool, + asciizConstructUTF8("[Z"), + upcalls->OfBool); + + upcalls->ArrayOfLong = constructPrimitiveArray(ArrayOfLong, + asciizConstructUTF8("[J"), + upcalls->OfLong); + + upcalls->ArrayOfFloat = constructPrimitiveArray(ArrayOfFloat, + asciizConstructUTF8("[F"), + upcalls->OfFloat); + + upcalls->ArrayOfDouble = constructPrimitiveArray(ArrayOfDouble, + asciizConstructUTF8("[D"), + upcalls->OfDouble); + + upcalls->ArrayOfShort = constructPrimitiveArray(ArrayOfShort, + asciizConstructUTF8("[S"), + upcalls->OfShort); upcalls->ArrayOfString = constructArray(asciizConstructUTF8("[Ljava/lang/String;")); @@ -567,6 +584,15 @@ return res; } +ClassArray* +JnjvmBootstrapLoader::constructPrimitiveArray(ClassArray& cl, const UTF8* name, + ClassPrimitive* baseClass) { + + cl = ClassArray(this, name, baseClass); + classes->map.insert(std::make_pair(name, &cl)); + return &cl; +} + Typedef* JnjvmClassLoader::internalConstructType(const UTF8* name) { short int cur = name->elements[0]; Typedef* res = 0; Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=61616&r1=61615&r2=61616&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Sat Jan 3 17:43:53 2009 @@ -289,6 +289,11 @@ /// of byte. /// ArrayUInt8* openName(const UTF8* utf8); + + /// constructPrimitiveArray - Hashes the primitive array. + /// + ClassArray* constructPrimitiveArray(ClassArray& cl, const UTF8* name, + ClassPrimitive* prim); public: Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61616&r1=61615&r2=61616&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Sat Jan 3 17:43:53 2009 @@ -37,6 +37,15 @@ extern void* ArrayObjectVT[]; extern void* JavaObjectVT[]; +extern ClassArray ArrayOfBool; +extern ClassArray ArrayOfByte; +extern ClassArray ArrayOfChar; +extern ClassArray ArrayOfShort; +extern ClassArray ArrayOfInt; +extern ClassArray ArrayOfFloat; +extern ClassArray ArrayOfDouble; +extern ClassArray ArrayOfLong; + #ifdef WITH_TRACER const llvm::FunctionType* JnjvmModule::MarkAndTraceType = 0; #endif @@ -1878,6 +1887,28 @@ ReferenceArrayVT = new GlobalVariable(ATy, true, GlobalValue::ExternalLinkage, 0, "ArrayObjectVT", this); + + + + ATy = JavaClassArrayType->getContainedType(0); + GlobalVariable* varGV = 0; + +#define PRIMITIVE_ARRAY(name) \ + varGV = new GlobalVariable(ATy, true, GlobalValue::ExternalLinkage, \ + 0, #name, this); \ + arrayClasses.insert(std::make_pair(&name, varGV)); + + PRIMITIVE_ARRAY(ArrayOfBool) + PRIMITIVE_ARRAY(ArrayOfByte) + PRIMITIVE_ARRAY(ArrayOfChar) + PRIMITIVE_ARRAY(ArrayOfShort) + PRIMITIVE_ARRAY(ArrayOfInt) + PRIMITIVE_ARRAY(ArrayOfFloat) + PRIMITIVE_ARRAY(ArrayOfDouble) + PRIMITIVE_ARRAY(ArrayOfLong) + +#undef PRIMITIVE_ARRAY + } else { PrimitiveArrayVT = ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64(JavaArrayVT)), From nicolas.geoffray at lip6.fr Sun Jan 4 05:32:12 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 04 Jan 2009 13:32:12 -0000 Subject: [vmkit-commits] [vmkit] r61625 - /vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Message-ID: <200901041332.n04DWDuR027926@zion.cs.uiuc.edu> Author: geoffray Date: Sun Jan 4 07:32:07 2009 New Revision: 61625 URL: http://llvm.org/viewvc/llvm-project?rev=61625&view=rev Log: Constify some functions. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=61625&r1=61624&r2=61625&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Sun Jan 4 07:32:07 2009 @@ -194,32 +194,32 @@ //===----------------------------------------------------------------------===// // Assessor methods. - uint32 getAccess() { return access;} - Class** getInterfaces() { return interfaces; } - const UTF8* getName() { return name; } - Class* getSuper() { return super; } + uint32 getAccess() const { return access;} + Class** getInterfaces() const { return interfaces; } + const UTF8* getName() const { return name; } + Class* getSuper() const { return super; } /// isArray - Is the class an array class? /// - bool isArray() { + bool isArray() const { return jnjvm::isArray(access); } /// isPrimitive - Is the class a primitive class? /// - bool isPrimitive() { + bool isPrimitive() const { return jnjvm::isPrimitive(access); } /// isInterface - Is the class an interface? /// - bool isInterface() { + bool isInterface() const { return jnjvm::isInterface(access); } /// isClass - Is the class a real, instantiable class? /// - bool isClass() { + bool isClass() const { return jnjvm::isClass(access); } @@ -920,7 +920,7 @@ /// baseClass - Get the base class of this array class. /// - CommonClass* baseClass() { + CommonClass* baseClass() const { return _baseClass; } From nicolas.geoffray at lip6.fr Sun Jan 4 05:39:44 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 04 Jan 2009 13:39:44 -0000 Subject: [vmkit-commits] [vmkit] r61626 - in /vmkit/trunk/lib/JnJVM/VMCore: Jnjvm.cpp JnjvmClassLoader.cpp JnjvmModule.cpp JnjvmModule.h Message-ID: <200901041339.n04DdkIC028151@zion.cs.uiuc.edu> Author: geoffray Date: Sun Jan 4 07:39:35 2009 New Revision: 61626 URL: http://llvm.org/viewvc/llvm-project?rev=61626&view=rev Log: Add a static initializer when static compiling. The initializer records the classes in the given class loader and loads the class required. Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=61626&r1=61625&r2=61626&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Sun Jan 4 07:39:35 2009 @@ -1181,13 +1181,11 @@ } // Set the linkage to External, so that the printer does not complain. - llvm::Module* M = bootstrapLoader->getModule(); - for (Module::iterator i = M->begin(), e = M->end(); i != e; ++i) { - i->setLinkage(llvm::GlobalValue::ExternalLinkage); - } + JnjvmModule* M = bootstrapLoader->getModule(); + M->CreateStaticInitializer(); // Print stats before quitting. - bootstrapLoader->getModule()->printStats(); + M->printStats(); bootstrapLoader->getModuleProvider()->printStats(); } catch(std::string str) { Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=61626&r1=61625&r2=61626&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Sun Jan 4 07:39:35 2009 @@ -920,3 +920,20 @@ } return res; } + + +// Extern "C" functions called by the vmjc static intializer. +extern "C" void vmjcAddPreCompiledClass(JnjvmClassLoader* JCL, + CommonClass* cl) { + JCL->getClasses()->map.insert(std::make_pair(cl->name, cl)); + cl->classLoader = JCL; +} + +extern "C" void vmjcGetClassArray(JnjvmClassLoader* JCL, ClassArray** ptr, + const UTF8* name) { + *ptr = JCL->constructArray(name); +} + +extern "C" void vmjcLoadClass(JnjvmClassLoader* JCL, const UTF8* name) { + JCL->loadName(name, true, true); +} Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61626&r1=61625&r2=61626&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Sun Jan 4 07:39:35 2009 @@ -32,6 +32,7 @@ llvm::Constant* JnjvmModule::PrimitiveArrayVT; llvm::Constant* JnjvmModule::ReferenceArrayVT; +llvm::Function* JnjvmModule::StaticInitializer; extern void* JavaArrayVT[]; extern void* ArrayObjectVT[]; @@ -97,12 +98,12 @@ llvm::ConstantInt* JnjvmModule::JavaObjectClassOffsetConstant; -bool JnjvmModule::isCompiling(CommonClass* cl) { +bool JnjvmModule::isCompiling(const CommonClass* cl) const { if (cl->isClass()) { // A class is being static compiled if owner class is not null. - return (cl->asClass()->getOwnerClass() != 0); + return (((Class*)cl)->getOwnerClass() != 0); } else if (cl->isArray()) { - return isCompiling(cl->asArrayClass()->baseClass()); + return isCompiling(((ClassArray*)cl)->baseClass()); } else { return false; } @@ -702,7 +703,7 @@ ATy = dyn_cast(STy->getContainedType(2)); assert(ATy && "Malformed type"); - Constant* TCM[1] = { Constant::getNullValue(JavaObjectType) }; + Constant* TCM[1] = { getJavaClass(cl) }; CommonClassElts.push_back(ConstantArray::get(ATy, TCM, 1)); // access @@ -740,8 +741,10 @@ CommonClassElts.push_back(Constant::getNullValue(JavaClassType)); } - // classLoader - CommonClassElts.push_back(Constant::getNullValue(ptrType)); + // classLoader: store the static initializer, it will be overriden once + // the class is loaded. + Constant* loader = ConstantExpr::getBitCast(StaticInitializer, ptrType); + CommonClassElts.push_back(loader); return ConstantStruct::get(STy, CommonClassElts); } @@ -1909,6 +1912,13 @@ #undef PRIMITIVE_ARRAY + std::vector llvmArgs; + llvmArgs.push_back(ptrType); // class loader. + const FunctionType* FTy = FunctionType::get(Type::VoidTy, llvmArgs, false); + + StaticInitializer = Function::Create(FTy, GlobalValue::InternalLinkage, + "Init", this); + } else { PrimitiveArrayVT = ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64(JavaArrayVT)), @@ -2212,3 +2222,72 @@ } } #endif + +void JnjvmModule::CreateStaticInitializer() { + + // Set the linkage of all functions to External, so that the printer does + // not complain. + for (Module::iterator i = begin(), e = end(); i != e; ++i) { + i->setLinkage(GlobalValue::ExternalLinkage); + } + + std::vector llvmArgs; + llvmArgs.push_back(ptrType); // class loader + llvmArgs.push_back(JavaCommonClassType); // cl + const FunctionType* FTy = FunctionType::get(Type::VoidTy, llvmArgs, false); + + Function* AddClass = Function::Create(FTy, GlobalValue::ExternalLinkage, + "vmjcAddPreCompiledClass", this); + + llvmArgs.clear(); + llvmArgs.push_back(ptrType); // class loader + llvmArgs.push_back(PointerType::getUnqual(JavaClassArrayType)); // array ptr + llvmArgs.push_back(UTF8Type); // name + FTy = FunctionType::get(Type::VoidTy, llvmArgs, false); + + Function* GetClassArray = Function::Create(FTy, GlobalValue::ExternalLinkage, + "vmjcGetClassArray", this); + + llvmArgs.clear(); + llvmArgs.push_back(ptrType); // class loader + llvmArgs.push_back(UTF8Type); // name + FTy = FunctionType::get(Type::VoidTy, llvmArgs, false); + + Function* LoadClass = Function::Create(FTy, GlobalValue::ExternalLinkage, + "vmjcLoadClass", this); + + + BasicBlock* currentBlock = BasicBlock::Create("enter", StaticInitializer); + Function::arg_iterator loader = StaticInitializer->arg_begin(); + + Value* Args[3]; + for (native_class_iterator i = nativeClasses.begin(), + e = nativeClasses.end(); i != e; ++i) { + if (isCompiling(i->first)) { + Args[0] = loader; + Args[1] = ConstantExpr::getBitCast(i->second, JavaCommonClassType); + CallInst::Create(AddClass, Args, Args + 2, "", currentBlock); + } + } + + for (native_class_iterator i = nativeClasses.begin(), + e = nativeClasses.end(); i != e; ++i) { + if (!isCompiling(i->first)) { + Args[0] = loader; + Args[1] = getUTF8(i->first->name); + CallInst::Create(LoadClass, Args, Args + 2, "", currentBlock); + } + } + + for (array_class_iterator i = arrayClasses.begin(), + e = arrayClasses.end(); i != e; ++i) { + if (!(i->first->baseClass()->isPrimitive())) { + Args[0] = loader; + Args[1] = i->second; + Args[2] = getUTF8(i->first->name); + CallInst::Create(GetClassArray, Args, Args + 3, "", currentBlock); + } + } + + ReturnInst::Create(currentBlock); +} Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=61626&r1=61625&r2=61626&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Sun Jan 4 07:39:35 2009 @@ -233,6 +233,8 @@ static llvm::Constant* PrimitiveArrayVT; static llvm::Constant* ReferenceArrayVT; + static llvm::Function* StaticInitializer; + public: bool isStaticCompiling() { @@ -421,7 +423,9 @@ #endif - bool isCompiling(CommonClass* cl); + bool isCompiling(const CommonClass* cl) const; + + void CreateStaticInitializer(); private: static llvm::Module* initialModule; @@ -444,6 +448,7 @@ llvm::Constant* CreateConstantFromJavaClass(CommonClass* cl); llvm::Constant* CreateConstantForJavaObject(CommonClass* cl); llvm::Constant* getUTF8(const UTF8* val); + }; } From nicolas.geoffray at lip6.fr Sun Jan 4 12:03:24 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 04 Jan 2009 20:03:24 -0000 Subject: [vmkit-commits] [vmkit] r61629 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaClass.h JnjvmModule.cpp JnjvmModule.h Message-ID: <200901042003.n04K3OYi007915@zion.cs.uiuc.edu> Author: geoffray Date: Sun Jan 4 14:03:23 2009 New Revision: 61629 URL: http://llvm.org/viewvc/llvm-project?rev=61629&view=rev Log: Move the initialization of array VTs to ClassArray, instead of JnjvmModule. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=61629&r1=61628&r2=61629&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Sun Jan 4 14:03:23 2009 @@ -1293,3 +1293,17 @@ return false; } + + +void ClassArray::initialiseVT(Class* cl) { + uint32 size = (cl->virtualTableSize - VT_NB_FUNCS) * sizeof(void*); + + #define COPY(CLASS) \ + memcpy((void*)((uintptr_t)CLASS + VT_SIZE), \ + (void*)((uintptr_t)cl->virtualVT + VT_SIZE), size); + + COPY(JavaArrayVT) + COPY(ArrayObjectVT) + +#undef COPY +} Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=61629&r1=61628&r2=61629&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Sun Jan 4 14:03:23 2009 @@ -944,6 +944,11 @@ /// InterfacesArray - The list of interfaces for array classes. /// static Class** InterfacesArray; + + /// initialiseVT - Initialise the primitive and reference array VT. + /// super is the java/lang/Object class. + /// + static void initialiseVT(Class* super); }; /// JavaMethod - This class represents Java methods. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61629&r1=61628&r2=61629&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Sun Jan 4 14:03:23 2009 @@ -332,7 +332,7 @@ if (I == End) { if (isCompiling(classDef)) { - classDef->virtualVT = makeVT(classDef); + makeVT(classDef); } const ArrayType* ATy = dyn_cast(VTType->getContainedType(0)); @@ -348,7 +348,7 @@ virtualTables.insert(std::make_pair(classDef, res)); if (isCompiling(classDef)) { - classDef->virtualVT = makeVT(classDef); + makeVT(classDef); Function* Finalizer = ((Function**)classDef->virtualVT)[0]; Function* Tracer = LCI->getVirtualTracer(); Constant* C = CreateConstantFromVT(classDef->virtualVT, @@ -451,6 +451,7 @@ } else { VT = JavaObjectVT; } + cl->virtualVT = VT; return VT; } #endif @@ -1193,17 +1194,18 @@ return Array; } -VirtualTable* JnjvmModule::makeVT(Class* cl) { +void JnjvmModule::makeVT(Class* cl) { VirtualTable* VT = 0; #ifdef WITHOUT_VTABLE mvm::BumpPtrAllocator& allocator = cl->classLoader->allocator; VT = (VirtualTable*)allocator.Allocate(VT_SIZE); memcpy(VT, JavaObjectVT, VT_SIZE); + cl->virtualVT = VT; #else if (cl->super) { if (isStaticCompiling() && !cl->super->virtualVT) { - cl->super->virtualVT = makeVT(cl->super); + makeVT(cl->super); } cl->virtualTableSize = cl->super->virtualTableSize; @@ -1255,16 +1257,7 @@ // If there is no super, then it's the first VT that we allocate. Assign // this VT to native types. if (!(cl->super)) { - uint32 size = (cl->virtualTableSize - VT_NB_FUNCS) * sizeof(void*); -#define COPY(CLASS) \ - memcpy((void*)((uintptr_t)CLASS + VT_SIZE), \ - (void*)((uintptr_t)VT + VT_SIZE), size); - - COPY(JavaArrayVT) - COPY(ArrayObjectVT) - -#undef COPY - + ClassArray::initialiseVT(cl); } #endif @@ -1280,7 +1273,6 @@ } #endif - return VT; } @@ -1322,7 +1314,7 @@ JnjvmModule* Mod = classDef->classLoader->getModule(); if (!Mod->isStaticCompiling()) { - classDef->virtualVT = Mod->makeVT((Class*)classDef); + Mod->makeVT((Class*)classDef); } } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=61629&r1=61628&r2=61629&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Sun Jan 4 14:03:23 2009 @@ -227,7 +227,7 @@ llvm::Function* makeTracer(Class* cl, bool stat); - VirtualTable* makeVT(Class* cl); + void makeVT(Class* cl); VirtualTable* allocateVT(Class* cl); static llvm::Constant* PrimitiveArrayVT; From nicolas.geoffray at lip6.fr Sun Jan 4 12:21:19 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 04 Jan 2009 20:21:19 -0000 Subject: [vmkit-commits] [vmkit] r61631 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathConstructor.cpp VMCore/JavaObject.cpp VMCore/JnjvmClassLoader.cpp VMCore/JnjvmModule.cpp VMCore/LockedMap.h VMCore/VirtualTables.cpp Message-ID: <200901042021.n04KLK5b008586@zion.cs.uiuc.edu> Author: geoffray Date: Sun Jan 4 14:21:19 2009 New Revision: 61631 URL: http://llvm.org/viewvc/llvm-project?rev=61631&view=rev Log: Fix includes. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp?rev=61631&r1=61630&r2=61631&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp Sun Jan 4 14:21:19 2009 @@ -15,6 +15,7 @@ #include "JavaClass.h" #include "JavaObject.h" #include "JavaThread.h" +#include "JavaTypes.h" #include "JavaUpcalls.h" #include "Jnjvm.h" #include "JnjvmClassLoader.h" Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp?rev=61631&r1=61630&r2=61631&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp Sun Jan 4 14:21:19 2009 @@ -14,6 +14,7 @@ #include "JavaClass.h" #include "JavaObject.h" #include "JavaThread.h" +#include "JavaTypes.h" #include "JavaUpcalls.h" #include "Jnjvm.h" Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=61631&r1=61630&r2=61631&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Sun Jan 4 14:21:19 2009 @@ -35,6 +35,7 @@ #include "ClasspathReflect.h" #include "JavaClass.h" #include "JavaConstantPool.h" +#include "JavaString.h" #include "JavaThread.h" #include "JavaUpcalls.h" #include "Jnjvm.h" @@ -43,6 +44,7 @@ #include "JnjvmModuleProvider.h" #include "LockedMap.h" #include "Reader.h" +#include "Zip.h" using namespace jnjvm; Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61631&r1=61630&r2=61631&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Sun Jan 4 14:21:19 2009 @@ -18,6 +18,7 @@ #include "JavaCache.h" #include "JavaJIT.h" +#include "JavaString.h" #include "JavaThread.h" #include "JavaTypes.h" #include "JavaUpcalls.h" Modified: vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h?rev=61631&r1=61630&r2=61631&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h Sun Jan 4 14:21:19 2009 @@ -18,7 +18,7 @@ #include -#include +#include #include "types.h" @@ -27,15 +27,16 @@ #include "mvm/PrintBuffer.h" #include "mvm/Threads/Locks.h" -#include "JavaArray.h" -#include "JavaClass.h" -#include "JavaTypes.h" -#include "JavaString.h" -#include "Zip.h" +#include "JavaArray.h" // for comparing UTF8s namespace jnjvm { class JavaObject; +class JavaString; +class Signdef; +class Typedef; +class UserCommonClass; +class UserClassArray; struct ltutf8 { Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=61631&r1=61630&r2=61631&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Sun Jan 4 14:21:19 2009 @@ -12,6 +12,7 @@ #include "JavaArray.h" #include "JavaClass.h" #include "JavaObject.h" +#include "JavaString.h" #include "JavaThread.h" #include "JavaUpcalls.h" #include "Jnjvm.h" From nicolas.geoffray at lip6.fr Sun Jan 4 12:37:30 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 04 Jan 2009 20:37:30 -0000 Subject: [vmkit-commits] [vmkit] r61633 - /vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp Message-ID: <200901042037.n04KbVPt009154@zion.cs.uiuc.edu> Author: geoffray Date: Sun Jan 4 14:37:27 2009 New Revision: 61633 URL: http://llvm.org/viewvc/llvm-project?rev=61633&view=rev Log: Fix include. Modified: vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp?rev=61633&r1=61632&r2=61633&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp Sun Jan 4 14:37:27 2009 @@ -16,7 +16,7 @@ #include "LockedMap.h" #include "Zip.h" -#include +#include using namespace jnjvm; From nicolas.geoffray at lip6.fr Sun Jan 4 12:39:34 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 04 Jan 2009 20:39:34 -0000 Subject: [vmkit-commits] [vmkit] r61634 - /vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp Message-ID: <200901042039.n04KdY2J009242@zion.cs.uiuc.edu> Author: geoffray Date: Sun Jan 4 14:39:33 2009 New Revision: 61634 URL: http://llvm.org/viewvc/llvm-project?rev=61634&view=rev Log: Implement the UTF8Map::insert function. Modified: vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp?rev=61634&r1=61633&r2=61634&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp Sun Jan 4 14:39:33 2009 @@ -166,3 +166,7 @@ return res; } + +void UTF8Map::insert(const UTF8* val) { + map.insert(std::make_pair(readerHasher(val->elements, val->size), val)); +} From nicolas.geoffray at lip6.fr Sun Jan 4 12:56:03 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 04 Jan 2009 20:56:03 -0000 Subject: [vmkit-commits] [vmkit] r61636 - in /vmkit/trunk/lib/JnJVM/VMCore: JnjvmClassLoader.cpp JnjvmModule.cpp Message-ID: <200901042056.n04Ku3HQ009743@zion.cs.uiuc.edu> Author: geoffray Date: Sun Jan 4 14:56:03 2009 New Revision: 61636 URL: http://llvm.org/viewvc/llvm-project?rev=61636&view=rev Log: Also add utf8s and strings in the class loader tables in the static initializer. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=61636&r1=61635&r2=61636&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Sun Jan 4 14:56:03 2009 @@ -939,3 +939,11 @@ extern "C" void vmjcLoadClass(JnjvmClassLoader* JCL, const UTF8* name) { JCL->loadName(name, true, true); } + +extern "C" void vmjcAddUTF8(JnjvmClassLoader* JCL, const UTF8* val) { + JCL->hashUTF8->insert(val); +} + +extern "C" void vmjcAddString(JnjvmClassLoader* JCL, JavaString* val) { + JCL->strings.push_back(val); +} Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61636&r1=61635&r2=61636&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Sun Jan 4 14:56:03 2009 @@ -2249,11 +2249,34 @@ Function* LoadClass = Function::Create(FTy, GlobalValue::ExternalLinkage, "vmjcLoadClass", this); + Function* AddUTF8 = Function::Create(FTy, GlobalValue::ExternalLinkage, + "vmjcAddUTF8", this); + + llvmArgs.clear(); + llvmArgs.push_back(ptrType); // class loader + llvmArgs.push_back(strings.begin()->second->getType()); // val + FTy = FunctionType::get(Type::VoidTy, llvmArgs, false); + + Function* AddString = Function::Create(FTy, GlobalValue::ExternalLinkage, + "vmjcAddString", this); BasicBlock* currentBlock = BasicBlock::Create("enter", StaticInitializer); Function::arg_iterator loader = StaticInitializer->arg_begin(); Value* Args[3]; + + for (utf8_iterator i = utf8s.begin(), e = utf8s.end(); i != e; ++i) { + Args[0] = loader; + Args[1] = i->second; + CallInst::Create(AddUTF8, Args, Args + 2, "", currentBlock); + } + + for (string_iterator i = strings.begin(), e = strings.end(); i != e; ++i) { + Args[0] = loader; + Args[1] = i->second; + CallInst::Create(AddString, Args, Args + 2, "", currentBlock); + } + for (native_class_iterator i = nativeClasses.begin(), e = nativeClasses.end(); i != e; ++i) { if (isCompiling(i->first)) { @@ -2281,6 +2304,7 @@ CallInst::Create(GetClassArray, Args, Args + 3, "", currentBlock); } } + ReturnInst::Create(currentBlock); } From nicolas.geoffray at lip6.fr Sun Jan 4 14:05:29 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 04 Jan 2009 22:05:29 -0000 Subject: [vmkit-commits] [vmkit] r61639 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901042205.n04M5TPS011978@zion.cs.uiuc.edu> Author: geoffray Date: Sun Jan 4 16:05:29 2009 New Revision: 61639 URL: http://llvm.org/viewvc/llvm-project?rev=61639&view=rev Log: Only the class name is useful when static compiling. 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=61639&r1=61638&r2=61639&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Sun Jan 4 16:05:29 2009 @@ -129,7 +129,7 @@ GlobalVariable* varGV = new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage, 0, - classDef->printString(), this); + classDef->name->printString(), this); nativeClasses.insert(std::make_pair((Class*)classDef, varGV)); @@ -259,8 +259,7 @@ GlobalVariable* varGV = new GlobalVariable(Ty->getContainedType(0), false, - GlobalValue::ExternalLinkage, 0, - cl->printString(""), this); + GlobalValue::ExternalLinkage, 0, "", this); Constant* res = ConstantExpr::getCast(Instruction::BitCast, varGV, JavaObjectType); @@ -296,7 +295,7 @@ const Type* Ty = LCI->getStaticType(); varGV = new GlobalVariable(Ty->getContainedType(0), false, GlobalValue::ExternalLinkage, - 0, classDef->printString(""), this); + 0, "", this); Constant* res = ConstantExpr::getCast(Instruction::BitCast, varGV, ptrType); @@ -341,9 +340,7 @@ ATy = ArrayType::get(PTy, classDef->virtualTableSize); GlobalVariable* varGV = new GlobalVariable(ATy, true, GlobalValue::ExternalLinkage, - 0, - classDef->printString(""), - this); + 0, "", this); res = ConstantExpr::getCast(Instruction::BitCast, varGV, VTType); virtualTables.insert(std::make_pair(classDef, res)); From nicolas.geoffray at lip6.fr Sun Jan 4 14:06:08 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 04 Jan 2009 22:06:08 -0000 Subject: [vmkit-commits] [vmkit] r61640 - /vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Message-ID: <200901042206.n04M69GH012012@zion.cs.uiuc.edu> Author: geoffray Date: Sun Jan 4 16:06:08 2009 New Revision: 61640 URL: http://llvm.org/viewvc/llvm-project?rev=61640&view=rev Log: Bugfix for allocated arrays. 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=61640&r1=61639&r2=61640&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Sun Jan 4 16:06:08 2009 @@ -1689,7 +1689,11 @@ if (cl && (!cl->isClass() || cl->asClass()->isResolved())) { if (alreadyResolved) *alreadyResolved = cl; node = module->getNativeClass(cl); - if (module->isStaticCompiling() && cl->isArray()) { + // Since we only allocate for array classes that we own and + // ony primitive arrays are already allocated, verify that the class + // array is not external. + if (module->isStaticCompiling() && cl->isArray() && + node->getType() != module->JavaClassArrayType) { node = new LoadInst(node, "", currentBlock); } if (node->getType() != module->JavaCommonClassType) { From nicolas.geoffray at lip6.fr Mon Jan 5 01:56:26 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 05 Jan 2009 09:56:26 -0000 Subject: [vmkit-commits] [vmkit] r61689 - /vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Message-ID: <200901050956.n059uRtf012409@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 5 03:56:21 2009 New Revision: 61689 URL: http://llvm.org/viewvc/llvm-project?rev=61689&view=rev Log: Set the owner class as a class being static initialized after the class is resolved. 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=61689&r1=61688&r2=61689&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Mon Jan 5 03:56:21 2009 @@ -1097,7 +1097,6 @@ static void compileClass(Class* cl) { // Use the owner class field of the class so that we know if the class // belongs to the list of classes that we are static compiling. - cl->setOwnerClass(JavaThread::get()); cl->classLoader->getModule()->getNativeClass(cl); for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) { @@ -1165,6 +1164,7 @@ e = classes.end(); i != e; ++i) { Class* cl = *i; cl->resolveClass(); + cl->setOwnerClass(JavaThread::get()); } for (std::vector::iterator i = classes.begin(), e = classes.end(); @@ -1177,6 +1177,7 @@ const UTF8* utf8 = bootstrapLoader->asciizConstructUTF8(name); UserClass* cl = bootstrapLoader->loadName(utf8, true, true); + cl->setOwnerClass(JavaThread::get()); compileClass(cl); } From nicolas.geoffray at lip6.fr Mon Jan 5 04:23:41 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 05 Jan 2009 12:23:41 -0000 Subject: [vmkit-commits] [vmkit] r61691 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901051223.n05CNhb6017603@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 5 06:23:25 2009 New Revision: 61691 URL: http://llvm.org/viewvc/llvm-project?rev=61691&view=rev Log: Give an initializer to external arrays, and don't add UTF8s in the static initializer. Precompiled classes will add them. 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=61691&r1=61690&r2=61691&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Jan 5 06:23:25 2009 @@ -153,8 +153,8 @@ const llvm::Type* Ty = JavaClassArrayType; GlobalVariable* varGV = - new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage, 0, - "", this); + new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage, + Constant::getNullValue(Ty), "", this); arrayClasses.insert(std::make_pair((ClassArray*)classDef, varGV)); return varGV; @@ -2246,9 +2246,6 @@ Function* LoadClass = Function::Create(FTy, GlobalValue::ExternalLinkage, "vmjcLoadClass", this); - Function* AddUTF8 = Function::Create(FTy, GlobalValue::ExternalLinkage, - "vmjcAddUTF8", this); - llvmArgs.clear(); llvmArgs.push_back(ptrType); // class loader llvmArgs.push_back(strings.begin()->second->getType()); // val @@ -2262,12 +2259,6 @@ Value* Args[3]; - for (utf8_iterator i = utf8s.begin(), e = utf8s.end(); i != e; ++i) { - Args[0] = loader; - Args[1] = i->second; - CallInst::Create(AddUTF8, Args, Args + 2, "", currentBlock); - } - for (string_iterator i = strings.begin(), e = strings.end(); i != e; ++i) { Args[0] = loader; Args[1] = i->second; From nicolas.geoffray at lip6.fr Mon Jan 5 05:49:10 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 05 Jan 2009 13:49:10 -0000 Subject: [vmkit-commits] [vmkit] r61692 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901051349.n05DnECg020367@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 5 07:48:54 2009 New Revision: 61692 URL: http://llvm.org/viewvc/llvm-project?rev=61692&view=rev Log: Set an initializer to java classes. 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=61692&r1=61691&r2=61692&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Jan 5 07:48:54 2009 @@ -265,9 +265,7 @@ JavaObjectType); javaClasses.insert(std::make_pair(cl, res)); - if (cl->isClass() && isCompiling(cl->asClass())) { - varGV->setInitializer(CreateConstantFromJavaClass(cl)); - } + varGV->setInitializer(CreateConstantFromJavaClass(cl)); return res; } else { return I->second; From nicolas.geoffray at lip6.fr Mon Jan 5 06:19:57 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 05 Jan 2009 14:19:57 -0000 Subject: [vmkit-commits] [vmkit] r61693 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901051419.n05EJwm3021255@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 5 08:19:56 2009 New Revision: 61693 URL: http://llvm.org/viewvc/llvm-project?rev=61693&view=rev Log: Add an initializer to static instances. 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=61693&r1=61692&r2=61693&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Jan 5 08:19:56 2009 @@ -291,9 +291,10 @@ if (I == End) { LLVMClassInfo* LCI = getClassInfo(classDef); const Type* Ty = LCI->getStaticType(); - varGV = new GlobalVariable(Ty->getContainedType(0), false, + Ty = Ty->getContainedType(0); + varGV = new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage, - 0, "", this); + Constant::getNullValue(Ty), "", this); Constant* res = ConstantExpr::getCast(Instruction::BitCast, varGV, ptrType); From nicolas.geoffray at lip6.fr Mon Jan 5 08:48:34 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 05 Jan 2009 16:48:34 -0000 Subject: [vmkit-commits] [vmkit] r61696 - /vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h Message-ID: <200901051648.n05GmYOc027397@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 5 10:48:34 2009 New Revision: 61696 URL: http://llvm.org/viewvc/llvm-project?rev=61696&view=rev Log: Fix foward declarations. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h?rev=61696&r1=61695&r2=61696&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h Mon Jan 5 10:48:34 2009 @@ -22,11 +22,8 @@ namespace jnjvm { -class JavaClass; -class JavaField; class JavaObject; class JavaThread; -class UTF8; /// JavaCond - This class maintains a list of threads blocked on a wait. /// notify and notifyAll will change the state of one or more of these threads. From nicolas.geoffray at lip6.fr Mon Jan 5 08:49:44 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 05 Jan 2009 16:49:44 -0000 Subject: [vmkit-commits] [vmkit] r61697 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaJIT.cpp JnjvmClassLoader.cpp JnjvmModule.cpp JnjvmModule.h Message-ID: <200901051649.n05Gni0M027446@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 5 10:49:43 2009 New Revision: 61697 URL: http://llvm.org/viewvc/llvm-project?rev=61697&view=rev Log: Better handling of native functions when static compiling. Also add initial support for loading the base classes as a .so. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=61697&r1=61696&r2=61697&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Mon Jan 5 10:49:43 2009 @@ -295,6 +295,44 @@ Value* nativeFunc = module->getNativeFunction(compilingMethod, (void*)natPtr); + if (module->isStaticCompiling()) { + + if (compilingClass->isNativeOverloaded(compilingMethod)) { + compilingMethod->jniConsFromMethOverloaded(functionName); + } else { + compilingMethod->jniConsFromMeth(functionName); + } + + Constant* Arg = ConstantArray::get(std::string(functionName), true); + GlobalVariable* GV = new GlobalVariable(Arg->getType(), true, + GlobalValue::InternalLinkage, Arg, + "", module); + Arg = ConstantExpr::getBitCast(GV, module->ptrType); + Value* Args[2] = { module->getNativeClass(compilingClass), Arg }; + + // If the global variable is null, then load it. + BasicBlock* unloadedBlock = createBasicBlock(""); + BasicBlock* endBlock = createBasicBlock(""); + Value* test = new LoadInst(nativeFunc, "", currentBlock); + const llvm::Type* Ty = test->getType(); + PHINode* node = PHINode::Create(Ty, "", endBlock); + node->addIncoming(test, currentBlock); + Value* cmp = new ICmpInst(ICmpInst::ICMP_EQ, test, + Constant::getNullValue(Ty), "", currentBlock); + BranchInst::Create(unloadedBlock, endBlock, cmp, currentBlock); + currentBlock = unloadedBlock; + + Value* res = CallInst::Create(module->NativeLoader, Args, Args + 2, "", + currentBlock); + + res = new BitCastInst(res, Ty, "", currentBlock); + new StoreInst(res, nativeFunc, currentBlock); + node->addIncoming(res, currentBlock); + BranchInst::Create(endBlock, currentBlock); + currentBlock = endBlock; + nativeFunc = node; + } + Value* result = llvm::CallInst::Create(nativeFunc, nativeArgs.begin(), nativeArgs.end(), "", currentBlock); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=61697&r1=61696&r2=61697&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Mon Jan 5 10:49:43 2009 @@ -23,8 +23,10 @@ #if defined(__MACH__) #define SELF_HANDLE RTLD_DEFAULT +#define BOOTLIBNAME "libvmjc.dylib" #else #define SELF_HANDLE 0 +#define BOOTLIBNAME "libvmjc.so" #endif #include "debug.h" @@ -57,6 +59,8 @@ ClassArray ArrayOfDouble; ClassArray ArrayOfLong; +typedef void (*static_init_t)(JnjvmClassLoader*); + JnjvmBootstrapLoader::JnjvmBootstrapLoader(bool staticCompilation) { TheModule = new JnjvmModule("Bootstrap JnJVM", staticCompilation); @@ -83,7 +87,20 @@ upcalls = new(allocator) Classpath(); bootstrapLoader = this; + + // First, try to find if we have a pre-compiled rt.jar + void* handle = dlopen(BOOTLIBNAME, RTLD_LAZY | RTLD_GLOBAL); + if (handle) { + // Found it! + Class* ptr = (Class*)dlsym(handle, "java/lang/Object"); + if (ptr) { + // We have the java/lang/Object class, execute the static initializer. + static_init_t init = (static_init_t)(uintptr_t)ptr->classLoader; + assert(init && "Loaded the wrong boot library"); + init(this); + } + } // Create the name of char arrays. const UTF8* utf8OfChar = asciizConstructUTF8("[C"); @@ -947,3 +964,10 @@ extern "C" void vmjcAddString(JnjvmClassLoader* JCL, JavaString* val) { JCL->strings.push_back(val); } + +extern "C" intptr_t vmjcLoadNative(UserClass* cl, const char* name) { + bool jnjvm = false; + intptr_t res = cl->classLoader->loadInLib(name, jnjvm); + assert(res && "Could not find required native method"); + return res; +} Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61697&r1=61696&r2=61697&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Jan 5 10:49:43 2009 @@ -34,6 +34,7 @@ llvm::Constant* JnjvmModule::PrimitiveArrayVT; llvm::Constant* JnjvmModule::ReferenceArrayVT; llvm::Function* JnjvmModule::StaticInitializer; +llvm::Function* JnjvmModule::NativeLoader; extern void* JavaArrayVT[]; extern void* ArrayObjectVT[]; @@ -375,26 +376,11 @@ if (I == End) { LLVMSignatureInfo* LSI = getSignatureInfo(meth->getSignature()); - const llvm::Type* valPtrType = LSI->getNativeType(); + const llvm::Type* valPtrType = LSI->getNativePtrType(); - const UTF8* jniConsClName = meth->classDef->name; - const UTF8* jniConsName = meth->name; - const UTF8* jniConsType = meth->type; - sint32 clen = jniConsClName->size; - sint32 mnlen = jniConsName->size; - sint32 mtlen = jniConsType->size; - - char* buf = (char*)alloca(3 + JNI_NAME_PRE_LEN + 1 + - ((mnlen + clen + mtlen) << 1)); - - if (meth->classDef->isNativeOverloaded(meth)) - meth->jniConsFromMethOverloaded(buf); - else - meth->jniConsFromMeth(buf); - varGV = new GlobalVariable(valPtrType, true, - GlobalValue::ExternalLinkage, - 0, buf, this); + GlobalValue::InternalLinkage, + Constant::getNullValue(valPtrType), "", this); nativeFunctions.insert(std::make_pair(meth, varGV)); return varGV; @@ -1908,6 +1894,15 @@ StaticInitializer = Function::Create(FTy, GlobalValue::InternalLinkage, "Init", this); + llvmArgs.clear(); + llvmArgs.push_back(JavaClassType); + llvmArgs.push_back(ptrType); + + FTy = FunctionType::get(ptrType, llvmArgs, false); + + NativeLoader = Function::Create(FTy, GlobalValue::ExternalLinkage, + "vmjcNativeLoader", this); + } else { PrimitiveArrayVT = ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64(JavaArrayVT)), Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=61697&r1=61696&r2=61697&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Mon Jan 5 10:49:43 2009 @@ -236,6 +236,8 @@ static llvm::Function* StaticInitializer; public: + + static llvm::Function* NativeLoader; bool isStaticCompiling() { return staticCompilation; From nicolas.geoffray at lip6.fr Mon Jan 5 09:16:58 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 05 Jan 2009 17:16:58 -0000 Subject: [vmkit-commits] [vmkit] r61698 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Message-ID: <200901051716.n05HGxR4028651@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 5 11:16:57 2009 New Revision: 61698 URL: http://llvm.org/viewvc/llvm-project?rev=61698&view=rev Log: Fix naming of vmjc native loader. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=61698&r1=61697&r2=61698&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Mon Jan 5 11:16:57 2009 @@ -100,6 +100,8 @@ assert(init && "Loaded the wrong boot library"); init(this); } + } else { + fprintf(stderr, "%s\n", dlerror()); } // Create the name of char arrays. @@ -965,7 +967,7 @@ JCL->strings.push_back(val); } -extern "C" intptr_t vmjcLoadNative(UserClass* cl, const char* name) { +extern "C" intptr_t vmjcNativeLoader(UserClass* cl, const char* name) { bool jnjvm = false; intptr_t res = cl->classLoader->loadInLib(name, jnjvm); assert(res && "Could not find required native method"); From nicolas.geoffray at lip6.fr Mon Jan 5 09:28:55 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 05 Jan 2009 17:28:55 -0000 Subject: [vmkit-commits] [vmkit] r61704 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901051728.n05HStbg029164@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 5 11:28:55 2009 New Revision: 61704 URL: http://llvm.org/viewvc/llvm-project?rev=61704&view=rev Log: Do not reference abstract methods. 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=61704&r1=61703&r2=61704&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Jan 5 11:28:55 2009 @@ -847,10 +847,14 @@ MethodElts.push_back(ConstantInt::get(Type::Int8Ty, method.canBeInlined)); // code - LLVMMethodInfo* LMI = getMethodInfo(&method); - Function* func = LMI->getMethod(); - MethodElts.push_back(ConstantExpr::getCast(Instruction::BitCast, func, - ptrType)); + if (isAbstract(method.access)) { + MethodElts.push_back(Constant::getNullValue(ptrType)); + } else { + LLVMMethodInfo* LMI = getMethodInfo(&method); + Function* func = LMI->getMethod(); + MethodElts.push_back(ConstantExpr::getCast(Instruction::BitCast, func, + ptrType)); + } // offset MethodElts.push_back(ConstantInt::get(Type::Int32Ty, method.offset)); From nicolas.geoffray at lip6.fr Mon Jan 5 09:29:38 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 05 Jan 2009 17:29:38 -0000 Subject: [vmkit-commits] [vmkit] r61705 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Message-ID: <200901051729.n05HTcRJ029195@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 5 11:29:38 2009 New Revision: 61705 URL: http://llvm.org/viewvc/llvm-project?rev=61705&view=rev Log: Remove code from the last commit. It's not supposed to be there. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=61705&r1=61704&r2=61705&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Mon Jan 5 11:29:38 2009 @@ -100,9 +100,7 @@ assert(init && "Loaded the wrong boot library"); init(this); } - } else { - fprintf(stderr, "%s\n", dlerror()); - } + } // Create the name of char arrays. const UTF8* utf8OfChar = asciizConstructUTF8("[C"); From nicolas.geoffray at lip6.fr Mon Jan 5 09:46:08 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 05 Jan 2009 17:46:08 -0000 Subject: [vmkit-commits] [vmkit] r61712 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901051746.n05Hk8C3029934@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 5 11:46:07 2009 New Revision: 61712 URL: http://llvm.org/viewvc/llvm-project?rev=61712&view=rev Log: Don't static initialize strings if there aren't any. Dont initialize an abstract method if the virtual table. 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=61712&r1=61711&r2=61712&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Jan 5 11:46:07 2009 @@ -1173,7 +1173,12 @@ for (uint32 i = VT_NB_FUNCS; i < size; ++i) { Function* F = ((Function**)VT)[i]; - Elemts.push_back(ConstantExpr::getCast(Instruction::BitCast, F, PTy)); + JavaMethod* meth = LLVMMethodInfo::get(F); + if (isAbstract(meth->access)) { + Elemts.push_back(Constant::getNullValue(PTy)); + } else { + Elemts.push_back(ConstantExpr::getCast(Instruction::BitCast, F, PTy)); + } } Constant* Array = ConstantArray::get(ATy, Elemts); @@ -2243,24 +2248,28 @@ Function* LoadClass = Function::Create(FTy, GlobalValue::ExternalLinkage, "vmjcLoadClass", this); - - llvmArgs.clear(); - llvmArgs.push_back(ptrType); // class loader - llvmArgs.push_back(strings.begin()->second->getType()); // val - FTy = FunctionType::get(Type::VoidTy, llvmArgs, false); - - Function* AddString = Function::Create(FTy, GlobalValue::ExternalLinkage, - "vmjcAddString", this); BasicBlock* currentBlock = BasicBlock::Create("enter", StaticInitializer); Function::arg_iterator loader = StaticInitializer->arg_begin(); - + Value* Args[3]; + // If we have defined some strings. + if (strings.begin() != strings.end()) { + llvmArgs.clear(); + llvmArgs.push_back(ptrType); // class loader + llvmArgs.push_back(strings.begin()->second->getType()); // val + FTy = FunctionType::get(Type::VoidTy, llvmArgs, false); + + Function* AddString = Function::Create(FTy, GlobalValue::ExternalLinkage, + "vmjcAddString", this); + + - for (string_iterator i = strings.begin(), e = strings.end(); i != e; ++i) { - Args[0] = loader; - Args[1] = i->second; - CallInst::Create(AddString, Args, Args + 2, "", currentBlock); + for (string_iterator i = strings.begin(), e = strings.end(); i != e; ++i) { + Args[0] = loader; + Args[1] = i->second; + CallInst::Create(AddString, Args, Args + 2, "", currentBlock); + } } for (native_class_iterator i = nativeClasses.begin(), From nicolas.geoffray at lip6.fr Mon Jan 5 11:52:13 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 05 Jan 2009 19:52:13 -0000 Subject: [vmkit-commits] [vmkit] r61738 - /vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Message-ID: <200901051952.n05JqD6X002186@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 5 13:52:13 2009 New Revision: 61738 URL: http://llvm.org/viewvc/llvm-project?rev=61738&view=rev Log: Also compile interfaces when static compiling because they may contain a function. 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=61738&r1=61737&r2=61738&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Mon Jan 5 13:52:13 2009 @@ -1170,7 +1170,7 @@ for (std::vector::iterator i = classes.begin(), e = classes.end(); i != e; ++i) { Class* cl = *i; - if (!cl->isInterface()) compileClass(cl); + compileClass(cl); } } else { From nicolas.geoffray at lip6.fr Mon Jan 5 13:02:37 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 05 Jan 2009 21:02:37 -0000 Subject: [vmkit-commits] [vmkit] r61748 - /vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h Message-ID: <200901052102.n05L2b0C004880@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 5 15:02:36 2009 New Revision: 61748 URL: http://llvm.org/viewvc/llvm-project?rev=61748&view=rev Log: Typo. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h?rev=61748&r1=61747&r2=61748&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h Mon Jan 5 15:02:36 2009 @@ -124,7 +124,7 @@ /// internalToJava - Creates a copy of the UTF8 at its given offset and size - /// woth all its '.' replaced by '/'. The JVM bytecode reference classes in + /// with all its '.' replaced by '/'. The JVM bytecode reference classes in /// packages with the '.' as the separating character. The JVM language uses /// the '/' character. /// From nicolas.geoffray at lip6.fr Mon Jan 5 13:03:20 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 05 Jan 2009 21:03:20 -0000 Subject: [vmkit-commits] [vmkit] r61749 - /vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Message-ID: <200901052103.n05L3Krt004911@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 5 15:03:19 2009 New Revision: 61749 URL: http://llvm.org/viewvc/llvm-project?rev=61749&view=rev Log: Don't output Class<> when debug printing a class. 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=61749&r1=61748&r2=61749&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Mon Jan 5 15:03:19 2009 @@ -203,9 +203,7 @@ } void CommonClass::print(mvm::PrintBuffer* buf) const { - buf->write("Class<"); printClassName(name, buf); - buf->write(">"); } UserClassPrimitive* CommonClass::toPrimitive(Jnjvm* vm) const { From nicolas.geoffray at lip6.fr Mon Jan 5 13:03:52 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 05 Jan 2009 21:03:52 -0000 Subject: [vmkit-commits] [vmkit] r61750 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901052103.n05L3rNh004938@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 5 15:03:52 2009 New Revision: 61750 URL: http://llvm.org/viewvc/llvm-project?rev=61750&view=rev Log: Print the class name with '.' instead of '/'. 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=61750&r1=61749&r2=61750&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Jan 5 15:03:52 2009 @@ -130,7 +130,7 @@ GlobalVariable* varGV = new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage, 0, - classDef->name->printString(), this); + classDef->printString(), this); nativeClasses.insert(std::make_pair((Class*)classDef, varGV)); From nicolas.geoffray at lip6.fr Mon Jan 5 15:22:25 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 05 Jan 2009 23:22:25 -0000 Subject: [vmkit-commits] [vmkit] r61773 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901052322.n05NMPna009782@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 5 17:22:24 2009 New Revision: 61773 URL: http://llvm.org/viewvc/llvm-project?rev=61773&view=rev Log: Set array of fields and methods as not-constant because the signature is set dynamically. 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=61773&r1=61772&r2=61773&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Jan 5 17:22:24 2009 @@ -942,7 +942,7 @@ Constant* fields = ConstantArray::get(ATy, TempElts); TempElts.clear(); - fields = new GlobalVariable(ATy, true, GlobalValue::InternalLinkage, + fields = new GlobalVariable(ATy, false, GlobalValue::InternalLinkage, fields, "", this); fields = ConstantExpr::getCast(Instruction::BitCast, fields, JavaFieldType); ClassElts.push_back(fields); @@ -963,7 +963,7 @@ Constant* fields = ConstantArray::get(ATy, TempElts); TempElts.clear(); - fields = new GlobalVariable(ATy, true, GlobalValue::InternalLinkage, + fields = new GlobalVariable(ATy, false, GlobalValue::InternalLinkage, fields, "", this); fields = ConstantExpr::getCast(Instruction::BitCast, fields, JavaFieldType); ClassElts.push_back(fields); @@ -985,7 +985,7 @@ Constant* methods = ConstantArray::get(ATy, TempElts); TempElts.clear(); - methods = new GlobalVariable(ATy, true, GlobalValue::InternalLinkage, + methods = new GlobalVariable(ATy, false, GlobalValue::InternalLinkage, methods, "", this); methods = ConstantExpr::getCast(Instruction::BitCast, methods, JavaMethodType); @@ -1008,7 +1008,7 @@ Constant* methods = ConstantArray::get(ATy, TempElts); TempElts.clear(); - methods = new GlobalVariable(ATy, true, GlobalValue::InternalLinkage, + methods = new GlobalVariable(ATy, false, GlobalValue::InternalLinkage, methods, "", this); methods = ConstantExpr::getCast(Instruction::BitCast, methods, JavaMethodType); From nicolas.geoffray at lip6.fr Mon Jan 5 15:23:28 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 05 Jan 2009 23:23:28 -0000 Subject: [vmkit-commits] [vmkit] r61774 - /vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Message-ID: <200901052323.n05NNSYB009826@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 5 17:23:28 2009 New Revision: 61774 URL: http://llvm.org/viewvc/llvm-project?rev=61774&view=rev Log: Set a compiled pointer only if there is none. 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=61774&r1=61773&r2=61774&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Mon Jan 5 17:23:28 2009 @@ -379,11 +379,12 @@ void JavaMethod::setCompiledPtr(void* ptr, const char* name) { classDef->acquire(); - assert(code == 0 && "Code of Java method already set!"); - code = ptr; - Jnjvm* vm = JavaThread::get()->getJVM(); - vm->addMethodInFunctionMap(this, code); - classDef->classLoader->getModule()->setMethod(this, ptr, name); + if (code == 0) { + code = ptr; + Jnjvm* vm = JavaThread::get()->getJVM(); + vm->addMethodInFunctionMap(this, code); + classDef->classLoader->getModule()->setMethod(this, ptr, name); + } access |= ACC_NATIVE; classDef->release(); } From nicolas.geoffray at lip6.fr Tue Jan 6 02:23:59 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 06 Jan 2009 10:23:59 -0000 Subject: [vmkit-commits] [vmkit] r61803 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Message-ID: <200901061024.n06AO2Fi008853@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 6 04:23:40 2009 New Revision: 61803 URL: http://llvm.org/viewvc/llvm-project?rev=61803&view=rev Log: Reorganize intialisation of native classes: first primitive types, then native array types and finally java.lang.Object. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=61803&r1=61802&r2=61803&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Tue Jan 6 04:23:40 2009 @@ -88,69 +88,15 @@ upcalls = new(allocator) Classpath(); bootstrapLoader = this; - - // First, try to find if we have a pre-compiled rt.jar - void* handle = dlopen(BOOTLIBNAME, RTLD_LAZY | RTLD_GLOBAL); - if (handle) { - // Found it! - Class* ptr = (Class*)dlsym(handle, "java/lang/Object"); - if (ptr) { - // We have the java/lang/Object class, execute the static initializer. - static_init_t init = (static_init_t)(uintptr_t)ptr->classLoader; - assert(init && "Loaded the wrong boot library"); - init(this); - } - } - - // Create the name of char arrays. - const UTF8* utf8OfChar = asciizConstructUTF8("[C"); - - // Create the base class of char arrays. - upcalls->OfChar = UPCALL_PRIMITIVE_CLASS(this, "char", 2); - - // Create the char array. - upcalls->ArrayOfChar = constructPrimitiveArray(ArrayOfChar, utf8OfChar, - upcalls->OfChar); - - // Alright, now we can repair the damage: set the class to the UTF8s created - // and set the array class of UTF8s. - ((UTF8*)utf8OfChar)->classOf = upcalls->ArrayOfChar; - ((UTF8*)upcalls->OfChar->name)->classOf = upcalls->ArrayOfChar; - hashUTF8->array = upcalls->ArrayOfChar; - - // Create the byte array, so that bytes for classes can be created. - upcalls->OfByte = UPCALL_PRIMITIVE_CLASS(this, "byte", 1); - upcalls->ArrayOfByte = constructPrimitiveArray(ArrayOfByte, - asciizConstructUTF8("[B"), - upcalls->OfByte); - + // Allocate interfaces. InterfacesArray = (Class**)allocator.Allocate(2 * sizeof(UserClass*)); - - // Now we can create the super and interfaces of arrays. - InterfacesArray[0] = loadName(asciizConstructUTF8("java/lang/Cloneable"), - false, false); - InterfacesArray[1] = loadName(asciizConstructUTF8("java/io/Serializable"), - false, false); - - SuperArray = loadName(asciizConstructUTF8("java/lang/Object"), false, - false); - - ClassArray::SuperArray = (Class*)SuperArray->getInternal(); ClassArray::InterfacesArray = (Class**)allocator.Allocate(2 * sizeof(UserClass*)); - ClassArray::InterfacesArray[0] = (Class*)InterfacesArray[0]->getInternal(); - ClassArray::InterfacesArray[1] = (Class*)(InterfacesArray[1]->getInternal()); - - // And repair the damage: set the interfaces and super of array classes already - // created. - upcalls->ArrayOfChar->setInterfaces(InterfacesArray); - upcalls->ArrayOfChar->setSuper(SuperArray); - upcalls->ArrayOfByte->setInterfaces(InterfacesArray); - upcalls->ArrayOfByte->setSuper(SuperArray); - // Yay, create the other primitive types. + // Create the primitive classes. + upcalls->OfChar = UPCALL_PRIMITIVE_CLASS(this, "char", 2); upcalls->OfBool = UPCALL_PRIMITIVE_CLASS(this, "boolean", 1); upcalls->OfShort = UPCALL_PRIMITIVE_CLASS(this, "short", 2); upcalls->OfInt = UPCALL_PRIMITIVE_CLASS(this, "int", 4); @@ -158,8 +104,17 @@ upcalls->OfFloat = UPCALL_PRIMITIVE_CLASS(this, "float", 4); upcalls->OfDouble = UPCALL_PRIMITIVE_CLASS(this, "double", 8); upcalls->OfVoid = UPCALL_PRIMITIVE_CLASS(this, "void", 0); + upcalls->OfByte = UPCALL_PRIMITIVE_CLASS(this, "byte", 1); + + // Create the primitive arrays. + upcalls->ArrayOfChar = constructPrimitiveArray(ArrayOfChar, + asciizConstructUTF8("[C"), + upcalls->OfChar); + + upcalls->ArrayOfByte = constructPrimitiveArray(ArrayOfByte, + asciizConstructUTF8("[B"), + upcalls->OfByte); - // And finally create the primitive arrays. upcalls->ArrayOfInt = constructPrimitiveArray(ArrayOfInt, asciizConstructUTF8("[I"), upcalls->OfInt); @@ -184,13 +139,84 @@ asciizConstructUTF8("[S"), upcalls->OfShort); + // Fill the maps. + primitiveMap[I_VOID] = upcalls->OfVoid; + primitiveMap[I_BOOL] = upcalls->OfBool; + primitiveMap[I_BYTE] = upcalls->OfByte; + primitiveMap[I_CHAR] = upcalls->OfChar; + primitiveMap[I_SHORT] = upcalls->OfShort; + primitiveMap[I_INT] = upcalls->OfInt; + primitiveMap[I_FLOAT] = upcalls->OfFloat; + primitiveMap[I_LONG] = upcalls->OfLong; + primitiveMap[I_DOUBLE] = upcalls->OfDouble; + + arrayTable[JavaArray::T_BOOLEAN - 4] = upcalls->ArrayOfBool; + arrayTable[JavaArray::T_BYTE - 4] = upcalls->ArrayOfByte; + arrayTable[JavaArray::T_CHAR - 4] = upcalls->ArrayOfChar; + arrayTable[JavaArray::T_SHORT - 4] = upcalls->ArrayOfShort; + arrayTable[JavaArray::T_INT - 4] = upcalls->ArrayOfInt; + arrayTable[JavaArray::T_FLOAT - 4] = upcalls->ArrayOfFloat; + arrayTable[JavaArray::T_LONG - 4] = upcalls->ArrayOfLong; + arrayTable[JavaArray::T_DOUBLE - 4] = upcalls->ArrayOfDouble; + + + // Now that native types have been loaded, try to find if we have a + // pre-compiled rt.jar + void* handle = dlopen(BOOTLIBNAME, RTLD_LAZY | RTLD_GLOBAL); + if (handle) { + // Found it! + SuperArray = (Class*)dlsym(handle, "java.lang.Object"); + + if (SuperArray) { + ClassArray::SuperArray = (Class*)SuperArray->getInternal(); + // We have the java/lang/Object class, execute the static initializer. + static_init_t init = (static_init_t)(uintptr_t)SuperArray->classLoader; + assert(init && "Loaded the wrong boot library"); + init(this); + } + } + + // We haven't found a pre-compiled rt.jar, load the root class ourself. + if (!SuperArray) { + + SuperArray = loadName(asciizConstructUTF8("java/lang/Object"), false, + false); + ClassArray::SuperArray = (Class*)SuperArray->getInternal(); + + } + + // Set the super of array classes. +#define SET_PARENT(CLASS) \ + CLASS.setSuper(SuperArray); \ + + SET_PARENT(ArrayOfBool) + SET_PARENT(ArrayOfByte) + SET_PARENT(ArrayOfChar) + SET_PARENT(ArrayOfShort) + SET_PARENT(ArrayOfInt) + SET_PARENT(ArrayOfFloat) + SET_PARENT(ArrayOfDouble) + SET_PARENT(ArrayOfLong) +#undef SET_PARENT + + // Initialize interfaces of array classes. + InterfacesArray[0] = loadName(asciizConstructUTF8("java/lang/Cloneable"), + false, false); + + InterfacesArray[1] = loadName(asciizConstructUTF8("java/io/Serializable"), + false, false); + + ClassArray::InterfacesArray[0] = (Class*)InterfacesArray[0]->getInternal(); + ClassArray::InterfacesArray[1] = (Class*)(InterfacesArray[1]->getInternal()); + + // Load array classes that JnJVM internally uses. upcalls->ArrayOfString = constructArray(asciizConstructUTF8("[Ljava/lang/String;")); upcalls->ArrayOfObject = constructArray(asciizConstructUTF8("[Ljava/lang/Object;")); - + Attribut::codeAttribut = asciizConstructUTF8("Code"); Attribut::exceptionsAttribut = asciizConstructUTF8("Exceptions"); Attribut::constantAttribut = asciizConstructUTF8("ConstantValue"); @@ -242,24 +268,6 @@ #undef DEF_UTF8 - primitiveMap[I_VOID] = upcalls->OfVoid; - primitiveMap[I_BOOL] = upcalls->OfBool; - primitiveMap[I_BYTE] = upcalls->OfByte; - primitiveMap[I_CHAR] = upcalls->OfChar; - primitiveMap[I_SHORT] = upcalls->OfShort; - primitiveMap[I_INT] = upcalls->OfInt; - primitiveMap[I_FLOAT] = upcalls->OfFloat; - primitiveMap[I_LONG] = upcalls->OfLong; - primitiveMap[I_DOUBLE] = upcalls->OfDouble; - - arrayTable[JavaArray::T_BOOLEAN - 4] = upcalls->ArrayOfBool; - arrayTable[JavaArray::T_BYTE - 4] = upcalls->ArrayOfByte; - arrayTable[JavaArray::T_CHAR - 4] = upcalls->ArrayOfChar; - arrayTable[JavaArray::T_SHORT - 4] = upcalls->ArrayOfShort; - arrayTable[JavaArray::T_INT - 4] = upcalls->ArrayOfInt; - arrayTable[JavaArray::T_FLOAT - 4] = upcalls->ArrayOfFloat; - arrayTable[JavaArray::T_LONG - 4] = upcalls->ArrayOfLong; - arrayTable[JavaArray::T_DOUBLE - 4] = upcalls->ArrayOfDouble; } JnjvmClassLoader::JnjvmClassLoader(JnjvmClassLoader& JCL, JavaObject* loader, From nicolas.geoffray at lip6.fr Tue Jan 6 02:25:57 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 06 Jan 2009 10:25:57 -0000 Subject: [vmkit-commits] [vmkit] r61804 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaArray.cpp JavaArray.h JavaClass.cpp JavaTypes.cpp Message-ID: <200901061025.n06APvbf008937@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 6 04:25:54 2009 New Revision: 61804 URL: http://llvm.org/viewvc/llvm-project?rev=61804&view=rev Log: One day, internal UTF8s will just be char*.... until then, do not use virtual functions of UTF8s (especially print). Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaArray.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaArray.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaArray.cpp?rev=61804&r1=61803&r2=61804&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaArray.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaArray.cpp Tue Jan 6 04:25:54 2009 @@ -35,11 +35,15 @@ const unsigned int JavaArray::T_INT = 10; const unsigned int JavaArray::T_LONG = 11; -void UTF8::print(mvm::PrintBuffer* buf) const { +void UTF8::printUTF8(mvm::PrintBuffer* buf) const { for (int i = 0; i < size; i++) buf->writeChar((char)elements[i]); } +void UTF8::print(mvm::PrintBuffer* buf) const { + return printUTF8(buf); +} + const UTF8* UTF8::javaToInternal(Jnjvm* vm, unsigned int start, unsigned int len) const { UTF8* array = (UTF8*)vm->upcalls->ArrayOfChar->doNew(len, vm); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h?rev=61804&r1=61803&r2=61804&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h Tue Jan 6 04:25:54 2009 @@ -174,6 +174,9 @@ /// print - Prints the UTF8 for debugging purposes. virtual void print(mvm::PrintBuffer* buf) const; + + /// printUTF8 - Prints the UTF8 for debugging purposes. + void printUTF8(mvm::PrintBuffer* buf) const; }; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=61804&r1=61803&r2=61804&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Tue Jan 6 04:25:54 2009 @@ -182,7 +182,7 @@ if (name->elements[stepsEnd] == I_REF) { printClassNameIntern(name, (stepsEnd + 1),(end - 1), buf); } else { - name->print(buf); + name->printUTF8(buf); } buf->write(" "); for (uint32 i = start; i < stepsEnd; i++) @@ -392,6 +392,7 @@ const char* JavaMethod::printString() const { mvm::PrintBuffer *buf= mvm::PrintBuffer::alloc(); buf->write("JavaMethod<"); + fprintf(stderr, "name = %s\n", name->printString()); ((JavaMethod*)this)->getSignature()->printWithSign(classDef, name, buf); buf->write(">"); return buf->contents()->cString(); @@ -408,7 +409,7 @@ buf->write(" "); classDef->print(buf); buf->write("::"); - name->print(buf); + name->printUTF8(buf); buf->write(">"); return buf->contents()->cString(); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp?rev=61804&r1=61803&r2=61804&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp Tue Jan 6 04:25:54 2009 @@ -17,7 +17,7 @@ using namespace jnjvm; void PrimitiveTypedef::tPrintBuf(mvm::PrintBuffer* buf) const { - prim->name->print(buf); + prim->name->printUTF8(buf); } void ArrayTypedef::tPrintBuf(mvm::PrintBuffer* buf) const { @@ -73,7 +73,7 @@ buf->write(" "); CommonClass::printClassName(cl->name, buf); buf->write("::"); - name->print(buf); + name->printUTF8(buf); humanPrintArgs(buf); } From nicolas.geoffray at lip6.fr Tue Jan 6 02:33:00 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 06 Jan 2009 10:33:00 -0000 Subject: [vmkit-commits] [vmkit] r61805 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901061033.n06AX2IH009152@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 6 04:32:47 2009 New Revision: 61805 URL: http://llvm.org/viewvc/llvm-project?rev=61805&view=rev Log: Don't set a virtual table as constant: the runtime may decide to modify it (eg tracer of classes like java.lang.Class). 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=61805&r1=61804&r2=61805&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Tue Jan 6 04:32:47 2009 @@ -338,7 +338,9 @@ const ArrayType* ATy = dyn_cast(VTType->getContainedType(0)); const PointerType* PTy = dyn_cast(ATy->getContainedType(0)); ATy = ArrayType::get(PTy, classDef->virtualTableSize); - GlobalVariable* varGV = new GlobalVariable(ATy, true, + // Do not set a virtual table as a constant, because the runtime may + // modify it. + GlobalVariable* varGV = new GlobalVariable(ATy, false, GlobalValue::ExternalLinkage, 0, "", this); From nicolas.geoffray at lip6.fr Tue Jan 6 04:05:29 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 06 Jan 2009 12:05:29 -0000 Subject: [vmkit-commits] [vmkit] r61806 - /vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Message-ID: <200901061205.n06C5UXD016081@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 6 06:05:12 2009 New Revision: 61806 URL: http://llvm.org/viewvc/llvm-project?rev=61806&view=rev Log: Remove tailing space. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp?rev=61806&r1=61805&r2=61806&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Tue Jan 6 06:05:12 2009 @@ -130,7 +130,7 @@ // the iterator points to a native -> Java call. We dereference addr twice // because a native -> Java call always contains the signature function. } while (((void***)addr)[0][0] != *it); - } + } } #include From nicolas.geoffray at lip6.fr Tue Jan 6 04:10:46 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 06 Jan 2009 12:10:46 -0000 Subject: [vmkit-commits] [vmkit] r61807 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901061210.n06CAm2D016308@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 6 06:10:19 2009 New Revision: 61807 URL: http://llvm.org/viewvc/llvm-project?rev=61807&view=rev Log: Set the initialization state to ready if the class does not need an initialization check, or resolved if it needs one. 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=61807&r1=61806&r2=61807&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Tue Jan 6 06:10:19 2009 @@ -924,8 +924,9 @@ const StructType* TCMTy = dyn_cast(ATy->getContainedType(0)); assert(TCMTy && "Malformed type"); - - TempElts.push_back(ConstantInt::get(Type::Int32Ty, ready)); + + uint32 status = cl->needsInitialisationCheck() ? resolved : ready; + TempElts.push_back(ConstantInt::get(Type::Int32Ty, status)); TempElts.push_back(getStaticInstance(cl)); Constant* CStr[1] = { ConstantStruct::get(TCMTy, TempElts) }; TempElts.clear(); From nicolas.geoffray at lip6.fr Tue Jan 6 05:09:25 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 06 Jan 2009 13:09:25 -0000 Subject: [vmkit-commits] [vmkit] r61808 - in /vmkit/trunk/lib/JnJVM/VMCore: JnjvmModule.cpp JnjvmModule.h Message-ID: <200901061309.n06D9T8X018143@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 6 07:09:04 2009 New Revision: 61808 URL: http://llvm.org/viewvc/llvm-project?rev=61808&view=rev Log: Emit a static instance initializer because values of final static fields can be in the constant pool. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61808&r1=61807&r2=61808&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Tue Jan 6 07:09:04 2009 @@ -25,6 +25,7 @@ #include "Jnjvm.h" #include "JnjvmModule.h" #include "JnjvmModuleProvider.h" +#include "Reader.h" #include @@ -280,26 +281,77 @@ } } +Constant* JnjvmModule::CreateConstantFromStaticInstance(Class* cl) { + LLVMClassInfo* LCI = getClassInfo(cl); + const Type* Ty = LCI->getStaticType(); + const StructType* STy = dyn_cast(Ty->getContainedType(0)); + + std::vector Elts; + + for (uint32 i = 0; i < cl->nbStaticFields; ++i) { + JavaField& field = cl->staticFields[i]; + const Typedef* type = field.getSignature(); + LLVMAssessorInfo& LAI = getTypedefInfo(type); + const Type* Ty = LAI.llvmType; + + Attribut* attribut = field.lookupAttribut(Attribut::constantAttribut); + + if (!attribut) { + Elts.push_back(Constant::getNullValue(Ty)); + } else { + Reader reader(attribut, cl->bytes); + JavaConstantPool * ctpInfo = cl->ctpInfo; + uint16 idx = reader.readU2(); + if (type->isPrimitive()) { + if (Ty == Type::Int64Ty) { + Elts.push_back(ConstantInt::get(Ty, (uint64)ctpInfo->LongAt(idx))); + } else if (Ty == Type::DoubleTy) { + Elts.push_back(ConstantFP::get(Ty, ctpInfo->DoubleAt(idx))); + } else if (Ty == Type::FloatTy) { + Elts.push_back(ConstantFP::get(Ty, ctpInfo->FloatAt(idx))); + } else { + Elts.push_back(ConstantInt::get(Ty, (uint64)ctpInfo->IntegerAt(idx))); + } + } else if (type->isReference()){ + const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[idx]); + JavaString* obj = ctpInfo->resolveString(utf8, idx); + Elts.push_back(CreateConstantFromJavaString(obj)); + } else { + fprintf(stderr, "Implement me"); + abort(); + } + } + } + + return ConstantStruct::get(STy, Elts); +} + Constant* JnjvmModule::getStaticInstance(Class* classDef) { #ifdef ISOLATE assert(0 && "Should not be here"); abort(); #endif if (staticCompilation) { - llvm::Constant* varGV = 0; static_instance_iterator End = staticInstances.end(); static_instance_iterator I = staticInstances.find(classDef); if (I == End) { + LLVMClassInfo* LCI = getClassInfo(classDef); const Type* Ty = LCI->getStaticType(); Ty = Ty->getContainedType(0); - varGV = new GlobalVariable(Ty, false, - GlobalValue::ExternalLinkage, - Constant::getNullValue(Ty), "", this); + GlobalVariable* varGV = + new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage, + 0, classDef->printString(""), this); Constant* res = ConstantExpr::getCast(Instruction::BitCast, varGV, ptrType); staticInstances.insert(std::make_pair(classDef, res)); + + if (isCompiling(classDef)) { + Constant* C = CreateConstantFromStaticInstance(classDef); + varGV->setInitializer(C); + } + return res; } else { return I->second; @@ -2166,7 +2218,7 @@ std::map LLVMAssessorInfo::AssessorInfo; -LLVMAssessorInfo& JnjvmModule::getTypedefInfo(Typedef* type) { +LLVMAssessorInfo& JnjvmModule::getTypedefInfo(const Typedef* type) { return LLVMAssessorInfo::AssessorInfo[type->getKey()->elements[0]]; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=61808&r1=61807&r2=61808&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Tue Jan 6 07:09:04 2009 @@ -397,7 +397,7 @@ return method->getInfo(); } - static LLVMAssessorInfo& getTypedefInfo(Typedef* type); + static LLVMAssessorInfo& getTypedefInfo(const Typedef* type); explicit JnjvmModule(const std::string &ModuleID, bool sc = false); void initialise(); @@ -446,6 +446,7 @@ llvm::Constant* CreateConstantFromAttribut(Attribut& attribut); llvm::Constant* CreateConstantFromJavaField(JavaField& field); llvm::Constant* CreateConstantFromJavaMethod(JavaMethod& method); + llvm::Constant* CreateConstantFromStaticInstance(Class* cl); llvm::Constant* CreateConstantFromJavaString(JavaString* str); llvm::Constant* CreateConstantFromJavaClass(CommonClass* cl); llvm::Constant* CreateConstantForJavaObject(CommonClass* cl); From nicolas.geoffray at lip6.fr Tue Jan 6 05:26:20 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 06 Jan 2009 13:26:20 -0000 Subject: [vmkit-commits] [vmkit] r61809 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901061326.n06DQM6a018663@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 6 07:26:15 2009 New Revision: 61809 URL: http://llvm.org/viewvc/llvm-project?rev=61809&view=rev Log: Mindo for final string fields. 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=61809&r1=61808&r2=61809&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Tue Jan 6 07:26:15 2009 @@ -315,7 +315,9 @@ } else if (type->isReference()){ const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[idx]); JavaString* obj = ctpInfo->resolveString(utf8, idx); - Elts.push_back(CreateConstantFromJavaString(obj)); + Constant* C = getString(obj); + C = ConstantExpr::getBitCast(C, JavaObjectType); + Elts.push_back(C); } else { fprintf(stderr, "Implement me"); abort(); From nicolas.geoffray at lip6.fr Tue Jan 6 06:00:13 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 06 Jan 2009 14:00:13 -0000 Subject: [vmkit-commits] [vmkit] r61810 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.h Jnjvm.cpp JnjvmModule.cpp Message-ID: <200901061400.n06E0Eb1019818@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 6 08:00:02 2009 New Revision: 61810 URL: http://llvm.org/viewvc/llvm-project?rev=61810&view=rev Log: Add a new state to classes compiled with vmjc so that we don't need to initialize static final fields when initializing a class. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=61810&r1=61809&r2=61810&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Tue Jan 6 08:00:02 2009 @@ -52,11 +52,12 @@ loaded = 0, /// The .class file has been found. classRead = 1, /// The .class file has been read. resolved = 2, /// The class has been resolved. - inClinit = 3, /// The class is cliniting. - ready = 4, /// The class is ready to be used. - erroneous = 5, /// The class is in an erroneous state. + vmjc = 3, /// The class is defined in a shared library. + inClinit = 4, /// The class is cliniting. + ready = 5, /// The class is ready to be used. + erroneous = 6, /// The class is in an erroneous state. dontuseenums = 0xffffffff /// dummy value to force the enum to be int32 -}JavaState; +} JavaState; /// Attribut - This class represents JVM attributes to Java class, methods and Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=61810&r1=61809&r2=61810&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Tue Jan 6 08:00:02 2009 @@ -114,6 +114,7 @@ // now in progress by the current thread and release the lock on the // Class object. setOwnerClass(self); + bool vmjced = (getInitializationState() == vmjc); setInitializationState(inClinit); UserClass* cl = (UserClass*)this; #if defined(ISOLATE) || defined(ISOLATE_SHARING) @@ -178,10 +179,12 @@ PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "%s\n", printString()); - - JavaField* fields = cl->getStaticFields(); - for (uint32 i = 0; i < cl->nbStaticFields; ++i) { - fields[i].initField(val, vm); + + if (!vmjced) { + JavaField* fields = cl->getStaticFields(); + for (uint32 i = 0; i < cl->nbStaticFields; ++i) { + fields[i].initField(val, vm); + } } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61810&r1=61809&r2=61810&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Tue Jan 6 08:00:02 2009 @@ -979,7 +979,7 @@ const StructType* TCMTy = dyn_cast(ATy->getContainedType(0)); assert(TCMTy && "Malformed type"); - uint32 status = cl->needsInitialisationCheck() ? resolved : ready; + uint32 status = cl->needsInitialisationCheck() ? vmjc : ready; TempElts.push_back(ConstantInt::get(Type::Int32Ty, status)); TempElts.push_back(getStaticInstance(cl)); Constant* CStr[1] = { ConstantStruct::get(TCMTy, TempElts) }; From nicolas.geoffray at lip6.fr Tue Jan 6 06:49:24 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 06 Jan 2009 14:49:24 -0000 Subject: [vmkit-commits] [vmkit] r61811 - /vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Message-ID: <200901061449.n06EnQTf021840@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 6 08:49:03 2009 New Revision: 61811 URL: http://llvm.org/viewvc/llvm-project?rev=61811&view=rev Log: Remove dubugging output from last commit. 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=61811&r1=61810&r2=61811&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Tue Jan 6 08:49:03 2009 @@ -392,7 +392,6 @@ const char* JavaMethod::printString() const { mvm::PrintBuffer *buf= mvm::PrintBuffer::alloc(); buf->write("JavaMethod<"); - fprintf(stderr, "name = %s\n", name->printString()); ((JavaMethod*)this)->getSignature()->printWithSign(classDef, name, buf); buf->write(">"); return buf->contents()->cString(); From nicolas.geoffray at lip6.fr Tue Jan 6 07:29:30 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 06 Jan 2009 15:29:30 -0000 Subject: [vmkit-commits] [vmkit] r61812 - /vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Message-ID: <200901061529.n06FTWiQ023144@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 6 09:29:13 2009 New Revision: 61812 URL: http://llvm.org/viewvc/llvm-project?rev=61812&view=rev Log: jnjvmRuntimeInitialiseClass is not readnone.... It could be for optimization, but since access of static fields do not reference directly the class we need to force the call to stay. 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=61812&r1=61811&r2=61812&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original) +++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Tue Jan 6 09:29:13 2009 @@ -65,7 +65,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; jnjvmRuntimeInitialiseClass - Initialises the class. -declare %JavaClass* @jnjvmRuntimeInitialiseClass(%JavaClass*) readnone +declare %JavaClass* @jnjvmRuntimeInitialiseClass(%JavaClass*) ;;; arrayLength - Get the length of an array. declare i32 @arrayLength(%JavaObject*) readnone From nicolas.geoffray at lip6.fr Tue Jan 6 07:57:22 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 06 Jan 2009 15:57:22 -0000 Subject: [vmkit-commits] [vmkit] r61813 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901061557.n06FvNli023976@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 6 09:57:14 2009 New Revision: 61813 URL: http://llvm.org/viewvc/llvm-project?rev=61813&view=rev Log: Strings are no constants. 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=61813&r1=61812&r2=61813&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Tue Jan 6 09:57:14 2009 @@ -209,7 +209,7 @@ LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo((Class*)str->classOf); const llvm::Type* Ty = LCI->getVirtualType(); GlobalVariable* varGV = - new GlobalVariable(Ty->getContainedType(0), true, + new GlobalVariable(Ty->getContainedType(0), false, GlobalValue::ExternalLinkage, 0, "", this); Constant* res = ConstantExpr::getCast(Instruction::BitCast, varGV, From nicolas.geoffray at lip6.fr Tue Jan 6 07:58:03 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 06 Jan 2009 15:58:03 -0000 Subject: [vmkit-commits] [vmkit] r61814 - /vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Message-ID: <200901061558.n06Fw3JG024008@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 6 09:58:02 2009 New Revision: 61814 URL: http://llvm.org/viewvc/llvm-project?rev=61814&view=rev Log: Fix a sint32 -> pointer conversion, which is not portable for 64. 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=61814&r1=61813&r2=61814&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Tue Jan 6 09:58:02 2009 @@ -640,7 +640,7 @@ Typedef* type = getSignature(); if (!type->isPrimitive()) { - ((sint32*)((uint64)obj + ptrOffset))[0] = (sint32)val; + ((JavaObject**)((uint64)obj + ptrOffset))[0] = (JavaObject*)val; return; } From nicolas.geoffray at lip6.fr Tue Jan 6 13:22:23 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 06 Jan 2009 21:22:23 -0000 Subject: [vmkit-commits] [vmkit] r61823 - in /vmkit/trunk/lib/JnJVM/VMCore: Jnjvm.cpp LockedMap.cpp LockedMap.h Message-ID: <200901062122.n06LMNGU011519@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 6 15:22:22 2009 New Revision: 61823 URL: http://llvm.org/viewvc/llvm-project?rev=61823&view=rev Log: Add the bootstrap strings to the virtual machine when the vm is created. Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=61823&r1=61822&r2=61823&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Tue Jan 6 15:22:22 2009 @@ -1051,7 +1051,12 @@ upcalls = bootstrapLoader->upcalls; throwable = upcalls->newThrowable; - + + for (std::vector::iterator i = loader->strings.begin(), + e = loader->strings.end(); i != e; ++i) { + hashStr.insert(*i); + } + #ifdef ISOLATE IsolateLock.lock(); for (uint32 i = 0; i < NR_ISOLATES; ++i) { Modified: vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp?rev=61823&r1=61822&r2=61823&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp Tue Jan 6 15:22:22 2009 @@ -170,3 +170,7 @@ void UTF8Map::insert(const UTF8* val) { map.insert(std::make_pair(readerHasher(val->elements, val->size), val)); } + +void StringMap::insert(JavaString* str) { + map.insert(std::make_pair(str->value, str)); +} Modified: vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h?rev=61823&r1=61822&r2=61823&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h Tue Jan 6 15:22:22 2009 @@ -144,6 +144,10 @@ class StringMap : public LockedMap { + +public: + void insert(JavaString* str); + }; class TypeMap : public mvm::PermanentObject { From nicolas.geoffray at lip6.fr Tue Jan 6 13:25:36 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 06 Jan 2009 21:25:36 -0000 Subject: [vmkit-commits] [vmkit] r61824 - in /vmkit/trunk/lib/JnJVM: LLVMRuntime/runtime-default.ll VMCore/JavaJITOpcodes.cpp VMCore/JavaRuntimeJIT.cpp Message-ID: <200901062125.n06LPahM018961@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 6 15:25:36 2009 New Revision: 61824 URL: http://llvm.org/viewvc/llvm-project?rev=61824&view=rev Log: Give the opcode instead of the opcode name when debugging. Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp 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=61824&r1=61823&r2=61824&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original) +++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Tue Jan 6 15:25:36 2009 @@ -207,6 +207,6 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Debugging methods ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -declare void @printExecution(i8*, i32, i8*) +declare void @printExecution(i32, i32, i8*) declare void @printMethodStart(i8*) declare void @printMethodEnd(i8*) Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp?rev=61824&r1=61823&r2=61824&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Tue Jan 6 15:25:36 2009 @@ -144,10 +144,7 @@ #if JNJVM_EXECUTE > 1 { Value* args[3] = { - ConstantExpr::getIntToPtr( - ConstantInt::get(Type::Int64Ty, (int64_t)OpcodeNames[bytecodes[i]]), - module->ptrType), - + ConstantInt::get(Type::Int32Ty, (int64_t)bytecodes[i]), ConstantInt::get(Type::Int32Ty, (int64_t)i), ConstantExpr::getIntToPtr( Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=61824&r1=61823&r2=61824&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Tue Jan 6 15:25:36 2009 @@ -16,6 +16,7 @@ #include "JavaCache.h" #include "JavaClass.h" #include "JavaConstantPool.h" +#include "JavaJIT.h" #include "JavaString.h" #include "JavaThread.h" #include "JavaTypes.h" @@ -503,9 +504,9 @@ fflush(stdout); } -extern "C" void printExecution(char* opcode, uint32 index, JavaMethod* meth) { +extern "C" void printExecution(uint32 opcode, uint32 index, JavaMethod* meth) { printf("[%p] executing %s %s at %d\n", (void*)mvm::Thread::get(), - meth->printString(), opcode, index); + meth->printString(), JavaJIT::OpcodeNames[opcode], index); fflush(stdout); } From nicolas.geoffray at lip6.fr Wed Jan 7 01:16:04 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 07 Jan 2009 09:16:04 -0000 Subject: [vmkit-commits] [vmkit] r61854 - in /vmkit/trunk/lib/JnJVM: LLVMRuntime/runtime-default.ll VMCore/JavaJIT.cpp VMCore/JavaJITOpcodes.cpp VMCore/JnjvmModule.cpp VMCore/JnjvmModule.h Message-ID: <200901070916.n079G4sc018635@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 7 03:16:02 2009 New Revision: 61854 URL: http://llvm.org/viewvc/llvm-project?rev=61854&view=rev Log: The static compiler can now emit debug info when executing. Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.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=61854&r1=61853&r2=61854&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original) +++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Wed Jan 7 03:16:02 2009 @@ -207,6 +207,6 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Debugging methods ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -declare void @printExecution(i32, i32, i8*) -declare void @printMethodStart(i8*) -declare void @printMethodEnd(i8*) +declare void @printExecution(i32, i32, %JavaMethod*) +declare void @printMethodStart(%JavaMethod*) +declare void @printMethodEnd(%JavaMethod*) Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=61854&r1=61853&r2=61854&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Wed Jan 7 03:16:02 2009 @@ -637,9 +637,7 @@ #if JNJVM_EXECUTE > 0 { - Value* arg = ConstantExpr::getIntToPtr( - ConstantInt::get(Type::Int64Ty, uint64_t (compilingMethod)), - module->ptrType); + Value* arg = module->getMethodInClass(compilingMethod); llvm::CallInst::Create(module->PrintMethodStartFunction, arg, "", currentBlock); @@ -813,9 +811,7 @@ #if JNJVM_EXECUTE > 0 { - Value* arg = ConstantExpr::getIntToPtr( - ConstantInt::get(Type::Int64Ty, uint64_t (compilingMethod)), - module->ptrType); + Value* arg = module->getMethodInClass(compilingMethod); CallInst::Create(module->PrintMethodEndFunction, arg, "", currentBlock); } #endif Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp?rev=61854&r1=61853&r2=61854&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Wed Jan 7 03:16:02 2009 @@ -123,9 +123,9 @@ PRINT_DEBUG(JNJVM_COMPILE, 1, COLOR_NORMAL, "\t[at %5d] %-5d ", i, bytecodes[i]); - PRINT_DEBUG(JNJVM_COMPILE, 1, LIGHT_BLUE, "compiling ", 0); - PRINT_DEBUG(JNJVM_COMPILE, 1, LIGHT_CYAN, OpcodeNames[bytecodes[i]], 0); - PRINT_DEBUG(JNJVM_COMPILE, 1, LIGHT_BLUE, "\n", 0); + PRINT_DEBUG(JNJVM_COMPILE, 1, LIGHT_BLUE, "compiling "); + PRINT_DEBUG(JNJVM_COMPILE, 1, LIGHT_CYAN, OpcodeNames[bytecodes[i]]); + PRINT_DEBUG(JNJVM_COMPILE, 1, LIGHT_BLUE, "\n"); Opinfo* opinfo = &(opcodeInfos[i]); if (opinfo->newBlock) { @@ -146,10 +146,7 @@ Value* args[3] = { ConstantInt::get(Type::Int32Ty, (int64_t)bytecodes[i]), ConstantInt::get(Type::Int32Ty, (int64_t)i), - - ConstantExpr::getIntToPtr( - ConstantInt::get(Type::Int64Ty, (int64_t)compilingMethod), - module->ptrType) + module->getMethodInClass(compilingMethod) }; @@ -2198,9 +2195,9 @@ PRINT_DEBUG(JNJVM_COMPILE, 1, COLOR_NORMAL, "\t[at %5d] %-5d ", i, bytecodes[i]); - PRINT_DEBUG(JNJVM_COMPILE, 1, LIGHT_BLUE, "exploring ",0); - PRINT_DEBUG(JNJVM_COMPILE, 1, LIGHT_CYAN, OpcodeNames[bytecodes[i]], 0); - PRINT_DEBUG(JNJVM_COMPILE, 1, LIGHT_BLUE, "\n", 0); + PRINT_DEBUG(JNJVM_COMPILE, 1, LIGHT_BLUE, "exploring "); + PRINT_DEBUG(JNJVM_COMPILE, 1, LIGHT_CYAN, OpcodeNames[bytecodes[i]]); + PRINT_DEBUG(JNJVM_COMPILE, 1, LIGHT_BLUE, "\n"); switch (bytecodes[i]) { Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61854&r1=61853&r2=61854&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan 7 03:16:02 2009 @@ -199,6 +199,50 @@ } } +Constant* JnjvmModule::getMethodInClass(JavaMethod* meth) { + if (staticCompilation) { + method_iterator SI = methods.find(meth); + if (SI != methods.end()) { + return SI->second; + } else { + Class* cl = meth->classDef; + Constant* MOffset = 0; + Constant* COffset = 0; + + if (isVirtual(meth->access)) { + COffset = ConstantInt::get(Type::Int32Ty, 9); + for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) { + if (&cl->virtualMethods[i] == meth) { + MOffset = ConstantInt::get(Type::Int32Ty, i); + break; + } + } + } else { + COffset = ConstantInt::get(Type::Int32Ty, 11); + for (uint32 i = 0; i < cl->nbStaticMethods; ++i) { + if (&cl->staticMethods[i] == meth) { + MOffset = ConstantInt::get(Type::Int32Ty, i); + break; + } + } + } + + Constant* C = getNativeClass(cl); + + Value* Elts[3] = { constantZero, COffset, MOffset }; + + Constant* res = ConstantExpr::getGetElementPtr(C, Elts, 3); + + methods.insert(std::make_pair(meth, res)); + return res; + } + + } else { + ConstantInt* CI = ConstantInt::get(Type::Int64Ty, (int64_t)meth); + return ConstantExpr::getIntToPtr(CI, JavaMethodType); + } +} + Constant* JnjvmModule::getString(JavaString* str) { if (staticCompilation) { string_iterator SI = strings.find(str); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=61854&r1=61853&r2=61854&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Wed Jan 7 03:16:02 2009 @@ -191,12 +191,16 @@ std::map enveloppes; std::map nativeFunctions; std::map utf8s; + std::map methods; + + typedef std::map::iterator + method_iterator; typedef std::map::iterator - native_class_iterator; + native_class_iterator; typedef std::map::iterator - array_class_iterator; + array_class_iterator; typedef std::map::iterator java_class_iterator; @@ -205,7 +209,7 @@ virtual_table_iterator; typedef std::map::iterator - static_instance_iterator; + static_instance_iterator; typedef std::map::iterator constant_pool_iterator; @@ -407,6 +411,7 @@ llvm::Constant* getJavaClass(CommonClass* cl); llvm::Constant* getStaticInstance(Class* cl); llvm::Constant* getVirtualTable(Class* cl); + llvm::Constant* getMethodInClass(JavaMethod* meth); llvm::Constant* getEnveloppe(Enveloppe* enveloppe); llvm::Constant* getString(JavaString* str); From nicolas.geoffray at lip6.fr Wed Jan 7 01:19:13 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 07 Jan 2009 09:19:13 -0000 Subject: [vmkit-commits] [vmkit] r61855 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaThread.cpp JavaThread.h Message-ID: <200901070919.n079JD2d018737@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 7 03:19:12 2009 New Revision: 61855 URL: http://llvm.org/viewvc/llvm-project?rev=61855&view=rev Log: New method to only print Java methods in the stack. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp?rev=61855&r1=61854&r2=61855&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Wed Jan 7 03:19:12 2009 @@ -133,6 +133,18 @@ } } +void JavaThread::printJavaBacktrace() { + Jnjvm* vm = getJVM(); + std::vector vals; + for (std::vector::iterator i = vals.begin(), e = vals.end(); + i != e; ++i) { + JavaMethod* meth = vm->IPToMethod(*i); + assert(meth && "Wrong stack"); + fprintf(stderr, "; %p in %s\n", *i, meth->printString()); + } +} + + #include static void printFunctionInfo(void* ip) { Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h?rev=61855&r1=61854&r2=61855&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Wed Jan 7 03:19:12 2009 @@ -248,6 +248,11 @@ /// printBacktrace - Prints the backtrace of this thread. /// void printBacktrace(); + + /// printJavaBacktrace - Prints the backtrace of this thread. Only prints + /// the Java methods on the stack. + /// + void printJavaBacktrace(); /// getJavaFrameContext - Fill the vector with Java frames /// currently on the stack. From nicolas.geoffray at lip6.fr Wed Jan 7 02:30:33 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 07 Jan 2009 10:30:33 -0000 Subject: [vmkit-commits] [vmkit] r61856 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901071030.n07AUcng021408@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 7 04:30:16 2009 New Revision: 61856 URL: http://llvm.org/viewvc/llvm-project?rev=61856&view=rev Log: Bugfix to get the method. 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=61856&r1=61855&r2=61856&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan 7 04:30:16 2009 @@ -198,7 +198,7 @@ return ConstantExpr::getIntToPtr(CI, ConstantPoolType); } } - +#include Constant* JnjvmModule::getMethodInClass(JavaMethod* meth) { if (staticCompilation) { method_iterator SI = methods.find(meth); @@ -208,9 +208,11 @@ Class* cl = meth->classDef; Constant* MOffset = 0; Constant* COffset = 0; + uint32 nbMethods; if (isVirtual(meth->access)) { COffset = ConstantInt::get(Type::Int32Ty, 9); + nbMethods = cl->nbVirtualMethods; for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) { if (&cl->virtualMethods[i] == meth) { MOffset = ConstantInt::get(Type::Int32Ty, i); @@ -219,6 +221,7 @@ } } else { COffset = ConstantInt::get(Type::Int32Ty, 11); + nbMethods = cl->nbStaticMethods; for (uint32 i = 0; i < cl->nbStaticMethods; ++i) { if (&cl->staticMethods[i] == meth) { MOffset = ConstantInt::get(Type::Int32Ty, i); @@ -226,13 +229,19 @@ } } } - - Constant* C = getNativeClass(cl); - - Value* Elts[3] = { constantZero, COffset, MOffset }; - Constant* res = ConstantExpr::getGetElementPtr(C, Elts, 3); + assert(MOffset && "Offset not found!"); + Constant* C = getNativeClass(cl); + Value* Elts[2] = { constantZero, COffset}; + Constant* res = ConstantExpr::getGetElementPtr(C, Elts, 2); + const Type* ATy = ArrayType::get(JavaMethodType->getContainedType(0), + nbMethods); + ATy = PointerType::getUnqual(ATy); + res = ConstantExpr::getBitCast(res, ATy); + Elts[0] = constantZero; + Elts[1] = MOffset; + res = ConstantExpr::getGetElementPtr(res, Elts, 2); methods.insert(std::make_pair(meth, res)); return res; } From nicolas.geoffray at lip6.fr Wed Jan 7 04:58:47 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 07 Jan 2009 12:58:47 -0000 Subject: [vmkit-commits] [vmkit] r61857 - in /vmkit/trunk/lib/JnJVM/VMCore: JnjvmModule.cpp JnjvmModule.h Message-ID: <200901071258.n07Cwlq5026500@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 7 06:58:43 2009 New Revision: 61857 URL: http://llvm.org/viewvc/llvm-project?rev=61857&view=rev Log: Bugfix for getMethodInClass. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61857&r1=61856&r2=61857&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan 7 06:58:43 2009 @@ -198,54 +198,35 @@ return ConstantExpr::getIntToPtr(CI, ConstantPoolType); } } -#include + Constant* JnjvmModule::getMethodInClass(JavaMethod* meth) { if (staticCompilation) { - method_iterator SI = methods.find(meth); - if (SI != methods.end()) { - return SI->second; - } else { - Class* cl = meth->classDef; - Constant* MOffset = 0; - Constant* COffset = 0; - uint32 nbMethods; - - if (isVirtual(meth->access)) { - COffset = ConstantInt::get(Type::Int32Ty, 9); - nbMethods = cl->nbVirtualMethods; - for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) { - if (&cl->virtualMethods[i] == meth) { - MOffset = ConstantInt::get(Type::Int32Ty, i); - break; - } + Class* cl = meth->classDef; + Constant* MOffset = 0; + Constant* Array = 0; + if (isVirtual(meth->access)) { + method_iterator SI = virtualMethods.find(cl); + for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) { + if (&cl->virtualMethods[i] == meth) { + MOffset = ConstantInt::get(Type::Int32Ty, i); + break; } - } else { - COffset = ConstantInt::get(Type::Int32Ty, 11); - nbMethods = cl->nbStaticMethods; - for (uint32 i = 0; i < cl->nbStaticMethods; ++i) { - if (&cl->staticMethods[i] == meth) { - MOffset = ConstantInt::get(Type::Int32Ty, i); - break; - } + } + Array = SI->second; + } else { + method_iterator SI = staticMethods.find(cl); + for (uint32 i = 0; i < cl->nbStaticMethods; ++i) { + if (&cl->staticMethods[i] == meth) { + MOffset = ConstantInt::get(Type::Int32Ty, i); + break; } } - - assert(MOffset && "Offset not found!"); - Constant* C = getNativeClass(cl); - - Value* Elts[2] = { constantZero, COffset}; - Constant* res = ConstantExpr::getGetElementPtr(C, Elts, 2); - const Type* ATy = ArrayType::get(JavaMethodType->getContainedType(0), - nbMethods); - ATy = PointerType::getUnqual(ATy); - res = ConstantExpr::getBitCast(res, ATy); - Elts[0] = constantZero; - Elts[1] = MOffset; - res = ConstantExpr::getGetElementPtr(res, Elts, 2); - methods.insert(std::make_pair(meth, res)); - return res; + Array = SI->second; } + Constant* GEPs[2] = { constantZero, MOffset }; + return ConstantExpr::getGetElementPtr(Array, GEPs, 2); + } else { ConstantInt* CI = ConstantInt::get(Type::Int64Ty, (int64_t)meth); return ConstantExpr::getIntToPtr(CI, JavaMethodType); @@ -1095,9 +1076,11 @@ Constant* methods = ConstantArray::get(ATy, TempElts); TempElts.clear(); - methods = new GlobalVariable(ATy, false, GlobalValue::InternalLinkage, - methods, "", this); - methods = ConstantExpr::getCast(Instruction::BitCast, methods, + GlobalVariable* GV = new GlobalVariable(ATy, false, + GlobalValue::InternalLinkage, + methods, "", this); + virtualMethods.insert(std::make_pair(cl, GV)); + methods = ConstantExpr::getCast(Instruction::BitCast, GV, JavaMethodType); ClassElts.push_back(methods); } else { @@ -1118,10 +1101,11 @@ Constant* methods = ConstantArray::get(ATy, TempElts); TempElts.clear(); - methods = new GlobalVariable(ATy, false, GlobalValue::InternalLinkage, - methods, "", this); - methods = ConstantExpr::getCast(Instruction::BitCast, methods, - JavaMethodType); + GlobalVariable* GV = new GlobalVariable(ATy, false, + GlobalValue::InternalLinkage, + methods, "", this); + staticMethods.insert(std::make_pair(cl, GV)); + methods = ConstantExpr::getCast(Instruction::BitCast, GV, JavaMethodType); ClassElts.push_back(methods); } else { ClassElts.push_back(Constant::getNullValue(JavaMethodType)); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=61857&r1=61856&r2=61857&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Wed Jan 7 06:58:43 2009 @@ -191,9 +191,10 @@ std::map enveloppes; std::map nativeFunctions; std::map utf8s; - std::map methods; + std::map virtualMethods; + std::map staticMethods; - typedef std::map::iterator + typedef std::map::iterator method_iterator; typedef std::map::iterator From nicolas.geoffray at lip6.fr Wed Jan 7 05:56:41 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 07 Jan 2009 13:56:41 -0000 Subject: [vmkit-commits] [vmkit] r61858 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901071356.n07Duf7M028400@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 7 07:56:39 2009 New Revision: 61858 URL: http://llvm.org/viewvc/llvm-project?rev=61858&view=rev Log: Bugfix for VT of java.lang.Class. 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=61858&r1=61857&r2=61858&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan 7 07:56:39 2009 @@ -645,7 +645,7 @@ std::vector Elmts; // JavaObject - Elmts.push_back(CreateConstantForJavaObject(cl)); + Elmts.push_back(CreateConstantForJavaObject(javaClass)); // signers Elmts.push_back(Constant::getNullValue(JavaObjectType)); From nicolas.geoffray at lip6.fr Wed Jan 7 08:00:07 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 07 Jan 2009 16:00:07 -0000 Subject: [vmkit-commits] [vmkit] r61859 - in /vmkit/trunk/lib/JnJVM/VMCore: Jnjvm.cpp JnjvmModule.cpp JnjvmModule.h Message-ID: <200901071600.n07G07wT032449@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 7 10:00:05 2009 New Revision: 61859 URL: http://llvm.org/viewvc/llvm-project?rev=61859&view=rev Log: Let the compiler output the VT, since it knows which class are being compiled. Previously it was done when a class was resolving, and the module does not know yet which classes it will compile. Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=61859&r1=61858&r2=61859&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Wed Jan 7 10:00:05 2009 @@ -1134,6 +1134,8 @@ bootstrapLoader->upcalls->initialiseClasspath(bootstrapLoader); uint32 size = strlen(name); + JnjvmModule* M = bootstrapLoader->getModule(); + if (size > 4 && (!strcmp(&name[size - 4], ".jar") || !strcmp(&name[size - 4], ".zip"))) { @@ -1173,6 +1175,7 @@ Class* cl = *i; cl->resolveClass(); cl->setOwnerClass(JavaThread::get()); + M->makeVT(cl); } for (std::vector::iterator i = classes.begin(), e = classes.end(); @@ -1186,11 +1189,10 @@ const UTF8* utf8 = bootstrapLoader->asciizConstructUTF8(name); UserClass* cl = bootstrapLoader->loadName(utf8, true, true); cl->setOwnerClass(JavaThread::get()); + M->makeVT(cl); compileClass(cl); } - // Set the linkage to External, so that the printer does not complain. - JnjvmModule* M = bootstrapLoader->getModule(); M->CreateStaticInitializer(); // Print stats before quitting. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61859&r1=61858&r2=61859&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan 7 10:00:05 2009 @@ -419,10 +419,6 @@ virtual_table_iterator I = virtualTables.find(classDef); if (I == End) { - if (isCompiling(classDef)) { - makeVT(classDef); - } - const ArrayType* ATy = dyn_cast(VTType->getContainedType(0)); const PointerType* PTy = dyn_cast(ATy->getContainedType(0)); ATy = ArrayType::get(PTy, classDef->virtualTableSize); @@ -436,7 +432,6 @@ virtualTables.insert(std::make_pair(classDef, res)); if (isCompiling(classDef)) { - makeVT(classDef); Function* Finalizer = ((Function**)classDef->virtualVT)[0]; Function* Tracer = LCI->getVirtualTracer(); Constant* C = CreateConstantFromVT(classDef->virtualVT, Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=61859&r1=61858&r2=61859&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Wed Jan 7 10:00:05 2009 @@ -179,6 +179,7 @@ }; class JnjvmModule : public mvm::MvmModule { + friend class Jnjvm; friend class LLVMClassInfo; private: std::map nativeClasses; From nicolas.geoffray at lip6.fr Wed Jan 7 08:51:56 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 07 Jan 2009 16:51:56 -0000 Subject: [vmkit-commits] [vmkit] r61862 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaThread.cpp JavaThread.h JavaUpcalls.cpp Jni.cpp Message-ID: <200901071651.n07GpuWM001522@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 7 10:51:55 2009 New Revision: 61862 URL: http://llvm.org/viewvc/llvm-project?rev=61862&view=rev Log: A JNI call to getCallingClass gets the first Java frame, not the second. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp?rev=61862&r1=61861&r2=61862&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Wed Jan 7 10:51:55 2009 @@ -96,13 +96,14 @@ addresses.push_back(cur); } -UserClass* JavaThread::getCallingClass() { +UserClass* JavaThread::getCallingClass(uint32 level) { // I'm a native function, so try to look at the last Java method. // First Get the caller of this method. void** addr = (void**)addresses.back(); // Get the caller of the Java getCallingClass method. - addr = (void**)addr[0]; + if (level) + addr = (void**)addr[0]; void* ip = FRAME_IP(addr); JavaMethod* meth = getJVM()->IPToMethod(ip); @@ -136,6 +137,7 @@ void JavaThread::printJavaBacktrace() { Jnjvm* vm = getJVM(); std::vector vals; + getJavaFrameContext(vals); for (std::vector::iterator i = vals.begin(), e = vals.end(); i != e; ++i) { JavaMethod* meth = vm->IPToMethod(*i); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h?rev=61862&r1=61861&r2=61862&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Wed Jan 7 10:51:55 2009 @@ -243,7 +243,7 @@ /// getCallingClass - Get the Java method that called the last Java /// method on the stack. /// - UserClass* getCallingClass(); + UserClass* getCallingClass(uint32 level); /// printBacktrace - Prints the backtrace of this thread. /// Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=61862&r1=61861&r2=61862&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Wed Jan 7 10:51:55 2009 @@ -256,7 +256,7 @@ BEGIN_NATIVE_EXCEPTION(0) JavaThread* th = JavaThread::get(); - UserClass* cl = th->getCallingClass(); + UserClass* cl = th->getCallingClass(1); if (cl) res = cl->getClassDelegatee(th->getJVM()); END_NATIVE_EXCEPTION @@ -270,7 +270,7 @@ BEGIN_NATIVE_EXCEPTION(0) JavaThread* th = JavaThread::get(); - UserClass* cl = th->getCallingClass(); + UserClass* cl = th->getCallingClass(1); res = cl->classLoader->getJavaClassLoader(); END_NATIVE_EXCEPTION Modified: vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp?rev=61862&r1=61861&r2=61862&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp Wed Jan 7 10:51:55 2009 @@ -66,7 +66,7 @@ JnjvmClassLoader* loader = 0; JavaThread* th = JavaThread::get(); Jnjvm* vm = th->getJVM(); - UserClass* currentClass = th->getCallingClass(); + UserClass* currentClass = th->getCallingClass(0); if (currentClass) loader = currentClass->classLoader; else loader = vm->bootstrapLoader; From nicolas.geoffray at lip6.fr Wed Jan 7 09:07:07 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 07 Jan 2009 17:07:07 -0000 Subject: [vmkit-commits] [vmkit] r61863 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901071707.n07H78uv002200@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 7 11:07:00 2009 New Revision: 61863 URL: http://llvm.org/viewvc/llvm-project?rev=61863&view=rev Log: Don't set the target data layout when static compiling. 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=61863&r1=61862&r2=61863&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan 7 11:07:00 2009 @@ -2060,9 +2060,13 @@ JnjvmModule::JnjvmModule(const std::string &ModuleID, bool sc) : MvmModule(ModuleID) { - std::string str = - mvm::MvmModule::executionEngine->getTargetData()->getStringRepresentation(); - setDataLayout(str); + if (sc) { + setDataLayout(""); + } else { + std::string str = + executionEngine->getTargetData()->getStringRepresentation(); + setDataLayout(str); + } staticCompilation = sc; if (!VTType) initialise(); From nicolas.geoffray at lip6.fr Wed Jan 7 09:26:34 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 07 Jan 2009 17:26:34 -0000 Subject: [vmkit-commits] [vmkit] r61864 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901071726.n07HQYSI002871@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 7 11:26:34 2009 New Revision: 61864 URL: http://llvm.org/viewvc/llvm-project?rev=61864&view=rev Log: Set the class of UTF8 constants. 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=61864&r1=61863&r2=61864&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan 7 11:26:34 2009 @@ -1206,7 +1206,7 @@ const StructType* STy = StructType::get(Elemts); std::vector Cts; - Cts.push_back(Constant::getNullValue(JavaObjectType->getContainedType(0))); + Cts.push_back(CreateConstantForJavaObject(&ArrayOfChar)); Cts.push_back(ConstantInt::get(pointerSizeType, val->size)); std::vector Vals; From nicolas.geoffray at lip6.fr Wed Jan 7 09:29:26 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 07 Jan 2009 17:29:26 -0000 Subject: [vmkit-commits] [vmkit] r61865 - in /vmkit/trunk: Makefile.common.in Makefile.rules Message-ID: <200901071729.n07HTRWP002978@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 7 11:29:26 2009 New Revision: 61865 URL: http://llvm.org/viewvc/llvm-project?rev=61865&view=rev Log: Define a rule to create the glibj dynamic library. Modified: vmkit/trunk/Makefile.common.in vmkit/trunk/Makefile.rules Modified: vmkit/trunk/Makefile.common.in URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.common.in?rev=61865&r1=61864&r2=61865&view=diff ============================================================================== --- vmkit/trunk/Makefile.common.in (original) +++ vmkit/trunk/Makefile.common.in Wed Jan 7 11:29:26 2009 @@ -27,6 +27,7 @@ # GNU Classpath flags CLASSPATH_FLAGS = @classpathinclude@ +GLIBJ = @classpathglibj@ # Pnet location PNETLIB = @pnetlocalprefix@ Modified: vmkit/trunk/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.rules?rev=61865&r1=61864&r2=61865&view=diff ============================================================================== --- vmkit/trunk/Makefile.rules (original) +++ vmkit/trunk/Makefile.rules Wed Jan 7 11:29:26 2009 @@ -34,3 +34,18 @@ $(Verb) $(RM) -f LLVMAssembly.s LLVMAssembly.bc endif + +ifndef VMJC +VMJC := $(ToolDir)/vmjc$(EXEEXT) +endif + +vmjclib : + $(Verb) $(VMJC) -f -std-compile-opts $(GLIBJ)/glibj.zi -o glibj.zip.bc + $(Verb) if test -f glibj.zip.bc; then \ + $(LOPT) -std-compile-opts -f glibj.zip.bc -o glibj-optimized.zip.bc ; \ + $(Verb) $(LLC) -disable-fp-elim -f glibj-optimized.zip.bc; \ + $(Verb) $(CC) -fPIC -c glibj-optimized.zip.s; \ + $(Verb) $(CC) -shared -o libvmjc.so glibj-optimized.zip.o; \ + $(RM) -f glibj.zip.bc glibj-optimized.zip.bc glibj-optimized.zip.s \ + glibj-optimized.zip.o; \ + fi From nicolas.geoffray at lip6.fr Wed Jan 7 10:02:06 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 07 Jan 2009 18:02:06 -0000 Subject: [vmkit-commits] [vmkit] r61867 - /vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp Message-ID: <200901071802.n07I26c2004291@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 7 12:02:06 2009 New Revision: 61867 URL: http://llvm.org/viewvc/llvm-project?rev=61867&view=rev Log: Do not try to find the attributes of a vmjc'ed file. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp?rev=61867&r1=61866&r2=61867&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp Wed Jan 7 12:02:06 2009 @@ -69,7 +69,8 @@ Attribut* sourceAtt = cl->lookupAttribut(Attribut::sourceFileAttribut); - if (sourceAtt) { + // We don't have the bytes if the class was vmjc'ed. + if (sourceAtt && cl->getBytes()) { Reader reader(sourceAtt, cl->getBytes()); uint16 index = reader.readU2(); sourceName = vm->internalUTF8ToStr(cl->getConstantPool()->UTF8At(index)); From nicolas.geoffray at lip6.fr Wed Jan 7 10:02:44 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 07 Jan 2009 18:02:44 -0000 Subject: [vmkit-commits] [vmkit] r61868 - /vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Message-ID: <200901071802.n07I2iUN004337@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 7 12:02:44 2009 New Revision: 61868 URL: http://llvm.org/viewvc/llvm-project?rev=61868&view=rev Log: Insert the code pointer in the vm map. 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=61868&r1=61867&r2=61868&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Wed Jan 7 12:02:44 2009 @@ -1057,6 +1057,30 @@ hashStr.insert(*i); } + ClassMap* classes = bootstrapLoader->getClasses(); + for (ClassMap::iterator i = classes->map.begin(), e = classes->map.end(); + i != e; ++i) { + CommonClass* cl = i->second; + if (cl->isClass()) { + Class* C = cl->asClass(); + + for (uint32 i = 0; i < C->nbVirtualMethods; ++i) { + JavaMethod& meth = C->virtualMethods[i]; + if (!isAbstract(meth.access) && meth.code) { + addMethodInFunctionMap(&meth, meth.code); + } + } + + for (uint32 i = 0; i < C->nbStaticMethods; ++i) { + JavaMethod& meth = C->staticMethods[i]; + if (!isAbstract(meth.access) && meth.code) { + addMethodInFunctionMap(&meth, meth.code); + } + } + } + } + + #ifdef ISOLATE IsolateLock.lock(); for (uint32 i = 0; i < NR_ISOLATES; ++i) { From nicolas.geoffray at lip6.fr Wed Jan 7 12:30:51 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 07 Jan 2009 20:30:51 -0000 Subject: [vmkit-commits] [vmkit] r61881 - /vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Message-ID: <200901072030.n07KUp7m009998@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 7 14:30:51 2009 New Revision: 61881 URL: http://llvm.org/viewvc/llvm-project?rev=61881&view=rev Log: Also add the method pointers in the module. 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=61881&r1=61880&r2=61881&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Wed Jan 7 14:30:51 2009 @@ -1051,13 +1051,14 @@ upcalls = bootstrapLoader->upcalls; throwable = upcalls->newThrowable; - + for (std::vector::iterator i = loader->strings.begin(), e = loader->strings.end(); i != e; ++i) { hashStr.insert(*i); } ClassMap* classes = bootstrapLoader->getClasses(); + JnjvmModule* M = bootstrapLoader->getModule(); for (ClassMap::iterator i = classes->map.begin(), e = classes->map.end(); i != e; ++i) { CommonClass* cl = i->second; @@ -1068,6 +1069,7 @@ JavaMethod& meth = C->virtualMethods[i]; if (!isAbstract(meth.access) && meth.code) { addMethodInFunctionMap(&meth, meth.code); + M->setMethod(&meth, meth.code, ""); } } @@ -1075,6 +1077,7 @@ JavaMethod& meth = C->staticMethods[i]; if (!isAbstract(meth.access) && meth.code) { addMethodInFunctionMap(&meth, meth.code); + M->setMethod(&meth, meth.code, ""); } } } From nicolas.geoffray at lip6.fr Wed Jan 7 13:16:27 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 07 Jan 2009 21:16:27 -0000 Subject: [vmkit-commits] [vmkit] r61884 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901072116.n07LGR9n011541@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 7 15:16:27 2009 New Revision: 61884 URL: http://llvm.org/viewvc/llvm-project?rev=61884&view=rev Log: If the class was vmjc'ed, create the tracer llvm::Function. 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=61884&r1=61883&r2=61884&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan 7 15:16:27 2009 @@ -1395,7 +1395,18 @@ JnjvmModule* Mod = classDef->classLoader->getModule(); if (!Mod->isStaticCompiling()) { - Mod->makeVT((Class*)classDef); + if (!classDef->virtualVT) { + Mod->makeVT((Class*)classDef); + } else { + // So the class is vmjc'ed. Create the virtual tracer. + Function* func = Function::Create(JnjvmModule::MarkAndTraceType, + GlobalValue::ExternalLinkage, + "markAndTraceObject", Mod); + + void* ptr = ((void**)classDef->virtualVT)[VT_TRACER_OFFSET]; + Mod->executionEngine->addGlobalMapping(func, ptr); + virtualTracerFunction = func; + } } } From nicolas.geoffray at lip6.fr Wed Jan 7 14:09:32 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 07 Jan 2009 22:09:32 -0000 Subject: [vmkit-commits] [vmkit] r61887 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaThread.cpp JavaThread.h JavaUpcalls.cpp Message-ID: <200901072209.n07M9W3b013342@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 7 16:09:32 2009 New Revision: 61887 URL: http://llvm.org/viewvc/llvm-project?rev=61887&view=rev Log: Implement natively Java methods that inspect the stack. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp?rev=61887&r1=61886&r2=61887&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Wed Jan 7 16:09:32 2009 @@ -134,6 +134,64 @@ } } +UserClass* JavaThread::getCallingClassLevel(uint32 level) { + std::vector::iterator it = addresses.end(); + uint32 index = 0; + + // Loop until we cross the first Java frame. + while (it != addresses.begin()) { + + // Get the last Java frame. + void** addr = (void**)*(--it); + + // Set the iterator to the next native -> Java call. + --it; + + do { + void* ip = FRAME_IP(addr); + if (index == level) { + JavaMethod* meth = getJVM()->IPToMethod(ip); + return meth->classDef; + } + addr = (void**)addr[0]; + ++index; + // We end walking the stack when we cross a native -> Java call. Here + // the iterator points to a native -> Java call. We dereference addr twice + // because a native -> Java call always contains the signature function. + } while (((void***)addr)[0][0] != *it); + } + return 0; +} + +JavaObject* JavaThread::getNonNullClassLoader() { + std::vector::iterator it = addresses.end(); + + // Loop until we cross the first Java frame. + while (it != addresses.begin()) { + + // Get the last Java frame. + void** addr = (void**)*(--it); + + // Set the iterator to the next native -> Java call. + --it; + + do { + void* ip = FRAME_IP(addr); + JavaMethod* meth = getJVM()->IPToMethod(ip); + JnjvmClassLoader* loader = meth->classDef->classLoader; + JavaObject* obj = loader->getJavaClassLoader(); + if (obj) return obj; + addr = (void**)addr[0]; + // We end walking the stack when we cross a native -> Java call. Here + // the iterator points to a native -> Java call. We dereference addr twice + // because a native -> Java call always contains the signature function. + } while (((void***)addr)[0][0] != *it); + } + + return 0; +} + + void JavaThread::printJavaBacktrace() { Jnjvm* vm = getJVM(); std::vector vals; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h?rev=61887&r1=61886&r2=61887&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Wed Jan 7 16:09:32 2009 @@ -244,6 +244,16 @@ /// method on the stack. /// UserClass* getCallingClass(uint32 level); + + /// getCallingClassLevel - Get the Java method in the stack at the + /// specified level. + /// + UserClass* getCallingClassLevel(uint32 level); + + /// getNonNullClassLoader - Get the first non-null class loader on the + /// stack. + /// + JavaObject* getNonNullClassLoader(); /// printBacktrace - Prints the backtrace of this thread. /// Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=61887&r1=61886&r2=61887&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Wed Jan 7 16:09:32 2009 @@ -258,7 +258,6 @@ JavaThread* th = JavaThread::get(); UserClass* cl = th->getCallingClass(1); if (cl) res = cl->getClassDelegatee(th->getJVM()); - END_NATIVE_EXCEPTION return res; @@ -277,6 +276,30 @@ return res; } +extern "C" JavaObject* nativeFirstNonNullClassLoader() { + JavaObject *res = 0; + + BEGIN_NATIVE_EXCEPTION(0) + JavaThread* th = JavaThread::get(); + res = th->getNonNullClassLoader(); + END_NATIVE_EXCEPTION + + return res; +} + +extern "C" JavaObject* nativeGetCallerClass(uint32 index) { + + JavaObject *res = 0; + + BEGIN_NATIVE_EXCEPTION(0) + JavaThread* th = JavaThread::get(); + UserClass* cl = th->getCallingClassLevel(index - 1); + if (cl) res = cl->getClassDelegatee(th->getJVM()); + END_NATIVE_EXCEPTION + + return res; +} + extern "C" void nativePropertiesPostInit(JavaObject* prop); @@ -640,6 +663,19 @@ nativeGetCallingClassLoader, "nativeGetCallingClassLoader"); + JavaMethod* firstNonNullClassLoader = + UPCALL_METHOD(loader, "gnu/classpath/VMStackWalker", "firstNonNullClassLoader", + "()Ljava/lang/ClassLoader;", ACC_STATIC); + firstNonNullClassLoader->setCompiledPtr((void*)(intptr_t) + nativeFirstNonNullClassLoader, + "nativeFirstNonNullClassLoader"); + + JavaMethod* getCallerClass = + UPCALL_METHOD(loader, "sun/reflect/Reflection", "getCallerClass", + "(I)Ljava/lang/Class;", ACC_STATIC); + getCallerClass->setCompiledPtr((void*)(intptr_t)nativeGetCallerClass, + "nativeGetCallerClass"); + JavaMethod* postProperties = UPCALL_METHOD(loader, "gnu/classpath/VMSystemProperties", "postInit", "(Ljava/util/Properties;)V", ACC_STATIC); From nicolas.geoffray at lip6.fr Wed Jan 7 14:25:42 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 07 Jan 2009 22:25:42 -0000 Subject: [vmkit-commits] [vmkit] r61889 - /vmkit/trunk/Makefile.rules Message-ID: <200901072225.n07MPgBT013914@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 7 16:25:42 2009 New Revision: 61889 URL: http://llvm.org/viewvc/llvm-project?rev=61889&view=rev Log: Fix rule for vmjclib. Modified: vmkit/trunk/Makefile.rules Modified: vmkit/trunk/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.rules?rev=61889&r1=61888&r2=61889&view=diff ============================================================================== --- vmkit/trunk/Makefile.rules (original) +++ vmkit/trunk/Makefile.rules Wed Jan 7 16:25:42 2009 @@ -40,12 +40,16 @@ endif vmjclib : - $(Verb) $(VMJC) -f -std-compile-opts $(GLIBJ)/glibj.zi -o glibj.zip.bc + $(Verb) if test -d $(GLIBJ); then \ + $(Verb) $(VMJC) -f -std-compile-opts $(GLIBJ)/glibj.zip -o glibj.zip.bc; \ + else \ + $(Verb) $(VMJC) -f -std-compile-opts $(GLIBJ) -o glibj.zip.bc; \ + fi $(Verb) if test -f glibj.zip.bc; then \ - $(LOPT) -std-compile-opts -f glibj.zip.bc -o glibj-optimized.zip.bc ; \ - $(Verb) $(LLC) -disable-fp-elim -f glibj-optimized.zip.bc; \ - $(Verb) $(CC) -fPIC -c glibj-optimized.zip.s; \ - $(Verb) $(CC) -shared -o libvmjc.so glibj-optimized.zip.o; \ - $(RM) -f glibj.zip.bc glibj-optimized.zip.bc glibj-optimized.zip.s \ - glibj-optimized.zip.o; \ - fi + $(LOPT) -std-compile-opts -f glibj.zip.bc -o glibj-optimized.zip.bc; \ + $(Verb) $(LLC) -disable-fp-elim -f glibj-optimized.zip.bc; \ + $(Verb) $(CC) -fPIC -c glibj-optimized.zip.s; \ + $(Verb) $(CC) -shared -o libvmjc.so glibj-optimized.zip.o; \ + $(RM) -f glibj.zip.bc glibj-optimized.zip.bc glibj-optimized.zip.s; \ + $(RM) -f glibj-optimized.zip.o; \ + fi From nicolas.geoffray at lip6.fr Wed Jan 7 14:33:35 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 07 Jan 2009 22:33:35 -0000 Subject: [vmkit-commits] [vmkit] r61892 - /vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h Message-ID: <200901072233.n07MXZp1014219@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 7 16:33:35 2009 New Revision: 61892 URL: http://llvm.org/viewvc/llvm-project?rev=61892&view=rev Log: LLVM does not support va_arg for all platforms, so don't output AP stubs. 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=61892&r1=61891&r2=61892&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h Wed Jan 7 16:33:35 2009 @@ -354,13 +354,14 @@ // //===----------------------------------------------------------------------===// - /// compileAllStubs - Compile all the native -> Java stubs. + /// compileAllStubs - Compile all the native -> Java stubs. + /// TODO: Once LLVM supports va_arg, enable AP. /// void compileAllStubs() { getStaticCallBuf(); - getStaticCallAP(); + // getStaticCallAP(); getVirtualCallBuf(); - getVirtualCallAP(); + // getVirtualCallAP(); } From nicolas.geoffray at lip6.fr Wed Jan 7 15:17:50 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 07 Jan 2009 23:17:50 -0000 Subject: [vmkit-commits] [vmkit] r61897 - /vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Message-ID: <200901072317.n07NHoUn013671@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 7 17:17:50 2009 New Revision: 61897 URL: http://llvm.org/viewvc/llvm-project?rev=61897&view=rev Log: Implementation AccessibleObject functions since they are buggy in classpath 0.97.2. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=61897&r1=61896&r2=61897&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Wed Jan 7 17:17:50 2009 @@ -300,6 +300,16 @@ return res; } +extern "C" JavaObject* nativeGetAnnotation(JavaObject* obj) { + return 0; +} + +extern "C" JavaObject* nativeGetDeclaredAnnotations() { + Jnjvm* vm = JavaThread::get()->getJVM(); + UserClassArray* array = vm->upcalls->constructorArrayAnnotation; + return array->doNew(0, vm); +} + extern "C" void nativePropertiesPostInit(JavaObject* prop); @@ -681,5 +691,21 @@ "(Ljava/util/Properties;)V", ACC_STATIC); postProperties->setCompiledPtr((void*)(intptr_t)nativePropertiesPostInit, "nativePropertiesPostInit"); + + // Also implement these twos, implementation in GNU Classpath 0.97.2 is buggy. + JavaMethod* getAnnotation = + UPCALL_METHOD(loader, "java/lang/reflect/AccessibleObject", "getAnnotation", + "(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;", + ACC_VIRTUAL); + getAnnotation->setCompiledPtr((void*)(intptr_t)nativeGetAnnotation, + "nativeGetAnnotation"); + + JavaMethod* getAnnotations = + UPCALL_METHOD(loader, "java/lang/reflect/AccessibleObject", + "getDeclaredAnnotations", + "()[Ljava/lang/annotation/Annotation;", + ACC_VIRTUAL); + getAnnotations->setCompiledPtr((void*)(intptr_t)nativeGetDeclaredAnnotations, + "nativeGetDeclaredAnnotations"); } From nicolas.geoffray at lip6.fr Thu Jan 8 07:33:41 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 08 Jan 2009 15:33:41 -0000 Subject: [vmkit-commits] [vmkit] r61925 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaUpcalls.cpp JnjvmClassLoader.cpp JnjvmClassLoader.h Message-ID: <200901081533.n08FXgwU023021@zion.cs.uiuc.edu> Author: geoffray Date: Thu Jan 8 09:33:39 2009 New Revision: 61925 URL: http://llvm.org/viewvc/llvm-project?rev=61925&view=rev Log: Temporary hack to take into account llvm's inlining. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=61925&r1=61924&r2=61925&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Thu Jan 8 09:33:39 2009 @@ -293,8 +293,13 @@ BEGIN_NATIVE_EXCEPTION(0) JavaThread* th = JavaThread::get(); - UserClass* cl = th->getCallingClassLevel(index - 1); - if (cl) res = cl->getClassDelegatee(th->getJVM()); + Jnjvm* vm = th->getJVM(); + // Temporary hack because we know llvm inlines a call in the call stack + // to this function. And this function is called only in places that + // we know. + index = vm->bootstrapLoader->nativeHandle ? index - 2 : index - 1; + UserClass* cl = th->getCallingClassLevel(index); + if (cl) res = cl->getClassDelegatee(vm); END_NATIVE_EXCEPTION return res; Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=61925&r1=61924&r2=61925&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Thu Jan 8 09:33:39 2009 @@ -162,10 +162,10 @@ // Now that native types have been loaded, try to find if we have a // pre-compiled rt.jar - void* handle = dlopen(BOOTLIBNAME, RTLD_LAZY | RTLD_GLOBAL); - if (handle) { + nativeHandle = dlopen(BOOTLIBNAME, RTLD_LAZY | RTLD_GLOBAL); + if (nativeHandle) { // Found it! - SuperArray = (Class*)dlsym(handle, "java.lang.Object"); + SuperArray = (Class*)dlsym(nativeHandle, "java.lang.Object"); if (SuperArray) { ClassArray::SuperArray = (Class*)SuperArray->getInternal(); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=61925&r1=61924&r2=61925&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Thu Jan 8 09:33:39 2009 @@ -332,6 +332,10 @@ virtual JavaString* UTF8ToStr(const UTF8* utf8); + /// nativeHandle - Non-null handle if boot classes were static compiled in + /// a dynamic library + /// + void* nativeHandle; /// upcalls - Upcall classes, fields and methods so that C++ code can call /// Java code. From nicolas.geoffray at lip6.fr Thu Jan 8 13:02:34 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 08 Jan 2009 21:02:34 -0000 Subject: [vmkit-commits] [vmkit] r61945 - in /vmkit/trunk: Makefile.rules tools/vmjc/libvmjc/ tools/vmjc/libvmjc/Makefile Message-ID: <200901082102.n08L2Y4c002817@zion.cs.uiuc.edu> Author: geoffray Date: Thu Jan 8 15:02:33 2009 New Revision: 61945 URL: http://llvm.org/viewvc/llvm-project?rev=61945&view=rev Log: Add a Makefile for compiling libvmjc.so. Added: vmkit/trunk/tools/vmjc/libvmjc/ vmkit/trunk/tools/vmjc/libvmjc/Makefile (with props) Modified: vmkit/trunk/Makefile.rules Modified: vmkit/trunk/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.rules?rev=61945&r1=61944&r2=61945&view=diff ============================================================================== --- vmkit/trunk/Makefile.rules (original) +++ vmkit/trunk/Makefile.rules Thu Jan 8 15:02:33 2009 @@ -39,17 +39,34 @@ VMJC := $(ToolDir)/vmjc$(EXEEXT) endif -vmjclib : + +ifdef VMJC_ASSEMBLY + +.PRECIOUS: glibj.zip.s + +glibj.zip.s : $(LOPT) $(LLC) $(VMJC) + + +glibj.zip.bc : + $(Echo) "Compiling glibj.zip to llvm" $(Verb) if test -d $(GLIBJ); then \ - $(Verb) $(VMJC) -f -std-compile-opts $(GLIBJ)/glibj.zip -o glibj.zip.bc; \ + $(VMJC) -f -std-compile-opts $(GLIBJ)/glibj.zip -o glibj.zip.bc; \ else \ - $(Verb) $(VMJC) -f -std-compile-opts $(GLIBJ) -o glibj.zip.bc; \ - fi - $(Verb) if test -f glibj.zip.bc; then \ - $(LOPT) -std-compile-opts -f glibj.zip.bc -o glibj-optimized.zip.bc; \ - $(Verb) $(LLC) -disable-fp-elim -f glibj-optimized.zip.bc; \ - $(Verb) $(CC) -fPIC -c glibj-optimized.zip.s; \ - $(Verb) $(CC) -shared -o libvmjc.so glibj-optimized.zip.o; \ - $(RM) -f glibj.zip.bc glibj-optimized.zip.bc glibj-optimized.zip.s; \ - $(RM) -f glibj-optimized.zip.o; \ + $(VMJC) -f -std-compile-opts $(GLIBJ) -o glibj.zip.bc; \ fi + +glibj-optimized.zip.bc : glibj.zip.bc + $(Echo) "Optimizing glibj.zip" + $(Verb) $(LOPT) -std-compile-opts -f glibj.zip.bc -o glibj-optimized.zip.bc + +glibj.zip.s : glibj-optimized.zip.bc + $(Echo) "Compiling glibj.zip.bc to native" + $(Verb) $(LLC) -disable-fp-elim -f glibj-optimized.zip.bc -o glibj.zip.s + +$(ObjDir)/%.lo $(ObjDir)/%.o: %.s $(ObjDir)/.dir $(BUILT_SOURCES) + $(Echo) "Compiling $*.s for $(BuildMode) build " $(PIC_FLAG) + $(Verb) $(MAYBE_PIC_Compile.CXX) $(DEPEND_OPTIONS) $< -o $(ObjDir)/$*.o + +clean-local:: + $(Verb) $(RM) -f glibj.zip.s glibj.zip.bc glibj-optimized.zip.bc +endif Added: vmkit/trunk/tools/vmjc/libvmjc/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmjc/libvmjc/Makefile?rev=61945&view=auto ============================================================================== --- vmkit/trunk/tools/vmjc/libvmjc/Makefile (added) +++ vmkit/trunk/tools/vmjc/libvmjc/Makefile Thu Jan 8 15:02:33 2009 @@ -0,0 +1,23 @@ +##===- tools/vmjc/libvmjc/Makefile -------------------------*- Makefile -*-===## +# +# The VMKit project +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## +LEVEL = ../../.. + + +LEVEL = ../../.. + +include $(LEVEL)/Makefile.config + +LIBRARYNAME = libvmjc +LOADABLE_MODULE = 1 +VMJC_ASSEMBLY = 1 +BUILT_SOURCES = glibj.zip.s + +SOURCES = glibj.zip.s + +include $(LEVEL)/Makefile.common Propchange: vmkit/trunk/tools/vmjc/libvmjc/Makefile ------------------------------------------------------------------------------ svn:eol-style = native Propchange: vmkit/trunk/tools/vmjc/libvmjc/Makefile ------------------------------------------------------------------------------ svn:executable = * From nicolas.geoffray at lip6.fr Thu Jan 8 14:48:45 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 08 Jan 2009 22:48:45 -0000 Subject: [vmkit-commits] [vmkit] r61952 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901082248.n08MmjRR013044@zion.cs.uiuc.edu> Author: geoffray Date: Thu Jan 8 16:48:45 2009 New Revision: 61952 URL: http://llvm.org/viewvc/llvm-project?rev=61952&view=rev Log: Also output the name of external VTs too. 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=61952&r1=61951&r2=61952&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Thu Jan 8 16:48:45 2009 @@ -426,7 +426,9 @@ // modify it. GlobalVariable* varGV = new GlobalVariable(ATy, false, GlobalValue::ExternalLinkage, - 0, "", this); + 0, + classDef->printString(""), + this); res = ConstantExpr::getCast(Instruction::BitCast, varGV, VTType); virtualTables.insert(std::make_pair(classDef, res)); From nicolas.geoffray at lip6.fr Fri Jan 9 03:49:29 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 09 Jan 2009 11:49:29 -0000 Subject: [vmkit-commits] [vmkit] r61987 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901091149.n09BnU41018566@zion.cs.uiuc.edu> Author: geoffray Date: Fri Jan 9 05:49:21 2009 New Revision: 61987 URL: http://llvm.org/viewvc/llvm-project?rev=61987&view=rev Log: Fix linkage of global variables. 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=61987&r1=61986&r2=61987&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Fri Jan 9 05:49:21 2009 @@ -155,7 +155,7 @@ const llvm::Type* Ty = JavaClassArrayType; GlobalVariable* varGV = - new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage, + new GlobalVariable(Ty, false, GlobalValue::InternalLinkage, Constant::getNullValue(Ty), "", this); arrayClasses.insert(std::make_pair((ClassArray*)classDef, varGV)); @@ -182,9 +182,10 @@ constant_pool_iterator End = constantPools.end(); constant_pool_iterator I = constantPools.find(ctp); if (I == End) { - varGV = new GlobalVariable(ConstantPoolType->getContainedType(0), false, - GlobalValue::ExternalLinkage, - 0, "", this); + const Type* Ty = ConstantPoolType->getContainedType(0); + varGV = new GlobalVariable(Ty, false, + GlobalValue::InternalLinkage, + Constant::getNullValue(Ty), "", this); constantPools.insert(std::make_pair(ctp, varGV)); return varGV; } else { @@ -244,7 +245,7 @@ const llvm::Type* Ty = LCI->getVirtualType(); GlobalVariable* varGV = new GlobalVariable(Ty->getContainedType(0), false, - GlobalValue::ExternalLinkage, + GlobalValue::InternalLinkage, 0, "", this); Constant* res = ConstantExpr::getCast(Instruction::BitCast, varGV, JavaObjectType); @@ -269,7 +270,7 @@ } else { GlobalVariable* varGV = new GlobalVariable(EnveloppeType->getContainedType(0), false, - GlobalValue::ExternalLinkage, 0, "", this); + GlobalValue::InternalLinkage, 0, "", this); enveloppes.insert(std::make_pair(enveloppe, varGV)); Constant* C = CreateConstantFromEnveloppe(enveloppe); @@ -295,7 +296,7 @@ GlobalVariable* varGV = new GlobalVariable(Ty->getContainedType(0), false, - GlobalValue::ExternalLinkage, 0, "", this); + GlobalValue::InternalLinkage, 0, "", this); Constant* res = ConstantExpr::getCast(Instruction::BitCast, varGV, JavaObjectType); @@ -542,8 +543,8 @@ } Function* func = Function::Create(JnjvmModule::MarkAndTraceType, - GlobalValue::ExternalLinkage, - "markAndTraceObject", + GlobalValue::InternalLinkage, + "", this); Constant* zero = mvm::MvmModule::constantZero; @@ -1228,7 +1229,7 @@ if (I == End) { Constant* C = CreateConstantFromUTF8(val); GlobalVariable* varGV = new GlobalVariable(C->getType(), true, - GlobalValue::ExternalLinkage, + GlobalValue::InternalLinkage, C, "", this); Constant* res = ConstantExpr::getCast(Instruction::BitCast, varGV, @@ -1496,8 +1497,16 @@ char* buf = (char*)alloca(3 + JNI_NAME_PRE_LEN + 1 + ((mnlen + clen + mtlen) << 1)); - methodDef->jniConsFromMethOverloaded(buf + 1); - memcpy(buf, "JnJVM", 5); + bool jnjvm = false; + if (isNative(methodDef->access)) { + // Verify if it's defined by JnJVM + JCL->nativeLookup(methodDef, jnjvm, buf); + } + + if (!jnjvm) { + methodDef->jniConsFromMethOverloaded(buf + 1); + memcpy(buf, "JnJVM", 5); + } methodFunction = Function::Create(getFunctionType(), GlobalValue::GhostLinkage, buf, Mod); @@ -1645,7 +1654,7 @@ Function* res = Function::Create(virt ? getVirtualBufType() : getStaticBufType(), - GlobalValue::ExternalLinkage, name, Mod); + GlobalValue::InternalLinkage, name, Mod); BasicBlock* currentBlock = BasicBlock::Create("enter", res); Function::arg_iterator i = res->arg_begin(); @@ -1703,7 +1712,7 @@ Function* res = Function::Create(virt ? getVirtualBufType() : getStaticBufType(), - GlobalValue::ExternalLinkage, name, Mod); + GlobalValue::InternalLinkage, name, Mod); BasicBlock* currentBlock = BasicBlock::Create("enter", res); Function::arg_iterator i = res->arg_begin(); @@ -2324,12 +2333,6 @@ void JnjvmModule::CreateStaticInitializer() { - // Set the linkage of all functions to External, so that the printer does - // not complain. - for (Module::iterator i = begin(), e = end(); i != e; ++i) { - i->setLinkage(GlobalValue::ExternalLinkage); - } - std::vector llvmArgs; llvmArgs.push_back(ptrType); // class loader llvmArgs.push_back(JavaCommonClassType); // cl From nicolas.geoffray at lip6.fr Sun Jan 11 13:41:22 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 11 Jan 2009 21:41:22 -0000 Subject: [vmkit-commits] [vmkit] r62050 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Message-ID: <200901112141.n0BLfMxp016846@zion.cs.uiuc.edu> Author: geoffray Date: Sun Jan 11 15:41:22 2009 New Revision: 62050 URL: http://llvm.org/viewvc/llvm-project?rev=62050&view=rev Log: Still provide an external static callback when static compiling. 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=62050&r1=62049&r2=62050&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Sun Jan 11 15:41:22 2009 @@ -150,8 +150,13 @@ func = Function::Create(type, GlobalValue::GhostLinkage, key, TheModule); } else { const llvm::FunctionType* type = LSI->getStaticType(); - func = Function::Create(type, GlobalValue::GhostLinkage, "staticCallback", - TheModule); + if (M->isStaticCompiling()) { + func = Function::Create(type, GlobalValue::ExternalLinkage, "staticCallback", + TheModule); + } else { + func = Function::Create(type, GlobalValue::GhostLinkage, "staticCallback", + TheModule); + } } ++nbCallbacks; From nicolas.geoffray at lip6.fr Sun Jan 11 13:43:38 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 11 Jan 2009 21:43:38 -0000 Subject: [vmkit-commits] [vmkit] r62051 - in /vmkit/trunk/lib/JnJVM/VMCore: Jnjvm.cpp Jnjvm.h JnjvmClassLoader.cpp JnjvmClassLoader.h Message-ID: <200901112143.n0BLhcCV016939@zion.cs.uiuc.edu> Author: geoffray Date: Sun Jan 11 15:43:38 2009 New Revision: 62051 URL: http://llvm.org/viewvc/llvm-project?rev=62051&view=rev Log: Initial support for main application loading as a .so. Modified: 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/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=62051&r1=62050&r2=62051&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Sun Jan 11 15:43:38 2009 @@ -541,7 +541,7 @@ void ClArgumentsInfo::extractClassFromJar(Jnjvm* vm, int argc, char** argv, int i) { - char* jarFile = argv[i]; + jarFile = argv[i]; uint32 size = 2 + strlen(vm->classpath) + strlen(jarFile); char* temp = (char*)vm->allocator.Allocate(size); @@ -761,6 +761,10 @@ upcalls->getSystemClassLoader->invokeJavaObjectStatic(this, cl); appClassLoader = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, this); + if (argumentsInfo.jarFile) + appClassLoader->loadLibFromJar(this, argumentsInfo.jarFile, + argumentsInfo.className); + else appClassLoader->loadLibFromFile(this, argumentsInfo.className); } return appClassLoader; } @@ -1057,32 +1061,7 @@ hashStr.insert(*i); } - ClassMap* classes = bootstrapLoader->getClasses(); - JnjvmModule* M = bootstrapLoader->getModule(); - for (ClassMap::iterator i = classes->map.begin(), e = classes->map.end(); - i != e; ++i) { - CommonClass* cl = i->second; - if (cl->isClass()) { - Class* C = cl->asClass(); - - for (uint32 i = 0; i < C->nbVirtualMethods; ++i) { - JavaMethod& meth = C->virtualMethods[i]; - if (!isAbstract(meth.access) && meth.code) { - addMethodInFunctionMap(&meth, meth.code); - M->setMethod(&meth, meth.code, ""); - } - } - - for (uint32 i = 0; i < C->nbStaticMethods; ++i) { - JavaMethod& meth = C->staticMethods[i]; - if (!isAbstract(meth.access) && meth.code) { - addMethodInFunctionMap(&meth, meth.code); - M->setMethod(&meth, meth.code, ""); - } - } - } - } - + bootstrapLoader->insertAllMethodsInVM(this); #ifdef ISOLATE IsolateLock.lock(); Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=62051&r1=62050&r2=62051&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Sun Jan 11 15:43:38 2009 @@ -86,6 +86,7 @@ char** argv; uint32 appArgumentsPos; char* className; + char* jarFile; std::vector< std::pair > agents; void readArgs(Jnjvm *vm); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=62051&r1=62050&r2=62051&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Sun Jan 11 15:43:38 2009 @@ -9,6 +9,8 @@ #include #include + +// for strrchr #include // for dlopen and dlsym @@ -23,10 +25,10 @@ #if defined(__MACH__) #define SELF_HANDLE RTLD_DEFAULT -#define BOOTLIBNAME "libvmjc.dylib" +#define DYLD_EXTENSION ".dylib" #else #define SELF_HANDLE 0 -#define BOOTLIBNAME "libvmjc.so" +#define DYLD_EXTENSION ".so" #endif #include "debug.h" @@ -162,7 +164,7 @@ // Now that native types have been loaded, try to find if we have a // pre-compiled rt.jar - nativeHandle = dlopen(BOOTLIBNAME, RTLD_LAZY | RTLD_GLOBAL); + nativeHandle = dlopen("libvmjc"DYLD_EXTENSION, RTLD_LAZY | RTLD_GLOBAL); if (nativeHandle) { // Found it! SuperArray = (Class*)dlsym(nativeHandle, "java.lang.Object"); @@ -948,6 +950,66 @@ return res; } +void JnjvmClassLoader::insertAllMethodsInVM(Jnjvm* vm) { + JnjvmModule* M = getModule(); + for (ClassMap::iterator i = classes->map.begin(), e = classes->map.end(); + i != e; ++i) { + CommonClass* cl = i->second; + if (cl->isClass()) { + Class* C = cl->asClass(); + + for (uint32 i = 0; i < C->nbVirtualMethods; ++i) { + JavaMethod& meth = C->virtualMethods[i]; + if (!isAbstract(meth.access) && meth.code) { + vm->addMethodInFunctionMap(&meth, meth.code); + M->setMethod(&meth, meth.code, ""); + } + } + + for (uint32 i = 0; i < C->nbStaticMethods; ++i) { + JavaMethod& meth = C->staticMethods[i]; + if (!isAbstract(meth.access) && meth.code) { + vm->addMethodInFunctionMap(&meth, meth.code); + M->setMethod(&meth, meth.code, ""); + } + } + } + } +} + +void JnjvmClassLoader::loadLibFromJar(Jnjvm* vm, const char* name, + const char* file) { + + char* soName = (char*)alloca(strlen(name) + strlen(DYLD_EXTENSION)); + char* ptr = strrchr(name, '/'); + sprintf(soName, "%s%s", ptr ? ptr + 1 : name, DYLD_EXTENSION); + void* handle = dlopen(soName, RTLD_LAZY | RTLD_LOCAL); + if (handle) { + Class* cl = (Class*)dlsym(handle, file); + if (cl) { + static_init_t init = (static_init_t)(uintptr_t)cl->classLoader; + assert(init && "Loaded the wrong library"); + init(this); + insertAllMethodsInVM(vm); + } + } +} + +void JnjvmClassLoader::loadLibFromFile(Jnjvm* vm, const char* name) { + assert(classes->map.size() == 0); + char* soName = (char*)alloca(strlen(name) + strlen(DYLD_EXTENSION)); + sprintf(soName, "%s%s", name, DYLD_EXTENSION); + void* handle = dlopen(soName, RTLD_LAZY | RTLD_LOCAL); + if (handle) { + Class* cl = (Class*)dlsym(handle, name); + if (cl) { + static_init_t init = (static_init_t)(uintptr_t)cl->classLoader; + init(this); + insertAllMethodsInVM(vm); + } + } +} + // Extern "C" functions called by the vmjc static intializer. extern "C" void vmjcAddPreCompiledClass(JnjvmClassLoader* JCL, Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=62051&r1=62050&r2=62051&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Sun Jan 11 15:43:38 2009 @@ -266,6 +266,22 @@ /// JnJVM. /// intptr_t nativeLookup(JavaMethod* meth, bool& jnjvm, char* buf); + + /// insertAllMethodsInVM - Insert all methods defined by this class loader + /// in the VM. + /// + void insertAllMethodsInVM(Jnjvm* vm); + + /// loadLibFromJar - Try to load the shared library compiled by vmjc with + /// this jar file. + /// + void loadLibFromJar(Jnjvm* vm, const char* name, const char* file); + + /// loadLibFromFile - Try to load the shared library compiled by vmjc with + /// this class file. + /// + void loadLibFromFile(Jnjvm* vm, const char* name); + }; /// JnjvmBootstrapLoader - This class is for the bootstrap class loader, which From nicolas.geoffray at lip6.fr Mon Jan 12 01:30:20 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 12 Jan 2009 09:30:20 -0000 Subject: [vmkit-commits] [vmkit] r62086 - in /vmkit/trunk/lib/JnJVM/VMCore: Jnjvm.cpp JnjvmModule.cpp JnjvmModule.h Message-ID: <200901120930.n0C9UKwY017638@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 12 03:30:20 2009 New Revision: 62086 URL: http://llvm.org/viewvc/llvm-project?rev=62086&view=rev Log: Do not create llvm::Function when resolving a class in static compilation, but rather do it when creating the llvm::GlobalVariables. Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=62086&r1=62085&r2=62086&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Mon Jan 12 03:30:20 2009 @@ -1181,7 +1181,6 @@ Class* cl = *i; cl->resolveClass(); cl->setOwnerClass(JavaThread::get()); - M->makeVT(cl); } for (std::vector::iterator i = classes.begin(), e = classes.end(); @@ -1195,7 +1194,6 @@ const UTF8* utf8 = bootstrapLoader->asciizConstructUTF8(name); UserClass* cl = bootstrapLoader->loadName(utf8, true, true); cl->setOwnerClass(JavaThread::get()); - M->makeVT(cl); compileClass(cl); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=62086&r1=62085&r2=62086&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Jan 12 03:30:20 2009 @@ -435,11 +435,7 @@ virtualTables.insert(std::make_pair(classDef, res)); if (isCompiling(classDef)) { - Function* Finalizer = ((Function**)classDef->virtualVT)[0]; - Function* Tracer = LCI->getVirtualTracer(); - Constant* C = CreateConstantFromVT(classDef->virtualVT, - classDef->virtualTableSize, - Finalizer, Tracer); + Constant* C = CreateConstantFromVT(classDef); varGV->setInitializer(C); } @@ -488,7 +484,7 @@ } #ifndef WITHOUT_VTABLE -VirtualTable* JnjvmModule::allocateVT(Class* cl) { +void JnjvmModule::allocateVT(Class* cl) { for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) { JavaMethod& meth = cl->virtualMethods[i]; if (meth.name->equals(cl->classLoader->bootstrapLoader->finalize)) { @@ -522,8 +518,8 @@ } else { VT = JavaObjectVT; } + cl->virtualVT = VT; - return VT; } #endif @@ -565,8 +561,12 @@ } else { LLVMClassInfo* LCP = (LLVMClassInfo*)getClassInfo((Class*)(cl->super)); - CallInst::Create(LCP->getVirtualTracer(), Args.begin(), - Args.end(), "", block); + Function* F = LCP->virtualTracerFunction; + assert((isStaticCompiling() || F) && "No Tracer for super!"); + if (!F && isStaticCompiling()) { + F = makeTracer(cl->super, false); + } + CallInst::Create(F, Args.begin(), Args.end(), "", block); } } @@ -1242,9 +1242,9 @@ } } -Constant* JnjvmModule::CreateConstantFromVT(VirtualTable* VT, uint32 size, - Function* Finalizer, - Function* Tracer) { +Constant* JnjvmModule::CreateConstantFromVT(Class* classDef) { + uint32 size = classDef->virtualTableSize; + VirtualTable* VT = classDef->virtualVT; const ArrayType* ATy = dyn_cast(VTType->getContainedType(0)); const PointerType* PTy = dyn_cast(ATy->getContainedType(0)); ATy = ArrayType::get(PTy, size); @@ -1253,19 +1253,24 @@ std::vector Elemts; // Destructor + JavaMethod* meth = ((JavaMethod**)VT)[0]; + LLVMMethodInfo* LMI = getMethodInfo(meth); + Function* Finalizer = LMI->getMethod(); Elemts.push_back(Finalizer ? ConstantExpr::getCast(Instruction::BitCast, Finalizer, PTy) : N); Elemts.push_back(N); // Delete // Tracer + Function* Tracer = makeTracer(classDef, false); Elemts.push_back(Tracer ? ConstantExpr::getCast(Instruction::BitCast, Tracer, PTy) : N); Elemts.push_back(N); // Printer Elemts.push_back(N); // Hashcode for (uint32 i = VT_NB_FUNCS; i < size; ++i) { - Function* F = ((Function**)VT)[i]; - JavaMethod* meth = LLVMMethodInfo::get(F); + JavaMethod* meth = ((JavaMethod**)VT)[i]; + LLVMMethodInfo* LMI = getMethodInfo(meth); + Function* F = LMI->getMethod(); if (isAbstract(meth->access)) { Elemts.push_back(Constant::getNullValue(PTy)); } else { @@ -1298,65 +1303,66 @@ } // Allocate the virtual table. - VT = allocateVT(cl); + allocateVT(cl); + VT = cl->virtualVT; - // Fill the virtual table with function pointers. - ExecutionEngine* EE = mvm::MvmModule::executionEngine; - for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) { - JavaMethod& meth = cl->virtualMethods[i]; - LLVMMethodInfo* LMI = getMethodInfo(&meth); - Function* func = LMI->getMethod(); - - // Special handling for finalize method. Don't put a finalizer - // if there is none, or if it is empty. - if (meth.offset == 0 && !staticCompilation) { + if (!staticCompilation) { + // Fill the virtual table with function pointers. + ExecutionEngine* EE = mvm::MvmModule::executionEngine; + for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) { + JavaMethod& meth = cl->virtualMethods[i]; + LLVMMethodInfo* LMI = getMethodInfo(&meth); + Function* func = LMI->getMethod(); + + // Special handling for finalize method. Don't put a finalizer + // if there is none, or if it is empty. + if (meth.offset == 0 && !staticCompilation) { #ifdef ISOLATE_SHARING - ((void**)VT)[0] = 0; -#else - JnjvmClassLoader* loader = cl->classLoader; - Function* func = loader->getModuleProvider()->parseFunction(&meth); - if (!cl->super) { - meth.canBeInlined = true; ((void**)VT)[0] = 0; - } else { - Function::iterator BB = func->begin(); - BasicBlock::iterator I = BB->begin(); - if (isa(I)) { +#else + JnjvmClassLoader* loader = cl->classLoader; + Function* func = loader->getModuleProvider()->parseFunction(&meth); + if (!cl->super) { + meth.canBeInlined = true; ((void**)VT)[0] = 0; } else { - // LLVM does not allow recursive compilation. Create the code now. - ((void**)VT)[0] = EE->getPointerToFunction(func); + Function::iterator BB = func->begin(); + BasicBlock::iterator I = BB->begin(); + if (isa(I)) { + ((void**)VT)[0] = 0; + } else { + // LLVM does not allow recursive compilation. Create the code now. + ((void**)VT)[0] = EE->getPointerToFunction(func); + } } - } #endif - } - - if (staticCompilation) { - ((void**)VT)[meth.offset] = func; - } else { + } ((void**)VT)[meth.offset] = EE->getPointerToFunctionOrStub(func); } - } - - // If there is no super, then it's the first VT that we allocate. Assign - // this VT to native types. - if (!(cl->super)) { - ClassArray::initialiseVT(cl); - } -#endif - + #ifdef WITH_TRACER - llvm::Function* func = makeTracer(cl, false); + Function* func = makeTracer(cl, false); - if (staticCompilation) { - ((void**)VT)[VT_TRACER_OFFSET] = func; - } else { void* codePtr = mvm::MvmModule::executionEngine->getPointerToFunction(func); ((void**)VT)[VT_TRACER_OFFSET] = codePtr; func->deleteBody(); - } +#endif + + // If there is no super, then it's the first VT that we allocate. Assign + // this VT to native types. + if (!(cl->super)) { + ClassArray::initialiseVT(cl); + } + } else { + for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) { + JavaMethod& meth = cl->virtualMethods[i]; + ((void**)VT)[meth.offset] = &meth; + } + } + #endif + } @@ -1410,6 +1416,8 @@ Mod->executionEngine->addGlobalMapping(func, ptr); virtualTracerFunction = func; } + } else { + Mod->makeVT(classDef); } } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=62086&r1=62085&r2=62086&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Mon Jan 12 03:30:20 2009 @@ -179,7 +179,6 @@ }; class JnjvmModule : public mvm::MvmModule { - friend class Jnjvm; friend class LLVMClassInfo; private: std::map nativeClasses; @@ -234,7 +233,7 @@ llvm::Function* makeTracer(Class* cl, bool stat); void makeVT(Class* cl); - VirtualTable* allocateVT(Class* cl); + void allocateVT(Class* cl); static llvm::Constant* PrimitiveArrayVT; static llvm::Constant* ReferenceArrayVT; @@ -440,9 +439,7 @@ static llvm::Module* initialModule; //--------------- Static compiler specific functions -----------------------// - llvm::Constant* CreateConstantFromVT(VirtualTable* VT, uint32 size, - llvm::Function* Finalizer, - llvm::Function* Tracer); + llvm::Constant* CreateConstantFromVT(Class* classDef); llvm::Constant* CreateConstantFromUTF8(const UTF8* val); llvm::Constant* CreateConstantFromEnveloppe(Enveloppe* val); llvm::Constant* CreateConstantFromCacheNode(CacheNode* CN); From nicolas.geoffray at lip6.fr Mon Jan 12 02:18:02 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 12 Jan 2009 10:18:02 -0000 Subject: [vmkit-commits] [vmkit] r62087 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaJIT.cpp JnjvmClassLoader.cpp JnjvmModule.cpp Message-ID: <200901121018.n0CAI3Ac019924@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 12 04:17:53 2009 New Revision: 62087 URL: http://llvm.org/viewvc/llvm-project?rev=62087&view=rev Log: Give the method as a parameter to nativeLoad, not its name. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=62087&r1=62086&r2=62087&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Mon Jan 12 04:17:53 2009 @@ -296,20 +296,8 @@ Value* nativeFunc = module->getNativeFunction(compilingMethod, (void*)natPtr); if (module->isStaticCompiling()) { + Value* Arg = module->getMethodInClass(compilingMethod); - if (compilingClass->isNativeOverloaded(compilingMethod)) { - compilingMethod->jniConsFromMethOverloaded(functionName); - } else { - compilingMethod->jniConsFromMeth(functionName); - } - - Constant* Arg = ConstantArray::get(std::string(functionName), true); - GlobalVariable* GV = new GlobalVariable(Arg->getType(), true, - GlobalValue::InternalLinkage, Arg, - "", module); - Arg = ConstantExpr::getBitCast(GV, module->ptrType); - Value* Args[2] = { module->getNativeClass(compilingClass), Arg }; - // If the global variable is null, then load it. BasicBlock* unloadedBlock = createBasicBlock(""); BasicBlock* endBlock = createBasicBlock(""); @@ -322,8 +310,7 @@ BranchInst::Create(unloadedBlock, endBlock, cmp, currentBlock); currentBlock = unloadedBlock; - Value* res = CallInst::Create(module->NativeLoader, Args, Args + 2, "", - currentBlock); + Value* res = CallInst::Create(module->NativeLoader, Arg, "", currentBlock); res = new BitCastInst(res, Ty, "", currentBlock); new StoreInst(res, nativeFunc, currentBlock); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=62087&r1=62086&r2=62087&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Mon Jan 12 04:17:53 2009 @@ -1035,9 +1035,18 @@ JCL->strings.push_back(val); } -extern "C" intptr_t vmjcNativeLoader(UserClass* cl, const char* name) { +extern "C" intptr_t vmjcNativeLoader(JavaMethod* meth) { bool jnjvm = false; - intptr_t res = cl->classLoader->loadInLib(name, jnjvm); + const UTF8* jniConsClName = meth->classDef->name; + const UTF8* jniConsName = meth->name; + const UTF8* jniConsType = meth->type; + sint32 clen = jniConsClName->size; + sint32 mnlen = jniConsName->size; + sint32 mtlen = jniConsType->size; + + char* buf = (char*)alloca(3 + JNI_NAME_PRE_LEN + 1 + + ((mnlen + clen + mtlen) << 1)); + intptr_t res = meth->classDef->classLoader->nativeLookup(meth, jnjvm, buf); assert(res && "Could not find required native method"); return res; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=62087&r1=62086&r2=62087&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Jan 12 04:17:53 2009 @@ -2023,8 +2023,7 @@ "Init", this); llvmArgs.clear(); - llvmArgs.push_back(JavaClassType); - llvmArgs.push_back(ptrType); + llvmArgs.push_back(JavaMethodType); FTy = FunctionType::get(ptrType, llvmArgs, false); From nicolas.geoffray at lip6.fr Tue Jan 13 01:08:03 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 13 Jan 2009 09:08:03 -0000 Subject: [vmkit-commits] [vmkit] r62159 - /vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Message-ID: <200901130908.n0D983sa014871@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 13 03:08:02 2009 New Revision: 62159 URL: http://llvm.org/viewvc/llvm-project?rev=62159&view=rev Log: Move to now LLVM API. 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=62159&r1=62158&r2=62159&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/JIT.cpp (original) +++ vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Tue Jan 13 03:08:02 2009 @@ -233,7 +233,7 @@ uint64 MvmModule::getTypeSize(const llvm::Type* type) { - return executionEngine->getTargetData()->getABITypeSize(type); + return executionEngine->getTargetData()->getTypePaddedSize(type); } void MvmModule::runPasses(llvm::Function* func, From nicolas.geoffray at lip6.fr Tue Jan 13 01:59:20 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 13 Jan 2009 09:59:20 -0000 Subject: [vmkit-commits] [vmkit] r62161 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaUpcalls.cpp Jnjvm.cpp JnjvmModule.cpp JnjvmModule.h Message-ID: <200901130959.n0D9xLm8016996@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 13 03:59:14 2009 New Revision: 62161 URL: http://llvm.org/viewvc/llvm-project?rev=62161&view=rev Log: Remove hackish code for getCallerClass, and set the methods which call getCallerClass noinline. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=62161&r1=62160&r2=62161&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Tue Jan 13 03:59:14 2009 @@ -294,11 +294,7 @@ BEGIN_NATIVE_EXCEPTION(0) JavaThread* th = JavaThread::get(); Jnjvm* vm = th->getJVM(); - // Temporary hack because we know llvm inlines a call in the call stack - // to this function. And this function is called only in places that - // we know. - index = vm->bootstrapLoader->nativeHandle ? index - 2 : index - 1; - UserClass* cl = th->getCallingClassLevel(index); + UserClass* cl = th->getCallingClassLevel(index - 1); if (cl) res = cl->getClassDelegatee(vm); END_NATIVE_EXCEPTION Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=62161&r1=62160&r2=62161&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Tue Jan 13 03:59:14 2009 @@ -1206,6 +1206,24 @@ } catch(std::string str) { fprintf(stderr, "Error : %s\n", str.c_str()); } + +#define SET_INLINE(NAME) { \ + const UTF8* name = vm->asciizToUTF8(NAME); \ + Class* cl = (Class*)vm->bootstrapLoader->lookupClass(name); \ + if (cl) vm->bootstrapLoader->getModule()->setNoInline(cl); } + + SET_INLINE("java/util/concurrent/atomic/AtomicReferenceFieldUpdater") + SET_INLINE("java/util/concurrent/atomic/AtomicReferenceFieldUpdater" + "$AtomicReferenceFieldUpdaterImpl") + SET_INLINE("java/util/concurrent/atomic/AtomicIntegerFieldUpdater") + SET_INLINE("java/util/concurrent/atomic/AtomicIntegerFieldUpdater" + "$AtomicIntegerFieldUpdaterImpl") + SET_INLINE("java/util/concurrent/atomic/AtomicLongFieldUpdater") + SET_INLINE("java/util/concurrent/atomic/AtomicLongFieldUpdater" + "$CASUpdater") + SET_INLINE("java/util/concurrent/atomic/AtomicLongFieldUpdater" + "$LockedUpdater") +#undef SET_INLINE vm->threadSystem.nonDaemonLock.lock(); --(vm->threadSystem.nonDaemonThreads); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=62161&r1=62160&r2=62161&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Tue Jan 13 03:59:14 2009 @@ -2419,3 +2419,23 @@ ReturnInst::Create(currentBlock); } + +void JnjvmModule::setNoInline(Class* cl) { + for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) { + JavaMethod& meth = cl->virtualMethods[i]; + if (!isAbstract(meth.access)) { + LLVMMethodInfo* LMI = getMethodInfo(&meth); + Function* func = LMI->getMethod(); + func->addFnAttr(Attribute::NoInline); + } + } + + for (uint32 i = 0; i < cl->nbStaticMethods; ++i) { + JavaMethod& meth = cl->staticMethods[i]; + if (!isAbstract(meth.access)) { + LLVMMethodInfo* LMI = getMethodInfo(&meth); + Function* func = LMI->getMethod(); + func->addFnAttr(Attribute::NoInline); + } + } +} Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=62161&r1=62160&r2=62161&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Tue Jan 13 03:59:14 2009 @@ -434,6 +434,8 @@ bool isCompiling(const CommonClass* cl) const; void CreateStaticInitializer(); + + static void setNoInline(Class* cl); private: static llvm::Module* initialModule; From nicolas.geoffray at lip6.fr Tue Jan 13 02:18:35 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 13 Jan 2009 10:18:35 -0000 Subject: [vmkit-commits] [vmkit] r62162 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901131018.n0DAIaHC018594@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 13 04:18:30 2009 New Revision: 62162 URL: http://llvm.org/viewvc/llvm-project?rev=62162&view=rev Log: Output the static size in the Module. 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=62162&r1=62161&r2=62162&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Tue Jan 13 04:18:30 2009 @@ -2079,6 +2079,13 @@ (unsigned long long int) enveloppes.size()); fprintf(stderr, "Number of native functions : %llu\n", (unsigned long long int) nativeFunctions.size()); + fprintf(stderr, "----------------- Total size in .data ------------------\n"); + uint64 size = 0; + for (Module::const_global_iterator i = global_begin(), e = global_end(); + i != e; ++i) { + size += getTypeSize(i->getType()); + } + fprintf(stderr, "%lluB\n", (unsigned long long int)size); } From nicolas.geoffray at lip6.fr Tue Jan 13 14:20:42 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 13 Jan 2009 22:20:42 -0000 Subject: [vmkit-commits] [vmkit] r62188 - in /vmkit/trunk: lib/JnJVM/VMCore/JnjvmModule.cpp tools/vmjc/vmjc.cpp Message-ID: <200901132220.n0DMKg6H012719@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 13 16:20:42 2009 New Revision: 62188 URL: http://llvm.org/viewvc/llvm-project?rev=62188&view=rev Log: Set the target triple when static compiling. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/tools/vmjc/vmjc.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=62188&r1=62187&r2=62188&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Tue Jan 13 16:20:42 2009 @@ -2096,9 +2096,7 @@ JnjvmModule::JnjvmModule(const std::string &ModuleID, bool sc) : MvmModule(ModuleID) { - if (sc) { - setDataLayout(""); - } else { + if (!sc) { std::string str = executionEngine->getTargetData()->getStringRepresentation(); setDataLayout(str); Modified: vmkit/trunk/tools/vmjc/vmjc.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmjc/vmjc.cpp?rev=62188&r1=62187&r2=62188&view=diff ============================================================================== --- vmkit/trunk/tools/vmjc/vmjc.cpp (original) +++ vmkit/trunk/tools/vmjc/vmjc.cpp Tue Jan 13 16:20:42 2009 @@ -17,8 +17,9 @@ #include "llvm/Module.h" #include "llvm/PassManager.h" -#include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Assembly/PrintModulePass.h" +#include "llvm/Config/config.h" +#include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MemoryBuffer.h" @@ -69,6 +70,10 @@ StandardCompileOpts("std-compile-opts", cl::desc("Include the standard compile time optimizations")); +static cl::opt +TargetTriple("mtriple", cl::desc("Override target triple for module")); + + inline void addPass(FunctionPassManager *PM, Pass *P) { // Add the pass to the pass manager... PM->add(P); @@ -134,6 +139,13 @@ Collector::enable(0); mvm::CompilationUnit* CU = mvm::VirtualMachine::initialiseJVM(true); + + if (!TargetTriple.empty()) + CU->TheModule->setTargetTriple(TargetTriple); + else + CU->TheModule->setTargetTriple(LLVM_HOSTTRIPLE); + + addCommandLinePass(CU, argv); mvm::VirtualMachine* vm = mvm::VirtualMachine::createJVM(CU); vm->compile(InputFilename.c_str()); From nicolas.geoffray at lip6.fr Wed Jan 14 02:20:34 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 14 Jan 2009 10:20:34 -0000 Subject: [vmkit-commits] [vmkit] r62215 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Message-ID: <200901141020.n0EAKZAG015129@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 14 04:20:15 2009 New Revision: 62215 URL: http://llvm.org/viewvc/llvm-project?rev=62215&view=rev Log: Get rid of vmjcLoadClass, it's not used anymore. And add a staticCallback function, in case the static compiler had to add one. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=62215&r1=62214&r2=62215&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Wed Jan 14 04:20:15 2009 @@ -1023,10 +1023,6 @@ *ptr = JCL->constructArray(name); } -extern "C" void vmjcLoadClass(JnjvmClassLoader* JCL, const UTF8* name) { - JCL->loadName(name, true, true); -} - extern "C" void vmjcAddUTF8(JnjvmClassLoader* JCL, const UTF8* val) { JCL->hashUTF8->insert(val); } @@ -1050,3 +1046,8 @@ assert(res && "Could not find required native method"); return res; } + +extern "C" void staticCallback() { + fprintf(stderr, "Implement me"); + abort(); +} From nicolas.geoffray at lip6.fr Wed Jan 14 02:22:47 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 14 Jan 2009 10:22:47 -0000 Subject: [vmkit-commits] [vmkit] r62216 - /vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Message-ID: <200901141022.n0EAMmDJ015214@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 14 04:22:37 2009 New Revision: 62216 URL: http://llvm.org/viewvc/llvm-project?rev=62216&view=rev Log: ANEWARRAY references a class and then get the class array. When static compiling, we weren't looking if the the class array was external. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp?rev=62216&r1=62215&r2=62216&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Wed Jan 14 04:22:37 2009 @@ -1855,11 +1855,21 @@ JnjvmClassLoader* JCL = cl->classLoader; const UTF8* arrayName = JCL->constructArrayName(1, cl->name); - UserCommonClass* dcl = JCL->constructArray(arrayName); + UserClassArray* dcl = JCL->constructArray(arrayName); valCl = module->getNativeClass(dcl); - if (valCl->getType() != module->JavaCommonClassType) + + // If we're static compiling and the class is not a class we + // are compiling, the result of getNativeClass is a pointer to + // the class. Load it. + if (module->isStaticCompiling() && + valCl->getType() != module->JavaClassArrayType) { + valCl = new LoadInst(valCl, "", currentBlock); + } + + if (valCl->getType() != module->JavaCommonClassType) { valCl = new BitCastInst(valCl, module->JavaCommonClassType, "", currentBlock); + } } else { const llvm::Type* Ty = From nicolas.geoffray at lip6.fr Wed Jan 14 02:25:24 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 14 Jan 2009 10:25:24 -0000 Subject: [vmkit-commits] [vmkit] r62217 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901141025.n0EAPOPx015351@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 14 04:25:22 2009 New Revision: 62217 URL: http://llvm.org/viewvc/llvm-project?rev=62217&view=rev Log: Bugfix for creating the tracer, and do not call vmjcLoadClass anymore in the static initializer. 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=62217&r1=62216&r2=62217&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan 14 04:25:22 2009 @@ -562,9 +562,13 @@ } else { LLVMClassInfo* LCP = (LLVMClassInfo*)getClassInfo((Class*)(cl->super)); Function* F = LCP->virtualTracerFunction; - assert((isStaticCompiling() || F) && "No Tracer for super!"); - if (!F && isStaticCompiling()) { - F = makeTracer(cl->super, false); + if (!F) { + if (isStaticCompiling()) { + F = makeTracer(cl->super, false); + } else { + F = LCP->getVirtualTracer(); + } + assert(F && "Still no virtual tracer for super"); } CallInst::Create(F, Args.begin(), Args.end(), "", block); } @@ -2362,14 +2366,6 @@ Function* GetClassArray = Function::Create(FTy, GlobalValue::ExternalLinkage, "vmjcGetClassArray", this); - llvmArgs.clear(); - llvmArgs.push_back(ptrType); // class loader - llvmArgs.push_back(UTF8Type); // name - FTy = FunctionType::get(Type::VoidTy, llvmArgs, false); - - Function* LoadClass = Function::Create(FTy, GlobalValue::ExternalLinkage, - "vmjcLoadClass", this); - BasicBlock* currentBlock = BasicBlock::Create("enter", StaticInitializer); Function::arg_iterator loader = StaticInitializer->arg_begin(); @@ -2402,15 +2398,6 @@ } } - for (native_class_iterator i = nativeClasses.begin(), - e = nativeClasses.end(); i != e; ++i) { - if (!isCompiling(i->first)) { - Args[0] = loader; - Args[1] = getUTF8(i->first->name); - CallInst::Create(LoadClass, Args, Args + 2, "", currentBlock); - } - } - for (array_class_iterator i = arrayClasses.begin(), e = arrayClasses.end(); i != e; ++i) { if (!(i->first->baseClass()->isPrimitive())) { From nicolas.geoffray at lip6.fr Wed Jan 14 03:19:44 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 14 Jan 2009 11:19:44 -0000 Subject: [vmkit-commits] [vmkit] r62218 - in /vmkit/trunk: include/mvm/JIT.h lib/JnJVM/VMCore/JnjvmClassLoader.cpp lib/JnJVM/VMCore/JnjvmModule.cpp lib/JnJVM/VMCore/JnjvmModuleProvider.cpp lib/JnJVM/VMCore/LowerConstantCalls.cpp lib/Mvm/Runtime/JIT.cpp lib/N3/Mono/MonoString.cpp lib/N3/PNetLib/PNetString.cpp lib/N3/VMCore/CLIRuntimeJIT.cpp tools/vmjc/vmjc.cpp tools/vmkit/Launcher.cpp Message-ID: <200901141119.n0EBJkx3017084@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 14 05:19:27 2009 New Revision: 62218 URL: http://llvm.org/viewvc/llvm-project?rev=62218&view=rev Log: Fix includes. Modified: vmkit/trunk/include/mvm/JIT.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp vmkit/trunk/lib/Mvm/Runtime/JIT.cpp vmkit/trunk/lib/N3/Mono/MonoString.cpp vmkit/trunk/lib/N3/PNetLib/PNetString.cpp vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp vmkit/trunk/tools/vmjc/vmjc.cpp vmkit/trunk/tools/vmkit/Launcher.cpp Modified: vmkit/trunk/include/mvm/JIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/JIT.h?rev=62218&r1=62217&r2=62218&view=diff ============================================================================== --- vmkit/trunk/include/mvm/JIT.h (original) +++ vmkit/trunk/include/mvm/JIT.h Wed Jan 14 05:19:27 2009 @@ -11,19 +11,24 @@ #define MVM_JIT_H #include +#include -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Function.h" #include "llvm/Module.h" -#include "llvm/ModuleProvider.h" -#include "llvm/PassManager.h" -#include "llvm/Type.h" -#include "llvm/ExecutionEngine/ExecutionEngine.h" -#include "llvm/Target/TargetData.h" #include "types.h" +namespace llvm { + class Constant; + class ConstantFP; + class ConstantInt; + class ExecutionEngine; + class ExistingModuleProvider; + class Function; + class FunctionPassManager; + class PointerType; + class Type; +} + namespace mvm { class LockNormal; @@ -104,7 +109,6 @@ static mvm::LockNormal protectEngine; static uint64 getTypeSize(const llvm::Type* type); - static void AddStandardCompilePasses(llvm::FunctionPassManager*); static void runPasses(llvm::Function* func, llvm::FunctionPassManager*); static void initialise(bool Fast = false); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=62218&r1=62217&r2=62218&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Wed Jan 14 05:19:27 2009 @@ -33,6 +33,9 @@ #include "debug.h" +// TODO: get rid of that +#include "llvm/PassManager.h" + #include "mvm/Allocator.h" #include "Classpath.h" @@ -68,7 +71,6 @@ TheModule = new JnjvmModule("Bootstrap JnJVM", staticCompilation); TheModuleProvider = new JnjvmModuleProvider(getModule()); FunctionPasses = new FunctionPassManager(TheModuleProvider); - FunctionPasses->add(new TargetData(TheModule)); hashUTF8 = new(allocator) UTF8Map(allocator, 0); classes = new(allocator) ClassMap(); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=62218&r1=62217&r2=62218&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan 14 05:19:27 2009 @@ -10,8 +10,10 @@ #include "llvm/BasicBlock.h" #include "llvm/CallingConv.h" #include "llvm/Constants.h" +#include "llvm/ExecutionEngine/ExecutionEngine.h" #include "llvm/Instructions.h" #include "llvm/Support/MutexGuard.h" +#include "llvm/Target/TargetData.h" #include "mvm/JIT.h" Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=62218&r1=62217&r2=62218&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Wed Jan 14 05:19:27 2009 @@ -8,7 +8,10 @@ //===----------------------------------------------------------------------===// #include "llvm/LinkAllPasses.h" +#include "llvm/PassManager.h" +#include "llvm/ExecutionEngine/ExecutionEngine.h" #include "llvm/Support/MutexGuard.h" +#include "llvm/Target/TargetData.h" #include "mvm/JIT.h" Modified: vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=62218&r1=62217&r2=62218&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Wed Jan 14 05:19:27 2009 @@ -7,7 +7,7 @@ // //===----------------------------------------------------------------------===// - +#include "llvm/Constants.h" #include "llvm/Pass.h" #include "llvm/Function.h" #include "llvm/Instructions.h" Modified: vmkit/trunk/lib/Mvm/Runtime/JIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/JIT.cpp?rev=62218&r1=62217&r2=62218&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/JIT.cpp (original) +++ vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Wed Jan 14 05:19:27 2009 @@ -7,16 +7,19 @@ // //===----------------------------------------------------------------------===// -#include "llvm/CallingConv.h" +#include #include #include #include -#include "llvm/LinkAllPasses.h" +#include +#include #include -#include "llvm/Analysis/LoopPass.h" -#include "llvm/Analysis/Verifier.h" -#include "llvm/Support/MutexGuard.h" -#include "llvm/Target/TargetOptions.h" +#include +#include +#include +#include +#include +#include #include "mvm/CompilationUnit.h" @@ -263,6 +266,8 @@ //PM->add(llvm::createVerifierPass()); // Verify that input is correct FunctionPassManager* PM = FunctionPasses; + FunctionPasses->add(new TargetData(TheModule)); + addPass(PM, createCFGSimplificationPass()); // Clean up disgusting code addPass(PM, createPromoteMemoryToRegisterPass());// Kill useless allocas Modified: vmkit/trunk/lib/N3/Mono/MonoString.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/Mono/MonoString.cpp?rev=62218&r1=62217&r2=62218&view=diff ============================================================================== --- vmkit/trunk/lib/N3/Mono/MonoString.cpp (original) +++ vmkit/trunk/lib/N3/Mono/MonoString.cpp Wed Jan 14 05:19:27 2009 @@ -7,6 +7,7 @@ // //===----------------------------------------------------------------------===// +#include "llvm/DerivedTypes.h" #include "llvm/GlobalVariable.h" #include "mvm/JIT.h" Modified: vmkit/trunk/lib/N3/PNetLib/PNetString.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/PNetLib/PNetString.cpp?rev=62218&r1=62217&r2=62218&view=diff ============================================================================== --- vmkit/trunk/lib/N3/PNetLib/PNetString.cpp (original) +++ vmkit/trunk/lib/N3/PNetLib/PNetString.cpp Wed Jan 14 05:19:27 2009 @@ -7,6 +7,7 @@ // //===----------------------------------------------------------------------===// +#include "llvm/DerivedTypes.h" #include "llvm/GlobalVariable.h" #include "mvm/JIT.h" Modified: vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp?rev=62218&r1=62217&r2=62218&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp (original) +++ vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp Wed Jan 14 05:19:27 2009 @@ -8,10 +8,11 @@ //===----------------------------------------------------------------------===// -#include +#include #include "llvm/DerivedTypes.h" #include "llvm/Instructions.h" +#include "llvm/ExecutionEngine/ExecutionEngine.h" #include "mvm/JIT.h" #include "mvm/Object.h" Modified: vmkit/trunk/tools/vmjc/vmjc.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmjc/vmjc.cpp?rev=62218&r1=62217&r2=62218&view=diff ============================================================================== --- vmkit/trunk/tools/vmjc/vmjc.cpp (original) +++ vmkit/trunk/tools/vmjc/vmjc.cpp Wed Jan 14 05:19:27 2009 @@ -38,6 +38,7 @@ #include #include #include +#include using namespace llvm; Modified: vmkit/trunk/tools/vmkit/Launcher.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmkit/Launcher.cpp?rev=62218&r1=62217&r2=62218&view=diff ============================================================================== --- vmkit/trunk/tools/vmkit/Launcher.cpp (original) +++ vmkit/trunk/tools/vmkit/Launcher.cpp Wed Jan 14 05:19:27 2009 @@ -9,6 +9,7 @@ #include "llvm/LinkAllPasses.h" #include "llvm/LinkAllVMCore.h" +#include "llvm/PassManager.h" #include "llvm/CodeGen/LinkAllCodegenComponents.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ManagedStatic.h" From nicolas.geoffray at lip6.fr Wed Jan 14 05:13:35 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 14 Jan 2009 13:13:35 -0000 Subject: [vmkit-commits] [vmkit] r62219 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Message-ID: <200901141313.n0EDDaCT020918@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 14 07:13:30 2009 New Revision: 62219 URL: http://llvm.org/viewvc/llvm-project?rev=62219&view=rev Log: Initialise array VTs adter loading libvmjc. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=62219&r1=62218&r2=62219&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Wed Jan 14 07:13:30 2009 @@ -177,6 +177,7 @@ static_init_t init = (static_init_t)(uintptr_t)SuperArray->classLoader; assert(init && "Loaded the wrong boot library"); init(this); + ClassArray::initialiseVT(SuperArray); } } From nicolas.geoffray at lip6.fr Wed Jan 14 05:24:04 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 14 Jan 2009 13:24:04 -0000 Subject: [vmkit-commits] [vmkit] r62220 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaObject.cpp JnjvmModule.cpp JnjvmModule.h Message-ID: <200901141324.n0EDO4bq021246@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 14 07:24:02 2009 New Revision: 62220 URL: http://llvm.org/viewvc/llvm-project?rev=62220&view=rev Log: Add the print function in statically compiled virtual tables. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp?rev=62220&r1=62219&r2=62220&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp Wed Jan 14 07:24:02 2009 @@ -75,12 +75,18 @@ return res; } -void JavaObject::print(mvm::PrintBuffer* buf) const { +extern "C" void printJavaObject(const JavaObject* obj, mvm::PrintBuffer* buf) { buf->write("JavaObject<"); - CommonClass::printClassName(classOf->getName(), buf); + CommonClass::printClassName(obj->classOf->getName(), buf); + fprintf(stderr, "%p\n", ((void**)obj->getVirtualTable())[9]); buf->write(">"); } +void JavaObject::print(mvm::PrintBuffer* buf) const { + printJavaObject(this, buf); +} + + void JavaObject::waitIntern(struct timeval* info, bool timed) { if (owner()) { Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=62220&r1=62219&r2=62220&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan 14 07:24:02 2009 @@ -37,6 +37,7 @@ llvm::Constant* JnjvmModule::PrimitiveArrayVT; llvm::Constant* JnjvmModule::ReferenceArrayVT; llvm::Function* JnjvmModule::StaticInitializer; +llvm::Function* JnjvmModule::ObjectPrinter; llvm::Function* JnjvmModule::NativeLoader; extern void* JavaArrayVT[]; @@ -1264,14 +1265,20 @@ Function* Finalizer = LMI->getMethod(); Elemts.push_back(Finalizer ? ConstantExpr::getCast(Instruction::BitCast, Finalizer, PTy) : N); - Elemts.push_back(N); // Delete + + // Delete + Elemts.push_back(N); // Tracer Function* Tracer = makeTracer(classDef, false); Elemts.push_back(Tracer ? ConstantExpr::getCast(Instruction::BitCast, Tracer, PTy) : N); - Elemts.push_back(N); // Printer - Elemts.push_back(N); // Hashcode + + // Printer + Elemts.push_back(ConstantExpr::getBitCast(ObjectPrinter, PTy)); + + // Hashcode + Elemts.push_back(N); for (uint32 i = VT_NB_FUNCS; i < size; ++i) { JavaMethod* meth = ((JavaMethod**)VT)[i]; @@ -2035,6 +2042,11 @@ NativeLoader = Function::Create(FTy, GlobalValue::ExternalLinkage, "vmjcNativeLoader", this); + + llvmArgs.clear(); + FTy = FunctionType::get(Type::VoidTy, llvmArgs, false); + ObjectPrinter = Function::Create(FTy, GlobalValue::ExternalLinkage, + "printJavaObject", this); } else { PrimitiveArrayVT = ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=62220&r1=62219&r2=62220&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Wed Jan 14 07:24:02 2009 @@ -239,6 +239,7 @@ static llvm::Constant* ReferenceArrayVT; static llvm::Function* StaticInitializer; + static llvm::Function* ObjectPrinter; public: From nicolas.geoffray at lip6.fr Wed Jan 14 06:08:12 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 14 Jan 2009 14:08:12 -0000 Subject: [vmkit-commits] [vmkit] r62221 - /vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Message-ID: <200901141408.n0EE8DFJ022851@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 14 08:08:05 2009 New Revision: 62221 URL: http://llvm.org/viewvc/llvm-project?rev=62221&view=rev Log: Fix comment. 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=62221&r1=62220&r2=62221&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Wed Jan 14 08:08:05 2009 @@ -1109,8 +1109,7 @@ static void compileClass(Class* cl) { - // Use the owner class field of the class so that we know if the class - // belongs to the list of classes that we are static compiling. + // Make sure the class is emitted. cl->classLoader->getModule()->getNativeClass(cl); for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) { From nicolas.geoffray at lip6.fr Wed Jan 14 06:27:27 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 14 Jan 2009 14:27:27 -0000 Subject: [vmkit-commits] [vmkit] r62223 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901141427.n0EERRMD023631@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 14 08:27:27 2009 New Revision: 62223 URL: http://llvm.org/viewvc/llvm-project?rev=62223&view=rev Log: Don't allocate the JavaObject VT, it's already static allocated. 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=62223&r1=62222&r2=62223&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan 14 08:27:27 2009 @@ -509,10 +509,11 @@ } } - uint64 size = cl->virtualTableSize; - mvm::BumpPtrAllocator& allocator = cl->classLoader->allocator; - VirtualTable* VT = (VirtualTable*)allocator.Allocate(size * sizeof(void*)); + VirtualTable* VT = 0; if (cl->super) { + uint64 size = cl->virtualTableSize; + mvm::BumpPtrAllocator& allocator = cl->classLoader->allocator; + VT = (VirtualTable*)allocator.Allocate(size * sizeof(void*)); Class* super = (Class*)cl->super; assert(cl->virtualTableSize >= cl->super->virtualTableSize && "Super VT bigger than own VT"); From nicolas.geoffray at lip6.fr Wed Jan 14 07:09:27 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 14 Jan 2009 15:09:27 -0000 Subject: [vmkit-commits] [vmkit] r62227 - in /vmkit/trunk: include/mvm/JIT.h lib/JnJVM/VMCore/JnjvmModule.cpp lib/Mvm/Runtime/JIT.cpp Message-ID: <200901141509.n0EF9Sav024967@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 14 09:09:27 2009 New Revision: 62227 URL: http://llvm.org/viewvc/llvm-project?rev=62227&view=rev Log: Do not depend on the executionegine to get the TargetData. Modified: vmkit/trunk/include/mvm/JIT.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Modified: vmkit/trunk/include/mvm/JIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/JIT.h?rev=62227&r1=62226&r2=62227&view=diff ============================================================================== --- vmkit/trunk/include/mvm/JIT.h (original) +++ vmkit/trunk/include/mvm/JIT.h Wed Jan 14 09:09:27 2009 @@ -26,6 +26,7 @@ class Function; class FunctionPassManager; class PointerType; + class TargetData; class Type; } @@ -105,12 +106,7 @@ llvm::Function* llvm_atomic_lcs_i32; llvm::Function* llvm_atomic_lcs_i64; - static llvm::ExecutionEngine* executionEngine; - static mvm::LockNormal protectEngine; - static uint64 getTypeSize(const llvm::Type* type); - static void runPasses(llvm::Function* func, llvm::FunctionPassManager*); - static void initialise(bool Fast = false); static llvm::ConstantInt* constantInt8Zero; static llvm::ConstantInt* constantZero; @@ -161,9 +157,15 @@ static const llvm::Type* arrayPtrType; static const llvm::Type* pointerSizeType; - + static llvm::ExecutionEngine* executionEngine; + static mvm::LockNormal protectEngine; static llvm::Module *globalModule; static llvm::ExistingModuleProvider *globalModuleProvider; + static const llvm::TargetData* TheTargetData; + + static uint64 getTypeSize(const llvm::Type* type); + static void runPasses(llvm::Function* func, llvm::FunctionPassManager*); + static void initialise(bool Fast = false); static int disassemble(unsigned int* addr); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=62227&r1=62226&r2=62227&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan 14 09:09:27 2009 @@ -1401,10 +1401,10 @@ } + JnjvmModule* Mod = classDef->classLoader->getModule(); StructType* structType = StructType::get(fields, false); virtualType = PointerType::getUnqual(structType); - ExecutionEngine* engine = mvm::MvmModule::executionEngine; - const TargetData* targetData = engine->getTargetData(); + const TargetData* targetData = Mod->TheTargetData; const StructLayout* sl = targetData->getStructLayout(structType); for (uint32 i = 0; i < classDef->nbVirtualFields; ++i) { @@ -1412,11 +1412,10 @@ field.ptrOffset = sl->getElementOffset(i + 1); } - uint64 size = mvm::MvmModule::getTypeSize(structType); + uint64 size = Mod->getTypeSize(structType); classDef->virtualSize = (uint32)size; virtualSizeConstant = ConstantInt::get(Type::Int32Ty, size); - JnjvmModule* Mod = classDef->classLoader->getModule(); if (!Mod->isStaticCompiling()) { if (!classDef->virtualVT) { Mod->makeVT((Class*)classDef); @@ -1453,10 +1452,10 @@ fields.push_back(LAI.llvmType); } + JnjvmModule* Mod = cl->classLoader->getModule(); StructType* structType = StructType::get(fields, false); staticType = PointerType::getUnqual(structType); - ExecutionEngine* engine = mvm::MvmModule::executionEngine; - const TargetData* targetData = engine->getTargetData(); + const TargetData* targetData = Mod->TheTargetData; const StructLayout* sl = targetData->getStructLayout(structType); for (uint32 i = 0; i < classDef->nbStaticFields; ++i) { @@ -1464,10 +1463,9 @@ field.ptrOffset = sl->getElementOffset(i); } - uint64 size = mvm::MvmModule::getTypeSize(structType); + uint64 size = Mod->getTypeSize(structType); cl->staticSize = size; - JnjvmModule* Mod = cl->classLoader->getModule(); if (!Mod->isStaticCompiling()) { Function* F = Mod->makeTracer(cl, true); cl->staticTracer = (void (*)(void*)) (uintptr_t) Modified: vmkit/trunk/lib/Mvm/Runtime/JIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/JIT.cpp?rev=62227&r1=62226&r2=62227&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/JIT.cpp (original) +++ vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Wed Jan 14 09:09:27 2009 @@ -45,13 +45,14 @@ globalModuleProvider = new ExistingModuleProvider (globalModule); - executionEngine = ExecutionEngine::createJIT(globalModuleProvider, 0, 0, Fast); std::string str = executionEngine->getTargetData()->getStringRepresentation(); globalModule->setDataLayout(str); + + TheTargetData = executionEngine->getTargetData(); Module module("unused"); @@ -179,8 +180,6 @@ llvm_atomic_lcs_i64 = module->getFunction("llvm.atomic.cmp.swap.i64.p0i64"); } -llvm::ExecutionEngine* MvmModule::executionEngine; -mvm::LockNormal MvmModule::protectEngine; llvm::ConstantInt* MvmModule::constantInt8Zero; llvm::ConstantInt* MvmModule::constantZero; @@ -231,12 +230,15 @@ const llvm::Type* MvmModule::pointerSizeType; const llvm::Type* MvmModule::arrayPtrType; +const llvm::TargetData* MvmModule::TheTargetData; llvm::Module *MvmModule::globalModule; llvm::ExistingModuleProvider *MvmModule::globalModuleProvider; +llvm::ExecutionEngine* MvmModule::executionEngine; +mvm::LockNormal MvmModule::protectEngine; uint64 MvmModule::getTypeSize(const llvm::Type* type) { - return executionEngine->getTargetData()->getTypePaddedSize(type); + return TheTargetData->getTypePaddedSize(type); } void MvmModule::runPasses(llvm::Function* func, @@ -266,7 +268,7 @@ //PM->add(llvm::createVerifierPass()); // Verify that input is correct FunctionPassManager* PM = FunctionPasses; - FunctionPasses->add(new TargetData(TheModule)); + FunctionPasses->add(new TargetData(*MvmModule::TheTargetData)); addPass(PM, createCFGSimplificationPass()); // Clean up disgusting code addPass(PM, createPromoteMemoryToRegisterPass());// Kill useless allocas From nicolas.geoffray at lip6.fr Wed Jan 14 07:15:13 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 14 Jan 2009 15:15:13 -0000 Subject: [vmkit-commits] [vmkit] r62228 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901141515.n0EFFDUr025147@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 14 09:15:13 2009 New Revision: 62228 URL: http://llvm.org/viewvc/llvm-project?rev=62228&view=rev Log: Get target data from the module, not the execution engine. 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=62228&r1=62227&r2=62228&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan 14 09:15:13 2009 @@ -2114,8 +2114,7 @@ MvmModule(ModuleID) { if (!sc) { - std::string str = - executionEngine->getTargetData()->getStringRepresentation(); + std::string str = TheTargetData->getStringRepresentation(); setDataLayout(str); } staticCompilation = sc; From nicolas.geoffray at lip6.fr Wed Jan 14 07:34:08 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 14 Jan 2009 15:34:08 -0000 Subject: [vmkit-commits] [vmkit] r62229 - in /vmkit/trunk: include/mvm/JIT.h lib/JnJVM/VMCore/JnjvmModule.cpp lib/JnJVM/VMCore/JnjvmModuleProvider.cpp lib/Mvm/Runtime/JIT.cpp Message-ID: <200901141534.n0EFY8f2025856@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 14 09:34:07 2009 New Revision: 62229 URL: http://llvm.org/viewvc/llvm-project?rev=62229&view=rev Log: Use a specific lock for protecting IR creation, not the JIT lock. Modified: vmkit/trunk/include/mvm/JIT.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Modified: vmkit/trunk/include/mvm/JIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/JIT.h?rev=62229&r1=62228&r2=62229&view=diff ============================================================================== --- vmkit/trunk/include/mvm/JIT.h (original) +++ vmkit/trunk/include/mvm/JIT.h Wed Jan 14 09:34:07 2009 @@ -33,6 +33,7 @@ namespace mvm { class LockNormal; +class LockRecursive; const double MaxDouble = +INFINITY; //1.0 / 0.0; const double MinDouble = -INFINITY;//-1.0 / 0.0; @@ -159,6 +160,7 @@ static llvm::ExecutionEngine* executionEngine; static mvm::LockNormal protectEngine; + static mvm::LockRecursive protectIR; static llvm::Module *globalModule; static llvm::ExistingModuleProvider *globalModuleProvider; static const llvm::TargetData* TheTargetData; Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=62229&r1=62228&r2=62229&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan 14 09:34:07 2009 @@ -1581,7 +1581,7 @@ const llvm::FunctionType* LLVMSignatureInfo::getVirtualType() { if (!virtualType) { // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::MvmModule::executionEngine->lock); + mvm::MvmModule::protectIR.lock(); std::vector llvmArgs; uint32 size = signature->nbArguments; Typedef* const* arguments = signature->getArgumentsType(); @@ -1601,6 +1601,7 @@ LLVMAssessorInfo& LAI = JnjvmModule::getTypedefInfo(signature->getReturnType()); virtualType = FunctionType::get(LAI.llvmType, llvmArgs, false); + mvm::MvmModule::protectIR.unlock(); } return virtualType; } @@ -1608,7 +1609,7 @@ const llvm::FunctionType* LLVMSignatureInfo::getStaticType() { if (!staticType) { // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::MvmModule::executionEngine->lock); + mvm::MvmModule::protectIR.lock(); std::vector llvmArgs; uint32 size = signature->nbArguments; Typedef* const* arguments = signature->getArgumentsType(); @@ -1626,6 +1627,7 @@ LLVMAssessorInfo& LAI = JnjvmModule::getTypedefInfo(signature->getReturnType()); staticType = FunctionType::get(LAI.llvmType, llvmArgs, false); + mvm::MvmModule::protectIR.unlock(); } return staticType; } @@ -1633,7 +1635,7 @@ const llvm::FunctionType* LLVMSignatureInfo::getNativeType() { if (!nativeType) { // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::MvmModule::executionEngine->lock); + mvm::MvmModule::protectIR.lock(); std::vector llvmArgs; uint32 size = signature->nbArguments; Typedef* const* arguments = signature->getArgumentsType(); @@ -1654,6 +1656,7 @@ LLVMAssessorInfo& LAI = JnjvmModule::getTypedefInfo(signature->getReturnType()); nativeType = FunctionType::get(LAI.llvmType, llvmArgs, false); + mvm::MvmModule::protectIR.unlock(); } return nativeType; } @@ -1795,7 +1798,7 @@ const FunctionType* LLVMSignatureInfo::getVirtualBufType() { if (!virtualBufType) { // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::MvmModule::executionEngine->lock); + mvm::MvmModule::protectIR.lock(); std::vector Args2; Args2.push_back(JnjvmModule::ConstantPoolType); // ctp Args2.push_back(getVirtualPtrType()); @@ -1804,6 +1807,7 @@ LLVMAssessorInfo& LAI = JnjvmModule::getTypedefInfo(signature->getReturnType()); virtualBufType = FunctionType::get(LAI.llvmType, Args2, false); + mvm::MvmModule::protectIR.unlock(); } return virtualBufType; } @@ -1811,7 +1815,7 @@ const FunctionType* LLVMSignatureInfo::getStaticBufType() { if (!staticBufType) { // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::MvmModule::executionEngine->lock); + mvm::MvmModule::protectIR.lock(); std::vector Args; Args.push_back(JnjvmModule::ConstantPoolType); // ctp Args.push_back(getStaticPtrType()); @@ -1819,6 +1823,7 @@ LLVMAssessorInfo& LAI = JnjvmModule::getTypedefInfo(signature->getReturnType()); staticBufType = FunctionType::get(LAI.llvmType, Args, false); + mvm::MvmModule::protectIR.unlock(); } return staticBufType; } @@ -1826,13 +1831,14 @@ Function* LLVMSignatureInfo::getVirtualBuf() { if (!virtualBufFunction) { // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::MvmModule::executionEngine->lock); + mvm::MvmModule::protectIR.lock(); virtualBufFunction = createFunctionCallBuf(true); signature->setVirtualCallBuf((intptr_t) mvm::MvmModule::executionEngine->getPointerToGlobal(virtualBufFunction)); if (!signature->initialLoader->getModule()->isStaticCompiling()) // Now that it's compiled, we don't need the IR anymore virtualBufFunction->deleteBody(); + mvm::MvmModule::protectIR.unlock(); } return virtualBufFunction; } @@ -1840,13 +1846,14 @@ Function* LLVMSignatureInfo::getVirtualAP() { if (!virtualAPFunction) { // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::MvmModule::executionEngine->lock); + mvm::MvmModule::protectIR.lock(); virtualAPFunction = createFunctionCallAP(true); signature->setVirtualCallAP((intptr_t) mvm::MvmModule::executionEngine->getPointerToGlobal(virtualAPFunction)); if (!signature->initialLoader->getModule()->isStaticCompiling()) // Now that it's compiled, we don't need the IR anymore virtualAPFunction->deleteBody(); + mvm::MvmModule::protectIR.unlock(); } return virtualAPFunction; } @@ -1854,13 +1861,14 @@ Function* LLVMSignatureInfo::getStaticBuf() { if (!staticBufFunction) { // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::MvmModule::executionEngine->lock); + mvm::MvmModule::protectIR.lock(); staticBufFunction = createFunctionCallBuf(false); signature->setStaticCallBuf((intptr_t) mvm::MvmModule::executionEngine->getPointerToGlobal(staticBufFunction)); if (!signature->initialLoader->getModule()->isStaticCompiling()) // Now that it's compiled, we don't need the IR anymore staticBufFunction->deleteBody(); + mvm::MvmModule::protectIR.unlock(); } return staticBufFunction; } @@ -1868,29 +1876,32 @@ Function* LLVMSignatureInfo::getStaticAP() { if (!staticAPFunction) { // Lock here because we are called by arbitrary code - llvm::MutexGuard locked(mvm::MvmModule::executionEngine->lock); + mvm::MvmModule::protectIR.lock(); staticAPFunction = createFunctionCallAP(false); signature->setStaticCallAP((intptr_t) mvm::MvmModule::executionEngine->getPointerToGlobal(staticAPFunction)); if (!signature->initialLoader->getModule()->isStaticCompiling()) // Now that it's compiled, we don't need the IR anymore staticAPFunction->deleteBody(); + mvm::MvmModule::protectIR.unlock(); } return staticAPFunction; } void JnjvmModule::resolveVirtualClass(Class* cl) { // Lock here because we may be called by a class resolver - llvm::MutexGuard locked(mvm::MvmModule::executionEngine->lock); + mvm::MvmModule::protectIR.lock(); LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); LCI->getVirtualType(); + mvm::MvmModule::protectIR.unlock(); } void JnjvmModule::resolveStaticClass(Class* cl) { // Lock here because we may be called by a class initializer - llvm::MutexGuard locked(mvm::MvmModule::executionEngine->lock); + mvm::MvmModule::protectIR.lock(); LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); LCI->getStaticType(); + mvm::MvmModule::protectIR.unlock(); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=62229&r1=62228&r2=62229&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Wed Jan 14 09:34:07 2009 @@ -120,7 +120,7 @@ Function* func = LMI->getMethod(); if (func->hasNotBeenReadFromBitcode()) { // We are jitting. Take the lock. - llvm::MutexGuard locked(mvm::MvmModule::executionEngine->lock); + mvm::MvmModule::protectIR.lock(); JavaJIT jit(meth, func); if (isNative(meth->access)) { jit.nativeCompile(); @@ -131,6 +131,7 @@ mvm::MvmModule::runPasses(func, loader->FunctionPasses); mvm::MvmModule::runPasses(func, JavaFunctionPasses); } + mvm::MvmModule::protectIR.unlock(); } return func; } Modified: vmkit/trunk/lib/Mvm/Runtime/JIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/JIT.cpp?rev=62229&r1=62228&r2=62229&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/JIT.cpp (original) +++ vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Wed Jan 14 09:34:07 2009 @@ -235,6 +235,7 @@ llvm::ExistingModuleProvider *MvmModule::globalModuleProvider; llvm::ExecutionEngine* MvmModule::executionEngine; mvm::LockNormal MvmModule::protectEngine; +mvm::LockRecursive MvmModule::protectIR; uint64 MvmModule::getTypeSize(const llvm::Type* type) { From nicolas.geoffray at lip6.fr Wed Jan 14 07:40:57 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 14 Jan 2009 15:40:57 -0000 Subject: [vmkit-commits] [vmkit] r62230 - in /vmkit/trunk/lib/JnJVM/VMCore: JnjvmModule.cpp JnjvmModuleProvider.cpp Message-ID: <200901141540.n0EFevdP026056@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 14 09:40:57 2009 New Revision: 62230 URL: http://llvm.org/viewvc/llvm-project?rev=62230&view=rev Log: Don't reference the executionEngine when it does not exist. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=62230&r1=62229&r2=62230&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan 14 09:40:57 2009 @@ -1833,11 +1833,12 @@ // Lock here because we are called by arbitrary code mvm::MvmModule::protectIR.lock(); virtualBufFunction = createFunctionCallBuf(true); - signature->setVirtualCallBuf((intptr_t) - mvm::MvmModule::executionEngine->getPointerToGlobal(virtualBufFunction)); - if (!signature->initialLoader->getModule()->isStaticCompiling()) + if (!signature->initialLoader->getModule()->isStaticCompiling()) { + signature->setVirtualCallBuf((intptr_t) + mvm::MvmModule::executionEngine->getPointerToGlobal(virtualBufFunction)); // Now that it's compiled, we don't need the IR anymore virtualBufFunction->deleteBody(); + } mvm::MvmModule::protectIR.unlock(); } return virtualBufFunction; @@ -1848,11 +1849,12 @@ // Lock here because we are called by arbitrary code mvm::MvmModule::protectIR.lock(); virtualAPFunction = createFunctionCallAP(true); - signature->setVirtualCallAP((intptr_t) - mvm::MvmModule::executionEngine->getPointerToGlobal(virtualAPFunction)); - if (!signature->initialLoader->getModule()->isStaticCompiling()) + if (!signature->initialLoader->getModule()->isStaticCompiling()) { + signature->setVirtualCallAP((intptr_t) + mvm::MvmModule::executionEngine->getPointerToGlobal(virtualAPFunction)); // Now that it's compiled, we don't need the IR anymore virtualAPFunction->deleteBody(); + } mvm::MvmModule::protectIR.unlock(); } return virtualAPFunction; @@ -1863,11 +1865,12 @@ // Lock here because we are called by arbitrary code mvm::MvmModule::protectIR.lock(); staticBufFunction = createFunctionCallBuf(false); - signature->setStaticCallBuf((intptr_t) - mvm::MvmModule::executionEngine->getPointerToGlobal(staticBufFunction)); - if (!signature->initialLoader->getModule()->isStaticCompiling()) + if (!signature->initialLoader->getModule()->isStaticCompiling()) { + signature->setStaticCallBuf((intptr_t) + mvm::MvmModule::executionEngine->getPointerToGlobal(staticBufFunction)); // Now that it's compiled, we don't need the IR anymore staticBufFunction->deleteBody(); + } mvm::MvmModule::protectIR.unlock(); } return staticBufFunction; @@ -1878,11 +1881,12 @@ // Lock here because we are called by arbitrary code mvm::MvmModule::protectIR.lock(); staticAPFunction = createFunctionCallAP(false); - signature->setStaticCallAP((intptr_t) - mvm::MvmModule::executionEngine->getPointerToGlobal(staticAPFunction)); - if (!signature->initialLoader->getModule()->isStaticCompiling()) + if (!signature->initialLoader->getModule()->isStaticCompiling()) { + signature->setStaticCallAP((intptr_t) + mvm::MvmModule::executionEngine->getPointerToGlobal(staticAPFunction)); // Now that it's compiled, we don't need the IR anymore staticAPFunction->deleteBody(); + } mvm::MvmModule::protectIR.unlock(); } return staticAPFunction; @@ -2083,7 +2087,7 @@ Function* func = getMethodInfo(meth)->getMethod(); func->setName(name); assert(ptr && "No value given"); - executionEngine->addGlobalMapping(func, ptr); + if (executionEngine) executionEngine->addGlobalMapping(func, ptr); func->setLinkage(GlobalValue::ExternalLinkage); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=62230&r1=62229&r2=62230&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Wed Jan 14 09:40:57 2009 @@ -180,9 +180,11 @@ JnjvmModuleProvider::JnjvmModuleProvider(JnjvmModule *m) { TheModule = (Module*)m; - mvm::MvmModule::protectEngine.lock(); - mvm::MvmModule::executionEngine->addModuleProvider(this); - mvm::MvmModule::protectEngine.unlock(); + if (m->executionEngine) { + m->protectEngine.lock(); + m->executionEngine->addModuleProvider(this); + m->protectEngine.unlock(); + } JavaNativeFunctionPasses = new llvm::FunctionPassManager(this); JavaNativeFunctionPasses->add(new llvm::TargetData(m)); @@ -199,9 +201,11 @@ } JnjvmModuleProvider::~JnjvmModuleProvider() { - mvm::MvmModule::protectEngine.lock(); - mvm::MvmModule::executionEngine->removeModuleProvider(this); - mvm::MvmModule::protectEngine.unlock(); + if (mvm::MvmModule::executionEngine) { + mvm::MvmModule::protectEngine.lock(); + mvm::MvmModule::executionEngine->removeModuleProvider(this); + mvm::MvmModule::protectEngine.unlock(); + } delete TheModule; delete JavaNativeFunctionPasses; delete JavaFunctionPasses; From nicolas.geoffray at lip6.fr Wed Jan 14 09:15:23 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 14 Jan 2009 17:15:23 -0000 Subject: [vmkit-commits] [vmkit] r62233 - in /vmkit/trunk: include/mvm/JIT.h lib/JnJVM/VMCore/JnjvmModule.cpp lib/JnJVM/VMCore/JnjvmModuleProvider.cpp lib/Mvm/Runtime/JIT.cpp tools/vmjc/vmjc.cpp Message-ID: <200901141715.n0EHFNHl029309@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 14 11:15:22 2009 New Revision: 62233 URL: http://llvm.org/viewvc/llvm-project?rev=62233&view=rev Log: Don't reference the executionEngine when static compiling. Modified: vmkit/trunk/include/mvm/JIT.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp vmkit/trunk/lib/Mvm/Runtime/JIT.cpp vmkit/trunk/tools/vmjc/vmjc.cpp Modified: vmkit/trunk/include/mvm/JIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/JIT.h?rev=62233&r1=62232&r2=62233&view=diff ============================================================================== --- vmkit/trunk/include/mvm/JIT.h (original) +++ vmkit/trunk/include/mvm/JIT.h Wed Jan 14 11:15:22 2009 @@ -27,6 +27,7 @@ class FunctionPassManager; class PointerType; class TargetData; + class TargetMachine; class Type; } @@ -167,7 +168,8 @@ static uint64 getTypeSize(const llvm::Type* type); static void runPasses(llvm::Function* func, llvm::FunctionPassManager*); - static void initialise(bool Fast = false); + static void initialise(bool Fast = false, llvm::Module* TheModule = 0, + llvm::TargetMachine* TheTarget = 0); static int disassemble(unsigned int* addr); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=62233&r1=62232&r2=62233&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan 14 11:15:22 2009 @@ -2128,10 +2128,6 @@ JnjvmModule::JnjvmModule(const std::string &ModuleID, bool sc) : MvmModule(ModuleID) { - if (!sc) { - std::string str = TheTargetData->getStringRepresentation(); - setDataLayout(str); - } staticCompilation = sc; if (!VTType) initialise(); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=62233&r1=62232&r2=62233&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Wed Jan 14 11:15:22 2009 @@ -65,12 +65,13 @@ bool JnjvmModuleProvider::materializeFunction(Function *F, std::string *ErrInfo) { + if (!(F->hasNotBeenReadFromBitcode())) + return false; + + assert(mvm::MvmModule::executionEngine && "No execution engine"); if (mvm::MvmModule::executionEngine->getPointerToGlobalIfAvailable(F)) return false; - if (!(F->hasNotBeenReadFromBitcode())) - return false; - JavaMethod* meth = LLVMMethodInfo::get(F); if (!meth) { Modified: vmkit/trunk/lib/Mvm/Runtime/JIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/JIT.cpp?rev=62233&r1=62232&r2=62233&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/JIT.cpp (original) +++ vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Wed Jan 14 11:15:22 2009 @@ -19,6 +19,7 @@ #include #include #include +#include #include @@ -38,25 +39,29 @@ } } -void MvmModule::initialise(bool Fast) { +void MvmModule::initialise(bool Fast, Module* M, TargetMachine* T) { llvm::NoFramePointerElim = true; llvm::ExceptionHandling = true; - globalModule = new llvm::Module("bootstrap module"); - globalModuleProvider = new ExistingModuleProvider (globalModule); - - - executionEngine = ExecutionEngine::createJIT(globalModuleProvider, 0, - 0, Fast); - - std::string str = - executionEngine->getTargetData()->getStringRepresentation(); - globalModule->setDataLayout(str); - - TheTargetData = executionEngine->getTargetData(); + if (!M) { + globalModule = new llvm::Module("bootstrap module"); + globalModuleProvider = new ExistingModuleProvider (globalModule); + + executionEngine = ExecutionEngine::createJIT(globalModuleProvider, 0, + 0, Fast); + + std::string str = + executionEngine->getTargetData()->getStringRepresentation(); + globalModule->setDataLayout(str); + + TheTargetData = executionEngine->getTargetData(); + } else { + globalModule = M; + TheTargetData = T->getTargetData(); + } Module module("unused"); - module.setDataLayout(str); + module.setDataLayout(globalModule->getDataLayout()); mvm::llvm_runtime::makeLLVMModuleContents(&module); // Type declaration @@ -118,8 +123,8 @@ MvmModule::MvmModule(const std::string& ModuleID) : llvm::Module(ModuleID) { Module* module = this; - std::string str = executionEngine->getTargetData()->getStringRepresentation(); - module->setDataLayout(str); + module->setDataLayout(globalModule->getDataLayout()); + module->setTargetTriple(globalModule->getTargetTriple()); mvm::llvm_runtime::makeLLVMModuleContents(module); Modified: vmkit/trunk/tools/vmjc/vmjc.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmjc/vmjc.cpp?rev=62233&r1=62232&r2=62233&view=diff ============================================================================== --- vmkit/trunk/tools/vmjc/vmjc.cpp (original) +++ vmkit/trunk/tools/vmjc/vmjc.cpp Wed Jan 14 11:15:22 2009 @@ -28,6 +28,9 @@ #include "llvm/Support/SystemUtils.h" #include "llvm/Support/raw_ostream.h" #include "llvm/System/Signals.h" +#include "llvm/Target/TargetData.h" +#include "llvm/Target/TargetMachineRegistry.h" +#include "llvm/Target/TargetMachine.h" #include "MvmGC.h" #include "mvm/JIT.h" @@ -133,21 +136,38 @@ cl::PrintHelpMessage(); return 0; } + + Module* TheModule = new Module("bootstrap module"); + if (!TargetTriple.empty()) + TheModule->setTargetTriple(TargetTriple); + else + TheModule->setTargetTriple(LLVM_HOSTTRIPLE); + + // Create the TargetMachine we will be generating code with. + std::string Err; + const TargetMachineRegistry::entry *TME = + TargetMachineRegistry::getClosestStaticTargetForModule(*TheModule, Err); + if (!TME) { + cerr << "Did not get a target machine!\n"; + exit(1); + } + + std::string FeatureStr; + TargetMachine* TheTarget = TME->CtorFn(*TheModule, FeatureStr); + + // Install information about target datalayout stuff into the module for + // optimizer use. + TheModule->setDataLayout(TheTarget->getTargetData()-> + getStringRepresentation()); - mvm::MvmModule::initialise(); + + mvm::MvmModule::initialise(false, TheModule, TheTarget); mvm::Object::initialise(); Collector::initialise(0); Collector::enable(0); mvm::CompilationUnit* CU = mvm::VirtualMachine::initialiseJVM(true); - - if (!TargetTriple.empty()) - CU->TheModule->setTargetTriple(TargetTriple); - else - CU->TheModule->setTargetTriple(LLVM_HOSTTRIPLE); - - - addCommandLinePass(CU, argv); + addCommandLinePass(CU, argv); mvm::VirtualMachine* vm = mvm::VirtualMachine::createJVM(CU); vm->compile(InputFilename.c_str()); vm->waitForExit(); From nicolas.geoffray at lip6.fr Wed Jan 14 09:39:58 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 14 Jan 2009 17:39:58 -0000 Subject: [vmkit-commits] [vmkit] r62235 - in /vmkit/trunk: include/mvm/CompilationUnit.h include/mvm/JIT.h lib/JnJVM/VMCore/JnjvmClassLoader.cpp lib/JnJVM/VMCore/JnjvmClassLoader.h lib/JnJVM/VMCore/JnjvmModuleProvider.cpp lib/Mvm/Runtime/JIT.cpp tools/vmjc/vmjc.cpp tools/vmkit/Launcher.cpp Message-ID: <200901141739.n0EHdwlq030336@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 14 11:39:57 2009 New Revision: 62235 URL: http://llvm.org/viewvc/llvm-project?rev=62235&view=rev Log: Move function passes to mvm::MvmModule. Modified: vmkit/trunk/include/mvm/CompilationUnit.h vmkit/trunk/include/mvm/JIT.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp vmkit/trunk/lib/Mvm/Runtime/JIT.cpp vmkit/trunk/tools/vmjc/vmjc.cpp vmkit/trunk/tools/vmkit/Launcher.cpp Modified: vmkit/trunk/include/mvm/CompilationUnit.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/CompilationUnit.h?rev=62235&r1=62234&r2=62235&view=diff ============================================================================== --- vmkit/trunk/include/mvm/CompilationUnit.h (original) +++ vmkit/trunk/include/mvm/CompilationUnit.h Wed Jan 14 11:39:57 2009 @@ -25,11 +25,12 @@ namespace mvm { +class MvmModule; + class CompilationUnit : public mvm::Object { public: - llvm::Module* TheModule; + MvmModule* TheModule; llvm::ModuleProvider* TheModuleProvider; - llvm::FunctionPassManager* FunctionPasses; void AddStandardCompilePasses(); }; Modified: vmkit/trunk/include/mvm/JIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/JIT.h?rev=62235&r1=62234&r2=62235&view=diff ============================================================================== --- vmkit/trunk/include/mvm/JIT.h (original) +++ vmkit/trunk/include/mvm/JIT.h Wed Jan 14 11:39:57 2009 @@ -109,7 +109,6 @@ llvm::Function* llvm_atomic_lcs_i64; - static llvm::ConstantInt* constantInt8Zero; static llvm::ConstantInt* constantZero; static llvm::ConstantInt* constantOne; @@ -164,6 +163,7 @@ static mvm::LockRecursive protectIR; static llvm::Module *globalModule; static llvm::ExistingModuleProvider *globalModuleProvider; + static llvm::FunctionPassManager* globalFunctionPasses; static const llvm::TargetData* TheTargetData; static uint64 getTypeSize(const llvm::Type* type); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=62235&r1=62234&r2=62235&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Wed Jan 14 11:39:57 2009 @@ -32,10 +32,6 @@ #endif #include "debug.h" - -// TODO: get rid of that -#include "llvm/PassManager.h" - #include "mvm/Allocator.h" #include "Classpath.h" @@ -70,7 +66,6 @@ TheModule = new JnjvmModule("Bootstrap JnJVM", staticCompilation); TheModuleProvider = new JnjvmModuleProvider(getModule()); - FunctionPasses = new FunctionPassManager(TheModuleProvider); hashUTF8 = new(allocator) UTF8Map(allocator, 0); classes = new(allocator) ClassMap(); @@ -280,7 +275,6 @@ TheModule = new JnjvmModule("Applicative loader"); TheModuleProvider = new JnjvmModuleProvider(getModule()); bootstrapLoader = JCL.bootstrapLoader; - FunctionPasses = bootstrapLoader->FunctionPasses; hashUTF8 = new(allocator) UTF8Map(allocator, bootstrapLoader->upcalls->ArrayOfChar); @@ -820,7 +814,6 @@ JnjvmBootstrapLoader::~JnjvmBootstrapLoader() { - delete FunctionPasses; } JavaString* JnjvmClassLoader::UTF8ToStr(const UTF8* val) { Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=62235&r1=62234&r2=62235&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Wed Jan 14 11:39:57 2009 @@ -224,7 +224,6 @@ TheModuleProvider = 0; isolate = 0; classes = 0; - FunctionPasses = 0; } /// loadClass - The user class that defines the loadClass method. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=62235&r1=62234&r2=62235&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Wed Jan 14 11:39:57 2009 @@ -117,22 +117,22 @@ } Function* JnjvmModuleProvider::parseFunction(JavaMethod* meth) { - LLVMMethodInfo* LMI = ((JnjvmModule*)TheModule)->getMethodInfo(meth); + JnjvmModule* M = (JnjvmModule*)TheModule; + LLVMMethodInfo* LMI = M->getMethodInfo(meth); Function* func = LMI->getMethod(); if (func->hasNotBeenReadFromBitcode()) { // We are jitting. Take the lock. - mvm::MvmModule::protectIR.lock(); + M->protectIR.lock(); JavaJIT jit(meth, func); if (isNative(meth->access)) { jit.nativeCompile(); mvm::MvmModule::runPasses(func, JavaNativeFunctionPasses); } else { jit.javaCompile(); - JnjvmClassLoader* loader = meth->classDef->classLoader; - mvm::MvmModule::runPasses(func, loader->FunctionPasses); + mvm::MvmModule::runPasses(func, M->globalFunctionPasses); mvm::MvmModule::runPasses(func, JavaFunctionPasses); } - mvm::MvmModule::protectIR.unlock(); + M->protectIR.unlock(); } return func; } Modified: vmkit/trunk/lib/Mvm/Runtime/JIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/JIT.cpp?rev=62235&r1=62234&r2=62235&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/JIT.cpp (original) +++ vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Wed Jan 14 11:39:57 2009 @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -56,9 +57,12 @@ TheTargetData = executionEngine->getTargetData(); } else { globalModule = M; + globalModuleProvider = new ExistingModuleProvider (globalModule); TheTargetData = T->getTargetData(); } + globalFunctionPasses = new FunctionPassManager(globalModuleProvider); + Module module("unused"); module.setDataLayout(globalModule->getDataLayout()); @@ -238,6 +242,7 @@ const llvm::TargetData* MvmModule::TheTargetData; llvm::Module *MvmModule::globalModule; llvm::ExistingModuleProvider *MvmModule::globalModuleProvider; +llvm::FunctionPassManager* MvmModule::globalFunctionPasses; llvm::ExecutionEngine* MvmModule::executionEngine; mvm::LockNormal MvmModule::protectEngine; mvm::LockRecursive MvmModule::protectIR; @@ -273,8 +278,8 @@ // //PM->add(llvm::createVerifierPass()); // Verify that input is correct - FunctionPassManager* PM = FunctionPasses; - FunctionPasses->add(new TargetData(*MvmModule::TheTargetData)); + FunctionPassManager* PM = TheModule->globalFunctionPasses; + PM->add(new TargetData(*MvmModule::TheTargetData)); addPass(PM, createCFGSimplificationPass()); // Clean up disgusting code addPass(PM, createPromoteMemoryToRegisterPass());// Kill useless allocas Modified: vmkit/trunk/tools/vmjc/vmjc.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmjc/vmjc.cpp?rev=62235&r1=62234&r2=62235&view=diff ============================================================================== --- vmkit/trunk/tools/vmjc/vmjc.cpp (original) +++ vmkit/trunk/tools/vmjc/vmjc.cpp Wed Jan 14 11:39:57 2009 @@ -85,7 +85,7 @@ void addCommandLinePass(mvm::CompilationUnit* CU, char** argv) { - FunctionPassManager* Passes = CU->FunctionPasses; + FunctionPassManager* Passes = CU->TheModule->globalFunctionPasses; // Create a new optimization pass for each one specified on the command line for (unsigned i = 0; i < PassList.size(); ++i) { Modified: vmkit/trunk/tools/vmkit/Launcher.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmkit/Launcher.cpp?rev=62235&r1=62234&r2=62235&view=diff ============================================================================== --- vmkit/trunk/tools/vmkit/Launcher.cpp (original) +++ vmkit/trunk/tools/vmkit/Launcher.cpp Wed Jan 14 11:39:57 2009 @@ -67,7 +67,7 @@ void addCommandLinePass(mvm::CompilationUnit* CU, char** argv) { - FunctionPassManager* Passes = CU->FunctionPasses; + FunctionPassManager* Passes = CU->TheModule->globalFunctionPasses; // Create a new optimization pass for each one specified on the command line for (unsigned i = 0; i < PassList.size(); ++i) { From nicolas.geoffray at lip6.fr Fri Jan 16 00:51:42 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 16 Jan 2009 08:51:42 -0000 Subject: [vmkit-commits] [vmkit] r62318 - /vmkit/trunk/Makefile.rules Message-ID: <200901160851.n0G8pgub028768@zion.cs.uiuc.edu> Author: geoffray Date: Fri Jan 16 02:51:41 2009 New Revision: 62318 URL: http://llvm.org/viewvc/llvm-project?rev=62318&view=rev Log: Add relocation model when compiling with llc. Modified: vmkit/trunk/Makefile.rules Modified: vmkit/trunk/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.rules?rev=62318&r1=62317&r2=62318&view=diff ============================================================================== --- vmkit/trunk/Makefile.rules (original) +++ vmkit/trunk/Makefile.rules Fri Jan 16 02:51:41 2009 @@ -61,7 +61,7 @@ glibj.zip.s : glibj-optimized.zip.bc $(Echo) "Compiling glibj.zip.bc to native" - $(Verb) $(LLC) -disable-fp-elim -f glibj-optimized.zip.bc -o glibj.zip.s + $(Verb) $(LLC) -relocation-model=pic -disable-fp-elim -f glibj.zip.bc -o glibj.zip.s $(ObjDir)/%.lo $(ObjDir)/%.o: %.s $(ObjDir)/.dir $(BUILT_SOURCES) $(Echo) "Compiling $*.s for $(BuildMode) build " $(PIC_FLAG) From nicolas.geoffray at lip6.fr Fri Jan 16 06:55:29 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 16 Jan 2009 14:55:29 -0000 Subject: [vmkit-commits] [vmkit] r62320 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathConstructor.cpp Classpath/ClasspathField.cpp Classpath/ClasspathMethod.cpp Classpath/ClasspathReflect.h Classpath/ClasspathVMClass.cpp VMCore/JnjvmModule.cpp VMCore/JnjvmModule.h Message-ID: <200901161455.n0GEtTMP014791@zion.cs.uiuc.edu> Author: geoffray Date: Fri Jan 16 08:55:27 2009 New Revision: 62320 URL: http://llvm.org/viewvc/llvm-project?rev=62320&view=rev Log: Use the slot field of reflect classes as an index in the method or field array. We do this because Classpath defines the slot as an int so 64bit systems won't allow the slot field to be a pointer. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp?rev=62320&r1=62319&r2=62320&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp Fri Jan 16 08:55:27 2009 @@ -24,18 +24,11 @@ extern "C" { -// internalGetClass selects the class of a method depending on the isolate -// environment. In a sharing environment, the class is located in the -// Java object. In regular environment, it is the classDef of the method. -static UserClass* internalGetClass(Jnjvm* vm, JavaMethod* meth, jobject Meth) { -#ifdef ISOLATE_SHARING +static UserClass* internalGetClass(Jnjvm* vm, jobject Meth) { JavaField* field = vm->upcalls->constructorClass; JavaObject* Cl = (JavaObject*)field->getInt32Field((JavaObject*)Meth); UserClass* cl = (UserClass*)UserCommonClass::resolvedImplClass(vm, Cl, false); return cl; -#else - return meth->classDef; -#endif } JNIEXPORT jobject JNICALL Java_java_lang_reflect_Constructor_getParameterTypes( @@ -50,9 +43,10 @@ verifyNull(cons); Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, cons); JavaField* field = vm->upcalls->constructorSlot; - JavaMethod* meth = (JavaMethod*)(field->getInt32Field((JavaObject*)cons)); - UserClass* cl = internalGetClass(vm, meth, cons); + uint32 index = (uint32)(field->getInt32Field((JavaObject*)cons)); + JavaMethod* meth = &(cl->virtualMethods[index]); JnjvmClassLoader* loader = cl->classLoader; res = (jobject)meth->getParameterTypes(loader); @@ -73,8 +67,10 @@ verifyNull(cons); Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, cons); JavaField* field = vm->upcalls->constructorSlot; - JavaMethod* meth = (JavaMethod*)(field->getInt32Field((JavaObject*)cons)); + uint32 index = (uint32)(field->getInt32Field((JavaObject*)cons)); + JavaMethod* meth = &(cl->virtualMethods[index]); res = meth->access; END_NATIVE_EXCEPTION @@ -86,14 +82,15 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject _cons, jobject _args, jclass Clazz, jint _meth) { +jobject _cons, jobject _args, jclass Clazz, jint index) { jobject res = 0; BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - JavaMethod* meth = (JavaMethod*)_meth; + UserClass* cl = internalGetClass(vm, _cons); + JavaMethod* meth = &(cl->virtualMethods[index]); JavaArray* args = (JavaArray*)_args; sint32 nbArgs = args ? args->size : 0; Signdef* sign = meth->getSignature(); @@ -164,9 +161,10 @@ verifyNull(cons); Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, cons); JavaField* field = vm->upcalls->constructorSlot; - JavaMethod* meth = (JavaMethod*)field->getInt32Field((JavaObject*)cons); - UserClass* cl = internalGetClass(vm, meth, cons); + uint32 index = (uint32)(field->getInt32Field((JavaObject*)cons)); + JavaMethod* meth = &(cl->virtualMethods[index]); JnjvmClassLoader* loader = cl->classLoader; res = (jobjectArray)meth->getExceptionTypes(loader); Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp?rev=62320&r1=62319&r2=62320&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp Fri Jan 16 08:55:27 2009 @@ -19,15 +19,11 @@ extern "C" { -static UserClass* internalGetClass(Jnjvm* vm, JavaField* field, jobject Field) { -#ifdef ISOLATE_SHARING +static UserClass* internalGetClass(Jnjvm* vm, jobject Field) { JavaField* slot = vm->upcalls->fieldClass; JavaObject* Cl = (JavaObject*)slot->getInt32Field((JavaObject*)Field); UserClass* cl = (UserClass*)UserCommonClass::resolvedImplClass(vm, Cl, false); return cl; -#else - return field->classDef; -#endif } JNIEXPORT jint JNICALL Java_java_lang_reflect_Field_getModifiersInternal( @@ -40,8 +36,10 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)obj); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); res = field->access; END_NATIVE_EXCEPTION @@ -60,12 +58,13 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)obj); - UserClass* fieldCl = internalGetClass(vm, field, obj); - JnjvmClassLoader* loader = fieldCl->classLoader; - UserCommonClass* cl = field->getSignature()->assocClass(loader); - res = (jclass)cl->getClassDelegatee(vm); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); + JnjvmClassLoader* loader = cl->classLoader; + UserCommonClass* fieldCl = field->getSignature()->assocClass(loader); + res = (jclass)fieldCl->getClassDelegatee(vm); END_NATIVE_EXCEPTION @@ -83,14 +82,15 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); const Typedef* type = field->getSignature(); void* Obj = (void*)obj; if (isStatic(field->access)) { - UserClass* cl = internalGetClass(vm, field, Field); cl->initialiseClass(vm); Obj = cl->getStaticInstance(); } else { @@ -131,13 +131,14 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); void* Obj = (void*)obj; if (isStatic(field->access)) { - UserClass* cl = internalGetClass(vm, field, Field); cl->initialiseClass(vm); Obj = cl->getStaticInstance(); } else { @@ -180,13 +181,14 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); void* Obj = (void*)obj; if (isStatic(field->access)) { - UserClass* cl = internalGetClass(vm, field, Field); cl->initialiseClass(vm); Obj = cl->getStaticInstance(); } else { @@ -221,13 +223,14 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); void* Obj = (void*)obj; if (isStatic(field->access)) { - UserClass* cl = internalGetClass(vm, field, Field); cl->initialiseClass(vm); Obj = cl->getStaticInstance(); } else { @@ -272,13 +275,14 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); void* Obj = (void*)obj; if (isStatic(field->access)) { - UserClass* cl = internalGetClass(vm, field, Field); cl->initialiseClass(vm); Obj = cl->getStaticInstance(); } else { @@ -313,13 +317,14 @@ Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); void* Obj = (void*)obj; if (isStatic(field->access)) { - UserClass* cl = internalGetClass(vm, field, Field); cl->initialiseClass(vm); Obj = cl->getStaticInstance(); } else { @@ -355,13 +360,14 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); void* Obj = (void*)obj; if (isStatic(field->access)) { - UserClass* cl = internalGetClass(vm, field, Field); cl->initialiseClass(vm); Obj = cl->getStaticInstance(); } else { @@ -397,13 +403,14 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); void* Obj = (void*)obj; if (isStatic(field->access)) { - UserClass* cl = internalGetClass(vm, field, Field); cl->initialiseClass(vm); Obj = cl->getStaticInstance(); } else { @@ -450,13 +457,14 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, Field); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)Field); + JavaField* field = &(cl->virtualFields[index]); void* Obj = (void*)_obj; if (isStatic(field->access)) { - UserClass* cl = internalGetClass(vm, field, Field); cl->initialiseClass(vm); Obj = cl->getStaticInstance(); } else { @@ -527,8 +535,10 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); uintptr_t buf = (uintptr_t)alloca(sizeof(uint64)); void* _buf = (void*)buf; const Typedef* type = field->getSignature(); @@ -538,7 +548,6 @@ void* Obj = (void*)obj; if (isStatic(field->access)) { - UserClass* cl = internalGetClass(vm, field, Field); cl->initialiseClass(vm); Obj = cl->getStaticInstance(); } else { @@ -580,13 +589,14 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); void* Obj = (void*)obj; if (isStatic(field->access)) { - UserClass* cl = internalGetClass(vm, field, Field); cl->initialiseClass(vm); Obj = cl->getStaticInstance(); } else { @@ -617,13 +627,14 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); void* Obj = (void*)obj; if (isStatic(field->access)) { - UserClass* cl = internalGetClass(vm, field, Field); cl->initialiseClass(vm); Obj = cl->getStaticInstance(); } else { @@ -663,13 +674,14 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); void* Obj = (void*)obj; if (isStatic(field->access)) { - UserClass* cl = internalGetClass(vm, field, Field); cl->initialiseClass(vm); Obj = cl->getStaticInstance(); } else { @@ -706,13 +718,14 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); void* Obj = (void*)obj; if (isStatic(field->access)) { - UserClass* cl = internalGetClass(vm, field, Field); cl->initialiseClass(vm); Obj = cl->getStaticInstance(); } else { @@ -750,13 +763,14 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); void* Obj = (void*)obj; if (isStatic(field->access)) { - UserClass* cl = internalGetClass(vm, field, Field); cl->initialiseClass(vm); Obj = cl->getStaticInstance(); } else { @@ -792,13 +806,14 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); void* Obj = (void*)obj; if (isStatic(field->access)) { - UserClass* cl = internalGetClass(vm, field, Field); cl->initialiseClass(vm); Obj = cl->getStaticInstance(); } else { @@ -833,13 +848,14 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); void* Obj = (void*)obj; if (isStatic(field->access)) { - UserClass* cl = internalGetClass(vm, field, Field); cl->initialiseClass(vm); Obj = cl->getStaticInstance(); } else { @@ -871,13 +887,14 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, obj); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + JavaField* field = &(cl->virtualFields[index]); void* Obj = (void*)obj; if (isStatic(field->access)) { - UserClass* cl = internalGetClass(vm, field, Field); cl->initialiseClass(vm); Obj = cl->getStaticInstance(); } else { @@ -903,11 +920,12 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -JavaObject* Unsafe, -JavaObject* Field) { +jobject Unsafe, jobject Field) { Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, Field); JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)Field); + JavaField* field = &(cl->virtualFields[index]); return (jlong)field->ptrOffset; } Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp?rev=62320&r1=62319&r2=62320&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp Fri Jan 16 08:55:27 2009 @@ -24,18 +24,11 @@ extern "C" { -// internalGetClass selects the class of a method depending on the isolate -// environment. In a sharing environment, the class is located in the -// Java object. In regular environment, it is the classDef of the method. -static UserClass* internalGetClass(Jnjvm* vm, JavaMethod* meth, jobject Meth) { -#ifdef ISOLATE_SHARING +static UserClass* internalGetClass(Jnjvm* vm, jobject Meth) { JavaField* field = vm->upcalls->methodClass; JavaObject* Cl = (JavaObject*)field->getInt32Field((JavaObject*)Meth); UserClass* cl = (UserClass*)UserCommonClass::resolvedImplClass(vm, Cl, false); return cl; -#else - return meth->classDef; -#endif } @@ -50,8 +43,10 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, Meth); JavaField* slot = vm->upcalls->methodSlot; - JavaMethod* meth = (JavaMethod*)slot->getInt32Field((JavaObject*)Meth); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)Meth); + JavaMethod* meth = &(cl->virtualMethods[index]); res = meth->access; @@ -71,9 +66,10 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, Meth); JavaField* slot = vm->upcalls->methodSlot; - JavaMethod* meth = (JavaMethod*)slot->getInt32Field((JavaObject*)Meth); - UserClass* cl = internalGetClass(vm, meth, Meth); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)Meth); + JavaMethod* meth = &(cl->virtualMethods[index]); JnjvmClassLoader* loader = cl->classLoader; res = (jclass)meth->getReturnType(loader); @@ -94,9 +90,10 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, Meth); JavaField* slot = vm->upcalls->methodSlot; - JavaMethod* meth = (JavaMethod*)slot->getInt32Field((JavaObject*)Meth); - UserClass* cl = internalGetClass(vm, meth, Meth); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)Meth); + JavaMethod* meth = &(cl->virtualMethods[index]); JnjvmClassLoader* loader = cl->classLoader; res = (jobject)(meth->getParameterTypes(loader)); @@ -110,14 +107,17 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Meth, jobject _obj, jobject _args, jclass Cl, jint _meth) { +jobject Meth, jobject _obj, jobject _args, jclass Cl, jint index) { JavaObject* res = 0; BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - JavaMethod* meth = (JavaMethod*)_meth; + UserClass* cl = internalGetClass(vm, Meth); + JavaField* slot = vm->upcalls->methodSlot; + uint32 index = (uint32)slot->getInt32Field((JavaObject*)Meth); + JavaMethod* meth = &(cl->virtualMethods[index]); JavaArray* args = (JavaArray*)_args; sint32 nbArgs = args ? args->size : 0; Signdef* sign = meth->getSignature(); @@ -251,17 +251,18 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject _meth) { +jobject Meth) { jobjectArray res = 0; BEGIN_NATIVE_EXCEPTION(0) - verifyNull(_meth); + verifyNull(Meth); Jnjvm* vm = JavaThread::get()->getJVM(); + UserClass* cl = internalGetClass(vm, Meth); JavaField* slot = vm->upcalls->methodSlot; - JavaMethod* meth = (JavaMethod*)slot->getInt32Field((JavaObject*)_meth); - UserClass* cl = internalGetClass(vm, meth, _meth); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)Meth); + JavaMethod* meth = &(cl->virtualMethods[index]); JnjvmClassLoader* loader = cl->classLoader; res = (jobjectArray)meth->getExceptionTypes(loader); Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h?rev=62320&r1=62319&r2=62320&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h Fri Jan 16 08:55:27 2009 @@ -44,9 +44,9 @@ class JavaObjectField : public JavaObject { private: uint8 flag; - JavaObject* declaringClass; + JavaObjectClass* declaringClass; JavaObject* name; - JavaField* slot; + uint32 slot; public: @@ -54,8 +54,6 @@ obj->JavaObject::CALL_TRACER; obj->name->MARK_AND_TRACE; obj->declaringClass->MARK_AND_TRACE; - // No need to see if classDef != NULL, it must be. - if (obj->slot) obj->slot->classDef->classLoader->MARK_AND_TRACE; } }; @@ -65,7 +63,7 @@ uint8 flag; JavaObject* declaringClass; JavaObject* name; - JavaMethod* slot; + uint32 slot; public: @@ -73,7 +71,6 @@ obj->JavaObject::CALL_TRACER; obj->name->MARK_AND_TRACE; obj->declaringClass->MARK_AND_TRACE; - if (obj->slot) obj->slot->classDef->classLoader->MARK_AND_TRACE; } }; @@ -82,13 +79,12 @@ private: uint8 flag; JavaObject* clazz; - JavaMethod* slot; + uint32 slot; public: static void STATIC_TRACER(JavaObjectConstructor) { obj->JavaObject::CALL_TRACER; obj->clazz->MARK_AND_TRACE; - if (obj->slot) obj->slot->classDef->classLoader->MARK_AND_TRACE; } }; Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp?rev=62320&r1=62319&r2=62320&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp Fri Jan 16 08:55:27 2009 @@ -91,20 +91,32 @@ result = (jobject)vm->upcalls->constructorArrayClass->doNew(0, vm); } else { UserClass* realCl = (Class*)cl; - std::vector res; - realCl->getDeclaredConstructors(res, publicOnly); + JnjvmClassLoader* classLoader = cl->classLoader; + uint32 size = 0; + for (uint32 i = 0; i < realCl->nbVirtualMethods; ++i) { + JavaMethod* meth = &realCl->virtualMethods[i]; + bool pub = isPublic(meth->access); + if (meth->name->equals(classLoader->bootstrapLoader->initName) && + (!publicOnly || pub)) { + ++size; + } + } + + ArrayObject* ret = - (ArrayObject*)vm->upcalls->constructorArrayClass->doNew(res.size(), vm); + (ArrayObject*)vm->upcalls->constructorArrayClass->doNew(size, vm); sint32 index = 0; - for (std::vector::iterator i = res.begin(), e = res.end(); - i != e; ++i, ++index) { - JavaMethod* meth = *i; - // TODO: check parameter types - UserClass* Cons = vm->upcalls->newConstructor; - JavaObject* tmp = Cons->doNew(vm); - vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp, Cl, meth); - ret->elements[index] = tmp; + for (uint32 i = 0; i < realCl->nbVirtualMethods; ++i) { + JavaMethod* meth = &realCl->virtualMethods[i]; + bool pub = isPublic(meth->access); + if (meth->name->equals(classLoader->bootstrapLoader->initName) && + (!publicOnly || pub)) { + UserClass* Cons = vm->upcalls->newConstructor; + JavaObject* tmp = Cons->doNew(vm); + vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp, Cl, i); + ret->elements[index++] = tmp; + } } result = (jobject)ret; } @@ -134,23 +146,37 @@ if (cl->isArray() || cl->isPrimitive()) { result = (jobject)upcalls->methodArrayClass->doNew(0, vm); } else { - std::vector res; - UserClass* realCl = cl->asClass(); - realCl->getDeclaredMethods(res, publicOnly); + UserClass* realCl = (Class*)cl; + JnjvmClassLoader* classLoader = cl->classLoader; + uint32 size = 0; + + for (uint32 i = 0; i < realCl->nbVirtualMethods + realCl->nbStaticMethods; + ++i) { + JavaMethod* meth = &realCl->virtualMethods[i]; + bool pub = isPublic(meth->access); + if (!(meth->name->equals(classLoader->bootstrapLoader->initName)) && + (!publicOnly || pub)) { + ++size; + } + } + - ArrayObject* ret = - (ArrayObject*)upcalls->methodArrayClass->doNew(res.size(), vm); + ArrayObject* ret = (ArrayObject*)upcalls->methodArrayClass->doNew(size, vm); sint32 index = 0; - for (std::vector::iterator i = res.begin(), e = res.end(); - i != e; ++i, ++index) { - JavaMethod* meth = *i; - // TODO: check parameter types - UserClass* Meth = vm->upcalls->newMethod; - JavaObject* tmp = Meth->doNew(vm); - JavaString* str = vm->internalUTF8ToStr(meth->name); - upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp, Cl, str, meth); - ret->elements[index] = tmp; + for (uint32 i = 0; i < realCl->nbVirtualMethods + realCl->nbStaticMethods; + ++i) { + JavaMethod* meth = &realCl->virtualMethods[i]; + bool pub = isPublic(meth->access); + if (!(meth->name->equals(classLoader->bootstrapLoader->initName)) && + (!publicOnly || pub)) { + // TODO: check parameter types + UserClass* Meth = vm->upcalls->newMethod; + JavaObject* tmp = Meth->doNew(vm); + JavaString* str = vm->internalUTF8ToStr(meth->name); + upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp, Cl, str, i); + ret->elements[index++] = tmp; + } } result = (jobject)ret; } @@ -375,21 +401,29 @@ if (!cl) { result = (jobject)vm->upcalls->fieldArrayClass->doNew(0, vm); } else { - std::vector res; - cl->getDeclaredFields(res, publicOnly); + uint32 size = 0; + for (uint32 i = 0; i < cl->nbVirtualFields + cl->nbStaticFields; ++i) { + JavaField* field = &cl->virtualFields[i]; + if (!publicOnly || isPublic(field->access)) { + ++size; + } + } + + ArrayObject* ret = - (ArrayObject*)vm->upcalls->fieldArrayClass->doNew(res.size(), vm); + (ArrayObject*)vm->upcalls->fieldArrayClass->doNew(size, vm); sint32 index = 0; - for (std::vector::iterator i = res.begin(), e = res.end(); - i != e; ++i, ++index) { - JavaField* field = *i; - // TODO: check parameter types - UserClass* Field = vm->upcalls->newField; - JavaObject* tmp = Field->doNew(vm); - JavaString* name = vm->internalUTF8ToStr(field->name); - vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp, Cl, name, field); - ret->elements[index] = tmp; + for (uint32 i = 0; i < cl->nbVirtualFields + cl->nbStaticFields; ++i) { + JavaField* field = &cl->virtualFields[i]; + if (!publicOnly || isPublic(field->access)) { + // TODO: check parameter types + UserClass* Field = vm->upcalls->newField; + JavaObject* tmp = Field->doNew(vm); + JavaString* name = vm->internalUTF8ToStr(field->name); + vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp, Cl, name, i); + ret->elements[index++] = tmp; + } } result = (jobject)ret; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=62320&r1=62319&r2=62320&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Fri Jan 16 08:55:27 2009 @@ -1029,41 +1029,55 @@ // thinlock ClassElts.push_back(Constant::getNullValue(ptrType)); + if (cl->nbVirtualFields + cl->nbStaticFields) { + ATy = ArrayType::get(JavaFieldType->getContainedType(0), + cl->nbVirtualFields + cl->nbStaticFields); + } + // virtualFields if (cl->nbVirtualFields) { - ATy = ArrayType::get(JavaFieldType->getContainedType(0), cl->nbVirtualFields); for (uint32 i = 0; i < cl->nbVirtualFields; ++i) { TempElts.push_back(CreateConstantFromJavaField(cl->virtualFields[i])); } - Constant* fields = ConstantArray::get(ATy, TempElts); - TempElts.clear(); - fields = new GlobalVariable(ATy, false, GlobalValue::InternalLinkage, - fields, "", this); - fields = ConstantExpr::getCast(Instruction::BitCast, fields, JavaFieldType); - ClassElts.push_back(fields); - } else { - ClassElts.push_back(Constant::getNullValue(JavaFieldType)); - } - - // nbVirtualFields - ClassElts.push_back(ConstantInt::get(Type::Int16Ty, cl->nbVirtualFields)); + } // staticFields if (cl->nbStaticFields) { - ATy = ArrayType::get(JavaFieldType->getContainedType(0), cl->nbStaticFields); for (uint32 i = 0; i < cl->nbStaticFields; ++i) { TempElts.push_back(CreateConstantFromJavaField(cl->staticFields[i])); } + + } + + Constant* fields = 0; + if (cl->nbStaticFields + cl->nbVirtualFields) { - Constant* fields = ConstantArray::get(ATy, TempElts); + fields = ConstantArray::get(ATy, TempElts); TempElts.clear(); fields = new GlobalVariable(ATy, false, GlobalValue::InternalLinkage, fields, "", this); fields = ConstantExpr::getCast(Instruction::BitCast, fields, JavaFieldType); - ClassElts.push_back(fields); + } else { + fields = Constant::getNullValue(JavaFieldType); + } + + // virtualFields + ClassElts.push_back(fields); + + ConstantInt* nbVirtualFields = + ConstantInt::get(Type::Int16Ty, cl->nbVirtualFields); + // nbVirtualFields + ClassElts.push_back(nbVirtualFields); + + // staticFields + if (cl->nbStaticFields + cl->nbVirtualFields) { + + Constant* I[1] = { nbVirtualFields }; + Constant* C = ConstantExpr::getGetElementPtr(fields, I, 1); + ClassElts.push_back(C); } else { ClassElts.push_back(Constant::getNullValue(JavaFieldType)); } @@ -1072,15 +1086,26 @@ ClassElts.push_back(ConstantInt::get(Type::Int16Ty, cl->nbStaticFields)); // virtualMethods - if (cl->nbVirtualMethods) { + if (cl->nbVirtualMethods + cl->nbStaticMethods) { ATy = ArrayType::get(JavaMethodType->getContainedType(0), - cl->nbVirtualMethods); + cl->nbVirtualMethods + cl->nbStaticMethods); + } + if (cl->nbVirtualMethods) { for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) { TempElts.push_back(CreateConstantFromJavaMethod(cl->virtualMethods[i])); } + } + + if (cl->nbStaticMethods) { + for (uint32 i = 0; i < cl->nbStaticMethods; ++i) { + TempElts.push_back(CreateConstantFromJavaMethod(cl->staticMethods[i])); + } + } - Constant* methods = ConstantArray::get(ATy, TempElts); + Constant* methods = 0; + if (cl->nbVirtualMethods + cl->nbStaticMethods) { + methods = ConstantArray::get(ATy, TempElts); TempElts.clear(); GlobalVariable* GV = new GlobalVariable(ATy, false, GlobalValue::InternalLinkage, @@ -1088,31 +1113,24 @@ virtualMethods.insert(std::make_pair(cl, GV)); methods = ConstantExpr::getCast(Instruction::BitCast, GV, JavaMethodType); - ClassElts.push_back(methods); } else { - ClassElts.push_back(Constant::getNullValue(JavaMethodType)); + methods = Constant::getNullValue(JavaMethodType); } + // virtualMethods + ClassElts.push_back(methods); + + ConstantInt* nbVirtualMethods = + ConstantInt::get(Type::Int16Ty, cl->nbVirtualMethods); // nbVirtualMethods - ClassElts.push_back(ConstantInt::get(Type::Int16Ty, cl->nbVirtualMethods)); + ClassElts.push_back(nbVirtualMethods); // staticMethods - if (cl->nbStaticMethods) { - ATy = ArrayType::get(JavaMethodType->getContainedType(0), - cl->nbStaticMethods); - - for (uint32 i = 0; i < cl->nbStaticMethods; ++i) { - TempElts.push_back(CreateConstantFromJavaMethod(cl->staticMethods[i])); - } - - Constant* methods = ConstantArray::get(ATy, TempElts); - TempElts.clear(); - GlobalVariable* GV = new GlobalVariable(ATy, false, - GlobalValue::InternalLinkage, - methods, "", this); - staticMethods.insert(std::make_pair(cl, GV)); - methods = ConstantExpr::getCast(Instruction::BitCast, GV, JavaMethodType); - ClassElts.push_back(methods); + if (cl->nbStaticMethods + cl->nbVirtualMethods) { + Constant* I[1] = { nbVirtualMethods }; + Constant* C = ConstantExpr::getGetElementPtr(methods, I, 1); + ClassElts.push_back(C); + staticMethods.insert(std::make_pair(cl, C)); } else { ClassElts.push_back(Constant::getNullValue(JavaMethodType)); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=62320&r1=62319&r2=62320&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Fri Jan 16 08:55:27 2009 @@ -191,10 +191,10 @@ std::map enveloppes; std::map nativeFunctions; std::map utf8s; - std::map virtualMethods; - std::map staticMethods; + std::map virtualMethods; + std::map staticMethods; - typedef std::map::iterator + typedef std::map::iterator method_iterator; typedef std::map::iterator From nicolas.geoffray at lip6.fr Fri Jan 16 07:07:37 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 16 Jan 2009 15:07:37 -0000 Subject: [vmkit-commits] [vmkit] r62321 - in /vmkit/trunk/lib/JnJVM/VMCore: JnjvmModule.cpp JnjvmModule.h Message-ID: <200901161507.n0GF7bhp015121@zion.cs.uiuc.edu> Author: geoffray Date: Fri Jan 16 09:07:37 2009 New Revision: 62321 URL: http://llvm.org/viewvc/llvm-project?rev=62321&view=rev Log: Just index in the virtualMethods array, don't bother with staticMethods. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=62321&r1=62320&r2=62321&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Fri Jan 16 09:07:37 2009 @@ -208,26 +208,14 @@ Class* cl = meth->classDef; Constant* MOffset = 0; Constant* Array = 0; - if (isVirtual(meth->access)) { - method_iterator SI = virtualMethods.find(cl); - for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) { - if (&cl->virtualMethods[i] == meth) { - MOffset = ConstantInt::get(Type::Int32Ty, i); - break; - } + method_iterator SI = virtualMethods.find(cl); + for (uint32 i = 0; i < cl->nbVirtualMethods + cl->nbStaticMethods; ++i) { + if (&cl->virtualMethods[i] == meth) { + MOffset = ConstantInt::get(Type::Int32Ty, i); + break; } - Array = SI->second; - } else { - method_iterator SI = staticMethods.find(cl); - for (uint32 i = 0; i < cl->nbStaticMethods; ++i) { - if (&cl->staticMethods[i] == meth) { - MOffset = ConstantInt::get(Type::Int32Ty, i); - break; - } - } - Array = SI->second; } - + Array = SI->second; Constant* GEPs[2] = { constantZero, MOffset }; return ConstantExpr::getGetElementPtr(Array, GEPs, 2); @@ -1130,7 +1118,6 @@ Constant* I[1] = { nbVirtualMethods }; Constant* C = ConstantExpr::getGetElementPtr(methods, I, 1); ClassElts.push_back(C); - staticMethods.insert(std::make_pair(cl, C)); } else { ClassElts.push_back(Constant::getNullValue(JavaMethodType)); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=62321&r1=62320&r2=62321&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Fri Jan 16 09:07:37 2009 @@ -192,7 +192,6 @@ std::map nativeFunctions; std::map utf8s; std::map virtualMethods; - std::map staticMethods; typedef std::map::iterator method_iterator; From nicolas.geoffray at lip6.fr Fri Jan 16 15:44:15 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 16 Jan 2009 23:44:15 -0000 Subject: [vmkit-commits] [vmkit] r62381 - in /vmkit/trunk/lib/JnJVM/Classpath: ClasspathConstructor.cpp ClasspathField.cpp ClasspathMethod.cpp Message-ID: <200901162344.n0GNiFBG001305@zion.cs.uiuc.edu> Author: geoffray Date: Fri Jan 16 17:44:14 2009 New Revision: 62381 URL: http://llvm.org/viewvc/llvm-project?rev=62381&view=rev Log: Field is object, not int32. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp?rev=62381&r1=62380&r2=62381&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp Fri Jan 16 17:44:14 2009 @@ -26,7 +26,7 @@ static UserClass* internalGetClass(Jnjvm* vm, jobject Meth) { JavaField* field = vm->upcalls->constructorClass; - JavaObject* Cl = (JavaObject*)field->getInt32Field((JavaObject*)Meth); + JavaObject* Cl = (JavaObject*)field->getObjectField((JavaObject*)Meth); UserClass* cl = (UserClass*)UserCommonClass::resolvedImplClass(vm, Cl, false); return cl; } Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp?rev=62381&r1=62380&r2=62381&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp Fri Jan 16 17:44:14 2009 @@ -21,7 +21,7 @@ static UserClass* internalGetClass(Jnjvm* vm, jobject Field) { JavaField* slot = vm->upcalls->fieldClass; - JavaObject* Cl = (JavaObject*)slot->getInt32Field((JavaObject*)Field); + JavaObject* Cl = (JavaObject*)slot->getObjectField((JavaObject*)Field); UserClass* cl = (UserClass*)UserCommonClass::resolvedImplClass(vm, Cl, false); return cl; } Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp?rev=62381&r1=62380&r2=62381&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp Fri Jan 16 17:44:14 2009 @@ -26,7 +26,7 @@ static UserClass* internalGetClass(Jnjvm* vm, jobject Meth) { JavaField* field = vm->upcalls->methodClass; - JavaObject* Cl = (JavaObject*)field->getInt32Field((JavaObject*)Meth); + JavaObject* Cl = (JavaObject*)field->getObjectField((JavaObject*)Meth); UserClass* cl = (UserClass*)UserCommonClass::resolvedImplClass(vm, Cl, false); return cl; } From nicolas.geoffray at lip6.fr Mon Jan 19 01:20:27 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 19 Jan 2009 09:20:27 -0000 Subject: [vmkit-commits] [vmkit] r62507 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaClass.h Message-ID: <200901190920.n0J9KRM3011609@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 19 03:20:25 2009 New Revision: 62507 URL: http://llvm.org/viewvc/llvm-project?rev=62507&view=rev Log: Remove unused methods. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=62507&r1=62506&r2=62507&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Mon Jan 19 03:20:25 2009 @@ -28,7 +28,6 @@ #include "Reader.h" #include -#include using namespace jnjvm; @@ -988,56 +987,6 @@ } } -void Class::getDeclaredConstructors(std::vector& res, - bool publicOnly) { - for (uint32 i = 0; i < nbVirtualMethods; ++i) { - JavaMethod* meth = &virtualMethods[i]; - bool pub = isPublic(meth->access); - if (meth->name->equals(classLoader->bootstrapLoader->initName) && - (!publicOnly || pub)) { - res.push_back(meth); - } - } -} - -void Class::getDeclaredMethods(std::vector& res, - bool publicOnly) { - for (uint32 i = 0; i < nbVirtualMethods; ++i) { - JavaMethod* meth = &virtualMethods[i]; - bool pub = isPublic(meth->access); - if (!(meth->name->equals(classLoader->bootstrapLoader->initName)) && - (!publicOnly || pub)) { - res.push_back(meth); - } - } - - for (uint32 i = 0; i < nbStaticMethods; ++i) { - JavaMethod* meth = &staticMethods[i]; - bool pub = isPublic(meth->access); - if (!(meth->name->equals(classLoader->bootstrapLoader->clinitName)) && - (!publicOnly || pub)) { - res.push_back(meth); - } - } -} - -void Class::getDeclaredFields(std::vector& res, - bool publicOnly) { - for (uint32 i = 0; i < nbVirtualFields; ++i) { - JavaField* field = &virtualFields[i]; - if (!publicOnly || isPublic(field->access)) { - res.push_back(field); - } - } - - for (uint32 i = 0; i < nbStaticFields; ++i) { - JavaField* field = &staticFields[i]; - if (!publicOnly || isPublic(field->access)) { - res.push_back(field); - } - } -} - static JavaObject* getClassType(Jnjvm* vm, JnjvmClassLoader* loader, Typedef* type) { UserCommonClass* res = type->assocClass(loader); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=62507&r1=62506&r2=62507&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Mon Jan 19 03:20:25 2009 @@ -24,7 +24,6 @@ #include "JnjvmConfig.h" #include -#include namespace jnjvm { @@ -529,20 +528,6 @@ uint32 getVirtualSize() { return virtualSize; } VirtualTable* getVirtualVT() { return virtualVT; } - /// getDeclaredConstructors - Returns the methods defined in this class which - /// are constructors. - /// - void getDeclaredConstructors(std::vector& res, bool publicOnly); - - /// getDeclaredMethod - Returns the methods defined in this class which are - /// not constructors. - // - void getDeclaredMethods(std::vector& res, bool publicOnly); - - /// getDeclaredFields - Returns the fields defined in this class. - /// - void getDeclaredFields(std::vector& res, bool publicOnly); - /// getOwnerClass - Get the thread that is currently initializing the class. /// mvm::Thread* getOwnerClass() { From nicolas.geoffray at lip6.fr Mon Jan 19 01:21:24 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 19 Jan 2009 09:21:24 -0000 Subject: [vmkit-commits] [vmkit] r62508 - in /vmkit/trunk/lib/JnJVM/Classpath: Classpath.cpp ClasspathReflect.h Message-ID: <200901190921.n0J9LOw2011656@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 19 03:21:23 2009 New Revision: 62508 URL: http://llvm.org/viewvc/llvm-project?rev=62508&view=rev Log: Bugfix for migration of slot field in reflect classes from internal field to index in array. Modified: vmkit/trunk/lib/JnJVM/Classpath/Classpath.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h Modified: vmkit/trunk/lib/JnJVM/Classpath/Classpath.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/Classpath.cpp?rev=62508&r1=62507&r2=62508&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/Classpath.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/Classpath.cpp Mon Jan 19 03:21:23 2009 @@ -10,6 +10,7 @@ #include "Classpath.h" +#include "ClasspathReflect.h" #include "JavaClass.h" #include "JavaThread.h" #include "JavaUpcalls.h" @@ -56,14 +57,12 @@ JNIEnv *env, jclass clazz, #endif -jobject Field, jobject obj, jboolean val) { +JavaObjectField* Field, jobject obj, jboolean val) { BEGIN_NATIVE_EXCEPTION(0) verifyNull(obj); - Jnjvm* vm = JavaThread::get()->getJVM(); - JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + JavaField* field = Field->getInternalField(); field->setInt8Field((JavaObject*)obj, (uint8)val); END_NATIVE_EXCEPTION @@ -74,14 +73,12 @@ JNIEnv *env, jclass clazz, #endif -jobject Field, jobject obj, jbyte val) { +JavaObjectField* Field, jobject obj, jbyte val) { BEGIN_NATIVE_EXCEPTION(0) verifyNull(obj); - Jnjvm* vm = JavaThread::get()->getJVM(); - JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + JavaField* field = Field->getInternalField(); field->setInt8Field((JavaObject*)obj, (uint8)val); END_NATIVE_EXCEPTION @@ -92,14 +89,12 @@ JNIEnv *env, jclass clazz, #endif -jobject Field, jobject obj, jchar val) { +JavaObjectField* Field, jobject obj, jchar val) { BEGIN_NATIVE_EXCEPTION(0) verifyNull(obj); - Jnjvm* vm = JavaThread::get()->getJVM(); - JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + JavaField* field = Field->getInternalField(); field->setInt16Field((JavaObject*)obj, (uint16)val); END_NATIVE_EXCEPTION @@ -110,14 +105,12 @@ JNIEnv *env, jclass clazz, #endif -jobject Field, jobject obj, jshort val) { +JavaObjectField* Field, jobject obj, jshort val) { BEGIN_NATIVE_EXCEPTION(0) verifyNull(obj); - Jnjvm* vm = JavaThread::get()->getJVM(); - JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + JavaField* field = Field->getInternalField(); field->setInt16Field((JavaObject*)obj, (sint16)val); END_NATIVE_EXCEPTION @@ -128,14 +121,12 @@ JNIEnv *env, jclass clazz, #endif -jobject Field, jobject obj, jint val) { +JavaObjectField* Field, jobject obj, jint val) { BEGIN_NATIVE_EXCEPTION(0) verifyNull(obj); - Jnjvm* vm = JavaThread::get()->getJVM(); - JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + JavaField* field = Field->getInternalField(); field->setInt32Field((JavaObject*)obj, (sint32)val); END_NATIVE_EXCEPTION @@ -146,14 +137,12 @@ JNIEnv *env, jclass clazz, #endif -jobject Field, jobject obj, jlong val) { +JavaObjectField* Field, jobject obj, jlong val) { BEGIN_NATIVE_EXCEPTION(0) verifyNull(obj); - Jnjvm* vm = JavaThread::get()->getJVM(); - JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + JavaField* field = Field->getInternalField(); field->setLongField((JavaObject*)obj, (sint64)val); END_NATIVE_EXCEPTION @@ -164,14 +153,12 @@ JNIEnv *env, jclass clazz, #endif -jobject Field, jobject obj, jfloat val) { +JavaObjectField* Field, jobject obj, jfloat val) { BEGIN_NATIVE_EXCEPTION(0) verifyNull(obj); - Jnjvm* vm = JavaThread::get()->getJVM(); - JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + JavaField* field = Field->getInternalField(); field->setFloatField((JavaObject*)obj, (float)val); END_NATIVE_EXCEPTION @@ -182,14 +169,12 @@ JNIEnv *env, jclass clazz, #endif -jobject Field, jobject obj, jdouble val) { +JavaObjectField* Field, jobject obj, jdouble val) { BEGIN_NATIVE_EXCEPTION(0) verifyNull(obj); - Jnjvm* vm = JavaThread::get()->getJVM(); - JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + JavaField* field = Field->getInternalField(); field->setDoubleField((JavaObject*)obj, (double)val); END_NATIVE_EXCEPTION @@ -200,14 +185,12 @@ JNIEnv *env, jclass clazz, #endif -jobject Field, jobject obj, jobject val) { +JavaObjectField* Field, jobject obj, jobject val) { BEGIN_NATIVE_EXCEPTION(0) verifyNull(obj); - Jnjvm* vm = JavaThread::get()->getJVM(); - JavaField* slot = vm->upcalls->fieldSlot; - JavaField* field = (JavaField*)slot->getInt32Field((JavaObject*)Field); + JavaField* field = Field->getInternalField(); field->setObjectField((JavaObject*)obj, (JavaObject*)val); END_NATIVE_EXCEPTION Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h?rev=62508&r1=62507&r2=62508&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h Mon Jan 19 03:21:23 2009 @@ -56,12 +56,16 @@ obj->declaringClass->MARK_AND_TRACE; } + JavaField* getInternalField() { + return &(((UserClass*)declaringClass->vmdata)->virtualFields[slot]); + } + }; class JavaObjectMethod : public JavaObject { private: uint8 flag; - JavaObject* declaringClass; + JavaObjectClass* declaringClass; JavaObject* name; uint32 slot; @@ -72,13 +76,17 @@ obj->name->MARK_AND_TRACE; obj->declaringClass->MARK_AND_TRACE; } + + JavaMethod* getInternalMethod() { + return &(((UserClass*)declaringClass->vmdata)->virtualMethods[slot]); + } }; class JavaObjectConstructor : public JavaObject { private: uint8 flag; - JavaObject* clazz; + JavaObjectClass* clazz; uint32 slot; public: @@ -86,6 +94,10 @@ obj->JavaObject::CALL_TRACER; obj->clazz->MARK_AND_TRACE; } + + JavaMethod* getInternalMethod() { + return &(((UserClass*)clazz->vmdata)->virtualMethods[slot]); + } }; From nicolas.geoffray at lip6.fr Mon Jan 19 05:39:58 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 19 Jan 2009 13:39:58 -0000 Subject: [vmkit-commits] [vmkit] r62509 - /vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp Message-ID: <200901191339.n0JDdwPg021954@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 19 07:39:57 2009 New Revision: 62509 URL: http://llvm.org/viewvc/llvm-project?rev=62509&view=rev Log: Bugfix after moving to slot = index in fields. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp?rev=62509&r1=62508&r2=62509&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp Mon Jan 19 07:39:57 2009 @@ -535,9 +535,9 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); + UserClass* cl = internalGetClass(vm, Field); JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); + uint32 index = (uint32)slot->getInt32Field((JavaObject*)Field); JavaField* field = &(cl->virtualFields[index]); uintptr_t buf = (uintptr_t)alloca(sizeof(uint64)); void* _buf = (void*)buf; From nicolas.geoffray at lip6.fr Mon Jan 19 05:43:06 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 19 Jan 2009 13:43:06 -0000 Subject: [vmkit-commits] [vmkit] r62510 - in /vmkit/trunk/lib/JnJVM/VMCore: JnjvmClassLoader.cpp JnjvmModule.cpp Message-ID: <200901191343.n0JDh77s022101@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 19 07:43:06 2009 New Revision: 62510 URL: http://llvm.org/viewvc/llvm-project?rev=62510&view=rev Log: Do not set staticFields and staticMethods statically: LLVM could align the array so that the assembly can reference in the middle of it. Rather initialize the fields at runtime, when adding the class to a classloader. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=62510&r1=62509&r2=62510&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Mon Jan 19 07:43:06 2009 @@ -1010,6 +1010,13 @@ // Extern "C" functions called by the vmjc static intializer. extern "C" void vmjcAddPreCompiledClass(JnjvmClassLoader* JCL, CommonClass* cl) { + // To avoid data alignment in the llvm assembly emitter, we set the + // staticMethods and staticFields fields here. + if (cl->isClass()) { + Class* realCl = cl->asClass(); + realCl->staticMethods = realCl->virtualMethods + realCl->nbVirtualMethods; + realCl->staticFields = realCl->virtualFields + realCl->nbVirtualFields; + } JCL->getClasses()->map.insert(std::make_pair(cl->name, cl)); cl->classLoader = JCL; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=62510&r1=62509&r2=62510&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Jan 19 07:43:06 2009 @@ -1061,14 +1061,9 @@ ClassElts.push_back(nbVirtualFields); // staticFields - if (cl->nbStaticFields + cl->nbVirtualFields) { - - Constant* I[1] = { nbVirtualFields }; - Constant* C = ConstantExpr::getGetElementPtr(fields, I, 1); - ClassElts.push_back(C); - } else { - ClassElts.push_back(Constant::getNullValue(JavaFieldType)); - } + // Output null, this will be set in the initializer. Otherwise, the + // assembly emitter of LLVM will try to align the data. + ClassElts.push_back(Constant::getNullValue(JavaFieldType)); // nbStaticFields ClassElts.push_back(ConstantInt::get(Type::Int16Ty, cl->nbStaticFields)); @@ -1114,13 +1109,8 @@ ClassElts.push_back(nbVirtualMethods); // staticMethods - if (cl->nbStaticMethods + cl->nbVirtualMethods) { - Constant* I[1] = { nbVirtualMethods }; - Constant* C = ConstantExpr::getGetElementPtr(methods, I, 1); - ClassElts.push_back(C); - } else { - ClassElts.push_back(Constant::getNullValue(JavaMethodType)); - } + // Output null, this will be set in the initializer. + ClassElts.push_back(Constant::getNullValue(JavaMethodType)); // nbStaticMethods ClassElts.push_back(ConstantInt::get(Type::Int16Ty, cl->nbStaticMethods)); From nicolas.geoffray at lip6.fr Tue Jan 20 00:07:23 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 20 Jan 2009 08:07:23 -0000 Subject: [vmkit-commits] [vmkit] r62575 - in /vmkit/trunk/lib/JnJVM/Classpath: ClasspathField.cpp ClasspathReflect.h Message-ID: <200901200807.n0K87N9h028791@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 20 02:07:23 2009 New Revision: 62575 URL: http://llvm.org/viewvc/llvm-project?rev=62575&view=rev Log: I'm buggy... Use the C++ representation instead of Java for having direct access to the fields of reflection objects. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp?rev=62575&r1=62574&r2=62575&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp Tue Jan 20 02:07:23 2009 @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "Classpath.h" +#include "ClasspathReflect.h" #include "JavaClass.h" #include "JavaThread.h" #include "JavaTypes.h" @@ -19,27 +20,16 @@ extern "C" { -static UserClass* internalGetClass(Jnjvm* vm, jobject Field) { - JavaField* slot = vm->upcalls->fieldClass; - JavaObject* Cl = (JavaObject*)slot->getObjectField((JavaObject*)Field); - UserClass* cl = (UserClass*)UserCommonClass::resolvedImplClass(vm, Cl, false); - return cl; -} - JNIEXPORT jint JNICALL Java_java_lang_reflect_Field_getModifiersInternal( #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject obj) { +JavaObjectField* Field) { jint res = 0; BEGIN_NATIVE_EXCEPTION(0) - Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); - JavaField* field = &(cl->virtualFields[index]); + JavaField* field = Field->getInternalField(); res = field->access; END_NATIVE_EXCEPTION @@ -51,17 +41,15 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject obj) { +JavaObjectField* Field) { jclass res = 0; BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); JnjvmClassLoader* loader = cl->classLoader; UserCommonClass* fieldCl = field->getSignature()->assocClass(loader); res = (jclass)fieldCl->getClassDelegatee(vm); @@ -75,17 +63,15 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject obj) { +JavaObjectField* Field, jobject obj) { jint res = 0; BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); const Typedef* type = field->getSignature(); void* Obj = (void*)obj; @@ -124,17 +110,15 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject obj) { +JavaObjectField* Field, jobject obj) { jlong res = 0; BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); void* Obj = (void*)obj; @@ -174,17 +158,15 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject obj) { +JavaObjectField* Field, jobject obj) { jboolean res = 0; BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); void* Obj = (void*)obj; @@ -216,17 +198,15 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject obj) { +JavaObjectField* Field, jobject obj) { jfloat res = 0; BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); void* Obj = (void*)obj; @@ -268,17 +248,15 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject obj) { +JavaObjectField* Field, jobject obj) { jbyte res = 0; BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); void* Obj = (void*)obj; @@ -309,7 +287,7 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject obj) { +JavaObjectField* Field, jobject obj) { jchar res = 0; @@ -317,10 +295,8 @@ Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); void* Obj = (void*)obj; @@ -352,7 +328,7 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject obj) { +JavaObjectField* Field, jobject obj) { jshort res = 0; @@ -360,10 +336,8 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); void* Obj = (void*)obj; @@ -396,17 +370,15 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject obj) { +JavaObjectField* Field, jobject obj) { jdouble res = 0; BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); void* Obj = (void*)obj; @@ -449,7 +421,7 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject _obj) { +JavaObjectField* Field, jobject _obj) { jobject result = 0; @@ -457,10 +429,8 @@ BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, Field); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)Field); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); void* Obj = (void*)_obj; @@ -530,15 +500,13 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject obj, jobject val) { +JavaObjectField* Field, jobject obj, jobject val) { BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, Field); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)Field); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); uintptr_t buf = (uintptr_t)alloca(sizeof(uint64)); void* _buf = (void*)buf; const Typedef* type = field->getSignature(); @@ -584,15 +552,13 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject obj, jboolean val) { +JavaObjectField* Field, jobject obj, jboolean val) { BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); void* Obj = (void*)obj; @@ -622,15 +588,13 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject obj, jbyte val) { +JavaObjectField* Field, jobject obj, jbyte val) { BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); void* Obj = (void*)obj; @@ -669,15 +633,13 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject obj, jchar val) { +JavaObjectField* Field, jobject obj, jchar val) { BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); void* Obj = (void*)obj; @@ -713,15 +675,13 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject obj, jshort val) { +JavaObjectField* Field, jobject obj, jshort val) { BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); void* Obj = (void*)obj; @@ -758,15 +718,13 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject obj, jint val) { +JavaObjectField* Field, jobject obj, jint val) { BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); void* Obj = (void*)obj; @@ -801,15 +759,13 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject obj, jlong val) { +JavaObjectField* Field, jobject obj, jlong val) { BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); void* Obj = (void*)obj; @@ -842,16 +798,14 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject obj, jfloat val) { +JavaObjectField* Field, jobject obj, jfloat val) { BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); void* Obj = (void*)obj; @@ -882,15 +836,13 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Field, jobject obj, jdouble val) { +JavaObjectField* Field, JavaObject* obj, jdouble val) { BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, obj); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)obj); - JavaField* field = &(cl->virtualFields[index]); + UserClass* cl = Field->getClass(); + JavaField* field = Field->getInternalField(); void* Obj = (void*)obj; @@ -920,12 +872,8 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Unsafe, jobject Field) { - Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, Field); - JavaField* slot = vm->upcalls->fieldSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)Field); - JavaField* field = &(cl->virtualFields[index]); +JavaObject* Unsafe, JavaObjectField* Field) { + JavaField* field = Field->getInternalField(); return (jlong)field->ptrOffset; } Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h?rev=62575&r1=62574&r2=62575&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h Tue Jan 20 02:07:23 2009 @@ -60,6 +60,10 @@ return &(((UserClass*)declaringClass->vmdata)->virtualFields[slot]); } + UserClass* getClass() { + return declaringClass->vmdata->asClass(); + } + }; class JavaObjectMethod : public JavaObject { From nicolas.geoffray at lip6.fr Tue Jan 20 01:27:55 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 20 Jan 2009 09:27:55 -0000 Subject: [vmkit-commits] [vmkit] r62577 - in /vmkit/trunk/lib/JnJVM: Classpath/Classpath.cpp Classpath/ClasspathReflect.h VMCore/Jni.cpp Message-ID: <200901200927.n0K9RtrA008904@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 20 03:27:54 2009 New Revision: 62577 URL: http://llvm.org/viewvc/llvm-project?rev=62577&view=rev Log: New bugfixes for the "slot" modification of reflection objects. Modified: vmkit/trunk/lib/JnJVM/Classpath/Classpath.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp Modified: vmkit/trunk/lib/JnJVM/Classpath/Classpath.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/Classpath.cpp?rev=62577&r1=62576&r2=62577&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/Classpath.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/Classpath.cpp Tue Jan 20 03:27:54 2009 @@ -201,7 +201,7 @@ JNIEnv *env, jclass clazz, #endif -jclass target, jclass constr, jobject cons) { +jclass target, jclass constr, JavaObjectConstructor* cons) { jobject res = 0; @@ -211,8 +211,7 @@ UserClass* cl = (UserClass*)UserCommonClass::resolvedImplClass(vm, (JavaObject*)target, true); JavaObject* obj = cl->doNew(vm); - JavaField* field = vm->upcalls->constructorSlot; - JavaMethod* meth = (JavaMethod*)(field->getInt32Field((JavaObject*)cons)); + JavaMethod* meth = cons->getInternalMethod(); meth->invokeIntSpecial(vm, cl, obj); res = (jobject)obj; Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h?rev=62577&r1=62576&r2=62577&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h Tue Jan 20 03:27:54 2009 @@ -84,6 +84,10 @@ JavaMethod* getInternalMethod() { return &(((UserClass*)declaringClass->vmdata)->virtualMethods[slot]); } + + UserClass* getClass() { + return declaringClass->vmdata->asClass(); + } }; @@ -102,6 +106,10 @@ JavaMethod* getInternalMethod() { return &(((UserClass*)clazz->vmdata)->virtualMethods[slot]); } + + UserClass* getClass() { + return clazz->vmdata->asClass(); + } }; Modified: vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp?rev=62577&r1=62576&r2=62577&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp Tue Jan 20 03:27:54 2009 @@ -9,6 +9,7 @@ #include +#include "ClasspathReflect.h" #include "JavaArray.h" #include "JavaClass.h" #include "JavaObject.h" @@ -90,9 +91,9 @@ JavaObject* meth = (JavaObject*)method; UserCommonClass* cl = meth->classOf; if (cl == upcalls->newConstructor) { - return (jmethodID)upcalls->constructorSlot->getInt32Field(meth); + return (jmethodID)((JavaObjectMethod*)meth)->getInternalMethod(); } else if (cl == upcalls->newMethod) { - return (jmethodID)upcalls->methodSlot->getInt32Field(meth); + return (jmethodID)((JavaObjectConstructor*)meth)->getInternalMethod(); } else { vm->unknownError("%s is not a constructor or a method", meth->printString()); From nicolas.geoffray at lip6.fr Tue Jan 20 03:17:38 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 20 Jan 2009 11:17:38 -0000 Subject: [vmkit-commits] [vmkit] r62580 - in /vmkit/trunk/lib/JnJVM/Classpath: ClasspathConstructor.cpp ClasspathMethod.cpp Message-ID: <200901201117.n0KBHe7f013390@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 20 05:17:33 2009 New Revision: 62580 URL: http://llvm.org/viewvc/llvm-project?rev=62580&view=rev Log: Do not use the fieldSlot, constructorSlot and methodSlot anymore, use the ClasspathReflect API instead. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp?rev=62580&r1=62579&r2=62580&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp Tue Jan 20 05:17:33 2009 @@ -11,6 +11,7 @@ #include "types.h" #include "Classpath.h" +#include "ClasspathReflect.h" #include "JavaArray.h" #include "JavaClass.h" #include "JavaObject.h" @@ -24,29 +25,19 @@ extern "C" { -static UserClass* internalGetClass(Jnjvm* vm, jobject Meth) { - JavaField* field = vm->upcalls->constructorClass; - JavaObject* Cl = (JavaObject*)field->getObjectField((JavaObject*)Meth); - UserClass* cl = (UserClass*)UserCommonClass::resolvedImplClass(vm, Cl, false); - return cl; -} - JNIEXPORT jobject JNICALL Java_java_lang_reflect_Constructor_getParameterTypes( #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject cons) { +JavaObjectConstructor* cons) { jobject res = 0; BEGIN_NATIVE_EXCEPTION(0) verifyNull(cons); - Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, cons); - JavaField* field = vm->upcalls->constructorSlot; - uint32 index = (uint32)(field->getInt32Field((JavaObject*)cons)); - JavaMethod* meth = &(cl->virtualMethods[index]); + UserClass* cl = cons->getClass(); + JavaMethod* meth = cons->getInternalMethod(); JnjvmClassLoader* loader = cl->classLoader; res = (jobject)meth->getParameterTypes(loader); @@ -59,18 +50,14 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject cons) { +JavaObjectConstructor* cons) { jint res = 0; BEGIN_NATIVE_EXCEPTION(0) verifyNull(cons); - Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, cons); - JavaField* field = vm->upcalls->constructorSlot; - uint32 index = (uint32)(field->getInt32Field((JavaObject*)cons)); - JavaMethod* meth = &(cl->virtualMethods[index]); + JavaMethod* meth = cons->getInternalMethod(); res = meth->access; END_NATIVE_EXCEPTION @@ -82,15 +69,14 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject _cons, jobject _args, jclass Clazz, jint index) { +JavaObjectConstructor* cons, jobject _args, jclass Clazz, jint index) { jobject res = 0; BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, _cons); - JavaMethod* meth = &(cl->virtualMethods[index]); + JavaMethod* meth = cons->getInternalMethod(); JavaArray* args = (JavaArray*)_args; sint32 nbArgs = args ? args->size : 0; Signdef* sign = meth->getSignature(); @@ -153,18 +139,15 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject cons) { +JavaObjectConstructor* cons) { jobjectArray res = 0; BEGIN_NATIVE_EXCEPTION(0) verifyNull(cons); - Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, cons); - JavaField* field = vm->upcalls->constructorSlot; - uint32 index = (uint32)(field->getInt32Field((JavaObject*)cons)); - JavaMethod* meth = &(cl->virtualMethods[index]); + UserClass* cl = cons->getClass(); + JavaMethod* meth = cons->getInternalMethod(); JnjvmClassLoader* loader = cl->classLoader; res = (jobjectArray)meth->getExceptionTypes(loader); Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp?rev=62580&r1=62579&r2=62580&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp Tue Jan 20 05:17:33 2009 @@ -11,6 +11,7 @@ #include "types.h" #include "Classpath.h" +#include "ClasspathReflect.h" #include "JavaArray.h" #include "JavaClass.h" #include "JavaObject.h" @@ -24,30 +25,17 @@ extern "C" { -static UserClass* internalGetClass(Jnjvm* vm, jobject Meth) { - JavaField* field = vm->upcalls->methodClass; - JavaObject* Cl = (JavaObject*)field->getObjectField((JavaObject*)Meth); - UserClass* cl = (UserClass*)UserCommonClass::resolvedImplClass(vm, Cl, false); - return cl; -} - - JNIEXPORT jint JNICALL Java_java_lang_reflect_Method_getModifiersInternal( #ifdef NATIVE_JNI JNIEnv *env, #endif - jobject Meth) { +JavaObjectMethod* Meth) { jint res = 0; BEGIN_NATIVE_EXCEPTION(0) - Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, Meth); - JavaField* slot = vm->upcalls->methodSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)Meth); - JavaMethod* meth = &(cl->virtualMethods[index]); - + JavaMethod* meth = Meth->getInternalMethod(); res = meth->access; END_NATIVE_EXCEPTION @@ -59,17 +47,14 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif - jobject Meth) { +JavaObjectMethod* Meth) { jclass res = 0; BEGIN_NATIVE_EXCEPTION(0) - Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, Meth); - JavaField* slot = vm->upcalls->methodSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)Meth); - JavaMethod* meth = &(cl->virtualMethods[index]); + UserClass* cl = Meth->getClass(); + JavaMethod* meth = Meth->getInternalMethod(); JnjvmClassLoader* loader = cl->classLoader; res = (jclass)meth->getReturnType(loader); @@ -83,17 +68,14 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Meth) { +JavaObjectMethod* Meth) { jobject res = 0; BEGIN_NATIVE_EXCEPTION(0) - Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, Meth); - JavaField* slot = vm->upcalls->methodSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)Meth); - JavaMethod* meth = &(cl->virtualMethods[index]); + UserClass* cl = Meth->getClass(); + JavaMethod* meth = Meth->getInternalMethod(); JnjvmClassLoader* loader = cl->classLoader; res = (jobject)(meth->getParameterTypes(loader)); @@ -107,17 +89,16 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Meth, jobject _obj, jobject _args, jclass Cl, jint index) { +JavaObjectMethod* Meth, jobject _obj, jobject _args, jclass Cl, jint index) { JavaObject* res = 0; BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, Meth); - JavaField* slot = vm->upcalls->methodSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)Meth); - JavaMethod* meth = &(cl->virtualMethods[index]); + + JavaMethod* meth = Meth->getInternalMethod(); + JavaArray* args = (JavaArray*)_args; sint32 nbArgs = args ? args->size : 0; Signdef* sign = meth->getSignature(); @@ -140,7 +121,7 @@ if (isInterface(cl->classDef->access)) { cl = obj->classOf->lookupClassFromMethod(meth); } else { - cl = internalGetClass(vm, meth, Meth); + cl = Meth->getClass(); } #endif @@ -251,18 +232,15 @@ #ifdef NATIVE_JNI JNIEnv *env, #endif -jobject Meth) { +JavaObjectMethod* Meth) { jobjectArray res = 0; BEGIN_NATIVE_EXCEPTION(0) verifyNull(Meth); - Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = internalGetClass(vm, Meth); - JavaField* slot = vm->upcalls->methodSlot; - uint32 index = (uint32)slot->getInt32Field((JavaObject*)Meth); - JavaMethod* meth = &(cl->virtualMethods[index]); + UserClass* cl = Meth->getClass(); + JavaMethod* meth = Meth->getInternalMethod(); JnjvmClassLoader* loader = cl->classLoader; res = (jobjectArray)meth->getExceptionTypes(loader); From nicolas.geoffray at lip6.fr Tue Jan 20 11:05:17 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 20 Jan 2009 19:05:17 -0000 Subject: [vmkit-commits] [vmkit] r62597 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaRuntimeJIT.cpp JnjvmClassLoader.cpp JnjvmClassLoader.h Message-ID: <200901201905.n0KJ5Hor028848@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 20 13:05:16 2009 New Revision: 62597 URL: http://llvm.org/viewvc/llvm-project?rev=62597&view=rev Log: Don't forget to give the doResolve flag when calling an app-class loader! Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=62597&r1=62596&r2=62597&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Tue Jan 20 13:05:16 2009 @@ -239,7 +239,8 @@ // Throws if initializing the class throws an exception. extern "C" UserCommonClass* jnjvmRuntimeInitialiseClass(UserClass* cl) { BEGIN_NATIVE_EXCEPTION(1) - + + cl->resolveClass(); cl->initialiseClass(JavaThread::get()->getJVM()); END_NATIVE_EXCEPTION Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=62597&r1=62596&r2=62597&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Tue Jan 20 13:05:16 2009 @@ -343,7 +343,8 @@ } -UserClass* JnjvmBootstrapLoader::internalLoad(const UTF8* name) { +UserClass* JnjvmBootstrapLoader::internalLoad(const UTF8* name, + bool doResolve) { UserCommonClass* cl = lookupClass(name); @@ -354,11 +355,15 @@ } } - if (cl) assert(!cl->isArray()); + if (cl) { + assert(!cl->isArray()); + if (doResolve) cl->asClass()->resolveClass(); + } + return (UserClass*)cl; } -UserClass* JnjvmClassLoader::internalLoad(const UTF8* name) { +UserClass* JnjvmClassLoader::internalLoad(const UTF8* name, bool doResolve) { UserCommonClass* cl = lookupClass(name); if (!cl) { @@ -368,11 +373,16 @@ UserClass* forCtp = loadClass; JavaObject* obj = (JavaObject*) upcalls->loadInClassLoader->invokeJavaObjectVirtual(isolate, forCtp, - javaLoader, str); + javaLoader, str, + doResolve); cl = (UserCommonClass*)((JavaObjectClass*)obj)->getClass(); } - if (cl) assert(!cl->isArray()); + if (cl) { + assert(!cl->isArray()); + if (doResolve) cl->asClass()->resolveClass(); + } + return (UserClass*)cl; } @@ -380,7 +390,7 @@ bool doThrow) { - UserClass* cl = internalLoad(name); + UserClass* cl = internalLoad(name, doResolve); if (!cl && doThrow) { Jnjvm* vm = JavaThread::get()->getJVM(); @@ -390,8 +400,6 @@ vm->noClassDefFoundError(name); } - if (cl && doResolve) cl->resolveClass(); - return cl; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=62597&r1=62596&r2=62597&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Tue Jan 20 13:05:16 2009 @@ -64,7 +64,7 @@ /// internalLoad - Load the class with the given name. /// - virtual UserClass* internalLoad(const UTF8* utf8); + virtual UserClass* internalLoad(const UTF8* utf8, bool doResolve); /// internalConstructType - Hashes a Typedef, an internal representation of /// a class still not loaded. @@ -290,7 +290,7 @@ private: /// internalLoad - Load the class with the given name. /// - virtual UserClass* internalLoad(const UTF8* utf8); + virtual UserClass* internalLoad(const UTF8* utf8, bool doResolve); /// bootClasspath - List of paths for the base classes. /// From nicolas.geoffray at lip6.fr Tue Jan 20 12:02:45 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 20 Jan 2009 20:02:45 -0000 Subject: [vmkit-commits] [vmkit] r62606 - in /vmkit/trunk: include/mvm/JIT.h lib/JnJVM/VMCore/JnjvmModule.cpp lib/JnJVM/VMCore/JnjvmModuleProvider.cpp lib/Mvm/Runtime/JIT.cpp Message-ID: <200901202002.n0KK2jk5030805@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 20 14:02:44 2009 New Revision: 62606 URL: http://llvm.org/viewvc/llvm-project?rev=62606&view=rev Log: Forgot that JIT compiling in LLVM may play with IR. Use the JIT lock for IR protection Modified: vmkit/trunk/include/mvm/JIT.h vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Modified: vmkit/trunk/include/mvm/JIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/JIT.h?rev=62606&r1=62605&r2=62606&view=diff ============================================================================== --- vmkit/trunk/include/mvm/JIT.h (original) +++ vmkit/trunk/include/mvm/JIT.h Tue Jan 20 14:02:44 2009 @@ -160,7 +160,6 @@ static llvm::ExecutionEngine* executionEngine; static mvm::LockNormal protectEngine; - static mvm::LockRecursive protectIR; static llvm::Module *globalModule; static llvm::ExistingModuleProvider *globalModuleProvider; static llvm::FunctionPassManager* globalFunctionPasses; @@ -172,6 +171,9 @@ llvm::TargetMachine* TheTarget = 0); static int disassemble(unsigned int* addr); + + static void protectIR(); + static void unprotectIR(); }; Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=62606&r1=62605&r2=62606&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Tue Jan 20 14:02:44 2009 @@ -1576,7 +1576,7 @@ const llvm::FunctionType* LLVMSignatureInfo::getVirtualType() { if (!virtualType) { // Lock here because we are called by arbitrary code - mvm::MvmModule::protectIR.lock(); + mvm::MvmModule::protectIR(); std::vector llvmArgs; uint32 size = signature->nbArguments; Typedef* const* arguments = signature->getArgumentsType(); @@ -1596,7 +1596,7 @@ LLVMAssessorInfo& LAI = JnjvmModule::getTypedefInfo(signature->getReturnType()); virtualType = FunctionType::get(LAI.llvmType, llvmArgs, false); - mvm::MvmModule::protectIR.unlock(); + mvm::MvmModule::unprotectIR(); } return virtualType; } @@ -1604,7 +1604,7 @@ const llvm::FunctionType* LLVMSignatureInfo::getStaticType() { if (!staticType) { // Lock here because we are called by arbitrary code - mvm::MvmModule::protectIR.lock(); + mvm::MvmModule::protectIR(); std::vector llvmArgs; uint32 size = signature->nbArguments; Typedef* const* arguments = signature->getArgumentsType(); @@ -1622,7 +1622,7 @@ LLVMAssessorInfo& LAI = JnjvmModule::getTypedefInfo(signature->getReturnType()); staticType = FunctionType::get(LAI.llvmType, llvmArgs, false); - mvm::MvmModule::protectIR.unlock(); + mvm::MvmModule::unprotectIR(); } return staticType; } @@ -1630,7 +1630,7 @@ const llvm::FunctionType* LLVMSignatureInfo::getNativeType() { if (!nativeType) { // Lock here because we are called by arbitrary code - mvm::MvmModule::protectIR.lock(); + mvm::MvmModule::protectIR(); std::vector llvmArgs; uint32 size = signature->nbArguments; Typedef* const* arguments = signature->getArgumentsType(); @@ -1651,7 +1651,7 @@ LLVMAssessorInfo& LAI = JnjvmModule::getTypedefInfo(signature->getReturnType()); nativeType = FunctionType::get(LAI.llvmType, llvmArgs, false); - mvm::MvmModule::protectIR.unlock(); + mvm::MvmModule::unprotectIR(); } return nativeType; } @@ -1793,7 +1793,7 @@ const FunctionType* LLVMSignatureInfo::getVirtualBufType() { if (!virtualBufType) { // Lock here because we are called by arbitrary code - mvm::MvmModule::protectIR.lock(); + mvm::MvmModule::protectIR(); std::vector Args2; Args2.push_back(JnjvmModule::ConstantPoolType); // ctp Args2.push_back(getVirtualPtrType()); @@ -1802,7 +1802,7 @@ LLVMAssessorInfo& LAI = JnjvmModule::getTypedefInfo(signature->getReturnType()); virtualBufType = FunctionType::get(LAI.llvmType, Args2, false); - mvm::MvmModule::protectIR.unlock(); + mvm::MvmModule::unprotectIR(); } return virtualBufType; } @@ -1810,7 +1810,7 @@ const FunctionType* LLVMSignatureInfo::getStaticBufType() { if (!staticBufType) { // Lock here because we are called by arbitrary code - mvm::MvmModule::protectIR.lock(); + mvm::MvmModule::protectIR(); std::vector Args; Args.push_back(JnjvmModule::ConstantPoolType); // ctp Args.push_back(getStaticPtrType()); @@ -1818,7 +1818,7 @@ LLVMAssessorInfo& LAI = JnjvmModule::getTypedefInfo(signature->getReturnType()); staticBufType = FunctionType::get(LAI.llvmType, Args, false); - mvm::MvmModule::protectIR.unlock(); + mvm::MvmModule::unprotectIR(); } return staticBufType; } @@ -1826,7 +1826,7 @@ Function* LLVMSignatureInfo::getVirtualBuf() { if (!virtualBufFunction) { // Lock here because we are called by arbitrary code - mvm::MvmModule::protectIR.lock(); + mvm::MvmModule::protectIR(); virtualBufFunction = createFunctionCallBuf(true); if (!signature->initialLoader->getModule()->isStaticCompiling()) { signature->setVirtualCallBuf((intptr_t) @@ -1834,7 +1834,7 @@ // Now that it's compiled, we don't need the IR anymore virtualBufFunction->deleteBody(); } - mvm::MvmModule::protectIR.unlock(); + mvm::MvmModule::unprotectIR(); } return virtualBufFunction; } @@ -1842,7 +1842,7 @@ Function* LLVMSignatureInfo::getVirtualAP() { if (!virtualAPFunction) { // Lock here because we are called by arbitrary code - mvm::MvmModule::protectIR.lock(); + mvm::MvmModule::protectIR(); virtualAPFunction = createFunctionCallAP(true); if (!signature->initialLoader->getModule()->isStaticCompiling()) { signature->setVirtualCallAP((intptr_t) @@ -1850,7 +1850,7 @@ // Now that it's compiled, we don't need the IR anymore virtualAPFunction->deleteBody(); } - mvm::MvmModule::protectIR.unlock(); + mvm::MvmModule::unprotectIR(); } return virtualAPFunction; } @@ -1858,7 +1858,7 @@ Function* LLVMSignatureInfo::getStaticBuf() { if (!staticBufFunction) { // Lock here because we are called by arbitrary code - mvm::MvmModule::protectIR.lock(); + mvm::MvmModule::protectIR(); staticBufFunction = createFunctionCallBuf(false); if (!signature->initialLoader->getModule()->isStaticCompiling()) { signature->setStaticCallBuf((intptr_t) @@ -1866,7 +1866,7 @@ // Now that it's compiled, we don't need the IR anymore staticBufFunction->deleteBody(); } - mvm::MvmModule::protectIR.unlock(); + mvm::MvmModule::unprotectIR(); } return staticBufFunction; } @@ -1874,7 +1874,7 @@ Function* LLVMSignatureInfo::getStaticAP() { if (!staticAPFunction) { // Lock here because we are called by arbitrary code - mvm::MvmModule::protectIR.lock(); + mvm::MvmModule::protectIR(); staticAPFunction = createFunctionCallAP(false); if (!signature->initialLoader->getModule()->isStaticCompiling()) { signature->setStaticCallAP((intptr_t) @@ -1882,25 +1882,25 @@ // Now that it's compiled, we don't need the IR anymore staticAPFunction->deleteBody(); } - mvm::MvmModule::protectIR.unlock(); + mvm::MvmModule::unprotectIR(); } return staticAPFunction; } void JnjvmModule::resolveVirtualClass(Class* cl) { // Lock here because we may be called by a class resolver - mvm::MvmModule::protectIR.lock(); + mvm::MvmModule::protectIR(); LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); LCI->getVirtualType(); - mvm::MvmModule::protectIR.unlock(); + mvm::MvmModule::unprotectIR(); } void JnjvmModule::resolveStaticClass(Class* cl) { // Lock here because we may be called by a class initializer - mvm::MvmModule::protectIR.lock(); + mvm::MvmModule::protectIR(); LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); LCI->getStaticType(); - mvm::MvmModule::protectIR.unlock(); + mvm::MvmModule::unprotectIR(); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=62606&r1=62605&r2=62606&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Tue Jan 20 14:02:44 2009 @@ -122,7 +122,7 @@ Function* func = LMI->getMethod(); if (func->hasNotBeenReadFromBitcode()) { // We are jitting. Take the lock. - M->protectIR.lock(); + M->protectIR(); JavaJIT jit(meth, func); if (isNative(meth->access)) { jit.nativeCompile(); @@ -132,7 +132,7 @@ mvm::MvmModule::runPasses(func, M->globalFunctionPasses); mvm::MvmModule::runPasses(func, JavaFunctionPasses); } - M->protectIR.unlock(); + M->unprotectIR(); } return func; } Modified: vmkit/trunk/lib/Mvm/Runtime/JIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/JIT.cpp?rev=62606&r1=62605&r2=62606&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/JIT.cpp (original) +++ vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Tue Jan 20 14:02:44 2009 @@ -245,7 +245,6 @@ llvm::FunctionPassManager* MvmModule::globalFunctionPasses; llvm::ExecutionEngine* MvmModule::executionEngine; mvm::LockNormal MvmModule::protectEngine; -mvm::LockRecursive MvmModule::protectIR; uint64 MvmModule::getTypeSize(const llvm::Type* type) { @@ -315,3 +314,11 @@ addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs } + +void MvmModule::protectIR() { + if (executionEngine) executionEngine->lock.acquire(); +} + +void MvmModule::unprotectIR() { + if (executionEngine) executionEngine->lock.release(); +} From nicolas.geoffray at lip6.fr Wed Jan 21 00:33:36 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 21 Jan 2009 08:33:36 -0000 Subject: [vmkit-commits] [vmkit] r62679 - /vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Message-ID: <200901210833.n0L8XaSI022267@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 21 02:33:36 2009 New Revision: 62679 URL: http://llvm.org/viewvc/llvm-project?rev=62679&view=rev Log: Add a comment. 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=62679&r1=62678&r2=62679&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/JIT.cpp (original) +++ vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Wed Jan 21 02:33:36 2009 @@ -315,6 +315,8 @@ } +// We protect the creation of IR with the executionEngine lock because +// codegen'ing a function may also create IR objects. void MvmModule::protectIR() { if (executionEngine) executionEngine->lock.acquire(); } From nicolas.geoffray at lip6.fr Wed Jan 21 05:55:55 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 21 Jan 2009 13:55:55 -0000 Subject: [vmkit-commits] [vmkit] r62689 - /vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Message-ID: <200901211355.n0LDttXp012528@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 21 07:55:55 2009 New Revision: 62689 URL: http://llvm.org/viewvc/llvm-project?rev=62689&view=rev Log: Add the NOP instruction. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp?rev=62689&r1=62688&r2=62689&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Wed Jan 21 07:55:55 2009 @@ -157,6 +157,8 @@ switch (bytecodes[i]) { + case NOP : break; + case ACONST_NULL : push(module->JavaObjectNullConstant, false); break; @@ -2210,7 +2212,8 @@ PRINT_DEBUG(JNJVM_COMPILE, 1, LIGHT_BLUE, "\n"); switch (bytecodes[i]) { - + + case NOP : case ACONST_NULL : case ICONST_M1 : case ICONST_0 : From nicolas.geoffray at lip6.fr Wed Jan 21 06:17:08 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 21 Jan 2009 14:17:08 -0000 Subject: [vmkit-commits] [vmkit] r62690 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaAccess.h JavaClass.cpp Message-ID: <200901211417.n0LEH8Yq013104@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 21 08:17:08 2009 New Revision: 62690 URL: http://llvm.org/viewvc/llvm-project?rev=62690&view=rev Log: Modify the name of synthetic methods. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaAccess.h vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaAccess.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaAccess.h?rev=62690&r1=62689&r2=62690&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaAccess.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaAccess.h Wed Jan 21 08:17:08 2009 @@ -31,6 +31,7 @@ #define ACC_INTERFACE 0x0200 #define ACC_ABSTRACT 0x0400 #define ACC_STRICT 0x0800 +#define ACC_SYNTHETIC 0x1000 #define JNJVM_CLASS 0x1000 #define JNJVM_ARRAY 0x2000 @@ -51,6 +52,7 @@ MK_VERIFIER(isProtected, ACC_PROTECTED) MK_VERIFIER(isFinal, ACC_FINAL) MK_VERIFIER(isSuper, ACC_SUPER) +MK_VERIFIER(isSynthetic, ACC_SYNTHETIC) inline bool isVirtual(unsigned int param) { Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=62690&r1=62689&r2=62690&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Wed Jan 21 08:17:08 2009 @@ -1200,6 +1200,10 @@ } } + if (isSynthetic(access)) { + ptr[0] = 'S'; + ++ptr; + } ptr[0] = 0; } From nicolas.geoffray at lip6.fr Fri Jan 23 05:04:10 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 23 Jan 2009 13:04:10 -0000 Subject: [vmkit-commits] [vmkit] r62848 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathConstructor.cpp Classpath/ClasspathMethod.cpp Classpath/ClasspathVMObject.cpp Classpath/ClasspathVMSystem.cpp Classpath/ClasspathVMSystemProperties.cpp Classpath/ClasspathVMThread.cpp VMCore/JavaObject.cpp VMCore/JavaObject.h VMCore/JavaRuntimeJIT.cpp VMCore/JavaThread.h VMCore/Jni.cpp VMCore/Jnjvm.cpp VMCore/JnjvmClassLoader.cpp VMCore/JnjvmModule.cpp VMCore/VirtualTables.cpp Message-ID: <200901231304.n0ND4CjQ002477@zion.cs.uiuc.edu> Author: geoffray Date: Fri Jan 23 07:04:06 2009 New Revision: 62848 URL: http://llvm.org/viewvc/llvm-project?rev=62848&view=rev Log: Make the "classof" field of Java objects private. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMObject.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMSystem.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h 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/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp?rev=62848&r1=62847&r2=62848&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp Fri Jan 23 07:04:06 2009 @@ -112,7 +112,7 @@ th->clearException(); } if (excp) { - if (excp->classOf->isAssignableFrom(vm->upcalls->newException)) { + if (excp->getClass()->isAssignableFrom(vm->upcalls->newException)) { // If it's an exception, we encapsule it in an // invocationTargetException vm->invocationTargetException(excp); Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp?rev=62848&r1=62847&r2=62848&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp Fri Jan 23 07:04:06 2009 @@ -114,12 +114,12 @@ if (isVirtual(meth->access)) { verifyNull(obj); - if (!(obj->classOf->isAssignableFrom(cl))) { - vm->illegalArgumentExceptionForMethod(meth, cl, obj->classOf); + if (!(obj->getClass()->isAssignableFrom(cl))) { + vm->illegalArgumentExceptionForMethod(meth, cl, obj->getClass()); } #ifdef ISOLATE_SHARING if (isInterface(cl->classDef->access)) { - cl = obj->classOf->lookupClassFromMethod(meth); + cl = obj->getClass()->lookupClassFromMethod(meth); } else { cl = Meth->getClass(); } @@ -157,7 +157,7 @@ } \ \ if (exc) { \ - if (exc->classOf->isAssignableFrom(vm->upcalls->newException)) { \ + if (exc->getClass()->isAssignableFrom(vm->upcalls->newException)) { \ th->getJVM()->invocationTargetException(exc); \ } else { \ th->throwException(exc); \ Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMObject.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMObject.cpp?rev=62848&r1=62847&r2=62848&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMObject.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMObject.cpp Fri Jan 23 07:04:06 2009 @@ -32,7 +32,7 @@ BEGIN_NATIVE_EXCEPTION(0) JavaObject* src = (JavaObject*)_src; - UserCommonClass* cl = src->classOf; + UserCommonClass* cl = src->getClass(); Jnjvm* vm = JavaThread::get()->getJVM(); uint64 size = 0; if (cl->isArray()) { @@ -70,7 +70,7 @@ JavaObject* obj = (JavaObject*)_obj; Jnjvm* vm = JavaThread::get()->getJVM(); - res = (jobject)(obj->classOf->getClassDelegatee(vm)); + res = (jobject)(obj->getClass()->getClassDelegatee(vm)); END_NATIVE_EXCEPTION Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMSystem.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMSystem.cpp?rev=62848&r1=62847&r2=62848&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMSystem.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMSystem.cpp Fri Jan 23 07:04:06 2009 @@ -40,12 +40,12 @@ verifyNull(src); verifyNull(dst); - if (!(src->classOf->isArray() && dst->classOf->isArray())) { + if (!(src->getClass()->isArray() && dst->getClass()->isArray())) { vm->arrayStoreException(); } - UserClassArray* ts = (UserClassArray*)src->classOf; - UserClassArray* td = (UserClassArray*)dst->classOf; + UserClassArray* ts = (UserClassArray*)src->getClass(); + UserClassArray* td = (UserClassArray*)dst->getClass(); UserCommonClass* dstType = td->baseClass(); UserCommonClass* srcType = ts->baseClass(); @@ -74,7 +74,7 @@ while (i < sstart + len && !doThrow) { JavaObject* cur = ((ArrayObject*)src)->elements[i]; if (cur) { - if (!(cur->classOf->isAssignableFrom(dstType))) { + if (!(cur->getClass()->isAssignableFrom(dstType))) { doThrow = true; len = i; } Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp?rev=62848&r1=62847&r2=62848&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp Fri Jan 23 07:04:06 2009 @@ -26,7 +26,7 @@ static void setProperty(Jnjvm* vm, JavaObject* prop, const char* key, const char* val) { - vm->upcalls->setProperty->invokeIntSpecial(vm, (UserClass*)prop->classOf, + vm->upcalls->setProperty->invokeIntSpecial(vm, (UserClass*)prop->getClass(), prop, vm->asciizToStr(key), vm->asciizToStr(val)); Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp?rev=62848&r1=62847&r2=62848&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp Fri Jan 23 07:04:06 2009 @@ -45,7 +45,7 @@ assert(javaThread && "Didn't fix the javaThread of a jnjvm thread"); field->setObjectField(vmThread, (JavaObject*)(void*)thread); - UserClass* vmthClass = (UserClass*)vmThread->classOf; + UserClass* vmthClass = (UserClass*)vmThread->getClass(); ThreadSystem& ts = vm->threadSystem; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp?rev=62848&r1=62847&r2=62848&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp Fri Jan 23 07:04:06 2009 @@ -77,7 +77,7 @@ extern "C" void printJavaObject(const JavaObject* obj, mvm::PrintBuffer* buf) { buf->write("JavaObject<"); - CommonClass::printClassName(obj->classOf->getName(), buf); + CommonClass::printClassName(obj->getClass()->getName(), buf); fprintf(stderr, "%p\n", ((void**)obj->getVirtualTable())[9]); buf->write(">"); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h?rev=62848&r1=62847&r2=62848&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h Fri Jan 23 07:04:06 2009 @@ -120,14 +120,20 @@ /// waitIntern - internal wait on a monitor /// void waitIntern(struct timeval *info, bool timed); - -public: - /// classOf - The class of this object. /// UserCommonClass* classOf; +public: + + /// getClass - Returns the class of this object. + /// + UserCommonClass* getClass() const { + return classOf; + } + + /// lock - The monitor of this object. Most of the time null. /// mvm::ThinLock lock; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=62848&r1=62847&r2=62848&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Fri Jan 23 07:04:06 2009 @@ -34,11 +34,11 @@ Enveloppe* enveloppe = cache->enveloppe; - UserCommonClass* ocl = obj->classOf; + UserCommonClass* ocl = obj->getClass(); #ifndef SERVICE - assert((obj->classOf->isClass() && - obj->classOf->asClass()->isInitializing()) && + assert((obj->getClass()->isClass() && + obj->getClass()->asClass()->isInitializing()) && "Class not ready in a virtual lookup."); #endif @@ -189,13 +189,13 @@ va_start(ap, index); JavaObject* obj = va_arg(ap, JavaObject*); va_end(ap); - assert((obj->classOf->isClass() && - obj->classOf->asClass()->isInitializing()) && + assert((obj->getClass()->isClass() && + obj->getClass()->asClass()->isInitializing()) && "Class not ready in a virtual lookup."); // Arg, the bytecode is buggy! Perform the lookup on the object class // and do not update offset. - lookup = obj->classOf->isArray() ? obj->classOf->super : - obj->classOf->asClass(); + lookup = obj->getClass()->isArray() ? obj->getClass()->super : + obj->getClass()->asClass(); dmeth = lookup->lookupMethod(utf8, sign->keyName, false, true, 0); } else { caller->getConstantPool()->ctpRes[index] = (void*)dmeth->offset; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h?rev=62848&r1=62847&r2=62848&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Fri Jan 23 07:04:06 2009 @@ -184,7 +184,7 @@ bool compareException(UserClass* cl) { JavaObject* pe = pendingException; assert(pe && "no pending exception?"); - bool val = pe->classOf->subclassOf(cl); + bool val = pe->getClass()->subclassOf(cl); return val; } Modified: vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp?rev=62848&r1=62847&r2=62848&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jni.cpp Fri Jan 23 07:04:06 2009 @@ -89,7 +89,7 @@ Jnjvm* vm = myVM(env); Classpath* upcalls = vm->upcalls; JavaObject* meth = (JavaObject*)method; - UserCommonClass* cl = meth->classOf; + UserCommonClass* cl = meth->getClass(); if (cl == upcalls->newConstructor) { return (jmethodID)((JavaObjectMethod*)meth)->getInternalMethod(); } else if (cl == upcalls->newMethod) { @@ -276,7 +276,7 @@ verifyNull((JavaObject*)obj); Jnjvm* vm = JavaThread::get()->getJVM(); - return (jclass)((JavaObject*)obj)->classOf->getClassDelegatee(vm); + return (jclass)((JavaObject*)obj)->getClass()->getClassDelegatee(vm); END_JNI_EXCEPTION return 0; @@ -337,7 +337,7 @@ JavaObject* self = (JavaObject*)obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = getClassFromVirtualMethod(vm, meth, self->classOf); + UserClass* cl = getClassFromVirtualMethod(vm, meth, self->getClass()); JavaObject* res = meth->invokeJavaObjectVirtualAP(vm, cl, self, ap); va_end(ap); return (jobject)res; @@ -355,7 +355,7 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->classOf); + UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->getClass()); return (jobject)meth->invokeJavaObjectVirtualAP(vm, cl, obj, args); END_JNI_EXCEPTION @@ -380,7 +380,7 @@ JavaObject* self = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = getClassFromVirtualMethod(vm, meth, self->classOf); + UserClass* cl = getClassFromVirtualMethod(vm, meth, self->getClass()); uint32 res = meth->invokeIntVirtualAP(vm, cl, self, ap); va_end(ap); return res; @@ -398,7 +398,7 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->classOf); + UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->getClass()); return (jboolean)meth->invokeIntVirtualAP(vm, cl, obj, args); END_JNI_EXCEPTION @@ -427,7 +427,7 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->classOf); + UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->getClass()); return (jbyte)meth->invokeIntVirtualAP(vm, cl, obj, args); END_JNI_EXCEPTION @@ -457,7 +457,7 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->classOf); + UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->getClass()); return (jchar)meth->invokeIntVirtualAP(vm, cl, obj, args); END_JNI_EXCEPTION @@ -487,7 +487,7 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->classOf); + UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->getClass()); return (jshort)meth->invokeIntVirtualAP(vm, cl, obj, args); END_JNI_EXCEPTION @@ -513,7 +513,7 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->classOf); + UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->getClass()); uint32 res = meth->invokeIntVirtualAP(vm, cl, obj, ap); va_end(ap); return res; @@ -531,7 +531,7 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->classOf); + UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->getClass()); return (jint)meth->invokeIntVirtualAP(vm, cl, obj, args); END_JNI_EXCEPTION @@ -562,7 +562,7 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->classOf); + UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->getClass()); return (jlong)meth->invokeLongVirtualAP(vm, cl, obj, args); END_JNI_EXCEPTION @@ -588,7 +588,7 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->classOf); + UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->getClass()); jfloat res = meth->invokeFloatVirtualAP(vm, cl, obj, ap); va_end(ap); return res; @@ -606,7 +606,7 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->classOf); + UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->getClass()); return (jfloat)meth->invokeFloatVirtualAP(vm, cl, obj, args); END_JNI_EXCEPTION @@ -632,7 +632,7 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->classOf); + UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->getClass()); jdouble res = meth->invokeDoubleVirtualAP(vm, cl, obj, ap); va_end(ap); return res; @@ -650,7 +650,7 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->classOf); + UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->getClass()); return (jdouble)meth->invokeDoubleVirtualAP(vm, cl, obj, args); END_JNI_EXCEPTION @@ -676,7 +676,7 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->classOf); + UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->getClass()); meth->invokeIntVirtualAP(vm, cl, obj, ap); va_end(ap); @@ -692,7 +692,7 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->classOf); + UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->getClass()); meth->invokeIntVirtualAP(vm, cl, obj, args); END_JNI_EXCEPTION @@ -913,7 +913,7 @@ JavaObject* obj = (JavaObject*)_obj; JavaMethod* meth = (JavaMethod*)methodID; Jnjvm* vm = JavaThread::get()->getJVM(); - UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->classOf); + UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->getClass()); meth->invokeIntSpecialAP(vm, cl, obj, ap); va_end(ap); Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=62848&r1=62847&r2=62848&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Fri Jan 23 07:04:06 2009 @@ -227,7 +227,7 @@ // ExceptionInInitializerError cannot be created because an // OutOfMemoryError occurs, then instead use an OutOfMemoryError object // in place of E in the following step. - if (exc->classOf->isAssignableFrom(vm->upcalls->newException)) { + if (exc->getClass()->isAssignableFrom(vm->upcalls->newException)) { Classpath* upcalls = classLoader->bootstrapLoader->upcalls; UserClass* clExcp = upcalls->ExceptionInInitializerError; Jnjvm* vm = self->getJVM(); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=62848&r1=62847&r2=62848&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Fri Jan 23 07:04:06 2009 @@ -286,8 +286,8 @@ isolate = I; JavaMethod* meth = bootstrapLoader->upcalls->loadInClassLoader; - loader->classOf->asClass()->lookupMethodDontThrow(meth->name, meth->type, - false, true, &loadClass); + loader->getClass()->asClass()->lookupMethodDontThrow(meth->name, meth->type, + false, true, &loadClass); assert(loadClass && "Loader does not have a loadClass function"); #if defined(SERVICE) Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=62848&r1=62847&r2=62848&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Fri Jan 23 07:04:06 2009 @@ -232,7 +232,7 @@ return SI->second; } else { assert(str && "No string given"); - LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo((Class*)str->classOf); + LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo((Class*)str->getClass()); const llvm::Type* Ty = LCI->getVirtualType(); GlobalVariable* varGV = new GlobalVariable(Ty->getContainedType(0), false, @@ -659,7 +659,7 @@ } Constant* JnjvmModule::CreateConstantFromJavaString(JavaString* str) { - Class* cl = (Class*)str->classOf; + Class* cl = (Class*)str->getClass(); LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); const StructType* STy = dyn_cast(LCI->getVirtualType()->getContainedType(0)); Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=62848&r1=62847&r2=62848&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Fri Jan 23 07:04:06 2009 @@ -44,7 +44,7 @@ #undef INIT void ArrayObject::TRACER { - if (classOf) classOf->classLoader->MARK_AND_TRACE; + if (getClass()) getClass()->classLoader->MARK_AND_TRACE; for (sint32 i = 0; i < size; i++) { if (elements[i]) elements[i]->MARK_AND_TRACE; } @@ -99,7 +99,7 @@ } void JavaObject::TRACER { - if (classOf) classOf->classLoader->MARK_AND_TRACE; + if (getClass()) getClass()->classLoader->MARK_AND_TRACE; LockObj* l = lockObj(); if (l) l->MARK_AND_TRACE; } @@ -109,7 +109,7 @@ #else extern "C" void JavaObjectTracer(JavaObject* obj) { #endif - if (obj->classOf) obj->classOf->classLoader->MARK_AND_TRACE; + if (obj->getClass()) obj->getClass()->classLoader->MARK_AND_TRACE; LockObj* l = obj->lockObj(); if (l) l->MARK_AND_TRACE; } From nicolas.geoffray at lip6.fr Sun Jan 25 09:46:01 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 25 Jan 2009 17:46:01 -0000 Subject: [vmkit-commits] [vmkit] r62965 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Message-ID: <200901251746.n0PHk2cD023373@zion.cs.uiuc.edu> Author: geoffray Date: Sun Jan 25 11:46:01 2009 New Revision: 62965 URL: http://llvm.org/viewvc/llvm-project?rev=62965&view=rev Log: Initialize the lock of statically initialized objects to the first thread id. 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=62965&r1=62964&r2=62965&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Sun Jan 25 11:46:01 2009 @@ -625,7 +625,9 @@ Elmts.push_back(Cl); // lock - Elmts.push_back(Constant::getNullValue(ptrType)); + Constant* L = ConstantInt::get(Type::Int64Ty, + JavaThread::get()->getThreadID()); + Elmts.push_back(ConstantExpr::getIntToPtr(L, ptrType)); return ConstantStruct::get(STy, Elmts); } From nicolas.geoffray at lip6.fr Sun Jan 25 09:47:01 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 25 Jan 2009 17:47:01 -0000 Subject: [vmkit-commits] [vmkit] r62966 - /vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Message-ID: <200901251747.n0PHl1Fe023411@zion.cs.uiuc.edu> Author: geoffray Date: Sun Jan 25 11:47:01 2009 New Revision: 62966 URL: http://llvm.org/viewvc/llvm-project?rev=62966&view=rev Log: Statically initalized objects were not traced because they are not GC allocated. Force tracing of their fields. Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=62966&r1=62965&r2=62966&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Sun Jan 25 11:47:01 2009 @@ -81,7 +81,11 @@ } classLoader->MARK_AND_TRACE; for (uint32 i = 0; i < NR_ISOLATES; ++i) { - delegatee[i]->MARK_AND_TRACE; + // If the delegatee was static allocated, we want to trace its fields. + if (delegatee[i]) { + delegatee[i]->CALL_TRACER; + delegatee[i]->MARK_AND_TRACE; + } } } @@ -153,8 +157,15 @@ TRACE_DELEGATEE(upcalls->OfLong); TRACE_DELEGATEE(upcalls->OfDouble); #undef TRACE_DELEGATEE - - TRACE_VECTOR(JavaString*, gc_allocator, bootstrapLoader->strings); + + for (std::vector >::iterator i = + bootstrapLoader->strings.begin(), + e = bootstrapLoader->strings.end(); i!= e; ++i) { + (*i)->MARK_AND_TRACE; + // If the string was static allocated, we want to trace its lock. + LockObj* l = (*i)->lockObj(); + if (l) l->MARK_AND_TRACE; + } mvm::Thread* th = th->get(); th->CALL_TRACER; @@ -172,7 +183,14 @@ javaLoader->MARK_AND_TRACE; traceClassMap(classes); isolate->MARK_AND_TRACE; - TRACE_VECTOR(JavaString*, gc_allocator, strings); + for (std::vector >::iterator i = strings.begin(), + e = strings.end(); i!= e; ++i) { + (*i)->MARK_AND_TRACE; + // If the string was static allocated, we want to trace its lock. + LockObj* l = (*i)->lockObj(); + if (l) l->MARK_AND_TRACE; + } } void JnjvmBootstrapLoader::TRACER {} From nicolas.geoffray at lip6.fr Mon Jan 26 02:22:57 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 26 Jan 2009 10:22:57 -0000 Subject: [vmkit-commits] [vmkit] r63011 - /vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Message-ID: <200901261022.n0QAMwUH002982@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 26 04:22:55 2009 New Revision: 63011 URL: http://llvm.org/viewvc/llvm-project?rev=63011&view=rev Log: Native arrays may have a lock. Trace it. Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=63011&r1=63010&r2=63011&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Mon Jan 26 04:22:55 2009 @@ -65,6 +65,8 @@ #else extern "C" void JavaArrayTracer(JavaArray* obj) { #endif + LockObj* l = obj->lockObj(); + if (l) l->MARK_AND_TRACE; } void JavaArray::TRACER {} From nicolas.geoffray at lip6.fr Mon Jan 26 08:46:05 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 26 Jan 2009 16:46:05 -0000 Subject: [vmkit-commits] [vmkit] r63013 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathConstructor.cpp Classpath/ClasspathMethod.cpp VMCore/JavaMetaJIT.cpp VMCore/JavaThread.h VMCore/Jnjvm.cpp VMCore/JnjvmClassLoader.cpp Message-ID: <200901261646.n0QGk5sw015436@zion.cs.uiuc.edu> Author: geoffray Date: Mon Jan 26 10:46:04 2009 New Revision: 63013 URL: http://llvm.org/viewvc/llvm-project?rev=63013&view=rev Log: Simplify exception handling by throwing a current exception in the catch clause. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp?rev=63013&r1=63012&r2=63013&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp Mon Jan 26 10:46:04 2009 @@ -107,18 +107,16 @@ JavaThread* th = JavaThread::get(); try { meth->invokeIntSpecialBuf(vm, cl, obj, startBuf); - }catch(...) { + } catch(...) { excp = th->getJavaException(); - th->clearException(); - } - if (excp) { if (excp->getClass()->isAssignableFrom(vm->upcalls->newException)) { + th->clearException(); // If it's an exception, we encapsule it in an // invocationTargetException vm->invocationTargetException(excp); } else { // If it's an error, throw it again. - th->throwException(excp); + th->throwPendingException(); } } Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp?rev=63013&r1=63012&r2=63013&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp Mon Jan 26 10:46:04 2009 @@ -150,17 +150,13 @@ } else { \ val = meth->invoke##TYPE##StaticBuf(vm, cl, _buf); \ } \ - }catch(...) { \ + } catch(...) { \ exc = th->getJavaException(); \ - assert(exc && "no exception?"); \ - th->clearException(); \ - } \ - \ - if (exc) { \ if (exc->getClass()->isAssignableFrom(vm->upcalls->newException)) { \ + th->clearException(); \ th->getJVM()->invocationTargetException(exc); \ } else { \ - th->throwException(exc); \ + th->throwPendingException(); \ } \ } \ Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp?rev=63013&r1=63012&r2=63013&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp Mon Jan 26 10:46:04 2009 @@ -66,16 +66,12 @@ void* _buf = (void*)buf; \ readArgs(buf, sign, ap); \ void* func = (((void***)obj)[0])[offset];\ - bool exc = false; \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ try { \ res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, _buf);\ } catch (...) { \ - exc = true; \ - } \ - if (exc) { \ th->throwFromJava(); \ } \ th->endJava(); \ @@ -94,16 +90,12 @@ void* _buf = (void*)buf; \ readArgs(buf, sign, ap); \ void* func = this->compiledPtr();\ - bool exc = false; \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ try { \ res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, _buf);\ } catch (...) { \ - exc = true; \ - } \ - if (exc) { \ th->throwFromJava(); \ } \ th->endJava(); \ @@ -121,16 +113,12 @@ void* _buf = (void*)buf; \ readArgs(buf, sign, ap); \ void* func = this->compiledPtr();\ - bool exc = false; \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ try { \ res = ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(cl->getConstantPool(), func, _buf);\ } catch (...) { \ - exc = true; \ - } \ - if (exc) { \ th->throwFromJava(); \ } \ th->endJava(); \ @@ -147,16 +135,12 @@ \ Signdef* sign = getSignature(); \ void* func = (((void***)obj)[0])[offset];\ - bool exc = false; \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ try { \ res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\ } catch (...) { \ - exc = true; \ - } \ - if (exc) { \ th->throwFromJava(); \ } \ th->endJava(); \ @@ -172,16 +156,12 @@ verifyNull(obj);\ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ - bool exc = false; \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ try { \ res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\ } catch (...) { \ - exc = true; \ - } \ - if (exc) { \ th->throwFromJava(); \ } \ th->endJava(); \ @@ -196,16 +176,12 @@ \ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ - bool exc = false; \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ try { \ res = ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(cl->getConstantPool(), func, buf);\ } catch (...) { \ - exc = true; \ - } \ - if (exc) { \ th->throwFromJava(); \ } \ th->endJava(); \ @@ -249,16 +225,12 @@ verifyNull(obj); \ void* func = (((void***)obj)[0])[offset];\ Signdef* sign = getSignature(); \ - bool exc = false; \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ try { \ res = ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(cl->getConstantPool(), func, obj, ap);\ } catch (...) { \ - exc = true; \ - } \ - if (exc) { \ th->throwFromJava(); \ } \ th->endJava(); \ @@ -274,16 +246,12 @@ verifyNull(obj);\ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ - bool exc = false; \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ try { \ res = ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(cl->getConstantPool(), func, obj, ap);\ } catch (...) { \ - exc = true; \ - } \ - if (exc) { \ th->throwFromJava(); \ } \ th->endJava(); \ @@ -298,16 +266,12 @@ \ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ - bool exc = false; \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ try { \ res = ((FUNC_TYPE_STATIC_AP)sign->getStaticCallAP())(cl->getConstantPool(), func, ap);\ } catch (...) { \ - exc = true; \ - } \ - if (exc) { \ th->throwFromJava(); \ } \ th->endJava(); \ @@ -323,16 +287,12 @@ verifyNull(obj);\ void* func = (((void***)obj)[0])[offset];\ Signdef* sign = getSignature(); \ - bool exc = false; \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ try { \ res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\ } catch (...) { \ - exc = true; \ - } \ - if (exc) { \ th->throwFromJava(); \ } \ th->endJava(); \ @@ -348,16 +308,12 @@ verifyNull(obj);\ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ - bool exc = 0; \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ try { \ res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\ } catch (...) { \ - exc = true; \ - } \ - if (exc) { \ th->throwFromJava(); \ } \ th->endJava(); \ @@ -374,14 +330,10 @@ Signdef* sign = getSignature(); \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ - bool exc = false; \ TYPE res = 0; \ try { \ res = ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(cl->getConstantPool(), func, buf);\ } catch (...) { \ - exc = true; \ - } \ - if (exc) { \ th->throwFromJava(); \ } \ th->endJava(); \ Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h?rev=63013&r1=63012&r2=63013&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Mon Jan 26 10:46:04 2009 @@ -29,28 +29,20 @@ #define BEGIN_NATIVE_EXCEPTION(level) \ JavaThread* __th = JavaThread::get(); \ __th->startNative(level); \ - bool __exc = false; \ try { #define END_NATIVE_EXCEPTION \ } catch(...) { \ - __exc = true; \ - } \ - if (__exc) { \ __th->throwFromNative(); \ } \ __th->endNative(); #define BEGIN_JNI_EXCEPTION \ JavaThread* th = JavaThread::get(); \ - bool __exc = 0; \ try { #define END_JNI_EXCEPTION \ } catch(...) { \ - __exc = true; \ - } \ - if (__exc) { \ th->throwFromJNI(); \ } @@ -174,7 +166,7 @@ /// void throwException(JavaObject* obj); - /// throwPendingException - Throw a pending exception created by JNI. + /// throwPendingException - Throw a pending exception. /// void throwPendingException(); Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=63013&r1=63012&r2=63013&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Mon Jan 26 10:46:04 2009 @@ -143,22 +143,15 @@ // the initializing the superclass. UserClass* super = getSuper(); if (super) { - JavaObject *exc = 0; try { super->initialiseClass(vm); } catch(...) { - exc = self->getJavaException(); - assert(exc && "no exception?"); - self->clearException(); - } - - if (exc) { acquire(); setErroneous(); setOwnerClass(0); broadcastClass(); release(); - self->throwException(exc); + self->throwPendingException(); } } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=63013&r1=63012&r2=63013&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Mon Jan 26 10:46:04 2009 @@ -162,6 +162,8 @@ // Now that native types have been loaded, try to find if we have a // pre-compiled rt.jar nativeHandle = dlopen("libvmjc"DYLD_EXTENSION, RTLD_LAZY | RTLD_GLOBAL); + fprintf(stderr, "%s\n", dlerror()); + fprintf(stderr, "alors %p\n", dlsym(0, "JnJVM_java_io_PrintStream_append__Ljava_lang_CharSequence_2II1")); if (nativeHandle) { // Found it! SuperArray = (Class*)dlsym(nativeHandle, "java.lang.Object"); @@ -1004,6 +1006,10 @@ char* soName = (char*)alloca(strlen(name) + strlen(DYLD_EXTENSION)); sprintf(soName, "%s%s", name, DYLD_EXTENSION); void* handle = dlopen(soName, RTLD_LAZY | RTLD_LOCAL); + if (!handle) { + handle = dlopen("source.so", RTLD_LAZY | RTLD_LOCAL); + fprintf(stderr, "%s\n", dlerror()); + } if (handle) { Class* cl = (Class*)dlsym(handle, name); if (cl) { From nicolas.geoffray at lip6.fr Tue Jan 27 00:37:27 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 27 Jan 2009 08:37:27 -0000 Subject: [vmkit-commits] [vmkit] r63099 - /vmkit/trunk/tools/vmkit/Launcher.cpp Message-ID: <200901270837.n0R8bRA7016407@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 27 02:37:27 2009 New Revision: 63099 URL: http://llvm.org/viewvc/llvm-project?rev=63099&view=rev Log: Add the target data when command line specifying the LLVM passes. 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=63099&r1=63098&r2=63099&view=diff ============================================================================== --- vmkit/trunk/tools/vmkit/Launcher.cpp (original) +++ vmkit/trunk/tools/vmkit/Launcher.cpp Tue Jan 27 02:37:27 2009 @@ -14,6 +14,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/PassNameParser.h" +#include "llvm/Target/TargetData.h" #include "MvmGC.h" @@ -69,6 +70,7 @@ void addCommandLinePass(mvm::CompilationUnit* CU, char** argv) { FunctionPassManager* Passes = CU->TheModule->globalFunctionPasses; + Passes->add(new TargetData(*CU->TheModule->TheTargetData)); // Create a new optimization pass for each one specified on the command line for (unsigned i = 0; i < PassList.size(); ++i) { // Check to see if -std-compile-opts was specified before this option. If From nicolas.geoffray at lip6.fr Tue Jan 27 05:05:37 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 27 Jan 2009 13:05:37 -0000 Subject: [vmkit-commits] [vmkit] r63102 - /vmkit/trunk/tools/vmkit/Launcher.cpp Message-ID: <200901271305.n0RD5bJH003127@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 27 07:05:32 2009 New Revision: 63102 URL: http://llvm.org/viewvc/llvm-project?rev=63102&view=rev Log: untabify 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=63102&r1=63101&r2=63102&view=diff ============================================================================== --- vmkit/trunk/tools/vmkit/Launcher.cpp (original) +++ vmkit/trunk/tools/vmkit/Launcher.cpp Tue Jan 27 07:05:32 2009 @@ -70,7 +70,7 @@ void addCommandLinePass(mvm::CompilationUnit* CU, char** argv) { FunctionPassManager* Passes = CU->TheModule->globalFunctionPasses; - Passes->add(new TargetData(*CU->TheModule->TheTargetData)); + Passes->add(new TargetData(*CU->TheModule->TheTargetData)); // Create a new optimization pass for each one specified on the command line for (unsigned i = 0; i < PassList.size(); ++i) { // Check to see if -std-compile-opts was specified before this option. If From nicolas.geoffray at lip6.fr Tue Jan 27 05:15:51 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 27 Jan 2009 13:15:51 -0000 Subject: [vmkit-commits] [vmkit] r63103 - /vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Message-ID: <200901271315.n0RDFq8X003526@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 27 07:15:46 2009 New Revision: 63103 URL: http://llvm.org/viewvc/llvm-project?rev=63103&view=rev Log: This should have never gotten here. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=63103&r1=63102&r2=63103&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Tue Jan 27 07:15:46 2009 @@ -162,8 +162,6 @@ // Now that native types have been loaded, try to find if we have a // pre-compiled rt.jar nativeHandle = dlopen("libvmjc"DYLD_EXTENSION, RTLD_LAZY | RTLD_GLOBAL); - fprintf(stderr, "%s\n", dlerror()); - fprintf(stderr, "alors %p\n", dlsym(0, "JnJVM_java_io_PrintStream_append__Ljava_lang_CharSequence_2II1")); if (nativeHandle) { // Found it! SuperArray = (Class*)dlsym(nativeHandle, "java.lang.Object"); @@ -1006,10 +1004,6 @@ char* soName = (char*)alloca(strlen(name) + strlen(DYLD_EXTENSION)); sprintf(soName, "%s%s", name, DYLD_EXTENSION); void* handle = dlopen(soName, RTLD_LAZY | RTLD_LOCAL); - if (!handle) { - handle = dlopen("source.so", RTLD_LAZY | RTLD_LOCAL); - fprintf(stderr, "%s\n", dlerror()); - } if (handle) { Class* cl = (Class*)dlsym(handle, name); if (cl) { From nicolas.geoffray at lip6.fr Tue Jan 27 13:24:02 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Tue, 27 Jan 2009 21:24:02 -0000 Subject: [vmkit-commits] [vmkit] r63134 - in /vmkit/trunk: include/mvm/Threads/Thread.h lib/JnJVM/Classpath/ClasspathConstructor.cpp lib/JnJVM/Classpath/ClasspathField.cpp lib/JnJVM/Classpath/ClasspathMethod.cpp lib/JnJVM/Classpath/ClasspathVMThrowable.cpp lib/JnJVM/VMCore/JavaThread.cpp lib/JnJVM/VMCore/JavaUpcalls.cpp Message-ID: <200901272124.n0RLO2xh022117@zion.cs.uiuc.edu> Author: geoffray Date: Tue Jan 27 15:24:02 2009 New Revision: 63134 URL: http://llvm.org/viewvc/llvm-project?rev=63134&view=rev Log: Better stack trace handling: our previous implementation relied on x86 getting the caller frame address not the current frame address. Modified: vmkit/trunk/include/mvm/Threads/Thread.h vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Modified: vmkit/trunk/include/mvm/Threads/Thread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Threads/Thread.h?rev=63134&r1=63133&r2=63134&view=diff ============================================================================== --- vmkit/trunk/include/mvm/Threads/Thread.h (original) +++ vmkit/trunk/include/mvm/Threads/Thread.h Tue Jan 27 15:24:02 2009 @@ -79,12 +79,21 @@ }; -#if defined(__MACH__) && !defined(__i386__) +#if defined(__MACH__) && defined(__PPC__) #define FRAME_IP(fp) (fp[2]) #else #define FRAME_IP(fp) (fp[1]) #endif +// Apparently gcc for i386 and family considers __builtin_frame_address(0) to +// return the caller, not the current function. +#if defined(__i386__) || defined(i386) || defined(_M_IX86) || \ + defined(__x86_64__) || defined(_M_AMD64) +#define FRAME_PTR() __builtin_frame_address(0) +#else +#define FRAME_PTR() (((void**)__builtin_frame_address(0))[0]) +#endif + /// Thread - This class is the base of custom virtual machines' Thread classes. /// It provides static functions to manage threads. An instance of this class /// contains all thread-specific informations. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp?rev=63134&r1=63133&r2=63134&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp Tue Jan 27 15:24:02 2009 @@ -73,7 +73,6 @@ jobject res = 0; - BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); JavaMethod* meth = cons->getInternalMethod(); @@ -83,9 +82,12 @@ sint32 size = sign->nbArguments; // Allocate a buffer to store the arguments. - uintptr_t buf = (uintptr_t)alloca(size * sizeof(uint64)); + uintptr_t buf = size ? (uintptr_t)alloca(size * sizeof(uint64)) : 0; // Record the beginning of the buffer. void* startBuf = (void*)buf; + + // Do it after alloca + BEGIN_NATIVE_EXCEPTION(0) if (nbArgs == size) { UserCommonClass* _cl = Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp?rev=63134&r1=63133&r2=63134&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp Tue Jan 27 15:24:02 2009 @@ -502,12 +502,15 @@ #endif JavaObjectField* Field, jobject obj, jobject val) { - BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); UserClass* cl = Field->getClass(); JavaField* field = Field->getInternalField(); uintptr_t buf = (uintptr_t)alloca(sizeof(uint64)); + + // Do it after alloca + BEGIN_NATIVE_EXCEPTION(0) + void* _buf = (void*)buf; const Typedef* type = field->getSignature(); ((JavaObject*)val)->decapsulePrimitive(vm, buf, type); Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp?rev=63134&r1=63133&r2=63134&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp Tue Jan 27 15:24:02 2009 @@ -93,7 +93,6 @@ JavaObject* res = 0; - BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); @@ -105,7 +104,10 @@ sint32 size = sign->nbArguments; JavaObject* obj = (JavaObject*)_obj; - uintptr_t buf = (uintptr_t)alloca(size * sizeof(uint64)); + uintptr_t buf = size ? (uintptr_t)alloca(size * sizeof(uint64)) : 0; + + BEGIN_NATIVE_EXCEPTION(0) + void* _buf = (void*)buf; if (nbArgs == size) { UserCommonClass* _cl = Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp?rev=63134&r1=63133&r2=63134&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp Tue Jan 27 15:24:02 2009 @@ -103,7 +103,9 @@ field->getObjectField((JavaObject*)vmthrow); std::vector::iterator i = stack->begin(), e = stack->end(); - uint32 index = 0; + // remove the VMThrowable.fillInStackTrace method + uint32 index = 1; + ++i; while (i != e) { JavaMethod* meth = vm->IPToMethod(*i); assert(meth && "Wrong stack trace"); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp?rev=63134&r1=63133&r2=63134&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Tue Jan 27 15:24:02 2009 @@ -72,12 +72,11 @@ } void JavaThread::startNative(int level) { - // Call to this function. - void** cur = (void**)__builtin_frame_address(0); + // Caller of this function. + void** cur = (void**)FRAME_PTR(); - // Caller (for native Classpath functions). - //if (level) - cur = (void**)cur[0]; + while (level--) + cur = (void**)cur[0]; // When entering, the number of addresses should be odd. // Enable this when finalization gets proper support. @@ -87,21 +86,21 @@ } void JavaThread::startJava() { - // Call to this function. - void** cur = (void**)__builtin_frame_address(0); + // Caller of this function. + void** cur = (void**)FRAME_PTR(); - // Caller in JavaMetaJIT.cpp - cur = (void**)cur[0]; - addresses.push_back(cur); } UserClass* JavaThread::getCallingClass(uint32 level) { // I'm a native function, so try to look at the last Java method. - // First Get the caller of this method. + // First take the getCallingClass address. void** addr = (void**)addresses.back(); + + // Caller of getCallingClass. + addr = (void**)addr[0]; - // Get the caller of the Java getCallingClass method. + // Get the caller of the caller of the Java getCallingClass method. if (level) addr = (void**)addr[0]; void* ip = FRAME_IP(addr); @@ -130,7 +129,7 @@ // We end walking the stack when we cross a native -> Java call. Here // the iterator points to a native -> Java call. We dereference addr twice // because a native -> Java call always contains the signature function. - } while (((void***)addr)[0][0] != *it); + } while (((void***)addr)[0] != *it); } } @@ -158,7 +157,7 @@ // We end walking the stack when we cross a native -> Java call. Here // the iterator points to a native -> Java call. We dereference addr twice // because a native -> Java call always contains the signature function. - } while (((void***)addr)[0][0] != *it); + } while (((void***)addr)[0] != *it); } return 0; } @@ -185,7 +184,7 @@ // We end walking the stack when we cross a native -> Java call. Here // the iterator points to a native -> Java call. We dereference addr twice // because a native -> Java call always contains the signature function. - } while (((void***)addr)[0][0] != *it); + } while (((void***)addr)[0] != *it); } return 0; @@ -221,7 +220,7 @@ std::vector::iterator it = addresses.end(); Jnjvm* vm = getJVM(); - void** addr = (void**)__builtin_frame_address(0); + void** addr = (void**)FRAME_PTR(); // Loop until we cross the first Java frame. while (it != addresses.begin()) { @@ -246,7 +245,7 @@ // End walking the stack when we cross a native -> Java call. Here // the iterator points to a native -> Java call. We dereference addr twice // because a native -> Java call always contains the signature function. - } while (((void***)addr)[0][0] != *it); + } while (((void***)addr)[0] != *it); } while (addr < baseSP && addr < addr[0]) { Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=63134&r1=63133&r2=63134&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Tue Jan 27 15:24:02 2009 @@ -294,7 +294,7 @@ BEGIN_NATIVE_EXCEPTION(0) JavaThread* th = JavaThread::get(); Jnjvm* vm = th->getJVM(); - UserClass* cl = th->getCallingClassLevel(index - 1); + UserClass* cl = th->getCallingClassLevel(index); if (cl) res = cl->getClassDelegatee(vm); END_NATIVE_EXCEPTION From nicolas.geoffray at lip6.fr Wed Jan 28 02:59:53 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 28 Jan 2009 10:59:53 -0000 Subject: [vmkit-commits] [vmkit] r63196 - /vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Message-ID: <200901281059.n0SAxup6000662@zion.cs.uiuc.edu> Author: geoffray Date: Wed Jan 28 04:59:35 2009 New Revision: 63196 URL: http://llvm.org/viewvc/llvm-project?rev=63196&view=rev Log: Makre sure the frame pointer is emitted in memory when calling native methods, otherwise the callee may overwrite it. 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=63196&r1=63195&r2=63196&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Wed Jan 28 04:59:35 2009 @@ -253,10 +253,10 @@ uint32 nargs = func->arg_size() + 1 + (stat ? 1 : 0); std::vector nativeArgs; - Value* threadId = CallInst::Create(module->llvm_frameaddress, - module->constantZero, "", currentBlock); - threadId = new PtrToIntInst(threadId, module->pointerSizeType, "", - currentBlock); + Value* FrameAddr = CallInst::Create(module->llvm_frameaddress, + module->constantZero, "", currentBlock); + Value* threadId = new PtrToIntInst(FrameAddr, module->pointerSizeType, "", + currentBlock); threadId = BinaryOperator::CreateAnd(threadId, module->constantThreadIDMask, "", currentBlock); threadId = new IntToPtrInst(threadId, module->JavaThreadType, "", @@ -320,6 +320,13 @@ nativeFunc = node; } + // When calling a native method, it may do whatever it wants with the + // frame pointer. Therefore make sure it's on the stack. x86_64 has + // this problem because it passes first arguments in registers. + // Therefore, it was overwriting the frame pointer when entering the + // native method. + Value* Temp = new AllocaInst(module->ptrType, "", currentBlock); + new StoreInst(FrameAddr, Temp, currentBlock); Value* result = llvm::CallInst::Create(nativeFunc, nativeArgs.begin(), nativeArgs.end(), "", currentBlock); From nicolas.geoffray at lip6.fr Thu Jan 29 00:56:41 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 29 Jan 2009 08:56:41 -0000 Subject: [vmkit-commits] [vmkit] r63297 - /vmkit/trunk/autoconf/configure.ac Message-ID: <200901290856.n0T8ufVa020867@zion.cs.uiuc.edu> Author: geoffray Date: Thu Jan 29 02:56:41 2009 New Revision: 63297 URL: http://llvm.org/viewvc/llvm-project?rev=63297&view=rev Log: Add a define when using boehm. Modified: vmkit/trunk/autoconf/configure.ac Modified: vmkit/trunk/autoconf/configure.ac URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/autoconf/configure.ac?rev=63297&r1=63296&r2=63297&view=diff ============================================================================== --- vmkit/trunk/autoconf/configure.ac (original) +++ vmkit/trunk/autoconf/configure.ac Thu Jan 29 02:56:41 2009 @@ -187,7 +187,7 @@ GC_LIBS=BoehmGC case $target_os in *linux*) - GC_FLAGS="-I\$(PROJ_SRC_ROOT)/lib/Mvm/BoehmGC -DGC_THREADS -DGC_LINUX_THREADS" + GC_FLAGS="-I\$(PROJ_SRC_ROOT)/lib/Mvm/BoehmGC -DUSE_GC_BOEHM -DGC_THREADS -DGC_LINUX_THREADS" ;; esac else From nicolas.geoffray at lip6.fr Thu Jan 29 00:57:12 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 29 Jan 2009 08:57:12 -0000 Subject: [vmkit-commits] [vmkit] r63298 - /vmkit/trunk/configure Message-ID: <200901290857.n0T8vDef020963@zion.cs.uiuc.edu> Author: geoffray Date: Thu Jan 29 02:57:12 2009 New Revision: 63298 URL: http://llvm.org/viewvc/llvm-project?rev=63298&view=rev Log: Regenerate. Modified: vmkit/trunk/configure Modified: vmkit/trunk/configure URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/configure?rev=63298&r1=63297&r2=63298&view=diff ============================================================================== --- vmkit/trunk/configure (original) +++ vmkit/trunk/configure Thu Jan 29 02:57:12 2009 @@ -3900,7 +3900,7 @@ GC_LIBS=BoehmGC case $target_os in *linux*) - GC_FLAGS="-I\$(PROJ_SRC_ROOT)/lib/Mvm/BoehmGC -DGC_THREADS -DGC_LINUX_THREADS" + GC_FLAGS="-I\$(PROJ_SRC_ROOT)/lib/Mvm/BoehmGC -DUSE_GC_BOEHM -DGC_THREADS -DGC_LINUX_THREADS" ;; esac else From nicolas.geoffray at lip6.fr Thu Jan 29 00:57:54 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 29 Jan 2009 08:57:54 -0000 Subject: [vmkit-commits] [vmkit] r63299 - in /vmkit/trunk/lib: JnJVM/VMCore/JavaClass.cpp JnJVM/VMCore/JavaClass.h JnJVM/VMCore/JavaConstantPool.h JnJVM/VMCore/Jnjvm.cpp JnJVM/VMCore/JnjvmModule.cpp JnJVM/VMCore/JnjvmModule.h JnJVM/VMCore/LockedMap.h Mvm/BoehmGC/MvmGC.h Mvm/BoehmGC/gc.cpp Message-ID: <200901290857.n0T8vs3M021097@zion.cs.uiuc.edu> Author: geoffray Date: Thu Jan 29 02:57:54 2009 New Revision: 63299 URL: http://llvm.org/viewvc/llvm-project?rev=63299&view=rev Log: Fixes for using Boehm's GC. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h vmkit/trunk/lib/Mvm/BoehmGC/MvmGC.h vmkit/trunk/lib/Mvm/BoehmGC/gc.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=63299&r1=63298&r2=63299&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Thu Jan 29 02:57:54 2009 @@ -706,7 +706,11 @@ } void* UserClass::allocateStaticInstance(Jnjvm* vm) { +#ifdef USE_GC_BOEHM + void* val = GC_MALLOC(getStaticSize()); +#else void* val = classLoader->allocator.Allocate(getStaticSize()); +#endif setStaticInstance(val); return val; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=63299&r1=63298&r2=63299&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Thu Jan 29 02:57:54 2009 @@ -362,6 +362,11 @@ // static UserCommonClass* resolvedImplClass(Jnjvm* vm, JavaObject* delegatee, bool doClinit); +#ifdef USE_GC_BOEHM + void* operator new(size_t sz, mvm::BumpPtrAllocator& allocator) { + return GC_MALLOC(sz); + } +#endif }; /// ClassPrimitive - This class represents internal classes for primitive Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h?rev=63299&r1=63298&r2=63299&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h Thu Jan 29 02:57:54 2009 @@ -259,7 +259,7 @@ /// ~JavaConstantPool - Delete the constant pool. /// - ~JavaConstantPool() {} + ~JavaConstantPool() {} }; } // end namespace jnjvm Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=63299&r1=63298&r2=63299&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Thu Jan 29 02:57:54 2009 @@ -905,8 +905,8 @@ upcalls->uncaughtException->invokeIntSpecial(this, upcalls->threadGroup, group, obj, exc); }catch(...) { - printf("Even uncaught exception throwed an exception!\n"); - assert(0); + fprintf(stderr, "Even uncaught exception throwed an exception!\n"); + abort(); } } } @@ -1049,8 +1049,8 @@ throwable = upcalls->newThrowable; - for (std::vector::iterator i = loader->strings.begin(), - e = loader->strings.end(); i != e; ++i) { + for (std::vector >::iterator i = + loader->strings.begin(), e = loader->strings.end(); i != e; ++i) { hashStr.insert(*i); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=63299&r1=63298&r2=63299&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Thu Jan 29 02:57:54 2009 @@ -516,6 +516,7 @@ #endif +#ifdef WITH_TRACER llvm::Function* JnjvmModule::makeTracer(Class* cl, bool stat) { LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); @@ -598,6 +599,7 @@ return func; } +#endif Constant* JnjvmModule::CreateConstantForJavaObject(CommonClass* cl) { const StructType* STy = @@ -1194,11 +1196,16 @@ ClassElts.push_back(Constant::getNullValue(ptrType)); // staticTracer - Function* F = makeTracer(cl, true); const Type* FTy = STy->getContainedType(STy->getNumContainedTypes() - 1); +#ifdef WITH_TRACER + Function* F = makeTracer(cl, true); Constant* staticTracer = ConstantExpr::getCast(Instruction::BitCast, F, FTy); +#else + Constant* staticTracer = ConstantExpr::getNullValue(FTy); +#endif ClassElts.push_back(staticTracer); + return ConstantStruct::get(STy, ClassElts); } @@ -1268,10 +1275,14 @@ Elemts.push_back(N); // Tracer +#ifdef WITH_TRACER Function* Tracer = makeTracer(classDef, false); Elemts.push_back(Tracer ? ConstantExpr::getCast(Instruction::BitCast, Tracer, PTy) : N); - +#else + Elemts.push_back(N); +#endif + // Printer Elemts.push_back(ConstantExpr::getBitCast(ObjectPrinter, PTy)); @@ -1327,8 +1338,8 @@ // Special handling for finalize method. Don't put a finalizer // if there is none, or if it is empty. - if (meth.offset == 0 && !staticCompilation) { -#ifdef ISOLATE_SHARING + if (meth.offset == 0) { +#if defined(ISOLATE_SHARING) || defined(USE_GC_BOEHM) ((void**)VT)[0] = 0; #else JnjvmClassLoader* loader = cl->classLoader; @@ -1347,8 +1358,9 @@ } } #endif + } else { + ((void**)VT)[meth.offset] = EE->getPointerToFunctionOrStub(func); } - ((void**)VT)[meth.offset] = EE->getPointerToFunctionOrStub(func); } #ifdef WITH_TRACER @@ -1417,6 +1429,7 @@ if (!classDef->virtualVT) { Mod->makeVT((Class*)classDef); } else { +#ifdef WITH_TRACER // So the class is vmjc'ed. Create the virtual tracer. Function* func = Function::Create(JnjvmModule::MarkAndTraceType, GlobalValue::ExternalLinkage, @@ -1425,6 +1438,7 @@ void* ptr = ((void**)classDef->virtualVT)[VT_TRACER_OFFSET]; Mod->executionEngine->addGlobalMapping(func, ptr); virtualTracerFunction = func; +#endif } } else { Mod->makeVT(classDef); @@ -1462,13 +1476,14 @@ uint64 size = Mod->getTypeSize(structType); cl->staticSize = size; - +#ifdef WITH_TRACER if (!Mod->isStaticCompiling()) { Function* F = Mod->makeTracer(cl, true); cl->staticTracer = (void (*)(void*)) (uintptr_t) Mod->executionEngine->getPointerToFunction(F); F->deleteBody(); } +#endif } return staticType; } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=63299&r1=63298&r2=63299&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Thu Jan 29 02:57:54 2009 @@ -229,8 +229,10 @@ bool staticCompilation; - +#ifdef WITH_TRACER llvm::Function* makeTracer(Class* cl, bool stat); +#endif + void makeVT(Class* cl); void allocateVT(Class* cl); Modified: vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h?rev=63299&r1=63298&r2=63299&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h Thu Jan 29 02:57:54 2009 @@ -140,6 +140,13 @@ class ClassMap : public LockedMap { + +#ifdef USE_GC_BOEHM +public: + void* operator new(size_t sz, mvm::BumpPtrAllocator& allocator) { + return GC_MALLOC(sz); + } +#endif }; class StringMap : Modified: vmkit/trunk/lib/Mvm/BoehmGC/MvmGC.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/BoehmGC/MvmGC.h?rev=63299&r1=63298&r2=63299&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/BoehmGC/MvmGC.h (original) +++ vmkit/trunk/lib/Mvm/BoehmGC/MvmGC.h Thu Jan 29 02:57:54 2009 @@ -21,6 +21,11 @@ #define TRACER tracer() #define PARENT_TRACER tracer() #define MARK_AND_TRACE markAndTrace() +#define CALL_TRACER tracer() + +namespace mvm { + class Thread; +} extern "C" void * GC_dlopen(const char *path, int mode) throw (); @@ -34,12 +39,12 @@ void markAndTrace() const {} - size_t objectSize() const { + size_t objectSize() const { gc_header * res = (gc_header*)(GC_base((void*)this)); return (GC_size(res) - sizeof(gc_header)); } - void * operator new(size_t sz, VirtualTable *VT) { + void* operator new(size_t sz, VirtualTable *VT) { gc_header * res = (gc_header*) GC_MALLOC(sz + sizeof(gc_header)); res -> _XXX_vt= VT; @@ -50,15 +55,15 @@ return res->_2gc(); } - void * operator new(size_t sz) { + void* operator new(size_t sz) { return malloc(sz); } - void operator delete(void * p) { + void operator delete(void * p) { //GC_FREE(p); } - void * realloc(size_t n) { + void* realloc(size_t n) { void * old = GC_base(this); gc_header * res = (gc_header*) GC_REALLOC(old, n + sizeof(gc_header)); return res->_2gc(); @@ -73,7 +78,7 @@ typedef void (*markerFn)(void*); - static void initialise(markerFn mark, void *base_sp); + static void initialise(markerFn mark); static void destroy() {} static void die_if_sigsegv_occured_during_collection(void *addr){} @@ -103,9 +108,9 @@ GC_gcollect(); } - static void inject_my_thread(void *sp); + static void inject_my_thread(mvm::Thread*); - static void remove_my_thread() {} + static void remove_my_thread(mvm::Thread*) {} static Collector* allocate() { return 0; } static gc* begOf(const void *obj) { Modified: vmkit/trunk/lib/Mvm/BoehmGC/gc.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/BoehmGC/gc.cpp?rev=63299&r1=63298&r2=63299&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/BoehmGC/gc.cpp (original) +++ vmkit/trunk/lib/Mvm/BoehmGC/gc.cpp Thu Jan 29 02:57:54 2009 @@ -12,13 +12,11 @@ using namespace mvm; -void Collector::inject_my_thread(void* base_sp) { - mvm::Thread::get()->baseSP = base_sp; +void Collector::inject_my_thread(mvm::Thread* th) { GC_init(); } -void Collector::initialise(markerFn mark, void *base_sp) { - mvm::Thread::get()->baseSP = base_sp; +void Collector::initialise(markerFn mark) { GC_INIT(); } From nicolas.geoffray at lip6.fr Thu Jan 29 01:22:15 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 29 Jan 2009 09:22:15 -0000 Subject: [vmkit-commits] [vmkit] r63303 - /vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Message-ID: <200901290922.n0T9MFSh025741@zion.cs.uiuc.edu> Author: geoffray Date: Thu Jan 29 03:22:15 2009 New Revision: 63303 URL: http://llvm.org/viewvc/llvm-project?rev=63303&view=rev Log: Remove compilation warning. 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=63303&r1=63302&r2=63303&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Thu Jan 29 03:22:15 2009 @@ -63,8 +63,8 @@ // verification step failed or because initialization was attempted and // failed. - assert(isResolved() || getOwnerClass() || isReady() || - isErroneous() && "Class in wrong state"); + assert((isResolved() || getOwnerClass() || isReady() || + isErroneous()) && "Class in wrong state"); if (getInitializationState() != ready) { From nicolas.geoffray at lip6.fr Thu Jan 29 06:19:01 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 29 Jan 2009 14:19:01 -0000 Subject: [vmkit-commits] [vmkit] r63308 - in /vmkit/trunk: Makefile.rules lib/Mvm/Runtime/Makefile Message-ID: <200901291419.n0TEJ3ZJ003636@zion.cs.uiuc.edu> Author: geoffray Date: Thu Jan 29 08:18:50 2009 New Revision: 63308 URL: http://llvm.org/viewvc/llvm-project?rev=63308&view=rev Log: Cleaning (?) Makefiles. Modified: vmkit/trunk/Makefile.rules vmkit/trunk/lib/Mvm/Runtime/Makefile Modified: vmkit/trunk/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.rules?rev=63308&r1=63307&r2=63308&view=diff ============================================================================== --- vmkit/trunk/Makefile.rules (original) +++ vmkit/trunk/Makefile.rules Thu Jan 29 08:18:50 2009 @@ -22,13 +22,15 @@ .PRECIOUS: LLVMAssembly.s -LLVMAssembly.s : $(LLVMAS) $(LLC) $(VMKIT_ASSEMBLY) +LLVMAssembly.o : $(LLVMAS) $(LLC) $(VMKIT_ASSEMBLY) LLVMAssembly.s : LLVMAssembly.ll $(Echo) "Building LLVM assembly with $(VMKIT_ASSEMBLY)" $(Verb) $(LLVMAS) -f $( Author: geoffray Date: Thu Jan 29 08:41:38 2009 New Revision: 63309 URL: http://llvm.org/viewvc/llvm-project?rev=63309&view=rev Log: Makefiles again. Modified: vmkit/trunk/Makefile.rules vmkit/trunk/lib/Mvm/Runtime/Makefile Modified: vmkit/trunk/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.rules?rev=63309&r1=63308&r2=63309&view=diff ============================================================================== --- vmkit/trunk/Makefile.rules (original) +++ vmkit/trunk/Makefile.rules Thu Jan 29 08:41:38 2009 @@ -28,9 +28,9 @@ $(Echo) "Building LLVM assembly with $(VMKIT_ASSEMBLY)" $(Verb) $(LLVMAS) -f $( Author: geoffray Date: Thu Jan 29 10:45:50 2009 New Revision: 63313 URL: http://llvm.org/viewvc/llvm-project?rev=63313&view=rev Log: Go to hell GCC. 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=63313&r1=63312&r2=63313&view=diff ============================================================================== --- vmkit/trunk/Makefile.common.in (original) +++ vmkit/trunk/Makefile.common.in Thu Jan 29 10:45:50 2009 @@ -23,7 +23,7 @@ # Include LLVM's Master Makefile. include $(LLVM_OBJ_ROOT)/Makefile.common -CXX.Flags += @GC_FLAGS@ @VM_FLAGS@ -Wno-variadic-macros -fno-omit-frame-pointer -ansi -DENABLE_THREADS +CXX.Flags += @GC_FLAGS@ @VM_FLAGS@ -Wno-variadic-macros -fno-omit-frame-pointer -fno-strict-aliasing -Wno-deprecated -ansi -DENABLE_THREADS # GNU Classpath flags CLASSPATH_FLAGS = @classpathinclude@ From nicolas.geoffray at lip6.fr Thu Jan 29 08:46:37 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 29 Jan 2009 16:46:37 -0000 Subject: [vmkit-commits] [vmkit] r63314 - /vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp Message-ID: <200901291646.n0TGkbJN008545@zion.cs.uiuc.edu> Author: geoffray Date: Thu Jan 29 10:46:36 2009 New Revision: 63314 URL: http://llvm.org/viewvc/llvm-project?rev=63314&view=rev Log: Take some precaution when calling JNI_OnLoad of a dynamic library. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp?rev=63314&r1=63313&r2=63314&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp Thu Jan 29 10:46:36 2009 @@ -21,6 +21,7 @@ #include "JavaUpcalls.h" #include "Jnjvm.h" +#include #include using namespace jnjvm; @@ -68,7 +69,28 @@ } typedef int (*onLoad_t)(const void**, void*); +extern "C" void jniProceedPendingException(); +// Calls the JNI_OnLoad function of a dynamic library. +void callOnLoad(void* res, JnjvmClassLoader* loader, Jnjvm* vm) { + + onLoad_t onLoad = (onLoad_t)loader->loadInLib("JNI_OnLoad", res); + + if (onLoad) { + JavaThread* th = JavaThread::get(); + mvm::Allocator& allocator = th->getJVM()->gcAllocator; + void** buf = (void**)allocator.allocateTemporaryMemory(sizeof(jmp_buf)); + th->sjlj_buffers.push_back((jmp_buf*)buf); + + th->startNative(1); + if (setjmp((__jmp_buf_tag*)buf) == 0) { + onLoad(&vm->javavmEnv, res); + } + jniProceedPendingException(); + } +} + +// Never throws. JNIEXPORT jint JNICALL Java_java_lang_VMRuntime_nativeLoad( #ifdef NATIVE_JNI JNIEnv *env, @@ -77,9 +99,7 @@ jobject _str, jobject _loader) { - jint result = 0; - - BEGIN_NATIVE_EXCEPTION(0) + void* res = 0; JavaString* str = (JavaString*)_str; Jnjvm* vm = JavaThread::get()->getJVM(); @@ -88,19 +108,11 @@ char* buf = str->strToAsciiz(); - void* res = loader->loadLib(buf); - - if (res != 0) { - onLoad_t onLoad = (onLoad_t)loader->loadInLib("JNI_OnLoad", res); - if (onLoad) onLoad(&vm->javavmEnv, 0); - result = 1; - } else { - result = 0; - } - - END_NATIVE_EXCEPTION + res = loader->loadLib(buf); + + if (res) callOnLoad(res, loader, vm); - return result; + return res != 0; } From nicolas.geoffray at lip6.fr Thu Jan 29 09:17:39 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 29 Jan 2009 17:17:39 -0000 Subject: [vmkit-commits] [vmkit] r63316 - /vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp Message-ID: <200901291717.n0THHd5X009661@zion.cs.uiuc.edu> Author: geoffray Date: Thu Jan 29 11:17:37 2009 New Revision: 63316 URL: http://llvm.org/viewvc/llvm-project?rev=63316&view=rev Log: Create a type for jmp_buf. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp?rev=63316&r1=63315&r2=63316&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp Thu Jan 29 11:17:37 2009 @@ -68,6 +68,12 @@ } +#if defined(__MACH__) +typedef int* jumpbuf_t; +#else +typedef __jmp_buf_tag* jumpbuf_t; +#endif + typedef int (*onLoad_t)(const void**, void*); extern "C" void jniProceedPendingException(); @@ -83,7 +89,7 @@ th->sjlj_buffers.push_back((jmp_buf*)buf); th->startNative(1); - if (setjmp((__jmp_buf_tag*)buf) == 0) { + if (setjmp((jumpbuf_t)buf) == 0) { onLoad(&vm->javavmEnv, res); } jniProceedPendingException(); From nicolas.geoffray at lip6.fr Fri Jan 30 10:03:28 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 30 Jan 2009 18:03:28 -0000 Subject: [vmkit-commits] [vmkit] r63399 - in /vmkit/trunk/lib/JnJVM: LLVMRuntime/runtime-default.ll VMCore/JavaJIT.cpp VMCore/JnjvmModule.cpp VMCore/JnjvmModule.h VMCore/LowerConstantCalls.cpp Message-ID: <200901301803.n0UI3SfG007517@zion.cs.uiuc.edu> Author: geoffray Date: Fri Jan 30 12:03:28 2009 New Revision: 63399 URL: http://llvm.org/viewvc/llvm-project?rev=63399&view=rev Log: We don't want to call Java methods when materializing a function because of the call trace. Therefore make sure the class is loaded before calling an invokeSpecial. Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll 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/LowerConstantCalls.cpp 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=63399&r1=63398&r2=63399&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original) +++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Fri Jan 30 12:03:28 2009 @@ -122,6 +122,12 @@ ;;; implementation. declare void @forceInitialisationCheck(%JavaClass*) +;;; forceLoadedCheck - Force to check if the class was loaded. Since we do +;;; not want to run Java code in a callback, we have to make sure the class +;;; of the method that we want to compile is loaded. This is used for +;;; the invokespecial bytecode. +declare void @forceLoadedCheck(%JavaCommonClass*) + ;;; 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. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=63399&r1=63398&r2=63399&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Fri Jan 30 12:03:28 2009 @@ -1585,6 +1585,16 @@ (Function*)ctpInfo->infoOfStaticOrSpecialMethod(index, ACC_VIRTUAL, signature, meth); + if (!meth) { + // Make sure the class is loaded before materializing the method. + uint32 clIndex = ctpInfo->getClassIndexFromMethod(index); + UserCommonClass* cl = 0; + Value* Cl = getResolvedCommonClass(clIndex, false, &cl); + if (!cl) { + CallInst::Create(module->ForceLoadedCheckFunction, Cl, "", currentBlock); + } + } + if (meth && canBeInlined(meth)) { val = invokeInline(meth, args); } else { Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=63399&r1=63398&r2=63399&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Fri Jan 30 12:03:28 2009 @@ -2147,6 +2147,7 @@ InterfaceLookupFunction = module->getFunction("jnjvmVirtualLookup"); MultiCallNewFunction = module->getFunction("multiCallNew"); + ForceLoadedCheckFunction = module->getFunction("forceLoadedCheck"); InitialisationCheckFunction = module->getFunction("initialisationCheck"); ForceInitialisationCheckFunction = module->getFunction("forceInitialisationCheck"); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=63399&r1=63398&r2=63399&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Fri Jan 30 12:03:28 2009 @@ -310,6 +310,7 @@ llvm::Function* InitialiseClassFunction; llvm::Function* InitialisationCheckFunction; llvm::Function* ForceInitialisationCheckFunction; + llvm::Function* ForceLoadedCheckFunction; llvm::Function* ClassLookupFunction; #ifndef WITHOUT_VTABLE llvm::Function* VirtualLookupFunction; Modified: vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=63399&r1=63398&r2=63399&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Fri Jan 30 12:03:28 2009 @@ -459,7 +459,8 @@ BranchInst::Create(NBB, OKBlock); break; } - } else if (V == module->ForceInitialisationCheckFunction) { + } else if (V == module->ForceInitialisationCheckFunction || + V == module->ForceLoadedCheckFunction ) { Changed = true; CI->eraseFromParent(); }