[vmkit-commits] [vmkit] r93122 - in /vmkit/trunk: lib/J3/Classpath/ lib/J3/Compiler/ lib/J3/VMCore/ tools/j3/

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sun Jan 10 11:52:23 PST 2010


Author: geoffray
Date: Sun Jan 10 13:52:23 2010
New Revision: 93122

URL: http://llvm.org/viewvc/llvm-project?rev=93122&view=rev
Log:
Invoke Java code from native by using the same conventions than
JNI Invoke*A functions: the arguments are in a buffer and objects
are not stored direclty but addressed.


Modified:
    vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc
    vmkit/trunk/lib/J3/Classpath/ClasspathField.inc
    vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc
    vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc
    vmkit/trunk/lib/J3/Classpath/ClasspathVMSystemProperties.inc
    vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc
    vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp
    vmkit/trunk/lib/J3/Compiler/JITInfo.cpp
    vmkit/trunk/lib/J3/VMCore/JavaClass.h
    vmkit/trunk/lib/J3/VMCore/JavaMetaJIT.cpp
    vmkit/trunk/lib/J3/VMCore/JavaObject.cpp
    vmkit/trunk/lib/J3/VMCore/JavaObject.h
    vmkit/trunk/lib/J3/VMCore/Jni.cpp
    vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/tools/j3/Makefile

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc?rev=93122&r1=93121&r2=93122&view=diff

==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc Sun Jan 10 13:52:23 2010
@@ -96,11 +96,7 @@
   if (isAbstract(cl->access)) vm->instantiationException(cl);
 
   // Allocate a buffer to store the arguments.
