[vmkit-commits] [vmkit] r199717 - Define vmkit::Symbols for vts, staticObjects and java.lang.Strings. For the moment, only use these symbols for staticObjects.
Gael Thomas
gael.thomas at lip6.fr
Tue Jan 21 02:34:54 PST 2014
Author: gthomas
Date: Tue Jan 21 04:34:53 2014
New Revision: 199717
URL: http://llvm.org/viewvc/llvm-project?rev=199717&view=rev
Log:
Define vmkit::Symbols for vts, staticObjects and java.lang.Strings. For the moment, only use these symbols for staticObjects.
Added:
vmkit/branches/mcjit/include/j3/j3symbols.h
Modified:
vmkit/branches/mcjit/include/j3/j3.h
vmkit/branches/mcjit/include/j3/j3class.h
vmkit/branches/mcjit/include/j3/j3classloader.h
vmkit/branches/mcjit/include/j3/j3codegen.h
vmkit/branches/mcjit/include/j3/j3meta.def
vmkit/branches/mcjit/include/vmkit/stack.h
vmkit/branches/mcjit/lib/j3/vm/j3.cc
vmkit/branches/mcjit/lib/j3/vm/j3class.cc
vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc
vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
Modified: vmkit/branches/mcjit/include/j3/j3.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Tue Jan 21 04:34:53 2014
@@ -135,6 +135,7 @@ namespace j3 {
llvm::Type* typeJ3ArrayObjectPtr;
llvm::Type* typeJ3Object;
llvm::Type* typeJ3ObjectPtr;
+ llvm::Type* typeJ3ObjectHandle;
llvm::Type* typeJ3ObjectHandlePtr;
llvm::Type* typeJ3LockRecord;
llvm::Type* typeGXXException;
Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Tue Jan 21 04:34:53 2014
@@ -8,6 +8,7 @@
#include "vmkit/compiler.h"
#include "j3/j3object.h"
+#include "j3/j3symbols.h"
namespace llvm {
class Type;
@@ -40,7 +41,6 @@ namespace j3 {
J3Method** methods;
};
-
class J3Type : public vmkit::Symbol {
pthread_mutex_t _mutex;
J3ClassLoader* _loader;
@@ -55,7 +55,7 @@ namespace j3 {
J3VirtualTable* _vt;
J3ObjectHandle* volatile _javaClass;
- volatile int status;
+ volatile int status;
virtual void doResolve(J3Field* hiddenFields, size_t nbHiddenFields) { status = RESOLVED; }
virtual void doInitialise() { status = INITED; }
@@ -184,30 +184,29 @@ namespace j3 {
};
class J3Class : public J3Layout {
- J3StaticLayout _staticLayout;
+ J3StaticLayout _staticLayout;
- uint16_t _access;
+ uint16_t _access;
- size_t _nbInterfaces;
- J3Class** _interfaces;
- J3Class* _super; /* this for root */
+ size_t _nbInterfaces;
+ J3Class** _interfaces;
+ J3Class* _super; /* this for root */
- J3Attributes* _attributes;
+ J3Attributes* _attributes;
- J3ClassBytes* _bytes;
- size_t nbCtp;
- uint8_t* ctpTypes;
- uint32_t* ctpValues;
- void** ctpResolved;
+ J3ClassBytes* _bytes;
+ size_t nbCtp;
+ uint8_t* ctpTypes;
+ uint32_t* ctpValues;
+ void** ctpResolved;
- size_t _nbConstructors;
- size_t _nbPublicConstructors;
+ size_t _nbConstructors;
+ size_t _nbPublicConstructors;
- /* GC Object */
- J3ObjectHandle* _staticInstance;
+ J3StaticObjectSymbol* _staticObjectSymbol;
- J3ObjectHandle* _protectionDomain;
- const char* _source;
+ J3ObjectHandle* _protectionDomain;
+ const char* _source;
J3Attributes* readAttributes(J3Reader* reader);
void readClassBytes(J3Field* hiddenFields, uint32_t nbHiddenFields);
@@ -247,7 +246,8 @@ namespace j3 {
uint16_t access() { return _access; }
uint16_t modifiers();
- J3ObjectHandle* staticInstance();
+ char* staticObjectId();
+ J3StaticObjectSymbol* staticObjectSymbol() { return _staticObjectSymbol; }
void registerNative(const vmkit::Name* methName, const vmkit::Name* methSign, void* fnPtr);
Modified: vmkit/branches/mcjit/include/j3/j3classloader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3classloader.h (original)
+++ vmkit/branches/mcjit/include/j3/j3classloader.h Tue Jan 21 04:34:53 2014
@@ -9,6 +9,7 @@
#include "vmkit/compiler.h"
#include "j3/j3object.h"
+#include "j3/j3symbols.h"
namespace llvm {
class Linker;
@@ -43,6 +44,8 @@ namespace j3 {
J3ObjectHandle* _javaClassLoader;
J3GlobalReferences _globalReferences;
+ vmkit::LockedStack<J3StaticObjectSymbol> _staticObjects;
+
pthread_mutex_t _mutexClasses;
vmkit::NameMap<J3Class*>::map classes; /* classes managed by this class loader */
@@ -78,6 +81,7 @@ namespace j3 {
uint32_t interfaceIndex(J3Method* signature);
J3GlobalReferences* globalReferences() { return &_globalReferences; }
+ vmkit::LockedStack<J3StaticObjectSymbol>* staticObjects() { return &_staticObjects; }
static J3ClassLoader* nativeClassLoader(J3ObjectHandle* jloader);
J3ObjectHandle* javaClassLoader(bool doPush=1);
Modified: vmkit/branches/mcjit/include/j3/j3codegen.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3codegen.h (original)
+++ vmkit/branches/mcjit/include/j3/j3codegen.h Tue Jan 21 04:34:53 2014
@@ -123,7 +123,7 @@ namespace j3 {
llvm::Value* handleToObject(llvm::Value* obj);
llvm::Value* javaClass(J3ObjectType* type, bool doPush);
- llvm::Value* staticInstance(J3Class* cl);
+ llvm::Value* staticObject(J3Class* cl);
llvm::Value* vt(J3ObjectType* cl, bool resolve=0);
llvm::Value* vt(llvm::Value* obj);
void initialiseJ3ObjectType(J3ObjectType* cl);
Modified: vmkit/branches/mcjit/include/j3/j3meta.def
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3meta.def (original)
+++ vmkit/branches/mcjit/include/j3/j3meta.def Tue Jan 21 04:34:53 2014
@@ -1,7 +1,6 @@
_x(funcJ3TypeVT, "j3::J3Type::vt()")
_x(funcJ3TypeVTAndResolve, "j3::J3Type::vtAndResolve()")
_x(funcJ3TypeInitialise, "j3::J3Type::initialise()")
-_x(funcJ3ClassStaticInstance, "j3::J3Class::staticInstance()")
_x(funcJ3ClassStringAt, "j3::J3Class::stringAt(unsigned short, bool)")
_x(funcJ3TypeJavaClass, "j3::J3Type::javaClass(bool, j3::J3ObjectHandle*)")
_x(funcJniEnv, "j3::J3::jniEnv()")
Added: vmkit/branches/mcjit/include/j3/j3symbols.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3symbols.h?rev=199717&view=auto
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3symbols.h (added)
+++ vmkit/branches/mcjit/include/j3/j3symbols.h Tue Jan 21 04:34:53 2014
@@ -0,0 +1,45 @@
+#ifndef _J3_SYMBOLS_H_
+#define _J3_SYMBOLS_H_
+
+namespace j3 {
+ class J3StringSymbol : public vmkit::Symbol {
+ char* _id;
+ J3ObjectHandle* _handle;
+ public:
+ J3StringSymbol(char* id, J3ObjectHandle* handle) { _id = id; _handle = handle; }
+
+ char* id() { return _id; }
+ void* getSymbolAddress() { return _handle; }
+ };
+
+ class J3VTSymbol : public vmkit::Symbol {
+ char* _id;
+ J3VirtualTable* _vt;
+ public:
+ J3VTSymbol() {}
+
+ char* id() { return _id; }
+ void* getSymbolAddress() { return _vt; }
+
+ void set(char* id, J3VirtualTable* vt) { _id = id; _vt = vt; }
+ };
+
+ class J3StaticObjectSymbol : public vmkit::Symbol {
+ char* volatile _id;
+ J3ObjectHandle _handle;
+ public:
+ J3StaticObjectSymbol() {}
+
+ void* operator new(size_t n, vmkit::LockedStack<J3StaticObjectSymbol>* stack) { return stack->push(); }
+
+ J3ObjectHandle* handle() { return &_handle; }
+
+ char* id() { return _id; }
+ void* getSymbolAddress() { return handle(); }
+
+ void setId(char* id) { _id = id; }
+ void setHandle(J3ObjectHandle* handle) { _handle = *handle; }
+ };
+}
+
+#endif
Modified: vmkit/branches/mcjit/include/vmkit/stack.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/stack.h?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/stack.h (original)
+++ vmkit/branches/mcjit/include/vmkit/stack.h Tue Jan 21 04:34:53 2014
@@ -82,6 +82,23 @@ namespace vmkit {
head->top = ptr;
}
};
+
+ template <class T>
+ class LockedStack : private Stack<T> {
+ pthread_mutex_t mutex;
+
+ public:
+ LockedStack(BumpAllocator* _allocator) : Stack<T>(_allocator) {
+ pthread_mutex_init(&mutex, 0);
+ }
+
+ T* push() {
+ pthread_mutex_lock(&mutex);
+ T* res = Stack<T>::push();
+ pthread_mutex_unlock(&mutex);
+ return res;
+ }
+ };
}
#endif
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=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Tue Jan 21 04:34:53 2014
@@ -1,3 +1,4 @@
+
#include <stdio.h>
#include <dlfcn.h>
#include <cxxabi.h>
@@ -65,7 +66,8 @@ void J3::introspect() {
typeJ3Method = introspectType("class.j3::J3Method");
typeJ3Object = introspectType("class.j3::J3Object");
typeJ3ObjectPtr = llvm::PointerType::getUnqual(typeJ3Object);
- typeJ3ObjectHandlePtr = llvm::PointerType::getUnqual(introspectType("class.j3::J3ObjectHandle"));
+ typeJ3ObjectHandle = introspectType("class.j3::J3ObjectHandle");
+ typeJ3ObjectHandlePtr = llvm::PointerType::getUnqual(typeJ3ObjectHandle);
typeJ3LockRecord = introspectType("class.j3::J3LockRecord");
typeGXXException = llvm::StructType::get(llvm::Type::getInt8Ty(llvmContext())->getPointerTo(),
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=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Tue Jan 21 04:34:53 2014
@@ -319,6 +319,7 @@ J3Class::J3Class(J3ClassLoader* loader,
_source = source;
_bytes = bytes;
status = LOADED;
+ _staticObjectSymbol = new(loader->staticObjects()) J3StaticObjectSymbol();
}
void J3Class::compileAll() {
@@ -498,8 +499,18 @@ void J3Class::registerNative(const vmkit
res->registerNative(fnPtr);
}
-J3ObjectHandle* J3Class::staticInstance() {
- return _staticInstance;
+char* J3Class::staticObjectId() {
+ 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);
+ }
+
+ return id;
}
void J3Class::doInitialise() {
@@ -519,7 +530,7 @@ void J3Class::doInitialise() {
J3ObjectHandle* prev = J3Thread::get()->tell();
J3ObjectHandle* stacked = J3ObjectHandle::allocate(staticLayout()->vt(), staticLayout()->structSize());
- _staticInstance = loader()->globalReferences()->add(stacked);
+ staticObjectSymbol()->setHandle(stacked);
J3Thread::get()->restore(prev);
for(size_t i=0; i<staticLayout()->nbFields(); i++) {
@@ -535,13 +546,14 @@ void J3Class::doInitialise() {
J3::classFormatError(this, "bad length for ConstantAttribute");
uint32_t idx = reader.readU2();
+ J3ObjectHandle* staticObject = staticObjectSymbol()->handle();
switch(getCtpType(idx)) {
- case J3Cst::CONSTANT_Long: staticInstance()->setLong(cur, longAt(idx)); break;
- case J3Cst::CONSTANT_Float: staticInstance()->setFloat(cur, floatAt(idx)); break;
- case J3Cst::CONSTANT_Double: staticInstance()->setDouble(cur, doubleAt(idx)); break;
- case J3Cst::CONSTANT_Integer: staticInstance()->setInteger(cur, integerAt(idx)); break;
- case J3Cst::CONSTANT_String: staticInstance()->setObject(cur, stringAt(idx, 0)); break;
+ case J3Cst::CONSTANT_Long: staticObject->setLong(cur, longAt(idx)); break;
+ case J3Cst::CONSTANT_Float: staticObject->setFloat(cur, floatAt(idx)); break;
+ case J3Cst::CONSTANT_Double: staticObject->setDouble(cur, doubleAt(idx)); break;
+ case J3Cst::CONSTANT_Integer: staticObject->setInteger(cur, integerAt(idx)); break;
+ case J3Cst::CONSTANT_String: staticObject->setObject(cur, stringAt(idx, 0)); break;
default:
J3::classFormatError(this, "invalid ctp entry ConstantAttribute with type %d", getCtpType(idx));
}
Modified: vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Tue Jan 21 04:34:53 2014
@@ -24,6 +24,7 @@ J3ClassLoader::J3InterfaceMethodLess J3C
J3ClassLoader::J3ClassLoader(J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator)
: CompilationUnit(allocator, "class-loader"),
_globalReferences(allocator),
+ _staticObjects(allocator),
classes(vmkit::Name::less, allocator),
types(vmkit::Name::less, allocator),
interfaces(j3InterfaceMethodLess, allocator),
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=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Tue Jan 21 04:34:53 2014
@@ -343,10 +343,13 @@ llvm::Value* J3CodeGen::handleToObject(l
return builder.CreateLoad(builder.CreateGEP(obj, gep));
}
-llvm::Value* J3CodeGen::staticInstance(J3Class* cl) {
+llvm::Value* J3CodeGen::staticObject(J3Class* cl) {
initialiseJ3ObjectType(cl);
- return handleToObject(builder.CreateCall(funcJ3ClassStaticInstance,
- typeDescriptor(cl, vm->typeJ3ClassPtr)));
+ 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) {
@@ -478,7 +481,7 @@ void J3CodeGen::getField(uint32_t idx) {
void J3CodeGen::getStatic(uint32_t idx) {
J3Field* f = cl->fieldAt(idx, J3Cst::ACC_STATIC);
- get(staticInstance(f->layout()->asStaticLayout()->cl()), f);
+ get(staticObject(f->layout()->asStaticLayout()->cl()), f);
}
void J3CodeGen::put(llvm::Value* dest, llvm::Value* val, J3Field* f) {
@@ -487,7 +490,7 @@ void J3CodeGen::put(llvm::Value* dest, l
void J3CodeGen::putStatic(uint32_t idx) {
J3Field* f = cl->fieldAt(idx, J3Cst::ACC_STATIC);
- put(staticInstance(f->layout()->asStaticLayout()->cl()), stack.pop(), f);
+ put(staticObject(f->layout()->asStaticLayout()->cl()), stack.pop(), f);
}
void J3CodeGen::putField(uint32_t idx) {
Modified: vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3jni.cc?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Tue Jan 21 04:34:53 2014
@@ -266,14 +266,14 @@ jmethodID JNICALL GetStaticMethodID(JNIE
#define defGetSetField(jtype, id, j3type) \
void JNICALL SetStatic##id##Field(JNIEnv* env, jclass clazz, jfieldID fieldID, jtype value) { \
enterJVM(); \
- J3ObjectType::nativeClass(clazz)->asClass()->staticInstance()->set##j3type(fieldID, value); \
+ J3ObjectType::nativeClass(clazz)->asClass()->staticObjectSymbol()->handle()->set##j3type(fieldID, value); \
leaveJVM(); \
} \
\
jtype JNICALL GetStatic##id##Field(JNIEnv* env, jclass clazz, jfieldID fieldID) { \
jtype res; \
enterJVM(); \
- res = J3ObjectType::nativeClass(clazz)->asClass()->staticInstance()->get##j3type(fieldID); \
+ res = J3ObjectType::nativeClass(clazz)->asClass()->staticObjectSymbol()->handle()->get##j3type(fieldID); \
leaveJVM(); \
return res; \
} \
More information about the vmkit-commits
mailing list