[vmkit-commits] [vmkit] r198042 - for field access from c++ code, use the field to find the class instead of the vt of the object. Avoids a lookup.

Gael Thomas gael.thomas at lip6.fr
Thu Dec 26 01:42:29 PST 2013


Author: gthomas
Date: Thu Dec 26 03:42:28 2013
New Revision: 198042

URL: http://llvm.org/viewvc/llvm-project?rev=198042&view=rev
Log:
for field access from c++ code, use the field to find the class instead of the vt of the object. Avoids a lookup.

Modified:
    vmkit/branches/mcjit/include/j3/j3class.h
    vmkit/branches/mcjit/include/j3/j3thread.h
    vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
    vmkit/branches/mcjit/lib/j3/vm/j3class.cc
    vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
    vmkit/branches/mcjit/lib/j3/vm/j3method.cc
    vmkit/branches/mcjit/lib/j3/vm/j3object.cc
    vmkit/branches/mcjit/lib/j3/vm/j3options.cc
    vmkit/branches/mcjit/lib/j3/vm/j3thread.cc

Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198042&r1=198041&r2=198042&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Thu Dec 26 03:42:28 2013
@@ -26,6 +26,7 @@ namespace j3 {
 	class J3Primitive;
 	class J3Class;
 	class J3Layout;
+	class J3StaticLayout;
 	class J3ArrayClass;
 	class J3ObjectType;
 	class J3Method;
@@ -88,9 +89,11 @@ namespace j3 {
 		J3Primitive*                asPrimitive();
 		J3ArrayClass*               asArrayClass();
 		J3Layout*                   asLayout();
+		J3StaticLayout*             asStaticLayout();
 
 		virtual bool                isObjectType() { return 0; }
 		virtual bool                isArrayClass() { return 0; }
+		virtual bool                isStaticLayout() { return 0; }
 		virtual bool                isLayout() { return 0; }
 		virtual bool                isClass() { return 0; }
 		virtual bool                isPrimitive() { return 0; }
@@ -129,7 +132,7 @@ namespace j3 {
 	class J3Field : public vmkit::PermanentObject {
 		friend class J3Class;
 
-		J3Class*           _cl;
+		J3Layout*          _layout;
 		uint16_t           _access;
 		const vmkit::Name* _name;
 		J3Type*            _type;
@@ -142,7 +145,7 @@ namespace j3 {
 
 		J3Attributes*      attributes() const { return _attributes; }
 		uint16_t           access() { return _access; }
-		J3Class*           cl()  { return _cl; }
+		J3Layout*          layout()  { return _layout; }
 		const vmkit::Name* name() { return _name; }
 		J3Type*            type() { return _type; }
 
@@ -202,8 +205,18 @@ namespace j3 {
 		llvm::Type*       llvmType() { return _llvmType; }
 	};
 
+	class J3StaticLayout : public J3Layout {
+		J3Class* _cl;
+	public:
+		J3StaticLayout(J3ClassLoader* loader, J3Class* cl, const vmkit::Name* name);
+
+		J3Class* cl() { return _cl; }
+
+		virtual bool      isStaticLayout() { return 1; }
+	};
+
 	class J3Class : public J3Layout {
-		J3Layout           staticLayout;
+		J3StaticLayout     staticLayout;
 
 		uint16_t           _access;
 

Modified: vmkit/branches/mcjit/include/j3/j3thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3thread.h?rev=198042&r1=198041&r2=198042&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3thread.h (original)
+++ vmkit/branches/mcjit/include/j3/j3thread.h Thu Dec 26 03:42:28 2013
@@ -31,6 +31,7 @@ namespace j3 {
 
 		void               assocJavaThread(J3ObjectHandle* javaThread);
 		J3ObjectHandle*    javaThread() { return _javaThread; }
+		static J3Thread*   nativeThread(J3ObjectHandle* handle);
 
 		J3Method*          getJavaCaller(uint32_t level=0);
 

Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc?rev=198042&r1=198041&r2=198042&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Dec 26 03:42:28 2013
@@ -138,7 +138,16 @@ void JNICALL JVM_DisableCompiler(JNIEnv*
  */
 void JNICALL JVM_StartThread(JNIEnv* env, jobject thread) { enterJVM(); NYI(); leaveJVM(); }
 void JNICALL JVM_StopThread(JNIEnv* env, jobject thread, jobject exception) { enterJVM(); NYI(); leaveJVM(); }
-jboolean JNICALL JVM_IsThreadAlive(JNIEnv* env, jobject thread) { enterJVM(); NYI(); leaveJVM(); }
+jboolean JNICALL JVM_IsThreadAlive(JNIEnv* env, jobject thread) { 
+	jboolean res;
+
+	enterJVM(); 
+	res = (jboolean)J3Thread::nativeThread(thread);
+	leaveJVM(); 
+
+	return res;
+}
+
 void JNICALL JVM_SuspendThread(JNIEnv* env, jobject thread) { enterJVM(); NYI(); leaveJVM(); }
 void JNICALL JVM_ResumeThread(JNIEnv* env, jobject thread) { enterJVM(); NYI(); leaveJVM(); }
 

Modified: vmkit/branches/mcjit/lib/j3/vm/j3class.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3class.cc?rev=198042&r1=198041&r2=198042&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Thu Dec 26 03:42:28 2013
@@ -127,6 +127,12 @@ J3Layout* J3Type::asLayout() {
 	return (J3Layout*)this;
 }
 
+J3StaticLayout* J3Type::asStaticLayout() {
+	if(!isStaticLayout())
+		J3::internalError(L"should not happen");
+	return (J3StaticLayout*)this;
+}
+
 J3Primitive* J3Type::asPrimitive() {
 	if(!isPrimitive())
 		J3::internalError(L"should not happen");
@@ -168,8 +174,7 @@ J3ObjectHandle* J3ObjectType::javaClass(
 		lock();
 		if(!_javaClass) {
 			J3ObjectHandle* prev = J3Thread::get()->tell();
-			_javaClass = J3ObjectHandle::doNewObject(loader()->vm()->classClass);
-			_javaClass = loader()->globalReferences()->add(_javaClass);
+			_javaClass = loader()->globalReferences()->add(J3ObjectHandle::doNewObject(loader()->vm()->classClass));
 			J3Thread::get()->restore(prev);
 			_javaClass->setLong(loader()->vm()->classVMData, (int64_t)(uintptr_t)this);
 			loader()->vm()->classInit->invokeSpecial(_javaClass);
@@ -244,6 +249,10 @@ void J3ObjectType::dumpInterfaceSlotDesc
 /*  
  *  ------------ J3Layout ------------
  */
+J3StaticLayout::J3StaticLayout(J3ClassLoader* loader, J3Class* cl, const vmkit::Name* name) : J3Layout(loader, name) {
+	_cl = cl;
+}
+
 J3Layout::J3Layout(J3ClassLoader* loader, const vmkit::Name* name) : J3ObjectType(loader, name) {
 }
 
@@ -264,8 +273,8 @@ J3Field* J3Layout::findField(const vmkit
 	for(size_t i=0; i<nbFields; i++) {
 		J3Field* cur = fields + i;
 
-		//printf("%ls - %ls\n", cur->name()->cStr(), cur->sign()->cStr());
-		//printf("%ls - %ls\n", name->cStr(), sign->cStr());
+		//printf("Compare %ls - %ls\n", cur->name()->cStr(), cur->type()->name()->cStr());
+		//printf("  with  %ls - %ls\n", name->cStr(), type->name()->cStr());
 		if(cur->name() == name && cur->type() == type) {
 			return cur;
 		}
@@ -276,7 +285,7 @@ J3Field* J3Layout::findField(const vmkit
 /*  
  *  ------------ J3Class ------------
  */
-J3Class::J3Class(J3ClassLoader* loader, const vmkit::Name* name) : J3Layout(loader, name), staticLayout(loader, name) {
+J3Class::J3Class(J3ClassLoader* loader, const vmkit::Name* name) : J3Layout(loader, name), staticLayout(loader, this, name) {
 	status = CITED;
 }
 
@@ -570,23 +579,24 @@ void J3Class::readClassBytes(std::vector
 		J3Field* f = fields + i;
 
 		if(i < nbHiddenFields) {
-			f->_cl         = this;
 			f->_access     = hiddenFields[i].access();
 			f->_name       = hiddenFields[i].name();
 			f->_type       = hiddenFields[i].type();
 			f->_attributes = new (loader()->allocator(), 0) J3Attributes(0);
 		} else {
-			f->_cl         = this;
 			f->_access     = reader.readU2();
 			f->_name       = nameAt(reader.readU2());
 			f->_type       = loader()->getType(this, nameAt(reader.readU2()));
 			f->_attributes = readAttributes(&reader);
 		}
 
-		if(J3Cst::isStatic(f->access()))
+		if(J3Cst::isStatic(f->access())) {
+			f->_layout = &staticLayout;
 			nbStaticFields++;
-		else
+		} else {
+			f->_layout = this;
 			nbVirtualFields++;
+		}
 
 		switch(loader()->vm()->dataLayout()->getTypeSizeInBits(f->_type->llvmType())) {
 			case 1:  pFields0[i0++] = f; break;
@@ -646,7 +656,11 @@ void J3Class::readClassBytes(std::vector
 	_methods = (J3Method**)loader()->allocator()->allocate(sizeof(J3Method*)*nbVirtualMethods);
 
 	for(int i=0; i<n; i++) {
-		J3Layout* layout = J3Cst::isStatic(methodsTmp[i]->access()) ? &staticLayout : this;
+		J3Layout* layout;
+		if(J3Cst::isStatic(methodsTmp[i]->access()))
+			layout = &staticLayout;
+		else
+			layout = this;
 		layout->_methods[layout->_nbMethods++] = methodsTmp[i];
 	}
 
@@ -872,7 +886,7 @@ llvm::Type* J3Class::llvmType() {
 }
 
 void J3Field::dump() {
-	printf("Field: %ls %ls::%ls (%d)\n", type()->name()->cStr(), cl()->name()->cStr(), name()->cStr(), access());
+	printf("Field: %ls %ls::%ls (%d)\n", type()->name()->cStr(), layout()->name()->cStr(), name()->cStr(), access());
 }
 
 

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=198042&r1=198041&r2=198042&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Thu Dec 26 03:42:28 2013
@@ -43,6 +43,9 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato
 	loader = cl->loader();
 	vm = loader->vm();
 
+	if(vm->options()->debugTranslate)
+		fprintf(stderr, "  translating bytecode of: %ls::%ls%ls\n", method->cl()->name()->cStr(), method->name()->cStr(), method->sign()->cStr());
+
 	llvmFunction = _llvmFunction;
 	llvmFunction->setGC("vmkit");
 	_module = llvmFunction->getParent();
@@ -324,12 +327,12 @@ void J3CodeGen::get(llvm::Value* src, J3
 void J3CodeGen::getField(uint32_t idx) {
 	llvm::Value* obj = stack.pop(); 
 	J3Field* f = cl->fieldAt(idx, 0);
-	get(unflatten(nullCheck(obj), f->cl()), f);
+	get(unflatten(nullCheck(obj), f->layout()), f);
 }
 
 void J3CodeGen::getStatic(uint32_t idx) {
 	J3Field* f = cl->fieldAt(idx, J3Cst::ACC_STATIC);
-	get(staticInstance(f->cl()), f);
+	get(staticInstance(f->layout()->asStaticLayout()->cl()), f);
 }
 
 void J3CodeGen::put(llvm::Value* dest, llvm::Value* val, J3Field* f) {
@@ -339,14 +342,14 @@ void J3CodeGen::put(llvm::Value* dest, l
 
 void J3CodeGen::putStatic(uint32_t idx) {
 	J3Field* f = cl->fieldAt(idx, J3Cst::ACC_STATIC);
-	put(staticInstance(f->cl()), stack.pop(), f);
+	put(staticInstance(f->layout()->asStaticLayout()->cl()), stack.pop(), f);
 }
 
 void J3CodeGen::putField(uint32_t idx) {
 	J3Field* f = cl->fieldAt(idx, 0);
 	llvm::Value* val = stack.pop();
 	llvm::Value* obj = nullCheck(stack.pop());
-	put(unflatten(obj, f->cl()), val, f);
+	put(unflatten(obj, f->layout()), val, f);
 }
 
 void J3CodeGen::arrayBoundCheck(llvm::Value* obj, llvm::Value* idx) {
@@ -670,17 +673,13 @@ void J3CodeGen::echoDebugExecute(uint32_
 }
 
 void J3CodeGen::translate() {
-	if(vm->options()->debugTranslate) {
-		fprintf(stderr, "  translating bytecode of: %ls::%ls%ls\n", method->cl()->name()->cStr(), method->name()->cStr(), method->sign()->cStr());
-
-		if(vm->options()->debugTranslate > 1) {
-			fprintf(stderr, "    exception table:\n");
-			for(uint32_t i=0; i<nbExceptionNodes; i++) {
-				fprintf(stderr, "    [%4u] handle", exceptionNodes[i]->pc);
-				for(uint32_t j=0; j<exceptionNodes[i]->nbEntries; j++)
-					fprintf(stderr, " %u", exceptionNodes[i]->entries[j]->catchType);
-				fprintf(stderr, exceptionNodes[i]->nbEntries ? "\n" : " <none>\n");
-			}
+	if(vm->options()->debugTranslate > 1) {
+		fprintf(stderr, "    exception table:\n");
+		for(uint32_t i=0; i<nbExceptionNodes; i++) {
+			fprintf(stderr, "    [%4u] handle", exceptionNodes[i]->pc);
+			for(uint32_t j=0; j<exceptionNodes[i]->nbEntries; j++)
+				fprintf(stderr, " %u", exceptionNodes[i]->entries[j]->catchType);
+			fprintf(stderr, exceptionNodes[i]->nbEntries ? "\n" : " <none>\n");
 		}
 	}
 

Modified: vmkit/branches/mcjit/lib/j3/vm/j3method.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3method.cc?rev=198042&r1=198041&r2=198042&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Thu Dec 26 03:42:28 2013
@@ -161,6 +161,7 @@ J3Value J3Method::internalInvoke(bool st
 		target = resolve(self);
 	}
 
+	//fprintf(stderr, "invoke: %ls::%ls%ls\n", target->cl()->name()->cStr(), target->name()->cStr(), target->sign()->cStr());
 	target->fnPtr(); /* ensure that the function is compiled */
 	cl()->loader()->oldee()->updateGlobalMapping(target->_llvmFunction, target->fnPtr());
 	llvm::GenericValue res = cl()->loader()->oldee()->runFunction(target->_llvmFunction, args);

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=198042&r1=198041&r2=198042&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Thu Dec 26 03:42:28 2013
@@ -344,7 +344,7 @@ J3ObjectHandle* J3ObjectHandle::doNewArr
 	void J3ObjectHandle::set##name(J3Field* field, ctype value) {					\
 		const llvm::StructLayout* layout =																	\
 			obj()->vt()->type()->loader()->vm()->dataLayout()->								\
-			getStructLayout((llvm::StructType*)(obj()->vt()->type()->llvmType()->getContainedType(0))); \
+			getStructLayout((llvm::StructType*)(field->layout()->llvmType()->getContainedType(0))); \
 		uint32_t offset = layout->getElementOffset(field->num());						\
 		rawSet##name(offset, value);																				\
 	}																																			\
@@ -352,7 +352,7 @@ J3ObjectHandle* J3ObjectHandle::doNewArr
 	ctype J3ObjectHandle::get##name(J3Field* field) {											\
 		const llvm::StructLayout* layout =																	\
 			obj()->vt()->type()->loader()->vm()->dataLayout()->								\
-			getStructLayout((llvm::StructType*)(obj()->vt()->type()->llvmType()->getContainedType(0))); \
+			getStructLayout((llvm::StructType*)(field->layout()->llvmType()->getContainedType(0))); \
 		uint32_t offset = layout->getElementOffset(field->num());						\
 		return rawGet##name(offset);																				\
 	}																																			\
@@ -403,7 +403,7 @@ J3ObjectHandle* J3ObjectHandle::rawGetOb
 void J3ObjectHandle::setObject(J3Field* field, J3ObjectHandle* value) {
 	const llvm::StructLayout* layout =
 		obj()->vt()->type()->loader()->vm()->dataLayout()->
-		getStructLayout((llvm::StructType*)(obj()->vt()->type()->llvmType()->getContainedType(0)));
+		getStructLayout((llvm::StructType*)(field->layout()->llvmType()->getContainedType(0)));
 	uint32_t offset = layout->getElementOffset(field->num());
 	rawSetObject(offset, value);
 }
@@ -411,7 +411,7 @@ void J3ObjectHandle::setObject(J3Field*
 J3ObjectHandle* J3ObjectHandle::getObject(J3Field* field) {
 	const llvm::StructLayout* layout =
 		obj()->vt()->type()->loader()->vm()->dataLayout()->
-		getStructLayout((llvm::StructType*)(obj()->vt()->type()->llvmType()->getContainedType(0)));
+		getStructLayout((llvm::StructType*)(field->layout()->llvmType()->getContainedType(0)));
 	return rawGetObject(layout->getElementOffset(field->num()));
 }
 

Modified: vmkit/branches/mcjit/lib/j3/vm/j3options.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3options.cc?rev=198042&r1=198041&r2=198042&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Thu Dec 26 03:42:28 2013
@@ -19,7 +19,7 @@ J3Options::J3Options() {
 	debugLoad = 0;
 	debugResolve = 0;
 	debugIniting = 0;
-	debugTranslate = 0;
+	debugTranslate = 2;
 	debugLinking = 0;
 
 	genDebugExecute = debugExecute ? 1 : 0;

Modified: vmkit/branches/mcjit/lib/j3/vm/j3thread.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3thread.cc?rev=198042&r1=198041&r2=198042&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3thread.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3thread.cc Thu Dec 26 03:42:28 2013
@@ -1,5 +1,6 @@
 #include "j3/j3thread.h"
 #include "j3/j3method.h"
+#include "j3/j3class.h"
 #include "j3/j3.h"
 
 #include "vmkit/safepoint.h"
@@ -43,6 +44,10 @@ void J3Thread::ensureCapacity(uint32_t c
 	_localReferences.ensureCapacity(capacity);
 }
 
+J3Thread* J3Thread::nativeThread(J3ObjectHandle* handle) {
+	return (J3Thread*)handle->getLong(get()->vm()->threadVMData);
+}
+
 void J3Thread::assocJavaThread(J3ObjectHandle* javaThread) {
 	_javaThread = javaThread;
 	_javaThread->setLong(vm()->threadVMData, (int64_t)(uintptr_t)this);





More information about the vmkit-commits mailing list