-  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
+  jvalue* buf = size ? (jvalue*)alloca(size * sizeof(jvalue)) : 0;
 
   if (nbArgs == size) {
     UserCommonClass* _cl = UserCommonClass::resolvedImplClass(vm, Clazz, false);
@@ -113,12 +109,15 @@
       Typedef* const* arguments = sign->getArgumentsType();
       // Store the arguments, unboxing primitives if necessary.
       for (sint32 i = 0; i < size; ++i) {
-        ptr[i]->decapsulePrimitive(vm, buf, arguments[i]);
+        ptr[i]->decapsulePrimitive(vm, &buf[i], arguments[i]);
+        if (buf[i].l == reinterpret_cast<jobject>(ptr[i])) {
+          buf[i].l = reinterpret_cast<jobject>(&ptr[i]);
+        }
       }
       
       JavaThread* th = JavaThread::get();
       try {
-        meth->invokeIntSpecialBuf(vm, cl, res, startBuf);
+        meth->invokeIntSpecialBuf(vm, cl, res, buf);
       } catch(...) {
         excp = th->getJavaException();
         if (excp->getClass()->isAssignableFrom(vm->upcalls->newException)) {

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathField.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathField.inc?rev=93122&r1=93121&r2=93122&view=diff

==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathField.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathField.inc Sun Jan 10 13:52:23 2010
@@ -534,7 +534,7 @@
   Jnjvm* vm = JavaThread::get()->getJVM();
   UserClass* cl = Field->getClass();
   JavaField* field = Field->getInternalField();
-  uint64_t buf = 0;
+  jvalue buf;
   bool stat = isStatic(field->access);
   void* StatPtr = 0;
   
@@ -546,30 +546,28 @@
     verifyNull(obj);
   }
  
-  void* _buf = (void*)(&buf);
-  uintptr_t __buf = (uintptr_t)&buf;
   const Typedef* type = field->getSignature();
-  val->decapsulePrimitive(vm, __buf, type);
+  val->decapsulePrimitive(vm, &buf, type);
   
 
   if (type->isPrimitive()) {
     const PrimitiveTypedef* prim = (PrimitiveTypedef*)type;
     if (prim->isBool())
-      field->setInt8Field(stat ? StatPtr : obj, ((uint8*)_buf)[0]);
+      field->setInt8Field(stat ? StatPtr : obj, buf.z);
     else if (prim->isByte())
-      field->setInt8Field(stat ? StatPtr : obj, ((sint8*)_buf)[0]);
+      field->setInt8Field(stat ? StatPtr : obj, buf.b);
     else if (prim->isChar())
-      field->setInt16Field(stat ? StatPtr : obj, ((uint16*)_buf)[0]);
+      field->setInt16Field(stat ? StatPtr : obj, buf.c);
     else if (prim->isShort())
-      field->setInt16Field(stat ? StatPtr : obj, ((sint16*)_buf)[0]);
+      field->setInt16Field(stat ? StatPtr : obj, buf.s);
     else if (prim->isInt())
-      field->setInt32Field(stat ? StatPtr : obj, ((sint32*)_buf)[0]);
+      field->setInt32Field(stat ? StatPtr : obj, buf.i);
     else if (prim->isLong())
-      field->setLongField(stat ? StatPtr : obj, ((sint64*)_buf)[0]);
+      field->setLongField(stat ? StatPtr : obj, buf.j);
     else if (prim->isFloat())
-      field->setFloatField(stat ? StatPtr : obj, ((float*)_buf)[0]);
+      field->setFloatField(stat ? StatPtr : obj, buf.f);
     else if (prim->isDouble())
-      field->setDoubleField(stat ? StatPtr : obj, ((double*)_buf)[0]);
+      field->setDoubleField(stat ? StatPtr : obj, buf.d);
   } else {
     field->setObjectField(stat ? StatPtr : obj, val);
   }

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc?rev=93122&r1=93121&r2=93122&view=diff

==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc Sun Jan 10 13:52:23 2010
@@ -115,10 +115,8 @@
   Signdef* sign = meth->getSignature();
   sint32 size = sign->nbArguments;
 
-  uintptr_t buf = size ? (uintptr_t)alloca(size * sizeof(uint64)) : 0;
+  jvalue* buf = size ? (jvalue*)alloca(size * sizeof(jvalue)) : 0;
   
-
-  void* _buf = (void*)buf;
   if (nbArgs == size) {
     UserCommonClass* _cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
     UserClass* cl = (UserClass*)_cl;
@@ -144,7 +142,10 @@
     JavaObject** ptr = (JavaObject**)(void*)(args->elements);
     Typedef* const* arguments = sign->getArgumentsType();
     for (sint32 i = 0; i < size; ++i) {
-      ptr[i]->decapsulePrimitive(vm, buf, arguments[i]);
+      ptr[i]->decapsulePrimitive(vm, &buf[i], arguments[i]);
+      if (buf[i].l == reinterpret_cast<jobject>(ptr[i])) {
+        buf[i].l = reinterpret_cast<jobject>(&ptr[i]);
+      }
     }
     
     JavaThread* th = JavaThread::get();
@@ -154,12 +155,12 @@
       if (isVirtual(meth->access)) { \
         if (isPublic(meth->access) && !isFinal(meth->access) && \
             !isFinal(meth->classDef->access)) { \
-          VAR = meth->invoke##TYPE##VirtualBuf(vm, cl, obj, _buf); \
+          VAR = meth->invoke##TYPE##VirtualBuf(vm, cl, obj, buf); \
         } else { \
-          VAR = meth->invoke##TYPE##SpecialBuf(vm, cl, obj, _buf); \
+          VAR = meth->invoke##TYPE##SpecialBuf(vm, cl, obj, buf); \
         } \
       } else { \
-        VAR = meth->invoke##TYPE##StaticBuf(vm, cl, _buf); \
+        VAR = meth->invoke##TYPE##StaticBuf(vm, cl, buf); \
       } \
     } catch(...) { \
       exc = th->getJavaException(); \

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc?rev=93122&r1=93121&r2=93122&view=diff

==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc Sun Jan 10 13:52:23 2010
@@ -122,7 +122,7 @@
           (!publicOnly || pub)) {
         UserClass* Cons = vm->upcalls->newConstructor;
         tmp = Cons->doNew(vm);
-        vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp, Cl, i);
+        vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp, &Cl, i);
         ret->elements[index++] = tmp;
       }
     }
@@ -186,7 +186,7 @@
         UserClass* Meth = vm->upcalls->newMethod;
         tmp = Meth->doNew(vm);
         str = vm->internalUTF8ToStr(meth->name);
-        upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp, Cl, str, i);
+        upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp, &Cl, &str, i);
         ret->elements[index++] = tmp;
       }
     }
@@ -456,7 +456,7 @@
         UserClass* Field = vm->upcalls->newField;
         tmp = Field->doNew(vm);
         name = vm->internalUTF8ToStr(field->name);
-        vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp, Cl, name, i);
+        vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp, &Cl, &name, i);
         ret->elements[index++] = tmp;
       }
     }

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMSystemProperties.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMSystemProperties.inc?rev=93122&r1=93121&r2=93122&view=diff

