[vmkit-commits] [vmkit] r198574 - The type of a local can change in a function. Add thus a type parameter in locals.at to know from which local bucket we have to rerieve the local.

Gael Thomas gael.thomas at lip6.fr
Sun Jan 5 14:51:57 PST 2014


Author: gthomas
Date: Sun Jan  5 16:51:56 2014
New Revision: 198574

URL: http://llvm.org/viewvc/llvm-project?rev=198574&view=rev
Log:
The type of a local can change in a function. Add thus a type parameter in locals.at to know from which local bucket we have to rerieve the local.

Modified:
    vmkit/branches/mcjit/include/j3/j3codegenvar.h
    vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
    vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc

Modified: vmkit/branches/mcjit/include/j3/j3codegenvar.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegenvar.h?rev=198574&r1=198573&r2=198574&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3codegenvar.h (original)
+++ vmkit/branches/mcjit/include/j3/j3codegenvar.h Sun Jan  5 16:51:56 2014
@@ -34,7 +34,7 @@ namespace j3 {
 
 		uint32_t            metaStackSize();
 
-		llvm::Value*        at(uint32_t idx);
+		llvm::Value*        at(uint32_t idx, llvm::Type* t);
 		void                setAt(llvm::Value* value, uint32_t idx);
 		void                drop(uint32_t n);
 		llvm::Value*        top(uint32_t idx=0);

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=198574&r1=198573&r2=198574&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sun Jan  5 16:51:56 2014
@@ -770,7 +770,7 @@ llvm::BasicBlock* J3CodeGen::forwardBran
 		llvm::BasicBlock* res = newBB(id);
 
 		if(doAlloc) {
-			opInfos[pc].metaStack = (llvm::Type**)allocator->allocate(sizeof(llvm::Type**)*stack.topStack);
+			opInfos[pc].metaStack = (llvm::Type**)allocator->allocate(sizeof(llvm::Type*)*stack.topStack);
 			memcpy(opInfos[pc].metaStack, stack.metaStack, sizeof(llvm::Type*)*stack.topStack);
 		}
 
@@ -946,7 +946,7 @@ void J3CodeGen::translate() {
 															 builder->getInt32(4),
 															 buildString("           stack[%d]: %p\n"),
 															 builder->getInt32(i),
-															 stack.at(i));
+															 stack.at(i, stack.metaStack[i]));
 			}
 
 			char buf[256];
@@ -1010,46 +1010,58 @@ void J3CodeGen::translate() {
 				break;
 
 			case J3Cst::BC_iload:                         /* 0x15 wide */
+				stack.push(locals.at(wideReadU1(), vm->typeInteger->llvmType()));
+				break;
+
 			case J3Cst::BC_lload:                         /* 0x16 wide */
+				stack.push(locals.at(wideReadU1(), vm->typeLong->llvmType()));
+				break;
+
 			case J3Cst::BC_fload:                         /* 0x17 wide */
+				stack.push(locals.at(wideReadU1(), vm->typeFloat->llvmType()));
+				break;
+
 			case J3Cst::BC_dload:                         /* 0x18 wide */
+				stack.push(locals.at(wideReadU1(), vm->typeDouble->llvmType()));
+				break;
+
 			case J3Cst::BC_aload:                         /* 0x19 wide */				
-				stack.push(locals.at(wideReadU1()));
+				stack.push(locals.at(wideReadU1(), vm->objectClass->llvmType()));
 				break;
 
 			case J3Cst::BC_iload_0:                       /* 0x1a */
 			case J3Cst::BC_iload_1:                       /* 0x1b */
 			case J3Cst::BC_iload_2:                       /* 0x1c */
 			case J3Cst::BC_iload_3:                       /* 0x1d */
-				stack.push(locals.at(bc - J3Cst::BC_iload_0));
+				stack.push(locals.at(bc - J3Cst::BC_iload_0, vm->typeInteger->llvmType()));
 				break;
 
 			case J3Cst::BC_lload_0:                       /* 0x1e */
 			case J3Cst::BC_lload_1:                       /* 0x1f */
 			case J3Cst::BC_lload_2:                       /* 0x20 */
 			case J3Cst::BC_lload_3:                       /* 0x21 */
-				stack.push(locals.at(bc - J3Cst::BC_lload_0));
+				stack.push(locals.at(bc - J3Cst::BC_lload_0, vm->typeLong->llvmType()));
 				break;
 
 			case J3Cst::BC_fload_0:                       /* 0x22 */
 			case J3Cst::BC_fload_1:                       /* 0x23 */
 			case J3Cst::BC_fload_2:                       /* 0x24 */
 			case J3Cst::BC_fload_3:                       /* 0x25 */
-				stack.push(locals.at(bc - J3Cst::BC_fload_0));
+				stack.push(locals.at(bc - J3Cst::BC_fload_0, vm->typeFloat->llvmType()));
 				break;
 
 			case J3Cst::BC_dload_0:                       /* 0x26 */
 			case J3Cst::BC_dload_1:                       /* 0x27 */
 			case J3Cst::BC_dload_2:                       /* 0x28 */
 			case J3Cst::BC_dload_3:                       /* 0x29 */
-				stack.push(locals.at(bc - J3Cst::BC_dload_0));
+				stack.push(locals.at(bc - J3Cst::BC_dload_0, vm->typeDouble->llvmType()));
 				break;
 
 			case J3Cst::BC_aload_0:                       /* 0x2a */
 			case J3Cst::BC_aload_1:                       /* 0x2b */
 			case J3Cst::BC_aload_2:                       /* 0x2c */
 			case J3Cst::BC_aload_3:                       /* 0x2d */
-				stack.push(locals.at(bc - J3Cst::BC_aload_0));
+				stack.push(locals.at(bc - J3Cst::BC_aload_0, vm->objectClass->llvmType()));
 				break;
 
 			case J3Cst::BC_iaload:                        /* 0x2e */
@@ -1295,7 +1307,7 @@ void J3CodeGen::translate() {
 			case J3Cst::BC_iinc:                          /* 0x84 wide */
 				{ uint32_t idx = wideReadU1(); 
 					int32_t  val = wideReadS1(); 
-					locals.setAt(builder->CreateAdd(locals.at(idx), builder->getInt32(val)), idx);
+					locals.setAt(builder->CreateAdd(locals.at(idx, vm->typeInteger->llvmType()), builder->getInt32(val)), idx);
 				} break;
 
 			case J3Cst::BC_i2l:                           /* 0x85 */
@@ -1658,7 +1670,7 @@ void J3CodeGen::generateJava() {
 													 builder->getInt32(2),
 													 buildString("            arg[%d]: %p\n"),
 													 builder->getInt32(pos),
-													 locals.at(pos));
+													 locals.at(pos, cur->getType()));
 		
 		pos += (cur->getType() == vm->typeLong->llvmType() || cur->getType() == vm->typeDouble->llvmType()) ? 2 : 1;
 	}
