[vmkit-commits] [vmkit] r199691 - Remove simple call backs to the runtime from mmtk.

Gael Thomas gael.thomas at lip6.fr
Mon Jan 20 14:11:54 PST 2014


Author: gthomas
Date: Mon Jan 20 16:11:53 2014
New Revision: 199691

URL: http://llvm.org/viewvc/llvm-project?rev=199691&view=rev
Log:
Remove simple call backs to the runtime from mmtk.

Modified:
    vmkit/branches/mcjit/include/j3/j3codegen.h
    vmkit/branches/mcjit/include/j3/j3meta.def
    vmkit/branches/mcjit/lib/j3/vm/j3.cc
    vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
    vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc
    vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc

Modified: vmkit/branches/mcjit/include/j3/j3codegen.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199691&r1=199690&r2=199691&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3codegen.h (original)
+++ vmkit/branches/mcjit/include/j3/j3codegen.h Mon Jan 20 16:11:53 2014
@@ -42,7 +42,9 @@ namespace j3 {
 			WithCaller = 2,
 			OnlyTranslate = 4,
 			NotUseStub = 8,
-			NotNeedGC = 16
+			NotNeedGC = 16,
+			SupposeClinited = 32,
+			NoRuntimeCheck = 64
 		};
 
 		bool withMethod() { return mode & WithMethod; }
@@ -50,6 +52,8 @@ namespace j3 {
 		bool onlyTranslate() { return mode & OnlyTranslate; }
 		bool useStub() { return !(mode & NotUseStub); }
 		bool needGC() { return !(mode & NotNeedGC); }
+		bool supposeClinited() { return mode & SupposeClinited; }
+		bool noRuntimeCheck() { return mode & NoRuntimeCheck; }
 
 	private:
 		friend class J3CodeGenVar;

Modified: vmkit/branches/mcjit/include/j3/j3meta.def
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=199691&r1=199690&r2=199691&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3meta.def (original)
+++ vmkit/branches/mcjit/include/j3/j3meta.def Mon Jan 20 16:11:53 2014
@@ -1,8 +1,6 @@
-_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*)")

Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3.cc?rev=199691&r1=199690&r2=199691&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Mon Jan 20 16:11:53 2014
@@ -194,7 +194,11 @@ void J3::compileApplication() {
 																																		names()->get("()Ljava/lang/ClassLoader;"))->invokeStatic().valObject);
 
 
-	loader->setCompilationMode(J3CodeGen::OnlyTranslate | J3CodeGen::NotUseStub | J3CodeGen::NotNeedGC);
+	loader->setCompilationMode(J3CodeGen::OnlyTranslate | 
+														 J3CodeGen::NotUseStub | 
+														 J3CodeGen::NotNeedGC |
+														 J3CodeGen::SupposeClinited |
+														 J3CodeGen::NoRuntimeCheck);
 
 	if(options()->mainClass)
 		J3::internalError("compiling a single class is not yet supported");

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=199691&r1=199690&r2=199691&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Mon Jan 20 16:11:53 2014
@@ -326,7 +326,7 @@ void J3CodeGen::monitorExit(llvm::Value*
 }
 
 void J3CodeGen::initialiseJ3ObjectType(J3ObjectType* cl) {
-	if(!cl->isInitialised())
+	if(!supposeClinited() && !cl->isInitialised())
 		builder.CreateCall(funcJ3TypeInitialise, typeDescriptor(cl, vm->typeJ3TypePtr));
 }
 