==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMSystemProperties.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMSystemProperties.inc Sun Jan 10 13:52:23 2010
@@ -26,13 +26,18 @@
 
 static void setProperty(Jnjvm* vm, JavaObject* prop, const char* key,
                         const char* val) {
- 
+
+  JavaString* Val = 0; 
+  JavaString* Key = 0; 
   llvm_gcroot(prop, 0);
+  llvm_gcroot(Val, 0);
+  llvm_gcroot(Key, 0);
+
+  Val = vm->asciizToStr(val);
+  Key = vm->asciizToStr(key);
                         
   vm->upcalls->setProperty->invokeIntSpecial(vm, (UserClass*)prop->getClass(),
-                                             prop,
-                                             vm->asciizToStr(key),
-                                             vm->asciizToStr(val));
+                                             prop, &Key, &Val);
 }
 
 static void setUnameProp(Jnjvm* vm, JavaObject* prop) {

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc?rev=93122&r1=93121&r2=93122&view=diff

==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc Sun Jan 10 13:52:23 2010
@@ -102,10 +102,10 @@
   UserClass* newS = vm->upcalls->newStackTraceElement;
   res = newS->doNew(vm);
   vm->upcalls->initStackTraceElement->invokeIntSpecial(vm, newS, res,
-                                                       sourceName,
+                                                       &sourceName,
                                                        0, // source line
-                                                       className,
-                                                       methodName, native);
+                                                       &className,
+                                                       &methodName, native);
   return res;
 }
 

Modified: vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp?rev=93122&r1=93121&r2=93122&view=diff

==============================================================================
--- vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp Sun Jan 10 13:52:23 2010
@@ -248,9 +248,9 @@
   vmdataVMThread->setObjectField(vmth, (JavaObject*)myth);
   
   group->setObjectField(th, Group);
-  groupAddThread->invokeIntSpecial(vm, threadGroup, Group, th);
+  groupAddThread->invokeIntSpecial(vm, threadGroup, Group, &th);
   
-  finaliseCreateInitialThread->invokeIntStatic(vm, inheritableThreadLocal, th);
+  finaliseCreateInitialThread->invokeIntStatic(vm, inheritableThreadLocal, &th);
 }
 
 void Classpath::InitializeThreading(Jnjvm* vm) {

Modified: vmkit/trunk/lib/J3/Compiler/JITInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Compiler/JITInfo.cpp?rev=93122&r1=93121&r2=93122&view=diff

==============================================================================
--- vmkit/trunk/lib/J3/Compiler/JITInfo.cpp (original)
+++ vmkit/trunk/lib/J3/Compiler/JITInfo.cpp Sun Jan 10 13:52:23 2010
@@ -374,7 +374,6 @@
     
     if (arguments[i]->isReference()) {
       arg = new IntToPtrInst(arg, Intrinsics.JavaObjectType, "", currentBlock);
-#if 0
       Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ,
                                 Intrinsics.JavaObjectNullConstant,
                                 arg, "");
@@ -393,7 +392,6 @@
       BranchInst::Create(endBlock, currentBlock);
       currentBlock = endBlock;
       arg = node;
-#endif
     } else if (arguments[i]->isFloat()) {
       arg = new TruncInst(arg, LLVMAssessorInfo::AssessorInfo[I_INT].llvmType,
                           "", currentBlock);

Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.h?rev=93122&r1=93121&r2=93122&view=diff

==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.h Sun Jan 10 13:52:23 2010
@@ -1125,37 +1125,37 @@
 //===----------------------------------------------------------------------===//
   
   /// This class of methods takes a variable argument list.
-  uint32 invokeIntSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = false)
+  uint32 invokeIntSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = true)
     __attribute__ ((noinline));
-  float invokeFloatSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = false)
+  float invokeFloatSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = true)
     __attribute__ ((noinline));
   double invokeDoubleSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj,
-                               va_list ap, bool jni = false) __attribute__ ((noinline));
-  sint64 invokeLongSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = false)
+                               va_list ap, bool jni = true) __attribute__ ((noinline));
+  sint64 invokeLongSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = true)
     __attribute__ ((noinline));
   JavaObject* invokeJavaObjectSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj,
-                                        va_list ap, bool jni = false) __attribute__ ((noinline));
+                                        va_list ap, bool jni = true) __attribute__ ((noinline));
   
-  uint32 invokeIntVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = false)
+  uint32 invokeIntVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = true)
     __attribute__ ((noinline));
-  float invokeFloatVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = false)
+  float invokeFloatVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = true)
     __attribute__ ((noinline));
   double invokeDoubleVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj,
