<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Jan 13, 2014 at 11:26 AM, Gael Thomas <span dir="ltr"><<a href="mailto:gael.thomas@lip6.fr" target="_blank">gael.thomas@lip6.fr</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: gthomas<br>
Date: Mon Jan 13 05:26:16 2014<br>
New Revision: 199098<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=199098&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=199098&view=rev</a><br>
Log:<br>
Implements GetPrimitiveArrayCritical ReleasePrimitiveArrayCritical.<br>
Implements dup* bytecodes.<br>
Simplify allocation of stacks/locals.<br>
Fix a memory bug in meta stack management for the control flow.<br>
Fix a memory bug in J3Class::clone.<br>
<br>
<br>
Modified:<br>
    vmkit/branches/mcjit/include/j3/j3codegenvar.h<br>
    vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc<br>
    vmkit/branches/mcjit/lib/j3/vm/j3.cc<br>
    vmkit/branches/mcjit/lib/j3/vm/j3class.cc<br>
    vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc<br>
    vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc<br>
    vmkit/branches/mcjit/lib/j3/vm/j3jni.cc<br>
<br>
Modified: vmkit/branches/mcjit/include/j3/j3codegenvar.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegenvar.h?rev=199098&r1=199097&r2=199098&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegenvar.h?rev=199098&r1=199097&r2=199098&view=diff</a><br>

==============================================================================<br>
--- vmkit/branches/mcjit/include/j3/j3codegenvar.h (original)<br>
+++ vmkit/branches/mcjit/include/j3/j3codegenvar.h Mon Jan 13 05:26:16 2014<br>
@@ -27,8 +27,7 @@ namespace j3 {<br>
                uint32_t            topStack;<br>
                uint32_t            maxStack;<br>
<br>
-               static uint32_t     reservedSize(uint32_t max);<br>
-               void                init(J3CodeGen* _codeGen, uint32_t max, void* space);<br>
+               void                init(J3CodeGen* _codeGen, uint32_t max);<br>
<br>
                void                killUnused();<br>
<br>
<br>
Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=199098&r1=199097&r2=199098&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=199098&r1=199097&r2=199098&view=diff</a><br>

==============================================================================<br>
--- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original)<br>
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Mon Jan 13 05:26:16 2014<br>
@@ -33,8 +33,9 @@ static char* buildPath(const char* base,<br>
 void J3Lib::processOptions(J3* vm) {<br>
        const char* jh = getenv("JAVA_HOME");<br>
        jh = jh ? jh : OPENJDK_HOME"/jre";<br>
+       jh = strdup(jh);<br>
<br>
-       vm->options()->javaHome = jh ? jh : OPENJDK_HOME;<br>
+       vm->options()->javaHome = jh;<br>
        vm->options()->bootClasspath = buildPath(jh, "/lib/rt.jar");<br>
        vm->options()->systemLibraryPath = buildPath(jh, OPENJDK_LIBPATH_SUFFIX);<br>
        vm->options()->extDirs = buildPath(jh, "/lib/ext");<br>
<br>
Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3.cc?rev=199098&r1=199097&r2=199098&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3.cc?rev=199098&r1=199097&r2=199098&view=diff</a><br>

==============================================================================<br>
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)<br>
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Mon Jan 13 05:26:16 2014<br>
@@ -158,7 +158,7 @@ void J3::run() {<br>
        if(options()->debugLifeCycle)<br>
                fprintf(stderr, "  Launching the application\n");<br>
<br>
-       options()->debugExecute = 0;<br>
+       //options()->debugExecute = 0;<br>
<br>
 #if 0<br>
        J3Class* loaderClass = z_class("java/lang/ClassLoader");<br>
@@ -340,5 +340,3 @@ void J3::forceSymbolDefinition() {<br>
        } catch(void* e) {<br>
        }<br>
 }<br>
-<br>
-<br>
<br>
Modified: vmkit/branches/mcjit/lib/j3/vm/j3class.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3class.cc?rev=199098&r1=199097&r2=199098&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3class.cc?rev=199098&r1=199097&r2=199098&view=diff</a><br>

==============================================================================<br>
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)<br>
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Mon Jan 13 05:26:16 2014<br>
@@ -331,7 +331,7 @@ uint16_t J3Class::modifiers() {<br>
<br>
 J3ObjectHandle* J3Class::clone(J3ObjectHandle* obj) {<br>
        J3ObjectHandle* res = J3ObjectHandle::doNewObject(this);<br>
-       obj->rawObjectCopyTo(0, res, 0, structSize());<br>
+       obj->rawObjectCopyTo(0, res, 0, structSize() - sizeof(J3Object));<br>
        return res;<br>
 }<br>
<br>
<br>
Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=199098&r1=199097&r2=199098&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=199098&r1=199097&r2=199098&view=diff</a><br>

==============================================================================<br>
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)<br>
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Mon Jan 13 05:26:16 2014<br>
@@ -41,9 +41,10 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato<br>
<br>
 #if 0<br>
        /* usefull to debug a single function */<br>
