[vmkit-commits] [vmkit] r199613 - Add the multianewarray (the runtime function is not implemented). Able to translate mmtk into llvm.
Gael Thomas
gael.thomas at lip6.fr
Sun Jan 19 13:26:45 PST 2014
Author: gthomas
Date: Sun Jan 19 15:26:44 2014
New Revision: 199613
URL: http://llvm.org/viewvc/llvm-project?rev=199613&view=rev
Log:
Add the multianewarray (the runtime function is not implemented). Able to translate mmtk into llvm.
Modified:
vmkit/branches/mcjit/include/j3/j3codegen.h
vmkit/branches/mcjit/include/j3/j3meta.def
vmkit/branches/mcjit/include/j3/j3object.h
vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
vmkit/branches/mcjit/lib/j3/vm/j3object.cc
Modified: vmkit/branches/mcjit/include/j3/j3codegen.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199613&r1=199612&r2=199613&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3codegen.h (original)
+++ vmkit/branches/mcjit/include/j3/j3codegen.h Sun Jan 19 15:26:44 2014
@@ -142,6 +142,7 @@ namespace j3 {
void arrayStore(J3Type* cType);
void arrayLoad(J3Type* cType);
+ void multianewArray();
void newArray(uint8_t atype);
void newArray(J3ArrayClass* type);
void newObject(J3Class* cl);
Modified: vmkit/branches/mcjit/include/j3/j3meta.def
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=199613&r1=199612&r2=199613&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3meta.def (original)
+++ vmkit/branches/mcjit/include/j3/j3meta.def Sun Jan 19 15:26:44 2014
@@ -1,30 +1,31 @@
-_x(funcJ3MethodIndex, "j3::J3Method::index()")
-_x(funcJ3TypeVT, "j3::J3Type::vt()")
-_x(funcJ3TypeVTAndResolve, "j3::J3Type::vtAndResolve()")
-_x(funcJ3TypeInitialise, "j3::J3Type::initialise()")
-_x(funcJ3LayoutStructSize, "j3::J3Layout::structSize()")
-_x(funcJ3ClassStaticInstance, "j3::J3Class::staticInstance()")
-_x(funcJ3ClassStringAt, "j3::J3Class::stringAt(unsigned short, bool)")
-_x(funcJ3TypeJavaClass, "j3::J3Type::javaClass(bool, j3::J3ObjectHandle*)")
-_x(funcJniEnv, "j3::J3::jniEnv()")
-_x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)")
-_x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*)")
-_x(funcJ3ObjectMonitorExit, "j3::J3Object::monitorExit(j3::J3Object*)")
-_x(funcThrowException, "vmkit::VMKit::throwException(void*)")
-_x(funcReplayException, "j3::J3Thread::replayException()")
-_x(funcClassCastException, "j3::J3::classCastException()")
-_x(funcNullPointerException, "j3::J3::nullPointerException()")
-_x(funcJ3ThreadPushHandle, "j3::J3Thread::push(j3::J3ObjectHandle*)")
-_x(funcJ3ThreadPush, "j3::J3Thread::push(j3::J3Object*)")
-_x(funcJ3ThreadTell, "j3::J3Thread::tell()")
-_x(funcJ3ThreadRestore, "j3::J3Thread::restore(j3::J3ObjectHandle*)")
-_x(funcEchoDebugEnter, "j3::J3CodeGen::echoDebugEnter(unsigned int, char const*, ...)")
-_x(funcEchoDebugExecute, "j3::J3CodeGen::echoDebugExecute(unsigned int, char const*, ...)")
-_x(funcEchoElement, "j3::J3CodeGen::echoElement(unsigned int, unsigned int, unsigned long)")
-_x(funcIsAssignableTo, "j3::J3VirtualTable::isAssignableTo(j3::J3VirtualTable*)")
+_x(funcJ3MethodIndex, "j3::J3Method::index()")
+_x(funcJ3TypeVT, "j3::J3Type::vt()")
+_x(funcJ3TypeVTAndResolve, "j3::J3Type::vtAndResolve()")
+_x(funcJ3TypeInitialise, "j3::J3Type::initialise()")
+_x(funcJ3LayoutStructSize, "j3::J3Layout::structSize()")
+_x(funcJ3ClassStaticInstance, "j3::J3Class::staticInstance()")
+_x(funcJ3ClassStringAt, "j3::J3Class::stringAt(unsigned short, bool)")
+_x(funcJ3TypeJavaClass, "j3::J3Type::javaClass(bool, j3::J3ObjectHandle*)")
+_x(funcJniEnv, "j3::J3::jniEnv()")
+_x(funcJ3ArrayClassMultianewArray, "j3::J3Object::multianewArray(j3::J3ArrayClass*, unsigned int, unsigned int*)")
+_x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)")
+_x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*)")
+_x(funcJ3ObjectMonitorExit, "j3::J3Object::monitorExit(j3::J3Object*)")
+_x(funcThrowException, "vmkit::VMKit::throwException(void*)")
+_x(funcReplayException, "j3::J3Thread::replayException()")
+_x(funcClassCastException, "j3::J3::classCastException()")
+_x(funcNullPointerException, "j3::J3::nullPointerException()")
+_x(funcJ3ThreadPushHandle, "j3::J3Thread::push(j3::J3ObjectHandle*)")
+_x(funcJ3ThreadPush, "j3::J3Thread::push(j3::J3Object*)")
+_x(funcJ3ThreadTell, "j3::J3Thread::tell()")
+_x(funcJ3ThreadRestore, "j3::J3Thread::restore(j3::J3ObjectHandle*)")
+_x(funcEchoDebugEnter, "j3::J3CodeGen::echoDebugEnter(unsigned int, char const*, ...)")
+_x(funcEchoDebugExecute, "j3::J3CodeGen::echoDebugExecute(unsigned int, char const*, ...)")
+_x(funcEchoElement, "j3::J3CodeGen::echoElement(unsigned int, unsigned int, unsigned long)")
+_x(funcIsAssignableTo, "j3::J3VirtualTable::isAssignableTo(j3::J3VirtualTable*)")
_x(funcFastIsAssignableToPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToPrimaryChecker(j3::J3VirtualTable*, unsigned int)")
_x(funcFastIsAssignableToNonPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToNonPrimaryChecker(j3::J3VirtualTable*)")
-_x(funcGXXPersonality, "__gxx_personality_v0")
-_x(funcCXABeginCatch, "__cxa_begin_catch")
-_x(funcCXAEndCatch, "__cxa_end_catch")
-_x(funcFake, "j3::J3::forceSymbolDefinition()")
+_x(funcGXXPersonality, "__gxx_personality_v0")
+_x(funcCXABeginCatch, "__cxa_begin_catch")
+_x(funcCXAEndCatch, "__cxa_end_catch")
+_x(funcFake, "j3::J3::forceSymbolDefinition()")
Modified: vmkit/branches/mcjit/include/j3/j3object.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=199613&r1=199612&r2=199613&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3object.h (original)
+++ vmkit/branches/mcjit/include/j3/j3object.h Sun Jan 19 15:26:44 2014
@@ -116,6 +116,7 @@ namespace j3 {
static void monitorEnter(J3Object* obj);
static void monitorExit(J3Object* obj);
+ static J3Object* multianewArray(J3ArrayClass* cl, uint32_t dim, uint32_t* args);
static J3Object* allocate(J3VirtualTable* vt, uintptr_t n);
static J3Object* doNewNoInit(J3Class* cl);
static J3Object* doNew(J3Class* cl);
Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=199613&r1=199612&r2=199613&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sun Jan 19 15:26:44 2014
@@ -568,6 +568,21 @@ void J3CodeGen::newArray(uint8_t atype)
newArray(prim->getArray());
}
+void J3CodeGen::multianewArray() {
+ J3ObjectType* base = cl->classAt(codeReader->readU2());
+ uint32_t dim = codeReader->readU1();
+
+ llvm::Value* values = builder->CreateAlloca(builder->getInt32Ty(), builder->getInt32(dim));
+
+ for(uint32_t i=0; i<dim; i++)
+ builder->CreateStore(stack.pop(), builder->CreateGEP(values, builder->getInt32(dim-i-1)));
+
+ stack.push(builder->CreateCall3(funcJ3ArrayClassMultianewArray,
+ typeDescriptor(base, vm->typeJ3ArrayClassPtr),
+ builder->getInt32(dim),
+ values));
+}
+
void J3CodeGen::newObject(J3Class* cl) {
initialiseJ3ObjectType(cl);
@@ -1576,7 +1591,10 @@ void J3CodeGen::translate() {
isWide = 1;
break;
- case J3Cst::BC_multianewarray: nyi(); /* 0xc5 */
+ case J3Cst::BC_multianewarray: /* 0xc5 */
+ multianewArray();
+ break;
+
case J3Cst::BC_ifnull: /* 0xc6 */
condBr(builder->CreateIsNull(stack.pop()));
break;
Modified: vmkit/branches/mcjit/lib/j3/vm/j3object.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3object.cc?rev=199613&r1=199612&r2=199613&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Sun Jan 19 15:26:44 2014
@@ -291,6 +291,10 @@ J3Object* J3Object::doNew(J3Class* cl) {
return doNewNoInit(cl);
}
+J3Object* J3Object::multianewArray(J3ArrayClass* array, uint32_t dim, uint32_t* args) {
+ J3::internalError("implement me: multianewarray");
+}
+
void J3Object::monitorEnter(J3Object* obj) {
J3::internalError("implement me: monitorenter");
}
More information about the vmkit-commits
mailing list