-                               va_list ap, bool jni = false) __attribute__ ((noinline));
-  sint64 invokeLongVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = false)
+                               va_list ap, bool jni = true) __attribute__ ((noinline));
+  sint64 invokeLongVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = true)
     __attribute__ ((noinline));
   JavaObject* invokeJavaObjectVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj,
-                                        va_list ap, bool jni = false) __attribute__ ((noinline));
+                                        va_list ap, bool jni = true) __attribute__ ((noinline));
   
-  uint32 invokeIntStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = false)
+  uint32 invokeIntStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = true)
     __attribute__ ((noinline));
-  float invokeFloatStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = false)
+  float invokeFloatStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = true)
     __attribute__ ((noinline));
-  double invokeDoubleStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = false)
+  double invokeDoubleStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = true)
     __attribute__ ((noinline));
-  sint64 invokeLongStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = false)
+  sint64 invokeLongStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = true)
     __attribute__ ((noinline));
-  JavaObject* invokeJavaObjectStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = false)
+  JavaObject* invokeJavaObjectStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = true)
     __attribute__ ((noinline));
 
   /// This class of methods takes a buffer which contain the arguments of the

Modified: vmkit/trunk/lib/J3/VMCore/JavaMetaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaMetaJIT.cpp?rev=93122&r1=93121&r2=93122&view=diff

==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaMetaJIT.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaMetaJIT.cpp Sun Jan 10 13:52:23 2010
@@ -1,4 +1,4 @@
-//===---- JavaMetaJIT.cpp - Functions for Java internal objects -----------===//
+//===----- JavaMetaJIT.cpp - Caling Java methods from native code ---------===//
 //
 //                            The VMKit project
 //
@@ -51,33 +51,15 @@
         abort();\
       }\
     } else{\
-      if (jni) { \
-        JavaObject** obj = va_arg(ap, JavaObject**);\
-        if (obj) {\
-          buffer[i].l = reinterpret_cast<jobject>(*obj);\
-        } else {\
-          buffer[i].l = reinterpret_cast<jobject>(NULL);\
-        }\
-      } else { \
-        buffer[i].l = reinterpret_cast<jobject>(va_arg(ap, JavaObject**));\
-      } \
+      buffer[i].l = reinterpret_cast<jobject>(va_arg(ap, JavaObject**));\
     }\
   }\
 }
 
 //===----------------------------------------------------------------------===//
 // We do not need to have special care on the GC-pointers in the buffer
-// manipulated in these functions. Once the Java function is called, they
-// are never used (because the buffer is alloca'd and "this" is only used when
-// calling). TODO: Note that copying collectors will require to change
-// that strategy.
-//===----------------------------------------------------------------------===//
-
-//===----------------------------------------------------------------------===//
-// Also, virtual calls must not be used with stubs, because the thread manager
-// won't understand the frame layout of a CallBuf/CallAP calling
-// LLVM code (hence native code). Therefore, lookup the real JavaMethod,
-// compile it, and give it to the CallBuf/CallAP.
+// manipulated in these functions because the objects in the buffer are
+// addressed and never stored directly.
 //===----------------------------------------------------------------------===//
 
 #if defined(DWARF_EXCEPTIONS)

Modified: vmkit/trunk/lib/J3/VMCore/JavaObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaObject.cpp?rev=93122&r1=93121&r2=93122&view=diff

==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaObject.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaObject.cpp Sun Jan 10 13:52:23 2010
@@ -16,6 +16,8 @@
 #include "JavaUpcalls.h"
 #include "Jnjvm.h"
 
+#include <jni.h>
+
 using namespace j3;
 
 void JavaObject::waitIntern(struct timeval* info, bool timed) {
@@ -204,7 +206,7 @@
   assert(owner() && "Not owner after notifyAll");
 }
 
