[vmkit-commits] [vmkit] r199740 - Use J3StringSymbol to find string at runtime.
Gael Thomas
gael.thomas at lip6.fr
Tue Jan 21 05:23:27 PST 2014
Author: gthomas
Date: Tue Jan 21 07:23:27 2014
New Revision: 199740
URL: http://llvm.org/viewvc/llvm-project?rev=199740&view=rev
Log:
Use J3StringSymbol to find string at runtime.
Modified:
vmkit/branches/mcjit/include/j3/j3class.h
vmkit/branches/mcjit/include/j3/j3classloader.h
vmkit/branches/mcjit/include/j3/j3meta.def
vmkit/branches/mcjit/include/j3/j3symbols.h
vmkit/branches/mcjit/lib/j3/vm/j3class.cc
vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc
vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199740&r1=199739&r2=199740&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Tue Jan 21 07:23:27 2014
@@ -263,7 +263,7 @@ namespace j3 {
double doubleAt(uint16_t idx);
uint32_t integerAt(uint16_t idx);
uint64_t longAt(uint16_t idx);
- J3ObjectHandle* stringAt(uint16_t idx, bool doPush);
+ J3StringSymbol* stringAt(uint16_t idx);
J3ObjectType* classAt(uint16_t idx);
J3Method* interfaceMethodAt(uint16_t idx, uint16_t access);
J3Method* methodAt(uint16_t idx, uint16_t access);
Modified: vmkit/branches/mcjit/include/j3/j3classloader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=199740&r1=199739&r2=199740&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3classloader.h (original)
+++ vmkit/branches/mcjit/include/j3/j3classloader.h Tue Jan 21 07:23:27 2014
@@ -44,6 +44,7 @@ namespace j3 {
J3ObjectHandle* _javaClassLoader;
J3GlobalReferences _globalReferences;
+ vmkit::LockedStack<J3ObjectHandle> _staticObjectHandles;
vmkit::LockedStack<J3StaticObjectSymbol> _staticObjects;
pthread_mutex_t _mutexClasses;
@@ -61,9 +62,12 @@ namespace j3 {
pthread_mutex_t _mutexNativeLibraries;
std::vector<void*, vmkit::StdAllocator<void*> > nativeLibraries;
+ size_t _stringSymbolCounter;
public:
J3ClassLoader(J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator);
+ J3StringSymbol* newStringSymbol(J3ObjectHandle* handle);
+
uint32_t compilationMode() { return _compilationMode; }
void setCompilationMode(uint32_t mode) { _compilationMode = mode; }
@@ -81,6 +85,8 @@ namespace j3 {
uint32_t interfaceIndex(J3Method* signature);
J3GlobalReferences* globalReferences() { return &_globalReferences; }
+
+ vmkit::LockedStack<J3ObjectHandle>* staticObjectHandles() { return &_staticObjectHandles; }
vmkit::LockedStack<J3StaticObjectSymbol>* staticObjects() { return &_staticObjects; }
static J3ClassLoader* nativeClassLoader(J3ObjectHandle* jloader);
Modified: vmkit/branches/mcjit/include/j3/j3meta.def
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=199740&r1=199739&r2=199740&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3meta.def (original)
+++ vmkit/branches/mcjit/include/j3/j3meta.def Tue Jan 21 07:23:27 2014
@@ -1,7 +1,6 @@
_x(funcJ3TypeVT, "j3::J3Type::vt()")
_x(funcJ3ObjectTypeResolve, "j3::J3Type::resolve()")
_x(funcJ3ObjectTypeInitialise, "j3::J3Type::initialise()")
-_x(funcJ3ClassStringAt, "j3::J3Class::stringAt(unsigned short, bool)")
_x(funcJ3TypeJavaClass, "j3::J3Type::javaClass(bool, j3::J3ObjectHandle*)")
_x(funcJniEnv, "j3::J3::jniEnv()")
_x(funcJ3ArrayObjectMultianewArray, "j3::J3ArrayObject::multianewArray(j3::J3ArrayClass*, unsigned int, unsigned int*)")
Modified: vmkit/branches/mcjit/include/j3/j3symbols.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3symbols.h?rev=199740&r1=199739&r2=199740&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3symbols.h (original)
+++ vmkit/branches/mcjit/include/j3/j3symbols.h Tue Jan 21 07:23:27 2014
@@ -2,16 +2,6 @@
#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 {
const char* _id;
J3VirtualTable* _vt;
@@ -28,21 +18,37 @@ namespace j3 {
};
class J3StaticObjectSymbol : public vmkit::Symbol {
- const char* _id;
- J3ObjectHandle _handle;
+ const char* _id;
+ J3ObjectHandle* _handle;
public:
- J3StaticObjectSymbol() {}
+ J3StaticObjectSymbol(J3ObjectHandle* handle) { _handle = handle; }
void* operator new(size_t n, vmkit::LockedStack<J3StaticObjectSymbol>* stack) { return stack->push(); }
- J3ObjectHandle* handle() { return &_handle; }
+ J3ObjectHandle* handle() { return _handle; }
const char* id() { return _id; }
void* getSymbolAddress() { return handle(); }
void setId(const char* id) { _id = id; }
- void setHandle(J3ObjectHandle* handle) { _handle = *handle; }
+ void setHandle(J3ObjectHandle* handle) { *_handle = *handle; }
};
+
+ /* only symbol accessed with a load because unification implies that the string can not be relocated if it is already defined */
+ class J3StringSymbol : public vmkit::Symbol {
+ J3ObjectHandle* _handle;
+ char* _id;
+ public:
+ J3StringSymbol(char* id, J3ObjectHandle* handle) { _id = id; _handle = handle; }
+
+ void* operator new(size_t n, vmkit::BumpAllocator* allocator) { return allocator->allocate(n); }
+
+ char* id() { return _id; }
+ J3ObjectHandle* handle() { return _handle; }
+
+ void* getSymbolAddress() { return &_handle; }
+ };
+
}
#endif
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=199740&r1=199739&r2=199740&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Tue Jan 21 07:23:27 2014
@@ -336,7 +336,8 @@ J3Class::J3Class(J3ClassLoader* loader,
_source = source;
_bytes = bytes;
status = LOADED;
- _staticObjectSymbol = new(loader->staticObjects()) J3StaticObjectSymbol();
+ /* allocating the J3ObjectHande looks a little strange, but it will become important to reload AOT compiled class loaders */
+ _staticObjectSymbol = new(loader->staticObjects()) J3StaticObjectSymbol(loader->staticObjectHandles()->push());
}
void J3Class::compileAll() {
@@ -565,7 +566,7 @@ void J3Class::doInitialise() {
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;
+ case J3Cst::CONSTANT_String: staticObject->setObject(cur, stringAt(idx)->handle()); break;
default:
J3::classFormatError(this, "invalid ctp entry ConstantAttribute with type %d", getCtpType(idx));
}
@@ -820,13 +821,16 @@ void* J3Class::getCtpResolved(uint16_t i
return ctpResolved[idx];
}
-J3ObjectHandle* J3Class::stringAt(uint16_t idx, bool doPush) {
+J3StringSymbol* J3Class::stringAt(uint16_t idx) {
check(idx, J3Cst::CONSTANT_String);
- J3ObjectHandle* res = (J3ObjectHandle*)ctpResolved[idx];
+ J3StringSymbol* res = (J3StringSymbol*)ctpResolved[idx];
+
if(!res) {
- ctpResolved[idx] = res = J3Thread::get()->vm()->nameToString(nameAt(ctpValues[idx]), 0);
+ ctpResolved[idx] = res = loader()->newStringSymbol(J3Thread::get()->vm()->nameToString(nameAt(ctpValues[idx]), 0));
+ loader()->addSymbol(res->id(), res);
}
- return (J3ObjectHandle*)res;
+
+ return res;
}
float J3Class::floatAt(uint16_t 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=199740&r1=199739&r2=199740&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Tue Jan 21 07:23:27 2014
@@ -24,6 +24,7 @@ J3ClassLoader::J3InterfaceMethodLess J3C
J3ClassLoader::J3ClassLoader(J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator)
: CompilationUnit(allocator, "class-loader"),
_globalReferences(allocator),
+ _staticObjectHandles(allocator),
_staticObjects(allocator),
classes(vmkit::Name::less, allocator),
types(vmkit::Name::less, allocator),
@@ -39,6 +40,16 @@ J3ClassLoader::J3ClassLoader(J3ObjectHan
_javaClassLoader = globalReferences()->add(javaClassLoader);
}
+J3StringSymbol* J3ClassLoader::newStringSymbol(J3ObjectHandle* handle) {
+ size_t num = __sync_fetch_and_add(&_stringSymbolCounter, 1);
+ char buf[256];
+ snprintf(buf, 256, "jstr%lu", num);
+ size_t len = strlen(buf);
+ char* id = (char*)allocator()->allocate(len+1);
+ memcpy(id, buf, len+1);
+ return new(allocator()) J3StringSymbol(id, handle);
+}
+
void J3ClassLoader::addNativeLibrary(void* handle) {
pthread_mutex_lock(&_mutexNativeLibraries);
nativeLibraries.push_back(handle);
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=199740&r1=199739&r2=199740&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Tue Jan 21 07:23:27 2014
@@ -717,10 +717,7 @@ void J3CodeGen::ldc(uint32_t idx) {
case J3Cst::CONSTANT_Double: res = llvm::ConstantFP::get(builder.getDoubleTy(), cl->doubleAt(idx)); break;
case J3Cst::CONSTANT_Class: res = handleToObject(javaClass(cl->classAt(idx), 0)); break;
case J3Cst::CONSTANT_String:
- res = handleToObject(builder.CreateCall3(funcJ3ClassStringAt,
- typeDescriptor(cl, vm->typeJ3ClassPtr),
- builder.getInt16(idx),
- builder.getInt1(0)));
+ res = handleToObject(builder.CreateLoad(module->getOrInsertGlobal(cl->stringAt(idx)->id(), vm->typeJ3ObjectHandlePtr)));
break;
default:
J3::classFormatError(cl, "wrong ldc type: %d\n", cl->getCtpType(idx));
More information about the vmkit-commits
mailing list