[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