-void JavaObject::decapsulePrimitive(Jnjvm *vm, uintptr_t &buf,
+void JavaObject::decapsulePrimitive(Jnjvm *vm, jvalue* buf,
                                     const Typedef* signature) {
 
   JavaObject* obj = this;
@@ -214,8 +216,7 @@
     if (obj && !(obj->getClass()->isOfTypeName(signature->getName()))) {
       vm->illegalArgumentException("wrong type argument");
     }
-    ((JavaObject**)buf)[0] = obj;
-    buf += 8;
+    (*buf).l = reinterpret_cast<jobject>(obj);
     return;
   } else if (obj == 0) {
     vm->illegalArgumentException("");
@@ -230,118 +231,98 @@
     
     if (prim->isShort()) {
       if (value == vm->upcalls->OfShort) {
-        ((uint16*)buf)[0] = vm->upcalls->shortValue->getInt16Field(obj);
-        buf += 8;
+        (*buf).s = vm->upcalls->shortValue->getInt16Field(obj);
         return;
       } else if (value == vm->upcalls->OfByte) {
-        ((sint16*)buf)[0] = 
-          (sint16)vm->upcalls->byteValue->getInt8Field(obj);
-        buf += 8;
+        (*buf).s = (sint16)vm->upcalls->byteValue->getInt8Field(obj);
         return;
       } else {
         vm->illegalArgumentException("");
       }
     } else if (prim->isByte()) {
       if (value == vm->upcalls->OfByte) {
-        ((uint8*)buf)[0] = vm->upcalls->byteValue->getInt8Field(obj);
-        buf += 8;
+        (*buf).b = vm->upcalls->byteValue->getInt8Field(obj);
         return;
       } else {
         vm->illegalArgumentException("");
       }
     } else if (prim->isBool()) {
       if (value == vm->upcalls->OfBool) {
-        ((uint8*)buf)[0] = vm->upcalls->boolValue->getInt8Field(obj);
-        buf += 8;
+        (*buf).z = vm->upcalls->boolValue->getInt8Field(obj);
         return;
       } else {
         vm->illegalArgumentException("");
       }
     } else if (prim->isInt()) {
-      sint32 val = 0;
       if (value == vm->upcalls->OfInt) {
-        val = vm->upcalls->intValue->getInt32Field(obj);
+        (*buf).i = vm->upcalls->intValue->getInt32Field(obj);
       } else if (value == vm->upcalls->OfByte) {
-        val = (sint32)vm->upcalls->byteValue->getInt8Field(obj);
+        (*buf).i = (sint32)vm->upcalls->byteValue->getInt8Field(obj);
       } else if (value == vm->upcalls->OfChar) {
-        val = (uint32)vm->upcalls->charValue->getInt16Field(obj);
+        (*buf).i = (uint32)vm->upcalls->charValue->getInt16Field(obj);
       } else if (value == vm->upcalls->OfShort) {
-        val = (sint32)vm->upcalls->shortValue->getInt16Field(obj);
+        (*buf).i = (sint32)vm->upcalls->shortValue->getInt16Field(obj);
       } else {
         vm->illegalArgumentException("");
       }
-      ((sint32*)buf)[0] = val;
-      buf += 8;
       return;
     } else if (prim->isChar()) {
-      uint16 val = 0;
       if (value == vm->upcalls->OfChar) {
-        val = (uint16)vm->upcalls->charValue->getInt16Field(obj);
+        (*buf).c = (uint16)vm->upcalls->charValue->getInt16Field(obj);
       } else {
         vm->illegalArgumentException("");
       }
-      ((uint16*)buf)[0] = val;
-      buf += 8;
       return;
     } else if (prim->isFloat()) {
-      float val = 0;
       if (value == vm->upcalls->OfFloat) {
-        val = (float)vm->upcalls->floatValue->getFloatField(obj);
+        (*buf).f = (float)vm->upcalls->floatValue->getFloatField(obj);
       } else if (value == vm->upcalls->OfByte) {
-        val = (float)(sint32)vm->upcalls->byteValue->getInt8Field(obj);
+        (*buf).f = (float)(sint32)vm->upcalls->byteValue->getInt8Field(obj);
       } else if (value == vm->upcalls->OfChar) {
-        val = (float)(uint32)vm->upcalls->charValue->getInt16Field(obj);
+        (*buf).f = (float)(uint32)vm->upcalls->charValue->getInt16Field(obj);
       } else if (value == vm->upcalls->OfShort) {
-        val = (float)(sint32)vm->upcalls->shortValue->getInt16Field(obj);
+        (*buf).f = (float)(sint32)vm->upcalls->shortValue->getInt16Field(obj);
       } else if (value == vm->upcalls->OfInt) {
-        val = (float)(sint32)vm->upcalls->intValue->getInt32Field(obj);
+        (*buf).f = (float)(sint32)vm->upcalls->intValue->getInt32Field(obj);
       } else if (value == vm->upcalls->OfLong) {
-        val = (float)vm->upcalls->longValue->getLongField(obj);
+        (*buf).f = (float)vm->upcalls->longValue->getLongField(obj);
       } else {
         vm->illegalArgumentException("");
       }
-      ((float*)buf)[0] = val;
-      buf += 8;
       return;
     } else if (prim->isDouble()) {
-      double val = 0;
       if (value == vm->upcalls->OfDouble) {
-        val = (double)vm->upcalls->doubleValue->getDoubleField(obj);
+        (*buf).d = (double)vm->upcalls->doubleValue->getDoubleField(obj);
       } else if (value == vm->upcalls->OfFloat) {
-        val = (double)vm->upcalls->floatValue->getFloatField(obj);
+        (*buf).d = (double)vm->upcalls->floatValue->getFloatField(obj);
       } else if (value == vm->upcalls->OfByte) {
-        val = (double)(sint64)vm->upcalls->byteValue->getInt8Field(obj);
+        (*buf).d = (double)(sint64)vm->upcalls->byteValue->getInt8Field(obj);
       } else if (value == vm->upcalls->OfChar) {
-        val = (double)(uint64)vm->upcalls->charValue->getInt16Field(obj);
+        (*buf).d = (double)(uint64)vm->upcalls->charValue->getInt16Field(obj);
       } else if (value == vm->upcalls->OfShort) {
-        val = (double)(sint16)vm->upcalls->shortValue->getInt16Field(obj);
+        (*buf).d = (double)(sint16)vm->upcalls->shortValue->getInt16Field(obj);
       } else if (value == vm->upcalls->OfInt) {
-        val = (double)(sint32)vm->upcalls->intValue->getInt32Field(obj);
+        (*buf).d = (double)(sint32)vm->upcalls->intValue->getInt32Field(obj);
       } else if (value == vm->upcalls->OfLong) {
-        val = (double)(sint64)vm->upcalls->longValue->getLongField(obj);
+        (*buf).d = (double)(sint64)vm->upcalls->longValue->getLongField(obj);
       } else {
         vm->illegalArgumentException("");
       }
-      ((double*)buf)[0] = val;
-      buf += 8;
       return;
     } else if (prim->isLong()) {
-      sint64 val = 0;
       if (value == vm->upcalls->OfByte) {
-        val = (sint64)vm->upcalls->byteValue->getInt8Field(obj);
+        (*buf).j = (sint64)vm->upcalls->byteValue->getInt8Field(obj);
       } else if (value == vm->upcalls->OfChar) {
-        val = (sint64)(uint64)vm->upcalls->charValue->getInt16Field(obj);
+        (*buf).j = (sint64)(uint64)vm->upcalls->charValue->getInt16Field(obj);
       } else if (value == vm->upcalls->OfShort) {
-        val = (sint64)vm->upcalls->shortValue->getInt16Field(obj);
+        (*buf).j = (sint64)vm->upcalls->shortValue->getInt16Field(obj);
       } else if (value == vm->upcalls->OfInt) {
-        val = (sint64)vm->upcalls->intValue->getInt32Field(obj);
+        (*buf).j = (sint64)vm->upcalls->intValue->getInt32Field(obj);
       } else if (value == vm->upcalls->OfLong) {
-        val = (sint64)vm->upcalls->intValue->getLongField(obj);
+        (*buf).j = (sint64)vm->upcalls->intValue->getLongField(obj);
       } else {
         vm->illegalArgumentException("");
       }
-      ((sint64*)buf)[0] = val;
-      buf += 8;
       return;
     }
   }

Modified: vmkit/trunk/lib/J3/VMCore/JavaObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaObject.h?rev=93122&r1=93121&r2=93122&view=diff

==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaObject.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaObject.h Sun Jan 10 13:52:23 2010
@@ -21,6 +21,8 @@
 #include "JavaLocks.h"
 #include "JnjvmConfig.h"
 
+union jvalue;
+
 namespace j3 {
 
 class JavaObject;
@@ -280,7 +282,7 @@
   /// decapsulePrimitive - Based on the signature argument, decapsule
   /// obj as a primitive and put it in the buffer.
   ///
-  void decapsulePrimitive(Jnjvm* vm, uintptr_t &buf, const Typedef* signature);
+  void decapsulePrimitive(Jnjvm* vm, jvalue* buf, const Typedef* signature);
 
 };
 

Modified: vmkit/trunk/lib/J3/VMCore/Jni.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Jni.cpp?rev=93122&r1=93121&r2=93122&view=diff

==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Jni.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/Jni.cpp Sun Jan 10 13:52:23 2010
@@ -151,8 +151,10 @@
   // Local object references.
   JavaObject* Cl = *(JavaObject**)_Cl;
   JavaObject* res = 0;
+  JavaString* str = 0;
   llvm_gcroot(Cl, 0);
   llvm_gcroot(res, 0);
+  llvm_gcroot(str, 0);
   
   Jnjvm* vm = JavaThread::get()->getJVM();
   
@@ -165,7 +167,8 @@
   JavaMethod* init = realCl->lookupMethod(vm->bootstrapLoader->initName,
                                           vm->bootstrapLoader->initExceptionSig,
                                           false, true, 0);
-  init->invokeIntSpecial(vm, realCl, res, vm->asciizToStr(msg));
+  str = vm->asciizToStr(msg);
+  init->invokeIntSpecial(vm, realCl, res, &str);
   th->pendingException = res;
   
   th->throwFromJNI(SP);
@@ -324,47 +327,6 @@
   return 0;
 }
 