-       if(   cl->name() == vm->names()->get("java/lang/CharacterData") &&<br>
-                               method->name() == vm->names()->get("of") &&<br>
-                               method->signature()->name() == vm->names()->get("(I)Ljava/lang/CharacterData;") ) {<br>
+       if(   cl->name() == vm->names()->get("sun/util/calendar/BaseCalendar") &&<br>
+                               method->name() == vm->names()->get("getFixedDate") &&<br>
+                               method->signature()->name() == vm->names()->get("(IIILsun/util/calendar/BaseCalendar$Date;)J") ) {<br>
+<br>
                vm->options()->debugTranslate = 3;<br>
        }<br>
 #endif<br>
@@ -107,7 +108,7 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato<br>
                else<br>
                        generateJava();<br>
<br>
-               if(vm->options()->debugTranslate > 3)<br>
+               if(vm->options()->debugTranslate > 4)<br>
                        llvmFunction->dump();<br>
        }<br>
<br>
@@ -399,8 +400,9 @@ void J3CodeGen::invoke(uint32_t access,<br>
                res = builder->CreateInvoke(func, after, exceptions.nodes[curExceptionNode]->landingPad, args);<br>
                bb = after;<br>
                builder->SetInsertPoint(bb);<br>
-       } else<br>
+       } else {<br>
                res = builder->CreateCall(func, args);<br>
+       }<br>
<br>
        if(!res->getType()->isVoidTy())<br>
                stack.push(flatten(res));<br>
@@ -784,7 +786,7 @@ llvm::BasicBlock* J3CodeGen::forwardBran<br>
                llvm::BasicBlock* res = newBB(id);<br>
<br>
                if(doAlloc) {<br>
-                       opInfos[pc].metaStack = (llvm::Type**)allocator->allocate(sizeof(llvm::Type*)*stack.topStack);<br>
+                       opInfos[pc].metaStack = (llvm::Type**)allocator->allocate(sizeof(llvm::Type*)*stack.maxStack);<br>
                        memcpy(opInfos[pc].metaStack, stack.metaStack, sizeof(llvm::Type*)*stack.topStack);<br>
                }<br>