@@ -1685,10 +1697,8 @@ void J3CodeGen::generateJava() {
 
 	if(llvmFunction->getReturnType()->isVoidTy())
 		builder->CreateRetVoid();
-	else {
-		ret.metaStack[0] = llvmFunction->getReturnType();
-		builder->CreateRet(unflatten(ret.at(0), ret.metaStack[0]));
-	}
+	else
+		builder->CreateRet(unflatten(ret.at(0, llvmFunction->getReturnType()), llvmFunction->getReturnType()));
 
 	if(J3Cst::isSynchronized(method->access())) {
 		static bool echoDone = 0;

Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc?rev=198574&r1=198573&r2=198574&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc Sun Jan  5 16:51:56 2014
@@ -101,12 +101,10 @@ llvm::AllocaInst** J3CodeGenVar::stackOf
 
 void J3CodeGenVar::setAt(llvm::Value* value, uint32_t idx) {
 	llvm::Type*   t = value->getType();
-	metaStack[idx] = t;
 	codeGen->builder->CreateStore(value, stackOf(t)[idx]);
 }
 
-llvm::Value* J3CodeGenVar::at(uint32_t idx) {
-	llvm::Type* t = metaStack[idx];
+llvm::Value* J3CodeGenVar::at(uint32_t idx, llvm::Type* t) {
 	return codeGen->builder->CreateLoad(stackOf(t)[idx]);
 }
 
@@ -117,20 +115,23 @@ void J3CodeGenVar::push(llvm::Value* val
 	if(topStack >= maxStack)
 		J3::classFormatError(codeGen->cl, "too many push in... ");
 
-	setAt(value, topStack++);
+	metaStack[topStack] = value->getType();
+	setAt(value, topStack);
+	topStack++;
 }
 
 llvm::Value* J3CodeGenVar::pop() {
 	if(!topStack)
 		J3::classFormatError(codeGen->cl, "too many pop in... ");
 
-	llvm::Value* res = at(--topStack);
-	return res;
+	--topStack;
+	return at(topStack, metaStack[topStack]);
 }
 
 llvm::Value* J3CodeGenVar::top(uint32_t idx) {
 	if(topStack <= idx)
 		J3::classFormatError(codeGen->cl, "too large top in... ");
-	
-	return at(topStack - idx - 1);
+
+	uint32_t n = topStack - idx - 1;
+	return at(n, metaStack[n]);
 }





More information about the vmkit-commits mailing list