-#define BufToBuf(_args, _buf, signature) \
-  Typedef* const* arguments = signature->getArgumentsType(); \
-  uintptr_t __buf = (uintptr_t)_buf; \
-  uintptr_t __args = (uintptr_t)_args;\
-  for (uint32 i = 0; i < signature->nbArguments; ++i) { \
-    const Typedef* type = arguments[i];\
-    if (type->isPrimitive()) {\
-      const PrimitiveTypedef* prim = (PrimitiveTypedef*)type;\
-      if (prim->isLong()) {\
-        ((sint64*)__buf)[0] = ((sint64*)__args)[0];\
-      } else if (prim->isInt()){ \
-        ((sint32*)__buf)[0] = ((sint32*)__args)[0];\
-      } else if (prim->isChar()) { \
-        ((uint32*)__buf)[0] = ((uint32*)__args)[0];\
-      } else if (prim->isShort()) { \
-        ((uint32*)__buf)[0] = ((uint32*)__args)[0];\
-      } else if (prim->isByte()) { \
-        ((uint32*)__buf)[0] = ((uint32*)__args)[0];\
-      } else if (prim->isBool()) { \
-        ((uint32*)__buf)[0] = ((uint32*)__args)[0];\
-      } else if (prim->isFloat()) {\
-        ((float*)__buf)[0] = ((float*)__args)[0];\
-      } else if (prim->isDouble()) {\
-        ((double*)__buf)[0] = ((double*)__args)[0];\
-      } else {\
-        fprintf(stderr, "Can't happen");\
-        abort();\
-      }\
-    } else{\
-      JavaObject** obj = ((JavaObject***)__args)[0];\
-      if (obj) {\
-        ((JavaObject**)__buf)[0] = *obj;\
-      } else {\
-        ((JavaObject**)__buf)[0] = 0;\
-      }\
-    }\
-    __buf += 8; \
-    __args += 8; \
-  }\
-
-
 jobject NewObjectA(JNIEnv* env, jclass _clazz, jmethodID methodID,
                    const jvalue *args) {
   
@@ -379,17 +341,12 @@
   JavaThread* th = JavaThread::get();
   Jnjvm* vm = th->getJVM();
   JavaMethod* meth = (JavaMethod*)methodID;
-
-  Signdef* sign = meth->getSignature();
-  uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64));
-  BufToBuf(args, buf, sign);
-
   UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz, true);
   
   // Store local reference
   res = cl->asClass()->doNew(vm);
 
