[vmkit-commits] [vmkit] r199726 - Use the vmkit::Symbol to load the virtual table f a class.

Gael Thomas gael.thomas at lip6.fr
Tue Jan 21 03:21:05 PST 2014


Author: gthomas
Date: Tue Jan 21 05:21:05 2014
New Revision: 199726

URL: http://llvm.org/viewvc/llvm-project?rev=199726&view=rev
Log:
Use the vmkit::Symbol to load the virtual table f a class.

Modified:
    vmkit/branches/mcjit/include/j3/j3.h
    vmkit/branches/mcjit/include/j3/j3class.h
    vmkit/branches/mcjit/include/j3/j3codegen.h
    vmkit/branches/mcjit/include/j3/j3symbols.h
    vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
    vmkit/branches/mcjit/lib/j3/vm/j3.cc
    vmkit/branches/mcjit/lib/j3/vm/j3class.cc
    vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc

Modified: vmkit/branches/mcjit/include/j3/j3.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199726&r1=199725&r2=199726&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Tue Jan 21 05:21:05 2014
@@ -119,6 +119,7 @@ namespace j3 {
 		J3Method*        stackTraceElementClassInit;
 
 		llvm::Type* typeJNIEnvPtr;
+		llvm::Type* typeJ3VirtualTable;
 		llvm::Type* typeJ3VirtualTablePtr;
 		llvm::Type* typeJ3Type;
 		llvm::Type* typeJ3TypePtr;

Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199726&r1=199725&r2=199726&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Tue Jan 21 05:21:05 2014
@@ -49,11 +49,11 @@ namespace j3 {
 	protected:
 		enum { LOADED, RESOLVED, INITED };
 
-		const vmkit::Name*        _name;
-		char*                     _nativeName;
-		uint32_t                  _nativeNameLength;
-		J3VirtualTable*           _vt; 
-		J3ObjectHandle* volatile  _javaClass;
+		const vmkit::Name*          _name;
+		char*                       _nativeName;
+		uint32_t                    _nativeNameLength;
+		J3VTSymbol                  _vtSymbol;
+		J3ObjectHandle* volatile    _javaClass;
 
 		volatile int                status;
 
@@ -64,6 +64,8 @@ namespace j3 {
 	public:
 		J3Type(J3ClassLoader* loader, const vmkit::Name* name);
 
+		const char*                 genId(const char* prefix, const char* suffix=0);
+
 		J3ObjectHandle*             javaClass(bool doPush=1, J3ObjectHandle* protectionDomain=0);
 
 		virtual uint32_t            logSize() = 0;
@@ -79,6 +81,8 @@ namespace j3 {
 		J3Type*                     resolve();
 		J3Type*                     initialise();
 
+		const char*                 vtId();
+		J3VTSymbol*                 vtSymbol() { return &_vtSymbol; }
 		J3VirtualTable*             vt();
 
 		bool                        isAssignableTo(J3Type* parent);
@@ -245,7 +249,7 @@ namespace j3 {
 		uint16_t            access() { return _access; }
 		uint16_t            modifiers();
 
-		char*                 staticObjectId();
+		const char*           staticObjectId();
 		J3StaticObjectSymbol* staticObjectSymbol() { return _staticObjectSymbol; }
 
 		void                registerNative(const vmkit::Name* methName, const vmkit::Name* methSign, void* fnPtr);

Modified: vmkit/branches/mcjit/include/j3/j3codegen.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199726&r1=199725&r2=199726&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3codegen.h (original)
+++ vmkit/branches/mcjit/include/j3/j3codegen.h Tue Jan 21 05:21:05 2014
@@ -124,7 +124,7 @@ namespace j3 {
 		llvm::Value*        handleToObject(llvm::Value* obj);
 		llvm::Value*        javaClass(J3ObjectType* type, bool doPush);
 		llvm::Value*        staticObject(J3Class* cl);
-		llvm::Value*        vt(J3ObjectType* cl, bool resolve=0);
+		llvm::Value*        vt(J3ObjectType* cl);
 		llvm::Value*        vt(llvm::Value* obj);
 		void                resolveJ3ObjectType(J3ObjectType* cl);
 		void                initialiseJ3ObjectType(J3ObjectType* cl);

Modified: vmkit/branches/mcjit/include/j3/j3symbols.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3symbols.h?rev=199726&r1=199725&r2=199726&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3symbols.h (original)
+++ vmkit/branches/mcjit/include/j3/j3symbols.h Tue Jan 21 05:21:05 2014
@@ -13,35 +13,35 @@ namespace j3 {
 	};
 
 	class J3VTSymbol : public vmkit::Symbol {
-		char*           _id;
+		const char*     _id;
 		J3VirtualTable* _vt;
 	public:
 		J3VTSymbol() {}
 
 		J3VirtualTable* vt() { return _vt; }
+		const char*     id() { return _id; }
 		
-		char* id() { return _id; }
-		void* getSymbolAddress() { return vt(); }
+		void*           getSymbolAddress() { return vt(); }
 		
-		void  setId(char* id) { _id = id; }
-		void  setVt(J3VirtualTable* vt) { _vt = vt; }
+		void            setId(const char* id) { _id = id; }
+		void            setVt(J3VirtualTable* vt) { _vt = vt; }
 	};
 
 	class J3StaticObjectSymbol : public vmkit::Symbol {
-		char* volatile _id;
+		const char*    _id;
 		J3ObjectHandle _handle;
 	public:
 		J3StaticObjectSymbol() {}
 
-		void* operator new(size_t n, vmkit::LockedStack<J3StaticObjectSymbol>* stack) { return stack->push(); }
+		void*           operator new(size_t n, vmkit::LockedStack<J3StaticObjectSymbol>* stack) { return stack->push(); }
 
 		J3ObjectHandle* handle() { return &_handle; }
+		const char*     id() { return _id; }
 
-		char* id() { return _id; }
-		void* getSymbolAddress() { return handle(); }
+		void*           getSymbolAddress() { return handle(); }
 		
-		void  setId(char* id) { _id = id; }
-		void  setHandle(J3ObjectHandle* handle) { _handle = *handle; }
+		void            setId(const char* id) { _id = id; }
+		void            setHandle(J3ObjectHandle* handle) { _handle = *handle; }
 	};
 }
 

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=199726&r1=199725&r2=199726&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Tue Jan 21 05:21:05 2014
@@ -101,6 +101,8 @@ jlong JNICALL JVM_NanoTime(JNIEnv* env,
 void JNICALL JVM_ArrayCopy(JNIEnv* env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) { 
 	enterJVM(); 
 
+	//fprintf(stderr, " vt: %p and %p\n", src->vt(), dst->vt());
+	//fprintf(stderr, " types: %p and %p\n", src->vt()->type(), dst->vt()->type());
 	J3Type* srcType0 = src->vt()->type();
 	J3Type* dstType0 = dst->vt()->type();
 

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=199726&r1=199725&r2=199726&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Tue Jan 21 05:21:05 2014
@@ -50,7 +50,8 @@ J3* J3::create() {
 
 void J3::introspect() {
 	typeJNIEnvPtr           = llvm::PointerType::getUnqual(introspectType("struct.JNIEnv_"));
-	typeJ3VirtualTablePtr   = llvm::PointerType::getUnqual(introspectType("class.j3::J3VirtualTable"));
+	typeJ3VirtualTable      = introspectType("class.j3::J3VirtualTable");
+	typeJ3VirtualTablePtr   = llvm::PointerType::getUnqual(typeJ3VirtualTable);
 	typeJ3Type              = introspectType("class.j3::J3Type");
 	typeJ3TypePtr           = llvm::PointerType::getUnqual(typeJ3Type);
 	typeJ3LayoutPtr         = llvm::PointerType::getUnqual(introspectType("class.j3::J3Layout"));

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=199726&r1=199725&r2=199726&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Tue Jan 21 05:21:05 2014
@@ -33,12 +33,34 @@ J3Type::J3Type(J3ClassLoader* loader, co
 	_name = name; 
 }
 
+const char* J3Type::genId(const char* prefix, const char* suffix) {
+	size_t plen = prefix ? strlen(prefix) : 0;
+	size_t slen = suffix ? strlen(suffix) : 0;
+	size_t len = nativeNameLength();
+	char* id = (char*)loader()->allocator()->allocate(plen + len + slen + 1);
+
+	memcpy(id, prefix, plen);
+	memcpy(id+plen, nativeName(), len);
+	memcpy(id+plen+plen, suffix, slen);
+
+	return id;
+}
+
 void* J3Type::getSymbolAddress() {
 	return this;
 }
 
+const char* J3Type::vtId() {
+	const char* id = vtSymbol()->id();
+
+	if(!id)
+		vtSymbol()->setId(id = genId("vt_"));
+
+	return id;
+}
+
 J3VirtualTable* J3Type::vt() { 
-	return _vt; 
+	return vtSymbol()->vt(); 
 }
 
 void J3Type::dump() {
@@ -494,16 +516,11 @@ void J3Class::registerNative(const vmkit
 	res->registerNative(fnPtr);
 }
 
-char* J3Class::staticObjectId() {
-	char* id = staticObjectSymbol()->id();
+const char* J3Class::staticObjectId() {
+	const char* id = staticObjectSymbol()->id();
 
-	if(!id) {
-		size_t len = nativeNameLength();
-		id = (char*)loader()->allocator()->allocate(len + 8);
-		memcpy(id, "static_", 7);
-		memcpy(id+7, nativeName(), len+1);
-		staticObjectSymbol()->setId(id);
-	}
+	if(!id)
+		staticObjectSymbol()->setId(id = genId("static_"));
 
 	return id;
 }
@@ -572,9 +589,9 @@ void J3Class::doResolve(J3Field* hiddenF
 		status = RESOLVED;
 		readClassBytes(hiddenFields, nbHiddenFields);
 		
-		staticLayout()->_vt = J3VirtualTable::create(staticLayout());
+		staticLayout()->vtSymbol()->setVt(J3VirtualTable::create(staticLayout()));
 
-		_vt = J3VirtualTable::create(this);
+		vtSymbol()->setVt(J3VirtualTable::create(this));
 
 		if(!J3Cst::isInterface(access()) && !J3Cst::isAbstract(access()))
 			prepareInterfaceTable();
@@ -1021,7 +1038,7 @@ void J3ArrayClass::doResolve(J3Field* hi
 	lock();
 	if(status < RESOLVED) {
 		status = RESOLVED;
-		_vt = J3VirtualTable::create(this);
+		vtSymbol()->setVt(J3VirtualTable::create(this));
 		prepareInterfaceTable();
 	}
 	unlock();
@@ -1065,7 +1082,7 @@ J3Primitive::J3Primitive(J3ClassLoader*
 	_nativeName[0] = id;
 	_nativeName[1] = 0;
 	_nativeNameLength = 1;
-	_vt = J3VirtualTable::create(this);
+	vtSymbol()->setVt(J3VirtualTable::create(this));
 	_logSize = logSize;
 }
 

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=199726&r1=199725&r2=199726&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Tue Jan 21 05:21:05 2014
@@ -350,11 +350,9 @@ llvm::Value* J3CodeGen::handleToObject(l
 
 llvm::Value* J3CodeGen::staticObject(J3Class* cl) {
 	initialiseJ3ObjectType(cl);
-	char* id = cl->staticObjectId();
+	const char* id = cl->staticObjectId();
 	loader->addSymbol(id, cl->staticObjectSymbol());
 	return handleToObject(module->getOrInsertGlobal(id, vm->typeJ3ObjectHandle));
-	//return handleToObject(builder.CreateCall(funcJ3ClassStaticObject, 
-	//typeDescriptor(cl, vm->typeJ3ClassPtr)));
 }
 
 llvm::Value* J3CodeGen::vt(llvm::Value* obj) {
@@ -365,10 +363,11 @@ llvm::Value* J3CodeGen::vt(llvm::Value*
 	return res;
 }
 
-llvm::Value* J3CodeGen::vt(J3ObjectType* type, bool doResolve) {
-	if(doResolve)
-		resolveJ3ObjectType(type);
-	return builder.CreateCall(funcJ3TypeVT, typeDescriptor(type, vm->typeJ3TypePtr));
+llvm::Value* J3CodeGen::vt(J3ObjectType* type) {
+	type->resolve();
+	const char* id = type->vtId();
+	loader->addSymbol(id, type->vtSymbol());
+	return module->getOrInsertGlobal(id, vm->typeJ3VirtualTable);
 }
 
 llvm::Value* J3CodeGen::nullCheck(llvm::Value* obj) {
@@ -607,20 +606,16 @@ void J3CodeGen::newObject(J3Class* cl) {
 }
 
 llvm::Value* J3CodeGen::isAssignableTo(llvm::Value* obj, J3ObjectType* type) {
-	llvm::Value* vtType = vt(type, 1);
+	llvm::Value* vtType = vt(type); /* force the resolution of type */
 	llvm::Value* vtObj = vt(obj);
 
-	if(type->isResolved()) {
-		if(type->vt()->isPrimaryChecker())
-			return builder.CreateCall3(funcFastIsAssignableToPrimaryChecker, 
-																	vtObj, 
-																	vtType,
-																	builder.getInt32(type->vt()->offset()));
-		else 
-			return builder.CreateCall2(funcFastIsAssignableToNonPrimaryChecker, vtObj, vtType);
-	} else {
-		return builder.CreateCall2(funcIsAssignableTo, vtObj, vtType);
-	}
+	if(type->vt()->isPrimaryChecker())
+		return builder.CreateCall3(funcFastIsAssignableToPrimaryChecker, 
+															 vtObj, 
+															 vtType,
+															 builder.getInt32(type->vt()->offset()));
+	else 
+		return builder.CreateCall2(funcFastIsAssignableToNonPrimaryChecker, vtObj, vtType);
 }
 
 void J3CodeGen::instanceof(llvm::Value* obj, J3ObjectType* type) {





More information about the vmkit-commits mailing list