<br>
@@ -858,6 +860,7 @@ void J3CodeGen::translate() {<br>
        while(codeReader->remaining()) {<br>
                llvm::Value* val1;<br>
                llvm::Value* val2;<br>
+               llvm::Value* val3;<br>
<br>
                javaPC = codeReader->tell();<br>
<br>
@@ -1159,7 +1162,16 @@ void J3CodeGen::translate() {<br>
                                stack.push(val1); stack.push(val2); stack.push(val1);<br>
                                break;<br>
<br>
-                       case J3Cst::BC_dup_x2: nyi();                 /* 0x5b */<br>
+                       case J3Cst::BC_dup_x2:                        /* 0x5b */<br>
+                               val1 = stack.pop();<br>
+                               val2 = stack.pop();<br>
+                               if(val2->getType()->isDoubleTy() || val2->getType()->isIntegerTy(64)) {<br>
+                                       stack.push(val1); stack.push(val2); stack.push(val1);<br>
+                               } else {<br>
+                                       val3 = stack.pop();<br>
+                                       stack.push(val1); stack.push(val3); stack.push(val2); stack.push(val1);<br>
+                               }<br>
+                               break;<br>
<br>
                        case J3Cst::BC_dup2:                          /* 0x5c */<br>
                                val1 = stack.top();<br>
@@ -1171,9 +1183,32 @@ void J3CodeGen::translate() {<br>
                                }<br>
                                break;<br>
<br>
-                       case J3Cst::BC_dup2_x1: nyi();                /* 0x5d */<br>
-                       case J3Cst::BC_dup2_x2: nyi();                /* 0x5e */<br>
-                       case J3Cst::BC_swap: nyi();                   /* 0x5f */<br>
+                       case J3Cst::BC_dup2_x1:                       /* 0x5d */<br>
+                               val1 = stack.pop();<br>
+                               val2 = stack.pop();<br>
+                               if(val1->getType()->isDoubleTy() || val1->getType()->isIntegerTy(64)) {<br>
+                                       stack.push(val1); stack.push(val2); stack.push(val1);<br>
+                               } else {<br>
+                                       val3 = stack.pop();<br>
+                                       stack.push(val2); stack.push(val1); stack.push(val3); stack.push(val2); stack.push(val1);<br>
+                               }<br>
+                               break;<br>
+<br>
+                       case J3Cst::BC_dup2_x2:                       /* 0x5e */<br>
+                               val1 = stack.pop();<br>
+                               val2 = stack.pop();<br>
+                               val3 = stack.pop();<br>
+                               if(val1->getType()->isDoubleTy() || val1->getType()->isIntegerTy(64)) {<br>
+                                       stack.push(val1); stack.push(val3); stack.push(val2); stack.push(val1);<br>
+                               } else {<br>
+                                       llvm::Value* val4 = stack.pop();<br>
+                                       stack.push(val2); stack.push(val1); stack.push(val4); stack.push(val3); stack.push(val2); stack.push(val1);<br>
+                               }<br>
+                               break;<br>
+<br>
+                       case J3Cst::BC_swap:                          /* 0x5f */<br>
+                               val1 = stack.pop(); val2 = stack.pop(); stack.push(val1); stack.push(val2);<br>
+                               break;<br>
<br>
                        case J3Cst::BC_iadd:                          /* 0x60 */<br>
                        case J3Cst::BC_ladd:                          /* 0x61 */<br>
@@ -1609,9 +1644,9 @@ void J3CodeGen::generateJava() {<br>
        uint32_t nbLocals  = reader.readU2();<br>
        uint32_t codeLength = reader.readU4();<br>
<br>
-       locals.init(this, nbLocals, allocator->allocate(J3CodeGenVar::reservedSize(nbLocals)));<br>
-       stack.init(this, maxStack, allocator->allocate(J3CodeGenVar::reservedSize(maxStack)));<br>
-       ret.init(this, 1, allocator->allocate(J3CodeGenVar::reservedSize(1)));<br>
+       locals.init(this, nbLocals);<br>
+       stack.init(this, maxStack);<br>
+       ret.init(this, 1);<br>
<br>
        genDebugEnterLeave(0);<br>
<br>
<br>
Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc?rev=199098&r1=199097&r2=199098&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc?rev=199098&r1=199097&r2=199098&view=diff</a><br>

==============================================================================<br>
--- vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc (original)<br>
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc Mon Jan 13 05:26:16 2014<br>
@@ -40,16 +40,13 @@ void J3CodeGenVar::killUnused() {<br>
        killUnused(refStack, 1);<br>
 }<br>
<br>
-uint32_t J3CodeGenVar::reservedSize(uint32_t max) {<br>
-       return max*5*sizeof(llvm::AllocaInst*) + max*sizeof(llvm::Type*);<br>
-}<br>
-<br>
 uint32_t J3CodeGenVar::metaStackSize() {<br>
        return topStack*sizeof(llvm::Type*);<br>
 }<br>
<br>
-void J3CodeGenVar::init(J3CodeGen* _codeGen, uint32_t max, void* space) {<br>
+void J3CodeGenVar::init(J3CodeGen* _codeGen, uint32_t max) {<br>
        codeGen = _codeGen;<br>
+       void* space = codeGen->allocator->allocate(max*5*sizeof(llvm::AllocaInst*) + max*sizeof(llvm::Type*));<br>
        maxStack = max;<br>
        intStack = (llvm::AllocaInst**)space;<br>
        longStack = intStack + max;<br>
<br>
Modified: vmkit/branches/mcjit/lib/j3/vm/j3jni.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3jni.cc?rev=199098&r1=199097&r2=199098&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3jni.cc?rev=199098&r1=199097&r2=199098&view=diff</a><br>

==============================================================================<br>
--- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original)<br>
+++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Mon Jan 13 05:26:16 2014<br>
@@ -570,8 +570,15 @@ void JNICALL GetStringUTFRegion(JNIEnv*<br>
        leaveJVM();<br>
 }<br>
<br>
-void* JNICALL GetPrimitiveArrayCritical(JNIEnv* env, jarray array, jboolean* isCopy) { enterJVM(); leaveJVM(); NYI(); }<br>
-void JNICALL ReleasePrimitiveArrayCritical(JNIEnv* env, jarray array, void* carray, jint mode) { enterJVM(); leaveJVM(); NYI(); }<br>
+void* JNICALL GetPrimitiveArrayCritical(JNIEnv* env, jarray array, jboolean* isCopy) {<br>
+       //GC::disable(); ?<br></blockquote><div><br></div><div>Hmmm, are you sure you want to comment this line?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

+       if(isCopy)<br>
+               isCopy = 0;<br></blockquote><div><br></div><div>*isCopy = JNI_TRUE?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+       return array ? array->array()->content() : 0;<br>
+}<br>
+<br>
+void JNICALL ReleasePrimitiveArrayCritical(JNIEnv* env, jarray array, void* carray, jint mode) {<br>
+}<br>
<br>
 const jchar* JNICALL GetStringCritical(JNIEnv* env, jstring string, jboolean* isCopy) { enterJVM(); leaveJVM(); NYI(); }<br>
 void JNICALL ReleaseStringCritical(JNIEnv* env, jstring string, const jchar* cstring) { enterJVM(); leaveJVM(); NYI(); }<br>
<br>
<br>
_______________________________________________<br>
vmkit-commits mailing list<br>
<a href="mailto:vmkit-commits@cs.uiuc.edu">vmkit-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits</a><br>
</blockquote></div><br></div></div>