-  meth->invokeIntSpecialBuf(vm, cl->asClass(), res, (void*)buf);
+  meth->invokeIntSpecialBuf(vm, cl->asClass(), res, (void*)args);
 
   jobject ret = (jobject)th->pushJNIRef(res);
   RETURN_FROM_JNI(ret);
@@ -996,11 +953,7 @@
   Jnjvm* vm = JavaThread::get()->getJVM();
   UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->getClass());
   
-  Signdef* sign = meth->getSignature();
-  uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64));
-  BufToBuf(args, buf, sign);
-  
-  meth->invokeIntVirtualBuf(vm, cl, obj, (void*)buf);
+  meth->invokeIntVirtualBuf(vm, cl, obj, (void*)args);
 
   RETURN_VOID_FROM_JNI;
 
@@ -3760,7 +3713,7 @@
   myvm->upcalls->dataPointer64->setLongField(p, (jlong)address);
 #endif
 
-  myvm->upcalls->InitDirectByteBuffer->invokeIntSpecial(myvm, BB, res, 0, p,
+  myvm->upcalls->InitDirectByteBuffer->invokeIntSpecial(myvm, BB, res, 0, &p,
                                                         (uint32)capacity,
                                                         (uint32)capacity, 0);
 

Modified: vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp?rev=93122&r1=93121&r2=93122&view=diff

==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp Sun Jan 10 13:52:23 2010
@@ -234,7 +234,7 @@
         abort();
       }
       JavaMethod* init = upcalls->ErrorWithExcpExceptionInInitializerError;
