[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