@@ -358,12 +358,12 @@ llvm::Value* J3CodeGen::vt(llvm::Value*
 }
 
 llvm::Value* J3CodeGen::vt(J3ObjectType* type, bool doResolve) {
-	llvm::Value* func = doResolve && !type->isResolved() ? funcJ3TypeVTAndResolve : funcJ3TypeVT;
+	llvm::Value* func = !supposeClinited() && doResolve && !type->isResolved() ? funcJ3TypeVTAndResolve : funcJ3TypeVT;
 	return builder.CreateCall(func, typeDescriptor(type, vm->typeJ3TypePtr));
 }
 
 llvm::Value* J3CodeGen::nullCheck(llvm::Value* obj) {
-	if(exceptions.nodes[curExceptionNode]->landingPad) {
+	if(!noRuntimeCheck() && exceptions.nodes[curExceptionNode]->landingPad) {
 		llvm::BasicBlock* succeed = newBB("nullcheck-succeed");
 
 		if(!bbNullCheckFailed) {
@@ -431,17 +431,22 @@ void J3CodeGen::invokeInterface(uint32_t
 
 void J3CodeGen::invokeVirtual(uint32_t idx) {
 	J3Method*     target = cl->methodAt(idx, 0);
-	J3Signature* type = target->signature();
-	llvm::Value*  funcEntry = funcEntry = builder.getInt32(target->index());
 
-	llvm::Value*  obj = nullCheck(stack.top(type->nbIns()));
-	llvm::Value*  gepFunc[] = { builder.getInt32(0),
-															builder.getInt32(J3VirtualTable::gepVirtualMethods),
-															funcEntry };
-	llvm::Value* func = builder.CreateBitCast(builder.CreateLoad(builder.CreateGEP(vt(obj), gepFunc)), 
-																						 target->signature()->functionType(target->access())->getPointerTo());
+	if(J3Cst::isFinal(target->cl()->access()) || J3Cst::isFinal(target->cl()->access()))
+		invoke(0, target, buildFunction(target)); /* do not remove this optimization */
+	else {
+		J3Signature*  type = target->signature();
+		llvm::Value*  funcEntry = funcEntry = builder.getInt32(target->index());
+
+		llvm::Value*  obj = nullCheck(stack.top(type->nbIns()));
+		llvm::Value*  gepFunc[] = { builder.getInt32(0),
+																builder.getInt32(J3VirtualTable::gepVirtualMethods),
+																funcEntry };
+		llvm::Value* func = builder.CreateBitCast(builder.CreateLoad(builder.CreateGEP(vt(obj), gepFunc)), 
+																							target->signature()->functionType(target->access())->getPointerTo());
 
-	invoke(0, target, func);
+		invoke(0, target, func);
+	}
 }
 
 void J3CodeGen::invokeStatic(uint32_t idx) {
@@ -493,6 +498,9 @@ void J3CodeGen::putField(uint32_t idx) {
 }
 
 void J3CodeGen::arrayBoundCheck(llvm::Value* obj, llvm::Value* idx) {
+	if(!noRuntimeCheck()) {
+		/* implement me */
+	}
 }
 
 llvm::Value* J3CodeGen::arrayContent(J3Type* cType, llvm::Value* array, llvm::Value* idx) {
@@ -581,11 +589,8 @@ void J3CodeGen::newObject(J3Class* cl) {
 
 	llvm::Value* size;
 
-	if(!cl->isResolved()) {
-		size = builder.CreateCall(funcJ3LayoutStructSize, typeDescriptor(cl, vm->typeJ3LayoutPtr));
-	} else {
-		size = builder.getInt64(cl->structSize());
-	}
+	cl->resolve();
+	size = builder.getInt64(cl->structSize());
 
 	llvm::Value* res = builder.CreateCall2(funcJ3ObjectAllocate, vt(cl), size);
 
@@ -627,23 +632,25 @@ void J3CodeGen::instanceof(llvm::Value*
 }
 
 void J3CodeGen::checkCast(llvm::Value* obj, J3ObjectType* type) {
-	llvm::BasicBlock* succeed = forwardBranch("checkcast-succeed", codeReader->tell(), 0, 0);
-	llvm::BasicBlock* test = newBB("checkcast");
-
-	builder.CreateCondBr(builder.CreateIsNull(obj), succeed, test);
-
-	if(!bbCheckCastFailed) {
-		bbCheckCastFailed = newBB("checkcast-failed");
-		builder.SetInsertPoint(bbCheckCastFailed);
-		builder.CreateCall(funcClassCastException);
-		builder.CreateBr(bbRet);
-	}
+	if(!noRuntimeCheck()) {
+		llvm::BasicBlock* succeed = forwardBranch("checkcast-succeed", codeReader->tell(), 0, 0);
+		llvm::BasicBlock* test = newBB("checkcast");
+
+		builder.CreateCondBr(builder.CreateIsNull(obj), succeed, test);
+
+		if(!bbCheckCastFailed) {
+			bbCheckCastFailed = newBB("checkcast-failed");
+			builder.SetInsertPoint(bbCheckCastFailed);
+			builder.CreateCall(funcClassCastException);
+			builder.CreateBr(bbRet);
+		}
 
-	builder.SetInsertPoint(test);
+		builder.SetInsertPoint(test);
 
-	llvm::Value* res = isAssignableTo(obj, type);
+		llvm::Value* res = isAssignableTo(obj, type);
 
-	builder.CreateCondBr(res, succeed, bbCheckCastFailed);
+		builder.CreateCondBr(res, succeed, bbCheckCastFailed);
+	}
 }
 
 void J3CodeGen::floatToInteger(J3Type* ftype, J3Type* itype) {

Modified: vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc?rev=199691&r1=199690&r2=199691&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc (original)
+++ vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc Mon Jan 20 16:11:53 2014
@@ -18,27 +18,36 @@
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/raw_ostream.h"
 
-using namespace llvm;
-
 namespace {
-
-  class LowerJavaRT : public ModulePass {
+  class LowerJavaRT : public llvm::ModulePass {
   public:
     static char ID;
-    LowerJavaRT() : ModulePass(ID) { }
+    LowerJavaRT() : llvm::ModulePass(ID) { }
 
-    virtual bool runOnModule(Module &M);
+    virtual bool runOnModule(llvm::Module &M);
   private:
   };
+
   char LowerJavaRT::ID = 0;
-  static RegisterPass<LowerJavaRT> X("LowerJavaRT",
-                                     "Remove references to RT");
+  static llvm::RegisterPass<LowerJavaRT> X("LowerJavaRT",
+																					 "Remove references to RT");
 
 
-bool LowerJavaRT::runOnModule(Module& M) {
-  bool Changed = true;
+	bool LowerJavaRT::runOnModule(llvm::Module& module) {
+		bool Changed = true;
 
-	fprintf(stderr, "Lowering java runtime in %s\n", M.getModuleIdentifier().data());
+		for(llvm::Module::global_iterator it = module.global_begin(); it!=module.global_end(); it++) {
+			llvm::GlobalValue* gv = it;
+			
+			fprintf(stderr, "Global: %s\n", gv->getName().data());
+		}
+
+		for(llvm::Module::iterator it = module.begin(); it!=module.end(); it++) {
+			llvm::Function* function = it;
+			
+			if(!strncmp(function->getName().data(), "j3_java", 7))
+				fprintf(stderr, "processing %s\n", function->getName().data());
+		}
 
   return Changed;
 }

Modified: vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc?rev=199691&r1=199690&r2=199691&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc (original)
+++ vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc Mon Jan 20 16:11:53 2014
@@ -44,7 +44,7 @@ typedef SmallPtrSet<Instruction*,128> In
 
 bool LowerMagic::runOnFunction(Function& F) {
   bool Changed = false;
-	fprintf(stderr, "Lowering magic of %s\n", F.getName().data());
+	//fprintf(stderr, "Lowering magic of %s\n", F.getName().data());
 	return Changed;
 }
 }





More information about the vmkit-commits mailing list