-      init->invokeIntSpecial(vm, clExcp, obj, exc);
+      init->invokeIntSpecial(vm, clExcp, obj, &exc);
       exc = obj;
     } 
 
@@ -254,15 +254,19 @@
                           const JavaObject* excp) {
   JavaObject* obj = cl->doNew(this);
   llvm_gcroot(obj, 0);
-  init->invokeIntSpecial(this, cl, obj, excp);
+  init->invokeIntSpecial(this, cl, obj, &excp);
   JavaThread::get()->throwException(obj);
 }
 
 JavaObject* Jnjvm::CreateError(UserClass* cl, JavaMethod* init,
-                               const char* str) {
+                               const char* asciiz) {
   JavaObject* obj = cl->doNew(this);
+  JavaString* str = 0;
   llvm_gcroot(obj, 0);
-  init->invokeIntSpecial(this, cl, obj, str ? asciizToStr(str) : 0);
+  llvm_gcroot(str, 0);
+  if (asciiz) str = asciizToStr(asciiz);
+
+  init->invokeIntSpecial(this, cl, obj, &str);
   return obj;
 }
 
@@ -272,7 +276,7 @@
   llvm_gcroot(str, 0);
   llvm_gcroot(obj, 0);
   obj = cl->doNew(this);
-  init->invokeIntSpecial(this, cl, obj, str);
+  init->invokeIntSpecial(this, cl, obj, &str);
   return obj;
 }
 
@@ -1134,7 +1138,7 @@
   if (!IsolateID)
 #endif
   upcalls->setContextClassLoader->invokeIntSpecial(this, upcalls->newThread,
-                                                   obj, javaLoader);
+                                                   obj, &javaLoader);
   // load and initialise math since it is responsible for dlopen'ing 
   // libjavalang.so and we are optimizing some math operations
   UserCommonClass* math = 
@@ -1170,7 +1174,7 @@
     const UTF8* funcName = appClassLoader->asciizConstructUTF8("main");
     JavaMethod* method = cl->lookupMethod(funcName, funcSign, true, true, 0);
   
-    method->invokeIntStatic(this, method->classDef, args);
+    method->invokeIntStatic(this, method->classDef, &args);
   }catch(...) {
   }
 
@@ -1182,7 +1186,7 @@
     group = upcalls->group->getObjectField(obj);
     try{
       upcalls->uncaughtException->invokeIntSpecial(this, upcalls->threadGroup,
-                                                   group, obj, exc);
+                                                   group, &obj, &exc);
     }catch(...) {
       fprintf(stderr, "Exception in thread \"main\": "
                       "Can not print stack trace.\n");
@@ -1203,7 +1207,7 @@
     const UTF8* funcName = appClassLoader->asciizConstructUTF8("premain");
     JavaMethod* method = cl->lookupMethod(funcName, funcSign, true, true, 0);
   
-    method->invokeIntStatic(this, method->classDef, args, instrumenter);
+    method->invokeIntStatic(this, method->classDef, &args, &instrumenter);
   } catch(...) {
     JavaThread::get()->clearException();
   }

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

==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp Sun Jan 10 13:52:23 2010
@@ -413,7 +413,7 @@
       strName = JavaString::internalToJava(name, isolate);
     }
     obj = upcalls->loadInClassLoader->invokeJavaObjectVirtual(isolate, forCtp,
-                                              javaLoader, strName, doResolve);
+                                              javaLoader, &strName, doResolve);
     cl = (UserCommonClass*)((JavaObjectClass*)obj)->getClass();
   }
   

Modified: vmkit/trunk/tools/j3/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/j3/Makefile?rev=93122&r1=93121&r2=93122&view=diff

==============================================================================
--- vmkit/trunk/tools/j3/Makefile (original)
+++ vmkit/trunk/tools/j3/Makefile Sun Jan 10 13:52:23 2010
@@ -36,6 +36,7 @@
 
 endif
 
+CXX.Flags += $(CLASSPATH_FLAGS)
 
 LINK_COMPONENTS = jit nativecodegen scalaropts instrumentation ipa ipo bitreader asmparser linker
 





More information about the vmkit-commits mailing list