[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