From gael.thomas at lip6.fr Wed Jan 1 13:29:08 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Wed, 01 Jan 2014 21:29:08 -0000 Subject: [vmkit-commits] [vmkit] r198282 - As MCJIT does not implement properly runFunction, generate a function Message-ID: <20140101212908.AA8032A6C029@llvm.org> Author: gthomas Date: Wed Jan 1 15:29:07 2014 New Revision: 198282 URL: http://llvm.org/viewvc/llvm-project?rev=198282&view=rev Log: As MCJIT does not implement properly runFunction, generate a function gate to interact with JITted code from C++ code for each llvm signature. Basically, each J3MethodType as an associated J3LLVMSignature. The J3LLVMSignature contains a llvm function type and a gate. When a function f with a given signature S is JITted, verifies whether the gate for S was already generated. If it is not the case, generate the gate for S when we generate f. As now, a Java object is represented by a J3Object*, whatever the type of the Java object, the number of gates should not be too crazy. The gate takes in charge the transformation between a J3ObjectHandle and a J3Object and totally hides J3Object to the caller. Added: vmkit/branches/mcjit/include/j3/j3signature.h vmkit/branches/mcjit/lib/j3/vm/j3signature.cc 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/j3field.h vmkit/branches/mcjit/include/j3/j3meta.def vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/include/j3/j3typesdef.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/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3field.cc vmkit/branches/mcjit/lib/j3/vm/j3jni.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3thread.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=198282&r1=198281&r2=198282&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Wed Jan 1 15:29:07 2014 @@ -8,6 +8,7 @@ #include "vmkit/vmkit.h" #include "vmkit/allocator.h" +#include "j3/j3signature.h" #include "j3/j3options.h" #include "j3/j3typesdef.h" #include "j3/j3jni.h" @@ -28,20 +29,24 @@ namespace j3 { typedef std::map, vmkit::StdAllocator > > StringMap; - static vmkit::T_ptr_less_t charArrayLess; + typedef std::map, + vmkit::StdAllocator > > SignatureMap; - J3Options _options; + static vmkit::T_ptr_less_t charArrayLess; + static vmkit::T_ptr_less_t llvmFunctionTypeLess; - pthread_mutex_t stringsMutex; - vmkit::NameMap::map nameToCharArrays; - StringMap charArrayToStrings; - vmkit::Names _names; + J3Options _options; + + pthread_mutex_t stringsMutex; + vmkit::NameMap::map nameToCharArrays; + StringMap charArrayToStrings; + vmkit::Names _names; void introspect(); J3(vmkit::BumpAllocator* allocator); public: - J3InitialClassLoader* initialClassLoader; + J3InitialClassLoader* initialClassLoader; static J3* create(); @@ -51,6 +56,7 @@ namespace j3 { #undef defPrimitive J3MonitorManager monitorManager; + SignatureMap llvmSignatures; /* protected by the lock of the compiler */ void* interfaceTrampoline; @@ -60,17 +66,20 @@ namespace j3 { J3ArrayClass* charArrayClass; J3Class* stringClass; - J3Method* stringInit; - J3Field* stringValue; + J3Method* stringClassInit; + J3Field* stringClassValue; J3Class* classClass; - J3Method* classInit; - J3Field* classVMData; + J3Method* classClassInit; + J3Field* classClassVMData; - J3Field* threadVMData; - J3Method* threadRun; + J3Field* threadClassVMData; + J3Method* threadClassRun; J3Class* fieldClass; + J3Field* fieldClassClass; + J3Field* fieldClassSlot; + J3Method* fieldClassInit; const vmkit::Name* codeAttr; const vmkit::Name* constantValueAttr; Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198282&r1=198281&r2=198282&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Wed Jan 1 15:29:07 2014 @@ -46,10 +46,11 @@ namespace j3 { protected: enum { LOADED, RESOLVED, INITED }; - const vmkit::Name* _name; - char* _nativeName; - uint32_t _nativeNameLength; - J3VirtualTable* _vt; + const vmkit::Name* _name; + char* _nativeName; + uint32_t _nativeNameLength; + J3VirtualTable* _vt; + J3ObjectHandle* volatile _javaClass; volatile int status; @@ -60,6 +61,8 @@ namespace j3 { public: J3Type(J3ClassLoader* loader, const vmkit::Name* name); + J3ObjectHandle* javaClass(); + virtual uint32_t logSize() = 0; uint64_t getSizeInBits(); @@ -109,7 +112,6 @@ namespace j3 { }; class J3ObjectType : public J3Type { - J3ObjectHandle* volatile _javaClass; J3InterfaceSlotDescriptor _interfaceSlotDescriptors[J3VirtualTable::nbInterfaceMethodTable]; public: @@ -126,8 +128,6 @@ namespace j3 { bool isObjectType() { return 1; } - J3ObjectHandle* javaClass(); - static J3ObjectType* nativeClass(J3ObjectHandle* handle); void dumpInterfaceSlotDescriptors(); @@ -241,8 +241,11 @@ namespace j3 { J3Method* findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error=1); J3Method* findStaticMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error=1); + J3Field* findVirtualField(const vmkit::Name* name, const J3Type* type, bool error=1); J3Field* findStaticField(const vmkit::Name* name, const J3Type* type, bool error=1); + J3Field* findVirtualField(const wchar_t* name, const J3Type* type, bool error=1); + J3Field* findStaticField(const wchar_t* name, const J3Type* type, bool error=1); }; class J3ArrayClass : public J3ObjectType { @@ -266,9 +269,9 @@ namespace j3 { public: J3Primitive(J3ClassLoader* loader, char id, llvm::Type* type, uint32_t logSize); - uint32_t logSize() { return _logSize; } + uint32_t logSize() { return _logSize; } bool isPrimitive() { return 1; } - llvm::Type* llvmType() { return _llvmType; } + llvm::Type* llvmType() { return _llvmType; } }; } Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=198282&r1=198281&r2=198282&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Wed Jan 1 15:29:07 2014 @@ -84,14 +84,16 @@ namespace j3 { J3* vm() const { return (J3*)vmkit::CompilationUnit::vm(); }; J3Method* method(uint16_t access, J3Class* cl, - const vmkit::Name* name, const vmkit::Name* sign); /* find a method ref */ + const vmkit::Name* name, const vmkit::Name* sign); J3Method* method(uint16_t access, const vmkit::Name* clName, const vmkit::Name* name, const vmkit::Name* sign); + J3Method* method(uint16_t access, J3Class* cl, const wchar_t* name, const wchar_t* sign); J3Method* method(uint16_t access, const wchar_t* clName, const wchar_t* name, const wchar_t* sign); J3Class* defineClass(const vmkit::Name* name, J3ClassBytes* bytes); J3Class* findLoadedClass(const vmkit::Name* name); virtual J3Class* loadClass(const vmkit::Name* name); + J3Class* loadClass(const wchar_t* name); J3Type* getType(J3Class* from, const vmkit::Name* type); /* find a type */ J3MethodType* getMethodType(J3Class* from, const vmkit::Name* sign); /* get a method type */ Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=198282&r1=198281&r2=198282&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Wed Jan 1 15:29:07 2014 @@ -38,6 +38,7 @@ namespace j3 { friend class J3CodeGenVar; friend class J3ExceptionTable; friend class J3ExceptionNode; + friend class J3LLVMSignature; vmkit::BumpAllocator* allocator; llvm::Module* module; Modified: vmkit/branches/mcjit/include/j3/j3field.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3field.h?rev=198282&r1=198281&r2=198282&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3field.h (original) +++ vmkit/branches/mcjit/include/j3/j3field.h Wed Jan 1 15:29:07 2014 @@ -23,11 +23,13 @@ namespace j3 { J3Attributes* _attributes; uintptr_t _offset; J3ObjectHandle* volatile _javaField; + uint32_t _slot; public: J3Field() {} J3Field(uint16_t access, const vmkit::Name* name, J3Type* type) { _access = access; _name = name; _type = type; } + uint32_t slot() const { return _slot; } J3ObjectHandle* javaField(); J3Attributes* attributes() const { return _attributes; } uint16_t access() { return _access; } Modified: vmkit/branches/mcjit/include/j3/j3meta.def URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=198282&r1=198281&r2=198282&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3meta.def (original) +++ vmkit/branches/mcjit/include/j3/j3meta.def Wed Jan 1 15:29:07 2014 @@ -5,7 +5,7 @@ _x(funcJ3TypeInitialise, "j3::J3 _x(funcJ3LayoutStructSize, "j3::J3Layout::structSize()") _x(funcJ3ClassStaticInstance, "j3::J3Class::staticInstance()") _x(funcJ3ClassStringAt, "j3::J3Class::stringAt(unsigned short)") -_x(funcJ3ObjectTypeJavaClass, "j3::J3ObjectType::javaClass()") +_x(funcJ3TypeJavaClass, "j3::J3Type::javaClass()") _x(funcJniEnv, "j3::J3::jniEnv()") _x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)") _x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*)") Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=198282&r1=198281&r2=198282&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Wed Jan 1 15:29:07 2014 @@ -16,6 +16,7 @@ namespace vmkit { } namespace j3 { + class J3LLVMSignature; class J3Type; class J3Attributes; class J3Class; @@ -24,7 +25,7 @@ namespace j3 { class J3ObjectHandle; class J3MethodType : public vmkit::PermanentObject { - llvm::FunctionType* volatile _llvmFunctionType; + J3LLVMSignature* _llvmSignature; J3Type* _out; uint32_t _nbIns; J3Type* _ins[1]; @@ -32,8 +33,8 @@ namespace j3 { public: J3MethodType(J3Type** args, size_t nbArgs); - void setFunctionType(llvm::FunctionType* functionType) { _llvmFunctionType = functionType; } - llvm::FunctionType* functionType() { return _llvmFunctionType; } + void setLLVMSignature(J3LLVMSignature* llvmSignature) { _llvmSignature = llvmSignature; } + J3LLVMSignature* llvmSignature() { return _llvmSignature; } uint32_t nbIns() { return _nbIns; } J3Type* out() { return _out; } J3Type* ins(uint32_t idx) { return _ins[idx]; } @@ -71,6 +72,7 @@ namespace j3 { J3Value internalInvoke(bool statically, J3ObjectHandle* handle, va_list va); J3Value internalInvoke(bool statically, J3ObjectHandle* handle, J3Value* args); + J3Value internalInvoke(bool statically, J3Value* args); void buildLLVMNames(J3Class* from); public: J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, const vmkit::Name* sign); Added: vmkit/branches/mcjit/include/j3/j3signature.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3signature.h?rev=198282&view=auto ============================================================================== --- vmkit/branches/mcjit/include/j3/j3signature.h (added) +++ vmkit/branches/mcjit/include/j3/j3signature.h Wed Jan 1 15:29:07 2014 @@ -0,0 +1,35 @@ +#ifndef _J3_SIGNATURE_H_ +#define _J3_SIGNATURE_H_ + +#include "vmkit/allocator.h" + +namespace llvm { + class FunctionType; + class Module; +} + +namespace j3 { + class J3MethodType; + class J3Type; + class J3Value; + class J3CodeGen; + + class J3LLVMSignature : vmkit::PermanentObject { + friend class J3CodeGen; + + typedef J3Value (*function_t)(void* fn, J3Value* args); + + llvm::FunctionType* _functionType; + function_t _caller; + + void generateCallerIR(J3CodeGen* vm, llvm::Module* module, const char* id); + + J3LLVMSignature(llvm::FunctionType* functionType); + + llvm::FunctionType* functionType() { return _functionType; } + public: + function_t caller() { return _caller; } + }; +} + +#endif Modified: vmkit/branches/mcjit/include/j3/j3typesdef.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3typesdef.h?rev=198282&r1=198281&r2=198282&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3typesdef.h (original) +++ vmkit/branches/mcjit/include/j3/j3typesdef.h Wed Jan 1 15:29:07 2014 @@ -3,6 +3,7 @@ namespace j3 { + /* name, ctype, llvmType, scale size */ #define onJavaPrimitives(_) \ _(Boolean, bool, Int1, 0) \ _(Byte, int8_t, Int8, 0) \ @@ -13,12 +14,12 @@ namespace j3 { _(Float, float, Float, 2) \ _(Double, double, Double, 3) \ -#define onJavaObject(_) \ - _(Object, J3ObjectHandle*, Fatal, 3) - #define onJavaVoid(_) \ _(Void, void, Void, 0) +#define onJavaObject(_) \ + _(Object, J3ObjectHandle*, Fatal, 3) + #define onJavaTypes(_) \ onJavaPrimitives(_) \ onJavaVoid(_) 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=198282&r1=198281&r2=198282&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Wed Jan 1 15:29:07 2014 @@ -387,6 +387,7 @@ jbyteArray JNICALL JVM_GetClassTypeAnnot jobjectArray JNICALL JVM_GetClassDeclaredMethods(JNIEnv* env, jclass ofClass, jboolean publicOnly) { enterJVM(); NYI(); leaveJVM(); } jobjectArray JNICALL JVM_GetClassDeclaredFields(JNIEnv* env, jclass ofClass, jboolean publicOnly) { + NYI(); jobjectArray res; enterJVM(); 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=198282&r1=198281&r2=198282&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Wed Jan 1 15:29:07 2014 @@ -21,13 +21,15 @@ using namespace j3; vmkit::T_ptr_less_t J3::charArrayLess; +vmkit::T_ptr_less_t J3::llvmFunctionTypeLess; J3::J3(vmkit::BumpAllocator* allocator) : VMKit(allocator), nameToCharArrays(vmkit::Name::less, allocator), charArrayToStrings(charArrayLess, allocator), _names(allocator), - monitorManager(allocator) { + monitorManager(allocator), + llvmSignatures(llvmFunctionTypeLess, allocator) { pthread_mutex_init(&stringsMutex, 0); constantValueAttr = names()->get(J3Cst::constantValueAttr); codeAttr = names()->get(J3Cst::codeAttr); @@ -92,29 +94,44 @@ void J3::run() { onJavaTypes(defPrimitive) #undef defPrimitive +#define z_class(clName) initialClassLoader->loadClass(names()->get(clName)) +#define z_method(access, cl, name, sign) initialClassLoader->method(access, cl, name, sign) +#define z_field(access, cl, name, type) J3Cst::isStatic(access) \ + ? cl->findStaticField(name, type) \ + : cl->findVirtualField(name, type); + + nbArrayInterfaces = 2; arrayInterfaces = (J3Type**)initialClassLoader->allocator()->allocate(2*sizeof(J3Type*)); - arrayInterfaces[0] = initialClassLoader->loadClass(names()->get(L"java/lang/Cloneable")); - arrayInterfaces[1] = initialClassLoader->loadClass(names()->get(L"java/io/Serializable")); + arrayInterfaces[0] = z_class(L"java/lang/Cloneable"); + arrayInterfaces[1] = z_class(L"java/io/Serializable"); charArrayClass = typeChar->getArray(); - objectClass = initialClassLoader->loadClass(names()->get(L"java/lang/Object")); + objectClass = z_class(L"java/lang/Object"); - stringClass = initialClassLoader->loadClass(names()->get(L"java/lang/String")); - stringInit = initialClassLoader->method(0, stringClass, initName, names()->get(L"([CZ)V")); - stringValue = stringClass->findVirtualField(names()->get(L"value"), typeChar->getArray()); + stringClass = z_class(L"java/lang/String"); + stringClassInit = z_method(0, stringClass, J3Cst::initName, L"([CZ)V"); + stringClassValue = z_field(0, stringClass, L"value", charArrayClass); - classClass = initialClassLoader->loadClass(names()->get(L"java/lang/Class")); + classClass = z_class(L"java/lang/Class"); J3Field hf(J3Cst::ACC_PRIVATE, names()->get(L"** vmData **"), typeLong); classClass->resolve(&hf, 1); - classInit = initialClassLoader->method(0, classClass, initName, names()->get(L"()V")); - classVMData = classClass->findVirtualField(hf.name(), hf.type()); + classClassInit = z_method(0, classClass, J3Cst::initName, L"()V"); + classClassVMData = z_field(0, classClass, hf.name(), hf.type()); - threadVMData = initialClassLoader->loadClass(names()->get("java/lang/Thread")) + threadClassRun = z_method(0, z_class(L"java/lang/Thread"), L"run", L"()V"); + threadClassVMData = initialClassLoader->loadClass(names()->get("java/lang/Thread")) ->findVirtualField(names()->get(L"eetop"), typeLong); - threadRun = initialClassLoader->method(0, L"java/lang/Thread", L"run", L"()V"); - fieldClass = initialClassLoader->loadClass(names()->get("java/lang/reflect/Field")); + fieldClass = z_class(L"java/lang/reflect/Field"); + fieldClassInit = z_method(0, fieldClass, J3Cst::initName, + L"(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;IILjava/lang/String;[B)V"); + fieldClassClass = z_field(0, fieldClass, L"clazz", classClass); + fieldClassSlot = z_field(0, fieldClass, L"slot", typeInteger); +#if 0 + J3Field* fieldClassSlot; + J3Method* fieldClassInit; +#endif J3Lib::bootstrap(this); } @@ -131,7 +148,7 @@ J3ObjectHandle* J3::arrayToString(J3Obje res = initialClassLoader->globalReferences()->add(J3ObjectHandle::doNewObject(stringClass)); J3Thread::get()->restore(prev); - stringInit->invokeSpecial(res, array, 0); + stringClassInit->invokeSpecial(res, array, 0); charArrayToStrings[array] = res; } @@ -234,7 +251,9 @@ void J3::printStackTrace() { } void J3::forceSymbolDefinition() { + J3Value val; J3ArrayObject a; a.length(); /* J3ArrayObject */ + printf("---> %p\n", &val.valFloat); J3LockRecord* l = new J3LockRecord(); /* J3LockRecord */ try { throw (void*)0; 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=198282&r1=198281&r2=198282&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Wed Jan 1 15:29:07 2014 @@ -49,6 +49,21 @@ void J3Type::dump() { fprintf(stderr, "Type: %ls", name()->cStr()); } +J3ObjectHandle* J3Type::javaClass() { + if(!_javaClass) { + lock(); + if(!_javaClass) { + J3ObjectHandle* prev = J3Thread::get()->tell(); + _javaClass = loader()->globalReferences()->add(J3ObjectHandle::doNewObject(loader()->vm()->classClass)); + J3Thread::get()->restore(prev); + javaClass()->setLong(loader()->vm()->classClassVMData, (int64_t)(uintptr_t)this); + loader()->vm()->classClassInit->invokeSpecial(javaClass()); + } + unlock(); + } + return _javaClass; +} + void J3Type::doNativeName() { J3::internalError(L"should not happen"); } @@ -162,22 +177,7 @@ J3Method* J3ObjectType::findStaticMethod } J3ObjectType* J3ObjectType::nativeClass(J3ObjectHandle* handle) { - return (J3ObjectType*)(uintptr_t)handle->getLong(J3Thread::get()->vm()->classVMData); -} - -J3ObjectHandle* J3ObjectType::javaClass() { - if(!_javaClass) { - lock(); - if(!_javaClass) { - J3ObjectHandle* prev = J3Thread::get()->tell(); - _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()); - } - unlock(); - } - return _javaClass; + return (J3ObjectType*)(uintptr_t)handle->getLong(J3Thread::get()->vm()->classClassVMData); } void J3ObjectType::prepareInterfaceTable() { @@ -362,6 +362,14 @@ J3Field* J3Class::findStaticField(const return res; } +J3Field* J3Class::findVirtualField(const wchar_t* name, const J3Type* type, bool error) { + return findVirtualField(loader()->vm()->names()->get(name), type, error); +} + +J3Field* J3Class::findStaticField(const wchar_t* name, const J3Type* type, bool error) { + return findStaticField(loader()->vm()->names()->get(name), type, error); +} + void J3Class::registerNative(const vmkit::Name* methName, const vmkit::Name* methSign, void* fnPtr) { resolve(); J3Method* res = staticLayout()->findMethod(methName, methSign); @@ -632,6 +640,7 @@ void J3Class::fillFields(J3Field** field layout = this; } cur->_offset = layout->structSize(); + cur->_slot = i; layout->_structSize += 1 << fields[i]->type()->logSize(); layout->fields()[layout->_nbFields++] = *fields[i]; 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=198282&r1=198281&r2=198282&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Wed Jan 1 15:29:07 2014 @@ -87,6 +87,10 @@ J3Class* J3ClassLoader::loadClass(const J3::internalError(L"implement me: loadClass from a Java class loader"); } +J3Class* J3ClassLoader::loadClass(const wchar_t* name) { + return loadClass(vm()->names()->get(name)); +} + void J3ClassLoader::wrongType(J3Class* from, const vmkit::Name* type) { J3::classFormatError(from, L"wrong type: %ls", type->cStr()); } @@ -226,6 +230,11 @@ J3Method* J3ClassLoader::method(uint16_t return method(access, names->get(clName), names->get(name), names->get(sign)); } +J3Method* J3ClassLoader::method(uint16_t access, J3Class* cl, const wchar_t* name, const wchar_t* sign) { + vmkit::Names* names = vm()->names(); + return method(access, cl, names->get(name), names->get(sign)); +} + bool J3ClassLoader::J3InterfaceMethodLess::operator()(j3::J3Method const* lhs, j3::J3Method const* rhs) const { return lhs->name() < rhs->name() || (lhs->name() == rhs->name() 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=198282&r1=198281&r2=198282&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Wed Jan 1 15:29:07 2014 @@ -102,9 +102,17 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato if(vm->options()->debugTranslate > 3) llvmFunction->dump(); + if(!methodType->llvmSignature()->caller()) + methodType->llvmSignature()->generateCallerIR(this, module, "generic-caller"); + loader->compileModule(module); void* fnPtr = (void*)loader->ee()->getFunctionAddress(llvmFunction->getName().data()); + if(!methodType->llvmSignature()->caller()) { + J3LLVMSignature::function_t caller = (J3LLVMSignature::function_t)loader->ee()->getFunctionAddress("generic-caller"); + methodType->llvmSignature()->_caller = caller; + } + method->markCompiled(llvmFunction, fnPtr); } @@ -176,16 +184,19 @@ llvm::Value* J3CodeGen::unflatten(llvm:: } llvm::FunctionType* J3CodeGen::llvmFunctionType(J3MethodType* type) { - llvm::FunctionType* res = type->functionType(); + J3LLVMSignature* res = type->llvmSignature(); if(!res) { std::vector in; for(uint32_t i=0; inbIns(); i++) in.push_back(type->ins(i)->llvmType()); - res = llvm::FunctionType::get(type->out()->llvmType(), in, 0); - type->setFunctionType(res); + llvm::FunctionType* funcType = llvm::FunctionType::get(type->out()->llvmType(), in, 0); + res = vm->llvmSignatures[funcType]; + if(!res) + vm->llvmSignatures[funcType] = res = new(vm->allocator()) J3LLVMSignature(funcType); + type->setLLVMSignature(res); } - return res; + return res->functionType(); } llvm::Function* J3CodeGen::buildFunction(J3Method* method, bool isStub) { @@ -316,7 +327,7 @@ void J3CodeGen::initialiseJ3ObjectType(J } llvm::Value* J3CodeGen::javaClass(J3ObjectType* type) { - return builder->CreateCall(funcJ3ObjectTypeJavaClass, typeDescriptor(type, vm->typeJ3ObjectTypePtr)); + return builder->CreateCall(funcJ3TypeJavaClass, typeDescriptor(type, vm->typeJ3TypePtr)); } llvm::Value* J3CodeGen::handleToObject(llvm::Value* obj) { Modified: vmkit/branches/mcjit/lib/j3/vm/j3field.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3field.cc?rev=198282&r1=198281&r2=198282&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3field.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3field.cc Wed Jan 1 15:29:07 2014 @@ -2,13 +2,31 @@ #include "j3/j3class.h" #include "j3/j3classloader.h" #include "j3/j3.h" +#include "j3/j3method.h" +#include "j3/j3thread.h" using namespace j3; J3ObjectHandle* J3Field::javaField() { if(!_javaField) { layout()->lock(); - _javaField = J3ObjectHandle::doNewObject(layout()->loader()->vm()->fieldClass); + + J3ObjectHandle* prev = J3Thread::get()->tell(); + _javaField = layout()->loader()->globalReferences()->add(J3ObjectHandle::doNewObject(layout()->loader()->vm()->fieldClass)); + + J3* vm = layout()->loader()->vm(); + + vm->fieldClassInit->invokeSpecial(_javaField, /* this */ + 0,//layout()->javaClass(), /* declaring class */ + 0,//vm->nameToString(name()), /* name */ + 0,//type()->javaClass(), /* type */ + 0,//access(), /* access */ + 0,//slot(), /* slot */ + 0,//vm->nameToString(type()->name()), /* signature */ + 0); /* annotations */ + + + J3Thread::get()->restore(prev); J3::internalError(L"implement me: javaField"); layout()->unlock(); } 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=198282&r1=198281&r2=198282&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Wed Jan 1 15:29:07 2014 @@ -378,7 +378,7 @@ const char* JNICALL GetStringUTFChars(JN enterJVM(); J3* vm = str->vt()->type()->loader()->vm(); - jobject content = str->getObject(vm->stringValue); + jobject content = str->getObject(vm->stringClassValue); uint32_t length = content->arrayLength(); res = new char[length+1]; 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=198282&r1=198281&r2=198282&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Wed Jan 1 15:29:07 2014 @@ -112,115 +112,62 @@ J3Method* J3Method::resolve(J3ObjectHand return obj->vt()->type()->asObjectType()->findVirtualMethod(name(), sign()); } +J3Value J3Method::internalInvoke(bool statically, J3Value* inArgs) { + J3Method* target = statically ? this : resolve(inArgs[0].valObject); -J3Value J3Method::internalInvoke(bool statically, J3ObjectHandle* handle, J3Value* inArgs) { - std::vector args(methodType()->nbIns()); - J3* vm = cl()->loader()->vm(); - J3Type* cur; - uint32_t i = 0, d = 0; - - if(handle) { - args[i++].PointerVal = handle->obj(); - d = 1; - } - - for(; inbIns(); i++) { /* have to avoid collection at this point */ - cur = methodType()->ins(i); - - if(cur == vm->typeBoolean) - args[i].IntVal = inArgs[i-d].valBoolean; - else if(cur == vm->typeByte) - args[i].IntVal = inArgs[i-d].valByte; - else if(cur == vm->typeShort) - args[i].IntVal = inArgs[i-d].valShort; - else if(cur == vm->typeChar) - args[i].IntVal = inArgs[i-d].valChar; - else if(cur == vm->typeInteger) - args[i].IntVal = inArgs[i-d].valInteger; - else if(cur == vm->typeLong) - args[i].IntVal = inArgs[i-d].valLong; - else if(cur == vm->typeFloat) - args[i].FloatVal = inArgs[i-d].valFloat; - else if(cur == vm->typeDouble) - args[i].FloatVal = inArgs[i-d].valDouble; - else - args[i].PointerVal = inArgs[i-d].valObject->obj(); - } - - J3Method* target; + void* fn = fnPtr(); - if(statically) - target = this; - else { - J3ObjectHandle* self = handle ? handle : inArgs[0].valObject; - 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()->vm()->lockCompiler(); - cl()->loader()->oldee()->updateGlobalMapping(target->_llvmFunction, target->fnPtr()); - cl()->loader()->vm()->unlockCompiler(); - llvm::GenericValue res = cl()->loader()->oldee()->runFunction(target->_llvmFunction, args); - - J3Value holder; - cur = methodType()->out(); + //fprintf(stderr, "Internal invoke %ls::%ls%ls\n", target->cl()->name()->cStr(), target->name()->cStr(), target->sign()->cStr()); - if(cur == vm->typeBoolean) - holder.valBoolean = (bool)res.IntVal.getZExtValue(); - else if(cur == vm->typeByte) - holder.valByte = (int8_t)res.IntVal.getZExtValue(); - else if(cur == vm->typeShort) - holder.valShort = (int16_t)res.IntVal.getZExtValue(); - else if(cur == vm->typeChar) - holder.valChar = (uint16_t)res.IntVal.getZExtValue(); - else if(cur == vm->typeInteger) - holder.valInteger = (int32_t)res.IntVal.getZExtValue(); - else if(cur == vm->typeLong) - holder.valLong = res.IntVal.getZExtValue(); - else if(cur == vm->typeFloat) - holder.valFloat = res.FloatVal; - else if(cur == vm->typeDouble) - holder.valDouble = res.FloatVal; - else if(cur != vm->typeVoid) - holder.valObject = J3Thread::get()->push((J3Object*)res.PointerVal); + J3Value res = methodType()->llvmSignature()->caller()(fn, inArgs); + + return res; +} - return holder; +J3Value J3Method::internalInvoke(bool statically, J3ObjectHandle* handle, J3Value* inArgs) { + J3Value* reIn; + if(handle) { + reIn = (J3Value*)alloca(methodType()->nbIns()*sizeof(J3Value)); + reIn[0].valObject = handle; + memcpy(reIn+1, inArgs, (methodType()->nbIns() - 1)*sizeof(J3Value)); + } else + reIn = inArgs; + return internalInvoke(statically, reIn); } J3Value J3Method::internalInvoke(bool statically, J3ObjectHandle* handle, va_list va) { J3Value* args = (J3Value*)alloca(sizeof(J3Value)*methodType()->nbIns()); J3* vm = cl()->loader()->vm(); J3Type* cur; - uint32_t i = 0, d = 0; + uint32_t i = 0; if(handle) - i = d = 1; + args[i++].valObject = handle; for(; inbIns(); i++) { cur = methodType()->ins(i); if(cur == vm->typeBoolean) - args[i-d].valBoolean = va_arg(va, bool); + args[i].valBoolean = va_arg(va, bool); else if(cur == vm->typeByte) - args[i-d].valByte = va_arg(va, int8_t); + args[i].valByte = va_arg(va, int8_t); else if(cur == vm->typeShort) - args[i-d].valShort = va_arg(va, int16_t); + args[i].valShort = va_arg(va, int16_t); else if(cur == vm->typeChar) - args[i-d].valChar = va_arg(va, uint16_t); + args[i].valChar = va_arg(va, uint16_t); else if(cur == vm->typeInteger) - args[i-d].valInteger = va_arg(va, int32_t); + args[i].valInteger = va_arg(va, int32_t); else if(cur == vm->typeLong) - args[i-d].valLong = va_arg(va, int64_t); + args[i].valLong = va_arg(va, int64_t); else if(cur == vm->typeFloat) - args[i-d].valFloat = va_arg(va, float); + args[i].valFloat = va_arg(va, float); else if(cur == vm->typeDouble) - args[i-d].valDouble = va_arg(va, double); + args[i].valDouble = va_arg(va, double); else - args[i-d].valObject = va_arg(va, J3ObjectHandle*); + args[i].valObject = va_arg(va, J3ObjectHandle*); } - return internalInvoke(statically, handle, args); + return internalInvoke(statically, args); } J3Value J3Method::invokeStatic(J3Value* args) { Added: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=198282&view=auto ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (added) +++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Wed Jan 1 15:29:07 2014 @@ -0,0 +1,78 @@ +#include "j3/j3signature.h" +#include "j3/j3object.h" +#include "j3/j3codegen.h" +#include "j3/j3.h" + +#include "llvm/IR/Function.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/IRBuilder.h" + +using namespace j3; + +J3LLVMSignature::J3LLVMSignature(llvm::FunctionType* functionType) { + _functionType = functionType; +} + +void J3LLVMSignature::generateCallerIR(J3CodeGen* codeGen, llvm::Module* module, const char* id) { + llvm::Type* uint64Ty = llvm::Type::getInt64Ty(module->getContext()); + llvm::Type* callerIn[] = { llvm::Type::getInt8Ty(module->getContext())->getPointerTo(), + uint64Ty->getPointerTo() }; + llvm::Function* caller = (llvm::Function*)module->getOrInsertFunction(id, llvm::FunctionType::get(uint64Ty, callerIn, 0)); + llvm::BasicBlock* bb = llvm::BasicBlock::Create(caller->getContext(), "entry", caller); + llvm::IRBuilder<> builder(bb); + + llvm::Function::arg_iterator cur = caller->arg_begin(); + llvm::Value* method = builder.CreateBitCast(cur++, _functionType->getPointerTo()); + llvm::Value* ins = cur; + + llvm::Value* one = builder.getInt32(1); + llvm::Value* gepHandle[] = { builder.getInt32(0), builder.getInt32(J3ObjectHandle::gepObj) }; + + std::vector params; + + for(llvm::FunctionType::param_iterator it=_functionType->param_begin(); it!=_functionType->param_end(); it++) { + llvm::Type* t = *it; + llvm::Value* arg; + + if(t->isPointerTy()) + arg = builder.CreateLoad(builder.CreateGEP(builder.CreateIntToPtr(builder.CreateLoad(ins), + codeGen->vm->typeJ3ObjectHandlePtr), gepHandle)); + else { + arg = builder.CreateLoad(builder.CreateTruncOrBitCast(ins, t->getPointerTo())); + } + + params.push_back(arg); + ins = builder.CreateGEP(ins, one); + } + + llvm::Value* res = builder.CreateCall(method, params); + llvm::Type* ret = _functionType->getReturnType(); + + if(ret != builder.getVoidTy()) { + if(ret->isPointerTy()) { + codeGen->builder = &builder; + + llvm::BasicBlock* ifnull = llvm::BasicBlock::Create(caller->getContext(), "ifnull", caller); + llvm::BasicBlock* ifnotnull = llvm::BasicBlock::Create(caller->getContext(), "ifnotnull", caller); + builder.CreateCondBr(builder.CreateIsNull(res), ifnull, ifnotnull); + + builder.SetInsertPoint(ifnull); + builder.CreateRet(builder.getInt64(0)); + + builder.SetInsertPoint(ifnotnull); + codeGen->currentThread(); + res = builder.CreatePtrToInt(builder.CreateCall2(codeGen->funcJ3ThreadPush, codeGen->currentThread(), res), + uint64Ty); + } else { + if(ret->isFloatTy()) { + llvm::Value* tmp = builder.CreateAlloca(ret); + builder.CreateStore(res, tmp); + res = builder.CreateLoad(builder.CreateBitCast(tmp, builder.getInt32Ty()->getPointerTo())); + } + res = builder.CreateZExtOrBitCast(res, uint64Ty); + } + } else + res = builder.getInt64(0); + + builder.CreateRet(res); +} 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=198282&r1=198281&r2=198282&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3thread.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3thread.cc Wed Jan 1 15:29:07 2014 @@ -21,12 +21,12 @@ J3Thread::~J3Thread() { void J3Thread::doRun() { J3ObjectHandle* handle = get()->javaThread(); - get()->vm()->threadRun->invokeVirtual(handle); + get()->vm()->threadClassRun->invokeVirtual(handle); } void J3Thread::run() { J3ObjectHandle* handle = javaThread(); - vm()->threadRun->invokeVirtual(handle); + vm()->threadClassRun->invokeVirtual(handle); } void J3Thread::start(J3ObjectHandle* handle) { @@ -62,12 +62,12 @@ void J3Thread::ensureCapacity(uint32_t c } J3Thread* J3Thread::nativeThread(J3ObjectHandle* handle) { - return (J3Thread*)handle->getLong(get()->vm()->threadVMData); + return (J3Thread*)handle->getLong(get()->vm()->threadClassVMData); } void J3Thread::assocJavaThread(J3ObjectHandle* javaThread) { _javaThread = *javaThread; - _javaThread.setLong(vm()->threadVMData, (int64_t)(uintptr_t)this); + _javaThread.setLong(vm()->threadClassVMData, (int64_t)(uintptr_t)this); } J3ObjectHandle* J3Thread::push(J3ObjectHandle* handle) { From gael.thomas at lip6.fr Wed Jan 1 13:39:59 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Wed, 01 Jan 2014 21:39:59 -0000 Subject: [vmkit-commits] [vmkit] r198283 - The old JIT is completely removed! Message-ID: <20140101213959.6D6E72A6C029@llvm.org> Author: gthomas Date: Wed Jan 1 15:39:59 2014 New Revision: 198283 URL: http://llvm.org/viewvc/llvm-project?rev=198283&view=rev Log: The old JIT is completely removed! Modified: vmkit/branches/mcjit/include/j3/j3classloader.h vmkit/branches/mcjit/include/vmkit/compiler.h vmkit/branches/mcjit/lib/vmkit/compiler.cc Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=198283&r1=198282&r2=198283&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Wed Jan 1 15:39:59 2014 @@ -14,10 +14,6 @@ namespace vmkit { class Symbol; } -namespace llvm { - class ExecutionEngine; -} - namespace j3 { class J3ZipArchive; class J3ClassBytes; @@ -63,9 +59,6 @@ namespace j3 { pthread_mutex_t _mutexMethods; MethodRefMap methods; /* all te known method */ - llvm::ExecutionEngine* _ee; - llvm::ExecutionEngine* _oldee; - void wrongType(J3Class* from, const vmkit::Name* type); J3Type* getTypeInternal(J3Class* from, const vmkit::Name* type, uint32_t start, uint32_t* end); Modified: vmkit/branches/mcjit/include/vmkit/compiler.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/compiler.h?rev=198283&r1=198282&r2=198283&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/compiler.h (original) +++ vmkit/branches/mcjit/include/vmkit/compiler.h Wed Jan 1 15:39:59 2014 @@ -42,7 +42,6 @@ namespace vmkit { SymbolMap _symbolTable; pthread_mutex_t _mutexSymbolTable; llvm::ExecutionEngine* _ee; - llvm::ExecutionEngine* _oldee; llvm::PassManager* pm; protected: @@ -64,7 +63,6 @@ namespace vmkit { BumpAllocator* allocator() { return _allocator; } llvm::ExecutionEngine* ee() { return _ee; } - llvm::ExecutionEngine* oldee() { return _oldee; } void compileModule(llvm::Module* module); }; Modified: vmkit/branches/mcjit/lib/vmkit/compiler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/compiler.cc?rev=198283&r1=198282&r2=198283&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/compiler.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/compiler.cc Wed Jan 1 15:39:59 2014 @@ -58,15 +58,6 @@ CompilationUnit::CompilationUnit(BumpAll ee()->finalizeObject(); - _oldee = llvm::EngineBuilder(new llvm::Module("old ee", Thread::get()->vm()->llvmContext())) - .setErrorStr(&err) - .create(); - - if (!oldee()) - Thread::get()->vm()->internalError(L"Error while creating execution engine: %s\n", err.c_str()); - - oldee()->DisableLazyCompilation(0); - pm = new llvm::PassManager(); //pm->add(new llvm::TargetData(*ee->getTargetData())); @@ -112,7 +103,6 @@ CompilationUnit::CompilationUnit(BumpAll CompilationUnit::~CompilationUnit() { delete pm; delete _ee; - delete _oldee; } void CompilationUnit::destroy(CompilationUnit* unit) { From gael.thomas at lip6.fr Wed Jan 1 13:52:59 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Wed, 01 Jan 2014 21:52:59 -0000 Subject: [vmkit-commits] [vmkit] r198285 - I forgot to handle the case where a J3ObjectHandle is null in the caller gate Message-ID: <20140101215259.C943D2A6C029@llvm.org> Author: gthomas Date: Wed Jan 1 15:52:59 2014 New Revision: 198285 URL: http://llvm.org/viewvc/llvm-project?rev=198285&view=rev Log: I forgot to handle the case where a J3ObjectHandle is null in the caller gate Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3signature.cc 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=198285&r1=198284&r2=198285&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Wed Jan 1 15:52:59 2014 @@ -387,7 +387,6 @@ jbyteArray JNICALL JVM_GetClassTypeAnnot jobjectArray JNICALL JVM_GetClassDeclaredMethods(JNIEnv* env, jclass ofClass, jboolean publicOnly) { enterJVM(); NYI(); leaveJVM(); } jobjectArray JNICALL JVM_GetClassDeclaredFields(JNIEnv* env, jclass ofClass, jboolean publicOnly) { - NYI(); jobjectArray res; enterJVM(); Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=198285&r1=198284&r2=198285&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Wed Jan 1 15:52:59 2014 @@ -34,10 +34,28 @@ void J3LLVMSignature::generateCallerIR(J llvm::Type* t = *it; llvm::Value* arg; - if(t->isPointerTy()) - arg = builder.CreateLoad(builder.CreateGEP(builder.CreateIntToPtr(builder.CreateLoad(ins), - codeGen->vm->typeJ3ObjectHandlePtr), gepHandle)); - else { + if(t->isPointerTy()) { + llvm::BasicBlock* ifnull = llvm::BasicBlock::Create(caller->getContext(), "if-arg-null", caller); + llvm::BasicBlock* ifnotnull = llvm::BasicBlock::Create(caller->getContext(), "if-arg-notnull", caller); + llvm::BasicBlock* after = llvm::BasicBlock::Create(caller->getContext(), "if-arg-after", caller); + llvm::Value* alloca = builder.CreateAlloca(codeGen->vm->typeJ3ObjectPtr); + llvm::Value* obj = builder.CreateLoad(ins); + + builder.CreateCondBr(builder.CreateIsNull(obj), ifnull, ifnotnull); + + builder.SetInsertPoint(ifnull); + builder.CreateStore(codeGen->nullValue, alloca); + builder.CreateBr(after); + + builder.SetInsertPoint(ifnotnull); + builder.CreateStore(builder.CreateLoad(builder.CreateGEP(builder.CreateIntToPtr(obj, + codeGen->vm->typeJ3ObjectHandlePtr), gepHandle)), + alloca); + builder.CreateBr(after); + + builder.SetInsertPoint(after); + arg = builder.CreateLoad(alloca); + } else { arg = builder.CreateLoad(builder.CreateTruncOrBitCast(ins, t->getPointerTo())); } @@ -75,4 +93,6 @@ void J3LLVMSignature::generateCallerIR(J res = builder.getInt64(0); builder.CreateRet(res); + + // caller->dump(); } From gael.thomas at lip6.fr Wed Jan 1 16:02:16 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 00:02:16 -0000 Subject: [vmkit-commits] [vmkit] r198289 - Add some annotation names Message-ID: <20140102000216.2F8662A6C029@llvm.org> Author: gthomas Date: Wed Jan 1 18:02:15 2014 New Revision: 198289 URL: http://llvm.org/viewvc/llvm-project?rev=198289&view=rev Log: Add some annotation names Modified: vmkit/branches/mcjit/include/j3/j3.h vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/include/j3/j3constants.h vmkit/branches/mcjit/lib/j3/openjdk/j3lib.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 vmkit/branches/mcjit/lib/j3/vm/j3constants.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=198289&r1=198288&r2=198289&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Wed Jan 1 18:02:15 2014 @@ -13,6 +13,7 @@ #include "j3/j3typesdef.h" #include "j3/j3jni.h" #include "j3/j3monitor.h" +#include "j3/j3constants.h" namespace j3 { class J3InitialClassLoader; @@ -50,6 +51,11 @@ namespace j3 { static J3* create(); +#define defJavaConstantName(name, id) \ + const vmkit::Name* name; + onJavaConstantNames(defJavaConstantName) +#undef defJavaConstantName + #define defPrimitive(name, ctype, llvmtype, scale) \ J3Primitive* type##name; onJavaTypes(defPrimitive) @@ -73,6 +79,7 @@ namespace j3 { J3Method* classClassInit; J3Field* classClassVMData; + J3Class* threadClass; J3Field* threadClassVMData; J3Method* threadClassRun; @@ -81,12 +88,6 @@ namespace j3 { J3Field* fieldClassSlot; J3Method* fieldClassInit; - const vmkit::Name* codeAttr; - const vmkit::Name* constantValueAttr; - const vmkit::Name* initName; - const vmkit::Name* clinitName; - const vmkit::Name* clinitSign; - llvm::Type* typeJNIEnvPtr; llvm::Type* typeJ3VirtualTablePtr; llvm::Type* typeJ3Type; Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198289&r1=198288&r2=198289&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Wed Jan 1 18:02:15 2014 @@ -244,8 +244,6 @@ namespace j3 { J3Field* findVirtualField(const vmkit::Name* name, const J3Type* type, bool error=1); J3Field* findStaticField(const vmkit::Name* name, const J3Type* type, bool error=1); - J3Field* findVirtualField(const wchar_t* name, const J3Type* type, bool error=1); - J3Field* findStaticField(const wchar_t* name, const J3Type* type, bool error=1); }; class J3ArrayClass : public J3ObjectType { Modified: vmkit/branches/mcjit/include/j3/j3constants.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3constants.h?rev=198289&r1=198288&r2=198289&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3constants.h (original) +++ vmkit/branches/mcjit/include/j3/j3constants.h Wed Jan 1 18:02:15 2014 @@ -23,12 +23,23 @@ namespace j3 { static const int MAGIC = 0xcafebabe; - static wchar_t codeAttr[]; - static wchar_t constantValueAttr[]; +#define onJavaConstantNames(_) \ + _(clinitName, L"") \ + _(clinitSign, L"()V") \ + _(initName, L"") \ + \ + _(codeAttribute, L"Code") \ + _(constantValueAttribute, L"ConstantValue") \ + _(annotationsAttribute, L"RuntimeVisibleAnnotations") \ + _(exceptionsAttribute, L"Exceptions") \ + _(lineNumberTableAttribute, L"LineNumberTable") \ + _(innerClassesAttribute, L"InnerClasses") \ + _(sourceFileAttribute, L"SourceFile") \ + _(signatureAttribute, L"Signature") \ + _(enclosingMethodAttribute, L"EnclosingMethod") \ + _(paramAnnotationsAttribute, L"RuntimeVisibleParameterAnnotations") \ + _(annotationDefaultAttribute, L"AnnotationDefault") - static wchar_t clinitName[]; - static wchar_t clinitSign[]; - static wchar_t initName[]; static char nativePrefix[]; static void initialize(vmkit::Names* names); Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=198289&r1=198288&r2=198289&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Wed Jan 1 18:02:15 2014 @@ -23,26 +23,26 @@ static const char* rtjar = OPENJDK_HOME" void J3Lib::bootstrap(J3* vm) { J3ObjectHandle* prev = J3Thread::get()->tell(); - + J3Class* threadGroupClass = vm->initialClassLoader->loadClass(vm->names()->get(L"java/lang/ThreadGroup")); J3Method* sysThreadGroupInit = vm->initialClassLoader->method(0, - L"java/lang/ThreadGroup", - J3Cst::initName, - L"()V"); + threadGroupClass, + vm->initName, + vm->names()->get(L"()V")); J3ObjectHandle* sysThreadGroup = J3ObjectHandle::doNewObject(sysThreadGroupInit->cl()); sysThreadGroupInit->invokeSpecial(sysThreadGroup); J3Method* appThreadGroupInit = vm->initialClassLoader->method(0, - L"java/lang/ThreadGroup", - J3Cst::initName, - L"(Ljava/lang/ThreadGroup;Ljava/lang/String;)V"); + threadGroupClass, + vm->initName, + vm->names()->get(L"(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); J3ObjectHandle* appThreadGroup = J3ObjectHandle::doNewObject(appThreadGroupInit->cl()); appThreadGroupInit->invokeSpecial(appThreadGroup, sysThreadGroup, vm->utfToString("main")); J3Method* threadInit = vm->initialClassLoader->method(0, - L"java/lang/Thread", - J3Cst::initName, - L"(Ljava/lang/ThreadGroup;Ljava/lang/String;)V"); + vm->threadClass, + vm->initName, + vm->names()->get(L"(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); J3ObjectHandle* mainThread = J3ObjectHandle::doNewObject(threadInit->cl()); J3Thread::get()->assocJavaThread(mainThread); 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=198289&r1=198288&r2=198289&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Wed Jan 1 18:02:15 2014 @@ -30,12 +30,13 @@ J3::J3(vmkit::BumpAllocator* allocator) _names(allocator), monitorManager(allocator), llvmSignatures(llvmFunctionTypeLess, allocator) { + +#define defJavaConstantName(name, id) \ + name = names()->get(id); + onJavaConstantNames(defJavaConstantName) +#undef defJavaConstantName + pthread_mutex_init(&stringsMutex, 0); - constantValueAttr = names()->get(J3Cst::constantValueAttr); - codeAttr = names()->get(J3Cst::codeAttr); - clinitName = names()->get(J3Cst::clinitName); - clinitSign = names()->get(J3Cst::clinitSign); - initName = names()->get(J3Cst::initName); interfaceTrampoline = J3Trampoline::buildInterfaceTrampoline(allocator); } @@ -97,8 +98,8 @@ void J3::run() { #define z_class(clName) initialClassLoader->loadClass(names()->get(clName)) #define z_method(access, cl, name, sign) initialClassLoader->method(access, cl, name, sign) #define z_field(access, cl, name, type) J3Cst::isStatic(access) \ - ? cl->findStaticField(name, type) \ - : cl->findVirtualField(name, type); + ? cl->findStaticField(names()->get(name), type) \ + : cl->findVirtualField(names()->get(name), type); nbArrayInterfaces = 2; @@ -110,22 +111,23 @@ void J3::run() { objectClass = z_class(L"java/lang/Object"); stringClass = z_class(L"java/lang/String"); - stringClassInit = z_method(0, stringClass, J3Cst::initName, L"([CZ)V"); + stringClassInit = z_method(0, stringClass, initName, names()->get(L"([CZ)V")); stringClassValue = z_field(0, stringClass, L"value", charArrayClass); classClass = z_class(L"java/lang/Class"); J3Field hf(J3Cst::ACC_PRIVATE, names()->get(L"** vmData **"), typeLong); classClass->resolve(&hf, 1); - classClassInit = z_method(0, classClass, J3Cst::initName, L"()V"); - classClassVMData = z_field(0, classClass, hf.name(), hf.type()); + classClassInit = z_method(0, classClass, initName, names()->get(L"()V")); + classClassVMData = classClass->findVirtualField(hf.name(), hf.type()); - threadClassRun = z_method(0, z_class(L"java/lang/Thread"), L"run", L"()V"); + threadClass = z_class(L"java/lang/Thread"); + threadClassRun = z_method(0, threadClass, L"run", L"()V"); threadClassVMData = initialClassLoader->loadClass(names()->get("java/lang/Thread")) ->findVirtualField(names()->get(L"eetop"), typeLong); fieldClass = z_class(L"java/lang/reflect/Field"); - fieldClassInit = z_method(0, fieldClass, J3Cst::initName, - L"(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;IILjava/lang/String;[B)V"); + fieldClassInit = z_method(0, fieldClass, initName, + names()->get(L"(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;IILjava/lang/String;[B)V")); fieldClassClass = z_field(0, fieldClass, L"clazz", classClass); fieldClassSlot = z_field(0, fieldClass, L"slot", typeInteger); #if 0 @@ -251,9 +253,7 @@ void J3::printStackTrace() { } void J3::forceSymbolDefinition() { - J3Value val; J3ArrayObject a; a.length(); /* J3ArrayObject */ - printf("---> %p\n", &val.valFloat); J3LockRecord* l = new J3LockRecord(); /* J3LockRecord */ try { throw (void*)0; 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=198289&r1=198288&r2=198289&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Wed Jan 1 18:02:15 2014 @@ -362,14 +362,6 @@ J3Field* J3Class::findStaticField(const return res; } -J3Field* J3Class::findVirtualField(const wchar_t* name, const J3Type* type, bool error) { - return findVirtualField(loader()->vm()->names()->get(name), type, error); -} - -J3Field* J3Class::findStaticField(const wchar_t* name, const J3Type* type, bool error) { - return findStaticField(loader()->vm()->names()->get(name), type, error); -} - void J3Class::registerNative(const vmkit::Name* methName, const vmkit::Name* methSign, void* fnPtr) { resolve(); J3Method* res = staticLayout()->findMethod(methName, methSign); @@ -406,7 +398,7 @@ void J3Class::doInitialise() { for(size_t i=0; inbFields(); i++) { J3Field* cur = staticLayout()->fields() + i; - J3Attribute* attr = cur->attributes()->lookup(loader()->vm()->constantValueAttr); + J3Attribute* attr = cur->attributes()->lookup(loader()->vm()->constantValueAttribute); if(attr) { J3Reader reader(bytes()); 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=198289&r1=198288&r2=198289&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Wed Jan 1 18:02:15 2014 @@ -1529,7 +1529,7 @@ void J3CodeGen::explore() { #endif void J3CodeGen::generateJava() { - J3Attribute* attr = method->attributes()->lookup(vm->codeAttr); + J3Attribute* attr = method->attributes()->lookup(vm->codeAttribute); if(!attr) J3::classFormatError(cl, L"No Code attribute in %ls %ls", method->name()->cStr(), method->sign()->cStr()); Modified: vmkit/branches/mcjit/lib/j3/vm/j3constants.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3constants.cc?rev=198289&r1=198288&r2=198289&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3constants.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3constants.cc Wed Jan 1 18:02:15 2014 @@ -8,12 +8,6 @@ using namespace j3; -wchar_t J3Cst::codeAttr[] = L"Code"; -wchar_t J3Cst::constantValueAttr[] = L"ConstantValue"; - -wchar_t J3Cst::clinitName[] = L""; -wchar_t J3Cst::clinitSign[] = L"()V"; -wchar_t J3Cst::initName[] = L""; char J3Cst::nativePrefix[] = "Java_"; const vmkit::Name* J3Cst::rewrite(J3* vm, const vmkit::Name* clName, const vmkit::Name* orig) { From gael.thomas at lip6.fr Thu Jan 2 01:30:45 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 09:30:45 -0000 Subject: [vmkit-commits] [vmkit] r198293 - install a sigsegv handler Message-ID: <20140102093046.2B0932A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 03:30:43 2014 New Revision: 198293 URL: http://llvm.org/viewvc/llvm-project?rev=198293&view=rev Log: install a sigsegv handler Modified: vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/include/vmkit/allocator.h vmkit/branches/mcjit/include/vmkit/thread.h vmkit/branches/mcjit/include/vmkit/vmkit.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/j3field.cc vmkit/branches/mcjit/lib/vmkit/allocator.cc vmkit/branches/mcjit/lib/vmkit/thread.cc vmkit/branches/mcjit/lib/vmkit/vmkit.cc Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198293&r1=198292&r2=198293&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Thu Jan 2 03:30:43 2014 @@ -30,6 +30,7 @@ namespace j3 { class J3Method; class J3Field; class J3Attributes; + class J3Attribute; class J3InterfaceSlotDescriptor { public: @@ -210,6 +211,8 @@ namespace j3 { public: J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes); + J3ObjectHandle* extractAttribute(J3Attribute* attr); + J3StaticLayout* staticLayout() { return &_staticLayout; } size_t nbInterfaces() { return _nbInterfaces; } Modified: vmkit/branches/mcjit/include/vmkit/allocator.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/allocator.h?rev=198293&r1=198292&r2=198293&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/allocator.h (original) +++ vmkit/branches/mcjit/include/vmkit/allocator.h Thu Jan 2 03:30:43 2014 @@ -135,6 +135,9 @@ namespace vmkit { void* allocate(); void release(void* thread); + void* alternateStackAddr(void* thread); + size_t alternateStackSize(void* thread); + void* stackAddr(void* thread); size_t stackSize(void* thread); Modified: vmkit/branches/mcjit/include/vmkit/thread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/thread.h?rev=198293&r1=198292&r2=198293&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/thread.h (original) +++ vmkit/branches/mcjit/include/vmkit/thread.h Thu Jan 2 03:30:43 2014 @@ -3,6 +3,7 @@ #define UNW_LOCAL_ONLY #include +#include #include "vmkit/allocator.h" @@ -14,6 +15,8 @@ namespace vmkit { pthread_t _tid; static void* doRun(void* thread); + static void sigsegvHandler(int n, siginfo_t* info, void* context); + static void sigendHandler(int n, siginfo_t* info, void* context); public: Thread(VMKit* vm); Modified: vmkit/branches/mcjit/include/vmkit/vmkit.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/vmkit.h?rev=198293&r1=198292&r2=198293&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/vmkit.h (original) +++ vmkit/branches/mcjit/include/vmkit/vmkit.h Thu Jan 2 03:30:43 2014 @@ -65,6 +65,8 @@ namespace vmkit { void log(const wchar_t* msg, ...); virtual void vinternalError(const wchar_t* msg, va_list va) __attribute__((noreturn)); + virtual void sigsegv(uintptr_t addr) __attribute__((noreturn)); + virtual void sigend() __attribute__((noreturn)); static void internalError(const wchar_t* msg, ...) __attribute__((noreturn)); static void throwException(void* obj) __attribute__((noreturn)); 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=198293&r1=198292&r2=198293&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan 2 03:30:43 2014 @@ -48,7 +48,23 @@ jobject JNICALL JVM_Clone(JNIEnv* env, j /* * java.lang.String */ -jstring JNICALL JVM_InternString(JNIEnv* env, jstring str) { enterJVM(); NYI(); leaveJVM(); } +jstring JNICALL JVM_InternString(JNIEnv* env, jstring str) { + jstring res; + enterJVM(); + + J3* vm = J3Thread::get()->vm(); + J3ObjectHandle* value = str->getObject(vm->stringClassValue); + uint32_t length = value->arrayLength(); + wchar_t copy[length]; + + for(uint32_t i=0; igetCharAt(length); + + res = vm->nameToString(vm->names()->get(copy)); + + leaveJVM(); + return res; +} /* * java.lang.System @@ -408,7 +424,6 @@ jobjectArray JNICALL JVM_GetClassDeclare } else res = J3ObjectHandle::doNewArray(type->loader()->vm()->fieldClass->getArray(), 0); - NYI(); leaveJVM(); return res; 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=198293&r1=198292&r2=198293&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Thu Jan 2 03:30:43 2014 @@ -224,7 +224,7 @@ void J3::vinternalError(const wchar_t* m vswprintf(buf, 65536, msg, va); fprintf(stderr, "Internal error: %ls\n", buf); printStackTrace(); - abort(); + exit(1); } void J3::printStackTrace() { 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=198293&r1=198292&r2=198293&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Thu Jan 2 03:30:43 2014 @@ -292,6 +292,13 @@ J3Class::J3Class(J3ClassLoader* loader, status = LOADED; } +J3ObjectHandle* J3Class::extractAttribute(J3Attribute* attr) { + if(attr) + J3::internalError(L"extract attribute"); + else + return J3ObjectHandle::doNewArray(loader()->vm()->typeByte->getArray(), 0); +} + J3Method* J3Class::findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error) { //loader()->vm()->log(L"Lookup: %ls %ls in %ls (%d)", methName->cStr(), methSign->cStr(), name()->cStr(), nbVirtualMethods); resolve(); Modified: vmkit/branches/mcjit/lib/j3/vm/j3field.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3field.cc?rev=198293&r1=198292&r2=198293&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3field.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3field.cc Thu Jan 2 03:30:43 2014 @@ -4,6 +4,7 @@ #include "j3/j3.h" #include "j3/j3method.h" #include "j3/j3thread.h" +#include "j3/j3attribute.h" using namespace j3; @@ -11,23 +12,24 @@ J3ObjectHandle* J3Field::javaField() { if(!_javaField) { layout()->lock(); - J3ObjectHandle* prev = J3Thread::get()->tell(); - _javaField = layout()->loader()->globalReferences()->add(J3ObjectHandle::doNewObject(layout()->loader()->vm()->fieldClass)); + if(!_javaField) { + J3ObjectHandle* prev = J3Thread::get()->tell(); + _javaField = layout()->loader()->globalReferences()->add(J3ObjectHandle::doNewObject(layout()->loader()->vm()->fieldClass)); + + J3* vm = layout()->loader()->vm(); + + vm->fieldClassInit->invokeSpecial(_javaField, /* this */ + layout()->javaClass(), /* declaring class */ + vm->nameToString(name()), /* name */ + type()->javaClass(), /* type */ + access(), /* access */ + slot(), /* slot */ + vm->nameToString(type()->name()), /* signature */ + layout() + ->asClass()->extractAttribute(attributes()->lookup(vm->annotationsAttribute)));/* annotations */ - J3* vm = layout()->loader()->vm(); - - vm->fieldClassInit->invokeSpecial(_javaField, /* this */ - 0,//layout()->javaClass(), /* declaring class */ - 0,//vm->nameToString(name()), /* name */ - 0,//type()->javaClass(), /* type */ - 0,//access(), /* access */ - 0,//slot(), /* slot */ - 0,//vm->nameToString(type()->name()), /* signature */ - 0); /* annotations */ - - - J3Thread::get()->restore(prev); - J3::internalError(L"implement me: javaField"); + J3Thread::get()->restore(prev); + } layout()->unlock(); } return _javaField; Modified: vmkit/branches/mcjit/lib/vmkit/allocator.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/allocator.cc?rev=198293&r1=198292&r2=198293&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/allocator.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/allocator.cc Thu Jan 2 03:30:43 2014 @@ -95,9 +95,9 @@ ThreadAllocator::ThreadAllocator(uintptr freeThreads.reserve(refill); minThreadStruct = ((minThreadStruct - 1) & -PAGE_SIZE) + PAGE_SIZE; - baseStack = minThreadStruct; + baseStack = minThreadStruct + PAGE_SIZE; - uintptr_t min = PTHREAD_STACK_MIN + minThreadStruct + PAGE_SIZE; + uintptr_t min = PTHREAD_STACK_MIN + minThreadStruct + (PAGE_SIZE<<1); if(minFullSize < min) minFullSize = min; @@ -153,3 +153,11 @@ void* ThreadAllocator::stackAddr(void* t size_t ThreadAllocator::stackSize(void* thread) { return topStack - baseStack; } + +void* ThreadAllocator::alternateStackAddr(void* thread) { + return (void*)((uintptr_t)thread + baseStack - PAGE_SIZE); +} + +size_t ThreadAllocator::alternateStackSize(void* thread) { + return PAGE_SIZE; +} Modified: vmkit/branches/mcjit/lib/vmkit/thread.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/thread.cc?rev=198293&r1=198292&r2=198293&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/thread.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/thread.cc Thu Jan 2 03:30:43 2014 @@ -8,6 +8,14 @@ Thread::Thread(VMKit* vm) { _vm = vm; } +void Thread::sigsegvHandler(int n, siginfo_t* info, void* context) { + get()->vm()->sigsegv((uintptr_t)info->si_addr); +} + +void Thread::sigendHandler(int n, siginfo_t* info, void* context) { + get()->vm()->sigend(); +} + void* Thread::operator new(size_t n) { return ThreadAllocator::allocator()->allocate(); } @@ -30,6 +38,38 @@ uintptr_t Thread::getThreadMask() { void* Thread::doRun(void* _thread) { Thread* thread = (Thread*)_thread; + + // Set the alternate stack as the second page of the thread's + // stack. + stack_t st; + st.ss_sp = ThreadAllocator::allocator()->alternateStackAddr(thread); + st.ss_flags = 0; + st.ss_size = ThreadAllocator::allocator()->alternateStackSize(thread); + sigaltstack(&st, NULL); + + // Set the SIGSEGV handler to diagnose errors. + struct sigaction sa; + sigset_t mask; + sigfillset(&mask); + sa.sa_flags = SA_SIGINFO | SA_ONSTACK | SA_NODEFER; + sa.sa_mask = mask; + sa.sa_sigaction = sigsegvHandler; + sigaction(SIGSEGV, &sa, NULL); + sigaction(SIGBUS, &sa, NULL); + + // to handle termination + st.ss_sp = ThreadAllocator::allocator()->alternateStackAddr(thread); + st.ss_flags = 0; + st.ss_size = ThreadAllocator::allocator()->alternateStackSize(thread); + sigaltstack(&st, NULL); + sigfillset(&mask); + sa.sa_flags = SA_SIGINFO | SA_ONSTACK | SA_NODEFER; + sa.sa_mask = mask; + sa.sa_sigaction = sigendHandler; + //sigaction(SIGHUP, &sa, NULL); + //sigaction(SIGINT, &sa, NULL); + //sigaction(SIGTERM, &sa, NULL); + thread->run(); return 0; } Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=198293&r1=198292&r2=198293&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Thu Jan 2 03:30:43 2014 @@ -175,6 +175,14 @@ void VMKit::internalError(const wchar_t* abort(); } +void VMKit::sigsegv(uintptr_t addr) { + internalError(L"sigsegv at %p", (void*)addr); +} + +void VMKit::sigend() { + internalError(L"sig terminate"); +} + static int fake = 0; void VMKit::throwException(void* obj) { From gael.thomas at lip6.fr Thu Jan 2 01:37:27 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 09:37:27 -0000 Subject: [vmkit-commits] [vmkit] r198294 - Only generate caller gate on demand Message-ID: <20140102093727.8F2F12A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 03:37:27 2014 New Revision: 198294 URL: http://llvm.org/viewvc/llvm-project?rev=198294&view=rev Log: Only generate caller gate on demand Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=198294&r1=198293&r2=198294&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Thu Jan 2 03:37:27 2014 @@ -176,13 +176,13 @@ namespace j3 { llvm::Function* patchPoint64; llvm::Function* patchPointVoid; - J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* method); + J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* method, bool withMethod, bool withCaller); ~J3CodeGen(); void* operator new(size_t n, vmkit::BumpAllocator* _allocator); void operator delete(void* ptr); public: - static void translate(J3Method* method); + static void translate(J3Method* method, bool withMethod=1, bool withCaller=1); }; } Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=198294&r1=198293&r2=198294&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Thu Jan 2 03:37:27 2014 @@ -118,7 +118,7 @@ namespace j3 { J3Value invokeVirtual(J3ObjectHandle* obj, J3Value* args); J3Value invokeVirtual(J3ObjectHandle* obj, va_list va); - void* fnPtr(); + void* fnPtr(bool withCaller); void* functionPointerOrStaticTrampoline(); void* functionPointerOrVirtualTrampoline(); 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=198294&r1=198293&r2=198294&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Thu Jan 2 03:37:27 2014 @@ -28,7 +28,7 @@ using namespace j3; #define _onEndPoint() ({ if(onEndPoint()) return; }) -J3CodeGen::J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* m) : +J3CodeGen::J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* m, bool withMethod, bool withCaller) : exceptions(this) { allocator = _allocator; @@ -94,26 +94,30 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato ->CreateIntToPtr(llvm::ConstantInt::get(uintPtrTy, (uintptr_t)0), vm->typeJ3ObjectPtr); - if(J3Cst::isNative(method->access())) - generateNative(); - else - generateJava(); + if(withMethod) { + if(J3Cst::isNative(method->access())) + generateNative(); + else + generateJava(); - if(vm->options()->debugTranslate > 3) - llvmFunction->dump(); + if(vm->options()->debugTranslate > 3) + llvmFunction->dump(); + } - if(!methodType->llvmSignature()->caller()) + if(withCaller && !methodType->llvmSignature()->caller()) methodType->llvmSignature()->generateCallerIR(this, module, "generic-caller"); loader->compileModule(module); - void* fnPtr = (void*)loader->ee()->getFunctionAddress(llvmFunction->getName().data()); - if(!methodType->llvmSignature()->caller()) { + if(withCaller && !methodType->llvmSignature()->caller()) { J3LLVMSignature::function_t caller = (J3LLVMSignature::function_t)loader->ee()->getFunctionAddress("generic-caller"); methodType->llvmSignature()->_caller = caller; } - method->markCompiled(llvmFunction, fnPtr); + if(withMethod) { + void* fnPtr = (void*)loader->ee()->getFunctionAddress(llvmFunction->getName().data()); + method->markCompiled(llvmFunction, fnPtr); + } } J3CodeGen::~J3CodeGen() { @@ -126,11 +130,11 @@ void* J3CodeGen::operator new(size_t n, void J3CodeGen::operator delete(void* ptr) { } -void J3CodeGen::translate(J3Method* method) { +void J3CodeGen::translate(J3Method* method, bool withMethod, bool withCaller) { method->cl()->loader()->vm()->lockCompiler(); vmkit::BumpAllocator* allocator = vmkit::BumpAllocator::create(); - delete new(allocator) J3CodeGen(allocator, method); + delete new(allocator) J3CodeGen(allocator, method, withMethod, withCaller); vmkit::BumpAllocator::destroy(allocator); method->cl()->loader()->vm()->unlockCompiler(); 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=198294&r1=198293&r2=198294&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Thu Jan 2 03:37:27 2014 @@ -50,7 +50,7 @@ void J3Method::markCompiled(llvm::Functi _fnPtr = fnPtr; } -void* J3Method::fnPtr() { +void* J3Method::fnPtr(bool withCaller) { if(!isCompiled()) { //fprintf(stderr, "materializing: %ls::%ls%ls\n", this, cl()->name()->cStr(), name()->cStr(), sign()->cStr()); if(!isResolved()) { @@ -62,7 +62,7 @@ void* J3Method::fnPtr() { J3::noSuchMethodError(L"unable to find method", cl(), name(), sign()); } - J3CodeGen::translate(this); + J3CodeGen::translate(this, 1, withCaller); } return _fnPtr; @@ -115,10 +115,13 @@ J3Method* J3Method::resolve(J3ObjectHand J3Value J3Method::internalInvoke(bool statically, J3Value* inArgs) { J3Method* target = statically ? this : resolve(inArgs[0].valObject); - void* fn = fnPtr(); + void* fn = fnPtr(1); //fprintf(stderr, "Internal invoke %ls::%ls%ls\n", target->cl()->name()->cStr(), target->name()->cStr(), target->sign()->cStr()); + if(!methodType()->llvmSignature()->caller()) + J3CodeGen::translate(this, 0, 1); + J3Value res = methodType()->llvmSignature()->caller()(fn, inArgs); return res; Modified: vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc?rev=198294&r1=198293&r2=198294&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Thu Jan 2 03:37:27 2014 @@ -16,7 +16,7 @@ void* J3Trampoline::interfaceTrampoline( void* res; if(desc->nbMethods == 1) { - res = desc->methods[0]->fnPtr(); + res = desc->methods[0]->fnPtr(0); handle->vt()->_interfaceMethodTable[index] = res; } else J3::internalError(L"implement me: interface Trampoline with collision"); @@ -27,7 +27,7 @@ void* J3Trampoline::interfaceTrampoline( } void* J3Trampoline::staticTrampoline(J3Object* obj, J3Method* target) { - return target->fnPtr(); + return target->fnPtr(0); } void* J3Trampoline::virtualTrampoline(J3Object* obj, J3Method* target) { @@ -36,7 +36,7 @@ void* J3Trampoline::virtualTrampoline(J3 J3ObjectType* cl = handle->vt()->type()->asObjectType(); J3Method* impl = cl == target->cl() ? target : cl->findVirtualMethod(target->name(), target->sign()); - void* res = impl->fnPtr(); + void* res = impl->fnPtr(0); handle->vt()->virtualMethods()[impl->index()] = res; J3Thread::get()->restore(prev); From gael.thomas at lip6.fr Thu Jan 2 02:50:54 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 10:50:54 -0000 Subject: [vmkit-commits] [vmkit] r198296 - Build java.lang.reflect.Field Message-ID: <20140102105054.D14322A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 04:50:54 2014 New Revision: 198296 URL: http://llvm.org/viewvc/llvm-project?rev=198296&view=rev Log: Build java.lang.reflect.Field Modified: vmkit/branches/mcjit/include/j3/j3.h vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3class.cc vmkit/branches/mcjit/lib/j3/vm/j3field.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=198296&r1=198295&r2=198296&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Thu Jan 2 04:50:54 2014 @@ -86,6 +86,7 @@ namespace j3 { J3Class* fieldClass; J3Field* fieldClassClass; J3Field* fieldClassSlot; + J3Field* fieldClassAccess; J3Method* fieldClassInit; llvm::Type* typeJNIEnvPtr; @@ -126,6 +127,8 @@ namespace j3 { static void classFormatError(J3Class* cl, const wchar_t* reason, ...) __attribute__((noreturn)); static void noSuchMethodError(const wchar_t* msg, J3Class* clName, const vmkit::Name* name, const vmkit::Name* sign) __attribute__((noreturn)); + static void noSuchFieldError(const wchar_t* msg, + J3Class* clName, const vmkit::Name* name, J3Type* type) __attribute__((noreturn)); static void linkageError(J3Method* method) __attribute__((noreturn)); static void nullPointerException() __attribute__((noreturn)); Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198296&r1=198295&r2=198296&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Thu Jan 2 04:50:54 2014 @@ -163,6 +163,8 @@ namespace j3 { J3Method* findMethod(const vmkit::Name* name, const vmkit::Name* sign); J3Field* findField(const vmkit::Name* name, const J3Type* type); + + virtual J3ObjectHandle* extractAttribute(J3Attribute* attr) = 0; }; class J3StaticLayout : public J3Layout { @@ -173,6 +175,7 @@ namespace j3 { J3Class* cl() { return _cl; } virtual bool isStaticLayout() { return 1; } + J3ObjectHandle* extractAttribute(J3Attribute* attr); }; class J3Class : public J3Layout { @@ -245,8 +248,8 @@ namespace j3 { J3Method* findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error=1); J3Method* findStaticMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error=1); - J3Field* findVirtualField(const vmkit::Name* name, const J3Type* type, bool error=1); - J3Field* findStaticField(const vmkit::Name* name, const J3Type* type, bool error=1); + J3Field* findVirtualField(const vmkit::Name* name, J3Type* type, bool error=1); + J3Field* findStaticField(const vmkit::Name* name, J3Type* type, bool error=1); }; class J3ArrayClass : public J3ObjectType { 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=198296&r1=198295&r2=198296&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan 2 04:50:54 2014 @@ -53,12 +53,15 @@ jstring JNICALL JVM_InternString(JNIEnv* enterJVM(); J3* vm = J3Thread::get()->vm(); + J3ObjectHandle* value = str->getObject(vm->stringClassValue); uint32_t length = value->arrayLength(); - wchar_t copy[length]; + wchar_t copy[length+1]; for(uint32_t i=0; igetCharAt(length); + copy[i] = value->getCharAt(i); + + copy[length] = 0; res = vm->nameToString(vm->names()->get(copy)); @@ -420,12 +423,15 @@ jobjectArray JNICALL JVM_GetClassDeclare size_t cur = 0; for(uint32_t i=0; inbFields(); i++) if(!publicOnly || J3Cst::isPublic(cl->fields()[i].access())) - res->setObjectAt(i, cl->fields()[i].javaField()); + res->setObjectAt(cur++, cl->fields()[i].javaField()); + for(uint32_t i=0; istaticLayout()->nbFields(); i++) + if(!publicOnly || J3Cst::isPublic(cl->staticLayout()->fields()[i].access())) + res->setObjectAt(cur++, cl->staticLayout()->fields()[i].javaField()); } else res = J3ObjectHandle::doNewArray(type->loader()->vm()->fieldClass->getArray(), 0); leaveJVM(); - + return res; } Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc?rev=198296&r1=198295&r2=198296&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc Thu Jan 2 04:50:54 2014 @@ -3,6 +3,7 @@ #include "j3/j3thread.h" #include "j3/j3class.h" #include "j3/j3classloader.h" +#include "j3/j3field.h" #include "j3/j3.h" #include "llvm/IR/DataLayout.h" @@ -34,4 +35,19 @@ extern "C" { JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_addressSize(JNIEnv* env, jobject unsafe) { return J3Thread::get()->vm()->objectClass->getSizeInBits()>>3; } + + /// objectFieldOffset - Pointer offset of the specified field + /// + JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_objectFieldOffset(JNIEnv* env, jobject unsafe, jobject field) { + J3* vm = J3Thread::get()->vm(); + J3Class* cl = J3Class::nativeClass(field->getObject(vm->fieldClassClass))->asClass(); + uint32_t slot = field->getInteger(vm->fieldClassSlot); + uint32_t access = field->getInteger(vm->fieldClassAccess); + J3Field* fields = J3Cst::isStatic(access) ? cl->staticLayout()->fields() : cl->fields(); + return fields[slot].offset(); + } } + + + + 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=198296&r1=198295&r2=198296&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Thu Jan 2 04:50:54 2014 @@ -130,6 +130,8 @@ void J3::run() { names()->get(L"(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;IILjava/lang/String;[B)V")); fieldClassClass = z_field(0, fieldClass, L"clazz", classClass); fieldClassSlot = z_field(0, fieldClass, L"slot", typeInteger); + fieldClassAccess = z_field(0, fieldClass, L"modifiers", typeInteger); + #if 0 J3Field* fieldClassSlot; J3Method* fieldClassInit; @@ -194,6 +196,10 @@ void J3::noSuchMethodError(const wchar_t internalError(L"%ls: %ls::%ls %ls", msg, cl->name()->cStr(), name->cStr(), sign->cStr()); } +void J3::noSuchFieldError(const wchar_t* msg, J3Class* cl, const vmkit::Name* name, J3Type* type) { + internalError(L"%ls: %ls::%ls %ls", msg, cl->name()->cStr(), name->cStr(), type->name()->cStr()); +} + void J3::classFormatError(J3Class* cl, const wchar_t* reason, ...) { wchar_t buf[65536]; va_list va; @@ -224,7 +230,8 @@ void J3::vinternalError(const wchar_t* m vswprintf(buf, 65536, msg, va); fprintf(stderr, "Internal error: %ls\n", buf); printStackTrace(); - exit(1); + // exit(1); + abort(); } void J3::printStackTrace() { 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=198296&r1=198295&r2=198296&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Thu Jan 2 04:50:54 2014 @@ -249,6 +249,10 @@ J3StaticLayout::J3StaticLayout(J3ClassLo _cl = cl; } +J3ObjectHandle* J3StaticLayout::extractAttribute(J3Attribute* attr) { + return cl()->extractAttribute(attr); +} + J3Layout::J3Layout(J3ClassLoader* loader, const vmkit::Name* name) : J3ObjectType(loader, name) { } @@ -304,9 +308,9 @@ J3Method* J3Class::findVirtualMethod(con resolve(); J3Class* cur = this; - J3Method* res; + while(1) { - res = cur->findMethod(name, sign); + J3Method* res = cur->findMethod(name, sign); if(res) return res; @@ -326,9 +330,9 @@ J3Method* J3Class::findStaticMethod(cons resolve(); J3Class* cur = this; - J3Method* res; + while(1) { - res = cur->staticLayout()->findMethod(name, sign); + J3Method* res = cur->staticLayout()->findMethod(name, sign); if(res) return res; @@ -341,23 +345,30 @@ J3Method* J3Class::findStaticMethod(cons } cur = cur->super(); } - - return res; } -J3Field* J3Class::findVirtualField(const vmkit::Name* name, const J3Type* type, bool error) { - //loader()->vm()->log(L"Lookup: %ls %ls in %ls", methName->cStr(), methSign->cStr(), name()->cStr()); +J3Field* J3Class::findVirtualField(const vmkit::Name* name, J3Type* type, bool error) { + //loader()->vm()->log(L"Lookup: %ls %ls in %ls", type->name()->cStr(), name->cStr(), J3Class::name()->cStr()); resolve(); + J3Class* cur = this; - J3Field* res = findField(name, type); + while(1) { + J3Field* res = cur->findField(name, type); - if(!res) - J3::internalError(L"implement me"); + if(res) + return res; - return res; + if(cur == cur->super()) { + if(error) + J3::noSuchFieldError(L"no such field", this, name, type); + else + return 0; + } + cur = cur->super(); + } } -J3Field* J3Class::findStaticField(const vmkit::Name* fname, const J3Type* ftype, bool error) { +J3Field* J3Class::findStaticField(const vmkit::Name* fname, J3Type* ftype, bool error) { //fprintf(stderr, "Lookup static field %ls %ls::%ls\n", ftype->name()->cStr(), name()->cStr(), fname->cStr()); resolve(); @@ -630,16 +641,11 @@ void J3Class::readClassBytes(J3Field* hi void J3Class::fillFields(J3Field** fields, size_t n) { for(size_t i=0; iaccess()) ? (J3Layout*)staticLayout() : this; - if(J3Cst::isStatic(fields[i]->access())) { - //fprintf(stderr, " adding static field: %ls %ls::%ls\n", cur->type()->name()->cStr(), name()->cStr(), cur->name()->cStr()); - layout = staticLayout(); - } else { - layout = this; - } + //fprintf(stderr, " adding static field: %ls %ls::%ls\n", cur->type()->name()->cStr(), name()->cStr(), cur->name()->cStr()); cur->_offset = layout->structSize(); - cur->_slot = i; + cur->_slot = layout->_nbFields; layout->_structSize += 1 << fields[i]->type()->logSize(); layout->fields()[layout->_nbFields++] = *fields[i]; @@ -750,7 +756,7 @@ J3Field* J3Class::fieldAt(uint16_t idx, check(ntIdx, J3Cst::CONSTANT_NameAndType); const vmkit::Name* name = nameAt(ctpValues[ntIdx] >> 16); - const J3Type* type = loader()->getType(this, nameAt(ctpValues[ntIdx] & 0xffff)); + J3Type* type = loader()->getType(this, nameAt(ctpValues[ntIdx] & 0xffff)); res = J3Cst::isStatic(access) ? cl->findStaticField(name, type) : cl->findVirtualField(name, type); Modified: vmkit/branches/mcjit/lib/j3/vm/j3field.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3field.cc?rev=198296&r1=198295&r2=198296&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3field.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3field.cc Thu Jan 2 04:50:54 2014 @@ -25,11 +25,11 @@ J3ObjectHandle* J3Field::javaField() { access(), /* access */ slot(), /* slot */ vm->nameToString(type()->name()), /* signature */ - layout() - ->asClass()->extractAttribute(attributes()->lookup(vm->annotationsAttribute)));/* annotations */ + layout()->extractAttribute(attributes()->lookup(vm->annotationsAttribute)));/* annotations */ J3Thread::get()->restore(prev); } + layout()->unlock(); } return _javaField; From gael.thomas at lip6.fr Thu Jan 2 03:08:13 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 11:08:13 -0000 Subject: [vmkit-commits] [vmkit] r198297 - Add compare and swap, either in J3Object and in Unsafe Message-ID: <20140102110813.8585E2A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 05:08:13 2014 New Revision: 198297 URL: http://llvm.org/viewvc/llvm-project?rev=198297&view=rev Log: Add compare and swap, either in J3Object and in Unsafe Modified: vmkit/branches/mcjit/include/j3/j3object.h vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc vmkit/branches/mcjit/lib/j3/vm/j3object.cc Modified: vmkit/branches/mcjit/include/j3/j3object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=198297&r1=198296&r2=198297&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3object.h (original) +++ vmkit/branches/mcjit/include/j3/j3object.h Thu Jan 2 05:08:13 2014 @@ -167,16 +167,18 @@ namespace j3 { void rawArrayCopyTo(uint32_t fromOffset, J3ObjectHandle* to, uint32_t toOffset, uint32_t nbb); - void rawSetObject(uint32_t offset, J3ObjectHandle* v); - J3ObjectHandle* rawGetObject(uint32_t offset); + J3ObjectHandle* rawCASObject(uintptr_t offset, J3ObjectHandle* orig, J3ObjectHandle* value); + void rawSetObject(uintptr_t offset, J3ObjectHandle* v); + J3ObjectHandle* rawGetObject(uintptr_t offset); void setObject(J3Field* f, J3ObjectHandle* v); J3ObjectHandle* getObject(J3Field* f); void setObjectAt(uint32_t idx, J3ObjectHandle* v); J3ObjectHandle* getObjectAt(uint32_t idx); #define defAccessor(name, ctype, llvmtype, scale) \ - void rawSet##name(uint32_t offset, ctype value); \ - ctype rawGet##name(uint32_t offset); \ + ctype rawCAS##name(uintptr_t offset, ctype orig, ctype value); \ + void rawSet##name(uintptr_t offset, ctype value); \ + ctype rawGet##name(uintptr_t offset); \ void set##name(J3Field* f, ctype value); \ ctype get##name(J3Field* f); \ void set##name##At(uint32_t idx, ctype value); \ Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc?rev=198297&r1=198296&r2=198297&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc Thu Jan 2 05:08:13 2014 @@ -46,6 +46,11 @@ extern "C" { J3Field* fields = J3Cst::isStatic(access) ? cl->staticLayout()->fields() : cl->fields(); return fields[slot].offset(); } + + JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwapObject(JNIEnv* env, jobject unsafe, + jobject handle, jlong offset, jobject orig, jobject value) { + return handle->rawCASObject(offset, orig, value) == orig; + } } Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc?rev=198297&r1=198296&r2=198297&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc Thu Jan 2 05:08:13 2014 @@ -98,6 +98,9 @@ void J3CodeGenVar::drop(uint32_t n) { } llvm::AllocaInst** J3CodeGenVar::stackOf(llvm::Type* t) { + if(!t) + J3::internalError(L"unable to find the type of a local/stack"); + if(t->isIntegerTy(64)) { return longStack; } else if(t->isIntegerTy()) { 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=198297&r1=198296&r2=198297&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Thu Jan 2 05:08:13 2014 @@ -401,14 +401,26 @@ J3ObjectHandle* J3ObjectHandle::doNewArr return J3Thread::get()->push(res); } - - #define defAccessor(name, ctype, llvmtype, scale) \ - void J3ObjectHandle::rawSet##name(uint32_t offset, ctype value) { \ + ctype J3ObjectHandle::rawCAS##name(uintptr_t offset, ctype orig, ctype value) { \ + if(scale == 2) { \ + uint32_t io = *((uint32_t*)&orig); \ + uint32_t iv = *((uint32_t*)&value); \ + uint32_t ir = __sync_val_compare_and_swap((uint32_t*)((uintptr_t)obj() + offset), io, iv); \ + return *((ctype*)&ir); \ + } else { \ + uint64_t io = *((uint32_t*)&orig); \ + uint64_t iv = *((uint32_t*)&value); \ + uint64_t ir = __sync_val_compare_and_swap((uint64_t*)((uintptr_t)obj() + offset), io, iv); \ + return *((ctype*)&ir); \ + } \ + } \ + \ + void J3ObjectHandle::rawSet##name(uintptr_t offset, ctype value) { \ *((ctype*)((uintptr_t)obj() + offset)) = value; \ } \ \ - ctype J3ObjectHandle::rawGet##name(uint32_t offset) { \ + ctype J3ObjectHandle::rawGet##name(uintptr_t offset) { \ return *((ctype*)((uintptr_t)obj() + offset)); \ } \ \ @@ -448,18 +460,25 @@ onJavaPrimitives(defAccessor) #undef defAccessor -void J3ObjectHandle::rawArrayCopyTo(uint32_t fromOffset, J3ObjectHandle* to, uint32_t toOffset, uint32_t nbb) { - if(isSame(to)) - memmove((uint8_t*)(to->array()+1) + toOffset, (uint8_t*)(array()+1) + fromOffset, nbb); +J3ObjectHandle* J3ObjectHandle::rawCASObject(uintptr_t offset, J3ObjectHandle* orig, J3ObjectHandle* value) { + J3Object* oo = orig ? orig->obj() : 0; + J3Object* ov = value ? value->obj() : 0; + J3Object* res = __sync_val_compare_and_swap((J3Object**)((uintptr_t)obj() + offset), oo, ov); + if(res == oo) + return orig; + else if(res == ov) + return value; + else if(!res) + return 0; else - memcpy((uint8_t*)(to->array()+1) + toOffset, (uint8_t*)(array()+1) + fromOffset, nbb); + return J3Thread::get()->push(res); } -void J3ObjectHandle::rawSetObject(uint32_t offset, J3ObjectHandle* value) { +void J3ObjectHandle::rawSetObject(uintptr_t offset, J3ObjectHandle* value) { *((J3Object**)((uintptr_t)obj() + offset)) = value ? value->obj() : 0; } -J3ObjectHandle* J3ObjectHandle::rawGetObject(uint32_t offset) { +J3ObjectHandle* J3ObjectHandle::rawGetObject(uintptr_t offset) { return obj() ? J3Thread::get()->push(*((J3Object**)((uintptr_t)obj() + offset))) : 0; } @@ -479,6 +498,13 @@ J3ObjectHandle* J3ObjectHandle::getObjec return rawGetObject(sizeof(J3ArrayObject) + idx*sizeof(J3Object*)); } +void J3ObjectHandle::rawArrayCopyTo(uint32_t fromOffset, J3ObjectHandle* to, uint32_t toOffset, uint32_t nbb) { + if(isSame(to)) + memmove((uint8_t*)(to->array()+1) + toOffset, (uint8_t*)(array()+1) + fromOffset, nbb); + else + memcpy((uint8_t*)(to->array()+1) + toOffset, (uint8_t*)(array()+1) + fromOffset, nbb); +} + /* * J3LocalReferences */ From gael.thomas at lip6.fr Thu Jan 2 03:47:11 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 11:47:11 -0000 Subject: [vmkit-commits] [vmkit] r198298 - better spli block Message-ID: <20140102114711.C258D2A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 05:47:11 2014 New Revision: 198298 URL: http://llvm.org/viewvc/llvm-project?rev=198298&view=rev Log: better spli block Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc 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=198298&r1=198297&r2=198298&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Thu Jan 2 05:47:11 2014 @@ -363,10 +363,11 @@ llvm::Value* J3CodeGen::nullCheck(llvm:: llvm::BasicBlock* succeed = newBB("nullcheck-succeed"); if(!bbNullCheckFailed) { + llvm::BasicBlock* prev = builder->GetInsertBlock(); bbNullCheckFailed = newBB("nullcheck-failed"); builder->SetInsertPoint(bbNullCheckFailed); builder->CreateInvoke(funcNullPointerException, bbRet, exceptions.nodes[curExceptionNode]->landingPad); - builder->SetInsertPoint(bb); + builder->SetInsertPoint(prev); } builder->CreateCondBr(builder->CreateIsNotNull(obj), succeed, bbNullCheckFailed); @@ -729,12 +730,27 @@ llvm::BasicBlock* J3CodeGen::forwardBran //fprintf(stderr, "--- instruction ---\n"); //insn->dump(); llvm::BasicBlock* before = insn->getParent(); - //fprintf(stderr, "--- basic block ---\n"); + llvm::BranchInst* fakeTerminator = 0; + bool isSelf = builder->GetInsertBlock() == before; + + //fprintf(stderr, "--- before split ---\n"); //before->dump(); + if(!before->getTerminator()) + fakeTerminator = llvm::BranchInst::Create(bbRet, before); + llvm::BasicBlock* after = before->splitBasicBlock(insn); + + if(fakeTerminator) + fakeTerminator->eraseFromParent(); + + if(isSelf) { + bb = after; + builder->SetInsertPoint(after); + } //fprintf(stderr, "--- after split ---\n"); //before->dump(); //after->dump(); + opInfos[pc].bb = after; return after; } else { @@ -1571,9 +1587,11 @@ void J3CodeGen::generateJava() { stack.init(this, maxStack, allocator->allocate(J3CodeGenVar::reservedSize(maxStack))); ret.init(this, 1, allocator->allocate(J3CodeGenVar::reservedSize(1))); - uint32_t n=0; + uint32_t n=0, pos=0; for(llvm::Function::arg_iterator cur=llvmFunction->arg_begin(); cur!=llvmFunction->arg_end(); cur++, n++) { - locals.setAt(flatten(cur, methodType->ins(n)), n); + J3Type* type = methodType->ins(n); + locals.setAt(flatten(cur, type), pos); + pos += (type == vm->typeLong || type == vm->typeDouble) ? 2 : 1; } //builder->CreateCall(ziTry); From gael.thomas at lip6.fr Thu Jan 2 03:58:34 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 11:58:34 -0000 Subject: [vmkit-commits] [vmkit] r198299 - Implement i2c Message-ID: <20140102115834.1D8C42A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 05:58:33 2014 New Revision: 198299 URL: http://llvm.org/viewvc/llvm-project?rev=198299&view=rev Log: Implement i2c Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc?rev=198299&r1=198298&r2=198299&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc Thu Jan 2 05:58:33 2014 @@ -51,6 +51,16 @@ extern "C" { jobject handle, jlong offset, jobject orig, jobject value) { return handle->rawCASObject(offset, orig, value) == orig; } + + JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwapInt(JNIEnv* env, jobject unsafe, + jobject handle, jlong offset, jint orig, jint value) { + return handle->rawCASInteger(offset, orig, value) == orig; + } + + JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_getIntVolatile(JNIEnv* env, jobject unsafe, + jobject handle, jlong offset) { + return handle->rawGetInteger(offset); + } } 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=198299&r1=198298&r2=198299&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Thu Jan 2 05:58:33 2014 @@ -1327,7 +1327,10 @@ void J3CodeGen::translate() { case J3Cst::BC_d2l: nyi(); /* 0x8f */ case J3Cst::BC_d2f: nyi(); /* 0x90 */ case J3Cst::BC_i2b: nyi(); /* 0x91 */ - case J3Cst::BC_i2c: nyi(); /* 0x92 */ + case J3Cst::BC_i2c: /* 0x92 */ + stack.push(builder->CreateZExt(builder->CreateTrunc(stack.pop(), builder->getInt16Ty()), builder->getInt32Ty())); + break; + case J3Cst::BC_i2s: nyi(); /* 0x93 */ case J3Cst::BC_lcmp: /* 0x94 */ 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=198299&r1=198298&r2=198299&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Thu Jan 2 05:58:33 2014 @@ -15,7 +15,7 @@ J3Options::J3Options() { debugEnterIndent = 1; - debugExecute = 0; + debugExecute = 2; debugLoad = 0; debugResolve = 0; debugIniting = 0; From gael.thomas at lip6.fr Thu Jan 2 04:20:49 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 12:20:49 -0000 Subject: [vmkit-commits] [vmkit] r198301 - Better management of null Java references in C++ code Message-ID: <20140102122050.091F02A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 06:20:49 2014 New Revision: 198301 URL: http://llvm.org/viewvc/llvm-project?rev=198301&view=rev Log: Better management of null Java references in C++ code Modified: vmkit/branches/mcjit/include/j3/j3object.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3jni.cc vmkit/branches/mcjit/lib/j3/vm/j3object.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Modified: vmkit/branches/mcjit/include/j3/j3object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=198301&r1=198300&r2=198301&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3object.h (original) +++ vmkit/branches/mcjit/include/j3/j3object.h Thu Jan 2 06:20:49 2014 @@ -193,7 +193,7 @@ namespace j3 { public: J3LocalReferences(vmkit::BumpAllocator* _allocator) : vmkit::Stack(_allocator) {} - J3ObjectHandle* push(J3ObjectHandle* handle) { return push(handle->obj()); } + J3ObjectHandle* push(J3ObjectHandle* handle) { return handle ? push(handle->obj()) : 0; } J3ObjectHandle* push(J3Object* obj); }; 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=198301&r1=198300&r2=198301&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan 2 06:20:49 2014 @@ -348,7 +348,12 @@ jclass JNICALL JVM_FindClassFromBootLoad * or NoClassDefFoundError depending on the value of the last * argument. */ -jclass JNICALL JVM_FindClassFromClassLoader(JNIEnv* env, const char *name, jboolean init, jobject loader, jboolean throwError) { enterJVM(); NYI(); leaveJVM(); } +jclass JNICALL JVM_FindClassFromClassLoader(JNIEnv* env, const char *name, jboolean init, jobject loader, jboolean throwError) { + enterJVM(); + fprintf(stderr, " class loader: %p\n", loader); + NYI(); + leaveJVM(); +} /* * Find a class from a given class. 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=198301&r1=198300&r2=198301&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Thu Jan 2 06:20:49 2014 @@ -357,7 +357,14 @@ void JNICALL SetStaticFloatField(JNIEnv* void JNICALL SetStaticDoubleField(JNIEnv* env, jclass clazz, jfieldID fieldID, jdouble value) { enterJVM(); leaveJVM(); NYI(); } jstring JNICALL NewString(JNIEnv* env, const jchar* unicode, jsize len) { enterJVM(); leaveJVM(); NYI(); } -jsize JNICALL GetStringLength(JNIEnv* env, jstring str) { enterJVM(); leaveJVM(); NYI(); } +jsize JNICALL GetStringLength(JNIEnv* env, jstring str) { + jsize res; + enterJVM(); + res = str->getObject(J3Thread::get()->vm()->stringClassValue)->arrayLength(); + leaveJVM(); + return res; +} + const jchar* JNICALL GetStringChars(JNIEnv* env, jstring str, jboolean* isCopy) { enterJVM(); leaveJVM(); NYI(); } void JNICALL ReleaseStringChars(JNIEnv* env, jstring str, const jchar* chars) { enterJVM(); leaveJVM(); NYI(); } @@ -371,13 +378,19 @@ jstring JNICALL NewStringUTF(JNIEnv* env return res; } -jsize JNICALL GetStringUTFLength(JNIEnv* env, jstring str) { enterJVM(); leaveJVM(); NYI(); } +jsize JNICALL GetStringUTFLength(JNIEnv* env, jstring str) { + jsize res; + enterJVM(); + res = str->getObject(J3Thread::get()->vm()->stringClassValue)->arrayLength(); + leaveJVM(); + return res; +} const char* JNICALL GetStringUTFChars(JNIEnv* env, jstring str, jboolean* isCopy) { char* res; enterJVM(); - J3* vm = str->vt()->type()->loader()->vm(); + J3* vm = J3Thread::get()->vm(); jobject content = str->getObject(vm->stringClassValue); uint32_t length = content->arrayLength(); res = new char[length+1]; @@ -455,7 +468,19 @@ jint JNICALL MonitorExit(JNIEnv* env, jo jint JNICALL GetJavaVM(JNIEnv* env, JavaVM** vm) { enterJVM(); leaveJVM(); NYI(); } void JNICALL GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len, jchar* buf) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL GetStringUTFRegion(JNIEnv* env, jstring str, jsize start, jsize len, char* buf) { enterJVM(); leaveJVM(); NYI(); } + +void JNICALL GetStringUTFRegion(JNIEnv* env, jstring str, jsize start, jsize len, char* buf) { + enterJVM(); + J3* vm = J3Thread::get()->vm(); + jobject content = str->getObject(vm->stringClassValue); + + for(uint32_t i=0; igetCharAt(start+i); + + //buf[len] = 0; + + leaveJVM(); +} void* JNICALL GetPrimitiveArrayCritical(JNIEnv* env, jarray array, jboolean* isCopy) { enterJVM(); leaveJVM(); NYI(); } void JNICALL ReleasePrimitiveArrayCritical(JNIEnv* env, jarray array, void* carray, jint mode) { enterJVM(); leaveJVM(); NYI(); } 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=198301&r1=198300&r2=198301&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Thu Jan 2 06:20:49 2014 @@ -468,9 +468,7 @@ J3ObjectHandle* J3ObjectHandle::rawCASOb return orig; else if(res == ov) return value; - else if(!res) - return 0; - else + else return J3Thread::get()->push(res); } @@ -479,7 +477,7 @@ void J3ObjectHandle::rawSetObject(uintpt } J3ObjectHandle* J3ObjectHandle::rawGetObject(uintptr_t offset) { - return obj() ? J3Thread::get()->push(*((J3Object**)((uintptr_t)obj() + offset))) : 0; + return J3Thread::get()->push(*((J3Object**)((uintptr_t)obj() + offset))); } void J3ObjectHandle::setObject(J3Field* field, J3ObjectHandle* value) { @@ -509,9 +507,12 @@ void J3ObjectHandle::rawArrayCopyTo(uint * J3LocalReferences */ J3ObjectHandle* J3LocalReferences::push(J3Object* obj) { - J3ObjectHandle* res = Stack::push(); - res->_obj = obj; - return res; + if(obj) { + J3ObjectHandle* res = Stack::push(); + res->_obj = obj; + return res; + } else + return 0; } /* @@ -524,17 +525,22 @@ J3GlobalReferences::J3GlobalReferences(v } J3ObjectHandle* J3GlobalReferences::add(J3ObjectHandle* handle) { - pthread_mutex_lock(&mutex); - J3ObjectHandle* res = emptySlots.isEmpty() ? references.push() : *emptySlots.pop(); - res->_obj = handle->_obj; - pthread_mutex_unlock(&mutex); - return res; + if(handle) { + pthread_mutex_lock(&mutex); + J3ObjectHandle* res = emptySlots.isEmpty() ? references.push() : *emptySlots.pop(); + res->_obj = handle->_obj; + pthread_mutex_unlock(&mutex); + return res; + } else + return 0; } void J3GlobalReferences::del(J3ObjectHandle* handle) { - handle->harakiri(); - pthread_mutex_lock(&mutex); - *emptySlots.push() = handle; - pthread_mutex_unlock(&mutex); + if(handle) { + handle->harakiri(); + pthread_mutex_lock(&mutex); + *emptySlots.push() = handle; + pthread_mutex_unlock(&mutex); + } } 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=198301&r1=198300&r2=198301&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Thu Jan 2 06:20:49 2014 @@ -15,7 +15,7 @@ J3Options::J3Options() { debugEnterIndent = 1; - debugExecute = 2; + debugExecute = 0; debugLoad = 0; debugResolve = 0; debugIniting = 0; Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=198301&r1=198300&r2=198301&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Thu Jan 2 06:20:49 2014 @@ -69,15 +69,6 @@ void J3LLVMSignature::generateCallerIR(J if(ret != builder.getVoidTy()) { if(ret->isPointerTy()) { codeGen->builder = &builder; - - llvm::BasicBlock* ifnull = llvm::BasicBlock::Create(caller->getContext(), "ifnull", caller); - llvm::BasicBlock* ifnotnull = llvm::BasicBlock::Create(caller->getContext(), "ifnotnull", caller); - builder.CreateCondBr(builder.CreateIsNull(res), ifnull, ifnotnull); - - builder.SetInsertPoint(ifnull); - builder.CreateRet(builder.getInt64(0)); - - builder.SetInsertPoint(ifnotnull); codeGen->currentThread(); res = builder.CreatePtrToInt(builder.CreateCall2(codeGen->funcJ3ThreadPush, codeGen->currentThread(), res), uint64Ty); From gael.thomas at lip6.fr Thu Jan 2 04:37:38 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 12:37:38 -0000 Subject: [vmkit-commits] [vmkit] r198302 - Implement JVM_FindClassFromClassLoader Message-ID: <20140102123738.3412E2A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 06:37:37 2014 New Revision: 198302 URL: http://llvm.org/viewvc/llvm-project?rev=198302&view=rev Log: Implement JVM_FindClassFromClassLoader Modified: vmkit/branches/mcjit/include/j3/j3.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3.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=198302&r1=198301&r2=198302&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Thu Jan 2 06:37:37 2014 @@ -123,6 +123,7 @@ namespace j3 { static JNIEnv* jniEnv(); + static void classNotFoundException(const vmkit::Name* name) __attribute__((noreturn)); static void noClassDefFoundError(const vmkit::Name* name) __attribute__((noreturn)); static void classFormatError(J3Class* cl, const wchar_t* reason, ...) __attribute__((noreturn)); static void noSuchMethodError(const wchar_t* msg, 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=198302&r1=198301&r2=198302&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan 2 06:37:37 2014 @@ -348,11 +348,31 @@ jclass JNICALL JVM_FindClassFromBootLoad * or NoClassDefFoundError depending on the value of the last * argument. */ -jclass JNICALL JVM_FindClassFromClassLoader(JNIEnv* env, const char *name, jboolean init, jobject loader, jboolean throwError) { - enterJVM(); - fprintf(stderr, " class loader: %p\n", loader); - NYI(); +jclass JNICALL JVM_FindClassFromClassLoader(JNIEnv* env, const char *jname, jboolean init, jobject jloader, jboolean throwError) { + jclass res; + enterJVM(); + J3* vm = J3Thread::get()->vm(); + if(jloader) + J3::internalError(L"implement me: jloader"); + J3ClassLoader* loader = J3Thread::get()->vm()->initialClassLoader; + const vmkit::Name* name = vm->names()->get(jname); + J3Class* cl = loader->loadClass(name); + if(!cl) { + if(throwError) + J3::noClassDefFoundError(name); + else + J3::classNotFoundException(name); + } + + if(init) + cl->initialise(); + else + cl->resolve(); + + res = cl->javaClass(); + leaveJVM(); + return res; } /* 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=198302&r1=198301&r2=198302&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Thu Jan 2 06:37:37 2014 @@ -188,6 +188,10 @@ void J3::nullPointerException() { internalError(L"implement me: null pointer exception"); } +void J3::classNotFoundException(const vmkit::Name* name) { + internalError(L"ClassNotFoundException: %ls", name); +} + void J3::noClassDefFoundError(const vmkit::Name* name) { internalError(L"NoClassDefFoundError: %ls", name); } 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=198302&r1=198301&r2=198302&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Thu Jan 2 06:37:37 2014 @@ -477,8 +477,7 @@ void JNICALL GetStringUTFRegion(JNIEnv* for(uint32_t i=0; igetCharAt(start+i); - //buf[len] = 0; - + buf[len] = 0; leaveJVM(); } From gael.thomas at lip6.fr Thu Jan 2 05:32:17 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 13:32:17 -0000 Subject: [vmkit-commits] [vmkit] r198303 - Use char* to represent utf8 Message-ID: <20140102133218.0E5FA2A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 07:32:16 2014 New Revision: 198303 URL: http://llvm.org/viewvc/llvm-project?rev=198303&view=rev Log: Use char* to represent utf8 Added: vmkit/branches/mcjit/include/j3/j3utf16.h Modified: vmkit/branches/mcjit/include/j3/j3.h vmkit/branches/mcjit/include/j3/j3classloader.h vmkit/branches/mcjit/include/j3/j3constants.h vmkit/branches/mcjit/include/vmkit/names.h vmkit/branches/mcjit/include/vmkit/util.h vmkit/branches/mcjit/include/vmkit/vmkit.h vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3attribute.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/j3codegenexception.cc vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc vmkit/branches/mcjit/lib/j3/vm/j3constants.cc vmkit/branches/mcjit/lib/j3/vm/j3field.cc vmkit/branches/mcjit/lib/j3/vm/j3jni.cc vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3object.cc vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc vmkit/branches/mcjit/lib/vmkit/allocator.cc vmkit/branches/mcjit/lib/vmkit/compiler.cc vmkit/branches/mcjit/lib/vmkit/names.cc vmkit/branches/mcjit/lib/vmkit/util.cc vmkit/branches/mcjit/lib/vmkit/vmkit.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Thu Jan 2 07:32:16 2014 @@ -119,16 +119,16 @@ namespace j3 { void run(); void start(int argc, char** argv); - void vinternalError(const wchar_t* msg, va_list va) __attribute__((noreturn)); + void vinternalError(const char* msg, va_list va) __attribute__((noreturn)); static JNIEnv* jniEnv(); static void classNotFoundException(const vmkit::Name* name) __attribute__((noreturn)); static void noClassDefFoundError(const vmkit::Name* name) __attribute__((noreturn)); - static void classFormatError(J3Class* cl, const wchar_t* reason, ...) __attribute__((noreturn)); - static void noSuchMethodError(const wchar_t* msg, + static void classFormatError(J3Class* cl, const char* reason, ...) __attribute__((noreturn)); + static void noSuchMethodError(const char* msg, J3Class* clName, const vmkit::Name* name, const vmkit::Name* sign) __attribute__((noreturn)); - static void noSuchFieldError(const wchar_t* msg, + static void noSuchFieldError(const char* msg, J3Class* clName, const vmkit::Name* name, J3Type* type) __attribute__((noreturn)); static void linkageError(J3Method* method) __attribute__((noreturn)); Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Thu Jan 2 07:32:16 2014 @@ -24,11 +24,11 @@ namespace j3 { class J3Class; class J3ClassLoader : public vmkit::CompilationUnit { - struct J3MethodLess : public std::binary_function { + struct J3MethodLess { bool operator()(const J3Method* lhs, const J3Method* rhs) const; }; - struct J3InterfaceMethodLess : public std::binary_function { + struct J3InterfaceMethodLess { bool operator()(const J3Method* lhs, const J3Method* rhs) const; }; @@ -80,13 +80,10 @@ namespace j3 { const vmkit::Name* name, const vmkit::Name* sign); J3Method* method(uint16_t access, const vmkit::Name* clName, const vmkit::Name* name, const vmkit::Name* sign); - J3Method* method(uint16_t access, J3Class* cl, const wchar_t* name, const wchar_t* sign); - J3Method* method(uint16_t access, const wchar_t* clName, const wchar_t* name, const wchar_t* sign); J3Class* defineClass(const vmkit::Name* name, J3ClassBytes* bytes); J3Class* findLoadedClass(const vmkit::Name* name); virtual J3Class* loadClass(const vmkit::Name* name); - J3Class* loadClass(const wchar_t* name); J3Type* getType(J3Class* from, const vmkit::Name* type); /* find a type */ J3MethodType* getMethodType(J3Class* from, const vmkit::Name* sign); /* get a method type */ Modified: vmkit/branches/mcjit/include/j3/j3constants.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3constants.h?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3constants.h (original) +++ vmkit/branches/mcjit/include/j3/j3constants.h Thu Jan 2 07:32:16 2014 @@ -24,21 +24,21 @@ namespace j3 { static const int MAGIC = 0xcafebabe; #define onJavaConstantNames(_) \ - _(clinitName, L"") \ - _(clinitSign, L"()V") \ - _(initName, L"") \ + _(clinitName, "") \ + _(clinitSign, "()V") \ + _(initName, "") \ \ - _(codeAttribute, L"Code") \ - _(constantValueAttribute, L"ConstantValue") \ - _(annotationsAttribute, L"RuntimeVisibleAnnotations") \ - _(exceptionsAttribute, L"Exceptions") \ - _(lineNumberTableAttribute, L"LineNumberTable") \ - _(innerClassesAttribute, L"InnerClasses") \ - _(sourceFileAttribute, L"SourceFile") \ - _(signatureAttribute, L"Signature") \ - _(enclosingMethodAttribute, L"EnclosingMethod") \ - _(paramAnnotationsAttribute, L"RuntimeVisibleParameterAnnotations") \ - _(annotationDefaultAttribute, L"AnnotationDefault") + _(codeAttribute, "Code") \ + _(constantValueAttribute, "ConstantValue") \ + _(annotationsAttribute, "RuntimeVisibleAnnotations") \ + _(exceptionsAttribute, "Exceptions") \ + _(lineNumberTableAttribute, "LineNumberTable") \ + _(innerClassesAttribute, "InnerClasses") \ + _(sourceFileAttribute, "SourceFile") \ + _(signatureAttribute, "Signature") \ + _(enclosingMethodAttribute, "EnclosingMethod") \ + _(paramAnnotationsAttribute, "RuntimeVisibleParameterAnnotations") \ + _(annotationDefaultAttribute, "AnnotationDefault") static char nativePrefix[]; @@ -79,20 +79,20 @@ namespace j3 { #undef DO_IS - static const wchar_t ID_Void = 'V'; - static const wchar_t ID_Byte = 'B'; - static const wchar_t ID_Char = 'C'; - static const wchar_t ID_Double = 'D'; - static const wchar_t ID_Float = 'F'; - static const wchar_t ID_Integer = 'I'; - static const wchar_t ID_Long = 'J'; - static const wchar_t ID_Classname = 'L'; - static const wchar_t ID_End = ';'; - static const wchar_t ID_Short = 'S'; - static const wchar_t ID_Boolean = 'Z'; - static const wchar_t ID_Array = '['; - static const wchar_t ID_Left = '('; - static const wchar_t ID_Right = ')'; + static const char ID_Void = 'V'; + static const char ID_Byte = 'B'; + static const char ID_Char = 'C'; + static const char ID_Double = 'D'; + static const char ID_Float = 'F'; + static const char ID_Integer = 'I'; + static const char ID_Long = 'J'; + static const char ID_Classname = 'L'; + static const char ID_End = ';'; + static const char ID_Short = 'S'; + static const char ID_Boolean = 'Z'; + static const char ID_Array = '['; + static const char ID_Left = '('; + static const char ID_Right = ')'; static const uint8_t T_BOOLEAN = 4; static const uint8_t T_CHAR = 5; Added: vmkit/branches/mcjit/include/j3/j3utf16.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3utf16.h?rev=198303&view=auto ============================================================================== --- vmkit/branches/mcjit/include/j3/j3utf16.h (added) +++ vmkit/branches/mcjit/include/j3/j3utf16.h Thu Jan 2 07:32:16 2014 @@ -0,0 +1,37 @@ +#ifndef _J3_UTF16_H_ +#define _J3_UTF16_H_ + +namespace j3 { + class J3Utf16Converter { + const vmkit::Name* name; + size_t pos; + public: + J3Utf16Converter(const vmkit::Name* _name) { name = _name; pos = 0; } + + bool isEof() { return pos == name->length(); } + + uint16_t nextUtf16() { + const char* str = name->cStr(); + size_t n = 0; + size_t i = 0; + uint16_t x = str[pos++]; + + if(x & 0x80) { + uint16_t y = str[pos++]; + if (x & 0x20) { + char z = str[pos++]; + x = ((x & 0x0F) << 12) + + ((y & 0x3F) << 6) + + (z & 0x3F); + } else { + x = ((x & 0x1F) << 6) + + (y & 0x3F); + } + } + + return x; + } + }; +} + +#endif Modified: vmkit/branches/mcjit/include/vmkit/names.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/names.h?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/names.h (original) +++ vmkit/branches/mcjit/include/vmkit/names.h Thu Jan 2 07:32:16 2014 @@ -8,19 +8,19 @@ namespace vmkit { class Name : public PermanentObject { - uint32_t _length; - wchar_t _content[1]; + size_t _length; + char _content[1]; public: void* operator new(size_t unused, BumpAllocator* allocator, size_t length); - Name(uint32_t length, const wchar_t* content); + Name(size_t length, const char* content); - const wchar_t* cStr() const { + const char* cStr() const { return _content; } - uint32_t length() const { + size_t length() const { return _length; } @@ -31,14 +31,15 @@ namespace vmkit { BumpAllocator* allocator; pthread_mutex_t mutex; - std::map > > names; + std::map > > names; + const Name* get(const char* s, size_t length); public: Names(BumpAllocator* allocator); - const Name* get(const wchar_t* s); - const Name* get(const char* s, size_t start=0, size_t length=-1); + const Name* get(const char* s); + const Name* get(const char* s, size_t start, size_t length); const Name* get(char c); }; Modified: vmkit/branches/mcjit/include/vmkit/util.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/util.h?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/util.h (original) +++ vmkit/branches/mcjit/include/vmkit/util.h Thu Jan 2 07:32:16 2014 @@ -12,13 +12,8 @@ namespace vmkit { bool operator()(const char* s1, const char* s2) const; }; - struct wchar_t_less_t { - bool operator()(const wchar_t* lhs, const wchar_t* rhs) const; - }; - static struct char_less_t char_less; static struct char_less_t_dbg char_less_dbg; - static struct wchar_t_less_t wchar_t_less; }; }; Modified: vmkit/branches/mcjit/include/vmkit/vmkit.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/vmkit.h?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/vmkit.h (original) +++ vmkit/branches/mcjit/include/vmkit/vmkit.h Thu Jan 2 07:32:16 2014 @@ -33,7 +33,7 @@ namespace vmkit { void addSymbol(llvm::GlobalValue* gv); - static void defaultInternalError(const wchar_t* msg, va_list va) __attribute__((noreturn)); + static void defaultInternalError(const char* msg, va_list va) __attribute__((noreturn)); protected: void* operator new(size_t n, BumpAllocator* allocator); @@ -62,13 +62,13 @@ namespace vmkit { llvm::GlobalValue* introspectGlobalValue(llvm::Module* dest, const char* name); llvm::Type* introspectType(const char* name); - void log(const wchar_t* msg, ...); + void log(const char* msg, ...); - virtual void vinternalError(const wchar_t* msg, va_list va) __attribute__((noreturn)); + virtual void vinternalError(const char* msg, va_list va) __attribute__((noreturn)); virtual void sigsegv(uintptr_t addr) __attribute__((noreturn)); virtual void sigend() __attribute__((noreturn)); - static void internalError(const wchar_t* msg, ...) __attribute__((noreturn)); + static void internalError(const char* msg, ...) __attribute__((noreturn)); static void throwException(void* obj) __attribute__((noreturn)); }; }; Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Thu Jan 2 07:32:16 2014 @@ -23,11 +23,11 @@ static const char* rtjar = OPENJDK_HOME" void J3Lib::bootstrap(J3* vm) { J3ObjectHandle* prev = J3Thread::get()->tell(); - J3Class* threadGroupClass = vm->initialClassLoader->loadClass(vm->names()->get(L"java/lang/ThreadGroup")); + J3Class* threadGroupClass = vm->initialClassLoader->loadClass(vm->names()->get("java/lang/ThreadGroup")); J3Method* sysThreadGroupInit = vm->initialClassLoader->method(0, threadGroupClass, vm->initName, - vm->names()->get(L"()V")); + vm->names()->get("()V")); J3ObjectHandle* sysThreadGroup = J3ObjectHandle::doNewObject(sysThreadGroupInit->cl()); sysThreadGroupInit->invokeSpecial(sysThreadGroup); @@ -35,22 +35,25 @@ void J3Lib::bootstrap(J3* vm) { J3Method* appThreadGroupInit = vm->initialClassLoader->method(0, threadGroupClass, vm->initName, - vm->names()->get(L"(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); + vm->names()->get("(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); J3ObjectHandle* appThreadGroup = J3ObjectHandle::doNewObject(appThreadGroupInit->cl()); appThreadGroupInit->invokeSpecial(appThreadGroup, sysThreadGroup, vm->utfToString("main")); J3Method* threadInit = vm->initialClassLoader->method(0, vm->threadClass, vm->initName, - vm->names()->get(L"(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); + vm->names()->get("(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); J3ObjectHandle* mainThread = J3ObjectHandle::doNewObject(threadInit->cl()); J3Thread::get()->assocJavaThread(mainThread); - mainThread->setInteger(threadInit->cl()->findVirtualField(vm->names()->get(L"priority"), vm->typeInteger), 5); + mainThread->setInteger(threadInit->cl()->findVirtualField(vm->names()->get("priority"), vm->typeInteger), 5); threadInit->invokeSpecial(mainThread, appThreadGroup, vm->utfToString("main")); - vm->initialClassLoader->method(J3Cst::ACC_STATIC, L"java/lang/System", L"initializeSystemClass", L"()V")->invokeStatic(); + vm->initialClassLoader->method(J3Cst::ACC_STATIC, + vm->names()->get("java/lang/System"), + vm->names()->get("initializeSystemClass"), + vm->names()->get("()V"))->invokeStatic(); J3Thread::get()->restore(prev); } 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=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan 2 07:32:16 2014 @@ -13,7 +13,7 @@ using namespace j3; #define enterJVM() #define leaveJVM() -#define NYI() { J3Thread::get()->vm()->internalError(L"not yet implemented: '%s'", __PRETTY_FUNCTION__); } +#define NYI() { J3Thread::get()->vm()->internalError("not yet implemented: '%s'", __PRETTY_FUNCTION__); } /************************************************************************* @@ -56,7 +56,7 @@ jstring JNICALL JVM_InternString(JNIEnv* J3ObjectHandle* value = str->getObject(vm->stringClassValue); uint32_t length = value->arrayLength(); - wchar_t copy[length+1]; + char copy[length+1]; for(uint32_t i=0; igetCharAt(i); @@ -268,7 +268,7 @@ jclass JNICALL JVM_GetCallerClass(JNIEnv enterJVM(); if(depth != -1) - J3::internalError(L"depth should be -1 while it is %d", depth); + J3::internalError("depth should be -1 while it is %d", depth); depth = 3; J3Method* caller = 0; @@ -286,7 +286,7 @@ jclass JNICALL JVM_GetCallerClass(JNIEnv } if(!caller) - J3::internalError(L"unable to find caller class, what should I do?"); + J3::internalError("unable to find caller class, what should I do?"); res = caller->cl()->javaClass(); @@ -309,25 +309,25 @@ jclass JNICALL JVM_FindPrimitiveClass(JN J3Class* res; if(!strcmp(utf, "boolean")) - res = loader->loadClass(names->get(L"java/lang/Boolean")); + res = loader->loadClass(names->get("java/lang/Boolean")); else if(!strcmp(utf, "byte")) - res = loader->loadClass(names->get(L"java/lang/Byte")); + res = loader->loadClass(names->get("java/lang/Byte")); else if(!strcmp(utf, "char")) - res = loader->loadClass(names->get(L"java/lang/Character")); + res = loader->loadClass(names->get("java/lang/Character")); else if(!strcmp(utf, "short")) - res = loader->loadClass(names->get(L"java/lang/Short")); + res = loader->loadClass(names->get("java/lang/Short")); else if(!strcmp(utf, "int")) - res = loader->loadClass(names->get(L"java/lang/Integer")); + res = loader->loadClass(names->get("java/lang/Integer")); else if(!strcmp(utf, "long")) - res = loader->loadClass(names->get(L"java/lang/Long")); + res = loader->loadClass(names->get("java/lang/Long")); else if(!strcmp(utf, "float")) - res = loader->loadClass(names->get(L"java/lang/Float")); + res = loader->loadClass(names->get("java/lang/Float")); else if(!strcmp(utf, "double")) - res = loader->loadClass(names->get(L"java/lang/Double")); + res = loader->loadClass(names->get("java/lang/Double")); else if(!strcmp(utf, "void")) - res = loader->loadClass(names->get(L"java/lang/Void")); + res = loader->loadClass(names->get("java/lang/Void")); else - J3::internalError(L"unsupported primitive: %s", utf); + J3::internalError("unsupported primitive: %s", utf); leaveJVM(); return res->javaClass(); @@ -353,7 +353,7 @@ jclass JNICALL JVM_FindClassFromClassLoa enterJVM(); J3* vm = J3Thread::get()->vm(); if(jloader) - J3::internalError(L"implement me: jloader"); + J3::internalError("implement me: jloader"); J3ClassLoader* loader = J3Thread::get()->vm()->initialClassLoader; const vmkit::Name* name = vm->names()->get(jname); J3Class* cl = loader->loadClass(name); 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=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Thu Jan 2 07:32:16 2014 @@ -11,6 +11,7 @@ #include "j3/j3trampoline.h" #include "j3/j3lib.h" #include "j3/j3field.h" +#include "j3/j3utf16.h" #include "llvm/IR/Type.h" #include "llvm/IR/DerivedTypes.h" @@ -104,33 +105,33 @@ void J3::run() { nbArrayInterfaces = 2; arrayInterfaces = (J3Type**)initialClassLoader->allocator()->allocate(2*sizeof(J3Type*)); - arrayInterfaces[0] = z_class(L"java/lang/Cloneable"); - arrayInterfaces[1] = z_class(L"java/io/Serializable"); + arrayInterfaces[0] = z_class("java/lang/Cloneable"); + arrayInterfaces[1] = z_class("java/io/Serializable"); charArrayClass = typeChar->getArray(); - objectClass = z_class(L"java/lang/Object"); + objectClass = z_class("java/lang/Object"); - stringClass = z_class(L"java/lang/String"); - stringClassInit = z_method(0, stringClass, initName, names()->get(L"([CZ)V")); - stringClassValue = z_field(0, stringClass, L"value", charArrayClass); + stringClass = z_class("java/lang/String"); + stringClassInit = z_method(0, stringClass, initName, names()->get("([CZ)V")); + stringClassValue = z_field(0, stringClass, "value", charArrayClass); - classClass = z_class(L"java/lang/Class"); - J3Field hf(J3Cst::ACC_PRIVATE, names()->get(L"** vmData **"), typeLong); + classClass = z_class("java/lang/Class"); + J3Field hf(J3Cst::ACC_PRIVATE, names()->get("** vmData **"), typeLong); classClass->resolve(&hf, 1); - classClassInit = z_method(0, classClass, initName, names()->get(L"()V")); + classClassInit = z_method(0, classClass, initName, names()->get("()V")); classClassVMData = classClass->findVirtualField(hf.name(), hf.type()); - threadClass = z_class(L"java/lang/Thread"); - threadClassRun = z_method(0, threadClass, L"run", L"()V"); + threadClass = z_class("java/lang/Thread"); + threadClassRun = z_method(0, threadClass, names()->get("run"), names()->get("()V")); threadClassVMData = initialClassLoader->loadClass(names()->get("java/lang/Thread")) - ->findVirtualField(names()->get(L"eetop"), typeLong); + ->findVirtualField(names()->get("eetop"), typeLong); - fieldClass = z_class(L"java/lang/reflect/Field"); + fieldClass = z_class("java/lang/reflect/Field"); fieldClassInit = z_method(0, fieldClass, initName, - names()->get(L"(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;IILjava/lang/String;[B)V")); - fieldClassClass = z_field(0, fieldClass, L"clazz", classClass); - fieldClassSlot = z_field(0, fieldClass, L"slot", typeInteger); - fieldClassAccess = z_field(0, fieldClass, L"modifiers", typeInteger); + names()->get("(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;IILjava/lang/String;[B)V")); + fieldClassClass = z_field(0, fieldClass, "clazz", classClass); + fieldClassSlot = z_field(0, fieldClass, "slot", typeInteger); + fieldClassAccess = z_field(0, fieldClass, "modifiers", typeInteger); #if 0 J3Field* fieldClassSlot; @@ -165,11 +166,17 @@ J3ObjectHandle* J3::nameToString(const v J3ObjectHandle* res = nameToCharArrays[name]; if(!res) { J3ObjectHandle* prev = J3Thread::get()->tell(); - res = initialClassLoader->globalReferences()->add(J3ObjectHandle::doNewArray(charArrayClass, name->length())); + uint16_t buf[name->length()]; + size_t pos = 0; + J3Utf16Converter converter(name); + + while(!converter.isEof()) + buf[pos++] = converter.nextUtf16(); + + res = initialClassLoader->globalReferences()->add(J3ObjectHandle::doNewArray(charArrayClass, pos)); + res->setRegionChar(0, buf, 0, pos); J3Thread::get()->restore(prev); - for(uint32_t i=0; ilength(); i++) - res->setCharAt(i, name->cStr()[i]); nameToCharArrays[name] = res; } pthread_mutex_unlock(&stringsMutex); @@ -181,58 +188,58 @@ J3ObjectHandle* J3::utfToString(const ch } void J3::classCastException() { - internalError(L"implement me: class cast exception"); + internalError("implement me: class cast exception"); } void J3::nullPointerException() { - internalError(L"implement me: null pointer exception"); + internalError("implement me: null pointer exception"); } void J3::classNotFoundException(const vmkit::Name* name) { - internalError(L"ClassNotFoundException: %ls", name); + internalError("ClassNotFoundException: %s", name); } void J3::noClassDefFoundError(const vmkit::Name* name) { - internalError(L"NoClassDefFoundError: %ls", name); + internalError("NoClassDefFoundError: %s", name); } -void J3::noSuchMethodError(const wchar_t* msg, J3Class* cl, const vmkit::Name* name, const vmkit::Name* sign) { - internalError(L"%ls: %ls::%ls %ls", msg, cl->name()->cStr(), name->cStr(), sign->cStr()); +void J3::noSuchMethodError(const char* msg, J3Class* cl, const vmkit::Name* name, const vmkit::Name* sign) { + internalError("%s: %s::%s %s", msg, cl->name()->cStr(), name->cStr(), sign->cStr()); } -void J3::noSuchFieldError(const wchar_t* msg, J3Class* cl, const vmkit::Name* name, J3Type* type) { - internalError(L"%ls: %ls::%ls %ls", msg, cl->name()->cStr(), name->cStr(), type->name()->cStr()); +void J3::noSuchFieldError(const char* msg, J3Class* cl, const vmkit::Name* name, J3Type* type) { + internalError("%s: %s::%s %s", msg, cl->name()->cStr(), name->cStr(), type->name()->cStr()); } -void J3::classFormatError(J3Class* cl, const wchar_t* reason, ...) { - wchar_t buf[65536]; +void J3::classFormatError(J3Class* cl, const char* reason, ...) { + char buf[65536]; va_list va; va_start(va, reason); - vswprintf(buf, 65536, reason, va); + vsnprintf(buf, 65536, reason, va); va_end(va); - internalError(L"ClassFormatError in '%ls' caused by '%ls'", cl->name()->cStr(), buf); + internalError("ClassFormatError in '%s' caused by '%s'", cl->name()->cStr(), buf); } void J3::linkageError(J3Method* method) { - internalError(L"unable to find native method '%ls::%ls%ls'", method->cl()->name()->cStr(), method->name()->cStr(), method->sign()->cStr()); + internalError("unable to find native method '%s::%s%s'", method->cl()->name()->cStr(), method->name()->cStr(), method->sign()->cStr()); } void J3::arrayStoreException() { - internalError(L"array store exception"); + internalError("array store exception"); } void J3::arrayIndexOutOfBoundsException() { - internalError(L"array bound check exception"); + internalError("array bound check exception"); } void J3::illegalMonitorStateException() { - internalError(L"illegal monitor state exception"); + internalError("illegal monitor state exception"); } -void J3::vinternalError(const wchar_t* msg, va_list va) { - wchar_t buf[65536]; - vswprintf(buf, 65536, msg, va); - fprintf(stderr, "Internal error: %ls\n", buf); +void J3::vinternalError(const char* msg, va_list va) { + char buf[65536]; + vsnprintf(buf, 65536, msg, va); + fprintf(stderr, "Internal error: %s\n", buf); printStackTrace(); // exit(1); abort(); @@ -246,7 +253,7 @@ void J3::printStackTrace() { if(sf) { J3Method* m = ((J3MethodCode*)sf->unit()->getSymbol(sf->functionName()))->self; - fprintf(stderr, " in %ls %ls::%ls index %d\n", m->sign()->cStr(), m->cl()->name()->cStr(), m->name()->cStr(), + fprintf(stderr, " in %s %s::%s index %d\n", m->sign()->cStr(), m->cl()->name()->cStr(), m->name()->cStr(), sf->sourceIndex()); } else { Dl_info info; Modified: vmkit/branches/mcjit/lib/j3/vm/j3attribute.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3attribute.cc?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3attribute.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3attribute.cc Thu Jan 2 07:32:16 2014 @@ -5,7 +5,7 @@ using namespace j3; J3Attribute* J3Attributes::attribute(size_t n) { if(n >= _nbAttributes) - J3::internalError(L"should not happen"); + J3::internalError("should not happen"); return _attributes + n; } 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=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Thu Jan 2 07:32:16 2014 @@ -46,7 +46,7 @@ J3VirtualTable* J3Type::vtAndResolve() { } void J3Type::dump() { - fprintf(stderr, "Type: %ls", name()->cStr()); + fprintf(stderr, "Type: %s", name()->cStr()); } J3ObjectHandle* J3Type::javaClass() { @@ -65,7 +65,7 @@ J3ObjectHandle* J3Type::javaClass() { } void J3Type::doNativeName() { - J3::internalError(L"should not happen"); + J3::internalError("should not happen"); } char* J3Type::nativeName() { @@ -112,7 +112,7 @@ J3Type* J3Type::resolve(J3Field* hiddenF if(status < RESOLVED) doResolve(hiddenFields, nbHiddenFields); else - J3::internalError(L"trying to resolve class %ls with hidden fields while it is already loaded", name()->cStr()); + J3::internalError("trying to resolve class %s with hidden fields while it is already loaded", name()->cStr()); return this; } @@ -124,37 +124,37 @@ J3Type* J3Type::initialise() { J3Class* J3Type::asClass() { if(!isClass()) - J3::internalError(L"should not happen"); + J3::internalError("should not happen"); return (J3Class*)this; } J3Layout* J3Type::asLayout() { if(!isLayout()) - J3::internalError(L"should not happen"); + J3::internalError("should not happen"); return (J3Layout*)this; } J3StaticLayout* J3Type::asStaticLayout() { if(!isStaticLayout()) - J3::internalError(L"should not happen"); + J3::internalError("should not happen"); return (J3StaticLayout*)this; } J3Primitive* J3Type::asPrimitive() { if(!isPrimitive()) - J3::internalError(L"should not happen"); + J3::internalError("should not happen"); return (J3Primitive*)this; } J3ArrayClass* J3Type::asArrayClass() { if(!isArrayClass()) - J3::internalError(L"should not happen"); + J3::internalError("should not happen"); return (J3ArrayClass*)this; } J3ObjectType* J3Type::asObjectType() { if(!isObjectType()) - J3::internalError(L"should not happen"); + J3::internalError("should not happen"); return (J3ObjectType*)this; } @@ -169,11 +169,11 @@ llvm::Type* J3ObjectType::llvmType() { } J3Method* J3ObjectType::findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error) { - J3::internalError(L"should not happe: %ls::%ls\n", J3ObjectType::name()->cStr(), name->cStr()); + J3::internalError("should not happe: %s::%s\n", J3ObjectType::name()->cStr(), name->cStr()); } J3Method* J3ObjectType::findStaticMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error) { - J3::internalError(L"should not happen"); + J3::internalError("should not happen"); } J3ObjectType* J3ObjectType::nativeClass(J3ObjectHandle* handle) { @@ -181,7 +181,7 @@ J3ObjectType* J3ObjectType::nativeClass( } void J3ObjectType::prepareInterfaceTable() { - //fprintf(stderr, "prepare interface table of %ls\n", name()->cStr()); + //fprintf(stderr, "prepare interface table of %s\n", name()->cStr()); uint32_t total = 0; J3InterfaceSlotDescriptor* slots = _interfaceSlotDescriptors; @@ -192,10 +192,10 @@ void J3ObjectType::prepareInterfaceTable if(type->isClass()) { J3Class* ifce = vt()->checker()->secondaryTypes[i]->type()->asClass(); if(J3Cst::isInterface(ifce->access())) { - //fprintf(stderr, " processing interface: %ls\n", ifce->name()->cStr()); + //fprintf(stderr, " processing interface: %s\n", ifce->name()->cStr()); for(uint32_t j=0; jnbMethods(); j++) { J3Method* base = ifce->methods()[j]; - //fprintf(stderr, " processing %s method %ls %ls\n", + //fprintf(stderr, " processing %s method %s %s\n", //J3Cst::isAbstract(base->access()) ? "abstract" : "concrete", //base->sign()->cStr(), base->name()->cStr()); J3Method* method = findVirtualMethod(base->name(), base->sign(), J3Cst::isAbstract(base->access())); @@ -229,12 +229,12 @@ void J3ObjectType::prepareInterfaceTable void J3ObjectType::dumpInterfaceSlotDescriptors() { J3InterfaceSlotDescriptor* slots = _interfaceSlotDescriptors; - fprintf(stderr, "slot descriptors of %ls\n", name()->cStr()); + fprintf(stderr, "slot descriptors of %s\n", name()->cStr()); for(uint32_t i=0; icl()->name()->cStr(), slots[i].methods[j]->name()->cStr(), slots[i].methods[j]->sign()->cStr()); @@ -264,8 +264,8 @@ J3Method* J3Layout::findMethod(const vmk for(size_t i=0; iname()->cStr(), cur->sign()->cStr()); - //printf("%ls - %ls\n", name->cStr(), sign->cStr()); + //printf("%s - %s\n", cur->name()->cStr(), cur->sign()->cStr()); + //printf("%s - %s\n", name->cStr(), sign->cStr()); if(cur->name() == name && cur->sign() == sign) { return cur; } @@ -277,8 +277,8 @@ J3Field* J3Layout::findField(const vmkit for(size_t i=0; iname()->cStr(), cur->type()->name()->cStr()); - //printf(" with %ls - %ls\n", name->cStr(), type->name()->cStr()); + //printf("Compare %s - %s\n", cur->name()->cStr(), cur->type()->name()->cStr()); + //printf(" with %s - %s\n", name->cStr(), type->name()->cStr()); if(cur->name() == name && cur->type() == type) { return cur; } @@ -298,13 +298,13 @@ J3Class::J3Class(J3ClassLoader* loader, J3ObjectHandle* J3Class::extractAttribute(J3Attribute* attr) { if(attr) - J3::internalError(L"extract attribute"); + J3::internalError("extract attribute"); else return J3ObjectHandle::doNewArray(loader()->vm()->typeByte->getArray(), 0); } J3Method* J3Class::findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error) { - //loader()->vm()->log(L"Lookup: %ls %ls in %ls (%d)", methName->cStr(), methSign->cStr(), name()->cStr(), nbVirtualMethods); + //loader()->vm()->log("Lookup: %s %s in %s (%d)", methName->cStr(), methSign->cStr(), name()->cStr(), nbVirtualMethods); resolve(); J3Class* cur = this; @@ -317,7 +317,7 @@ J3Method* J3Class::findVirtualMethod(con if(cur == cur->super()) { if(error) - J3::noSuchMethodError(L"no such method", this, name, sign); + J3::noSuchMethodError("no such method", this, name, sign); else return 0; } @@ -326,7 +326,7 @@ J3Method* J3Class::findVirtualMethod(con } J3Method* J3Class::findStaticMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error) { - //loader()->vm()->log(L"Lookup: %ls %ls in %ls", methName->cStr(), methSign->cStr(), name()->cStr()); + //loader()->vm()->log("Lookup: %s %s in %s", methName->cStr(), methSign->cStr(), name()->cStr()); resolve(); J3Class* cur = this; @@ -339,7 +339,7 @@ J3Method* J3Class::findStaticMethod(cons if(cur == cur->super()) { if(error) - J3::noSuchMethodError(L"no such method", this, name, sign); + J3::noSuchMethodError("no such method", this, name, sign); else return 0; } @@ -348,7 +348,7 @@ J3Method* J3Class::findStaticMethod(cons } J3Field* J3Class::findVirtualField(const vmkit::Name* name, J3Type* type, bool error) { - //loader()->vm()->log(L"Lookup: %ls %ls in %ls", type->name()->cStr(), name->cStr(), J3Class::name()->cStr()); + //loader()->vm()->log("Lookup: %s %s in %s", type->name()->cStr(), name->cStr(), J3Class::name()->cStr()); resolve(); J3Class* cur = this; @@ -360,7 +360,7 @@ J3Field* J3Class::findVirtualField(const if(cur == cur->super()) { if(error) - J3::noSuchFieldError(L"no such field", this, name, type); + J3::noSuchFieldError("no such field", this, name, type); else return 0; } @@ -369,13 +369,13 @@ J3Field* J3Class::findVirtualField(const } J3Field* J3Class::findStaticField(const vmkit::Name* fname, J3Type* ftype, bool error) { - //fprintf(stderr, "Lookup static field %ls %ls::%ls\n", ftype->name()->cStr(), name()->cStr(), fname->cStr()); + //fprintf(stderr, "Lookup static field %s %s::%s\n", ftype->name()->cStr(), name()->cStr(), fname->cStr()); resolve(); J3Field* res = staticLayout()->findField(fname, ftype); if(!res) - J3::internalError(L"implement me"); + J3::internalError("implement me"); return res; } @@ -386,7 +386,7 @@ void J3Class::registerNative(const vmkit if(!res) res = findMethod(methName, methSign); if(!res || !J3Cst::isNative(res->access())) - J3::noSuchMethodError(L"unable to find native method", this, methName, methSign); + J3::noSuchMethodError("unable to find native method", this, methName, methSign); res->registerNative(fnPtr); } @@ -400,7 +400,7 @@ void J3Class::doInitialise() { lock(); if(status < INITED) { if(loader()->vm()->options()->debugIniting) - fprintf(stderr, "Initing: %ls\n", name()->cStr()); + fprintf(stderr, "Initing: %s\n", name()->cStr()); status = INITED; super()->initialise(); @@ -424,7 +424,7 @@ void J3Class::doInitialise() { uint32_t length = reader.readU4(); if(length != 2) - J3::classFormatError(this, L"bad length for ConstantAttribute"); + J3::classFormatError(this, "bad length for ConstantAttribute"); uint32_t idx = reader.readU2(); @@ -435,7 +435,7 @@ void J3Class::doInitialise() { case J3Cst::CONSTANT_Integer: staticInstance()->setInteger(cur, integerAt(idx)); break; case J3Cst::CONSTANT_String: staticInstance()->setObject(cur, stringAt(idx)); break; default: - J3::classFormatError(this, L"invalid ctp entry ConstantAttribute with type %d", getCtpType(idx)); + J3::classFormatError(this, "invalid ctp entry ConstantAttribute with type %d", getCtpType(idx)); } } } @@ -452,7 +452,7 @@ void J3Class::doResolve(J3Field* hiddenF lock(); if(status < RESOLVED) { if(loader()->vm()->options()->debugResolve) - fprintf(stderr, "Resolving: %ls\n", name()->cStr()); + fprintf(stderr, "Resolving: %s\n", name()->cStr()); status = RESOLVED; readClassBytes(hiddenFields, nbHiddenFields); @@ -472,7 +472,7 @@ void J3Class::readClassBytes(J3Field* hi uint32_t magic = reader.readU4(); if(magic != J3Cst::MAGIC) - J3::classFormatError(this, L"bad magic"); + J3::classFormatError(this, "bad magic"); /* uint16_t minor = */reader.readU2(); /* uint16_t major = */reader.readU2(); @@ -480,7 +480,7 @@ void J3Class::readClassBytes(J3Field* hi nbCtp = reader.readU2(); if(nbCtp < 1) - J3::classFormatError(this, L"zero-sized constant pool"); + J3::classFormatError(this, "zero-sized constant pool"); ctpTypes = (uint8_t*)loader()->allocator()->allocate(nbCtp * sizeof(uint8_t)); ctpValues = (uint32_t*)loader()->allocator()->allocate(nbCtp * sizeof(uint32_t)); @@ -519,7 +519,7 @@ void J3Class::readClassBytes(J3Field* hi ctpValues[i] |= reader.readU2(); break; default: - J3::classFormatError(this, L"wrong constant pool entry type: %d", ctpTypes[i]); + J3::classFormatError(this, "wrong constant pool entry type: %d", ctpTypes[i]); } } @@ -528,7 +528,7 @@ void J3Class::readClassBytes(J3Field* hi J3ObjectType* self = classAt(reader.readU2()); if(self != this) - J3::classFormatError(this, L"wrong class file (describes class %ls)", self->name()->cStr()); + J3::classFormatError(this, "wrong class file (describes class %s)", self->name()->cStr()); uint16_t superIdx = reader.readU2(); @@ -578,7 +578,7 @@ void J3Class::readClassBytes(J3Field* hi case 1: pFields1[i1++] = f; break; case 2: pFields2[i2++] = f; break; case 3: pFields3[i3++] = f; break; - default: J3::internalError(L"should not happen"); + default: J3::internalError("should not happen"); } } @@ -643,7 +643,7 @@ void J3Class::fillFields(J3Field** field J3Field* cur = fields[i]; J3Layout* layout = J3Cst::isStatic(fields[i]->access()) ? (J3Layout*)staticLayout() : this; - //fprintf(stderr, " adding static field: %ls %ls::%ls\n", cur->type()->name()->cStr(), name()->cStr(), cur->name()->cStr()); + //fprintf(stderr, " adding static field: %s %s::%s\n", cur->type()->name()->cStr(), name()->cStr(), cur->name()->cStr()); cur->_offset = layout->structSize(); cur->_slot = layout->_nbFields; layout->_structSize += 1 << fields[i]->type()->logSize(); @@ -715,7 +715,7 @@ J3Method* J3Class::interfaceOrMethodAt(u if(res) { if((res->access() & J3Cst::ACC_STATIC) != (access & J3Cst::ACC_STATIC)) - J3::classFormatError(this, L"inconsistent use of virtual and static methods"); + J3::classFormatError(this, "inconsistent use of virtual and static methods"); return res; } @@ -747,7 +747,7 @@ J3Field* J3Class::fieldAt(uint16_t idx, if(res) { if((res->access() & J3Cst::ACC_STATIC) != (access & J3Cst::ACC_STATIC)) - J3::classFormatError(this, L"inconstitent use of virtual and static field"); + J3::classFormatError(this, "inconstitent use of virtual and static field"); return res; } @@ -803,7 +803,7 @@ const vmkit::Name* J3Class::nameAt(uint void J3Class::check(uint16_t idx, uint32_t id) { if(idx > nbCtp || (id != -1 && ctpTypes[idx] != id)) - J3::classFormatError(this, L"wrong constant pool type %d at index %d for %d", id, idx, nbCtp); + J3::classFormatError(this, "wrong constant pool type %d at index %d for %d", id, idx, nbCtp); } void J3Class::doNativeName() { @@ -832,15 +832,15 @@ J3ArrayClass::J3ArrayClass(J3ClassLoader if(!name) { const vmkit::Name* compName = component->name(); uint32_t len = compName->length(); - wchar_t buf[len + 16]; + char buf[len + 16]; uint32_t pos = 0; - //printf(" build array of %ls\n", component->name()->cStr()); + //printf(" build array of %s\n", component->name()->cStr()); buf[pos++] = J3Cst::ID_Array; if(component->isClass()) buf[pos++] = J3Cst::ID_Classname; - memcpy(buf+pos, compName->cStr(), len * sizeof(wchar_t)); + memcpy(buf+pos, compName->cStr(), len * sizeof(char)); pos += len; if(component->isClass()) buf[pos++] = J3Cst::ID_End; 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=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Thu Jan 2 07:32:16 2014 @@ -84,20 +84,16 @@ J3Class* J3ClassLoader::defineClass(cons } J3Class* J3ClassLoader::loadClass(const vmkit::Name* name) { - J3::internalError(L"implement me: loadClass from a Java class loader"); -} - -J3Class* J3ClassLoader::loadClass(const wchar_t* name) { - return loadClass(vm()->names()->get(name)); + J3::internalError("implement me: loadClass from a Java class loader"); } void J3ClassLoader::wrongType(J3Class* from, const vmkit::Name* type) { - J3::classFormatError(from, L"wrong type: %ls", type->cStr()); + J3::classFormatError(from, "wrong type: %s", type->cStr()); } J3Type* J3ClassLoader::getTypeInternal(J3Class* from, const vmkit::Name* typeName, uint32_t start, uint32_t* pend) { J3Type* res = 0; - const wchar_t* type = typeName->cStr(); + const char* type = typeName->cStr(); uint32_t len = typeName->length(); uint32_t pos = start; uint32_t prof = 0; @@ -120,7 +116,7 @@ J3Type* J3ClassLoader::getTypeInternal(J case J3Cst::ID_Classname: { uint32_t start = ++pos; - wchar_t buf[len + 1 - start], c; + char buf[len + 1 - start], c; memset(buf, 0, len + 1 - pos); @@ -162,7 +158,7 @@ J3Type* J3ClassLoader::getType(J3Class* if(end != type->length()) wrongType(from, type); - //printf("Analyse %ls => %ls\n", type->cStr(), res->name()->cStr()); + //printf("Analyse %s => %ls\n", type->cStr(), res->name()->cStr()); pthread_mutex_lock(&_mutexTypes); types[type] = res; @@ -225,16 +221,6 @@ J3Method* J3ClassLoader::method(uint16_t return method(access, loadClass(clName), name, sign); } -J3Method* J3ClassLoader::method(uint16_t access, const wchar_t* clName, const wchar_t* name, const wchar_t* sign) { - vmkit::Names* names = vm()->names(); - return method(access, names->get(clName), names->get(name), names->get(sign)); -} - -J3Method* J3ClassLoader::method(uint16_t access, J3Class* cl, const wchar_t* name, const wchar_t* sign) { - vmkit::Names* names = vm()->names(); - return method(access, cl, names->get(name), names->get(sign)); -} - bool J3ClassLoader::J3InterfaceMethodLess::operator()(j3::J3Method const* lhs, j3::J3Method const* rhs) const { return lhs->name() < rhs->name() || (lhs->name() == rhs->name() @@ -261,13 +247,13 @@ J3InitialClassLoader::J3InitialClassLoad if (bytes) { archive = new(allocator()) J3ZipArchive(bytes, allocator()); if(!archive) { - J3::internalError(L"unable to find system archive"); + J3::internalError("unable to find system archive"); } } else - J3::internalError(L"unable to find system archive"); + J3::internalError("unable to find system archive"); if(J3Lib::loadSystemLibraries(&nativeLibraries) == -1) - J3::internalError(L"unable to find java library"); + J3::internalError("unable to find java library"); } J3Class* J3InitialClassLoader::loadClass(const vmkit::Name* name) { @@ -278,7 +264,7 @@ J3Class* J3InitialClassLoader::loadClass char tmp[name->length()+16]; - //printf("L: %ls\n", name->cStr()); + //printf("L: %s\n", name->cStr()); for(int i=0; ilength(); i++) { char c = name->cStr()[i] & 0xff; tmp[i] = c == '.' ? '/' : c; 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=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Thu Jan 2 07:32:16 2014 @@ -40,12 +40,12 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato vm = loader->vm(); #if 0 - if(m->cl()->name() == vm->names()->get(L"java/util/concurrent/atomic/AtomicInteger")) + if(m->cl()->name() == vm->names()->get("java/util/concurrent/atomic/AtomicInteger")) vm->options()->debugTranslate = 4; #endif if(vm->options()->debugTranslate) - fprintf(stderr, " translating bytecode of: %ls::%ls%ls\n", method->cl()->name()->cStr(), method->name()->cStr(), method->sign()->cStr()); + fprintf(stderr, " translating bytecode of: %s::%s%s\n", method->cl()->name()->cStr(), method->name()->cStr(), method->sign()->cStr()); module = new llvm::Module(method->llvmFunctionName(), vm->llvmContext()); llvmFunction = buildFunction(method, 0); @@ -169,7 +169,7 @@ llvm::Value* J3CodeGen::flatten(llvm::Va else if(type == vm->typeChar) return builder->CreateZExt(v, vm->typeInteger->llvmType()); else - J3::internalError(L"should not happen"); + J3::internalError("should not happen"); } llvm::Value* J3CodeGen::unflatten(llvm::Value* v, J3Type* type) { @@ -183,7 +183,7 @@ llvm::Value* J3CodeGen::unflatten(llvm:: return builder->CreateZExtOrTrunc(v, type->llvmType()); else { type->dump(); - J3::internalError(L"should not happen"); + J3::internalError("should not happen"); } } @@ -379,7 +379,7 @@ llvm::Value* J3CodeGen::nullCheck(llvm:: return obj; } -#define nyi() J3::internalError(L"not yet implemented: '%s' (%d)", J3Cst::opcodeNames[bc], bc); +#define nyi() J3::internalError("not yet implemented: '%s' (%d)", J3Cst::opcodeNames[bc], bc); void J3CodeGen::invoke(J3Method* target, llvm::Value* func) { J3MethodType* type = target->methodType(cl); @@ -557,7 +557,7 @@ void J3CodeGen::newArray(uint8_t atype) case J3Cst::T_INT: prim = vm->typeInteger; break; case J3Cst::T_LONG: prim = vm->typeLong; break; default: - J3::classFormatError(cl, L"wrong atype: %d\n", atype); + J3::classFormatError(cl, "wrong atype: %d\n", atype); } newArray(prim->getArray()); @@ -700,7 +700,7 @@ void J3CodeGen::ldc(uint32_t idx) { builder->getInt16(idx))); break; default: - J3::classFormatError(cl, L"wrong ldc type: %d\n", cl->getCtpType(idx)); + J3::classFormatError(cl, "wrong ldc type: %d\n", cl->getCtpType(idx)); } stack.push(res); } @@ -725,7 +725,7 @@ llvm::BasicBlock* J3CodeGen::forwardBran //printf("split at %d (%s)\n", pc, id); llvm::Instruction* insn = opInfos[pc].insn; if(!insn) - J3::classFormatError(cl, L"jmp: not to an instruction"); + J3::classFormatError(cl, "jmp: not to an instruction"); insn = insn->getNextNode(); //fprintf(stderr, "--- instruction ---\n"); //insn->dump(); @@ -857,7 +857,7 @@ void J3CodeGen::translate() { if(vm->options()->genDebugExecute) { char buf[256]; - snprintf(buf, 256, "%ls::%ls", method->cl()->name()->cStr(), method->name()->cStr()); + snprintf(buf, 256, "%s::%s", method->cl()->name()->cStr(), method->name()->cStr()); #if 0 fprintf(stderr, "bitcast: "); @@ -903,7 +903,7 @@ void J3CodeGen::translate() { if(opInfos[javaPC].insn || opInfos[javaPC].bb) { if(closeBB && !bb->getTerminator()) { if(!opInfos[javaPC].bb) - J3::internalError(L"random split???"); + J3::internalError("random split???"); builder->CreateBr(opInfos[javaPC].bb); } } @@ -955,7 +955,7 @@ void J3CodeGen::translate() { if(vm->options()->genDebugExecute) { char buf[256]; - snprintf(buf, 256, " [%4d] executing: %-20s in %ls::%ls", javaPC, + snprintf(buf, 256, " [%4d] executing: %-20s in %s::%s", javaPC, J3Cst::opcodeNames[bc], method->cl()->name()->cStr(), method->name()->cStr()); builder->CreateCall3(funcEchoDebugExecute, builder->getInt32(2), @@ -1526,15 +1526,15 @@ void J3CodeGen::translate() { case J3Cst::BC_impdep2: /* 0xff */ case J3Cst::BC_xxxunusedxxx1: /* 0xba */ default: - J3::classFormatError(cl, L"unknow opcode '%s' (%d)", J3Cst::opcodeNames[bc], bc); + J3::classFormatError(cl, "unknow opcode '%s' (%d)", J3Cst::opcodeNames[bc], bc); } } - J3::classFormatError(cl, L"the last bytecode does not return"); + J3::classFormatError(cl, "the last bytecode does not return"); } #if 0 void J3CodeGen::explore() { - printf(" exploring bytecode of: %ls::%ls%ls\n", method->cl()->name()->cStr(), method->name()->cStr(), method->sign()->cStr()); + printf(" exploring bytecode of: %s::%s%s\n", method->cl()->name()->cStr(), method->name()->cStr(), method->sign()->cStr()); while(codeReader->remaining()) { uint8_t bc = codeReader->readU1(); @@ -1545,7 +1545,7 @@ void J3CodeGen::explore() { case J3Cst::BC_##id: effect; break; #include "j3/j3bc.def" default: - J3::internalError(L"unknow opcode '%s' (%d)", J3Cst::opcodeNames[bc], bc); + J3::internalError("unknow opcode '%s' (%d)", J3Cst::opcodeNames[bc], bc); } } } @@ -1555,7 +1555,7 @@ void J3CodeGen::generateJava() { J3Attribute* attr = method->attributes()->lookup(vm->codeAttribute); if(!attr) - J3::classFormatError(cl, L"No Code attribute in %ls %ls", method->name()->cStr(), method->sign()->cStr()); + J3::classFormatError(cl, "No Code attribute in %s %s", method->name()->cStr(), method->sign()->cStr()); J3Reader reader(cl->bytes()); reader.seek(attr->offset(), reader.SeekSet); @@ -1563,7 +1563,7 @@ void J3CodeGen::generateJava() { uint32_t length = reader.readU4(); if(!reader.adjustSize(length)) - J3::classFormatError(cl, L"Code attribute of %ls %ls is too large (%d)", method->name()->cStr(), method->sign()->cStr(), length); + J3::classFormatError(cl, "Code attribute of %s %s is too large (%d)", method->name()->cStr(), method->sign()->cStr(), length); llvm::DIBuilder* dbgBuilder = new llvm::DIBuilder(*module); @@ -1610,7 +1610,7 @@ void J3CodeGen::generateJava() { builder->SetInsertPoint(bbRet); if(vm->options()->genDebugExecute) { char buf[256]; - snprintf(buf, 256, "%ls::%ls", method->cl()->name()->cStr(), method->name()->cStr()); + snprintf(buf, 256, "%s::%s", method->cl()->name()->cStr(), method->name()->cStr()); builder->CreateCall3(funcEchoDebugEnter, builder->getInt32(1), buildString("%s\n"), Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc Thu Jan 2 07:32:16 2014 @@ -119,7 +119,7 @@ void J3ExceptionTable::read(J3Reader* re void J3ExceptionTable::dump(bool verbose) { if(nbEntries) { - fprintf(stderr, " ExceptionTable of %ls::%ls%ls:\n", + fprintf(stderr, " ExceptionTable of %s::%s%s:\n", codeGen->method->cl()->name()->cStr(), codeGen->method->name()->cStr(), codeGen->method->sign()->cStr()); Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc Thu Jan 2 07:32:16 2014 @@ -85,7 +85,7 @@ void J3CodeGenVar::dump() { v = refStack[i]; else { t->dump(); - J3::internalError(L"should not happen"); + J3::internalError("should not happen"); } v->dump(); @@ -99,7 +99,7 @@ void J3CodeGenVar::drop(uint32_t n) { llvm::AllocaInst** J3CodeGenVar::stackOf(llvm::Type* t) { if(!t) - J3::internalError(L"unable to find the type of a local/stack"); + J3::internalError("unable to find the type of a local/stack"); if(t->isIntegerTy(64)) { return longStack; @@ -113,7 +113,7 @@ llvm::AllocaInst** J3CodeGenVar::stackOf return refStack; } - J3::internalError(L"should not happen"); + J3::internalError("should not happen"); } void J3CodeGenVar::setAt(llvm::Value* value, uint32_t idx) { @@ -132,14 +132,14 @@ void J3CodeGenVar::push(llvm::Value* val // value->dump(); // fprintf(stderr, "\n"); if(topStack >= maxStack) - J3::classFormatError(codeGen->cl, L"too many push in... "); + J3::classFormatError(codeGen->cl, "too many push in... "); setAt(value, topStack++); } llvm::Value* J3CodeGenVar::pop() { if(!topStack) - J3::classFormatError(codeGen->cl, L"too many pop in... "); + J3::classFormatError(codeGen->cl, "too many pop in... "); llvm::Value* res = at(--topStack); return res; @@ -147,7 +147,7 @@ llvm::Value* J3CodeGenVar::pop() { llvm::Value* J3CodeGenVar::top(uint32_t idx) { if(topStack <= idx) - J3::classFormatError(codeGen->cl, L"too large top in... "); + J3::classFormatError(codeGen->cl, "too large top in... "); return at(topStack - idx - 1); } Modified: vmkit/branches/mcjit/lib/j3/vm/j3constants.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3constants.cc?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3constants.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3constants.cc Thu Jan 2 07:32:16 2014 @@ -11,13 +11,13 @@ using namespace j3; char J3Cst::nativePrefix[] = "Java_"; const vmkit::Name* J3Cst::rewrite(J3* vm, const vmkit::Name* clName, const vmkit::Name* orig) { - wchar_t res[clName->length() + orig->length() + 3]; + char res[clName->length() + orig->length() + 3]; res[0] = ID_Left; res[1] = ID_Classname; - memcpy(res+2, clName->cStr(), sizeof(wchar_t)*clName->length()); + memcpy(res+2, clName->cStr(), sizeof(char)*clName->length()); res[2 + clName->length()] = ID_End; - memcpy(res+3+clName->length(), orig->cStr()+1, sizeof(wchar_t)*(orig->length()-1)); + memcpy(res+3+clName->length(), orig->cStr()+1, sizeof(char)*(orig->length()-1)); res[2 + clName->length() + orig->length()] = 0; return vm->names()->get(res); Modified: vmkit/branches/mcjit/lib/j3/vm/j3field.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3field.cc?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3field.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3field.cc Thu Jan 2 07:32:16 2014 @@ -36,6 +36,6 @@ J3ObjectHandle* J3Field::javaField() { } void J3Field::dump() { - printf("Field: %ls %ls::%ls (%d)\n", type()->name()->cStr(), layout()->name()->cStr(), name()->cStr(), access()); + printf("Field: %s %s::%s (%d)\n", type()->name()->cStr(), layout()->name()->cStr(), name()->cStr(), access()); } 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=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Thu Jan 2 07:32:16 2014 @@ -10,7 +10,7 @@ #define enterJVM() try { #define leaveJVM() } catch(void* e) { J3Thread::get()->setPendingException(J3Thread::get()->push((J3Object*)e)); } -#define NYI() { J3Thread::get()->vm()->internalError(L"not yet implemented: '%s'", __PRETTY_FUNCTION__); } +#define NYI() { J3Thread::get()->vm()->internalError("not yet implemented: '%s'", __PRETTY_FUNCTION__); } namespace j3 { Modified: vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc Thu Jan 2 07:32:16 2014 @@ -2,6 +2,7 @@ #include "j3/j3class.h" #include "j3/j3classloader.h" #include "j3/j3method.h" +#include "j3/j3utf16.h" #include "j3/j3.h" using namespace j3; @@ -18,7 +19,7 @@ J3Mangler::J3Mangler(J3Class* _from) { void J3Mangler::check(uint32_t n) { next = cur + n; if((next+1) >= (buf + max)) - J3::internalError(L"unable to mangle: not enough space"); + J3::internalError("unable to mangle: not enough space"); } J3Mangler* J3Mangler::mangleType(J3Method* method) { @@ -35,12 +36,6 @@ J3Mangler* J3Mangler::mangleType(J3Metho memcpy(cur, type->ins(i)->nativeName(), type->ins(i)->nativeNameLength()); cur = next; } - -#if 0 - check(type->out()->nativeNameLength()); - memcpy(cur, type->out()->nativeName(), type->out()->nativeNameLength()); - cur = next; -#endif } check(1); *cur = 0; @@ -70,9 +65,11 @@ J3Mangler* J3Mangler::mangle(const char* } J3Mangler* J3Mangler::mangle(const vmkit::Name* name) { + J3Utf16Converter converter(name); + next = cur; - for(size_t i=0; ilength(); i++) { - wchar_t c = name->cStr()[i]; + while(!converter.isEof()) { + uint16_t c = converter.nextUtf16(); if(c > 256) { check(6); 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=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Thu Jan 2 07:32:16 2014 @@ -52,14 +52,14 @@ void J3Method::markCompiled(llvm::Functi void* J3Method::fnPtr(bool withCaller) { if(!isCompiled()) { - //fprintf(stderr, "materializing: %ls::%ls%ls\n", this, cl()->name()->cStr(), name()->cStr(), sign()->cStr()); + //fprintf(stderr, "materializing: %s::%s%s\n", this, cl()->name()->cStr(), name()->cStr(), sign()->cStr()); if(!isResolved()) { if(cl()->loader()->vm()->options()->debugLinking) - fprintf(stderr, "linking %ls::%ls\n", cl()->name()->cStr(), name()->cStr()); + fprintf(stderr, "linking %s::%s\n", cl()->name()->cStr(), name()->cStr()); cl()->initialise(); if(!isResolved()) - J3::noSuchMethodError(L"unable to find method", cl(), name(), sign()); + J3::noSuchMethodError("unable to find method", cl(), name(), sign()); } J3CodeGen::translate(this, 1, withCaller); @@ -94,20 +94,20 @@ void* J3Method::getSymbolAddress() { void J3Method::setResolved(uint32_t index) { if(isResolved()) - J3::internalError(L"trying to re-resolve a resolved method, should not happen"); + J3::internalError("trying to re-resolve a resolved method, should not happen"); _index = index; } void J3Method::postInitialise(uint32_t access, J3Attributes* attributes) { if((access & J3Cst::ACC_STATIC) != (_access & J3Cst::ACC_STATIC)) - J3::classFormatError(cl(), L"trying to modify the static flag of %ls", cl()->name()->cStr()); + J3::classFormatError(cl(), "trying to modify the static flag of %s", cl()->name()->cStr()); _access = access; _attributes = attributes; } J3Method* J3Method::resolve(J3ObjectHandle* obj) { if(cl()->loader()->vm()->options()->debugLinking) - fprintf(stderr, "virtual linking %ls::%ls\n", cl()->name()->cStr(), name()->cStr()); + fprintf(stderr, "virtual linking %s::%s\n", cl()->name()->cStr(), name()->cStr()); vmkit::Names* n = cl()->loader()->vm()->names(); return obj->vt()->type()->asObjectType()->findVirtualMethod(name(), sign()); } @@ -117,7 +117,7 @@ J3Value J3Method::internalInvoke(bool st void* fn = fnPtr(1); - //fprintf(stderr, "Internal invoke %ls::%ls%ls\n", target->cl()->name()->cStr(), target->name()->cStr(), target->sign()->cStr()); + //fprintf(stderr, "Internal invoke %s::%s%s\n", target->cl()->name()->cStr(), target->name()->cStr(), target->sign()->cStr()); if(!methodType()->llvmSignature()->caller()) J3CodeGen::translate(this, 0, 1); @@ -272,11 +272,11 @@ char* J3Method::llvmStubName(J3Class* fr } void J3Method::dump() { - printf("Method: %ls %ls::%ls\n", sign()->cStr(), cl()->name()->cStr(), name()->cStr()); + printf("Method: %s %s::%s\n", sign()->cStr(), cl()->name()->cStr(), name()->cStr()); } void J3Method::registerNative(void* fnPtr) { if(_nativeFnPtr) - J3::noSuchMethodError(L"unable to dynamically modify a native function", cl(), name(), sign()); + J3::noSuchMethodError("unable to dynamically modify a native function", cl(), name(), sign()); _nativeFnPtr = fnPtr; } 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=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Thu Jan 2 07:32:16 2014 @@ -25,13 +25,13 @@ void J3TypeChecker::dump() { fprintf(stderr, " offset: %u\n", offset); for(uint32_t i=0; itype()->name()->cStr()); + fprintf(stderr, " display[%u]: %s\n", i, display[i]->type()->name()->cStr()); } for(uint32_t i=0; itype()->name()->cStr()); + fprintf(stderr, " secondary[%u]: %s\n", i, secondaryTypes[i]->type()->name()->cStr()); } if(display[cacheOffset]) - fprintf(stderr, " cache: %ls\n", display[cacheOffset]->type()->name()->cStr()); + fprintf(stderr, " cache: %s\n", display[cacheOffset]->type()->name()->cStr()); } /* @@ -136,7 +136,7 @@ J3VirtualTable* J3VirtualTable::create(J isSecondary = 1; super = baseClass->super()->getArray(dim); super->resolve(); - //printf("%ls super is %ls (%d)\n", cl->name()->cStr(), super->name()->cStr(), isSecondary); + //printf("%s super is %ls (%d)\n", cl->name()->cStr(), super->name()->cStr(), isSecondary); uint32_t n = baseClass->vt()->checker()->nbSecondaryTypes; secondaries = (J3Type**)alloca(n*sizeof(J3Type*)); @@ -171,17 +171,17 @@ void* J3VirtualTable::operator new(size_ J3VirtualTable::J3VirtualTable(J3Type* type, J3Type* super, J3Type** interfaces, uint32_t nbInterfaces, bool isSecondary) { _type = type; - // printf("*** Building the vt of %ls based on %ls at %p\n", type->name()->cStr(), super->name()->cStr(), this); + // printf("*** Building the vt of %s based on %ls at %p\n", type->name()->cStr(), super->name()->cStr(), this); if(super == type) { checker()->offset = 0; checker()->display[checker()->offset] = this; if(nbInterfaces) - J3::internalError(L"a root J3VirtualTable should not have interfaces"); + J3::internalError("a root J3VirtualTable should not have interfaces"); } else { uint32_t parentDisplayLength = super->vt()->checker()->offset + 1; - //printf("%ls (%p) secondary: %p %p (%d)\n", type->name()->cStr(), this, checker()->secondaryTypes, checker()->display[6], parentDisplayLength); + //printf("%s (%p) secondary: %p %p (%d)\n", type->name()->cStr(), this, checker()->secondaryTypes, checker()->display[6], parentDisplayLength); if(parentDisplayLength >= J3TypeChecker::cacheOffset) isSecondary = 1; @@ -191,7 +191,7 @@ J3VirtualTable::J3VirtualTable(J3Type* t checker()->nbSecondaryTypes = super->vt()->checker()->nbSecondaryTypes + nbInterfaces + isSecondary; checker()->secondaryTypes = (J3VirtualTable**)super->loader()->allocator()->allocate(checker()->nbSecondaryTypes*sizeof(J3VirtualTable*)); - //printf("%ls: %d - %d %d\n", type->name()->cStr(), isSecondary, parentDisplayLength, J3TypeChecker::displayLength); + //printf("%s: %d - %d %d\n", type->name()->cStr(), isSecondary, parentDisplayLength, J3TypeChecker::displayLength); if(isSecondary) { checker()->offset = J3TypeChecker::cacheOffset; checker()->secondaryTypes[0] = this; @@ -255,7 +255,7 @@ bool J3VirtualTable::isAssignableTo(J3Vi } void J3VirtualTable::dump() { - fprintf(stderr, "VirtualTable: %s%ls (%p)\n", + fprintf(stderr, "VirtualTable: %s%s (%p)\n", type()->isLayout() && !type()->isClass() ? "static_" : "", type()->name()->cStr(), this); checker()->dump(); @@ -290,11 +290,11 @@ J3Object* J3Object::doNew(J3Class* cl) { } void J3Object::monitorEnter(J3Object* obj) { - J3::internalError(L"implement me: monitorenter"); + J3::internalError("implement me: monitorenter"); } void J3Object::monitorExit(J3Object* obj) { - J3::internalError(L"implement me: monitorexit"); + J3::internalError("implement me: monitorexit"); } uint32_t J3Object::hashCode() { @@ -354,7 +354,7 @@ J3Monitor* J3Object::monitor() { monitor->prepare(this, record->header, record); } else { /* not locked at all */ if((header & 7) != 1) - J3::internalError(L"should not happen"); + J3::internalError("should not happen"); monitor->prepare(this, header, 0); } _header = (uintptr_t)monitor | 2; Modified: vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Thu Jan 2 07:32:16 2014 @@ -19,7 +19,7 @@ void* J3Trampoline::interfaceTrampoline( res = desc->methods[0]->fnPtr(0); handle->vt()->_interfaceMethodTable[index] = res; } else - J3::internalError(L"implement me: interface Trampoline with collision"); + J3::internalError("implement me: interface Trampoline with collision"); J3Thread::get()->restore(prev); Modified: vmkit/branches/mcjit/lib/vmkit/allocator.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/allocator.cc?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/allocator.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/allocator.cc Thu Jan 2 07:32:16 2014 @@ -73,7 +73,7 @@ void* BumpAllocator::allocate(size_t siz void* BumpAllocator::map(size_t n) { void* res = mmap(0, n, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, 0, 0); if(res == MAP_FAILED) - Thread::get()->vm()->internalError(L"unable to map %ld bytes", n); + Thread::get()->vm()->internalError("unable to map %ld bytes", n); return res; } @@ -82,11 +82,11 @@ void BumpAllocator::unmap(void* p, size_ } void PermanentObject::operator delete(void* ptr) { - Thread::get()->vm()->internalError(L"should not happen"); + Thread::get()->vm()->internalError("should not happen"); } void PermanentObject::operator delete[](void* ptr) { - Thread::get()->vm()->internalError(L"should not happen"); + Thread::get()->vm()->internalError("should not happen"); } ThreadAllocator::ThreadAllocator(uintptr_t minThreadStruct, uintptr_t minFullSize) { Modified: vmkit/branches/mcjit/lib/vmkit/compiler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/compiler.cc?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/compiler.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/compiler.cc Thu Jan 2 07:32:16 2014 @@ -23,7 +23,7 @@ using namespace vmkit; void* Symbol::getSymbolAddress() { - Thread::get()->vm()->internalError(L"implement me: getSymbolAddress"); + Thread::get()->vm()->internalError("implement me: getSymbolAddress"); } void* CompilationUnit::operator new(size_t n, BumpAllocator* allocator) { @@ -54,7 +54,7 @@ CompilationUnit::CompilationUnit(BumpAll .create(); if (!ee()) - Thread::get()->vm()->internalError(L"Error while creating execution engine: %s\n", err.c_str()); + Thread::get()->vm()->internalError("Error while creating execution engine: %s\n", err.c_str()); ee()->finalizeObject(); @@ -125,7 +125,7 @@ Symbol* CompilationUnit::getSymbol(const if(it == _symbolTable.end()) { uint8_t* addr = (uint8_t*)dlsym(SELF_HANDLE, id); if(!addr) - Thread::get()->vm()->internalError(L"unable to resolve native symbol: %s", id); + Thread::get()->vm()->internalError("unable to resolve native symbol: %s", id); res = new(allocator()) vmkit::NativeSymbol(addr); size_t len = strlen(id); char* buf = (char*)allocator()->allocate(len+1); @@ -150,7 +150,7 @@ void CompilationUnit::compileModule(llvm vmkit::Safepoint* sf = Safepoint::get(this, module); if(!sf) - vm()->internalError(L"unable to find safepoints"); + vm()->internalError("unable to find safepoints"); while(sf->addr()) { sf->setUnit(this); Modified: vmkit/branches/mcjit/lib/vmkit/names.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/names.cc?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/names.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/names.cc Thu Jan 2 07:32:16 2014 @@ -7,30 +7,30 @@ using namespace vmkit; T_ptr_less_t Name::less; -Name::Name(uint32_t length, const wchar_t* content) { +Name::Name(size_t length, const char* content) { _length = length; - memcpy(_content, content, sizeof(wchar_t)*(length+1)); + memcpy(_content, content, sizeof(char)*length); + _content[length] = 0; } void* Name::operator new(size_t unused, BumpAllocator* allocator, size_t n) { - return PermanentObject::operator new(sizeof(Name) + n * sizeof(wchar_t), allocator); + return PermanentObject::operator new(sizeof(Name) + n * sizeof(uint8_t), allocator); } -Names::Names(BumpAllocator* _allocator) : names(Util::wchar_t_less, _allocator) { +Names::Names(BumpAllocator* _allocator) : names(Util::char_less, _allocator) { pthread_mutex_init(&mutex, 0); allocator = _allocator; } -const Name* Names::get(const wchar_t* str) { +const Name* Names::get(const char* str, size_t length) { pthread_mutex_lock(&mutex); - //printf("---- internalize %ls\n", str); + //printf("---- internalize %s\n", str); const Name* res; - std::map::iterator it = names.find(str); + std::map::iterator it = names.find(str); if(it == names.end()) { - size_t len = wcslen(str); - Name* tmp = new(allocator, len) Name(len, str); + Name* tmp = new(allocator, length) Name(length, str); names[tmp->cStr()] = tmp; @@ -42,38 +42,52 @@ const Name* Names::get(const wchar_t* st return res; } +const Name* Names::get(const char* str) { + return get(str, strlen(str)); +} + const Name* Names::get(const char* str, size_t start, size_t length) { //printf("%s %lu %lu\n", str, start, length); if(length == -1) - length = strlen(str); - wchar_t buf[length + 1]; - size_t n = 0; - size_t i = 0; - - while (i < length) { - wchar_t x = str[i++]; - if(x & 0x80) { - wchar_t y = str[i++]; - if (x & 0x20) { - wchar_t z = str[i++]; - x = ((x & 0x0F) << 12) + - ((y & 0x3F) << 6) + - (z & 0x3F); - } else { - x = ((x & 0x1F) << 6) + - (y & 0x3F); - } - } - buf[n++] = x; + return get(str+start); + else { + char buf[length+1]; + memcpy(buf, str+start, length); + buf[length] = 0; + return get(buf, length); } +} - buf[n] = 0; +#if 0 + char buf[length + 1]; + size_t n = 0; + size_t i = 0; + + while (i < length) { + char x = str[i++]; + if(x & 0x80) { + char y = str[i++]; + if (x & 0x20) { + char z = str[i++]; + x = ((x & 0x0F) << 12) + + ((y & 0x3F) << 6) + + (z & 0x3F); + } else { + x = ((x & 0x1F) << 6) + + (y & 0x3F); + } + } + buf[n++] = x; + } + + buf[n] = 0; - return get(buf); + return get(buf); } +#endif const Name* Names::get(char c) { - wchar_t buf[2]; + char buf[2]; buf[0] = c; buf[1] = 0; return get(buf); Modified: vmkit/branches/mcjit/lib/vmkit/util.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/util.cc?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/util.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/util.cc Thu Jan 2 07:32:16 2014 @@ -8,7 +8,6 @@ using namespace vmkit; struct Util::char_less_t Util::char_less; struct Util::char_less_t_dbg Util::char_less_dbg; -struct Util::wchar_t_less_t Util::wchar_t_less; bool Util::char_less_t::operator()(const char* lhs, const char* rhs) const { //printf("Compare: %s - %s - %d\n", lhs, rhs, strcmp(lhs, rhs)); @@ -20,7 +19,3 @@ bool Util::char_less_t_dbg::operator()(c return strcmp(lhs, rhs) < 0; } -bool Util::wchar_t_less_t::operator()(const wchar_t* lhs, const wchar_t* rhs) const { - //printf("Compare: %ls - %ls - %d\n", lhs, rhs, wcscmp(lhs, rhs)); - return wcscmp(lhs, rhs) < 0; -} Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=198303&r1=198302&r2=198303&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Thu Jan 2 07:32:16 2014 @@ -76,14 +76,14 @@ llvm::LLVMContext& VMKit::llvmContext() llvm::Type* VMKit::introspectType(const char* name) { llvm::Type* res = self()->getTypeByName(name); if(!res) - internalError(L"unable to find internal type: %s", name); + internalError("unable to find internal type: %s", name); return res; } llvm::Function* VMKit::introspectFunction(llvm::Module* dest, const char* name) { llvm::Function* orig = (llvm::Function*)mangleMap[name]; if(!orig) - internalError(L"unable to find internal function: %s", name); + internalError("unable to find internal function: %s", name); return (llvm::Function*)dest->getOrInsertFunction(orig->getName(), orig->getFunctionType()); } @@ -91,7 +91,7 @@ llvm::Function* VMKit::introspectFunctio llvm::GlobalValue* VMKit::introspectGlobalValue(llvm::Module* dest, const char* name) { llvm::GlobalValue* orig = mangleMap[name]; if(!orig) - internalError(L"unable to find internal global value: %s", name); + internalError("unable to find internal global value: %s", name); return (llvm::GlobalValue*)dest->getOrInsertGlobal(orig->getName(), orig->getType()); } @@ -114,11 +114,11 @@ void VMKit::vmkitBootstrap(Thread* initi llvm::OwningPtr buf; if (llvm::MemoryBuffer::getFile(selfBitCodePath, buf)) - VMKit::internalError(L"Error while opening bitcode file %s", selfBitCodePath); + VMKit::internalError("Error while opening bitcode file %s", selfBitCodePath); _self = llvm::getLazyBitcodeModule(buf.take(), llvm::getGlobalContext(), &err); if(!self()) - VMKit::internalError(L"Error while reading bitcode file %s: %s", selfBitCodePath, err.c_str()); + VMKit::internalError("Error while reading bitcode file %s: %s", selfBitCodePath, err.c_str()); for(llvm::Module::iterator cur=self()->begin(); cur!=self()->end(); cur++) addSymbol(cur); @@ -132,7 +132,7 @@ void VMKit::vmkitBootstrap(Thread* initi ptrTypeInfo = typeInfoGV ? dlsym(SELF_HANDLE, typeInfoGV->getName().data()) : 0; if(!ptrTypeInfo) - internalError(L"unable to find typeinfo for void*"); + internalError("unable to find typeinfo for void*"); initialThread->start(); initialThread->join(); @@ -143,27 +143,27 @@ llvm::Function* VMKit::getGCRoot(llvm::M return llvm::Intrinsic::getDeclaration(mod, llvm::Intrinsic::gcroot); } -void VMKit::log(const wchar_t* msg, ...) { +void VMKit::log(const char* msg, ...) { va_list va; va_start(va, msg); fprintf(stderr, "[vmkit]: "); - vfwprintf(stderr, msg, va); + vfprintf(stderr, msg, va); fprintf(stderr, "\n"); va_end(va); } -void VMKit::vinternalError(const wchar_t* msg, va_list va) { +void VMKit::vinternalError(const char* msg, va_list va) { defaultInternalError(msg, va); } -void VMKit::defaultInternalError(const wchar_t* msg, va_list va) { +void VMKit::defaultInternalError(const char* msg, va_list va) { fprintf(stderr, "Fatal error: "); - vfwprintf(stderr, msg, va); + vfprintf(stderr, msg, va); fprintf(stderr, "\n"); abort(); } -void VMKit::internalError(const wchar_t* msg, ...) { +void VMKit::internalError(const char* msg, ...) { va_list va; va_start(va, msg); if(Thread::get() && Thread::get()->vm()) @@ -176,11 +176,11 @@ void VMKit::internalError(const wchar_t* } void VMKit::sigsegv(uintptr_t addr) { - internalError(L"sigsegv at %p", (void*)addr); + internalError("sigsegv at %p", (void*)addr); } void VMKit::sigend() { - internalError(L"sig terminate"); + internalError("sig terminate"); } static int fake = 0; From gael.thomas at lip6.fr Thu Jan 2 05:55:20 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 13:55:20 -0000 Subject: [vmkit-commits] [vmkit] r198305 - Correct implementation of utf related JNI functions Message-ID: <20140102135520.22A382A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 07:55:19 2014 New Revision: 198305 URL: http://llvm.org/viewvc/llvm-project?rev=198305&view=rev Log: Correct implementation of utf related JNI functions Modified: vmkit/branches/mcjit/include/j3/j3utf16.h vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Modified: vmkit/branches/mcjit/include/j3/j3utf16.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3utf16.h?rev=198305&r1=198304&r2=198305&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3utf16.h (original) +++ vmkit/branches/mcjit/include/j3/j3utf16.h Thu Jan 2 07:55:19 2014 @@ -1,36 +1,30 @@ #ifndef _J3_UTF16_H_ #define _J3_UTF16_H_ +#include +#include + +namespace vmkit { + class Name; +} + namespace j3 { + class J3ObjectHandle; + class J3Utf16Converter { const vmkit::Name* name; size_t pos; public: - J3Utf16Converter(const vmkit::Name* _name) { name = _name; pos = 0; } + J3Utf16Converter(const vmkit::Name* _name); - bool isEof() { return pos == name->length(); } + bool isEof(); + uint16_t nextUtf16(); + }; - uint16_t nextUtf16() { - const char* str = name->cStr(); - size_t n = 0; - size_t i = 0; - uint16_t x = str[pos++]; - - if(x & 0x80) { - uint16_t y = str[pos++]; - if (x & 0x20) { - char z = str[pos++]; - x = ((x & 0x0F) << 12) + - ((y & 0x3F) << 6) + - (z & 0x3F); - } else { - x = ((x & 0x1F) << 6) + - (y & 0x3F); - } - } - - return x; - } + class J3CharConverter { + public: + static size_t maxSize(J3ObjectHandle* charArray); + static size_t convert(J3ObjectHandle* charArray, char* dest); }; } 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=198305&r1=198304&r2=198305&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Thu Jan 2 07:55:19 2014 @@ -5,6 +5,7 @@ #include "j3/j3object.h" #include "j3/j3method.h" #include "j3/j3thread.h" +#include "j3/j3utf16.h" #include #define enterJVM() try { @@ -381,7 +382,9 @@ jstring JNICALL NewStringUTF(JNIEnv* env jsize JNICALL GetStringUTFLength(JNIEnv* env, jstring str) { jsize res; enterJVM(); - res = str->getObject(J3Thread::get()->vm()->stringClassValue)->arrayLength(); + jobject content = str->getObject(J3Thread::get()->vm()->stringClassValue); + char buf[J3CharConverter::maxSize(content)]; + res = J3CharConverter::convert(content, buf); leaveJVM(); return res; } @@ -392,13 +395,8 @@ const char* JNICALL GetStringUTFChars(JN enterJVM(); J3* vm = J3Thread::get()->vm(); jobject content = str->getObject(vm->stringClassValue); - uint32_t length = content->arrayLength(); - res = new char[length+1]; - - for(uint32_t i=0; igetCharAt(i); - - res[length] = 0; + res = new char[J3CharConverter::maxSize(content)]; + J3CharConverter::convert(content, res); if(isCopy) *isCopy = 1; @@ -473,11 +471,7 @@ void JNICALL GetStringUTFRegion(JNIEnv* enterJVM(); J3* vm = J3Thread::get()->vm(); jobject content = str->getObject(vm->stringClassValue); - - for(uint32_t i=0; igetCharAt(start+i); - - buf[len] = 0; + J3CharConverter::convert(content, buf); leaveJVM(); } From gael.thomas at lip6.fr Thu Jan 2 05:58:18 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 13:58:18 -0000 Subject: [vmkit-commits] [vmkit] r198307 - add j3utf16.cc that I forgot. Implement JVM_IsInterface. Message-ID: <20140102135818.DB25A2A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 07:58:18 2014 New Revision: 198307 URL: http://llvm.org/viewvc/llvm-project?rev=198307&view=rev Log: add j3utf16.cc that I forgot. Implement JVM_IsInterface. Added: vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc 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=198307&r1=198306&r2=198307&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan 2 07:58:18 2014 @@ -404,7 +404,15 @@ jobject JNICALL JVM_GetClassLoader(JNIEn return res; } -jboolean JNICALL JVM_IsInterface(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } +jboolean JNICALL JVM_IsInterface(JNIEnv* env, jclass cls) { + jboolean res; + enterJVM(); + J3ObjectType* type = J3ObjectType::nativeClass(cls); + res = type->isArrayClass() ? 0 : J3Cst::isInterface(type->asClass()->access()); + leaveJVM(); + return res; +} + jobjectArray JNICALL JVM_GetClassSigners(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } void JNICALL JVM_SetClassSigners(JNIEnv* env, jclass cls, jobjectArray signers) { enterJVM(); NYI(); leaveJVM(); } jobject JNICALL JVM_GetProtectionDomain(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } Added: vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc?rev=198307&view=auto ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc (added) +++ vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc Thu Jan 2 07:58:18 2014 @@ -0,0 +1,61 @@ +#include "j3/j3utf16.h" +#include "j3/j3object.h" +#include "j3/j3.h" +#include "vmkit/names.h" + +using namespace j3; + +J3Utf16Converter::J3Utf16Converter(const vmkit::Name* _name) { + name = _name; + pos = 0; +} + +bool J3Utf16Converter::isEof() { + return pos == name->length(); +} + +uint16_t J3Utf16Converter::nextUtf16() { + const char* str = name->cStr(); + size_t n = 0; + size_t i = 0; + uint16_t x = str[pos++]; + + if(x & 0x80) { + uint16_t y = str[pos++]; + if (x & 0x20) { + char z = str[pos++]; + x = ((x & 0x0F) << 12) + + ((y & 0x3F) << 6) + + (z & 0x3F); + } else { + x = ((x & 0x1F) << 6) + + (y & 0x3F); + } + } + + return x; +} + +size_t J3CharConverter::convert(J3ObjectHandle* charArray, char* dest) { + size_t length = charArray->arrayLength(); + size_t pos = 0; + + for(uint32_t i=0; igetCharAt(i); + if(c > 127) { + J3::internalError("implement me: fun char"); + } else { + dest[pos++] = (char)c; + } + } + + dest[pos] = 0; + + return pos; +} + +size_t J3CharConverter::maxSize(J3ObjectHandle* charArray) { + return 1 + charArray->arrayLength() * 3; +} + + From gael.thomas at lip6.fr Thu Jan 2 08:13:11 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 16:13:11 -0000 Subject: [vmkit-commits] [vmkit] r198314 - Rename utf related classes Message-ID: <20140102161311.B5F902A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 10:13:10 2014 New Revision: 198314 URL: http://llvm.org/viewvc/llvm-project?rev=198314&view=rev Log: Rename utf related classes Modified: vmkit/branches/mcjit/include/j3/j3.h vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/include/j3/j3signature.h vmkit/branches/mcjit/include/j3/j3utf16.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/j3jni.cc vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3signature.cc vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=198314&r1=198313&r2=198314&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Thu Jan 2 10:13:10 2014 @@ -89,6 +89,11 @@ namespace j3 { J3Field* fieldClassAccess; J3Method* fieldClassInit; + J3Class* constructorClass; + J3Field* constructorClassClass; + J3Field* constructorClassSlot; + J3Method* constructorClassInit; + llvm::Type* typeJNIEnvPtr; llvm::Type* typeJ3VirtualTablePtr; llvm::Type* typeJ3Type; Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198314&r1=198313&r2=198314&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Thu Jan 2 10:13:10 2014 @@ -195,6 +195,9 @@ namespace j3 { uint32_t* ctpValues; void** ctpResolved; + size_t _nbConstructors; + size_t _nbPublicConstructors; + /* GC Object */ J3ObjectHandle* _staticInstance; @@ -214,6 +217,9 @@ namespace j3 { public: J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes); + size_t nbConstructors() { return _nbConstructors; } + size_t nbPublicConstructors() { return _nbPublicConstructors; } + J3ObjectHandle* extractAttribute(J3Attribute* attr); J3StaticLayout* staticLayout() { return &_staticLayout; } Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=198314&r1=198313&r2=198314&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Thu Jan 2 10:13:10 2014 @@ -63,12 +63,14 @@ namespace j3 { J3MethodType* _methodType; J3Attributes* _attributes; uint32_t _index; + uint32_t _slot; llvm::Function* _llvmFunction; void* _fnPtr; char* volatile _llvmAllNames; /* stub + _ + native_name */ void* _nativeFnPtr; void* volatile _staticTrampoline; void* volatile _virtualTrampoline; + J3ObjectHandle* volatile _javaMethod; J3Value internalInvoke(bool statically, J3ObjectHandle* handle, va_list va); J3Value internalInvoke(bool statically, J3ObjectHandle* handle, J3Value* args); @@ -77,6 +79,10 @@ namespace j3 { public: J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, const vmkit::Name* sign); + uint32_t slot() { return _slot; } + + J3ObjectHandle* javaMethod(); + void* nativeFnPtr() { return _nativeFnPtr; } void markCompiled(llvm::Function* llvmFunction, void* fnPtr); Modified: vmkit/branches/mcjit/include/j3/j3signature.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3signature.h?rev=198314&r1=198313&r2=198314&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3signature.h (original) +++ vmkit/branches/mcjit/include/j3/j3signature.h Thu Jan 2 10:13:10 2014 @@ -17,8 +17,10 @@ namespace j3 { class J3LLVMSignature : vmkit::PermanentObject { friend class J3CodeGen; + public: typedef J3Value (*function_t)(void* fn, J3Value* args); + private: llvm::FunctionType* _functionType; function_t _caller; Modified: vmkit/branches/mcjit/include/j3/j3utf16.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3utf16.h?rev=198314&r1=198313&r2=198314&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3utf16.h (original) +++ vmkit/branches/mcjit/include/j3/j3utf16.h Thu Jan 2 10:13:10 2014 @@ -11,20 +11,20 @@ namespace vmkit { namespace j3 { class J3ObjectHandle; - class J3Utf16Converter { + class J3Utf16Encoder { const vmkit::Name* name; size_t pos; public: - J3Utf16Converter(const vmkit::Name* _name); + J3Utf16Encoder(const vmkit::Name* _name); bool isEof(); uint16_t nextUtf16(); }; - class J3CharConverter { + class J3Utf16Decoder { public: static size_t maxSize(J3ObjectHandle* charArray); - static size_t convert(J3ObjectHandle* charArray, char* dest); + static size_t decode(J3ObjectHandle* charArray, char* dest); }; } 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=198314&r1=198313&r2=198314&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan 2 10:13:10 2014 @@ -468,7 +468,27 @@ jobjectArray JNICALL JVM_GetClassDeclare return res; } -jobjectArray JNICALL JVM_GetClassDeclaredConstructors(JNIEnv* env, jclass ofClass, jboolean publicOnly) { enterJVM(); NYI(); leaveJVM(); } +jobjectArray JNICALL JVM_GetClassDeclaredConstructors(JNIEnv* env, jclass ofClass, jboolean publicOnly) { + jobjectArray res; + enterJVM(); + J3* vm = J3Thread::get()->vm(); + J3ObjectType* type = J3ObjectType::nativeClass(ofClass); + if(type->isClass()) { + J3Class* cl = type->asClass(); + res = J3ObjectHandle::doNewArray(vm->constructorClass->getArray(), + publicOnly ? cl->nbPublicConstructors() : cl->nbConstructors()); + + for(uint32_t i=0, pos=0; inbMethods(); i++) { + J3Method* m = cl->methods()[i]; + if(m->name() == vm->initName && (!publicOnly || J3Cst::isPublic(m->access()))) + res->setObjectAt(pos++, m->javaMethod()); + } + } else + res = J3ObjectHandle::doNewArray(vm->constructorClass->getArray(), 0); + + leaveJVM(); + return res; +} /* Differs from JVM_GetClassModifiers in treatment of inner classes. This returns the access flags for the class as specified in the 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=198314&r1=198313&r2=198314&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Thu Jan 2 10:13:10 2014 @@ -127,16 +127,17 @@ void J3::run() { ->findVirtualField(names()->get("eetop"), typeLong); fieldClass = z_class("java/lang/reflect/Field"); - fieldClassInit = z_method(0, fieldClass, initName, - names()->get("(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;IILjava/lang/String;[B)V")); fieldClassClass = z_field(0, fieldClass, "clazz", classClass); fieldClassSlot = z_field(0, fieldClass, "slot", typeInteger); fieldClassAccess = z_field(0, fieldClass, "modifiers", typeInteger); + fieldClassInit = z_method(0, fieldClass, initName, + names()->get("(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;IILjava/lang/String;[B)V")); -#if 0 - J3Field* fieldClassSlot; - J3Method* fieldClassInit; -#endif + constructorClass = z_class("java/lang/reflect/Constructor"); + constructorClassClass = z_field(0, constructorClass, "clazz", classClass); + constructorClassSlot = z_field(0, constructorClass, "slot", typeInteger); + constructorClassInit = z_method(0, constructorClass, initName, + names()->get("(Ljava/lang/Class;[Ljava/lang/Class;[Ljava/lang/Class;IILjava/lang/String;[B[B)V")); J3Lib::bootstrap(this); } @@ -168,10 +169,10 @@ J3ObjectHandle* J3::nameToString(const v J3ObjectHandle* prev = J3Thread::get()->tell(); uint16_t buf[name->length()]; size_t pos = 0; - J3Utf16Converter converter(name); + J3Utf16Encoder encoder(name); - while(!converter.isEof()) - buf[pos++] = converter.nextUtf16(); + while(!encoder.isEof()) + buf[pos++] = encoder.nextUtf16(); res = initialClassLoader->globalReferences()->add(J3ObjectHandle::doNewArray(charArrayClass, pos)); res->setRegionChar(0, buf, 0, pos); 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=198314&r1=198313&r2=198314&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Thu Jan 2 10:13:10 2014 @@ -617,8 +617,9 @@ void J3Class::readClassBytes(J3Field* hi if(J3Cst::isStatic(access)) { nbStaticMethods++; method->setResolved(0); - } else + } else { nbVirtualMethods++; + } } staticLayout()->_methods = (J3Method**)loader()->allocator()->allocate(sizeof(J3Method*)*nbStaticMethods); @@ -628,9 +629,18 @@ void J3Class::readClassBytes(J3Field* hi J3Layout* layout; if(J3Cst::isStatic(methodsTmp[i]->access())) layout = staticLayout(); - else + else { layout = this; + if(methodsTmp[i]->name() == loader()->vm()->initName) { + _nbConstructors++; + if(J3Cst::isPublic(methodsTmp[i]->access())) + _nbPublicConstructors++; + } + } + + methodsTmp[i]->_slot = layout->_nbMethods; layout->_methods[layout->_nbMethods++] = methodsTmp[i]; + if(J3Cst::isPublic(methodsTmp[i]->access())) layout->_nbPublicMethods++; } 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=198314&r1=198313&r2=198314&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Thu Jan 2 10:13:10 2014 @@ -383,8 +383,8 @@ jsize JNICALL GetStringUTFLength(JNIEnv* jsize res; enterJVM(); jobject content = str->getObject(J3Thread::get()->vm()->stringClassValue); - char buf[J3CharConverter::maxSize(content)]; - res = J3CharConverter::convert(content, buf); + char buf[J3Utf16Decoder::maxSize(content)]; + res = J3Utf16Decoder::decode(content, buf); leaveJVM(); return res; } @@ -395,8 +395,8 @@ const char* JNICALL GetStringUTFChars(JN enterJVM(); J3* vm = J3Thread::get()->vm(); jobject content = str->getObject(vm->stringClassValue); - res = new char[J3CharConverter::maxSize(content)]; - J3CharConverter::convert(content, res); + res = new char[J3Utf16Decoder::maxSize(content)]; + J3Utf16Decoder::decode(content, res); if(isCopy) *isCopy = 1; @@ -471,7 +471,7 @@ void JNICALL GetStringUTFRegion(JNIEnv* enterJVM(); J3* vm = J3Thread::get()->vm(); jobject content = str->getObject(vm->stringClassValue); - J3CharConverter::convert(content, buf); + J3Utf16Decoder::decode(content, buf); leaveJVM(); } Modified: vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc?rev=198314&r1=198313&r2=198314&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc Thu Jan 2 10:13:10 2014 @@ -65,11 +65,11 @@ J3Mangler* J3Mangler::mangle(const char* } J3Mangler* J3Mangler::mangle(const vmkit::Name* name) { - J3Utf16Converter converter(name); + J3Utf16Encoder encoder(name); next = cur; - while(!converter.isEof()) { - uint16_t c = converter.nextUtf16(); + while(!encoder.isEof()) { + uint16_t c = encoder.nextUtf16(); if(c > 256) { check(6); 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=198314&r1=198313&r2=198314&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Thu Jan 2 10:13:10 2014 @@ -118,11 +118,14 @@ J3Value J3Method::internalInvoke(bool st void* fn = fnPtr(1); //fprintf(stderr, "Internal invoke %s::%s%s\n", target->cl()->name()->cStr(), target->name()->cStr(), target->sign()->cStr()); - - if(!methodType()->llvmSignature()->caller()) + + J3LLVMSignature::function_t caller = methodType()->llvmSignature()->caller(); + if(!caller) { J3CodeGen::translate(this, 0, 1); + caller = methodType()->llvmSignature()->caller(); + } - J3Value res = methodType()->llvmSignature()->caller()(fn, inArgs); + J3Value res = caller(fn, inArgs); return res; } @@ -280,3 +283,38 @@ void J3Method::registerNative(void* fnPt J3::noSuchMethodError("unable to dynamically modify a native function", cl(), name(), sign()); _nativeFnPtr = fnPtr; } + +J3ObjectHandle* J3Method::javaMethod() { + if(!_javaMethod) { + cl()->lock(); + if(!_javaMethod) { + J3ObjectHandle* prev = J3Thread::get()->tell(); + J3* vm = cl()->loader()->vm(); + + if(name() == cl()->loader()->vm()->initName) { + fprintf(stderr, " slot: %d\n", slot()); + _javaMethod = cl()->loader()->globalReferences()->add(J3ObjectHandle::doNewObject(vm->constructorClass)); + + vm->constructorClassInit->invokeSpecial(_javaMethod, + cl()->javaClass(), + 0, // Class[] parameterTypes, + 0, // Class[] checkedExceptions, + access(), + slot(), + vm->nameToString(sign()), + 0, //byte[] annotations, + 0); //byte[] parameterAnnotations) + + J3::internalError("implement me: java constructor"); + } else + J3::internalError("implement me: javaMethod"); + + J3Thread::get()->restore(prev); + } + cl()->unlock(); + } + + return _javaMethod; +} + + Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=198314&r1=198313&r2=198314&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Thu Jan 2 10:13:10 2014 @@ -85,5 +85,5 @@ void J3LLVMSignature::generateCallerIR(J builder.CreateRet(res); - // caller->dump(); + caller->dump(); } Modified: vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc?rev=198314&r1=198313&r2=198314&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc Thu Jan 2 10:13:10 2014 @@ -5,16 +5,16 @@ using namespace j3; -J3Utf16Converter::J3Utf16Converter(const vmkit::Name* _name) { +J3Utf16Encoder::J3Utf16Encoder(const vmkit::Name* _name) { name = _name; pos = 0; } -bool J3Utf16Converter::isEof() { +bool J3Utf16Encoder::isEof() { return pos == name->length(); } -uint16_t J3Utf16Converter::nextUtf16() { +uint16_t J3Utf16Encoder::nextUtf16() { const char* str = name->cStr(); size_t n = 0; size_t i = 0; @@ -36,7 +36,7 @@ uint16_t J3Utf16Converter::nextUtf16() { return x; } -size_t J3CharConverter::convert(J3ObjectHandle* charArray, char* dest) { +size_t J3Utf16Decoder::decode(J3ObjectHandle* charArray, char* dest) { size_t length = charArray->arrayLength(); size_t pos = 0; @@ -54,7 +54,7 @@ size_t J3CharConverter::convert(J3Object return pos; } -size_t J3CharConverter::maxSize(J3ObjectHandle* charArray) { +size_t J3Utf16Decoder::maxSize(J3ObjectHandle* charArray) { return 1 + charArray->arrayLength() * 3; } From gael.thomas at lip6.fr Thu Jan 2 08:28:47 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 16:28:47 -0000 Subject: [vmkit-commits] [vmkit] r198315 - Create java.lang.reflect.Constructor Message-ID: <20140102162847.8993B2A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 10:28:47 2014 New Revision: 198315 URL: http://llvm.org/viewvc/llvm-project?rev=198315&view=rev Log: Create java.lang.reflect.Constructor Modified: vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3signature.cc 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=198315&r1=198314&r2=198315&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Thu Jan 2 10:28:47 2014 @@ -9,6 +9,7 @@ #include "j3/j3thread.h" #include "j3/j3codegen.h" #include "j3/j3trampoline.h" +#include "j3/j3attribute.h" #include "llvm/IR/Type.h" #include "llvm/IR/Module.h" @@ -124,7 +125,7 @@ J3Value J3Method::internalInvoke(bool st J3CodeGen::translate(this, 0, 1); caller = methodType()->llvmSignature()->caller(); } - + J3Value res = caller(fn, inArgs); return res; @@ -290,22 +291,34 @@ J3ObjectHandle* J3Method::javaMethod() { if(!_javaMethod) { J3ObjectHandle* prev = J3Thread::get()->tell(); J3* vm = cl()->loader()->vm(); + J3ObjectHandle* parameters = J3ObjectHandle::doNewArray(vm->classClass->getArray(), methodType()->nbIns()); + + for(uint32_t i=0; inbIns(); i++) + parameters->setObjectAt(i, methodType()->ins(i)->javaClass()); + + J3Attribute* exceptionAttribute = attributes()->lookup(vm->exceptionsAttribute); + J3ObjectHandle* exceptions; + + if(exceptionAttribute) + J3::internalError("implement me: excp"); + else + exceptions = J3ObjectHandle::doNewArray(vm->classClass->getArray(), 0); + + J3ObjectHandle* annotations = cl()->extractAttribute(attributes()->lookup(vm->annotationsAttribute)); + J3ObjectHandle* paramAnnotations = cl()->extractAttribute(attributes()->lookup(vm->paramAnnotationsAttribute)); if(name() == cl()->loader()->vm()->initName) { - fprintf(stderr, " slot: %d\n", slot()); _javaMethod = cl()->loader()->globalReferences()->add(J3ObjectHandle::doNewObject(vm->constructorClass)); vm->constructorClassInit->invokeSpecial(_javaMethod, cl()->javaClass(), - 0, // Class[] parameterTypes, - 0, // Class[] checkedExceptions, + parameters, + exceptions, access(), slot(), vm->nameToString(sign()), - 0, //byte[] annotations, - 0); //byte[] parameterAnnotations) - - J3::internalError("implement me: java constructor"); + annotations, + paramAnnotations); } else J3::internalError("implement me: javaMethod"); Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=198315&r1=198314&r2=198315&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Thu Jan 2 10:28:47 2014 @@ -85,5 +85,5 @@ void J3LLVMSignature::generateCallerIR(J builder.CreateRet(res); - caller->dump(); + //caller->dump(); } From gael.thomas at lip6.fr Thu Jan 2 08:57:12 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 16:57:12 -0000 Subject: [vmkit-commits] [vmkit] r198317 - Allow a J3Method to belong to a J3ArrayClass Message-ID: <20140102165713.5AFDC2A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 10:57:12 2014 New Revision: 198317 URL: http://llvm.org/viewvc/llvm-project?rev=198317&view=rev Log: Allow a J3Method to belong to a J3ArrayClass Modified: vmkit/branches/mcjit/include/j3/j3.h vmkit/branches/mcjit/include/j3/j3classloader.h vmkit/branches/mcjit/include/j3/j3constants.h vmkit/branches/mcjit/include/j3/j3mangler.h vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc 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/j3codegenvar.cc vmkit/branches/mcjit/lib/j3/vm/j3constants.cc vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=198317&r1=198316&r2=198317&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Thu Jan 2 10:57:12 2014 @@ -130,11 +130,11 @@ namespace j3 { static void classNotFoundException(const vmkit::Name* name) __attribute__((noreturn)); static void noClassDefFoundError(const vmkit::Name* name) __attribute__((noreturn)); - static void classFormatError(J3Class* cl, const char* reason, ...) __attribute__((noreturn)); + static void classFormatError(J3ObjectType* cl, const char* reason, ...) __attribute__((noreturn)); static void noSuchMethodError(const char* msg, - J3Class* clName, const vmkit::Name* name, const vmkit::Name* sign) __attribute__((noreturn)); + J3ObjectType* clName, const vmkit::Name* name, const vmkit::Name* sign) __attribute__((noreturn)); static void noSuchFieldError(const char* msg, - J3Class* clName, const vmkit::Name* name, J3Type* type) __attribute__((noreturn)); + J3ObjectType* clName, const vmkit::Name* name, J3Type* type) __attribute__((noreturn)); static void linkageError(J3Method* method) __attribute__((noreturn)); static void nullPointerException() __attribute__((noreturn)); Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=198317&r1=198316&r2=198317&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Thu Jan 2 10:57:12 2014 @@ -21,6 +21,7 @@ namespace j3 { class J3Method; class J3Type; class J3; + class J3ObjectType; class J3Class; class J3ClassLoader : public vmkit::CompilationUnit { @@ -59,8 +60,8 @@ namespace j3 { pthread_mutex_t _mutexMethods; MethodRefMap methods; /* all te known method */ - void wrongType(J3Class* from, const vmkit::Name* type); - J3Type* getTypeInternal(J3Class* from, const vmkit::Name* type, uint32_t start, uint32_t* end); + void wrongType(J3ObjectType* from, const vmkit::Name* type); + J3Type* getTypeInternal(J3ObjectType* from, const vmkit::Name* type, uint32_t start, uint32_t* end); protected: std::vector > nativeLibraries; @@ -76,17 +77,15 @@ namespace j3 { J3* vm() const { return (J3*)vmkit::CompilationUnit::vm(); }; - J3Method* method(uint16_t access, J3Class* cl, + J3Method* method(uint16_t access, J3ObjectType* cl, const vmkit::Name* name, const vmkit::Name* sign); - J3Method* method(uint16_t access, const vmkit::Name* clName, - const vmkit::Name* name, const vmkit::Name* sign); J3Class* defineClass(const vmkit::Name* name, J3ClassBytes* bytes); J3Class* findLoadedClass(const vmkit::Name* name); virtual J3Class* loadClass(const vmkit::Name* name); J3Type* getType(J3Class* from, const vmkit::Name* type); /* find a type */ - J3MethodType* getMethodType(J3Class* from, const vmkit::Name* sign); /* get a method type */ + J3MethodType* getMethodType(J3ObjectType* from, const vmkit::Name* sign); /* get a method type */ void* lookupNativeFunctionPointer(J3Method* method, const char* symb); }; Modified: vmkit/branches/mcjit/include/j3/j3constants.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3constants.h?rev=198317&r1=198316&r2=198317&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3constants.h (original) +++ vmkit/branches/mcjit/include/j3/j3constants.h Thu Jan 2 10:57:12 2014 @@ -107,7 +107,7 @@ namespace j3 { return ((value - 1) & (-bound)) + bound; } - static const vmkit::Name* rewrite(J3* vm, const vmkit::Name* clName, const vmkit::Name* orig); + static const vmkit::Name* rewrite(J3ObjectType* cl, const vmkit::Name* orig); #define defOpcode(ID, val, effect) \ static const uint8_t BC_##ID = val; Modified: vmkit/branches/mcjit/include/j3/j3mangler.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3mangler.h?rev=198317&r1=198316&r2=198317&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3mangler.h (original) +++ vmkit/branches/mcjit/include/j3/j3mangler.h Thu Jan 2 10:57:12 2014 @@ -8,24 +8,24 @@ namespace vmkit { } namespace j3 { - class J3Class; + class J3ObjectType; class J3Method; class J3Mangler { static const uint32_t max = 65536; - J3Class* from; - char buf[max]; - char* cur; - char* next; + J3ObjectType* from; + char buf[max]; + char* cur; + char* next; - void check(uint32_t n); + void check(uint32_t n); public: static const char* j3Id; static const char* javaId; - J3Mangler(J3Class* from); + J3Mangler(J3ObjectType* from); char* cStr() { return buf; } uint32_t length() { return cur - buf; } Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=198317&r1=198316&r2=198317&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Thu Jan 2 10:57:12 2014 @@ -19,6 +19,7 @@ namespace j3 { class J3LLVMSignature; class J3Type; class J3Attributes; + class J3ObjectType; class J3Class; class J3Method; class J3Value; @@ -57,7 +58,7 @@ namespace j3 { public: J3MethodCode _selfCode; uint16_t _access; - J3Class* _cl; + J3ObjectType* _cl; const vmkit::Name* _name; const vmkit::Name* _sign; J3MethodType* _methodType; @@ -75,9 +76,9 @@ namespace j3 { J3Value internalInvoke(bool statically, J3ObjectHandle* handle, va_list va); J3Value internalInvoke(bool statically, J3ObjectHandle* handle, J3Value* args); J3Value internalInvoke(bool statically, J3Value* args); - void buildLLVMNames(J3Class* from); + void buildLLVMNames(J3ObjectType* from); public: - J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, const vmkit::Name* sign); + J3Method(uint16_t access, J3ObjectType* cl, const vmkit::Name* name, const vmkit::Name* sign); uint32_t slot() { return _slot; } @@ -107,10 +108,10 @@ namespace j3 { J3Attributes* attributes() const { return _attributes; } uint16_t access() const { return _access; } - J3Class* cl() const { return _cl; } + J3ObjectType* cl() const { return _cl; } const vmkit::Name* name() const { return _name; } const vmkit::Name* sign() const { return _sign; } - J3MethodType* methodType(J3Class* from=0); + J3MethodType* methodType(J3ObjectType* from=0); void registerNative(void* ptr); Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=198317&r1=198316&r2=198317&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Thu Jan 2 10:57:12 2014 @@ -23,35 +23,35 @@ static const char* rtjar = OPENJDK_HOME" void J3Lib::bootstrap(J3* vm) { J3ObjectHandle* prev = J3Thread::get()->tell(); - J3Class* threadGroupClass = vm->initialClassLoader->loadClass(vm->names()->get("java/lang/ThreadGroup")); - J3Method* sysThreadGroupInit = vm->initialClassLoader->method(0, - threadGroupClass, - vm->initName, - vm->names()->get("()V")); - J3ObjectHandle* sysThreadGroup = J3ObjectHandle::doNewObject(sysThreadGroupInit->cl()); + J3Class* threadGroupClass = vm->initialClassLoader->loadClass(vm->names()->get("java/lang/ThreadGroup")); + J3Method* sysThreadGroupInit = vm->initialClassLoader->method(0, + threadGroupClass, + vm->initName, + vm->names()->get("()V")); + J3ObjectHandle* sysThreadGroup = J3ObjectHandle::doNewObject(threadGroupClass); sysThreadGroupInit->invokeSpecial(sysThreadGroup); - J3Method* appThreadGroupInit = vm->initialClassLoader->method(0, - threadGroupClass, - vm->initName, - vm->names()->get("(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); - J3ObjectHandle* appThreadGroup = J3ObjectHandle::doNewObject(appThreadGroupInit->cl()); + J3Method* appThreadGroupInit = vm->initialClassLoader->method(0, + threadGroupClass, + vm->initName, + vm->names()->get("(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); + J3ObjectHandle* appThreadGroup = J3ObjectHandle::doNewObject(threadGroupClass); appThreadGroupInit->invokeSpecial(appThreadGroup, sysThreadGroup, vm->utfToString("main")); - J3Method* threadInit = vm->initialClassLoader->method(0, - vm->threadClass, - vm->initName, - vm->names()->get("(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); - J3ObjectHandle* mainThread = J3ObjectHandle::doNewObject(threadInit->cl()); + J3Method* threadInit = vm->initialClassLoader->method(0, + vm->threadClass, + vm->initName, + vm->names()->get("(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); + J3ObjectHandle* mainThread = J3ObjectHandle::doNewObject(vm->threadClass); J3Thread::get()->assocJavaThread(mainThread); - mainThread->setInteger(threadInit->cl()->findVirtualField(vm->names()->get("priority"), vm->typeInteger), 5); + mainThread->setInteger(vm->threadClass->findVirtualField(vm->names()->get("priority"), vm->typeInteger), 5); threadInit->invokeSpecial(mainThread, appThreadGroup, vm->utfToString("main")); vm->initialClassLoader->method(J3Cst::ACC_STATIC, - vm->names()->get("java/lang/System"), + vm->initialClassLoader->loadClass(vm->names()->get("java/lang/System")), vm->names()->get("initializeSystemClass"), vm->names()->get("()V"))->invokeStatic(); 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=198317&r1=198316&r2=198317&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Thu Jan 2 10:57:12 2014 @@ -204,15 +204,15 @@ void J3::noClassDefFoundError(const vmki internalError("NoClassDefFoundError: %s", name); } -void J3::noSuchMethodError(const char* msg, J3Class* cl, const vmkit::Name* name, const vmkit::Name* sign) { +void J3::noSuchMethodError(const char* msg, J3ObjectType* cl, const vmkit::Name* name, const vmkit::Name* sign) { internalError("%s: %s::%s %s", msg, cl->name()->cStr(), name->cStr(), sign->cStr()); } -void J3::noSuchFieldError(const char* msg, J3Class* cl, const vmkit::Name* name, J3Type* type) { +void J3::noSuchFieldError(const char* msg, J3ObjectType* cl, const vmkit::Name* name, J3Type* type) { internalError("%s: %s::%s %s", msg, cl->name()->cStr(), name->cStr(), type->name()->cStr()); } -void J3::classFormatError(J3Class* cl, const char* reason, ...) { +void J3::classFormatError(J3ObjectType* cl, const char* reason, ...) { char buf[65536]; va_list va; va_start(va, reason); 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=198317&r1=198316&r2=198317&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Thu Jan 2 10:57:12 2014 @@ -730,7 +730,7 @@ J3Method* J3Class::interfaceOrMethodAt(u } uint16_t ntIdx = ctpValues[idx] & 0xffff; - J3Class* cl = classAt(ctpValues[idx] >> 16)->asClass(); + J3ObjectType* cl = classAt(ctpValues[idx] >> 16); check(ntIdx, J3Cst::CONSTANT_NameAndType); const vmkit::Name* name = nameAt(ctpValues[ntIdx] >> 16); 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=198317&r1=198316&r2=198317&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Thu Jan 2 10:57:12 2014 @@ -87,11 +87,11 @@ J3Class* J3ClassLoader::loadClass(const J3::internalError("implement me: loadClass from a Java class loader"); } -void J3ClassLoader::wrongType(J3Class* from, const vmkit::Name* type) { +void J3ClassLoader::wrongType(J3ObjectType* from, const vmkit::Name* type) { J3::classFormatError(from, "wrong type: %s", type->cStr()); } -J3Type* J3ClassLoader::getTypeInternal(J3Class* from, const vmkit::Name* typeName, uint32_t start, uint32_t* pend) { +J3Type* J3ClassLoader::getTypeInternal(J3ObjectType* from, const vmkit::Name* typeName, uint32_t start, uint32_t* pend) { J3Type* res = 0; const char* type = typeName->cStr(); uint32_t len = typeName->length(); @@ -168,7 +168,7 @@ J3Type* J3ClassLoader::getType(J3Class* return res; } -J3MethodType* J3ClassLoader::getMethodType(J3Class* from, const vmkit::Name* sign) { +J3MethodType* J3ClassLoader::getMethodType(J3ObjectType* from, const vmkit::Name* sign) { pthread_mutex_lock(&_mutexMethodTypes); J3MethodType* res = methodTypes[sign]; pthread_mutex_unlock(&_mutexMethodTypes); @@ -200,7 +200,7 @@ J3MethodType* J3ClassLoader::getMethodTy return res; } -J3Method* J3ClassLoader::method(uint16_t access, J3Class* cl, const vmkit::Name* name, const vmkit::Name* sign) { +J3Method* J3ClassLoader::method(uint16_t access, J3ObjectType* cl, const vmkit::Name* name, const vmkit::Name* sign) { J3Method method(access, cl, name, sign), *res; pthread_mutex_lock(&_mutexMethods); @@ -217,10 +217,6 @@ J3Method* J3ClassLoader::method(uint16_t return res; } -J3Method* J3ClassLoader::method(uint16_t access, const vmkit::Name* clName, const vmkit::Name* name, const vmkit::Name* sign) { - return method(access, loadClass(clName), name, sign); -} - bool J3ClassLoader::J3InterfaceMethodLess::operator()(j3::J3Method const* lhs, j3::J3Method const* rhs) const { return lhs->name() < rhs->name() || (lhs->name() == rhs->name() 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=198317&r1=198316&r2=198317&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Thu Jan 2 10:57:12 2014 @@ -34,7 +34,7 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato allocator = _allocator; method = m; - cl = method->cl(); + cl = method->cl()->asClass(); methodType = method->methodType(); loader = cl->loader(); vm = loader->vm(); Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc?rev=198317&r1=198316&r2=198317&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc Thu Jan 2 10:57:12 2014 @@ -1,5 +1,6 @@ #include "j3/j3codegenvar.h" #include "j3/j3codegen.h" +#include "j3/j3class.h" #include "j3/j3.h" #include "j3/j3classloader.h" Modified: vmkit/branches/mcjit/lib/j3/vm/j3constants.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3constants.cc?rev=198317&r1=198316&r2=198317&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3constants.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3constants.cc Thu Jan 2 10:57:12 2014 @@ -10,17 +10,26 @@ using namespace j3; char J3Cst::nativePrefix[] = "Java_"; -const vmkit::Name* J3Cst::rewrite(J3* vm, const vmkit::Name* clName, const vmkit::Name* orig) { +const vmkit::Name* J3Cst::rewrite(J3ObjectType* cl, const vmkit::Name* orig) { + const vmkit::Name* clName = cl->name(); char res[clName->length() + orig->length() + 3]; + uint32_t d; res[0] = ID_Left; - res[1] = ID_Classname; - memcpy(res+2, clName->cStr(), sizeof(char)*clName->length()); - res[2 + clName->length()] = ID_End; - memcpy(res+3+clName->length(), orig->cStr()+1, sizeof(char)*(orig->length()-1)); - res[2 + clName->length() + orig->length()] = 0; + if(cl->isClass()) { + res[1] = ID_Classname; + memcpy(res+2, clName->cStr(), sizeof(char)*clName->length()); + res[2 + clName->length()] = ID_End; + d = 2; + } else { + memcpy(res+1, clName->cStr(), sizeof(char)*clName->length()); + d = 0; + } - return vm->names()->get(res); + memcpy(res+1+d+clName->length(), orig->cStr()+1, sizeof(char)*(orig->length()-1)); + res[d + clName->length() + orig->length()] = 0; + + return cl->loader()->vm()->names()->get(res); } #define defOpcode(ID, val, effect) \ Modified: vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc?rev=198317&r1=198316&r2=198317&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc Thu Jan 2 10:57:12 2014 @@ -11,7 +11,7 @@ const char* J3Mangler::j3Id = "j3_"; const char* J3Mangler::javaId = "Java_"; -J3Mangler::J3Mangler(J3Class* _from) { +J3Mangler::J3Mangler(J3ObjectType* _from) { from = _from; cur = buf; } 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=198317&r1=198316&r2=198317&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Thu Jan 2 10:57:12 2014 @@ -29,7 +29,7 @@ J3MethodType::J3MethodType(J3Type** args } -J3Method::J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, const vmkit::Name* sign) : +J3Method::J3Method(uint16_t access, J3ObjectType* cl, const vmkit::Name* name, const vmkit::Name* sign) : _selfCode(this) { _access = access; _cl = cl; @@ -225,13 +225,13 @@ J3Value J3Method::invokeVirtual(J3Object return res; } -J3MethodType* J3Method::methodType(J3Class* from) { +J3MethodType* J3Method::methodType(J3ObjectType* from) { if(!_methodType) { const vmkit::Name* realSign = sign(); J3ClassLoader* loader = cl()->loader(); if(!J3Cst::isStatic(access())) - realSign = J3Cst::rewrite(loader->vm(), cl()->name(), sign()); + realSign = J3Cst::rewrite(cl(), sign()); _methodType = loader->getMethodType(from ? from : cl(), realSign); } @@ -239,7 +239,7 @@ J3MethodType* J3Method::methodType(J3Cla return _methodType; } -void J3Method::buildLLVMNames(J3Class* from) { +void J3Method::buildLLVMNames(J3ObjectType* from) { const char* prefix = "stub_"; uint32_t plen = 5; J3Mangler mangler(from); @@ -304,8 +304,8 @@ J3ObjectHandle* J3Method::javaMethod() { else exceptions = J3ObjectHandle::doNewArray(vm->classClass->getArray(), 0); - J3ObjectHandle* annotations = cl()->extractAttribute(attributes()->lookup(vm->annotationsAttribute)); - J3ObjectHandle* paramAnnotations = cl()->extractAttribute(attributes()->lookup(vm->paramAnnotationsAttribute)); + J3ObjectHandle* annotations = cl()->asClass()->extractAttribute(attributes()->lookup(vm->annotationsAttribute)); + J3ObjectHandle* paramAnnotations = cl()->asClass()->extractAttribute(attributes()->lookup(vm->paramAnnotationsAttribute)); if(name() == cl()->loader()->vm()->initName) { _javaMethod = cl()->loader()->globalReferences()->add(J3ObjectHandle::doNewObject(vm->constructorClass)); 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=198317&r1=198316&r2=198317&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Thu Jan 2 10:57:12 2014 @@ -15,11 +15,11 @@ J3Options::J3Options() { debugEnterIndent = 1; - debugExecute = 0; + debugExecute = 2; debugLoad = 0; debugResolve = 0; debugIniting = 0; - debugTranslate = 0; + debugTranslate = 2; debugLinking = 0; genDebugExecute = debugExecute ? 1 : 0; From gael.thomas at lip6.fr Thu Jan 2 09:06:05 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 17:06:05 -0000 Subject: [vmkit-commits] [vmkit] r198318 - Remove useless hashing of method type and the associated methods. Message-ID: <20140102170605.CB1062A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 11:06:05 2014 New Revision: 198318 URL: http://llvm.org/viewvc/llvm-project?rev=198318&view=rev Log: Remove useless hashing of method type and the associated methods. Modified: vmkit/branches/mcjit/include/j3/j3classloader.h vmkit/branches/mcjit/include/j3/j3constants.h vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3constants.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=198318&r1=198317&r2=198318&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Thu Jan 2 11:06:05 2014 @@ -51,24 +51,21 @@ namespace j3 { pthread_mutex_t _mutexTypes; vmkit::NameMap::map types; /* shortcut to find types */ - pthread_mutex_t _mutexMethodTypes; - vmkit::NameMap::map methodTypes; /* shortcut to find method types - REMOVE */ - pthread_mutex_t _mutexInterfaces; InterfaceMethodRefMap interfaces; pthread_mutex_t _mutexMethods; MethodRefMap methods; /* all te known method */ - void wrongType(J3ObjectType* from, const vmkit::Name* type); - J3Type* getTypeInternal(J3ObjectType* from, const vmkit::Name* type, uint32_t start, uint32_t* end); - protected: std::vector > nativeLibraries; public: J3ClassLoader(J3* vm, J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator); + J3Type* getTypeInternal(J3ObjectType* from, const vmkit::Name* type, uint32_t start, uint32_t* end); + void wrongType(J3ObjectType* from, const vmkit::Name* type); + uint32_t interfaceIndex(J3Method* sign); J3GlobalReferences* globalReferences() { return &_globalReferences; } Modified: vmkit/branches/mcjit/include/j3/j3constants.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3constants.h?rev=198318&r1=198317&r2=198318&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3constants.h (original) +++ vmkit/branches/mcjit/include/j3/j3constants.h Thu Jan 2 11:06:05 2014 @@ -107,8 +107,6 @@ namespace j3 { return ((value - 1) & (-bound)) + bound; } - static const vmkit::Name* rewrite(J3ObjectType* cl, const vmkit::Name* orig); - #define defOpcode(ID, val, effect) \ static const uint8_t BC_##ID = val; #include "j3bc.def" 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=198318&r1=198317&r2=198318&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Thu Jan 2 11:06:05 2014 @@ -26,7 +26,6 @@ J3ClassLoader::J3ClassLoader(J3* v, J3Ob _globalReferences(allocator), classes(vmkit::Name::less, allocator), types(vmkit::Name::less, allocator), - methodTypes(vmkit::Name::less, allocator), interfaces(j3InterfaceMethodLess, allocator), methods(j3MethodLess, allocator), nativeLibraries(allocator) { @@ -34,7 +33,6 @@ J3ClassLoader::J3ClassLoader(J3* v, J3Ob pthread_mutex_init(&_mutexClasses, 0); pthread_mutex_init(&_mutexTypes, 0); - pthread_mutex_init(&_mutexMethodTypes, 0); pthread_mutex_init(&_mutexInterfaces, 0); pthread_mutex_init(&_mutexMethods, 0); } @@ -166,38 +164,6 @@ J3Type* J3ClassLoader::getType(J3Class* } return res; -} - -J3MethodType* J3ClassLoader::getMethodType(J3ObjectType* from, const vmkit::Name* sign) { - pthread_mutex_lock(&_mutexMethodTypes); - J3MethodType* res = methodTypes[sign]; - pthread_mutex_unlock(&_mutexMethodTypes); - - if(!res) { - J3Type* args[sign->length()]; - uint32_t nbArgs = 0; - uint32_t cur = 1; - - if(sign->cStr()[0] != J3Cst::ID_Left) - wrongType(from, sign); - - while(sign->cStr()[cur] != J3Cst::ID_Right) { - args[nbArgs++] = getTypeInternal(from, sign, cur, &cur); - } - args[nbArgs++] = getTypeInternal(from, sign, cur+1, &cur); - if(cur != sign->length()) - wrongType(from, sign); - - pthread_mutex_lock(&_mutexMethodTypes); - J3MethodType* tmp = methodTypes[sign]; - if(tmp) - res = tmp; - else - res = new(allocator(), nbArgs - 1) J3MethodType(args, nbArgs); - pthread_mutex_unlock(&_mutexMethodTypes); - } - - return res; } J3Method* J3ClassLoader::method(uint16_t access, J3ObjectType* cl, const vmkit::Name* name, const vmkit::Name* sign) { Modified: vmkit/branches/mcjit/lib/j3/vm/j3constants.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3constants.cc?rev=198318&r1=198317&r2=198318&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3constants.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3constants.cc Thu Jan 2 11:06:05 2014 @@ -10,28 +10,6 @@ using namespace j3; char J3Cst::nativePrefix[] = "Java_"; -const vmkit::Name* J3Cst::rewrite(J3ObjectType* cl, const vmkit::Name* orig) { - const vmkit::Name* clName = cl->name(); - char res[clName->length() + orig->length() + 3]; - uint32_t d; - - res[0] = ID_Left; - if(cl->isClass()) { - res[1] = ID_Classname; - memcpy(res+2, clName->cStr(), sizeof(char)*clName->length()); - res[2 + clName->length()] = ID_End; - d = 2; - } else { - memcpy(res+1, clName->cStr(), sizeof(char)*clName->length()); - d = 0; - } - - memcpy(res+1+d+clName->length(), orig->cStr()+1, sizeof(char)*(orig->length()-1)); - res[d + clName->length() + orig->length()] = 0; - - return cl->loader()->vm()->names()->get(res); -} - #define defOpcode(ID, val, effect) \ #ID, const char* J3Cst::opcodeNames[] = { 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=198318&r1=198317&r2=198318&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Thu Jan 2 11:06:05 2014 @@ -227,13 +227,26 @@ J3Value J3Method::invokeVirtual(J3Object J3MethodType* J3Method::methodType(J3ObjectType* from) { if(!_methodType) { - const vmkit::Name* realSign = sign(); + const vmkit::Name* sign = J3Method::sign(); J3ClassLoader* loader = cl()->loader(); + J3Type* args[1+sign->length()]; + uint32_t nbArgs = 0; + uint32_t cur = 1; + + if(sign->cStr()[0] != J3Cst::ID_Left) + loader->wrongType(from, sign); if(!J3Cst::isStatic(access())) - realSign = J3Cst::rewrite(cl(), sign()); + args[nbArgs++] = cl(); - _methodType = loader->getMethodType(from ? from : cl(), realSign); + while(sign->cStr()[cur] != J3Cst::ID_Right) { + args[nbArgs++] = loader->getTypeInternal(from, sign, cur, &cur); + } + args[nbArgs++] = loader->getTypeInternal(from, sign, cur+1, &cur); + if(cur != sign->length()) + loader->wrongType(from, sign); + + _methodType = new(loader->allocator(), nbArgs - 1) J3MethodType(args, nbArgs); } return _methodType; 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=198318&r1=198317&r2=198318&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Thu Jan 2 11:06:05 2014 @@ -15,11 +15,11 @@ J3Options::J3Options() { debugEnterIndent = 1; - debugExecute = 2; + debugExecute = 1; debugLoad = 0; debugResolve = 0; debugIniting = 0; - debugTranslate = 2; + debugTranslate = 0; debugLinking = 0; genDebugExecute = debugExecute ? 1 : 0; From gael.thomas at lip6.fr Thu Jan 2 09:14:03 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 17:14:03 -0000 Subject: [vmkit-commits] [vmkit] r198320 - Only add Java parameters in javaMethod() Message-ID: <20140102171403.EA2832A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 11:14:03 2014 New Revision: 198320 URL: http://llvm.org/viewvc/llvm-project?rev=198320&view=rev Log: Only add Java parameters in javaMethod() Modified: vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc 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=198320&r1=198319&r2=198320&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Thu Jan 2 11:14:03 2014 @@ -227,24 +227,23 @@ J3Value J3Method::invokeVirtual(J3Object J3MethodType* J3Method::methodType(J3ObjectType* from) { if(!_methodType) { - const vmkit::Name* sign = J3Method::sign(); J3ClassLoader* loader = cl()->loader(); - J3Type* args[1+sign->length()]; + J3Type* args[1+sign()->length()]; uint32_t nbArgs = 0; uint32_t cur = 1; - if(sign->cStr()[0] != J3Cst::ID_Left) - loader->wrongType(from, sign); + if(sign()->cStr()[0] != J3Cst::ID_Left) + loader->wrongType(from, sign()); if(!J3Cst::isStatic(access())) args[nbArgs++] = cl(); - while(sign->cStr()[cur] != J3Cst::ID_Right) { - args[nbArgs++] = loader->getTypeInternal(from, sign, cur, &cur); + while(sign()->cStr()[cur] != J3Cst::ID_Right) { + args[nbArgs++] = loader->getTypeInternal(from, sign(), cur, &cur); } - args[nbArgs++] = loader->getTypeInternal(from, sign, cur+1, &cur); - if(cur != sign->length()) - loader->wrongType(from, sign); + args[nbArgs++] = loader->getTypeInternal(from, sign(), cur+1, &cur); + if(cur != sign()->length()) + loader->wrongType(from, sign()); _methodType = new(loader->allocator(), nbArgs - 1) J3MethodType(args, nbArgs); } @@ -304,10 +303,19 @@ J3ObjectHandle* J3Method::javaMethod() { if(!_javaMethod) { J3ObjectHandle* prev = J3Thread::get()->tell(); J3* vm = cl()->loader()->vm(); - J3ObjectHandle* parameters = J3ObjectHandle::doNewArray(vm->classClass->getArray(), methodType()->nbIns()); - for(uint32_t i=0; inbIns(); i++) - parameters->setObjectAt(i, methodType()->ins(i)->javaClass()); + uint32_t nbIns = methodType()->nbIns(); + uint32_t d = 0; + + if(!J3Cst::isStatic(access())) { + nbIns--; + d = 1; + } + + J3ObjectHandle* parameters = J3ObjectHandle::doNewArray(vm->classClass->getArray(), nbIns); + + for(uint32_t i=0; isetObjectAt(i, methodType()->ins(i+d)->javaClass()); J3Attribute* exceptionAttribute = attributes()->lookup(vm->exceptionsAttribute); J3ObjectHandle* exceptions; 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=198320&r1=198319&r2=198320&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Thu Jan 2 11:14:03 2014 @@ -15,7 +15,7 @@ J3Options::J3Options() { debugEnterIndent = 1; - debugExecute = 1; + debugExecute = 0; debugLoad = 0; debugResolve = 0; debugIniting = 0; From gael.thomas at lip6.fr Thu Jan 2 09:29:07 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 17:29:07 -0000 Subject: [vmkit-commits] [vmkit] r198324 - Print arguments when executing in debugExecute mode. Message-ID: <20140102172907.A93AA2A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 11:29:07 2014 New Revision: 198324 URL: http://llvm.org/viewvc/llvm-project?rev=198324&view=rev Log: Print arguments when executing in debugExecute mode. Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc 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=198324&r1=198323&r2=198324&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Thu Jan 2 11:29:07 2014 @@ -242,7 +242,7 @@ void J3::vinternalError(const char* msg, vsnprintf(buf, 65536, msg, va); fprintf(stderr, "Internal error: %s\n", buf); printStackTrace(); - // exit(1); + //exit(1); abort(); } 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=198324&r1=198323&r2=198324&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Thu Jan 2 11:29:07 2014 @@ -855,33 +855,6 @@ void J3CodeGen::translate() { builder->SetInsertPoint(bb); _onEndPoint(); - if(vm->options()->genDebugExecute) { - char buf[256]; - snprintf(buf, 256, "%s::%s", method->cl()->name()->cStr(), method->name()->cStr()); -#if 0 - - fprintf(stderr, "bitcast: "); - builder->CreateBitCast(funcEchoDebugEnter, builder->getInt8PtrTy())->dump(); - fprintf(stderr, "\n"); - - llvm::Value* args[] = { - builder->getInt64(42), /* patch point id */ - builder->getInt32(0), /* pad */ - builder->CreateBitCast(funcEchoDebugEnter, builder->getInt8PtrTy()), /* function funcEchoDebugEnter */ - builder->getInt32(3), /* number of args */ - builder->getInt32(0), /* arg[0] */ - buildString("bip %s\n"), /* arg[1] */ - buildString(buf) /* arg[2] */ - }; - builder->CreateCall(patchPointVoid, args)->dump(); -#else - builder->CreateCall3(funcEchoDebugEnter, - builder->getInt32(0), - buildString("%s\n"), - buildString(buf)); -#endif - } - while(codeReader->remaining()) { llvm::Value* val1; llvm::Value* val2; @@ -1590,10 +1563,46 @@ void J3CodeGen::generateJava() { stack.init(this, maxStack, allocator->allocate(J3CodeGenVar::reservedSize(maxStack))); ret.init(this, 1, allocator->allocate(J3CodeGenVar::reservedSize(1))); + + if(vm->options()->genDebugExecute) { + char buf[256]; + snprintf(buf, 256, "%s::%s", method->cl()->name()->cStr(), method->name()->cStr()); +#if 0 + + fprintf(stderr, "bitcast: "); + builder->CreateBitCast(funcEchoDebugEnter, builder->getInt8PtrTy())->dump(); + fprintf(stderr, "\n"); + + llvm::Value* args[] = { + builder->getInt64(42), /* patch point id */ + builder->getInt32(0), /* pad */ + builder->CreateBitCast(funcEchoDebugEnter, builder->getInt8PtrTy()), /* function funcEchoDebugEnter */ + builder->getInt32(3), /* number of args */ + builder->getInt32(0), /* arg[0] */ + buildString("bip %s\n"), /* arg[1] */ + buildString(buf) /* arg[2] */ + }; + builder->CreateCall(patchPointVoid, args)->dump(); +#else + builder->CreateCall3(funcEchoDebugEnter, + builder->getInt32(0), + buildString("%s\n"), + buildString(buf)); +#endif + } + uint32_t n=0, pos=0; for(llvm::Function::arg_iterator cur=llvmFunction->arg_begin(); cur!=llvmFunction->arg_end(); cur++, n++) { J3Type* type = methodType->ins(n); locals.setAt(flatten(cur, type), pos); + + if(vm->options()->debugExecute) + builder->CreateCall4(funcEchoDebugExecute, + builder->getInt32(2), + buildString(" arg[%d]: %p\n"), + builder->getInt32(pos), + locals.at(pos)); + pos += (type == vm->typeLong || type == vm->typeDouble) ? 2 : 1; } 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=198324&r1=198323&r2=198324&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Thu Jan 2 11:29:07 2014 @@ -15,7 +15,7 @@ J3Options::J3Options() { debugEnterIndent = 1; - debugExecute = 0; + debugExecute = 2; debugLoad = 0; debugResolve = 0; debugIniting = 0; From gael.thomas at lip6.fr Thu Jan 2 10:29:19 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 18:29:19 -0000 Subject: [vmkit-commits] [vmkit] r198329 - Correct dispatch of array functions. Message-ID: <20140102182920.0A8932A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 12:29:19 2014 New Revision: 198329 URL: http://llvm.org/viewvc/llvm-project?rev=198329&view=rev Log: Correct dispatch of array functions. Modified: vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/include/j3/j3classloader.h vmkit/branches/mcjit/include/j3/j3mangler.h vmkit/branches/mcjit/include/j3/j3method.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/j3mangler.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 Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198329&r1=198328&r2=198329&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Thu Jan 2 12:29:19 2014 @@ -270,6 +270,9 @@ namespace j3 { J3Type* component() { return _component; } bool isArrayClass() { return 1; } + + J3Method* findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error=1); + J3Method* findStaticMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error=1); }; class J3Primitive : public J3Type { Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=198329&r1=198328&r2=198329&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Thu Jan 2 12:29:19 2014 @@ -63,8 +63,8 @@ namespace j3 { public: J3ClassLoader(J3* vm, J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator); - J3Type* getTypeInternal(J3ObjectType* from, const vmkit::Name* type, uint32_t start, uint32_t* end); - void wrongType(J3ObjectType* from, const vmkit::Name* type); + J3Type* getTypeInternal(J3Class* from, const vmkit::Name* type, uint32_t start, uint32_t* end); + void wrongType(J3Class* from, const vmkit::Name* type); uint32_t interfaceIndex(J3Method* sign); Modified: vmkit/branches/mcjit/include/j3/j3mangler.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3mangler.h?rev=198329&r1=198328&r2=198329&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3mangler.h (original) +++ vmkit/branches/mcjit/include/j3/j3mangler.h Thu Jan 2 12:29:19 2014 @@ -8,24 +8,24 @@ namespace vmkit { } namespace j3 { - class J3ObjectType; + class J3Class; class J3Method; class J3Mangler { static const uint32_t max = 65536; - J3ObjectType* from; - char buf[max]; - char* cur; - char* next; + J3Class* from; + char buf[max]; + char* cur; + char* next; - void check(uint32_t n); + void check(uint32_t n); public: static const char* j3Id; static const char* javaId; - J3Mangler(J3ObjectType* from); + J3Mangler(J3Class* from); char* cStr() { return buf; } uint32_t length() { return cur - buf; } Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=198329&r1=198328&r2=198329&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Thu Jan 2 12:29:19 2014 @@ -58,7 +58,7 @@ namespace j3 { public: J3MethodCode _selfCode; uint16_t _access; - J3ObjectType* _cl; + J3Class* _cl; const vmkit::Name* _name; const vmkit::Name* _sign; J3MethodType* _methodType; @@ -76,9 +76,9 @@ namespace j3 { J3Value internalInvoke(bool statically, J3ObjectHandle* handle, va_list va); J3Value internalInvoke(bool statically, J3ObjectHandle* handle, J3Value* args); J3Value internalInvoke(bool statically, J3Value* args); - void buildLLVMNames(J3ObjectType* from); + void buildLLVMNames(J3Class* from); public: - J3Method(uint16_t access, J3ObjectType* cl, const vmkit::Name* name, const vmkit::Name* sign); + J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, const vmkit::Name* sign); uint32_t slot() { return _slot; } @@ -108,10 +108,10 @@ namespace j3 { J3Attributes* attributes() const { return _attributes; } uint16_t access() const { return _access; } - J3ObjectType* cl() const { return _cl; } + J3Class* cl() const { return _cl; } const vmkit::Name* name() const { return _name; } const vmkit::Name* sign() const { return _sign; } - J3MethodType* methodType(J3ObjectType* from=0); + J3MethodType* methodType(J3Class* from=0); void registerNative(void* ptr); 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=198329&r1=198328&r2=198329&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Thu Jan 2 12:29:19 2014 @@ -110,6 +110,7 @@ void J3::run() { charArrayClass = typeChar->getArray(); objectClass = z_class("java/lang/Object"); + objectClass->resolve(); stringClass = z_class("java/lang/String"); stringClassInit = z_method(0, stringClass, initName, names()->get("([CZ)V")); @@ -242,8 +243,8 @@ void J3::vinternalError(const char* msg, vsnprintf(buf, 65536, msg, va); fprintf(stderr, "Internal error: %s\n", buf); printStackTrace(); - //exit(1); - abort(); + exit(1); + //abort(); } void J3::printStackTrace() { 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=198329&r1=198328&r2=198329&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Thu Jan 2 12:29:19 2014 @@ -860,12 +860,18 @@ J3ArrayClass::J3ArrayClass(J3ClassLoader } } +J3Method* J3ArrayClass::findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error) { + return loader()->vm()->objectClass->findVirtualMethod(name, sign, error); +} + +J3Method* J3ArrayClass::findStaticMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error) { + return loader()->vm()->objectClass->findStaticMethod(name, sign, error); +} + void J3ArrayClass::doResolve(J3Field* hiddenFields, size_t nbHiddenFields) { lock(); if(status < RESOLVED) { status = RESOLVED; - J3Class* objectClass = loader()->vm()->objectClass; - objectClass->resolve(); _vt = J3VirtualTable::create(this); prepareInterfaceTable(); } 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=198329&r1=198328&r2=198329&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Thu Jan 2 12:29:19 2014 @@ -85,11 +85,11 @@ J3Class* J3ClassLoader::loadClass(const J3::internalError("implement me: loadClass from a Java class loader"); } -void J3ClassLoader::wrongType(J3ObjectType* from, const vmkit::Name* type) { +void J3ClassLoader::wrongType(J3Class* from, const vmkit::Name* type) { J3::classFormatError(from, "wrong type: %s", type->cStr()); } -J3Type* J3ClassLoader::getTypeInternal(J3ObjectType* from, const vmkit::Name* typeName, uint32_t start, uint32_t* pend) { +J3Type* J3ClassLoader::getTypeInternal(J3Class* from, const vmkit::Name* typeName, uint32_t start, uint32_t* pend) { J3Type* res = 0; const char* type = typeName->cStr(); uint32_t len = typeName->length(); @@ -166,21 +166,26 @@ J3Type* J3ClassLoader::getType(J3Class* return res; } -J3Method* J3ClassLoader::method(uint16_t access, J3ObjectType* cl, const vmkit::Name* name, const vmkit::Name* sign) { - J3Method method(access, cl, name, sign), *res; - - pthread_mutex_lock(&_mutexMethods); - std::map::iterator it = methods.find(&method); +J3Method* J3ClassLoader::method(uint16_t access, J3ObjectType* type, const vmkit::Name* name, const vmkit::Name* sign) { + if(type->isArrayClass()) + return method(access, vm()->objectClass, name, sign); + else { + J3Class* cl = type->asClass(); + J3Method method(access, cl, name, sign), *res; + + pthread_mutex_lock(&_mutexMethods); + std::map::iterator it = methods.find(&method); + + if(it == methods.end()) { + res = new(allocator()) J3Method(access, cl, name, sign); + methods[res] = res; + } else { + res = it->second; + } + pthread_mutex_unlock(&_mutexMethods); - if(it == methods.end()) { - res = new(allocator()) J3Method(access, cl, name, sign); - methods[res] = res; - } else { - res = it->second; + return res; } - pthread_mutex_unlock(&_mutexMethods); - - return res; } bool J3ClassLoader::J3InterfaceMethodLess::operator()(j3::J3Method const* lhs, j3::J3Method const* rhs) const { 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=198329&r1=198328&r2=198329&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Thu Jan 2 12:29:19 2014 @@ -442,6 +442,14 @@ void J3CodeGen::invokeVirtual(uint32_t i llvm::Value* func = builder->CreateBitCast(builder->CreateLoad(builder->CreateGEP(vt(obj), gepFunc)), llvmFunctionType(type)->getPointerTo()); + + builder->CreateCall5(funcEchoDebugExecute, + builder->getInt32(2), + buildString("Invoking %p::%d %p\n"), + vt(obj), + funcEntry, + func); + invoke(target, func); } Modified: vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc?rev=198329&r1=198328&r2=198329&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc Thu Jan 2 12:29:19 2014 @@ -11,7 +11,7 @@ const char* J3Mangler::j3Id = "j3_"; const char* J3Mangler::javaId = "Java_"; -J3Mangler::J3Mangler(J3ObjectType* _from) { +J3Mangler::J3Mangler(J3Class* _from) { from = _from; cur = buf; } 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=198329&r1=198328&r2=198329&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Thu Jan 2 12:29:19 2014 @@ -29,7 +29,7 @@ J3MethodType::J3MethodType(J3Type** args } -J3Method::J3Method(uint16_t access, J3ObjectType* cl, const vmkit::Name* name, const vmkit::Name* sign) : +J3Method::J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, const vmkit::Name* sign) : _selfCode(this) { _access = access; _cl = cl; @@ -225,7 +225,7 @@ J3Value J3Method::invokeVirtual(J3Object return res; } -J3MethodType* J3Method::methodType(J3ObjectType* from) { +J3MethodType* J3Method::methodType(J3Class* from) { if(!_methodType) { J3ClassLoader* loader = cl()->loader(); J3Type* args[1+sign()->length()]; @@ -251,7 +251,7 @@ J3MethodType* J3Method::methodType(J3Obj return _methodType; } -void J3Method::buildLLVMNames(J3ObjectType* from) { +void J3Method::buildLLVMNames(J3Class* from) { const char* prefix = "stub_"; uint32_t plen = 5; J3Mangler mangler(from); 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=198329&r1=198328&r2=198329&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Thu Jan 2 12:29:19 2014 @@ -156,6 +156,7 @@ J3VirtualTable* J3VirtualTable::create(J J3VirtualTable(cl, super, secondaries, nbSecondaries, isSecondary); memcpy(res->_virtualMethods, objClass->vt()->_virtualMethods, sizeof(void*)*objClass->vt()->_nbVirtualMethods); + memcpy(res->_interfaceMethodTable, objClass->vt()->_interfaceMethodTable, sizeof(void*)*nbInterfaceMethodTable); return res; } 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=198329&r1=198328&r2=198329&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Thu Jan 2 12:29:19 2014 @@ -15,7 +15,7 @@ J3Options::J3Options() { debugEnterIndent = 1; - debugExecute = 2; + debugExecute = 0; debugLoad = 0; debugResolve = 0; debugIniting = 0; From gael.thomas at lip6.fr Thu Jan 2 11:40:47 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 19:40:47 -0000 Subject: [vmkit-commits] [vmkit] r198342 - Implement JVM_clone() Message-ID: <20140102194047.B358B2A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 13:40:47 2014 New Revision: 198342 URL: http://llvm.org/viewvc/llvm-project?rev=198342&view=rev Log: Implement JVM_clone() Modified: vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/include/j3/j3object.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3class.cc vmkit/branches/mcjit/lib/j3/vm/j3object.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198342&r1=198341&r2=198342&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Thu Jan 2 13:40:47 2014 @@ -132,6 +132,8 @@ namespace j3 { static J3ObjectType* nativeClass(J3ObjectHandle* handle); void dumpInterfaceSlotDescriptors(); + + virtual J3ObjectHandle* clone(J3ObjectHandle* obj); }; class J3Layout : public J3ObjectType { @@ -217,6 +219,8 @@ namespace j3 { public: J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes); + J3ObjectHandle* clone(J3ObjectHandle* obj); + size_t nbConstructors() { return _nbConstructors; } size_t nbPublicConstructors() { return _nbPublicConstructors; } @@ -268,6 +272,8 @@ namespace j3 { public: J3ArrayClass(J3ClassLoader* loader, J3Type* component, const vmkit::Name* name); + J3ObjectHandle* clone(J3ObjectHandle* obj); + J3Type* component() { return _component; } bool isArrayClass() { return 1; } Modified: vmkit/branches/mcjit/include/j3/j3object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=198342&r1=198341&r2=198342&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3object.h (original) +++ vmkit/branches/mcjit/include/j3/j3object.h Thu Jan 2 13:40:47 2014 @@ -165,6 +165,7 @@ namespace j3 { uint32_t hashCode(); + void rawObjectCopyTo(uint32_t fromOffset, J3ObjectHandle* to, uint32_t toOffset, uint32_t nbb); void rawArrayCopyTo(uint32_t fromOffset, J3ObjectHandle* to, uint32_t toOffset, uint32_t nbb); J3ObjectHandle* rawCASObject(uintptr_t offset, J3ObjectHandle* orig, J3ObjectHandle* value); 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=198342&r1=198341&r2=198342&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan 2 13:40:47 2014 @@ -43,7 +43,13 @@ void JNICALL JVM_MonitorWait(JNIEnv* env void JNICALL JVM_MonitorNotify(JNIEnv* env, jobject obj) { enterJVM(); NYI(); leaveJVM(); } void JNICALL JVM_MonitorNotifyAll(JNIEnv* env, jobject obj) { enterJVM(); NYI(); leaveJVM(); } -jobject JNICALL JVM_Clone(JNIEnv* env, jobject obj) { enterJVM(); NYI(); leaveJVM(); } +jobject JNICALL JVM_Clone(JNIEnv* env, jobject obj) { + jobject res; + enterJVM(); + res = obj->vt()->type()->asObjectType()->clone(obj); + leaveJVM(); + return res; +} /* * java.lang.String 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=198342&r1=198341&r2=198342&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Thu Jan 2 13:40:47 2014 @@ -180,6 +180,10 @@ J3ObjectType* J3ObjectType::nativeClass( return (J3ObjectType*)(uintptr_t)handle->getLong(J3Thread::get()->vm()->classClassVMData); } +J3ObjectHandle* J3ObjectType::clone(J3ObjectHandle* obj) { + J3::internalError("should not happen"); +} + void J3ObjectType::prepareInterfaceTable() { //fprintf(stderr, "prepare interface table of %s\n", name()->cStr()); @@ -296,6 +300,12 @@ J3Class::J3Class(J3ClassLoader* loader, status = LOADED; } +J3ObjectHandle* J3Class::clone(J3ObjectHandle* obj) { + J3ObjectHandle* res = J3ObjectHandle::doNewObject(this); + obj->rawObjectCopyTo(0, res, 0, structSize()); + return res; +} + J3ObjectHandle* J3Class::extractAttribute(J3Attribute* attr) { if(attr) J3::internalError("extract attribute"); @@ -860,6 +870,13 @@ J3ArrayClass::J3ArrayClass(J3ClassLoader } } +J3ObjectHandle* J3ArrayClass::clone(J3ObjectHandle* obj) { + size_t n = obj->arrayLength(); + J3ObjectHandle* res = J3ObjectHandle::doNewArray(this, n); + obj->rawArrayCopyTo(0, res, 0, n<logSize()); + return res; +} + J3Method* J3ArrayClass::findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error) { return loader()->vm()->objectClass->findVirtualMethod(name, sign, error); } 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=198342&r1=198341&r2=198342&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Thu Jan 2 13:40:47 2014 @@ -497,6 +497,13 @@ J3ObjectHandle* J3ObjectHandle::getObjec return rawGetObject(sizeof(J3ArrayObject) + idx*sizeof(J3Object*)); } +void J3ObjectHandle::rawObjectCopyTo(uint32_t fromOffset, J3ObjectHandle* to, uint32_t toOffset, uint32_t nbb) { + if(isSame(to)) + memmove((uint8_t*)(to->obj()+1) + toOffset, (uint8_t*)(array()+1) + fromOffset, nbb); + else + memcpy((uint8_t*)(to->obj()+1) + toOffset, (uint8_t*)(array()+1) + fromOffset, nbb); +} + void J3ObjectHandle::rawArrayCopyTo(uint32_t fromOffset, J3ObjectHandle* to, uint32_t toOffset, uint32_t nbb) { if(isSame(to)) memmove((uint8_t*)(to->array()+1) + toOffset, (uint8_t*)(array()+1) + fromOffset, nbb); 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=198342&r1=198341&r2=198342&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Thu Jan 2 13:40:47 2014 @@ -15,7 +15,7 @@ J3Options::J3Options() { debugEnterIndent = 1; - debugExecute = 0; + debugExecute = 2; debugLoad = 0; debugResolve = 0; debugIniting = 0; From gael.thomas at lip6.fr Thu Jan 2 14:15:42 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 02 Jan 2014 22:15:42 -0000 Subject: [vmkit-commits] [vmkit] r198363 - a J3MethodType does not embedded the type of this anymore Message-ID: <20140102221542.3A2502A6C029@llvm.org> Author: gthomas Date: Thu Jan 2 16:15:41 2014 New Revision: 198363 URL: http://llvm.org/viewvc/llvm-project?rev=198363&view=rev Log: a J3MethodType does not embedded the type of this anymore Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=198363&r1=198362&r2=198363&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Thu Jan 2 16:15:41 2014 @@ -81,7 +81,7 @@ namespace j3 { uint32_t wideReadU1(); uint32_t wideReadS1(); - llvm::FunctionType* llvmFunctionType(J3MethodType* type); + llvm::FunctionType* llvmFunctionType(J3Method* method); llvm::Function* buildFunction(J3Method* method, bool isStub=1); llvm::Value* methodDescriptor(J3Method* method); llvm::Value* typeDescriptor(J3ObjectType* objectType, llvm::Type* type); @@ -127,7 +127,7 @@ namespace j3 { void putField(uint32_t idx); void putStatic(uint32_t idx); - void invoke(J3Method* method, llvm::Value* func); + void invoke(uint32_t access, J3Method* method, llvm::Value* func); void invokeVirtual(uint32_t idx); void invokeStatic(uint32_t idx); void invokeSpecial(uint32_t idx); Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=198363&r1=198362&r2=198363&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Thu Jan 2 16:15:41 2014 @@ -36,8 +36,8 @@ namespace j3 { void setLLVMSignature(J3LLVMSignature* llvmSignature) { _llvmSignature = llvmSignature; } J3LLVMSignature* llvmSignature() { return _llvmSignature; } - uint32_t nbIns() { return _nbIns; } J3Type* out() { return _out; } + uint32_t nbIns() { return _nbIns; } J3Type* ins(uint32_t idx) { return _ins[idx]; } void* operator new(size_t unused, vmkit::BumpAllocator* allocator, size_t n) { 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=198363&r1=198362&r2=198363&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan 2 16:15:41 2014 @@ -48,6 +48,7 @@ jobject JNICALL JVM_Clone(JNIEnv* env, j enterJVM(); res = obj->vt()->type()->asObjectType()->clone(obj); leaveJVM(); + NYI(); return res; } 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=198363&r1=198362&r2=198363&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Thu Jan 2 16:15:41 2014 @@ -187,13 +187,19 @@ llvm::Value* J3CodeGen::unflatten(llvm:: } } -llvm::FunctionType* J3CodeGen::llvmFunctionType(J3MethodType* type) { +llvm::FunctionType* J3CodeGen::llvmFunctionType(J3Method* method) { + J3MethodType* type = method->methodType(cl); J3LLVMSignature* res = type->llvmSignature(); if(!res) { std::vector in; + + if(!J3Cst::isStatic(method->access())) + in.push_back(vm->typeJ3ObjectPtr); + for(uint32_t i=0; inbIns(); i++) in.push_back(type->ins(i)->llvmType()); + llvm::FunctionType* funcType = llvm::FunctionType::get(type->out()->llvmType(), in, 0); res = vm->llvmSignatures[funcType]; if(!res) @@ -205,7 +211,7 @@ llvm::FunctionType* J3CodeGen::llvmFunct llvm::Function* J3CodeGen::buildFunction(J3Method* method, bool isStub) { const char* id = (isStub && !method->isCompiled()) ? method->llvmStubName(cl) : method->llvmFunctionName(cl); - return (llvm::Function*)module->getOrInsertFunction(id, llvmFunctionType(method->methodType(cl))); + return (llvm::Function*)module->getOrInsertFunction(id, llvmFunctionType(method)); } llvm::Value* J3CodeGen::typeDescriptor(J3ObjectType* objectType, llvm::Type* type) { @@ -381,14 +387,20 @@ llvm::Value* J3CodeGen::nullCheck(llvm:: #define nyi() J3::internalError("not yet implemented: '%s' (%d)", J3Cst::opcodeNames[bc], bc); -void J3CodeGen::invoke(J3Method* target, llvm::Value* func) { +void J3CodeGen::invoke(uint32_t access, J3Method* target, llvm::Value* func) { J3MethodType* type = target->methodType(cl); std::vector args; + uint32_t d = 0; + + if(!J3Cst::isStatic(access)) { + args.push_back(unflatten(stack.top(type->nbIns()), target->cl())); + d = 1; + } for(uint32_t i=0; inbIns(); i++) args.push_back(unflatten(stack.top(type->nbIns() - i - 1), type->ins(i))); - stack.drop(type->nbIns()); + stack.drop(d + type->nbIns()); llvm::Value* res; @@ -415,14 +427,14 @@ void J3CodeGen::invokeInterface(uint32_t llvm::Value* gep[] = { builder->getInt32(0), builder->getInt32(J3Thread::gepInterfaceMethodIndex) }; builder->CreateStore(builder->getInt32(index), builder->CreateGEP(thread, gep)); - llvm::Value* obj = nullCheck(stack.top(type->nbIns() - 1)); + llvm::Value* obj = nullCheck(stack.top(type->nbIns())); llvm::Value* gepFunc[] = { builder->getInt32(0), builder->getInt32(J3VirtualTable::gepInterfaceMethods), builder->getInt32(index % J3VirtualTable::nbInterfaceMethodTable) }; llvm::Value* func = builder->CreateBitCast(builder->CreateLoad(builder->CreateGEP(vt(obj), gepFunc)), - llvmFunctionType(type)->getPointerTo()); + llvmFunctionType(target)->getPointerTo()); - invoke(target, func); + invoke(0, target, func); } void J3CodeGen::invokeVirtual(uint32_t idx) { @@ -435,33 +447,33 @@ void J3CodeGen::invokeVirtual(uint32_t i else funcEntry = builder->CreateCall(funcJ3MethodIndex, methodDescriptor(target)); - llvm::Value* obj = nullCheck(stack.top(type->nbIns() - 1)); + llvm::Value* obj = nullCheck(stack.top(type->nbIns())); llvm::Value* gepFunc[] = { builder->getInt32(0), builder->getInt32(J3VirtualTable::gepVirtualMethods), funcEntry }; llvm::Value* func = builder->CreateBitCast(builder->CreateLoad(builder->CreateGEP(vt(obj), gepFunc)), - llvmFunctionType(type)->getPointerTo()); - + llvmFunctionType(target)->getPointerTo()); + char buf[65536]; snprintf(buf, 65536, "%s::%s%s", target->cl()->name()->cStr(), target->name()->cStr(), target->sign()->cStr()); builder->CreateCall5(funcEchoDebugExecute, builder->getInt32(2), - buildString("Invoking %p::%d %p\n"), + buildString("Invoking %s %p::%d\n"), + buildString(buf), vt(obj), - funcEntry, - func); + funcEntry); - invoke(target, func); + invoke(0, target, func); } void J3CodeGen::invokeStatic(uint32_t idx) { J3Method* target = cl->methodAt(idx, J3Cst::ACC_STATIC); initialiseJ3ObjectType(target->cl()); - invoke(target, buildFunction(target)); + invoke(J3Cst::ACC_STATIC, target, buildFunction(target)); } void J3CodeGen::invokeSpecial(uint32_t idx) { J3Method* target = cl->methodAt(idx, 0); - invoke(target, buildFunction(target)); + invoke(0, target, buildFunction(target)); } llvm::Value* J3CodeGen::fieldOffset(llvm::Value* obj, J3Field* f) { @@ -1600,8 +1612,14 @@ void J3CodeGen::generateJava() { } uint32_t n=0, pos=0; - for(llvm::Function::arg_iterator cur=llvmFunction->arg_begin(); cur!=llvmFunction->arg_end(); cur++, n++) { - J3Type* type = methodType->ins(n); + for(llvm::Function::arg_iterator cur=llvmFunction->arg_begin(); cur!=llvmFunction->arg_end(); cur++) { + J3Type* type; + + if(!pos && !J3Cst::isStatic(method->access())) + type = method->cl(); + else + type = methodType->ins(n++); + locals.setAt(flatten(cur, type), pos); if(vm->options()->debugExecute) @@ -1696,6 +1714,8 @@ llvm::Function* J3CodeGen::lookupNative( if(J3Cst::isStatic(method->access())) nativeIns.push_back(doNativeType(vm->classClass)); + else + nativeIns.push_back(vm->typeJ3ObjectHandlePtr); for(int i=0; inbIns(); i++) nativeIns.push_back(doNativeType(methodType->ins(i))); @@ -1735,19 +1755,23 @@ void J3CodeGen::generateNative() { args.push_back(builder->CreateCall(funcJniEnv)); if(J3Cst::isStatic(method->access())) - args.push_back(builder->CreateCall2(funcJ3ThreadPushHandle, thread, javaClass(cl))); /* avoid harakiri */ + args.push_back(builder->CreateCall2(funcJ3ThreadPushHandle, thread, javaClass(cl))); - if(methodType->nbIns()) { - uint32_t i = 0; + uint32_t i = 0, selfDone = 0; - for(llvm::Function::arg_iterator cur=llvmFunction->arg_begin(); cur!=llvmFunction->arg_end(); cur++, i++) { - llvm::Value* a; + for(llvm::Function::arg_iterator cur=llvmFunction->arg_begin(); cur!=llvmFunction->arg_end(); cur++) { + llvm::Value* a; + if(!selfDone && !J3Cst::isStatic(method->access())) { + selfDone = 1; + a = builder->CreateCall2(funcJ3ThreadPush, thread, flatten(cur, method->cl())); + } else { if(methodType->ins(i)->llvmType()->isPointerTy()) a = builder->CreateCall2(funcJ3ThreadPush, thread, flatten(cur, methodType->ins(i))); else a = cur; - args.push_back(a); + i++; } + args.push_back(a); } res = builder->CreateCall(nat, args); Modified: vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc?rev=198363&r1=198362&r2=198363&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc Thu Jan 2 16:15:41 2014 @@ -48,6 +48,7 @@ J3Mangler* J3Mangler::mangle(J3Method* m memcpy(cur, method->cl()->nativeName() + 1, method->cl()->nativeNameLength() - 3); *next = '_'; cur = next+1; + mangle(method->name()); return this; 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=198363&r1=198362&r2=198363&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Thu Jan 2 16:15:41 2014 @@ -134,44 +134,44 @@ J3Value J3Method::internalInvoke(bool st J3Value J3Method::internalInvoke(bool statically, J3ObjectHandle* handle, J3Value* inArgs) { J3Value* reIn; if(handle) { - reIn = (J3Value*)alloca(methodType()->nbIns()*sizeof(J3Value)); + reIn = (J3Value*)alloca((methodType()->nbIns()+1)*sizeof(J3Value)); reIn[0].valObject = handle; - memcpy(reIn+1, inArgs, (methodType()->nbIns() - 1)*sizeof(J3Value)); + memcpy(reIn+1, inArgs, methodType()->nbIns()*sizeof(J3Value)); } else reIn = inArgs; return internalInvoke(statically, reIn); } J3Value J3Method::internalInvoke(bool statically, J3ObjectHandle* handle, va_list va) { - J3Value* args = (J3Value*)alloca(sizeof(J3Value)*methodType()->nbIns()); + J3Value* args = (J3Value*)alloca(sizeof(J3Value)*(methodType()->nbIns() + 1)); J3* vm = cl()->loader()->vm(); J3Type* cur; - uint32_t i = 0; + uint32_t d = 0; if(handle) - args[i++].valObject = handle; + args[d++].valObject = handle; - for(; inbIns(); i++) { + for(uint32_t i=0; inbIns(); i++) { cur = methodType()->ins(i); if(cur == vm->typeBoolean) - args[i].valBoolean = va_arg(va, bool); + args[i+d].valBoolean = va_arg(va, bool); else if(cur == vm->typeByte) - args[i].valByte = va_arg(va, int8_t); + args[i+d].valByte = va_arg(va, int8_t); else if(cur == vm->typeShort) - args[i].valShort = va_arg(va, int16_t); + args[i+d].valShort = va_arg(va, int16_t); else if(cur == vm->typeChar) - args[i].valChar = va_arg(va, uint16_t); + args[i+d].valChar = va_arg(va, uint16_t); else if(cur == vm->typeInteger) - args[i].valInteger = va_arg(va, int32_t); + args[i+d].valInteger = va_arg(va, int32_t); else if(cur == vm->typeLong) - args[i].valLong = va_arg(va, int64_t); + args[i+d].valLong = va_arg(va, int64_t); else if(cur == vm->typeFloat) - args[i].valFloat = va_arg(va, float); + args[i+d].valFloat = va_arg(va, float); else if(cur == vm->typeDouble) - args[i].valDouble = va_arg(va, double); + args[i+d].valDouble = va_arg(va, double); else - args[i].valObject = va_arg(va, J3ObjectHandle*); + args[i+d].valObject = va_arg(va, J3ObjectHandle*); } return internalInvoke(statically, args); @@ -235,9 +235,6 @@ J3MethodType* J3Method::methodType(J3Cla if(sign()->cStr()[0] != J3Cst::ID_Left) loader->wrongType(from, sign()); - if(!J3Cst::isStatic(access())) - args[nbArgs++] = cl(); - while(sign()->cStr()[cur] != J3Cst::ID_Right) { args[nbArgs++] = loader->getTypeInternal(from, sign(), cur, &cur); } @@ -305,17 +302,11 @@ J3ObjectHandle* J3Method::javaMethod() { J3* vm = cl()->loader()->vm(); uint32_t nbIns = methodType()->nbIns(); - uint32_t d = 0; - - if(!J3Cst::isStatic(access())) { - nbIns--; - d = 1; - } J3ObjectHandle* parameters = J3ObjectHandle::doNewArray(vm->classClass->getArray(), nbIns); for(uint32_t i=0; isetObjectAt(i, methodType()->ins(i+d)->javaClass()); + parameters->setObjectAt(i, methodType()->ins(i)->javaClass()); J3Attribute* exceptionAttribute = attributes()->lookup(vm->exceptionsAttribute); J3ObjectHandle* exceptions; 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=198363&r1=198362&r2=198363&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Thu Jan 2 16:15:41 2014 @@ -15,7 +15,7 @@ J3Options::J3Options() { debugEnterIndent = 1; - debugExecute = 2; + debugExecute = 0; debugLoad = 0; debugResolve = 0; debugIniting = 0; From gael.thomas at lip6.fr Fri Jan 3 03:30:23 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Fri, 03 Jan 2014 11:30:23 -0000 Subject: [vmkit-commits] [vmkit] r198406 - delegate to J3ClassLoader the definition of a j3signature. Message-ID: <20140103113023.1CDF72A6C029@llvm.org> Author: gthomas Date: Fri Jan 3 05:30:22 2014 New Revision: 198406 URL: http://llvm.org/viewvc/llvm-project?rev=198406&view=rev Log: delegate to J3ClassLoader the definition of a j3signature. Modified: vmkit/branches/mcjit/include/j3/j3classloader.h vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/include/j3/j3signature.h vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=198406&r1=198405&r2=198406&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Fri Jan 3 05:30:22 2014 @@ -57,6 +57,9 @@ namespace j3 { pthread_mutex_t _mutexMethods; MethodRefMap methods; /* all te known method */ + pthread_mutex_t _mutexMethodTypes; + vmkit::NameMap::map methodTypes; + protected: std::vector > nativeLibraries; @@ -64,6 +67,8 @@ namespace j3 { J3ClassLoader(J3* vm, J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator); J3Type* getTypeInternal(J3Class* from, const vmkit::Name* type, uint32_t start, uint32_t* end); + J3Type* getType(J3Class* from, const vmkit::Name* type); /* find a type */ + J3MethodType* getMethodType(J3Class* from, const vmkit::Name* sign); /* get a method type */ void wrongType(J3Class* from, const vmkit::Name* type); uint32_t interfaceIndex(J3Method* sign); @@ -81,9 +86,6 @@ namespace j3 { J3Class* findLoadedClass(const vmkit::Name* name); virtual J3Class* loadClass(const vmkit::Name* name); - J3Type* getType(J3Class* from, const vmkit::Name* type); /* find a type */ - J3MethodType* getMethodType(J3ObjectType* from, const vmkit::Name* sign); /* get a method type */ - void* lookupNativeFunctionPointer(J3Method* method, const char* symb); }; Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=198406&r1=198405&r2=198406&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Fri Jan 3 05:30:22 2014 @@ -24,26 +24,7 @@ namespace j3 { class J3Method; class J3Value; class J3ObjectHandle; - - class J3MethodType : public vmkit::PermanentObject { - J3LLVMSignature* _llvmSignature; - J3Type* _out; - uint32_t _nbIns; - J3Type* _ins[1]; - - public: - J3MethodType(J3Type** args, size_t nbArgs); - - void setLLVMSignature(J3LLVMSignature* llvmSignature) { _llvmSignature = llvmSignature; } - J3LLVMSignature* llvmSignature() { return _llvmSignature; } - J3Type* out() { return _out; } - uint32_t nbIns() { return _nbIns; } - J3Type* ins(uint32_t idx) { return _ins[idx]; } - - void* operator new(size_t unused, vmkit::BumpAllocator* allocator, size_t n) { - return vmkit::PermanentObject::operator new(sizeof(J3MethodType) + (n - 1) * sizeof(J3Type*), allocator); - } - }; + class J3MethodType; class J3MethodCode : public vmkit::Symbol { public: Modified: vmkit/branches/mcjit/include/j3/j3signature.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3signature.h?rev=198406&r1=198405&r2=198406&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3signature.h (original) +++ vmkit/branches/mcjit/include/j3/j3signature.h Fri Jan 3 05:30:22 2014 @@ -9,11 +9,32 @@ namespace llvm { } namespace j3 { - class J3MethodType; + class J3LLVMSignature; class J3Type; class J3Value; class J3CodeGen; + class J3MethodType : public vmkit::PermanentObject { + J3LLVMSignature* _staticLLVMSignature; + J3LLVMSignature* _virtualLLVMSignature; + J3Type* _out; + uint32_t _nbIns; + J3Type* _ins[1]; + + public: + J3MethodType(J3Type** args, size_t nbArgs); + + void setLLVMSignature(uint32_t access, J3LLVMSignature* llvmSignature); + J3LLVMSignature* llvmSignature(uint32_t access); + J3Type* out() { return _out; } + uint32_t nbIns() { return _nbIns; } + J3Type* ins(uint32_t idx) { return _ins[idx]; } + + void* operator new(size_t unused, vmkit::BumpAllocator* allocator, size_t n) { + return vmkit::PermanentObject::operator new(sizeof(J3MethodType) + (n - 1) * sizeof(J3Type*), allocator); + } + }; + class J3LLVMSignature : vmkit::PermanentObject { friend class J3CodeGen; 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=198406&r1=198405&r2=198406&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Fri Jan 3 05:30:22 2014 @@ -243,8 +243,8 @@ void J3::vinternalError(const char* msg, vsnprintf(buf, 65536, msg, va); fprintf(stderr, "Internal error: %s\n", buf); printStackTrace(); - exit(1); - //abort(); + //exit(1); + abort(); } void J3::printStackTrace() { 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=198406&r1=198405&r2=198406&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Fri Jan 3 05:30:22 2014 @@ -28,6 +28,7 @@ J3ClassLoader::J3ClassLoader(J3* v, J3Ob types(vmkit::Name::less, allocator), interfaces(j3InterfaceMethodLess, allocator), methods(j3MethodLess, allocator), + methodTypes(vmkit::Name::less, allocator), nativeLibraries(allocator) { _javaClassLoader = javaClassLoader; @@ -35,6 +36,7 @@ J3ClassLoader::J3ClassLoader(J3* v, J3Ob pthread_mutex_init(&_mutexTypes, 0); pthread_mutex_init(&_mutexInterfaces, 0); pthread_mutex_init(&_mutexMethods, 0); + pthread_mutex_init(&_mutexMethodTypes, 0); } uint32_t J3ClassLoader::interfaceIndex(J3Method* method) { @@ -165,6 +167,33 @@ J3Type* J3ClassLoader::getType(J3Class* return res; } + + +J3MethodType* J3ClassLoader::getMethodType(J3Class* from, const vmkit::Name* sign) { + pthread_mutex_lock(&_mutexMethodTypes); + J3MethodType* res = methodTypes[sign]; + + if(!res) { + J3Type* args[1+sign->length()]; + uint32_t nbArgs = 0; + uint32_t cur = 1; + + if(sign->cStr()[0] != J3Cst::ID_Left) + wrongType(from, sign); + + while(sign->cStr()[cur] != J3Cst::ID_Right) { + args[nbArgs++] = getTypeInternal(from, sign, cur, &cur); + } + args[nbArgs++] = getTypeInternal(from, sign, cur+1, &cur); + if(cur != sign->length()) + wrongType(from, sign); + + methodTypes[sign] = res = new(allocator(), nbArgs - 1) J3MethodType(args, nbArgs); + } + pthread_mutex_unlock(&_mutexMethodTypes); + + return res; +} J3Method* J3ClassLoader::method(uint16_t access, J3ObjectType* type, const vmkit::Name* name, const vmkit::Name* sign) { if(type->isArrayClass()) 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=198406&r1=198405&r2=198406&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Fri Jan 3 05:30:22 2014 @@ -104,14 +104,15 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato llvmFunction->dump(); } - if(withCaller && !methodType->llvmSignature()->caller()) - methodType->llvmSignature()->generateCallerIR(this, module, "generic-caller"); + uint32_t access = method->access(); + if(withCaller && !methodType->llvmSignature(access)->caller()) + methodType->llvmSignature(access)->generateCallerIR(this, module, "generic-caller"); loader->compileModule(module); - if(withCaller && !methodType->llvmSignature()->caller()) { + if(withCaller && !methodType->llvmSignature(access)->caller()) { J3LLVMSignature::function_t caller = (J3LLVMSignature::function_t)loader->ee()->getFunctionAddress("generic-caller"); - methodType->llvmSignature()->_caller = caller; + methodType->llvmSignature(access)->_caller = caller; } if(withMethod) { @@ -189,7 +190,7 @@ llvm::Value* J3CodeGen::unflatten(llvm:: llvm::FunctionType* J3CodeGen::llvmFunctionType(J3Method* method) { J3MethodType* type = method->methodType(cl); - J3LLVMSignature* res = type->llvmSignature(); + J3LLVMSignature* res = type->llvmSignature(method->access()); if(!res) { std::vector in; @@ -204,7 +205,7 @@ llvm::FunctionType* J3CodeGen::llvmFunct res = vm->llvmSignatures[funcType]; if(!res) vm->llvmSignatures[funcType] = res = new(vm->allocator()) J3LLVMSignature(funcType); - type->setLLVMSignature(res); + type->setLLVMSignature(method->access(), res); } return res->functionType(); } 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=198406&r1=198405&r2=198406&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Fri Jan 3 05:30:22 2014 @@ -22,13 +22,6 @@ using namespace j3; -J3MethodType::J3MethodType(J3Type** args, size_t nbArgs) { - _out = args[nbArgs-1]; - _nbIns = nbArgs-1; - memcpy(_ins, args, (nbArgs-1)*sizeof(J3Type*)); - -} - J3Method::J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, const vmkit::Name* sign) : _selfCode(this) { _access = access; @@ -120,10 +113,10 @@ J3Value J3Method::internalInvoke(bool st //fprintf(stderr, "Internal invoke %s::%s%s\n", target->cl()->name()->cStr(), target->name()->cStr(), target->sign()->cStr()); - J3LLVMSignature::function_t caller = methodType()->llvmSignature()->caller(); + J3LLVMSignature::function_t caller = methodType()->llvmSignature(access())->caller(); if(!caller) { J3CodeGen::translate(this, 0, 1); - caller = methodType()->llvmSignature()->caller(); + caller = methodType()->llvmSignature(access())->caller(); } J3Value res = caller(fn, inArgs); @@ -226,24 +219,8 @@ J3Value J3Method::invokeVirtual(J3Object } J3MethodType* J3Method::methodType(J3Class* from) { - if(!_methodType) { - J3ClassLoader* loader = cl()->loader(); - J3Type* args[1+sign()->length()]; - uint32_t nbArgs = 0; - uint32_t cur = 1; - - if(sign()->cStr()[0] != J3Cst::ID_Left) - loader->wrongType(from, sign()); - - while(sign()->cStr()[cur] != J3Cst::ID_Right) { - args[nbArgs++] = loader->getTypeInternal(from, sign(), cur, &cur); - } - args[nbArgs++] = loader->getTypeInternal(from, sign(), cur+1, &cur); - if(cur != sign()->length()) - loader->wrongType(from, sign()); - - _methodType = new(loader->allocator(), nbArgs - 1) J3MethodType(args, nbArgs); - } + if(!_methodType) + _methodType = cl()->loader()->getMethodType(from, sign()); return _methodType; } Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=198406&r1=198405&r2=198406&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Fri Jan 3 05:30:22 2014 @@ -9,6 +9,24 @@ using namespace j3; +J3MethodType::J3MethodType(J3Type** args, size_t nbArgs) { + _out = args[nbArgs-1]; + _nbIns = nbArgs-1; + memcpy(_ins, args, (nbArgs-1)*sizeof(J3Type*)); + +} + +void J3MethodType::setLLVMSignature(uint32_t access, J3LLVMSignature* llvmSignature) { + if(J3Cst::isStatic(access)) + _staticLLVMSignature = llvmSignature; + else + _virtualLLVMSignature = llvmSignature; +} + +J3LLVMSignature* J3MethodType::llvmSignature(uint32_t access) { + return J3Cst::isStatic(access) ? _staticLLVMSignature : _virtualLLVMSignature; +} + J3LLVMSignature::J3LLVMSignature(llvm::FunctionType* functionType) { _functionType = functionType; } From gael.thomas at lip6.fr Fri Jan 3 04:04:33 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Fri, 03 Jan 2014 12:04:33 -0000 Subject: [vmkit-commits] [vmkit] r198408 - Move the vmkit::Name* identifying a method signature from a J3Method into a J3Signature. Rename J3MethodType into J3Signature. Message-ID: <20140103120434.7E6792A6C029@llvm.org> Author: gthomas Date: Fri Jan 3 06:04:33 2014 New Revision: 198408 URL: http://llvm.org/viewvc/llvm-project?rev=198408&view=rev Log: Move the vmkit::Name* identifying a method signature from a J3Method into a J3Signature. Rename J3MethodType into J3Signature. 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/j3constants.h vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/include/j3/j3signature.h vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc 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/j3codegenexception.cc vmkit/branches/mcjit/lib/j3/vm/j3jni.cc vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3object.cc vmkit/branches/mcjit/lib/j3/vm/j3signature.cc vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=198408&r1=198407&r2=198408&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Fri Jan 3 06:04:33 2014 @@ -25,6 +25,7 @@ namespace j3 { class J3Primitive; class J3Lib; class J3Method; + class J3Signature; class J3 : public vmkit::VMKit { typedef std::map, @@ -55,6 +56,7 @@ namespace j3 { const vmkit::Name* name; onJavaConstantNames(defJavaConstantName) #undef defJavaConstantName + J3Signature* clinitSign; #define defPrimitive(name, ctype, llvmtype, scale) \ J3Primitive* type##name; @@ -132,7 +134,7 @@ namespace j3 { static void noClassDefFoundError(const vmkit::Name* name) __attribute__((noreturn)); static void classFormatError(J3ObjectType* cl, const char* reason, ...) __attribute__((noreturn)); static void noSuchMethodError(const char* msg, - J3ObjectType* clName, const vmkit::Name* name, const vmkit::Name* sign) __attribute__((noreturn)); + J3ObjectType* clName, const vmkit::Name* name, J3Signature* sign) __attribute__((noreturn)); static void noSuchFieldError(const char* msg, J3ObjectType* clName, const vmkit::Name* name, J3Type* type) __attribute__((noreturn)); static void linkageError(J3Method* method) __attribute__((noreturn)); Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198408&r1=198407&r2=198408&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Fri Jan 3 06:04:33 2014 @@ -31,6 +31,7 @@ namespace j3 { class J3Field; class J3Attributes; class J3Attribute; + class J3Signature; class J3InterfaceSlotDescriptor { public: @@ -124,8 +125,8 @@ namespace j3 { J3InterfaceSlotDescriptor* slotDescriptorAt(uint32_t index) { return &_interfaceSlotDescriptors[index]; } void prepareInterfaceTable(); - virtual J3Method* findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error=1); - virtual J3Method* findStaticMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error=1); + virtual J3Method* findVirtualMethod(const vmkit::Name* name, J3Signature* sign, bool error=1); + virtual J3Method* findStaticMethod(const vmkit::Name* name, J3Signature* sign, bool error=1); bool isObjectType() { return 1; } @@ -163,7 +164,7 @@ namespace j3 { size_t nbPublicMethods() { return _nbPublicMethods; } J3Method** methods() { return _methods; } - J3Method* findMethod(const vmkit::Name* name, const vmkit::Name* sign); + J3Method* findMethod(const vmkit::Name* name, J3Signature* sign); J3Field* findField(const vmkit::Name* name, const J3Type* type); virtual J3ObjectHandle* extractAttribute(J3Attribute* attr) = 0; @@ -255,8 +256,8 @@ namespace j3 { bool isClass() { return 1; } - J3Method* findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error=1); - J3Method* findStaticMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error=1); + J3Method* findVirtualMethod(const vmkit::Name* name, J3Signature* sign, bool error=1); + J3Method* findStaticMethod(const vmkit::Name* name, J3Signature* sign, bool error=1); J3Field* findVirtualField(const vmkit::Name* name, J3Type* type, bool error=1); J3Field* findStaticField(const vmkit::Name* name, J3Type* type, bool error=1); @@ -277,8 +278,8 @@ namespace j3 { J3Type* component() { return _component; } bool isArrayClass() { return 1; } - J3Method* findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error=1); - J3Method* findStaticMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error=1); + J3Method* findVirtualMethod(const vmkit::Name* name, J3Signature* sign, bool error=1); + J3Method* findStaticMethod(const vmkit::Name* name, J3Signature* sign, bool error=1); }; class J3Primitive : public J3Type { Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=198408&r1=198407&r2=198408&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Fri Jan 3 06:04:33 2014 @@ -17,7 +17,7 @@ namespace vmkit { namespace j3 { class J3ZipArchive; class J3ClassBytes; - class J3MethodType; + class J3Signature; class J3Method; class J3Type; class J3; @@ -58,7 +58,7 @@ namespace j3 { MethodRefMap methods; /* all te known method */ pthread_mutex_t _mutexMethodTypes; - vmkit::NameMap::map methodTypes; + vmkit::NameMap::map methodTypes; protected: std::vector > nativeLibraries; @@ -66,10 +66,10 @@ namespace j3 { public: J3ClassLoader(J3* vm, J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator); - J3Type* getTypeInternal(J3Class* from, const vmkit::Name* type, uint32_t start, uint32_t* end); - J3Type* getType(J3Class* from, const vmkit::Name* type); /* find a type */ - J3MethodType* getMethodType(J3Class* from, const vmkit::Name* sign); /* get a method type */ - void wrongType(J3Class* from, const vmkit::Name* type); + J3Type* getTypeInternal(J3ObjectType* from, const vmkit::Name* type, uint32_t start, uint32_t* end); + J3Type* getType(J3ObjectType* from, const vmkit::Name* type); /* find a type */ + J3Signature* getSignature(J3ObjectType* from, const vmkit::Name* sign); /* get a method type */ + void wrongType(J3ObjectType* from, const vmkit::Name* type); uint32_t interfaceIndex(J3Method* sign); @@ -80,7 +80,7 @@ namespace j3 { J3* vm() const { return (J3*)vmkit::CompilationUnit::vm(); }; J3Method* method(uint16_t access, J3ObjectType* cl, - const vmkit::Name* name, const vmkit::Name* sign); + const vmkit::Name* name, J3Signature* sign); J3Class* defineClass(const vmkit::Name* name, J3ClassBytes* bytes); J3Class* findLoadedClass(const vmkit::Name* name); Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=198408&r1=198407&r2=198408&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Fri Jan 3 06:04:33 2014 @@ -22,9 +22,10 @@ namespace j3 { class J3ClassLoader; class J3Field; class J3Method; - class J3MethodType; + class J3Signature; class J3Reader; class J3ObjectType; + class J3Signature; class J3OpInfo { public: @@ -50,7 +51,7 @@ namespace j3 { J3Class* cl; J3ClassLoader* loader; J3Method* method; - J3MethodType* methodType; + J3Signature* signature; J3Reader* codeReader; llvm::BasicBlock* bbCheckCastFailed; Modified: vmkit/branches/mcjit/include/j3/j3constants.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3constants.h?rev=198408&r1=198407&r2=198408&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3constants.h (original) +++ vmkit/branches/mcjit/include/j3/j3constants.h Fri Jan 3 06:04:33 2014 @@ -25,7 +25,7 @@ namespace j3 { #define onJavaConstantNames(_) \ _(clinitName, "") \ - _(clinitSign, "()V") \ + _(clinitSignName, "()V") \ _(initName, "") \ \ _(codeAttribute, "Code") \ Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=198408&r1=198407&r2=198408&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Fri Jan 3 06:04:33 2014 @@ -24,7 +24,7 @@ namespace j3 { class J3Method; class J3Value; class J3ObjectHandle; - class J3MethodType; + class J3Signature; class J3MethodCode : public vmkit::Symbol { public: @@ -41,8 +41,7 @@ namespace j3 { uint16_t _access; J3Class* _cl; const vmkit::Name* _name; - const vmkit::Name* _sign; - J3MethodType* _methodType; + J3Signature* _signature; J3Attributes* _attributes; uint32_t _index; uint32_t _slot; @@ -59,7 +58,7 @@ namespace j3 { J3Value internalInvoke(bool statically, J3Value* args); void buildLLVMNames(J3Class* from); public: - J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, const vmkit::Name* sign); + J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, J3Signature* signature); uint32_t slot() { return _slot; } @@ -91,8 +90,7 @@ namespace j3 { uint16_t access() const { return _access; } J3Class* cl() const { return _cl; } const vmkit::Name* name() const { return _name; } - const vmkit::Name* sign() const { return _sign; } - J3MethodType* methodType(J3Class* from=0); + J3Signature* signature() const { return _signature; } void registerNative(void* ptr); Modified: vmkit/branches/mcjit/include/j3/j3signature.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3signature.h?rev=198408&r1=198407&r2=198408&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3signature.h (original) +++ vmkit/branches/mcjit/include/j3/j3signature.h Fri Jan 3 06:04:33 2014 @@ -3,18 +3,25 @@ #include "vmkit/allocator.h" +namespace vmkit { + class Name; +} + namespace llvm { class FunctionType; class Module; } namespace j3 { + class J3ClassLoader; class J3LLVMSignature; class J3Type; class J3Value; class J3CodeGen; - class J3MethodType : public vmkit::PermanentObject { + class J3Signature : public vmkit::PermanentObject { + J3ClassLoader* _loader; + const vmkit::Name* _name; J3LLVMSignature* _staticLLVMSignature; J3LLVMSignature* _virtualLLVMSignature; J3Type* _out; @@ -22,8 +29,10 @@ namespace j3 { J3Type* _ins[1]; public: - J3MethodType(J3Type** args, size_t nbArgs); + J3Signature(J3ClassLoader* loader, const vmkit::Name* name, J3Type** args, size_t nbArgs); + const vmkit::Name* name() { return _name; } + J3ClassLoader* loader() { return _loader; } void setLLVMSignature(uint32_t access, J3LLVMSignature* llvmSignature); J3LLVMSignature* llvmSignature(uint32_t access); J3Type* out() { return _out; } @@ -31,8 +40,9 @@ namespace j3 { J3Type* ins(uint32_t idx) { return _ins[idx]; } void* operator new(size_t unused, vmkit::BumpAllocator* allocator, size_t n) { - return vmkit::PermanentObject::operator new(sizeof(J3MethodType) + (n - 1) * sizeof(J3Type*), allocator); + return vmkit::PermanentObject::operator new(sizeof(J3Signature) + (n - 1) * sizeof(J3Type*), allocator); } + }; class J3LLVMSignature : vmkit::PermanentObject { Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=198408&r1=198407&r2=198408&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Fri Jan 3 06:04:33 2014 @@ -23,11 +23,14 @@ static const char* rtjar = OPENJDK_HOME" void J3Lib::bootstrap(J3* vm) { J3ObjectHandle* prev = J3Thread::get()->tell(); + +#define z_signature(id) vm->initialClassLoader->getSignature(0, vm->names()->get(id)) + J3Class* threadGroupClass = vm->initialClassLoader->loadClass(vm->names()->get("java/lang/ThreadGroup")); J3Method* sysThreadGroupInit = vm->initialClassLoader->method(0, threadGroupClass, vm->initName, - vm->names()->get("()V")); + z_signature("()V")); J3ObjectHandle* sysThreadGroup = J3ObjectHandle::doNewObject(threadGroupClass); sysThreadGroupInit->invokeSpecial(sysThreadGroup); @@ -35,14 +38,14 @@ void J3Lib::bootstrap(J3* vm) { J3Method* appThreadGroupInit = vm->initialClassLoader->method(0, threadGroupClass, vm->initName, - vm->names()->get("(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); + z_signature("(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); J3ObjectHandle* appThreadGroup = J3ObjectHandle::doNewObject(threadGroupClass); appThreadGroupInit->invokeSpecial(appThreadGroup, sysThreadGroup, vm->utfToString("main")); J3Method* threadInit = vm->initialClassLoader->method(0, vm->threadClass, vm->initName, - vm->names()->get("(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); + z_signature("(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); J3ObjectHandle* mainThread = J3ObjectHandle::doNewObject(vm->threadClass); J3Thread::get()->assocJavaThread(mainThread); @@ -53,7 +56,7 @@ void J3Lib::bootstrap(J3* vm) { vm->initialClassLoader->method(J3Cst::ACC_STATIC, vm->initialClassLoader->loadClass(vm->names()->get("java/lang/System")), vm->names()->get("initializeSystemClass"), - vm->names()->get("()V"))->invokeStatic(); + z_signature("()V"))->invokeStatic(); J3Thread::get()->restore(prev); } 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=198408&r1=198407&r2=198408&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Fri Jan 3 06:04:33 2014 @@ -32,11 +32,6 @@ J3::J3(vmkit::BumpAllocator* allocator) monitorManager(allocator), llvmSignatures(llvmFunctionTypeLess, allocator) { -#define defJavaConstantName(name, id) \ - name = names()->get(id); - onJavaConstantNames(defJavaConstantName) -#undef defJavaConstantName - pthread_mutex_init(&stringsMutex, 0); interfaceTrampoline = J3Trampoline::buildInterfaceTrampoline(allocator); } @@ -82,6 +77,11 @@ void J3::start(int argc, char** argv) { } void J3::run() { +#define defJavaConstantName(name, id) \ + name = names()->get(id); + onJavaConstantNames(defJavaConstantName) +#undef defJavaConstantName + introspect(); vmkit::BumpAllocator* loaderAllocator = vmkit::BumpAllocator::create(); @@ -96,8 +96,10 @@ void J3::run() { onJavaTypes(defPrimitive) #undef defPrimitive + clinitSign = initialClassLoader->getSignature(0, clinitSignName); + #define z_class(clName) initialClassLoader->loadClass(names()->get(clName)) -#define z_method(access, cl, name, sign) initialClassLoader->method(access, cl, name, sign) +#define z_method(access, cl, name, sign) initialClassLoader->method(access, cl, name, initialClassLoader->getSignature(cl, sign)) #define z_field(access, cl, name, type) J3Cst::isStatic(access) \ ? cl->findStaticField(names()->get(name), type) \ : cl->findVirtualField(names()->get(name), type); @@ -205,8 +207,8 @@ void J3::noClassDefFoundError(const vmki internalError("NoClassDefFoundError: %s", name); } -void J3::noSuchMethodError(const char* msg, J3ObjectType* cl, const vmkit::Name* name, const vmkit::Name* sign) { - internalError("%s: %s::%s %s", msg, cl->name()->cStr(), name->cStr(), sign->cStr()); +void J3::noSuchMethodError(const char* msg, J3ObjectType* cl, const vmkit::Name* name, J3Signature* sign) { + internalError("%s: %s::%s %s", msg, cl->name()->cStr(), name->cStr(), sign->name()->cStr()); } void J3::noSuchFieldError(const char* msg, J3ObjectType* cl, const vmkit::Name* name, J3Type* type) { @@ -223,7 +225,10 @@ void J3::classFormatError(J3ObjectType* } void J3::linkageError(J3Method* method) { - internalError("unable to find native method '%s::%s%s'", method->cl()->name()->cStr(), method->name()->cStr(), method->sign()->cStr()); + internalError("unable to find native method '%s::%s%s'", + method->cl()->name()->cStr(), + method->name()->cStr(), + method->signature()->name()->cStr()); } void J3::arrayStoreException() { @@ -255,7 +260,7 @@ void J3::printStackTrace() { if(sf) { J3Method* m = ((J3MethodCode*)sf->unit()->getSymbol(sf->functionName()))->self; - fprintf(stderr, " in %s %s::%s index %d\n", m->sign()->cStr(), m->cl()->name()->cStr(), m->name()->cStr(), + fprintf(stderr, " in %s %s::%s index %d\n", m->signature()->name()->cStr(), m->cl()->name()->cStr(), m->name()->cStr(), sf->sourceIndex()); } else { Dl_info info; 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=198408&r1=198407&r2=198408&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Fri Jan 3 06:04:33 2014 @@ -168,11 +168,11 @@ llvm::Type* J3ObjectType::llvmType() { return loader()->vm()->typeJ3ObjectPtr; } -J3Method* J3ObjectType::findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error) { +J3Method* J3ObjectType::findVirtualMethod(const vmkit::Name* name, J3Signature* sign, bool error) { J3::internalError("should not happe: %s::%s\n", J3ObjectType::name()->cStr(), name->cStr()); } -J3Method* J3ObjectType::findStaticMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error) { +J3Method* J3ObjectType::findStaticMethod(const vmkit::Name* name, J3Signature* sign, bool error) { J3::internalError("should not happen"); } @@ -202,7 +202,7 @@ void J3ObjectType::prepareInterfaceTable //fprintf(stderr, " processing %s method %s %s\n", //J3Cst::isAbstract(base->access()) ? "abstract" : "concrete", //base->sign()->cStr(), base->name()->cStr()); - J3Method* method = findVirtualMethod(base->name(), base->sign(), J3Cst::isAbstract(base->access())); + J3Method* method = findVirtualMethod(base->name(), base->signature(), J3Cst::isAbstract(base->access())); if(!method) method = base; @@ -241,7 +241,7 @@ void J3ObjectType::dumpInterfaceSlotDesc fprintf(stderr, " %s::%s %s\n", slots[i].methods[j]->cl()->name()->cStr(), slots[i].methods[j]->name()->cStr(), - slots[i].methods[j]->sign()->cStr()); + slots[i].methods[j]->signature()->name()->cStr()); } } } @@ -264,13 +264,13 @@ uintptr_t J3Layout::structSize() { return _structSize; } -J3Method* J3Layout::findMethod(const vmkit::Name* name, const vmkit::Name* sign) { +J3Method* J3Layout::findMethod(const vmkit::Name* name, J3Signature* sign) { for(size_t i=0; iname()->cStr(), cur->sign()->cStr()); //printf("%s - %s\n", name->cStr(), sign->cStr()); - if(cur->name() == name && cur->sign() == sign) { + if(cur->name() == name && cur->signature() == sign) { return cur; } } @@ -313,7 +313,7 @@ J3ObjectHandle* J3Class::extractAttribut return J3ObjectHandle::doNewArray(loader()->vm()->typeByte->getArray(), 0); } -J3Method* J3Class::findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error) { +J3Method* J3Class::findVirtualMethod(const vmkit::Name* name, J3Signature* sign, bool error) { //loader()->vm()->log("Lookup: %s %s in %s (%d)", methName->cStr(), methSign->cStr(), name()->cStr(), nbVirtualMethods); resolve(); @@ -335,7 +335,7 @@ J3Method* J3Class::findVirtualMethod(con } } -J3Method* J3Class::findStaticMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error) { +J3Method* J3Class::findStaticMethod(const vmkit::Name* name, J3Signature* sign, bool error) { //loader()->vm()->log("Lookup: %s %s in %s", methName->cStr(), methSign->cStr(), name()->cStr()); resolve(); @@ -390,13 +390,14 @@ J3Field* J3Class::findStaticField(const return res; } -void J3Class::registerNative(const vmkit::Name* methName, const vmkit::Name* methSign, void* fnPtr) { +void J3Class::registerNative(const vmkit::Name* name, const vmkit::Name* signName, void* fnPtr) { resolve(); - J3Method* res = staticLayout()->findMethod(methName, methSign); + J3Signature* sign = loader()->getSignature(this, signName); + J3Method* res = staticLayout()->findMethod(name, sign); if(!res) - res = findMethod(methName, methSign); + res = findMethod(name, sign); if(!res || !J3Cst::isNative(res->access())) - J3::noSuchMethodError("unable to find native method", this, methName, methSign); + J3::noSuchMethodError("unable to find native method", this, name, sign); res->registerNative(fnPtr); } @@ -618,7 +619,7 @@ void J3Class::readClassBytes(J3Field* hi uint16_t access = reader.readU2(); const vmkit::Name* name = nameAt(reader.readU2()); const vmkit::Name* sign = nameAt(reader.readU2()); - J3Method* method = loader()->method(access, this, name, sign); + J3Method* method = loader()->method(access, this, name, loader()->getSignature(this, sign)); J3Attributes* attributes = readAttributes(&reader); method->postInitialise(access, attributes); @@ -746,7 +747,7 @@ J3Method* J3Class::interfaceOrMethodAt(u const vmkit::Name* name = nameAt(ctpValues[ntIdx] >> 16); const vmkit::Name* sign = nameAt(ctpValues[ntIdx] & 0xffff); - res = loader()->method(access, cl, name, sign); + res = loader()->method(access, cl, name, loader()->getSignature(this, sign)); return res; } @@ -877,11 +878,11 @@ J3ObjectHandle* J3ArrayClass::clone(J3Ob return res; } -J3Method* J3ArrayClass::findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error) { +J3Method* J3ArrayClass::findVirtualMethod(const vmkit::Name* name, J3Signature* sign, bool error) { return loader()->vm()->objectClass->findVirtualMethod(name, sign, error); } -J3Method* J3ArrayClass::findStaticMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error) { +J3Method* J3ArrayClass::findStaticMethod(const vmkit::Name* name, J3Signature* sign, bool error) { return loader()->vm()->objectClass->findStaticMethod(name, sign, error); } 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=198408&r1=198407&r2=198408&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Fri Jan 3 06:04:33 2014 @@ -87,11 +87,11 @@ J3Class* J3ClassLoader::loadClass(const J3::internalError("implement me: loadClass from a Java class loader"); } -void J3ClassLoader::wrongType(J3Class* from, const vmkit::Name* type) { +void J3ClassLoader::wrongType(J3ObjectType* from, const vmkit::Name* type) { J3::classFormatError(from, "wrong type: %s", type->cStr()); } -J3Type* J3ClassLoader::getTypeInternal(J3Class* from, const vmkit::Name* typeName, uint32_t start, uint32_t* pend) { +J3Type* J3ClassLoader::getTypeInternal(J3ObjectType* from, const vmkit::Name* typeName, uint32_t start, uint32_t* pend) { J3Type* res = 0; const char* type = typeName->cStr(); uint32_t len = typeName->length(); @@ -146,7 +146,7 @@ J3Type* J3ClassLoader::getTypeInternal(J return res; } -J3Type* J3ClassLoader::getType(J3Class* from, const vmkit::Name* type) { +J3Type* J3ClassLoader::getType(J3ObjectType* from, const vmkit::Name* type) { pthread_mutex_lock(&_mutexTypes); J3Type* res = types[type]; pthread_mutex_unlock(&_mutexTypes); @@ -169,9 +169,9 @@ J3Type* J3ClassLoader::getType(J3Class* } -J3MethodType* J3ClassLoader::getMethodType(J3Class* from, const vmkit::Name* sign) { +J3Signature* J3ClassLoader::getSignature(J3ObjectType* from, const vmkit::Name* sign) { pthread_mutex_lock(&_mutexMethodTypes); - J3MethodType* res = methodTypes[sign]; + J3Signature* res = methodTypes[sign]; if(!res) { J3Type* args[1+sign->length()]; @@ -188,14 +188,14 @@ J3MethodType* J3ClassLoader::getMethodTy if(cur != sign->length()) wrongType(from, sign); - methodTypes[sign] = res = new(allocator(), nbArgs - 1) J3MethodType(args, nbArgs); + methodTypes[sign] = res = new(allocator(), nbArgs - 1) J3Signature(this, sign, args, nbArgs); } pthread_mutex_unlock(&_mutexMethodTypes); return res; } -J3Method* J3ClassLoader::method(uint16_t access, J3ObjectType* type, const vmkit::Name* name, const vmkit::Name* sign) { +J3Method* J3ClassLoader::method(uint16_t access, J3ObjectType* type, const vmkit::Name* name, J3Signature* sign) { if(type->isArrayClass()) return method(access, vm()->objectClass, name, sign); else { @@ -220,14 +220,14 @@ J3Method* J3ClassLoader::method(uint16_t bool J3ClassLoader::J3InterfaceMethodLess::operator()(j3::J3Method const* lhs, j3::J3Method const* rhs) const { return lhs->name() < rhs->name() || (lhs->name() == rhs->name() - && (lhs->sign() < rhs->sign())); + && (lhs->signature() < rhs->signature())); } bool J3ClassLoader::J3MethodLess::operator()(j3::J3Method const* lhs, j3::J3Method const* rhs) const { return lhs->name() < rhs->name() || (lhs->name() == rhs->name() - && (lhs->sign() < rhs->sign() - || (lhs->sign() == rhs->sign() + && (lhs->signature() < rhs->signature() + || (lhs->signature() == rhs->signature() && (lhs->cl() < rhs->cl() || (lhs->cl() == rhs->cl() && ((lhs->access() & J3Cst::ACC_STATIC) < (rhs->access() & J3Cst::ACC_STATIC))))))); 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=198408&r1=198407&r2=198408&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Fri Jan 3 06:04:33 2014 @@ -35,7 +35,7 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato method = m; cl = method->cl()->asClass(); - methodType = method->methodType(); + signature = method->signature(); loader = cl->loader(); vm = loader->vm(); @@ -45,7 +45,10 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato #endif if(vm->options()->debugTranslate) - fprintf(stderr, " translating bytecode of: %s::%s%s\n", method->cl()->name()->cStr(), method->name()->cStr(), method->sign()->cStr()); + fprintf(stderr, " translating bytecode of: %s::%s%s\n", + method->cl()->name()->cStr(), + method->name()->cStr(), + method->signature()->name()->cStr()); module = new llvm::Module(method->llvmFunctionName(), vm->llvmContext()); llvmFunction = buildFunction(method, 0); @@ -105,14 +108,14 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato } uint32_t access = method->access(); - if(withCaller && !methodType->llvmSignature(access)->caller()) - methodType->llvmSignature(access)->generateCallerIR(this, module, "generic-caller"); + if(withCaller && !signature->llvmSignature(access)->caller()) + signature->llvmSignature(access)->generateCallerIR(this, module, "generic-caller"); loader->compileModule(module); - if(withCaller && !methodType->llvmSignature(access)->caller()) { + if(withCaller && !signature->llvmSignature(access)->caller()) { J3LLVMSignature::function_t caller = (J3LLVMSignature::function_t)loader->ee()->getFunctionAddress("generic-caller"); - methodType->llvmSignature(access)->_caller = caller; + signature->llvmSignature(access)->_caller = caller; } if(withMethod) { @@ -189,7 +192,7 @@ llvm::Value* J3CodeGen::unflatten(llvm:: } llvm::FunctionType* J3CodeGen::llvmFunctionType(J3Method* method) { - J3MethodType* type = method->methodType(cl); + J3Signature* type = method->signature(); J3LLVMSignature* res = type->llvmSignature(method->access()); if(!res) { @@ -389,7 +392,7 @@ llvm::Value* J3CodeGen::nullCheck(llvm:: #define nyi() J3::internalError("not yet implemented: '%s' (%d)", J3Cst::opcodeNames[bc], bc); void J3CodeGen::invoke(uint32_t access, J3Method* target, llvm::Value* func) { - J3MethodType* type = target->methodType(cl); + J3Signature* type = target->signature(); std::vector args; uint32_t d = 0; @@ -421,7 +424,7 @@ void J3CodeGen::invoke(uint32_t access, void J3CodeGen::invokeInterface(uint32_t idx) { J3Method* target = cl->interfaceMethodAt(idx, 0); - J3MethodType* type = target->methodType(cl); + J3Signature* type = target->signature(); uint32_t index = target->interfaceIndex(); llvm::Value* thread = currentThread(); @@ -440,7 +443,7 @@ void J3CodeGen::invokeInterface(uint32_t void J3CodeGen::invokeVirtual(uint32_t idx) { J3Method* target = cl->methodAt(idx, 0); - J3MethodType* type = target->methodType(cl); + J3Signature* type = target->signature(); llvm::Value* funcEntry; if(target->isResolved()) @@ -455,7 +458,10 @@ void J3CodeGen::invokeVirtual(uint32_t i llvm::Value* func = builder->CreateBitCast(builder->CreateLoad(builder->CreateGEP(vt(obj), gepFunc)), llvmFunctionType(target)->getPointerTo()); - char buf[65536]; snprintf(buf, 65536, "%s::%s%s", target->cl()->name()->cStr(), target->name()->cStr(), target->sign()->cStr()); + char buf[65536]; snprintf(buf, 65536, "%s::%s%s", + target->cl()->name()->cStr(), + target->name()->cStr(), + target->signature()->name()->cStr()); builder->CreateCall5(funcEchoDebugExecute, builder->getInt32(2), buildString("Invoking %s %p::%d\n"), @@ -1549,7 +1555,7 @@ void J3CodeGen::generateJava() { J3Attribute* attr = method->attributes()->lookup(vm->codeAttribute); if(!attr) - J3::classFormatError(cl, "No Code attribute in %s %s", method->name()->cStr(), method->sign()->cStr()); + J3::classFormatError(cl, "No Code attribute in %s %s", method->name()->cStr(), method->signature()->name()->cStr()); J3Reader reader(cl->bytes()); reader.seek(attr->offset(), reader.SeekSet); @@ -1557,7 +1563,10 @@ void J3CodeGen::generateJava() { uint32_t length = reader.readU4(); if(!reader.adjustSize(length)) - J3::classFormatError(cl, "Code attribute of %s %s is too large (%d)", method->name()->cStr(), method->sign()->cStr(), length); + J3::classFormatError(cl, "Code attribute of %s %s is too large (%d)", + method->name()->cStr(), + method->signature()->name()->cStr(), + length); llvm::DIBuilder* dbgBuilder = new llvm::DIBuilder(*module); @@ -1619,7 +1628,7 @@ void J3CodeGen::generateJava() { if(!pos && !J3Cst::isStatic(method->access())) type = method->cl(); else - type = methodType->ins(n++); + type = signature->ins(n++); locals.setAt(flatten(cur, type), pos); @@ -1652,11 +1661,11 @@ void J3CodeGen::generateJava() { buildString("%s\n"), buildString(buf)); } - if(methodType->out() == vm->typeVoid) { + if(signature->out() == vm->typeVoid) { builder->CreateRetVoid(); } else { - ret.metaStack[0] = methodType->out()->llvmType(); - builder->CreateRet(unflatten(ret.at(0), methodType->out())); + ret.metaStack[0] = signature->out()->llvmType(); + builder->CreateRet(unflatten(ret.at(0), signature->out())); } if(J3Cst::isSynchronized(method->access())) { @@ -1718,10 +1727,10 @@ llvm::Function* J3CodeGen::lookupNative( else nativeIns.push_back(vm->typeJ3ObjectHandlePtr); - for(int i=0; inbIns(); i++) - nativeIns.push_back(doNativeType(methodType->ins(i))); + for(int i=0; inbIns(); i++) + nativeIns.push_back(doNativeType(signature->ins(i))); - nativeOut = doNativeType(methodType->out()); + nativeOut = doNativeType(signature->out()); char* buf = (char*)loader->allocator()->allocate(mangler.length()+1); memcpy(buf, mangler.cStr(), mangler.length()+1); @@ -1766,8 +1775,8 @@ void J3CodeGen::generateNative() { selfDone = 1; a = builder->CreateCall2(funcJ3ThreadPush, thread, flatten(cur, method->cl())); } else { - if(methodType->ins(i)->llvmType()->isPointerTy()) - a = builder->CreateCall2(funcJ3ThreadPush, thread, flatten(cur, methodType->ins(i))); + if(signature->ins(i)->llvmType()->isPointerTy()) + a = builder->CreateCall2(funcJ3ThreadPush, thread, flatten(cur, signature->ins(i))); else a = cur; i++; @@ -1777,22 +1786,22 @@ void J3CodeGen::generateNative() { res = builder->CreateCall(nat, args); - if(methodType->out() == vm->typeVoid) { + if(signature->out() == vm->typeVoid) { builder->CreateCall2(funcJ3ThreadRestore, thread, frame); builder->CreateRetVoid(); } else { builder->CreateCall2(funcJ3ThreadRestore, thread, frame); - if(methodType->out()->llvmType()->isPointerTy()) { + if(signature->out()->llvmType()->isPointerTy()) { llvm::BasicBlock* ifnull = newBB("ifnull"); llvm::BasicBlock* ifnotnull = newBB("ifnotnull"); builder->CreateCondBr(builder->CreateIsNull(res), ifnull, ifnotnull); builder->SetInsertPoint(bb = ifnull); - builder->CreateRet(unflatten(nullValue, methodType->out())); + builder->CreateRet(unflatten(nullValue, signature->out())); builder->SetInsertPoint(bb = ifnotnull); - res = unflatten(handleToObject(res), methodType->out()); + res = unflatten(handleToObject(res), signature->out()); } builder->CreateRet(res); } Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc?rev=198408&r1=198407&r2=198408&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc Fri Jan 3 06:04:33 2014 @@ -122,7 +122,7 @@ void J3ExceptionTable::dump(bool verbose fprintf(stderr, " ExceptionTable of %s::%s%s:\n", codeGen->method->cl()->name()->cStr(), codeGen->method->name()->cStr(), - codeGen->method->sign()->cStr()); + codeGen->method->signature()->name()->cStr()); if(verbose) { for(uint32_t i=0; iinitialise(); vmkit::Names* n = cl->loader()->vm()->names(); - res = cl->findVirtualMethod(n->get(name), n->get(sig)); + res = cl->findVirtualMethod(n->get(name), cl->loader()->getSignature(cl, n->get(sig))); leaveJVM(); return res; @@ -127,7 +127,7 @@ jmethodID JNICALL GetStaticMethodID(JNIE J3ObjectType* cl = J3ObjectType::nativeClass(clazz); cl->initialise(); vmkit::Names* n = cl->loader()->vm()->names(); - res = cl->findStaticMethod(n->get(name), n->get(sig)); + res = cl->findStaticMethod(n->get(name), cl->loader()->getSignature(cl, n->get(sig))); leaveJVM(); Modified: vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc?rev=198408&r1=198407&r2=198408&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc Fri Jan 3 06:04:33 2014 @@ -23,7 +23,7 @@ void J3Mangler::check(uint32_t n) { } J3Mangler* J3Mangler::mangleType(J3Method* method) { - J3MethodType* type = method->methodType(from); + J3Signature* type = method->signature(); if(type->nbIns()) { check(2); 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=198408&r1=198407&r2=198408&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Fri Jan 3 06:04:33 2014 @@ -22,12 +22,12 @@ using namespace j3; -J3Method::J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, const vmkit::Name* sign) : +J3Method::J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, J3Signature* signature) : _selfCode(this) { _access = access; _cl = cl; _name = name; - _sign = sign; + _signature = signature; _index = -1; } @@ -46,14 +46,14 @@ void J3Method::markCompiled(llvm::Functi void* J3Method::fnPtr(bool withCaller) { if(!isCompiled()) { - //fprintf(stderr, "materializing: %s::%s%s\n", this, cl()->name()->cStr(), name()->cStr(), sign()->cStr()); + //fprintf(stderr, "materializing: %s::%s%s\n", this, cl()->name()->cStr(), name()->cStr(), signature()->cStr()); if(!isResolved()) { if(cl()->loader()->vm()->options()->debugLinking) fprintf(stderr, "linking %s::%s\n", cl()->name()->cStr(), name()->cStr()); cl()->initialise(); if(!isResolved()) - J3::noSuchMethodError("unable to find method", cl(), name(), sign()); + J3::noSuchMethodError("unable to find method", cl(), name(), signature()); } J3CodeGen::translate(this, 1, withCaller); @@ -103,7 +103,7 @@ J3Method* J3Method::resolve(J3ObjectHand if(cl()->loader()->vm()->options()->debugLinking) fprintf(stderr, "virtual linking %s::%s\n", cl()->name()->cStr(), name()->cStr()); vmkit::Names* n = cl()->loader()->vm()->names(); - return obj->vt()->type()->asObjectType()->findVirtualMethod(name(), sign()); + return obj->vt()->type()->asObjectType()->findVirtualMethod(name(), signature()); } J3Value J3Method::internalInvoke(bool statically, J3Value* inArgs) { @@ -111,12 +111,12 @@ J3Value J3Method::internalInvoke(bool st void* fn = fnPtr(1); - //fprintf(stderr, "Internal invoke %s::%s%s\n", target->cl()->name()->cStr(), target->name()->cStr(), target->sign()->cStr()); + //fprintf(stderr, "Internal invoke %s::%s%s\n", target->cl()->name()->cStr(), target->name()->cStr(), target->signature()->cStr()); - J3LLVMSignature::function_t caller = methodType()->llvmSignature(access())->caller(); + J3LLVMSignature::function_t caller = signature()->llvmSignature(access())->caller(); if(!caller) { J3CodeGen::translate(this, 0, 1); - caller = methodType()->llvmSignature(access())->caller(); + caller = signature()->llvmSignature(access())->caller(); } J3Value res = caller(fn, inArgs); @@ -127,16 +127,16 @@ J3Value J3Method::internalInvoke(bool st J3Value J3Method::internalInvoke(bool statically, J3ObjectHandle* handle, J3Value* inArgs) { J3Value* reIn; if(handle) { - reIn = (J3Value*)alloca((methodType()->nbIns()+1)*sizeof(J3Value)); + reIn = (J3Value*)alloca((signature()->nbIns()+1)*sizeof(J3Value)); reIn[0].valObject = handle; - memcpy(reIn+1, inArgs, methodType()->nbIns()*sizeof(J3Value)); + memcpy(reIn+1, inArgs, signature()->nbIns()*sizeof(J3Value)); } else reIn = inArgs; return internalInvoke(statically, reIn); } J3Value J3Method::internalInvoke(bool statically, J3ObjectHandle* handle, va_list va) { - J3Value* args = (J3Value*)alloca(sizeof(J3Value)*(methodType()->nbIns() + 1)); + J3Value* args = (J3Value*)alloca(sizeof(J3Value)*(signature()->nbIns() + 1)); J3* vm = cl()->loader()->vm(); J3Type* cur; uint32_t d = 0; @@ -144,8 +144,8 @@ J3Value J3Method::internalInvoke(bool st if(handle) args[d++].valObject = handle; - for(uint32_t i=0; inbIns(); i++) { - cur = methodType()->ins(i); + for(uint32_t i=0; inbIns(); i++) { + cur = signature()->ins(i); if(cur == vm->typeBoolean) args[i+d].valBoolean = va_arg(va, bool); @@ -218,13 +218,6 @@ J3Value J3Method::invokeVirtual(J3Object return res; } -J3MethodType* J3Method::methodType(J3Class* from) { - if(!_methodType) - _methodType = cl()->loader()->getMethodType(from, sign()); - - return _methodType; -} - void J3Method::buildLLVMNames(J3Class* from) { const char* prefix = "stub_"; uint32_t plen = 5; @@ -262,12 +255,12 @@ char* J3Method::llvmStubName(J3Class* fr } void J3Method::dump() { - printf("Method: %s %s::%s\n", sign()->cStr(), cl()->name()->cStr(), name()->cStr()); + printf("Method: %s %s::%s\n", signature()->name()->cStr(), cl()->name()->cStr(), name()->cStr()); } void J3Method::registerNative(void* fnPtr) { if(_nativeFnPtr) - J3::noSuchMethodError("unable to dynamically modify a native function", cl(), name(), sign()); + J3::noSuchMethodError("unable to dynamically modify a native function", cl(), name(), signature()); _nativeFnPtr = fnPtr; } @@ -278,12 +271,12 @@ J3ObjectHandle* J3Method::javaMethod() { J3ObjectHandle* prev = J3Thread::get()->tell(); J3* vm = cl()->loader()->vm(); - uint32_t nbIns = methodType()->nbIns(); + uint32_t nbIns = signature()->nbIns(); J3ObjectHandle* parameters = J3ObjectHandle::doNewArray(vm->classClass->getArray(), nbIns); for(uint32_t i=0; isetObjectAt(i, methodType()->ins(i)->javaClass()); + parameters->setObjectAt(i, signature()->ins(i)->javaClass()); J3Attribute* exceptionAttribute = attributes()->lookup(vm->exceptionsAttribute); J3ObjectHandle* exceptions; @@ -305,7 +298,7 @@ J3ObjectHandle* J3Method::javaMethod() { exceptions, access(), slot(), - vm->nameToString(sign()), + vm->nameToString(signature()->name()), annotations, paramAnnotations); } else 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=198408&r1=198407&r2=198408&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Fri Jan 3 06:04:33 2014 @@ -52,7 +52,7 @@ J3VirtualTable* J3VirtualTable::create(J for(uint32_t i=0; inbMethods(); i++) { J3Method* meth = cl->methods()[i]; - J3Method* parent = cl == super ? 0 : super->findVirtualMethod(meth->name(), meth->sign(), 0); + J3Method* parent = cl == super ? 0 : super->findVirtualMethod(meth->name(), meth->signature(), 0); if(parent) { pm[i] = parent; Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=198408&r1=198407&r2=198408&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Fri Jan 3 06:04:33 2014 @@ -9,21 +9,23 @@ using namespace j3; -J3MethodType::J3MethodType(J3Type** args, size_t nbArgs) { +J3Signature::J3Signature(J3ClassLoader* loader, const vmkit::Name* name, J3Type** args, size_t nbArgs) { + _loader = loader; + _name = name; _out = args[nbArgs-1]; _nbIns = nbArgs-1; memcpy(_ins, args, (nbArgs-1)*sizeof(J3Type*)); } -void J3MethodType::setLLVMSignature(uint32_t access, J3LLVMSignature* llvmSignature) { +void J3Signature::setLLVMSignature(uint32_t access, J3LLVMSignature* llvmSignature) { if(J3Cst::isStatic(access)) _staticLLVMSignature = llvmSignature; else _virtualLLVMSignature = llvmSignature; } -J3LLVMSignature* J3MethodType::llvmSignature(uint32_t access) { +J3LLVMSignature* J3Signature::llvmSignature(uint32_t access) { return J3Cst::isStatic(access) ? _staticLLVMSignature : _virtualLLVMSignature; } Modified: vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc?rev=198408&r1=198407&r2=198408&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Fri Jan 3 06:04:33 2014 @@ -34,7 +34,7 @@ void* J3Trampoline::virtualTrampoline(J3 J3ObjectHandle* prev = J3Thread::get()->tell(); J3ObjectHandle* handle = J3Thread::get()->push(obj); J3ObjectType* cl = handle->vt()->type()->asObjectType(); - J3Method* impl = cl == target->cl() ? target : cl->findVirtualMethod(target->name(), target->sign()); + J3Method* impl = cl == target->cl() ? target : cl->findVirtualMethod(target->name(), target->signature()); void* res = impl->fnPtr(0); handle->vt()->virtualMethods()[impl->index()] = res; From gael.thomas at lip6.fr Fri Jan 3 04:16:33 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Fri, 03 Jan 2014 12:16:33 -0000 Subject: [vmkit-commits] [vmkit] r198409 - Unify the coding style: only use signature everywhere. Message-ID: <20140103121633.8A1452A6C029@llvm.org> Author: gthomas Date: Fri Jan 3 06:16:33 2014 New Revision: 198409 URL: http://llvm.org/viewvc/llvm-project?rev=198409&view=rev Log: Unify the coding style: only use signature everywhere. 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/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 Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=198409&r1=198408&r2=198409&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Fri Jan 3 06:16:33 2014 @@ -134,7 +134,7 @@ namespace j3 { static void noClassDefFoundError(const vmkit::Name* name) __attribute__((noreturn)); static void classFormatError(J3ObjectType* cl, const char* reason, ...) __attribute__((noreturn)); static void noSuchMethodError(const char* msg, - J3ObjectType* clName, const vmkit::Name* name, J3Signature* sign) __attribute__((noreturn)); + J3ObjectType* clName, const vmkit::Name* name, J3Signature* signature) __attribute__((noreturn)); static void noSuchFieldError(const char* msg, J3ObjectType* clName, const vmkit::Name* name, J3Type* type) __attribute__((noreturn)); static void linkageError(J3Method* method) __attribute__((noreturn)); Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198409&r1=198408&r2=198409&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Fri Jan 3 06:16:33 2014 @@ -125,8 +125,8 @@ namespace j3 { J3InterfaceSlotDescriptor* slotDescriptorAt(uint32_t index) { return &_interfaceSlotDescriptors[index]; } void prepareInterfaceTable(); - virtual J3Method* findVirtualMethod(const vmkit::Name* name, J3Signature* sign, bool error=1); - virtual J3Method* findStaticMethod(const vmkit::Name* name, J3Signature* sign, bool error=1); + virtual J3Method* findVirtualMethod(const vmkit::Name* name, J3Signature* signature, bool error=1); + virtual J3Method* findStaticMethod(const vmkit::Name* name, J3Signature* signature, bool error=1); bool isObjectType() { return 1; } @@ -164,7 +164,7 @@ namespace j3 { size_t nbPublicMethods() { return _nbPublicMethods; } J3Method** methods() { return _methods; } - J3Method* findMethod(const vmkit::Name* name, J3Signature* sign); + J3Method* findMethod(const vmkit::Name* name, J3Signature* signature); J3Field* findField(const vmkit::Name* name, const J3Type* type); virtual J3ObjectHandle* extractAttribute(J3Attribute* attr) = 0; @@ -256,8 +256,8 @@ namespace j3 { bool isClass() { return 1; } - J3Method* findVirtualMethod(const vmkit::Name* name, J3Signature* sign, bool error=1); - J3Method* findStaticMethod(const vmkit::Name* name, J3Signature* sign, bool error=1); + J3Method* findVirtualMethod(const vmkit::Name* name, J3Signature* signature, bool error=1); + J3Method* findStaticMethod(const vmkit::Name* name, J3Signature* signature, bool error=1); J3Field* findVirtualField(const vmkit::Name* name, J3Type* type, bool error=1); J3Field* findStaticField(const vmkit::Name* name, J3Type* type, bool error=1); @@ -278,8 +278,8 @@ namespace j3 { J3Type* component() { return _component; } bool isArrayClass() { return 1; } - J3Method* findVirtualMethod(const vmkit::Name* name, J3Signature* sign, bool error=1); - J3Method* findStaticMethod(const vmkit::Name* name, J3Signature* sign, bool error=1); + J3Method* findVirtualMethod(const vmkit::Name* name, J3Signature* signature, bool error=1); + J3Method* findStaticMethod(const vmkit::Name* name, J3Signature* signature, bool error=1); }; class J3Primitive : public J3Type { Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=198409&r1=198408&r2=198409&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Fri Jan 3 06:16:33 2014 @@ -68,10 +68,10 @@ namespace j3 { J3Type* getTypeInternal(J3ObjectType* from, const vmkit::Name* type, uint32_t start, uint32_t* end); J3Type* getType(J3ObjectType* from, const vmkit::Name* type); /* find a type */ - J3Signature* getSignature(J3ObjectType* from, const vmkit::Name* sign); /* get a method type */ + J3Signature* getSignature(J3ObjectType* from, const vmkit::Name* signature); /* get a method type */ void wrongType(J3ObjectType* from, const vmkit::Name* type); - uint32_t interfaceIndex(J3Method* sign); + uint32_t interfaceIndex(J3Method* signature); J3GlobalReferences* globalReferences() { return &_globalReferences; } @@ -80,7 +80,7 @@ namespace j3 { J3* vm() const { return (J3*)vmkit::CompilationUnit::vm(); }; J3Method* method(uint16_t access, J3ObjectType* cl, - const vmkit::Name* name, J3Signature* sign); + const vmkit::Name* name, J3Signature* signature); J3Class* defineClass(const vmkit::Name* name, J3ClassBytes* bytes); J3Class* findLoadedClass(const vmkit::Name* name); 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=198409&r1=198408&r2=198409&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Fri Jan 3 06:16:33 2014 @@ -99,7 +99,7 @@ void J3::run() { clinitSign = initialClassLoader->getSignature(0, clinitSignName); #define z_class(clName) initialClassLoader->loadClass(names()->get(clName)) -#define z_method(access, cl, name, sign) initialClassLoader->method(access, cl, name, initialClassLoader->getSignature(cl, sign)) +#define z_method(access, cl, name, signature) initialClassLoader->method(access, cl, name, initialClassLoader->getSignature(cl, signature)) #define z_field(access, cl, name, type) J3Cst::isStatic(access) \ ? cl->findStaticField(names()->get(name), type) \ : cl->findVirtualField(names()->get(name), type); @@ -207,8 +207,8 @@ void J3::noClassDefFoundError(const vmki internalError("NoClassDefFoundError: %s", name); } -void J3::noSuchMethodError(const char* msg, J3ObjectType* cl, const vmkit::Name* name, J3Signature* sign) { - internalError("%s: %s::%s %s", msg, cl->name()->cStr(), name->cStr(), sign->name()->cStr()); +void J3::noSuchMethodError(const char* msg, J3ObjectType* cl, const vmkit::Name* name, J3Signature* signature) { + internalError("%s: %s::%s %s", msg, cl->name()->cStr(), name->cStr(), signature->name()->cStr()); } void J3::noSuchFieldError(const char* msg, J3ObjectType* cl, const vmkit::Name* name, J3Type* type) { 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=198409&r1=198408&r2=198409&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Fri Jan 3 06:16:33 2014 @@ -168,11 +168,11 @@ llvm::Type* J3ObjectType::llvmType() { return loader()->vm()->typeJ3ObjectPtr; } -J3Method* J3ObjectType::findVirtualMethod(const vmkit::Name* name, J3Signature* sign, bool error) { +J3Method* J3ObjectType::findVirtualMethod(const vmkit::Name* name, J3Signature* signature, bool error) { J3::internalError("should not happe: %s::%s\n", J3ObjectType::name()->cStr(), name->cStr()); } -J3Method* J3ObjectType::findStaticMethod(const vmkit::Name* name, J3Signature* sign, bool error) { +J3Method* J3ObjectType::findStaticMethod(const vmkit::Name* name, J3Signature* signature, bool error) { J3::internalError("should not happen"); } @@ -201,7 +201,7 @@ void J3ObjectType::prepareInterfaceTable J3Method* base = ifce->methods()[j]; //fprintf(stderr, " processing %s method %s %s\n", //J3Cst::isAbstract(base->access()) ? "abstract" : "concrete", - //base->sign()->cStr(), base->name()->cStr()); + //base->signature()->cStr(), base->name()->cStr()); J3Method* method = findVirtualMethod(base->name(), base->signature(), J3Cst::isAbstract(base->access())); if(!method) @@ -264,13 +264,13 @@ uintptr_t J3Layout::structSize() { return _structSize; } -J3Method* J3Layout::findMethod(const vmkit::Name* name, J3Signature* sign) { +J3Method* J3Layout::findMethod(const vmkit::Name* name, J3Signature* signature) { for(size_t i=0; iname()->cStr(), cur->sign()->cStr()); - //printf("%s - %s\n", name->cStr(), sign->cStr()); - if(cur->name() == name && cur->signature() == sign) { + //printf("%s - %s\n", cur->name()->cStr(), cur->signature()->cStr()); + //printf("%s - %s\n", name->cStr(), signature->cStr()); + if(cur->name() == name && cur->signature() == signature) { return cur; } } @@ -313,21 +313,21 @@ J3ObjectHandle* J3Class::extractAttribut return J3ObjectHandle::doNewArray(loader()->vm()->typeByte->getArray(), 0); } -J3Method* J3Class::findVirtualMethod(const vmkit::Name* name, J3Signature* sign, bool error) { +J3Method* J3Class::findVirtualMethod(const vmkit::Name* name, J3Signature* signature, bool error) { //loader()->vm()->log("Lookup: %s %s in %s (%d)", methName->cStr(), methSign->cStr(), name()->cStr(), nbVirtualMethods); resolve(); J3Class* cur = this; while(1) { - J3Method* res = cur->findMethod(name, sign); + J3Method* res = cur->findMethod(name, signature); if(res) return res; if(cur == cur->super()) { if(error) - J3::noSuchMethodError("no such method", this, name, sign); + J3::noSuchMethodError("no such method", this, name, signature); else return 0; } @@ -335,21 +335,21 @@ J3Method* J3Class::findVirtualMethod(con } } -J3Method* J3Class::findStaticMethod(const vmkit::Name* name, J3Signature* sign, bool error) { +J3Method* J3Class::findStaticMethod(const vmkit::Name* name, J3Signature* signature, bool error) { //loader()->vm()->log("Lookup: %s %s in %s", methName->cStr(), methSign->cStr(), name()->cStr()); resolve(); J3Class* cur = this; while(1) { - J3Method* res = cur->staticLayout()->findMethod(name, sign); + J3Method* res = cur->staticLayout()->findMethod(name, signature); if(res) return res; if(cur == cur->super()) { if(error) - J3::noSuchMethodError("no such method", this, name, sign); + J3::noSuchMethodError("no such method", this, name, signature); else return 0; } @@ -390,14 +390,14 @@ J3Field* J3Class::findStaticField(const return res; } -void J3Class::registerNative(const vmkit::Name* name, const vmkit::Name* signName, void* fnPtr) { +void J3Class::registerNative(const vmkit::Name* name, const vmkit::Name* signatureName, void* fnPtr) { resolve(); - J3Signature* sign = loader()->getSignature(this, signName); - J3Method* res = staticLayout()->findMethod(name, sign); + J3Signature* signature = loader()->getSignature(this, signatureName); + J3Method* res = staticLayout()->findMethod(name, signature); if(!res) - res = findMethod(name, sign); + res = findMethod(name, signature); if(!res || !J3Cst::isNative(res->access())) - J3::noSuchMethodError("unable to find native method", this, name, sign); + J3::noSuchMethodError("unable to find native method", this, name, signature); res->registerNative(fnPtr); } @@ -618,8 +618,8 @@ void J3Class::readClassBytes(J3Field* hi for(size_t i=0; imethod(access, this, name, loader()->getSignature(this, sign)); + const vmkit::Name* signature = nameAt(reader.readU2()); + J3Method* method = loader()->method(access, this, name, loader()->getSignature(this, signature)); J3Attributes* attributes = readAttributes(&reader); method->postInitialise(access, attributes); @@ -745,9 +745,9 @@ J3Method* J3Class::interfaceOrMethodAt(u check(ntIdx, J3Cst::CONSTANT_NameAndType); const vmkit::Name* name = nameAt(ctpValues[ntIdx] >> 16); - const vmkit::Name* sign = nameAt(ctpValues[ntIdx] & 0xffff); + const vmkit::Name* signature = nameAt(ctpValues[ntIdx] & 0xffff); - res = loader()->method(access, cl, name, loader()->getSignature(this, sign)); + res = loader()->method(access, cl, name, loader()->getSignature(this, signature)); return res; } @@ -878,12 +878,12 @@ J3ObjectHandle* J3ArrayClass::clone(J3Ob return res; } -J3Method* J3ArrayClass::findVirtualMethod(const vmkit::Name* name, J3Signature* sign, bool error) { - return loader()->vm()->objectClass->findVirtualMethod(name, sign, error); +J3Method* J3ArrayClass::findVirtualMethod(const vmkit::Name* name, J3Signature* signature, bool error) { + return loader()->vm()->objectClass->findVirtualMethod(name, signature, error); } -J3Method* J3ArrayClass::findStaticMethod(const vmkit::Name* name, J3Signature* sign, bool error) { - return loader()->vm()->objectClass->findStaticMethod(name, sign, error); +J3Method* J3ArrayClass::findStaticMethod(const vmkit::Name* name, J3Signature* signature, bool error) { + return loader()->vm()->objectClass->findStaticMethod(name, signature, error); } void J3ArrayClass::doResolve(J3Field* hiddenFields, size_t nbHiddenFields) { 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=198409&r1=198408&r2=198409&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Fri Jan 3 06:16:33 2014 @@ -169,44 +169,44 @@ J3Type* J3ClassLoader::getType(J3ObjectT } -J3Signature* J3ClassLoader::getSignature(J3ObjectType* from, const vmkit::Name* sign) { +J3Signature* J3ClassLoader::getSignature(J3ObjectType* from, const vmkit::Name* signature) { pthread_mutex_lock(&_mutexMethodTypes); - J3Signature* res = methodTypes[sign]; + J3Signature* res = methodTypes[signature]; if(!res) { - J3Type* args[1+sign->length()]; + J3Type* args[1+signature->length()]; uint32_t nbArgs = 0; uint32_t cur = 1; - if(sign->cStr()[0] != J3Cst::ID_Left) - wrongType(from, sign); + if(signature->cStr()[0] != J3Cst::ID_Left) + wrongType(from, signature); - while(sign->cStr()[cur] != J3Cst::ID_Right) { - args[nbArgs++] = getTypeInternal(from, sign, cur, &cur); + while(signature->cStr()[cur] != J3Cst::ID_Right) { + args[nbArgs++] = getTypeInternal(from, signature, cur, &cur); } - args[nbArgs++] = getTypeInternal(from, sign, cur+1, &cur); - if(cur != sign->length()) - wrongType(from, sign); + args[nbArgs++] = getTypeInternal(from, signature, cur+1, &cur); + if(cur != signature->length()) + wrongType(from, signature); - methodTypes[sign] = res = new(allocator(), nbArgs - 1) J3Signature(this, sign, args, nbArgs); + methodTypes[signature] = res = new(allocator(), nbArgs - 1) J3Signature(this, signature, args, nbArgs); } pthread_mutex_unlock(&_mutexMethodTypes); return res; } -J3Method* J3ClassLoader::method(uint16_t access, J3ObjectType* type, const vmkit::Name* name, J3Signature* sign) { +J3Method* J3ClassLoader::method(uint16_t access, J3ObjectType* type, const vmkit::Name* name, J3Signature* signature) { if(type->isArrayClass()) - return method(access, vm()->objectClass, name, sign); + return method(access, vm()->objectClass, name, signature); else { J3Class* cl = type->asClass(); - J3Method method(access, cl, name, sign), *res; + J3Method method(access, cl, name, signature), *res; pthread_mutex_lock(&_mutexMethods); std::map::iterator it = methods.find(&method); if(it == methods.end()) { - res = new(allocator()) J3Method(access, cl, name, sign); + res = new(allocator()) J3Method(access, cl, name, signature); methods[res] = res; } else { res = it->second; 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=198409&r1=198408&r2=198409&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Fri Jan 3 06:16:33 2014 @@ -1534,7 +1534,7 @@ void J3CodeGen::translate() { #if 0 void J3CodeGen::explore() { - printf(" exploring bytecode of: %s::%s%s\n", method->cl()->name()->cStr(), method->name()->cStr(), method->sign()->cStr()); + printf(" exploring bytecode of: %s::%s%s\n", method->cl()->name()->cStr(), method->name()->cStr(), method->signature()->cStr()); while(codeReader->remaining()) { uint8_t bc = codeReader->readU1(); From gael.thomas at lip6.fr Fri Jan 3 04:29:15 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Fri, 03 Jan 2014 12:29:15 -0000 Subject: [vmkit-commits] [vmkit] r198410 - Lazily create ins/out from a signature. Message-ID: <20140103122915.BFB562A6C029@llvm.org> Author: gthomas Date: Fri Jan 3 06:29:15 2014 New Revision: 198410 URL: http://llvm.org/viewvc/llvm-project?rev=198410&view=rev Log: Lazily create ins/out from a signature. Modified: vmkit/branches/mcjit/include/j3/j3signature.h vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Modified: vmkit/branches/mcjit/include/j3/j3signature.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3signature.h?rev=198410&r1=198409&r2=198410&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3signature.h (original) +++ vmkit/branches/mcjit/include/j3/j3signature.h Fri Jan 3 06:29:15 2014 @@ -26,23 +26,20 @@ namespace j3 { J3LLVMSignature* _virtualLLVMSignature; J3Type* _out; uint32_t _nbIns; - J3Type* _ins[1]; + J3Type** _ins; + + void checkInOut(); public: - J3Signature(J3ClassLoader* loader, const vmkit::Name* name, J3Type** args, size_t nbArgs); + J3Signature(J3ClassLoader* loader, const vmkit::Name* name); const vmkit::Name* name() { return _name; } J3ClassLoader* loader() { return _loader; } void setLLVMSignature(uint32_t access, J3LLVMSignature* llvmSignature); J3LLVMSignature* llvmSignature(uint32_t access); - J3Type* out() { return _out; } - uint32_t nbIns() { return _nbIns; } - J3Type* ins(uint32_t idx) { return _ins[idx]; } - - void* operator new(size_t unused, vmkit::BumpAllocator* allocator, size_t n) { - return vmkit::PermanentObject::operator new(sizeof(J3Signature) + (n - 1) * sizeof(J3Type*), allocator); - } - + J3Type* out() { checkInOut(); return _out; } + uint32_t nbIns() { checkInOut(); return _nbIns; } + J3Type* ins(uint32_t idx) { checkInOut(); return _ins[idx]; } }; class J3LLVMSignature : vmkit::PermanentObject { 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=198410&r1=198409&r2=198410&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Fri Jan 3 06:29:15 2014 @@ -171,25 +171,11 @@ J3Type* J3ClassLoader::getType(J3ObjectT J3Signature* J3ClassLoader::getSignature(J3ObjectType* from, const vmkit::Name* signature) { pthread_mutex_lock(&_mutexMethodTypes); - J3Signature* res = methodTypes[signature]; - - if(!res) { - J3Type* args[1+signature->length()]; - uint32_t nbArgs = 0; - uint32_t cur = 1; - if(signature->cStr()[0] != J3Cst::ID_Left) - wrongType(from, signature); + J3Signature* res = methodTypes[signature]; + if(!res) + methodTypes[signature] = res = new(allocator()) J3Signature(this, signature); - while(signature->cStr()[cur] != J3Cst::ID_Right) { - args[nbArgs++] = getTypeInternal(from, signature, cur, &cur); - } - args[nbArgs++] = getTypeInternal(from, signature, cur+1, &cur); - if(cur != signature->length()) - wrongType(from, signature); - - methodTypes[signature] = res = new(allocator(), nbArgs - 1) J3Signature(this, signature, args, nbArgs); - } pthread_mutex_unlock(&_mutexMethodTypes); return res; Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=198410&r1=198409&r2=198410&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Fri Jan 3 06:29:15 2014 @@ -1,6 +1,7 @@ #include "j3/j3signature.h" #include "j3/j3object.h" #include "j3/j3codegen.h" +#include "j3/j3classloader.h" #include "j3/j3.h" #include "llvm/IR/Function.h" @@ -9,13 +10,31 @@ using namespace j3; -J3Signature::J3Signature(J3ClassLoader* loader, const vmkit::Name* name, J3Type** args, size_t nbArgs) { +J3Signature::J3Signature(J3ClassLoader* loader, const vmkit::Name* name) { _loader = loader; _name = name; - _out = args[nbArgs-1]; - _nbIns = nbArgs-1; - memcpy(_ins, args, (nbArgs-1)*sizeof(J3Type*)); - +} + +void J3Signature::checkInOut() { + if(!_out) { + J3Type* args[1+name()->length()]; + uint32_t nbArgs = 0; + uint32_t cur = 1; + + if(name()->cStr()[0] != J3Cst::ID_Left) + loader()->wrongType(0, name()); + + while(name()->cStr()[cur] != J3Cst::ID_Right) + args[nbArgs++] = loader()->getTypeInternal(0, name(), cur, &cur); + + _nbIns = nbArgs; + _ins = (J3Type**)loader()->allocator()->allocate(nbArgs*sizeof(J3Type*)); + memcpy(_ins, args, nbArgs*sizeof(J3Type*)); + + _out = loader()->getTypeInternal(0, name(), cur+1, &cur); + if(cur != name()->length()) + loader()->wrongType(0, name()); + } } void J3Signature::setLLVMSignature(uint32_t access, J3LLVMSignature* llvmSignature) { From gael.thomas at lip6.fr Fri Jan 3 05:08:02 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Fri, 03 Jan 2014 13:08:02 -0000 Subject: [vmkit-commits] [vmkit] r198411 - Add a function to create a function type without resolving the intermediate J3Types. Message-ID: <20140103130803.19B682A6C029@llvm.org> Author: gthomas Date: Fri Jan 3 07:08:02 2014 New Revision: 198411 URL: http://llvm.org/viewvc/llvm-project?rev=198411&view=rev Log: Add a function to create a function type without resolving the intermediate J3Types. Modified: vmkit/branches/mcjit/include/j3/j3classloader.h vmkit/branches/mcjit/include/j3/j3signature.h vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=198411&r1=198410&r2=198411&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Fri Jan 3 07:08:02 2014 @@ -66,7 +66,7 @@ namespace j3 { public: J3ClassLoader(J3* vm, J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator); - J3Type* getTypeInternal(J3ObjectType* from, const vmkit::Name* type, uint32_t start, uint32_t* end); + J3Type* getTypeInternal(J3ObjectType* from, const vmkit::Name* type, uint32_t start, uint32_t* end, bool unify); J3Type* getType(J3ObjectType* from, const vmkit::Name* type); /* find a type */ J3Signature* getSignature(J3ObjectType* from, const vmkit::Name* signature); /* get a method type */ void wrongType(J3ObjectType* from, const vmkit::Name* type); Modified: vmkit/branches/mcjit/include/j3/j3signature.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3signature.h?rev=198411&r1=198410&r2=198411&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3signature.h (original) +++ vmkit/branches/mcjit/include/j3/j3signature.h Fri Jan 3 07:08:02 2014 @@ -24,17 +24,20 @@ namespace j3 { const vmkit::Name* _name; J3LLVMSignature* _staticLLVMSignature; J3LLVMSignature* _virtualLLVMSignature; - J3Type* _out; + J3Type* volatile _out; uint32_t _nbIns; J3Type** _ins; + llvm::FunctionType* _staticFunctionType; + llvm::FunctionType* volatile _virtualFunctionType; void checkInOut(); - + void checkFunctionType(); public: J3Signature(J3ClassLoader* loader, const vmkit::Name* name); const vmkit::Name* name() { return _name; } J3ClassLoader* loader() { return _loader; } + llvm::FunctionType* functionType(uint32_t access); /* has to be called when compiler lock is held */ void setLLVMSignature(uint32_t access, J3LLVMSignature* llvmSignature); J3LLVMSignature* llvmSignature(uint32_t access); J3Type* out() { checkInOut(); return _out; } 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=198411&r1=198410&r2=198411&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Fri Jan 3 07:08:02 2014 @@ -91,7 +91,7 @@ void J3ClassLoader::wrongType(J3ObjectTy J3::classFormatError(from, "wrong type: %s", type->cStr()); } -J3Type* J3ClassLoader::getTypeInternal(J3ObjectType* from, const vmkit::Name* typeName, uint32_t start, uint32_t* pend) { +J3Type* J3ClassLoader::getTypeInternal(J3ObjectType* from, const vmkit::Name* typeName, uint32_t start, uint32_t* pend, bool unify) { J3Type* res = 0; const char* type = typeName->cStr(); uint32_t len = typeName->length(); @@ -114,7 +114,16 @@ J3Type* J3ClassLoader::getTypeInternal(J case J3Cst::ID_Short: res = vm()->typeShort; pos++; break; case J3Cst::ID_Boolean: res = vm()->typeBoolean; pos++; break; case J3Cst::ID_Classname: - { + if(unify) { + uint32_t start = ++pos; + for(; pos < len && type[pos] != J3Cst::ID_End; pos++); + + if(type[pos] != J3Cst::ID_End) + wrongType(from, typeName); + + pos++; + res = vm()->objectClass; + } else { uint32_t start = ++pos; char buf[len + 1 - start], c; @@ -140,7 +149,7 @@ J3Type* J3ClassLoader::getTypeInternal(J *pend = pos; - if(prof) + if(prof && !unify) res = res->getArray(prof, start ? 0 : typeName); return res; @@ -153,7 +162,7 @@ J3Type* J3ClassLoader::getType(J3ObjectT if(!res) { uint32_t end; - res = getTypeInternal(from, type, 0, &end); + res = getTypeInternal(from, type, 0, &end, 0); if(end != type->length()) wrongType(from, type); 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=198411&r1=198410&r2=198411&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Fri Jan 3 07:08:02 2014 @@ -210,6 +210,7 @@ llvm::FunctionType* J3CodeGen::llvmFunct vm->llvmSignatures[funcType] = res = new(vm->allocator()) J3LLVMSignature(funcType); type->setLLVMSignature(method->access(), res); } + return res->functionType(); } Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=198411&r1=198410&r2=198411&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Fri Jan 3 07:08:02 2014 @@ -2,11 +2,13 @@ #include "j3/j3object.h" #include "j3/j3codegen.h" #include "j3/j3classloader.h" +#include "j3/j3class.h" #include "j3/j3.h" #include "llvm/IR/Function.h" #include "llvm/IR/Module.h" #include "llvm/IR/IRBuilder.h" +#include "llvm/IR/Type.h" using namespace j3; @@ -15,6 +17,35 @@ J3Signature::J3Signature(J3ClassLoader* _name = name; } +void J3Signature::checkFunctionType() { + if(!_virtualFunctionType) { + std::vector vins; + std::vector sins; + uint32_t cur = 1; + + vins.push_back(loader()->vm()->objectClass->llvmType()); + + if(name()->cStr()[0] != J3Cst::ID_Left) + loader()->wrongType(0, name()); + + while(name()->cStr()[cur] != J3Cst::ID_Right) { + llvm::Type* in = loader()->getTypeInternal(0, name(), cur, &cur, 1)->llvmType(); + sins.push_back(in); + vins.push_back(in); + } + + llvm::Type* out = loader()->getTypeInternal(0, name(), cur+1, &cur, 1)->llvmType(); + + _staticFunctionType = llvm::FunctionType::get(out, vins, 0); + _virtualFunctionType = llvm::FunctionType::get(out, sins, 0); + } +} + +llvm::FunctionType* J3Signature::functionType(uint32_t access) { + checkFunctionType(); + return J3Cst::isStatic(access) ? _staticFunctionType : _virtualFunctionType; +} + void J3Signature::checkInOut() { if(!_out) { J3Type* args[1+name()->length()]; @@ -25,13 +56,13 @@ void J3Signature::checkInOut() { loader()->wrongType(0, name()); while(name()->cStr()[cur] != J3Cst::ID_Right) - args[nbArgs++] = loader()->getTypeInternal(0, name(), cur, &cur); + args[nbArgs++] = loader()->getTypeInternal(0, name(), cur, &cur, 0); _nbIns = nbArgs; _ins = (J3Type**)loader()->allocator()->allocate(nbArgs*sizeof(J3Type*)); memcpy(_ins, args, nbArgs*sizeof(J3Type*)); - _out = loader()->getTypeInternal(0, name(), cur+1, &cur); + _out = loader()->getTypeInternal(0, name(), cur+1, &cur, 0); /* has to be the last (thread safety) */ if(cur != name()->length()) loader()->wrongType(0, name()); } @@ -45,6 +76,7 @@ void J3Signature::setLLVMSignature(uint3 } J3LLVMSignature* J3Signature::llvmSignature(uint32_t access) { + checkFunctionType(); return J3Cst::isStatic(access) ? _staticLLVMSignature : _virtualLLVMSignature; } From gael.thomas at lip6.fr Fri Jan 3 06:04:09 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Fri, 03 Jan 2014 14:04:09 -0000 Subject: [vmkit-commits] [vmkit] r198415 - J3Mangler does not use ins() anymore, it also does not use J3Method anymore. Message-ID: <20140103140409.771862A6C029@llvm.org> Author: gthomas Date: Fri Jan 3 08:04:09 2014 New Revision: 198415 URL: http://llvm.org/viewvc/llvm-project?rev=198415&view=rev Log: J3Mangler does not use ins() anymore, it also does not use J3Method anymore. Modified: vmkit/branches/mcjit/include/j3/j3mangler.h vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc Modified: vmkit/branches/mcjit/include/j3/j3mangler.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3mangler.h?rev=198415&r1=198414&r2=198415&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3mangler.h (original) +++ vmkit/branches/mcjit/include/j3/j3mangler.h Fri Jan 3 08:04:09 2014 @@ -2,6 +2,7 @@ #define _J3_MANGLER_H_ #include +#include namespace vmkit { class Name; @@ -10,16 +11,17 @@ namespace vmkit { namespace j3 { class J3Class; class J3Method; + class J3Signature; class J3Mangler { - static const uint32_t max = 65536; + static const size_t max = 65536; J3Class* from; char buf[max]; char* cur; char* next; - void check(uint32_t n); + void check(size_t n); public: static const char* j3Id; @@ -28,12 +30,14 @@ namespace j3 { J3Mangler(J3Class* from); char* cStr() { return buf; } - uint32_t length() { return cur - buf; } + size_t length() { return cur - buf; } + J3Mangler* mangle(uint16_t utf16); J3Mangler* mangle(const char* prefix); + J3Mangler* mangle(const char* prefix, size_t length); J3Mangler* mangle(const vmkit::Name* name); - J3Mangler* mangle(J3Method* method); - J3Mangler* mangleType(J3Method* method); + J3Mangler* mangle(J3Signature* signature); + J3Mangler* mangle(const vmkit::Name* clName, const vmkit::Name* name); }; } 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=198415&r1=198414&r2=198415&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Fri Jan 3 08:04:09 2014 @@ -1701,9 +1701,9 @@ llvm::Type* J3CodeGen::doNativeType(J3Ty llvm::Function* J3CodeGen::lookupNative() { J3Mangler mangler(cl); - mangler.mangle(mangler.javaId)->mangle(method); + mangler.mangle(mangler.javaId)->mangle(method->cl()->name(), method->name()); uint32_t length = mangler.length(); - mangler.mangleType(method); + mangler.mangle(method->signature()); void* fnPtr = method->nativeFnPtr(); @@ -1712,7 +1712,7 @@ llvm::Function* J3CodeGen::lookupNative( if(!fnPtr) { mangler.cStr()[length] = 0; - fnPtr = loader->lookupNativeFunctionPointer(method, mangler.mangleType(method)->cStr()); + fnPtr = loader->lookupNativeFunctionPointer(method, mangler.cStr()); } if(!fnPtr) Modified: vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc?rev=198415&r1=198414&r2=198415&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc Fri Jan 3 08:04:09 2014 @@ -3,6 +3,7 @@ #include "j3/j3classloader.h" #include "j3/j3method.h" #include "j3/j3utf16.h" +#include "j3/j3thread.h" #include "j3/j3.h" using namespace j3; @@ -16,47 +17,45 @@ J3Mangler::J3Mangler(J3Class* _from) { cur = buf; } -void J3Mangler::check(uint32_t n) { - next = cur + n; - if((next+1) >= (buf + max)) - J3::internalError("unable to mangle: not enough space"); -} +J3Mangler* J3Mangler::mangle(J3Signature* signature) { + const vmkit::Name* name = signature->name(); -J3Mangler* J3Mangler::mangleType(J3Method* method) { - J3Signature* type = method->signature(); + if(name->cStr()[1] == J3Cst::ID_Right) + return this; - if(type->nbIns()) { - check(2); - cur[0] = '_'; - cur[1] = '_'; - cur = next; - - for(uint32_t i=0; inbIns(); i++) { - check(type->ins(i)->nativeNameLength()); - memcpy(cur, type->ins(i)->nativeName(), type->ins(i)->nativeNameLength()); - cur = next; - } + check(2); + cur[0] = '_'; + cur[1] = '_'; + cur = next; + + J3Utf16Encoder encoder(name); + encoder.nextUtf16(); + uint16_t c; + + while(!encoder.isEof() && ((c = encoder.nextUtf16()) != J3Cst::ID_Right)) { + mangle(c); } - check(1); + *cur = 0; - + return this; } -J3Mangler* J3Mangler::mangle(J3Method* method) { - check(method->cl()->nativeNameLength() - 3); - memcpy(cur, method->cl()->nativeName() + 1, method->cl()->nativeNameLength() - 3); - *next = '_'; - cur = next+1; - - mangle(method->name()); +J3Mangler* J3Mangler::mangle(const vmkit::Name* clName, const vmkit::Name* name) { + mangle(clName); + check(1); + *cur = '_'; + cur = next; + mangle(name); return this; } J3Mangler* J3Mangler::mangle(const char* prefix) { - uint32_t length = strlen(prefix); + return mangle(prefix, strlen(prefix)); +} +J3Mangler* J3Mangler::mangle(const char* prefix, size_t length) { check(length); memcpy(cur, prefix, length); *next = 0; @@ -68,48 +67,8 @@ J3Mangler* J3Mangler::mangle(const char* J3Mangler* J3Mangler::mangle(const vmkit::Name* name) { J3Utf16Encoder encoder(name); - next = cur; while(!encoder.isEof()) { - uint16_t c = encoder.nextUtf16(); - - if(c > 256) { - check(6); - *cur++ = '_'; - *cur++ = '0'; - *cur++ = (c >> 24 & 0xf) + '0'; - *cur++ = (c >> 16 & 0xf) + '0'; - *cur++ = (c >> 8 & 0xf) + '0'; - *cur++ = (c >> 0 & 0xf) + '0'; - } else { - switch(c) { - case '<': - case '>': - case '(': - case ')': - break; - case '_': - check(2); - *cur++ = '_'; - *cur++ = '1'; - break; - case ';': - check(2); - *cur++ = '_'; - *cur++ = '2'; - break; - case '[': - check(2); - *cur++ = '_'; - *cur++ = '3'; - break; - case '/': - c = '_'; - default: - check(1); - *cur++ = c; - } - } - cur = next; + mangle(encoder.nextUtf16()); } *cur = 0; @@ -117,3 +76,54 @@ J3Mangler* J3Mangler::mangle(const vmkit return this; } +J3Mangler* J3Mangler::mangle(uint16_t c) { + if(c > 256) { + check(6); + *cur++ = '_'; + *cur++ = '0'; + *cur++ = (c >> 24 & 0xf) + '0'; + *cur++ = (c >> 16 & 0xf) + '0'; + *cur++ = (c >> 8 & 0xf) + '0'; + *cur++ = (c >> 0 & 0xf) + '0'; + } else { + + switch(c) { + case '<': + case '>': + break; /* do not encode at all */ + case '(': + case ')': + J3Thread::get()->vm()->internalError("should not try to encode a special character such as %c", (char)c); + case '_': + check(2); + *cur++ = '_'; + *cur++ = '1'; + break; + case ';': + check(2); + *cur++ = '_'; + *cur++ = '2'; + break; + case '[': + check(2); + *cur++ = '_'; + *cur++ = '3'; + break; + case '/': + c = '_'; + default: + check(1); + *cur++ = c; + } + + } + cur = next; + + return this; +} + +void J3Mangler::check(size_t n) { + next = cur + n; + if((next+1) >= (buf + max)) + J3::internalError("unable to mangle: not enough space"); +} 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=198415&r1=198414&r2=198415&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Fri Jan 3 08:04:09 2014 @@ -223,7 +223,7 @@ void J3Method::buildLLVMNames(J3Class* f uint32_t plen = 5; J3Mangler mangler(from); - mangler.mangle(mangler.j3Id)->mangle(this)->mangleType(this); + mangler.mangle(mangler.j3Id)->mangle(cl()->name(), name())->mangle(signature()); uint32_t length = mangler.length() + plen; _llvmAllNames = (char*)cl()->loader()->allocator()->allocate(length + 1); From gael.thomas at lip6.fr Sat Jan 4 04:14:36 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 12:14:36 -0000 Subject: [vmkit-commits] [vmkit] r198485 - Don't use nbIns/ins()/out() ouside j3codegen anymore. Message-ID: <20140104121436.9EBDB19BE003@llvm.org> Author: gthomas Date: Sat Jan 4 06:14:36 2014 New Revision: 198485 URL: http://llvm.org/viewvc/llvm-project?rev=198485&view=rev Log: Don't use nbIns/ins()/out() ouside j3codegen anymore. Modified: vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3signature.cc vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=198485&r1=198484&r2=198485&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Sat Jan 4 06:14:36 2014 @@ -5,6 +5,7 @@ #include #include "vmkit/compiler.h" +#include "j3/j3signature.h" namespace llvm { class FunctionType; @@ -53,9 +54,8 @@ namespace j3 { void* volatile _virtualTrampoline; J3ObjectHandle* volatile _javaMethod; - J3Value internalInvoke(bool statically, J3ObjectHandle* handle, va_list va); - J3Value internalInvoke(bool statically, J3ObjectHandle* handle, J3Value* args); - J3Value internalInvoke(bool statically, J3Value* args); + J3Value internalInvoke(J3ObjectHandle* handle, va_list va); + J3Value internalInvoke(J3ObjectHandle* handle, J3Value* args); void buildLLVMNames(J3Class* from); public: J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, J3Signature* signature); @@ -84,7 +84,6 @@ namespace j3 { uint32_t index(); uint32_t* indexPtr() { return &_index; } bool isResolved() { return _index != -1; } - bool isCompiled() { return _fnPtr; } J3Attributes* attributes() const { return _attributes; } uint16_t access() const { return _access; } @@ -104,7 +103,9 @@ namespace j3 { J3Value invokeVirtual(J3ObjectHandle* obj, J3Value* args); J3Value invokeVirtual(J3ObjectHandle* obj, va_list va); - void* fnPtr(bool withCaller); + void ensureCompiled(bool withCaller); + J3LLVMSignature::function_t cxxCaller(); + void* fnPtr(); void* functionPointerOrStaticTrampoline(); void* functionPointerOrVirtualTrampoline(); 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=198485&r1=198484&r2=198485&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sat Jan 4 06:14:36 2014 @@ -149,8 +149,12 @@ J3Type* J3ClassLoader::getTypeInternal(J *pend = pos; - if(prof && !unify) - res = res->getArray(prof, start ? 0 : typeName); + if(prof) { + if(unify) + res = vm()->objectClass; + else + res = res->getArray(prof, start ? 0 : typeName); + } return res; } 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=198485&r1=198484&r2=198485&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sat Jan 4 06:14:36 2014 @@ -215,7 +215,7 @@ llvm::FunctionType* J3CodeGen::llvmFunct } llvm::Function* J3CodeGen::buildFunction(J3Method* method, bool isStub) { - const char* id = (isStub && !method->isCompiled()) ? method->llvmStubName(cl) : method->llvmFunctionName(cl); + const char* id = (isStub && !method->fnPtr()) ? method->llvmStubName(cl) : method->llvmFunctionName(cl); return (llvm::Function*)module->getOrInsertFunction(id, llvmFunctionType(method)); } 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=198485&r1=198484&r2=198485&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sat Jan 4 06:14:36 2014 @@ -44,35 +44,41 @@ void J3Method::markCompiled(llvm::Functi _fnPtr = fnPtr; } -void* J3Method::fnPtr(bool withCaller) { - if(!isCompiled()) { - //fprintf(stderr, "materializing: %s::%s%s\n", this, cl()->name()->cStr(), name()->cStr(), signature()->cStr()); +void* J3Method::fnPtr() { + return _fnPtr; +} + +J3LLVMSignature::function_t J3Method::cxxCaller() { + return signature()->llvmSignature(access())->caller(); +} + +void J3Method::ensureCompiled(bool withCaller) { + if(!fnPtr() || (withCaller && !cxxCaller())) { + // fprintf(stderr, "materializing: %s::%s%s\n", this, cl()->name()->cStr(), name()->cStr(), signature()->cStr()); if(!isResolved()) { if(cl()->loader()->vm()->options()->debugLinking) fprintf(stderr, "linking %s::%s\n", cl()->name()->cStr(), name()->cStr()); - + cl()->initialise(); if(!isResolved()) J3::noSuchMethodError("unable to find method", cl(), name(), signature()); } - J3CodeGen::translate(this, 1, withCaller); + J3CodeGen::translate(this, !fnPtr(), withCaller); } - - return _fnPtr; } void* J3Method::functionPointerOrStaticTrampoline() { - if(isCompiled()) - return _fnPtr; + if(fnPtr()) + return fnPtr(); if(!_staticTrampoline) _staticTrampoline = J3Trampoline::buildStaticTrampoline(cl()->loader()->allocator(), this); return _staticTrampoline; } void* J3Method::functionPointerOrVirtualTrampoline() { - if(isCompiled()) - return _fnPtr; + if(fnPtr()) + return fnPtr(); if(!_virtualTrampoline) _virtualTrampoline = J3Trampoline::buildVirtualTrampoline(cl()->loader()->allocator(), this); return _virtualTrampoline; @@ -106,92 +112,79 @@ J3Method* J3Method::resolve(J3ObjectHand return obj->vt()->type()->asObjectType()->findVirtualMethod(name(), signature()); } -J3Value J3Method::internalInvoke(bool statically, J3Value* inArgs) { - J3Method* target = statically ? this : resolve(inArgs[0].valObject); - - void* fn = fnPtr(1); - - //fprintf(stderr, "Internal invoke %s::%s%s\n", target->cl()->name()->cStr(), target->name()->cStr(), target->signature()->cStr()); - - J3LLVMSignature::function_t caller = signature()->llvmSignature(access())->caller(); - if(!caller) { - J3CodeGen::translate(this, 0, 1); - caller = signature()->llvmSignature(access())->caller(); - } - - J3Value res = caller(fn, inArgs); +J3Value J3Method::internalInvoke(J3ObjectHandle* handle, J3Value* inArgs) { + ensureCompiled(1); - return res; -} - -J3Value J3Method::internalInvoke(bool statically, J3ObjectHandle* handle, J3Value* inArgs) { J3Value* reIn; if(handle) { - reIn = (J3Value*)alloca((signature()->nbIns()+1)*sizeof(J3Value)); + uint32_t n = signature()->functionType(J3Cst::ACC_STATIC)->getNumParams(); + reIn = (J3Value*)alloca((n+1)*sizeof(J3Value)); reIn[0].valObject = handle; - memcpy(reIn+1, inArgs, signature()->nbIns()*sizeof(J3Value)); + memcpy(reIn+1, inArgs, n*sizeof(J3Value)); } else reIn = inArgs; - return internalInvoke(statically, reIn); + return cxxCaller()(fnPtr(), reIn); } -J3Value J3Method::internalInvoke(bool statically, J3ObjectHandle* handle, va_list va) { - J3Value* args = (J3Value*)alloca(sizeof(J3Value)*(signature()->nbIns() + 1)); +J3Value J3Method::internalInvoke(J3ObjectHandle* handle, va_list va) { + ensureCompiled(1); + + llvm::FunctionType* fType = signature()->functionType(J3Cst::ACC_STATIC); /* static signature for va */ + J3Value* args = (J3Value*)alloca(sizeof(J3Value)*(fType->getNumParams() + 1)); J3* vm = cl()->loader()->vm(); - J3Type* cur; - uint32_t d = 0; + uint32_t i = 0; if(handle) - args[d++].valObject = handle; - - for(uint32_t i=0; inbIns(); i++) { - cur = signature()->ins(i); - - if(cur == vm->typeBoolean) - args[i+d].valBoolean = va_arg(va, bool); - else if(cur == vm->typeByte) - args[i+d].valByte = va_arg(va, int8_t); - else if(cur == vm->typeShort) - args[i+d].valShort = va_arg(va, int16_t); - else if(cur == vm->typeChar) - args[i+d].valChar = va_arg(va, uint16_t); - else if(cur == vm->typeInteger) - args[i+d].valInteger = va_arg(va, int32_t); - else if(cur == vm->typeLong) - args[i+d].valLong = va_arg(va, int64_t); - else if(cur == vm->typeFloat) - args[i+d].valFloat = va_arg(va, float); - else if(cur == vm->typeDouble) - args[i+d].valDouble = va_arg(va, double); + args[i++].valObject = handle; + + for(llvm::FunctionType::param_iterator cur=fType->param_begin(); cur!=fType->param_end(); cur++, i++) { + llvm::Type* t = *cur; + + if(t == vm->typeBoolean->llvmType()) + args[i].valBoolean = va_arg(va, bool); + else if(t == vm->typeByte->llvmType()) + args[i].valByte = va_arg(va, int8_t); + else if(t == vm->typeShort->llvmType()) + args[i].valShort = va_arg(va, int16_t); + else if(t == vm->typeChar->llvmType()) + args[i].valChar = va_arg(va, uint16_t); + else if(t == vm->typeInteger->llvmType()) + args[i].valInteger = va_arg(va, int32_t); + else if(t == vm->typeLong->llvmType()) + args[i].valLong = va_arg(va, int64_t); + else if(t == vm->typeFloat->llvmType()) + args[i].valFloat = va_arg(va, float); + else if(t == vm->typeDouble->llvmType()) + args[i].valDouble = va_arg(va, double); else - args[i+d].valObject = va_arg(va, J3ObjectHandle*); + args[i].valObject = va_arg(va, J3ObjectHandle*); } - return internalInvoke(statically, args); + return cxxCaller()(fnPtr(), args); } J3Value J3Method::invokeStatic(J3Value* args) { - return internalInvoke(1, 0, args); + return internalInvoke(0, args); } -J3Value J3Method::invokeSpecial(J3ObjectHandle* handle, J3Value* args) { - return internalInvoke(1, handle, args); +J3Value J3Method::invokeStatic(va_list va) { + return internalInvoke(0, va); } -J3Value J3Method::invokeVirtual(J3ObjectHandle* handle, J3Value* args) { - return internalInvoke(0, handle, args); +J3Value J3Method::invokeSpecial(J3ObjectHandle* handle, J3Value* args) { + return internalInvoke(handle, args); } -J3Value J3Method::invokeStatic(va_list va) { - return internalInvoke(1, 0, va); +J3Value J3Method::invokeSpecial(J3ObjectHandle* handle, va_list va) { + return internalInvoke(handle, va); } -J3Value J3Method::invokeSpecial(J3ObjectHandle* handle, va_list va) { - return internalInvoke(1, handle, va); +J3Value J3Method::invokeVirtual(J3ObjectHandle* handle, J3Value* args) { + return resolve(handle)->internalInvoke(handle, args); } J3Value J3Method::invokeVirtual(J3ObjectHandle* handle, va_list va) { - return internalInvoke(0, handle, va); + return resolve(handle)->internalInvoke(handle, va); } J3Value J3Method::invokeStatic(...) { Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=198485&r1=198484&r2=198485&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Sat Jan 4 06:14:36 2014 @@ -36,8 +36,8 @@ void J3Signature::checkFunctionType() { llvm::Type* out = loader()->getTypeInternal(0, name(), cur+1, &cur, 1)->llvmType(); - _staticFunctionType = llvm::FunctionType::get(out, vins, 0); - _virtualFunctionType = llvm::FunctionType::get(out, sins, 0); + _staticFunctionType = llvm::FunctionType::get(out, sins, 0); + _virtualFunctionType = llvm::FunctionType::get(out, vins, 0); } } Modified: vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc?rev=198485&r1=198484&r2=198485&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Sat Jan 4 06:14:36 2014 @@ -16,7 +16,8 @@ void* J3Trampoline::interfaceTrampoline( void* res; if(desc->nbMethods == 1) { - res = desc->methods[0]->fnPtr(0); + desc->methods[0]->ensureCompiled(0); + res = desc->methods[0]->fnPtr(); handle->vt()->_interfaceMethodTable[index] = res; } else J3::internalError("implement me: interface Trampoline with collision"); @@ -27,7 +28,8 @@ void* J3Trampoline::interfaceTrampoline( } void* J3Trampoline::staticTrampoline(J3Object* obj, J3Method* target) { - return target->fnPtr(0); + target->ensureCompiled(0); + return target->fnPtr(); } void* J3Trampoline::virtualTrampoline(J3Object* obj, J3Method* target) { @@ -36,7 +38,8 @@ void* J3Trampoline::virtualTrampoline(J3 J3ObjectType* cl = handle->vt()->type()->asObjectType(); J3Method* impl = cl == target->cl() ? target : cl->findVirtualMethod(target->name(), target->signature()); - void* res = impl->fnPtr(0); + impl->ensureCompiled(0); + void* res = impl->fnPtr(); handle->vt()->virtualMethods()[impl->index()] = res; J3Thread::get()->restore(prev); From gael.thomas at lip6.fr Sat Jan 4 04:41:54 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 12:41:54 -0000 Subject: [vmkit-commits] [vmkit] r198486 - Hides J3LLVMSignature except from J3Signature. Message-ID: <20140104124154.4EBEE19BE003@llvm.org> Author: gthomas Date: Sat Jan 4 06:41:53 2014 New Revision: 198486 URL: http://llvm.org/viewvc/llvm-project?rev=198486&view=rev Log: Hides J3LLVMSignature except from J3Signature. Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/include/j3/j3signature.h vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=198486&r1=198485&r2=198486&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Sat Jan 4 06:41:53 2014 @@ -39,7 +39,7 @@ namespace j3 { friend class J3CodeGenVar; friend class J3ExceptionTable; friend class J3ExceptionNode; - friend class J3LLVMSignature; + friend class J3Signature; vmkit::BumpAllocator* allocator; llvm::Module* module; Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=198486&r1=198485&r2=198486&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Sat Jan 4 06:41:53 2014 @@ -104,7 +104,7 @@ namespace j3 { J3Value invokeVirtual(J3ObjectHandle* obj, va_list va); void ensureCompiled(bool withCaller); - J3LLVMSignature::function_t cxxCaller(); + J3Signature::function_t cxxCaller(); void* fnPtr(); void* functionPointerOrStaticTrampoline(); void* functionPointerOrVirtualTrampoline(); Modified: vmkit/branches/mcjit/include/j3/j3signature.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3signature.h?rev=198486&r1=198485&r2=198486&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3signature.h (original) +++ vmkit/branches/mcjit/include/j3/j3signature.h Sat Jan 4 06:41:53 2014 @@ -20,6 +20,10 @@ namespace j3 { class J3CodeGen; class J3Signature : public vmkit::PermanentObject { + public: + typedef J3Value (*function_t)(void* fn, J3Value* args); + + private: J3ClassLoader* _loader; const vmkit::Name* _name; J3LLVMSignature* _staticLLVMSignature; @@ -43,25 +47,24 @@ namespace j3 { J3Type* out() { checkInOut(); return _out; } uint32_t nbIns() { checkInOut(); return _nbIns; } J3Type* ins(uint32_t idx) { checkInOut(); return _ins[idx]; } - }; - - class J3LLVMSignature : vmkit::PermanentObject { - friend class J3CodeGen; - public: - typedef J3Value (*function_t)(void* fn, J3Value* args); + J3Signature::function_t caller(uint32_t access); + void generateCallerIR(uint32_t access, J3CodeGen* codeGen, llvm::Module* module, const char* id); + void setCaller(uint32_t access, J3Signature::function_t caller); + }; + class J3LLVMSignature : public vmkit::PermanentObject { private: - llvm::FunctionType* _functionType; - function_t _caller; - - void generateCallerIR(J3CodeGen* vm, llvm::Module* module, const char* id); + llvm::FunctionType* _functionType; + J3Signature::function_t _caller; + public: J3LLVMSignature(llvm::FunctionType* functionType); + void z_setCaller(J3Signature::function_t caller) { _caller = caller; } + J3Signature::function_t z_caller() { return _caller; } + llvm::FunctionType* functionType() { return _functionType; } - public: - function_t caller() { return _caller; } }; } 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=198486&r1=198485&r2=198486&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sat Jan 4 06:41:53 2014 @@ -108,14 +108,14 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato } uint32_t access = method->access(); - if(withCaller && !signature->llvmSignature(access)->caller()) - signature->llvmSignature(access)->generateCallerIR(this, module, "generic-caller"); + if(withCaller && !signature->caller(access)) + signature->generateCallerIR(access, this, module, "generic-caller"); loader->compileModule(module); - if(withCaller && !signature->llvmSignature(access)->caller()) { - J3LLVMSignature::function_t caller = (J3LLVMSignature::function_t)loader->ee()->getFunctionAddress("generic-caller"); - signature->llvmSignature(access)->_caller = caller; + if(withCaller && !signature->caller(access)) { + J3Signature::function_t caller = (J3Signature::function_t)loader->ee()->getFunctionAddress("generic-caller"); + signature->setCaller(access, caller); } if(withMethod) { @@ -192,6 +192,8 @@ llvm::Value* J3CodeGen::unflatten(llvm:: } llvm::FunctionType* J3CodeGen::llvmFunctionType(J3Method* method) { + // return method->functionType(method->access()); + J3Signature* type = method->signature(); J3LLVMSignature* res = type->llvmSignature(method->access()); 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=198486&r1=198485&r2=198486&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sat Jan 4 06:41:53 2014 @@ -48,8 +48,8 @@ void* J3Method::fnPtr() { return _fnPtr; } -J3LLVMSignature::function_t J3Method::cxxCaller() { - return signature()->llvmSignature(access())->caller(); +J3Signature::function_t J3Method::cxxCaller() { + return signature()->caller(access()); } void J3Method::ensureCompiled(bool withCaller) { Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=198486&r1=198485&r2=198486&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Sat Jan 4 06:41:53 2014 @@ -68,23 +68,12 @@ void J3Signature::checkInOut() { } } -void J3Signature::setLLVMSignature(uint32_t access, J3LLVMSignature* llvmSignature) { - if(J3Cst::isStatic(access)) - _staticLLVMSignature = llvmSignature; - else - _virtualLLVMSignature = llvmSignature; -} - -J3LLVMSignature* J3Signature::llvmSignature(uint32_t access) { - checkFunctionType(); - return J3Cst::isStatic(access) ? _staticLLVMSignature : _virtualLLVMSignature; -} - -J3LLVMSignature::J3LLVMSignature(llvm::FunctionType* functionType) { - _functionType = functionType; +J3Signature::function_t J3Signature::caller(uint32_t access) { + return llvmSignature(access)->z_caller(); } -void J3LLVMSignature::generateCallerIR(J3CodeGen* codeGen, llvm::Module* module, const char* id) { +void J3Signature::generateCallerIR(uint32_t access, J3CodeGen* codeGen, llvm::Module* module, const char* id) { + llvm::FunctionType* fType = functionType(access); llvm::Type* uint64Ty = llvm::Type::getInt64Ty(module->getContext()); llvm::Type* callerIn[] = { llvm::Type::getInt8Ty(module->getContext())->getPointerTo(), uint64Ty->getPointerTo() }; @@ -93,7 +82,7 @@ void J3LLVMSignature::generateCallerIR(J llvm::IRBuilder<> builder(bb); llvm::Function::arg_iterator cur = caller->arg_begin(); - llvm::Value* method = builder.CreateBitCast(cur++, _functionType->getPointerTo()); + llvm::Value* method = builder.CreateBitCast(cur++, fType->getPointerTo()); llvm::Value* ins = cur; llvm::Value* one = builder.getInt32(1); @@ -101,7 +90,7 @@ void J3LLVMSignature::generateCallerIR(J std::vector params; - for(llvm::FunctionType::param_iterator it=_functionType->param_begin(); it!=_functionType->param_end(); it++) { + for(llvm::FunctionType::param_iterator it=fType->param_begin(); it!=fType->param_end(); it++) { llvm::Type* t = *it; llvm::Value* arg; @@ -135,7 +124,7 @@ void J3LLVMSignature::generateCallerIR(J } llvm::Value* res = builder.CreateCall(method, params); - llvm::Type* ret = _functionType->getReturnType(); + llvm::Type* ret = fType->getReturnType(); if(ret != builder.getVoidTy()) { if(ret->isPointerTy()) { @@ -155,6 +144,24 @@ void J3LLVMSignature::generateCallerIR(J res = builder.getInt64(0); builder.CreateRet(res); +} - //caller->dump(); +void J3Signature::setCaller(uint32_t access, J3Signature::function_t caller) { + llvmSignature(access)->z_setCaller(caller); +} + +void J3Signature::setLLVMSignature(uint32_t access, J3LLVMSignature* llvmSignature) { + if(J3Cst::isStatic(access)) + _staticLLVMSignature = llvmSignature; + else + _virtualLLVMSignature = llvmSignature; +} + +J3LLVMSignature* J3Signature::llvmSignature(uint32_t access) { + checkFunctionType(); + return J3Cst::isStatic(access) ? _staticLLVMSignature : _virtualLLVMSignature; +} + +J3LLVMSignature::J3LLVMSignature(llvm::FunctionType* functionType) { + _functionType = functionType; } From gael.thomas at lip6.fr Sat Jan 4 05:40:10 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 13:40:10 -0000 Subject: [vmkit-commits] [vmkit] r198487 - Simplify J3Signature management Message-ID: <20140104134010.1F6152A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 07:40:09 2014 New Revision: 198487 URL: http://llvm.org/viewvc/llvm-project?rev=198487&view=rev Log: Simplify J3Signature management Modified: vmkit/branches/mcjit/include/j3/j3.h vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/include/j3/j3signature.h vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=198487&r1=198486&r2=198487&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Sat Jan 4 07:40:09 2014 @@ -8,13 +8,16 @@ #include "vmkit/vmkit.h" #include "vmkit/allocator.h" -#include "j3/j3signature.h" #include "j3/j3options.h" #include "j3/j3typesdef.h" #include "j3/j3jni.h" #include "j3/j3monitor.h" #include "j3/j3constants.h" +namespace llvm { + class FunctionType; +} + namespace j3 { class J3InitialClassLoader; class J3Class; @@ -25,6 +28,7 @@ namespace j3 { class J3Primitive; class J3Lib; class J3Method; + class J3LLVMSignature; class J3Signature; class J3 : public vmkit::VMKit { Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=198487&r1=198486&r2=198487&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Sat Jan 4 07:40:09 2014 @@ -82,7 +82,6 @@ namespace j3 { uint32_t wideReadU1(); uint32_t wideReadS1(); - llvm::FunctionType* llvmFunctionType(J3Method* method); llvm::Function* buildFunction(J3Method* method, bool isStub=1); llvm::Value* methodDescriptor(J3Method* method); llvm::Value* typeDescriptor(J3ObjectType* objectType, llvm::Type* type); Modified: vmkit/branches/mcjit/include/j3/j3signature.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3signature.h?rev=198487&r1=198486&r2=198487&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3signature.h (original) +++ vmkit/branches/mcjit/include/j3/j3signature.h Sat Jan 4 07:40:09 2014 @@ -27,13 +27,13 @@ namespace j3 { J3ClassLoader* _loader; const vmkit::Name* _name; J3LLVMSignature* _staticLLVMSignature; - J3LLVMSignature* _virtualLLVMSignature; + J3LLVMSignature* volatile _virtualLLVMSignature; J3Type* volatile _out; - uint32_t _nbIns; J3Type** _ins; - llvm::FunctionType* _staticFunctionType; - llvm::FunctionType* volatile _virtualFunctionType; + J3LLVMSignature* buildLLVMSignature(llvm::FunctionType* fType); + J3LLVMSignature* llvmSignature(uint32_t access); + void checkInOut(); void checkFunctionType(); public: @@ -41,30 +41,24 @@ namespace j3 { const vmkit::Name* name() { return _name; } J3ClassLoader* loader() { return _loader; } - llvm::FunctionType* functionType(uint32_t access); /* has to be called when compiler lock is held */ - void setLLVMSignature(uint32_t access, J3LLVMSignature* llvmSignature); - J3LLVMSignature* llvmSignature(uint32_t access); - J3Type* out() { checkInOut(); return _out; } - uint32_t nbIns() { checkInOut(); return _nbIns; } - J3Type* ins(uint32_t idx) { checkInOut(); return _ins[idx]; } + J3Type* javaOut() { checkInOut(); return _out; } + J3Type* javaIns(uint32_t idx) { checkInOut(); return _ins[idx]; } + uint32_t nbIns(); + + function_t caller(uint32_t access); + + /* only call this function outside the compiler when the functionType already exists */ + llvm::FunctionType* functionType(uint32_t access); - J3Signature::function_t caller(uint32_t access); + /* only call the remaining functions while the compiler lock is held */ void generateCallerIR(uint32_t access, J3CodeGen* codeGen, llvm::Module* module, const char* id); void setCaller(uint32_t access, J3Signature::function_t caller); }; class J3LLVMSignature : public vmkit::PermanentObject { - private: - llvm::FunctionType* _functionType; - J3Signature::function_t _caller; - public: - J3LLVMSignature(llvm::FunctionType* functionType); - - void z_setCaller(J3Signature::function_t caller) { _caller = caller; } - J3Signature::function_t z_caller() { return _caller; } - - llvm::FunctionType* functionType() { return _functionType; } + llvm::FunctionType* functionType; + J3Signature::function_t caller; }; } 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=198487&r1=198486&r2=198487&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sat Jan 4 07:40:09 2014 @@ -108,15 +108,14 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato } uint32_t access = method->access(); - if(withCaller && !signature->caller(access)) + uint32_t needsCaller = withCaller && !signature->caller(access); + if(needsCaller) signature->generateCallerIR(access, this, module, "generic-caller"); loader->compileModule(module); - - if(withCaller && !signature->caller(access)) { - J3Signature::function_t caller = (J3Signature::function_t)loader->ee()->getFunctionAddress("generic-caller"); - signature->setCaller(access, caller); - } + + if(needsCaller) + signature->setCaller(access, (J3Signature::function_t)loader->ee()->getFunctionAddress("generic-caller")); if(withMethod) { void* fnPtr = (void*)loader->ee()->getFunctionAddress(llvmFunction->getName().data()); @@ -136,7 +135,7 @@ void J3CodeGen::operator delete(void* pt void J3CodeGen::translate(J3Method* method, bool withMethod, bool withCaller) { method->cl()->loader()->vm()->lockCompiler(); - + vmkit::BumpAllocator* allocator = vmkit::BumpAllocator::create(); delete new(allocator) J3CodeGen(allocator, method, withMethod, withCaller); vmkit::BumpAllocator::destroy(allocator); @@ -191,34 +190,9 @@ llvm::Value* J3CodeGen::unflatten(llvm:: } } -llvm::FunctionType* J3CodeGen::llvmFunctionType(J3Method* method) { - // return method->functionType(method->access()); - - J3Signature* type = method->signature(); - J3LLVMSignature* res = type->llvmSignature(method->access()); - - if(!res) { - std::vector in; - - if(!J3Cst::isStatic(method->access())) - in.push_back(vm->typeJ3ObjectPtr); - - for(uint32_t i=0; inbIns(); i++) - in.push_back(type->ins(i)->llvmType()); - - llvm::FunctionType* funcType = llvm::FunctionType::get(type->out()->llvmType(), in, 0); - res = vm->llvmSignatures[funcType]; - if(!res) - vm->llvmSignatures[funcType] = res = new(vm->allocator()) J3LLVMSignature(funcType); - type->setLLVMSignature(method->access(), res); - } - - return res->functionType(); -} - llvm::Function* J3CodeGen::buildFunction(J3Method* method, bool isStub) { const char* id = (isStub && !method->fnPtr()) ? method->llvmStubName(cl) : method->llvmFunctionName(cl); - return (llvm::Function*)module->getOrInsertFunction(id, llvmFunctionType(method)); + return (llvm::Function*)module->getOrInsertFunction(id, method->signature()->functionType(method->access())); } llvm::Value* J3CodeGen::typeDescriptor(J3ObjectType* objectType, llvm::Type* type) { @@ -405,7 +379,7 @@ void J3CodeGen::invoke(uint32_t access, } for(uint32_t i=0; inbIns(); i++) - args.push_back(unflatten(stack.top(type->nbIns() - i - 1), type->ins(i))); + args.push_back(unflatten(stack.top(type->nbIns() - i - 1), type->javaIns(i))); stack.drop(d + type->nbIns()); @@ -420,8 +394,8 @@ void J3CodeGen::invoke(uint32_t access, } else res = builder->CreateCall(func, args); - if(type->out() != vm->typeVoid) { - stack.push(flatten(res, type->out())); + if(type->javaOut() != vm->typeVoid) { + stack.push(flatten(res, type->javaOut())); } } @@ -439,7 +413,7 @@ void J3CodeGen::invokeInterface(uint32_t builder->getInt32(J3VirtualTable::gepInterfaceMethods), builder->getInt32(index % J3VirtualTable::nbInterfaceMethodTable) }; llvm::Value* func = builder->CreateBitCast(builder->CreateLoad(builder->CreateGEP(vt(obj), gepFunc)), - llvmFunctionType(target)->getPointerTo()); + target->signature()->functionType(target->access())->getPointerTo()); invoke(0, target, func); } @@ -459,7 +433,7 @@ void J3CodeGen::invokeVirtual(uint32_t i builder->getInt32(J3VirtualTable::gepVirtualMethods), funcEntry }; llvm::Value* func = builder->CreateBitCast(builder->CreateLoad(builder->CreateGEP(vt(obj), gepFunc)), - llvmFunctionType(target)->getPointerTo()); + target->signature()->functionType(target->access())->getPointerTo()); char buf[65536]; snprintf(buf, 65536, "%s::%s%s", target->cl()->name()->cStr(), @@ -1631,7 +1605,7 @@ void J3CodeGen::generateJava() { if(!pos && !J3Cst::isStatic(method->access())) type = method->cl(); else - type = signature->ins(n++); + type = signature->javaIns(n++); locals.setAt(flatten(cur, type), pos); @@ -1664,11 +1638,11 @@ void J3CodeGen::generateJava() { buildString("%s\n"), buildString(buf)); } - if(signature->out() == vm->typeVoid) { + if(signature->javaOut() == vm->typeVoid) { builder->CreateRetVoid(); } else { - ret.metaStack[0] = signature->out()->llvmType(); - builder->CreateRet(unflatten(ret.at(0), signature->out())); + ret.metaStack[0] = signature->javaOut()->llvmType(); + builder->CreateRet(unflatten(ret.at(0), signature->javaOut())); } if(J3Cst::isSynchronized(method->access())) { @@ -1731,9 +1705,9 @@ llvm::Function* J3CodeGen::lookupNative( nativeIns.push_back(vm->typeJ3ObjectHandlePtr); for(int i=0; inbIns(); i++) - nativeIns.push_back(doNativeType(signature->ins(i))); + nativeIns.push_back(doNativeType(signature->javaIns(i))); - nativeOut = doNativeType(signature->out()); + nativeOut = doNativeType(signature->javaOut()); char* buf = (char*)loader->allocator()->allocate(mangler.length()+1); memcpy(buf, mangler.cStr(), mangler.length()+1); @@ -1778,8 +1752,8 @@ void J3CodeGen::generateNative() { selfDone = 1; a = builder->CreateCall2(funcJ3ThreadPush, thread, flatten(cur, method->cl())); } else { - if(signature->ins(i)->llvmType()->isPointerTy()) - a = builder->CreateCall2(funcJ3ThreadPush, thread, flatten(cur, signature->ins(i))); + if(signature->javaIns(i)->llvmType()->isPointerTy()) + a = builder->CreateCall2(funcJ3ThreadPush, thread, flatten(cur, signature->javaIns(i))); else a = cur; i++; @@ -1789,22 +1763,22 @@ void J3CodeGen::generateNative() { res = builder->CreateCall(nat, args); - if(signature->out() == vm->typeVoid) { + if(signature->javaOut() == vm->typeVoid) { builder->CreateCall2(funcJ3ThreadRestore, thread, frame); builder->CreateRetVoid(); } else { builder->CreateCall2(funcJ3ThreadRestore, thread, frame); - if(signature->out()->llvmType()->isPointerTy()) { + if(signature->javaOut()->llvmType()->isPointerTy()) { llvm::BasicBlock* ifnull = newBB("ifnull"); llvm::BasicBlock* ifnotnull = newBB("ifnotnull"); builder->CreateCondBr(builder->CreateIsNull(res), ifnull, ifnotnull); builder->SetInsertPoint(bb = ifnull); - builder->CreateRet(unflatten(nullValue, signature->out())); + builder->CreateRet(unflatten(nullValue, signature->javaOut())); builder->SetInsertPoint(bb = ifnotnull); - res = unflatten(handleToObject(res), signature->out()); + res = unflatten(handleToObject(res), signature->javaOut()); } builder->CreateRet(res); } 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=198487&r1=198486&r2=198487&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sat Jan 4 07:40:09 2014 @@ -113,7 +113,7 @@ J3Method* J3Method::resolve(J3ObjectHand } J3Value J3Method::internalInvoke(J3ObjectHandle* handle, J3Value* inArgs) { - ensureCompiled(1); + ensureCompiled(1); /* force the generation of the code and thus of the functionType */ J3Value* reIn; if(handle) { @@ -127,7 +127,7 @@ J3Value J3Method::internalInvoke(J3Objec } J3Value J3Method::internalInvoke(J3ObjectHandle* handle, va_list va) { - ensureCompiled(1); + ensureCompiled(1); /* force the generation of the code and thus of the functionType */ llvm::FunctionType* fType = signature()->functionType(J3Cst::ACC_STATIC); /* static signature for va */ J3Value* args = (J3Value*)alloca(sizeof(J3Value)*(fType->getNumParams() + 1)); @@ -269,7 +269,7 @@ J3ObjectHandle* J3Method::javaMethod() { J3ObjectHandle* parameters = J3ObjectHandle::doNewArray(vm->classClass->getArray(), nbIns); for(uint32_t i=0; isetObjectAt(i, signature()->ins(i)->javaClass()); + parameters->setObjectAt(i, signature()->javaIns(i)->javaClass()); J3Attribute* exceptionAttribute = attributes()->lookup(vm->exceptionsAttribute); J3ObjectHandle* exceptions; Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=198487&r1=198486&r2=198487&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Sat Jan 4 07:40:09 2014 @@ -17,8 +17,41 @@ J3Signature::J3Signature(J3ClassLoader* _name = name; } +void J3Signature::checkInOut() { + if(!_out) { + J3Type* args[1+name()->length()]; + uint32_t nbArgs = 0; + uint32_t cur = 1; + + if(name()->cStr()[0] != J3Cst::ID_Left) + loader()->wrongType(0, name()); + + while(name()->cStr()[cur] != J3Cst::ID_Right) + args[nbArgs++] = loader()->getTypeInternal(0, name(), cur, &cur, 0); + + if(nbArgs != nbIns()) + J3::internalError("should not happen %d %d", nbArgs, nbIns()); + + _ins = (J3Type**)loader()->allocator()->allocate(nbArgs*sizeof(J3Type*)); + memcpy(_ins, args, nbArgs*sizeof(J3Type*)); + + _out = loader()->getTypeInternal(0, name(), cur+1, &cur, 0); /* out has to be the last (thread safety) */ + if(cur != name()->length()) + loader()->wrongType(0, name()); + } +} + +J3LLVMSignature* J3Signature::buildLLVMSignature(llvm::FunctionType* fType) { + J3LLVMSignature* res = loader()->vm()->llvmSignatures[fType]; + if(!res) { + loader()->vm()->llvmSignatures[fType] = res = new(loader()->vm()->allocator()) J3LLVMSignature(); + res->functionType = fType; + } + return res; +} + void J3Signature::checkFunctionType() { - if(!_virtualFunctionType) { + if(!_virtualLLVMSignature) { std::vector vins; std::vector sins; uint32_t cur = 1; @@ -35,41 +68,33 @@ void J3Signature::checkFunctionType() { } llvm::Type* out = loader()->getTypeInternal(0, name(), cur+1, &cur, 1)->llvmType(); - - _staticFunctionType = llvm::FunctionType::get(out, sins, 0); - _virtualFunctionType = llvm::FunctionType::get(out, vins, 0); + + _staticLLVMSignature = buildLLVMSignature(llvm::FunctionType::get(out, sins, 0)); + _virtualLLVMSignature = buildLLVMSignature(llvm::FunctionType::get(out, vins, 0)); } } -llvm::FunctionType* J3Signature::functionType(uint32_t access) { +J3LLVMSignature* J3Signature::llvmSignature(uint32_t access) { checkFunctionType(); - return J3Cst::isStatic(access) ? _staticFunctionType : _virtualFunctionType; + return J3Cst::isStatic(access) ? _staticLLVMSignature : _virtualLLVMSignature; } -void J3Signature::checkInOut() { - if(!_out) { - J3Type* args[1+name()->length()]; - uint32_t nbArgs = 0; - uint32_t cur = 1; - - if(name()->cStr()[0] != J3Cst::ID_Left) - loader()->wrongType(0, name()); - - while(name()->cStr()[cur] != J3Cst::ID_Right) - args[nbArgs++] = loader()->getTypeInternal(0, name(), cur, &cur, 0); +llvm::FunctionType* J3Signature::functionType(uint32_t access) { + return llvmSignature(access)->functionType; +} - _nbIns = nbArgs; - _ins = (J3Type**)loader()->allocator()->allocate(nbArgs*sizeof(J3Type*)); - memcpy(_ins, args, nbArgs*sizeof(J3Type*)); +uint32_t J3Signature::nbIns() { + return functionType(J3Cst::ACC_STATIC)->getNumParams(); +} - _out = loader()->getTypeInternal(0, name(), cur+1, &cur, 0); /* has to be the last (thread safety) */ - if(cur != name()->length()) - loader()->wrongType(0, name()); - } +J3Signature::function_t J3Signature::caller(uint32_t access) { + if(!_virtualLLVMSignature) + J3::internalError("sould not happen"); + return llvmSignature(access)->caller; } -J3Signature::function_t J3Signature::caller(uint32_t access) { - return llvmSignature(access)->z_caller(); +void J3Signature::setCaller(uint32_t access, J3Signature::function_t caller) { + llvmSignature(access)->caller = caller; } void J3Signature::generateCallerIR(uint32_t access, J3CodeGen* codeGen, llvm::Module* module, const char* id) { @@ -145,23 +170,3 @@ void J3Signature::generateCallerIR(uint3 builder.CreateRet(res); } - -void J3Signature::setCaller(uint32_t access, J3Signature::function_t caller) { - llvmSignature(access)->z_setCaller(caller); -} - -void J3Signature::setLLVMSignature(uint32_t access, J3LLVMSignature* llvmSignature) { - if(J3Cst::isStatic(access)) - _staticLLVMSignature = llvmSignature; - else - _virtualLLVMSignature = llvmSignature; -} - -J3LLVMSignature* J3Signature::llvmSignature(uint32_t access) { - checkFunctionType(); - return J3Cst::isStatic(access) ? _staticLLVMSignature : _virtualLLVMSignature; -} - -J3LLVMSignature::J3LLVMSignature(llvm::FunctionType* functionType) { - _functionType = functionType; -} From gael.thomas at lip6.fr Sat Jan 4 05:46:50 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 13:46:50 -0000 Subject: [vmkit-commits] [vmkit] r198488 - flatten/unflatten uses llvm types instead of Java types. Message-ID: <20140104134650.3EB372A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 07:46:50 2014 New Revision: 198488 URL: http://llvm.org/viewvc/llvm-project?rev=198488&view=rev Log: flatten/unflatten uses llvm types instead of Java types. Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=198488&r1=198487&r2=198488&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Sat Jan 4 07:46:50 2014 @@ -96,8 +96,8 @@ namespace j3 { llvm::BasicBlock* forwardBranch(const char* id, uint32_t pc, bool doAlloc, bool doPush); void condBr(llvm::Value* op); - llvm::Value* flatten(llvm::Value* v, J3Type* type); - llvm::Value* unflatten(llvm::Value* v, J3Type* type); + llvm::Value* flatten(llvm::Value* v, llvm::Type* type); + llvm::Value* unflatten(llvm::Value* v, llvm::Type* type); llvm::Value* handleToObject(llvm::Value* obj); llvm::Value* javaClass(J3ObjectType* type); 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=198488&r1=198487&r2=198488&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sat Jan 4 07:46:50 2014 @@ -159,31 +159,33 @@ uint32_t J3CodeGen::wideReadS1() { return codeReader->readS1(); } -llvm::Value* J3CodeGen::flatten(llvm::Value* v, J3Type* type) { - if(type == vm->typeInteger || type == vm->typeLong || type == vm->typeFloat || type == vm->typeDouble) +llvm::Value* J3CodeGen::flatten(llvm::Value* v, llvm::Type* type) { + if(type == vm->typeInteger->llvmType() || type == vm->typeLong->llvmType() || + type == vm->typeFloat->llvmType() || type == vm->typeDouble->llvmType()) return v; - else if(type->llvmType()->isPointerTy()) { + else if(type->isPointerTy()) { if(v->getType() == vm->typeJ3ObjectPtr) return v; else return builder->CreateBitCast(v, vm->typeJ3ObjectPtr); - } else if(type == vm->typeBoolean || type == vm->typeByte || type == vm->typeShort) + } else if(type == vm->typeBoolean->llvmType() || type == vm->typeByte->llvmType() || type == vm->typeShort->llvmType()) return builder->CreateSExt(v, vm->typeInteger->llvmType()); - else if(type == vm->typeChar) + else if(type == vm->typeChar->llvmType()) return builder->CreateZExt(v, vm->typeInteger->llvmType()); else J3::internalError("should not happen"); } -llvm::Value* J3CodeGen::unflatten(llvm::Value* v, J3Type* type) { - if(type == vm->typeInteger || type == vm->typeLong || type == vm->typeFloat || type == vm->typeDouble) +llvm::Value* J3CodeGen::unflatten(llvm::Value* v, llvm::Type* type) { + if(type == vm->typeInteger->llvmType() || type == vm->typeLong->llvmType() || + type == vm->typeFloat->llvmType() || type == vm->typeDouble->llvmType()) return v; - else if(type->llvmType()->isPointerTy()) - return builder->CreateBitCast(v, type->llvmType()); - else if(type == vm->typeBoolean || type == vm->typeByte || type == vm->typeShort) - return builder->CreateSExtOrTrunc(v, type->llvmType()); - else if(type == vm->typeChar) - return builder->CreateZExtOrTrunc(v, type->llvmType()); + else if(type->isPointerTy()) + return builder->CreateBitCast(v, type); + else if(type == vm->typeBoolean->llvmType() || type == vm->typeByte->llvmType() || type == vm->typeShort->llvmType()) + return builder->CreateSExtOrTrunc(v, type); + else if(type == vm->typeChar->llvmType()) + return builder->CreateZExtOrTrunc(v, type); else { type->dump(); J3::internalError("should not happen"); @@ -374,12 +376,12 @@ void J3CodeGen::invoke(uint32_t access, uint32_t d = 0; if(!J3Cst::isStatic(access)) { - args.push_back(unflatten(stack.top(type->nbIns()), target->cl())); + args.push_back(unflatten(stack.top(type->nbIns()), target->cl()->llvmType())); d = 1; } for(uint32_t i=0; inbIns(); i++) - args.push_back(unflatten(stack.top(type->nbIns() - i - 1), type->javaIns(i))); + args.push_back(unflatten(stack.top(type->nbIns() - i - 1), type->javaIns(i)->llvmType())); stack.drop(d + type->nbIns()); @@ -395,7 +397,7 @@ void J3CodeGen::invoke(uint32_t access, res = builder->CreateCall(func, args); if(type->javaOut() != vm->typeVoid) { - stack.push(flatten(res, type->javaOut())); + stack.push(flatten(res, type->javaOut()->llvmType())); } } @@ -467,14 +469,14 @@ llvm::Value* J3CodeGen::fieldOffset(llvm } void J3CodeGen::get(llvm::Value* src, J3Field* f) { - llvm::Value* res = flatten(builder->CreateLoad(fieldOffset(src, f)), f->type()); + llvm::Value* res = flatten(builder->CreateLoad(fieldOffset(src, f)), f->type()->llvmType()); stack.push(res); } void J3CodeGen::getField(uint32_t idx) { llvm::Value* obj = stack.pop(); J3Field* f = cl->fieldAt(idx, 0); - get(unflatten(nullCheck(obj), f->layout()), f); + get(unflatten(nullCheck(obj), f->layout()->llvmType()), f); } void J3CodeGen::getStatic(uint32_t idx) { @@ -483,7 +485,7 @@ void J3CodeGen::getStatic(uint32_t idx) } void J3CodeGen::put(llvm::Value* dest, llvm::Value* val, J3Field* f) { - builder->CreateStore(unflatten(val, f->type()), fieldOffset(dest, f)); + builder->CreateStore(unflatten(val, f->type()->llvmType()), fieldOffset(dest, f)); } void J3CodeGen::putStatic(uint32_t idx) { @@ -495,7 +497,7 @@ 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->layout()), val, f); + put(unflatten(obj, f->layout()->llvmType()), val, f); } void J3CodeGen::arrayBoundCheck(llvm::Value* obj, llvm::Value* idx) { @@ -513,7 +515,7 @@ void J3CodeGen::arrayStore(J3Type* cType llvm::Value* array = stack.pop(); arrayBoundCheck(array, idx); - builder->CreateStore(unflatten(val, cType), arrayContent(cType, array, idx)); + builder->CreateStore(unflatten(val, cType->llvmType()), arrayContent(cType, array, idx)); } void J3CodeGen::arrayLoad(J3Type* cType) { @@ -521,7 +523,7 @@ void J3CodeGen::arrayLoad(J3Type* cType) llvm::Value* array = stack.pop(); arrayBoundCheck(array, idx); - stack.push(flatten(builder->CreateLoad(arrayContent(cType, array, idx)), cType)); + stack.push(flatten(builder->CreateLoad(arrayContent(cType, array, idx)), cType->llvmType())); } llvm::Value* J3CodeGen::arrayLengthPtr(llvm::Value* obj) { @@ -1607,7 +1609,7 @@ void J3CodeGen::generateJava() { else type = signature->javaIns(n++); - locals.setAt(flatten(cur, type), pos); + locals.setAt(flatten(cur, type->llvmType()), pos); if(vm->options()->debugExecute) builder->CreateCall4(funcEchoDebugExecute, @@ -1642,7 +1644,7 @@ void J3CodeGen::generateJava() { builder->CreateRetVoid(); } else { ret.metaStack[0] = signature->javaOut()->llvmType(); - builder->CreateRet(unflatten(ret.at(0), signature->javaOut())); + builder->CreateRet(unflatten(ret.at(0), signature->javaOut()->llvmType())); } if(J3Cst::isSynchronized(method->access())) { @@ -1750,10 +1752,10 @@ void J3CodeGen::generateNative() { llvm::Value* a; if(!selfDone && !J3Cst::isStatic(method->access())) { selfDone = 1; - a = builder->CreateCall2(funcJ3ThreadPush, thread, flatten(cur, method->cl())); + a = builder->CreateCall2(funcJ3ThreadPush, thread, flatten(cur, method->cl()->llvmType())); } else { if(signature->javaIns(i)->llvmType()->isPointerTy()) - a = builder->CreateCall2(funcJ3ThreadPush, thread, flatten(cur, signature->javaIns(i))); + a = builder->CreateCall2(funcJ3ThreadPush, thread, flatten(cur, signature->javaIns(i)->llvmType())); else a = cur; i++; @@ -1775,10 +1777,10 @@ void J3CodeGen::generateNative() { builder->CreateCondBr(builder->CreateIsNull(res), ifnull, ifnotnull); builder->SetInsertPoint(bb = ifnull); - builder->CreateRet(unflatten(nullValue, signature->javaOut())); + builder->CreateRet(unflatten(nullValue, signature->javaOut()->llvmType())); builder->SetInsertPoint(bb = ifnotnull); - res = unflatten(handleToObject(res), signature->javaOut()); + res = unflatten(handleToObject(res), signature->javaOut()->llvmType()); } builder->CreateRet(res); } From gael.thomas at lip6.fr Sat Jan 4 05:50:38 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 13:50:38 -0000 Subject: [vmkit-commits] [vmkit] r198490 - Remove useless calls to flatten/unflatten. Message-ID: <20140104135038.1C3492A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 07:50:37 2014 New Revision: 198490 URL: http://llvm.org/viewvc/llvm-project?rev=198490&view=rev Log: Remove useless calls to flatten/unflatten. Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc 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=198490&r1=198489&r2=198490&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sat Jan 4 07:50:37 2014 @@ -376,7 +376,7 @@ void J3CodeGen::invoke(uint32_t access, uint32_t d = 0; if(!J3Cst::isStatic(access)) { - args.push_back(unflatten(stack.top(type->nbIns()), target->cl()->llvmType())); + args.push_back(stack.top(type->nbIns())); d = 1; } @@ -476,7 +476,7 @@ 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->layout()->llvmType()), f); + get(nullCheck(obj), f); } void J3CodeGen::getStatic(uint32_t idx) { @@ -497,7 +497,7 @@ 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->layout()->llvmType()), val, f); + put(obj, val, f); } void J3CodeGen::arrayBoundCheck(llvm::Value* obj, llvm::Value* idx) { @@ -1752,10 +1752,10 @@ void J3CodeGen::generateNative() { llvm::Value* a; if(!selfDone && !J3Cst::isStatic(method->access())) { selfDone = 1; - a = builder->CreateCall2(funcJ3ThreadPush, thread, flatten(cur, method->cl()->llvmType())); + a = builder->CreateCall2(funcJ3ThreadPush, thread, cur); } else { if(signature->javaIns(i)->llvmType()->isPointerTy()) - a = builder->CreateCall2(funcJ3ThreadPush, thread, flatten(cur, signature->javaIns(i)->llvmType())); + a = builder->CreateCall2(funcJ3ThreadPush, thread, cur); else a = cur; i++; @@ -1777,10 +1777,10 @@ void J3CodeGen::generateNative() { builder->CreateCondBr(builder->CreateIsNull(res), ifnull, ifnotnull); builder->SetInsertPoint(bb = ifnull); - builder->CreateRet(unflatten(nullValue, signature->javaOut()->llvmType())); + builder->CreateRet(nullValue); builder->SetInsertPoint(bb = ifnotnull); - res = unflatten(handleToObject(res), signature->javaOut()->llvmType()); + res = handleToObject(res); } builder->CreateRet(res); } From gael.thomas at lip6.fr Sat Jan 4 05:56:38 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 13:56:38 -0000 Subject: [vmkit-commits] [vmkit] r198491 - Flatten/unflatten can now consider new invariants Message-ID: <20140104135638.3628A2A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 07:56:38 2014 New Revision: 198491 URL: http://llvm.org/viewvc/llvm-project?rev=198491&view=rev Log: Flatten/unflatten can now consider new invariants Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc 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=198491&r1=198490&r2=198491&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sat Jan 4 07:56:38 2014 @@ -161,35 +161,38 @@ uint32_t J3CodeGen::wideReadS1() { llvm::Value* J3CodeGen::flatten(llvm::Value* v, llvm::Type* type) { if(type == vm->typeInteger->llvmType() || type == vm->typeLong->llvmType() || - type == vm->typeFloat->llvmType() || type == vm->typeDouble->llvmType()) + type == vm->typeFloat->llvmType() || type == vm->typeDouble->llvmType() || + (type->isPointerTy() && (v->getType() == vm->typeJ3ObjectPtr))) return v; - else if(type->isPointerTy()) { - if(v->getType() == vm->typeJ3ObjectPtr) - return v; - else - return builder->CreateBitCast(v, vm->typeJ3ObjectPtr); - } else if(type == vm->typeBoolean->llvmType() || type == vm->typeByte->llvmType() || type == vm->typeShort->llvmType()) + else if(type == vm->typeBoolean->llvmType() || type == vm->typeByte->llvmType() || type == vm->typeShort->llvmType()) return builder->CreateSExt(v, vm->typeInteger->llvmType()); else if(type == vm->typeChar->llvmType()) return builder->CreateZExt(v, vm->typeInteger->llvmType()); - else - J3::internalError("should not happen"); + + fprintf(stderr, " v: "); + v->getType()->dump(); + fprintf(stderr, "\n type: "); + type->dump(); + fprintf(stderr, "\n"); + J3::internalError("should not happen"); } llvm::Value* J3CodeGen::unflatten(llvm::Value* v, llvm::Type* type) { if(type == vm->typeInteger->llvmType() || type == vm->typeLong->llvmType() || - type == vm->typeFloat->llvmType() || type == vm->typeDouble->llvmType()) + type == vm->typeFloat->llvmType() || type == vm->typeDouble->llvmType() || + (type->isPointerTy() && type == v->getType())) return v; - else if(type->isPointerTy()) - return builder->CreateBitCast(v, type); else if(type == vm->typeBoolean->llvmType() || type == vm->typeByte->llvmType() || type == vm->typeShort->llvmType()) return builder->CreateSExtOrTrunc(v, type); else if(type == vm->typeChar->llvmType()) return builder->CreateZExtOrTrunc(v, type); - else { - type->dump(); - J3::internalError("should not happen"); - } + + fprintf(stderr, " v: "); + v->getType()->dump(); + fprintf(stderr, "\n type: "); + type->dump(); + fprintf(stderr, "\n"); + J3::internalError("should not happen"); } llvm::Function* J3CodeGen::buildFunction(J3Method* method, bool isStub) { From gael.thomas at lip6.fr Sat Jan 4 06:06:24 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 14:06:24 -0000 Subject: [vmkit-commits] [vmkit] r198492 - Invoke does not use Java type anymore. Message-ID: <20140104140625.063FF2A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 08:06:24 2014 New Revision: 198492 URL: http://llvm.org/viewvc/llvm-project?rev=198492&view=rev Log: Invoke does not use Java type anymore. Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc 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=198492&r1=198491&r2=198492&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sat Jan 4 08:06:24 2014 @@ -375,18 +375,15 @@ llvm::Value* J3CodeGen::nullCheck(llvm:: void J3CodeGen::invoke(uint32_t access, J3Method* target, llvm::Value* func) { J3Signature* type = target->signature(); + llvm::FunctionType* fType = target->signature()->functionType(access); + uint32_t n = fType->getNumParams(); std::vector args; - uint32_t d = 0; + uint32_t i=n-1; - if(!J3Cst::isStatic(access)) { - args.push_back(stack.top(type->nbIns())); - d = 1; - } + for(llvm::FunctionType::param_iterator it=fType->param_begin(); it!=fType->param_end(); it++) + args.push_back(unflatten(stack.top(i--), *it)); - for(uint32_t i=0; inbIns(); i++) - args.push_back(unflatten(stack.top(type->nbIns() - i - 1), type->javaIns(i)->llvmType())); - - stack.drop(d + type->nbIns()); + stack.drop(n); llvm::Value* res; @@ -399,9 +396,8 @@ void J3CodeGen::invoke(uint32_t access, } else res = builder->CreateCall(func, args); - if(type->javaOut() != vm->typeVoid) { - stack.push(flatten(res, type->javaOut()->llvmType())); - } + if(!fType->getReturnType()->isVoidTy()) + stack.push(flatten(res, fType->getReturnType())); } void J3CodeGen::invokeInterface(uint32_t idx) { From gael.thomas at lip6.fr Sat Jan 4 06:35:52 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 14:35:52 -0000 Subject: [vmkit-commits] [vmkit] r198493 - Only creates Java method signature on demand in JavaMethod. Message-ID: <20140104143552.33CD72A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 08:35:51 2014 New Revision: 198493 URL: http://llvm.org/viewvc/llvm-project?rev=198493&view=rev Log: Only creates Java method signature on demand in JavaMethod. Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=198493&r1=198492&r2=198493&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Sat Jan 4 08:35:51 2014 @@ -96,7 +96,7 @@ namespace j3 { llvm::BasicBlock* forwardBranch(const char* id, uint32_t pc, bool doAlloc, bool doPush); void condBr(llvm::Value* op); - llvm::Value* flatten(llvm::Value* v, llvm::Type* type); + llvm::Value* flatten(llvm::Value* v); llvm::Value* unflatten(llvm::Value* v, llvm::Type* type); llvm::Value* handleToObject(llvm::Value* obj); @@ -158,7 +158,7 @@ namespace j3 { void generateJava(); void generateNative(); llvm::Function* lookupNative(); - llvm::Type* doNativeType(J3Type* type); + llvm::Type* doNativeType(llvm::Type* type); llvm::Value* buildString(const char* msg); 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=198493&r1=198492&r2=198493&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sat Jan 4 08:35:51 2014 @@ -159,7 +159,9 @@ uint32_t J3CodeGen::wideReadS1() { return codeReader->readS1(); } -llvm::Value* J3CodeGen::flatten(llvm::Value* v, llvm::Type* type) { +llvm::Value* J3CodeGen::flatten(llvm::Value* v) { + llvm::Type* type = v->getType(); + if(type == vm->typeInteger->llvmType() || type == vm->typeLong->llvmType() || type == vm->typeFloat->llvmType() || type == vm->typeDouble->llvmType() || (type->isPointerTy() && (v->getType() == vm->typeJ3ObjectPtr))) @@ -396,8 +398,8 @@ void J3CodeGen::invoke(uint32_t access, } else res = builder->CreateCall(func, args); - if(!fType->getReturnType()->isVoidTy()) - stack.push(flatten(res, fType->getReturnType())); + if(!res->getType()->isVoidTy()) + stack.push(flatten(res)); } void J3CodeGen::invokeInterface(uint32_t idx) { @@ -468,7 +470,7 @@ llvm::Value* J3CodeGen::fieldOffset(llvm } void J3CodeGen::get(llvm::Value* src, J3Field* f) { - llvm::Value* res = flatten(builder->CreateLoad(fieldOffset(src, f)), f->type()->llvmType()); + llvm::Value* res = flatten(builder->CreateLoad(fieldOffset(src, f))); stack.push(res); } @@ -522,7 +524,7 @@ void J3CodeGen::arrayLoad(J3Type* cType) llvm::Value* array = stack.pop(); arrayBoundCheck(array, idx); - stack.push(flatten(builder->CreateLoad(arrayContent(cType, array, idx)), cType->llvmType())); + stack.push(flatten(builder->CreateLoad(arrayContent(cType, array, idx)))); } llvm::Value* J3CodeGen::arrayLengthPtr(llvm::Value* obj) { @@ -1601,14 +1603,7 @@ void J3CodeGen::generateJava() { uint32_t n=0, pos=0; for(llvm::Function::arg_iterator cur=llvmFunction->arg_begin(); cur!=llvmFunction->arg_end(); cur++) { - J3Type* type; - - if(!pos && !J3Cst::isStatic(method->access())) - type = method->cl(); - else - type = signature->javaIns(n++); - - locals.setAt(flatten(cur, type->llvmType()), pos); + locals.setAt(flatten(cur), pos); if(vm->options()->debugExecute) builder->CreateCall4(funcEchoDebugExecute, @@ -1617,7 +1612,7 @@ void J3CodeGen::generateJava() { builder->getInt32(pos), locals.at(pos)); - pos += (type == vm->typeLong || type == vm->typeDouble) ? 2 : 1; + pos += (cur->getType() == vm->typeLong->llvmType() || cur->getType() == vm->typeDouble->llvmType()) ? 2 : 1; } //builder->CreateCall(ziTry); @@ -1639,11 +1634,12 @@ void J3CodeGen::generateJava() { buildString("%s\n"), buildString(buf)); } - if(signature->javaOut() == vm->typeVoid) { + + if(llvmFunction->getReturnType()->isVoidTy()) builder->CreateRetVoid(); - } else { - ret.metaStack[0] = signature->javaOut()->llvmType(); - builder->CreateRet(unflatten(ret.at(0), signature->javaOut()->llvmType())); + else { + ret.metaStack[0] = llvmFunction->getReturnType(); + builder->CreateRet(unflatten(ret.at(0), ret.metaStack[0])); } if(J3Cst::isSynchronized(method->access())) { @@ -1666,13 +1662,8 @@ void J3CodeGen::generateJava() { ret.killUnused(); } -llvm::Type* J3CodeGen::doNativeType(J3Type* type) { - llvm::Type* t = type->llvmType(); - - if(t->isPointerTy()) - return vm->typeJ3ObjectHandlePtr; - else - return t; +llvm::Type* J3CodeGen::doNativeType(llvm::Type* type) { + return type->isPointerTy() ? vm->typeJ3ObjectHandlePtr : type; } llvm::Function* J3CodeGen::lookupNative() { @@ -1701,14 +1692,13 @@ llvm::Function* J3CodeGen::lookupNative( nativeIns.push_back(vm->typeJNIEnvPtr); if(J3Cst::isStatic(method->access())) - nativeIns.push_back(doNativeType(vm->classClass)); - else - nativeIns.push_back(vm->typeJ3ObjectHandlePtr); - - for(int i=0; inbIns(); i++) - nativeIns.push_back(doNativeType(signature->javaIns(i))); + nativeIns.push_back(doNativeType(vm->classClass->llvmType())); - nativeOut = doNativeType(signature->javaOut()); + llvm::FunctionType* origFType = method->signature()->functionType(method->access()); + for(llvm::FunctionType::param_iterator it=origFType->param_begin(); it!=origFType->param_end(); it++) + nativeIns.push_back(doNativeType(*it)); + + nativeOut = doNativeType(origFType->getReturnType()); char* buf = (char*)loader->allocator()->allocate(mangler.length()+1); memcpy(buf, mangler.cStr(), mangler.length()+1); @@ -1745,41 +1735,33 @@ void J3CodeGen::generateNative() { if(J3Cst::isStatic(method->access())) args.push_back(builder->CreateCall2(funcJ3ThreadPushHandle, thread, javaClass(cl))); - uint32_t i = 0, selfDone = 0; + uint32_t selfDone = 0; for(llvm::Function::arg_iterator cur=llvmFunction->arg_begin(); cur!=llvmFunction->arg_end(); cur++) { - llvm::Value* a; - if(!selfDone && !J3Cst::isStatic(method->access())) { - selfDone = 1; - a = builder->CreateCall2(funcJ3ThreadPush, thread, cur); - } else { - if(signature->javaIns(i)->llvmType()->isPointerTy()) - a = builder->CreateCall2(funcJ3ThreadPush, thread, cur); - else - a = cur; - i++; - } - args.push_back(a); + llvm::Value* v = cur; + args.push_back(v->getType()->isPointerTy() ? + builder->CreateCall2(funcJ3ThreadPush, thread, v) : + v); } res = builder->CreateCall(nat, args); - if(signature->javaOut() == vm->typeVoid) { + if(llvmFunction->getReturnType()->isVoidTy()) { builder->CreateCall2(funcJ3ThreadRestore, thread, frame); builder->CreateRetVoid(); } else { - builder->CreateCall2(funcJ3ThreadRestore, thread, frame); - - if(signature->javaOut()->llvmType()->isPointerTy()) { + if(llvmFunction->getReturnType()->isPointerTy()) { llvm::BasicBlock* ifnull = newBB("ifnull"); llvm::BasicBlock* ifnotnull = newBB("ifnotnull"); builder->CreateCondBr(builder->CreateIsNull(res), ifnull, ifnotnull); builder->SetInsertPoint(bb = ifnull); + builder->CreateCall2(funcJ3ThreadRestore, thread, frame); builder->CreateRet(nullValue); builder->SetInsertPoint(bb = ifnotnull); res = handleToObject(res); + builder->CreateCall2(funcJ3ThreadRestore, thread, frame); } builder->CreateRet(res); } From gael.thomas at lip6.fr Sat Jan 4 06:43:10 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 14:43:10 -0000 Subject: [vmkit-commits] [vmkit] r198494 - preserve method signatures in nameAndType entries. Message-ID: <20140104144310.900232A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 08:43:10 2014 New Revision: 198494 URL: http://llvm.org/viewvc/llvm-project?rev=198494&view=rev Log: preserve method signatures in nameAndType entries. Modified: vmkit/branches/mcjit/lib/j3/vm/j3class.cc 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=198494&r1=198493&r2=198494&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sat Jan 4 08:43:10 2014 @@ -744,10 +744,15 @@ J3Method* J3Class::interfaceOrMethodAt(u J3ObjectType* cl = classAt(ctpValues[idx] >> 16); check(ntIdx, J3Cst::CONSTANT_NameAndType); + const vmkit::Name* name = nameAt(ctpValues[ntIdx] >> 16); - const vmkit::Name* signature = nameAt(ctpValues[ntIdx] & 0xffff); + J3Signature* signature = (J3Signature*)ctpResolved[ntIdx]; + if(!signature) + ctpResolved[idx] = signature = loader()->getSignature(this, nameAt(ctpValues[ntIdx] & 0xffff)); + + res = loader()->method(access, cl, name, signature); - res = loader()->method(access, cl, name, loader()->getSignature(this, signature)); + ctpResolved[idx] = res; return res; } From gael.thomas at lip6.fr Sat Jan 4 06:44:34 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 14:44:34 -0000 Subject: [vmkit-commits] [vmkit] r198495 - preserve field signatures in nameAndType entries. Message-ID: <20140104144434.3F3292A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 08:44:34 2014 New Revision: 198495 URL: http://llvm.org/viewvc/llvm-project?rev=198495&view=rev Log: preserve field signatures in nameAndType entries. Modified: vmkit/branches/mcjit/lib/j3/vm/j3class.cc 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=198495&r1=198494&r2=198495&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sat Jan 4 08:44:34 2014 @@ -782,7 +782,10 @@ J3Field* J3Class::fieldAt(uint16_t idx, check(ntIdx, J3Cst::CONSTANT_NameAndType); const vmkit::Name* name = nameAt(ctpValues[ntIdx] >> 16); - J3Type* type = loader()->getType(this, nameAt(ctpValues[ntIdx] & 0xffff)); + J3Type* type = (J3Type*)ctpResolved[ntIdx]; + + if(!type) + ctpResolved[ntIdx] = type = loader()->getType(this, nameAt(ctpValues[ntIdx] & 0xffff)); res = J3Cst::isStatic(access) ? cl->findStaticField(name, type) : cl->findVirtualField(name, type); From gael.thomas at lip6.fr Sat Jan 4 07:33:08 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 15:33:08 -0000 Subject: [vmkit-commits] [vmkit] r198498 - replace findVirtual/findStatic by generic find methods Message-ID: <20140104153308.3263F2A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 09:33:07 2014 New Revision: 198498 URL: http://llvm.org/viewvc/llvm-project?rev=198498&view=rev Log: replace findVirtual/findStatic by generic find methods Modified: vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3class.cc vmkit/branches/mcjit/lib/j3/vm/j3jni.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3object.cc vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198498&r1=198497&r2=198498&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Sat Jan 4 09:33:07 2014 @@ -125,8 +125,7 @@ namespace j3 { J3InterfaceSlotDescriptor* slotDescriptorAt(uint32_t index) { return &_interfaceSlotDescriptors[index]; } void prepareInterfaceTable(); - virtual J3Method* findVirtualMethod(const vmkit::Name* name, J3Signature* signature, bool error=1); - virtual J3Method* findStaticMethod(const vmkit::Name* name, J3Signature* signature, bool error=1); + virtual J3Method* findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error=1); bool isObjectType() { return 1; } @@ -164,8 +163,8 @@ namespace j3 { size_t nbPublicMethods() { return _nbPublicMethods; } J3Method** methods() { return _methods; } - J3Method* findMethod(const vmkit::Name* name, J3Signature* signature); - J3Field* findField(const vmkit::Name* name, const J3Type* type); + J3Method* localFindMethod(const vmkit::Name* name, J3Signature* signature); + J3Field* localFindField(const vmkit::Name* name, const J3Type* type); virtual J3ObjectHandle* extractAttribute(J3Attribute* attr) = 0; }; @@ -256,11 +255,8 @@ namespace j3 { bool isClass() { return 1; } - J3Method* findVirtualMethod(const vmkit::Name* name, J3Signature* signature, bool error=1); - J3Method* findStaticMethod(const vmkit::Name* name, J3Signature* signature, bool error=1); - - J3Field* findVirtualField(const vmkit::Name* name, J3Type* type, bool error=1); - J3Field* findStaticField(const vmkit::Name* name, J3Type* type, bool error=1); + J3Method* findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error=1); + J3Field* findField(uint32_t access, const vmkit::Name* name, J3Type* type, bool error=1); }; class J3ArrayClass : public J3ObjectType { @@ -278,8 +274,7 @@ namespace j3 { J3Type* component() { return _component; } bool isArrayClass() { return 1; } - J3Method* findVirtualMethod(const vmkit::Name* name, J3Signature* signature, bool error=1); - J3Method* findStaticMethod(const vmkit::Name* name, J3Signature* signature, bool error=1); + J3Method* findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error=1); }; class J3Primitive : public J3Type { Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=198498&r1=198497&r2=198498&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Sat Jan 4 09:33:07 2014 @@ -49,7 +49,7 @@ void J3Lib::bootstrap(J3* vm) { J3ObjectHandle* mainThread = J3ObjectHandle::doNewObject(vm->threadClass); J3Thread::get()->assocJavaThread(mainThread); - mainThread->setInteger(vm->threadClass->findVirtualField(vm->names()->get("priority"), vm->typeInteger), 5); + mainThread->setInteger(vm->threadClass->findField(0, vm->names()->get("priority"), vm->typeInteger), 5); threadInit->invokeSpecial(mainThread, appThreadGroup, vm->utfToString("main")); 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=198498&r1=198497&r2=198498&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sat Jan 4 09:33:07 2014 @@ -100,9 +100,7 @@ void J3::run() { #define z_class(clName) initialClassLoader->loadClass(names()->get(clName)) #define z_method(access, cl, name, signature) initialClassLoader->method(access, cl, name, initialClassLoader->getSignature(cl, signature)) -#define z_field(access, cl, name, type) J3Cst::isStatic(access) \ - ? cl->findStaticField(names()->get(name), type) \ - : cl->findVirtualField(names()->get(name), type); +#define z_field(access, cl, name, type) cl->findField(access, names()->get(name), type) nbArrayInterfaces = 2; @@ -122,12 +120,11 @@ void J3::run() { J3Field hf(J3Cst::ACC_PRIVATE, names()->get("** vmData **"), typeLong); classClass->resolve(&hf, 1); classClassInit = z_method(0, classClass, initName, names()->get("()V")); - classClassVMData = classClass->findVirtualField(hf.name(), hf.type()); + classClassVMData = classClass->findField(0, hf.name(), hf.type()); threadClass = z_class("java/lang/Thread"); threadClassRun = z_method(0, threadClass, names()->get("run"), names()->get("()V")); - threadClassVMData = initialClassLoader->loadClass(names()->get("java/lang/Thread")) - ->findVirtualField(names()->get("eetop"), typeLong); + threadClassVMData = z_field(0, threadClass, "eetop", typeLong); fieldClass = z_class("java/lang/reflect/Field"); fieldClassClass = z_field(0, fieldClass, "clazz", classClass); 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=198498&r1=198497&r2=198498&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sat Jan 4 09:33:07 2014 @@ -168,14 +168,10 @@ llvm::Type* J3ObjectType::llvmType() { return loader()->vm()->typeJ3ObjectPtr; } -J3Method* J3ObjectType::findVirtualMethod(const vmkit::Name* name, J3Signature* signature, bool error) { +J3Method* J3ObjectType::findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error) { J3::internalError("should not happe: %s::%s\n", J3ObjectType::name()->cStr(), name->cStr()); } -J3Method* J3ObjectType::findStaticMethod(const vmkit::Name* name, J3Signature* signature, bool error) { - J3::internalError("should not happen"); -} - J3ObjectType* J3ObjectType::nativeClass(J3ObjectHandle* handle) { return (J3ObjectType*)(uintptr_t)handle->getLong(J3Thread::get()->vm()->classClassVMData); } @@ -202,7 +198,7 @@ void J3ObjectType::prepareInterfaceTable //fprintf(stderr, " processing %s method %s %s\n", //J3Cst::isAbstract(base->access()) ? "abstract" : "concrete", //base->signature()->cStr(), base->name()->cStr()); - J3Method* method = findVirtualMethod(base->name(), base->signature(), J3Cst::isAbstract(base->access())); + J3Method* method = findMethod(0, base->name(), base->signature(), J3Cst::isAbstract(base->access())); if(!method) method = base; @@ -264,7 +260,7 @@ uintptr_t J3Layout::structSize() { return _structSize; } -J3Method* J3Layout::findMethod(const vmkit::Name* name, J3Signature* signature) { +J3Method* J3Layout::localFindMethod(const vmkit::Name* name, J3Signature* signature) { for(size_t i=0; ivm()->typeByte->getArray(), 0); } -J3Method* J3Class::findVirtualMethod(const vmkit::Name* name, J3Signature* signature, bool error) { - //loader()->vm()->log("Lookup: %s %s in %s (%d)", methName->cStr(), methSign->cStr(), name()->cStr(), nbVirtualMethods); +J3Method* J3Class::findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error) { resolve(); J3Class* cur = this; - while(1) { - J3Method* res = cur->findMethod(name, signature); + J3Layout* layout = J3Cst::isStatic(access) ? (J3Layout*)cur->staticLayout() : cur; + J3Method* res = layout->localFindMethod(name, signature); if(res) return res; @@ -335,35 +330,14 @@ J3Method* J3Class::findVirtualMethod(con } } -J3Method* J3Class::findStaticMethod(const vmkit::Name* name, J3Signature* signature, bool error) { - //loader()->vm()->log("Lookup: %s %s in %s", methName->cStr(), methSign->cStr(), name()->cStr()); - resolve(); - - J3Class* cur = this; - - while(1) { - J3Method* res = cur->staticLayout()->findMethod(name, signature); - - if(res) - return res; - - if(cur == cur->super()) { - if(error) - J3::noSuchMethodError("no such method", this, name, signature); - else - return 0; - } - cur = cur->super(); - } -} - -J3Field* J3Class::findVirtualField(const vmkit::Name* name, J3Type* type, bool error) { +J3Field* J3Class::findField(uint32_t access, const vmkit::Name* name, J3Type* type, bool error) { //loader()->vm()->log("Lookup: %s %s in %s", type->name()->cStr(), name->cStr(), J3Class::name()->cStr()); resolve(); J3Class* cur = this; while(1) { - J3Field* res = cur->findField(name, type); + J3Layout* layout = J3Cst::isStatic(access) ? (J3Layout*)cur->staticLayout() : cur; + J3Field* res = layout->localFindField(name, type); if(res) return res; @@ -378,24 +352,12 @@ J3Field* J3Class::findVirtualField(const } } -J3Field* J3Class::findStaticField(const vmkit::Name* fname, J3Type* ftype, bool error) { - //fprintf(stderr, "Lookup static field %s %s::%s\n", ftype->name()->cStr(), name()->cStr(), fname->cStr()); - resolve(); - - J3Field* res = staticLayout()->findField(fname, ftype); - - if(!res) - J3::internalError("implement me"); - - return res; -} - void J3Class::registerNative(const vmkit::Name* name, const vmkit::Name* signatureName, void* fnPtr) { resolve(); J3Signature* signature = loader()->getSignature(this, signatureName); - J3Method* res = staticLayout()->findMethod(name, signature); + J3Method* res = staticLayout()->localFindMethod(name, signature); if(!res) - res = findMethod(name, signature); + res = localFindMethod(name, signature); if(!res || !J3Cst::isNative(res->access())) J3::noSuchMethodError("unable to find native method", this, name, signature); @@ -451,7 +413,7 @@ void J3Class::doInitialise() { } } - J3Method* clinit = staticLayout()->findMethod(loader()->vm()->clinitName, loader()->vm()->clinitSign); + J3Method* clinit = staticLayout()->localFindMethod(loader()->vm()->clinitName, loader()->vm()->clinitSign); if(clinit) clinit->invokeStatic(); @@ -787,7 +749,7 @@ J3Field* J3Class::fieldAt(uint16_t idx, if(!type) ctpResolved[ntIdx] = type = loader()->getType(this, nameAt(ctpValues[ntIdx] & 0xffff)); - res = J3Cst::isStatic(access) ? cl->findStaticField(name, type) : cl->findVirtualField(name, type); + res = cl->findField(access, name, type); return res; } @@ -886,12 +848,8 @@ J3ObjectHandle* J3ArrayClass::clone(J3Ob return res; } -J3Method* J3ArrayClass::findVirtualMethod(const vmkit::Name* name, J3Signature* signature, bool error) { - return loader()->vm()->objectClass->findVirtualMethod(name, signature, error); -} - -J3Method* J3ArrayClass::findStaticMethod(const vmkit::Name* name, J3Signature* signature, bool error) { - return loader()->vm()->objectClass->findStaticMethod(name, signature, error); +J3Method* J3ArrayClass::findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error) { + return loader()->vm()->objectClass->findMethod(access, name, signature, error); } void J3ArrayClass::doResolve(J3Field* hiddenFields, size_t nbHiddenFields) { 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=198498&r1=198497&r2=198498&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sat Jan 4 09:33:07 2014 @@ -113,7 +113,7 @@ jmethodID JNICALL GetMethodID(JNIEnv* en J3ObjectType* cl = J3ObjectType::nativeClass(clazz); cl->initialise(); vmkit::Names* n = cl->loader()->vm()->names(); - res = cl->findVirtualMethod(n->get(name), cl->loader()->getSignature(cl, n->get(sig))); + res = cl->findMethod(0, n->get(name), cl->loader()->getSignature(cl, n->get(sig))); leaveJVM(); return res; @@ -127,7 +127,7 @@ jmethodID JNICALL GetStaticMethodID(JNIE J3ObjectType* cl = J3ObjectType::nativeClass(clazz); cl->initialise(); vmkit::Names* n = cl->loader()->vm()->names(); - res = cl->findStaticMethod(n->get(name), cl->loader()->getSignature(cl, n->get(sig))); + res = cl->findMethod(J3Cst::ACC_STATIC, n->get(name), cl->loader()->getSignature(cl, n->get(sig))); leaveJVM(); 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=198498&r1=198497&r2=198498&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sat Jan 4 09:33:07 2014 @@ -109,7 +109,7 @@ J3Method* J3Method::resolve(J3ObjectHand if(cl()->loader()->vm()->options()->debugLinking) fprintf(stderr, "virtual linking %s::%s\n", cl()->name()->cStr(), name()->cStr()); vmkit::Names* n = cl()->loader()->vm()->names(); - return obj->vt()->type()->asObjectType()->findVirtualMethod(name(), signature()); + return obj->vt()->type()->asObjectType()->findMethod(0, name(), signature()); } J3Value J3Method::internalInvoke(J3ObjectHandle* handle, J3Value* inArgs) { 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=198498&r1=198497&r2=198498&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Sat Jan 4 09:33:07 2014 @@ -52,7 +52,7 @@ J3VirtualTable* J3VirtualTable::create(J for(uint32_t i=0; inbMethods(); i++) { J3Method* meth = cl->methods()[i]; - J3Method* parent = cl == super ? 0 : super->findVirtualMethod(meth->name(), meth->signature(), 0); + J3Method* parent = cl == super ? 0 : super->findMethod(0, meth->name(), meth->signature(), 0); if(parent) { pm[i] = parent; Modified: vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc?rev=198498&r1=198497&r2=198498&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Sat Jan 4 09:33:07 2014 @@ -36,7 +36,7 @@ void* J3Trampoline::virtualTrampoline(J3 J3ObjectHandle* prev = J3Thread::get()->tell(); J3ObjectHandle* handle = J3Thread::get()->push(obj); J3ObjectType* cl = handle->vt()->type()->asObjectType(); - J3Method* impl = cl == target->cl() ? target : cl->findVirtualMethod(target->name(), target->signature()); + J3Method* impl = cl == target->cl() ? target : cl->findMethod(0, target->name(), target->signature()); impl->ensureCompiled(0); void* res = impl->fnPtr(); From gael.thomas at lip6.fr Sat Jan 4 07:39:28 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 15:39:28 -0000 Subject: [vmkit-commits] [vmkit] r198499 - Eagerly resolve methods in methodAt Message-ID: <20140104153928.8C0992A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 09:39:28 2014 New Revision: 198499 URL: http://llvm.org/viewvc/llvm-project?rev=198499&view=rev Log: Eagerly resolve methods in methodAt Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3class.cc Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=198499&r1=198498&r2=198499&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Sat Jan 4 09:39:28 2014 @@ -27,25 +27,15 @@ void J3Lib::bootstrap(J3* vm) { #define z_signature(id) vm->initialClassLoader->getSignature(0, vm->names()->get(id)) J3Class* threadGroupClass = vm->initialClassLoader->loadClass(vm->names()->get("java/lang/ThreadGroup")); - J3Method* sysThreadGroupInit = vm->initialClassLoader->method(0, - threadGroupClass, - vm->initName, - z_signature("()V")); + J3Method* sysThreadGroupInit = threadGroupClass->findMethod(0, vm->initName, z_signature("()V")); J3ObjectHandle* sysThreadGroup = J3ObjectHandle::doNewObject(threadGroupClass); sysThreadGroupInit->invokeSpecial(sysThreadGroup); - - J3Method* appThreadGroupInit = vm->initialClassLoader->method(0, - threadGroupClass, - vm->initName, - z_signature("(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); + J3Method* appThreadGroupInit = threadGroupClass->findMethod(0, vm->initName, z_signature("(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); J3ObjectHandle* appThreadGroup = J3ObjectHandle::doNewObject(threadGroupClass); appThreadGroupInit->invokeSpecial(appThreadGroup, sysThreadGroup, vm->utfToString("main")); - J3Method* threadInit = vm->initialClassLoader->method(0, - vm->threadClass, - vm->initName, - z_signature("(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); + J3Method* threadInit = vm->threadClass->findMethod(0, vm->initName, z_signature("(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); J3ObjectHandle* mainThread = J3ObjectHandle::doNewObject(vm->threadClass); J3Thread::get()->assocJavaThread(mainThread); @@ -53,10 +43,10 @@ void J3Lib::bootstrap(J3* vm) { threadInit->invokeSpecial(mainThread, appThreadGroup, vm->utfToString("main")); - vm->initialClassLoader->method(J3Cst::ACC_STATIC, - vm->initialClassLoader->loadClass(vm->names()->get("java/lang/System")), - vm->names()->get("initializeSystemClass"), - z_signature("()V"))->invokeStatic(); + vm->initialClassLoader + ->loadClass(vm->names()->get("java/lang/System")) + ->findMethod(J3Cst::ACC_STATIC, vm->names()->get("initializeSystemClass"), z_signature("()V")) + ->invokeStatic(); J3Thread::get()->restore(prev); } 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=198499&r1=198498&r2=198499&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sat Jan 4 09:39:28 2014 @@ -99,7 +99,7 @@ void J3::run() { clinitSign = initialClassLoader->getSignature(0, clinitSignName); #define z_class(clName) initialClassLoader->loadClass(names()->get(clName)) -#define z_method(access, cl, name, signature) initialClassLoader->method(access, cl, name, initialClassLoader->getSignature(cl, signature)) +#define z_method(access, cl, name, signature) cl->findMethod(access, name, initialClassLoader->getSignature(cl, signature)) #define z_field(access, cl, name, type) cl->findField(access, names()->get(name), type) 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=198499&r1=198498&r2=198499&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sat Jan 4 09:39:28 2014 @@ -712,7 +712,7 @@ J3Method* J3Class::interfaceOrMethodAt(u if(!signature) ctpResolved[idx] = signature = loader()->getSignature(this, nameAt(ctpValues[ntIdx] & 0xffff)); - res = loader()->method(access, cl, name, signature); + res = cl->findMethod(access, name, signature); ctpResolved[idx] = res; From gael.thomas at lip6.fr Sat Jan 4 07:43:59 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 15:43:59 -0000 Subject: [vmkit-commits] [vmkit] r198500 - Remove the useless method map from class loaders Message-ID: <20140104154359.9FFA12A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 09:43:59 2014 New Revision: 198500 URL: http://llvm.org/viewvc/llvm-project?rev=198500&view=rev Log: Remove the useless method map from class loaders Modified: vmkit/branches/mcjit/include/j3/j3classloader.h vmkit/branches/mcjit/lib/j3/vm/j3class.cc vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=198500&r1=198499&r2=198500&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Sat Jan 4 09:43:59 2014 @@ -25,21 +25,13 @@ namespace j3 { class J3Class; class J3ClassLoader : public vmkit::CompilationUnit { - struct J3MethodLess { - bool operator()(const J3Method* lhs, const J3Method* rhs) const; - }; - struct J3InterfaceMethodLess { bool operator()(const J3Method* lhs, const J3Method* rhs) const; }; - typedef std::map > > MethodRefMap; - typedef std::map > > InterfaceMethodRefMap; - static J3MethodLess j3MethodLess; static J3InterfaceMethodLess j3InterfaceMethodLess; J3ObjectHandle* _javaClassLoader; @@ -54,9 +46,6 @@ namespace j3 { pthread_mutex_t _mutexInterfaces; InterfaceMethodRefMap interfaces; - pthread_mutex_t _mutexMethods; - MethodRefMap methods; /* all te known method */ - pthread_mutex_t _mutexMethodTypes; vmkit::NameMap::map methodTypes; @@ -79,9 +68,6 @@ namespace j3 { J3* vm() const { return (J3*)vmkit::CompilationUnit::vm(); }; - J3Method* method(uint16_t access, J3ObjectType* cl, - const vmkit::Name* name, J3Signature* signature); - J3Class* defineClass(const vmkit::Name* name, J3ClassBytes* bytes); J3Class* findLoadedClass(const vmkit::Name* name); virtual J3Class* loadClass(const vmkit::Name* name); 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=198500&r1=198499&r2=198500&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sat Jan 4 09:43:59 2014 @@ -580,8 +580,8 @@ void J3Class::readClassBytes(J3Field* hi for(size_t i=0; imethod(access, this, name, loader()->getSignature(this, signature)); + J3Signature* signature = loader()->getSignature(this, nameAt(reader.readU2())); + J3Method* method = new(loader()->allocator()) J3Method(access, this, name, signature); J3Attributes* attributes = readAttributes(&reader); method->postInitialise(access, attributes); 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=198500&r1=198499&r2=198500&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sat Jan 4 09:43:59 2014 @@ -18,7 +18,6 @@ using namespace j3; -J3ClassLoader::J3MethodLess J3ClassLoader::j3MethodLess; J3ClassLoader::J3InterfaceMethodLess J3ClassLoader::j3InterfaceMethodLess; J3ClassLoader::J3ClassLoader(J3* v, J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator) @@ -27,7 +26,6 @@ J3ClassLoader::J3ClassLoader(J3* v, J3Ob classes(vmkit::Name::less, allocator), types(vmkit::Name::less, allocator), interfaces(j3InterfaceMethodLess, allocator), - methods(j3MethodLess, allocator), methodTypes(vmkit::Name::less, allocator), nativeLibraries(allocator) { _javaClassLoader = javaClassLoader; @@ -35,7 +33,6 @@ J3ClassLoader::J3ClassLoader(J3* v, J3Ob pthread_mutex_init(&_mutexClasses, 0); pthread_mutex_init(&_mutexTypes, 0); pthread_mutex_init(&_mutexInterfaces, 0); - pthread_mutex_init(&_mutexMethods, 0); pthread_mutex_init(&_mutexMethodTypes, 0); } @@ -194,44 +191,12 @@ J3Signature* J3ClassLoader::getSignature return res; } -J3Method* J3ClassLoader::method(uint16_t access, J3ObjectType* type, const vmkit::Name* name, J3Signature* signature) { - if(type->isArrayClass()) - return method(access, vm()->objectClass, name, signature); - else { - J3Class* cl = type->asClass(); - J3Method method(access, cl, name, signature), *res; - - pthread_mutex_lock(&_mutexMethods); - std::map::iterator it = methods.find(&method); - - if(it == methods.end()) { - res = new(allocator()) J3Method(access, cl, name, signature); - methods[res] = res; - } else { - res = it->second; - } - pthread_mutex_unlock(&_mutexMethods); - - return res; - } -} - bool J3ClassLoader::J3InterfaceMethodLess::operator()(j3::J3Method const* lhs, j3::J3Method const* rhs) const { return lhs->name() < rhs->name() || (lhs->name() == rhs->name() && (lhs->signature() < rhs->signature())); } -bool J3ClassLoader::J3MethodLess::operator()(j3::J3Method const* lhs, j3::J3Method const* rhs) const { - return lhs->name() < rhs->name() - || (lhs->name() == rhs->name() - && (lhs->signature() < rhs->signature() - || (lhs->signature() == rhs->signature() - && (lhs->cl() < rhs->cl() - || (lhs->cl() == rhs->cl() - && ((lhs->access() & J3Cst::ACC_STATIC) < (rhs->access() & J3Cst::ACC_STATIC))))))); -} - J3InitialClassLoader::J3InitialClassLoader(J3* v, const char* rtjar, vmkit::BumpAllocator* _alloc) : J3ClassLoader(v, 0, _alloc) { const char* archives = vm()->options()->rtJar; From gael.thomas at lip6.fr Sat Jan 4 07:48:47 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 15:48:47 -0000 Subject: [vmkit-commits] [vmkit] r198501 - Remove the isResolved function from J3Method. Directly use the method index in the generated code. Message-ID: <20140104154847.40D7B2A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 09:48:46 2014 New Revision: 198501 URL: http://llvm.org/viewvc/llvm-project?rev=198501&view=rev Log: Remove the isResolved function from J3Method. Directly use the method index in the generated code. Modified: vmkit/branches/mcjit/include/j3/j3method.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 Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=198501&r1=198500&r2=198501&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Sat Jan 4 09:48:46 2014 @@ -77,13 +77,11 @@ namespace j3 { char* llvmStubName(J3Class* from=0); void postInitialise(uint32_t access, J3Attributes* attributes); - void setResolved(uint32_t index); + void setIndex(uint32_t index); J3Method* resolve(J3ObjectHandle* obj); uint32_t index(); - uint32_t* indexPtr() { return &_index; } - bool isResolved() { return _index != -1; } J3Attributes* attributes() const { return _attributes; } uint16_t access() const { return _access; } 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=198501&r1=198500&r2=198501&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 4 09:48:46 2014 @@ -48,7 +48,6 @@ jobject JNICALL JVM_Clone(JNIEnv* env, j enterJVM(); res = obj->vt()->type()->asObjectType()->clone(obj); leaveJVM(); - NYI(); return res; } 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=198501&r1=198500&r2=198501&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sat Jan 4 09:48:46 2014 @@ -587,12 +587,10 @@ void J3Class::readClassBytes(J3Field* hi method->postInitialise(access, attributes); methodsTmp[i] = method; - if(J3Cst::isStatic(access)) { + if(J3Cst::isStatic(access)) nbStaticMethods++; - method->setResolved(0); - } else { + else nbVirtualMethods++; - } } staticLayout()->_methods = (J3Method**)loader()->allocator()->allocate(sizeof(J3Method*)*nbStaticMethods); 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=198501&r1=198500&r2=198501&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sat Jan 4 09:48:46 2014 @@ -424,12 +424,7 @@ void J3CodeGen::invokeInterface(uint32_t void J3CodeGen::invokeVirtual(uint32_t idx) { J3Method* target = cl->methodAt(idx, 0); J3Signature* type = target->signature(); - llvm::Value* funcEntry; - - if(target->isResolved()) - funcEntry = builder->getInt32(target->index()); - else - funcEntry = builder->CreateCall(funcJ3MethodIndex, methodDescriptor(target)); + llvm::Value* funcEntry = funcEntry = builder->getInt32(target->index()); llvm::Value* obj = nullCheck(stack.top(type->nbIns())); llvm::Value* gepFunc[] = { builder->getInt32(0), 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=198501&r1=198500&r2=198501&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sat Jan 4 09:48:46 2014 @@ -55,15 +55,7 @@ J3Signature::function_t J3Method::cxxCal void J3Method::ensureCompiled(bool withCaller) { if(!fnPtr() || (withCaller && !cxxCaller())) { // fprintf(stderr, "materializing: %s::%s%s\n", this, cl()->name()->cStr(), name()->cStr(), signature()->cStr()); - if(!isResolved()) { - if(cl()->loader()->vm()->options()->debugLinking) - fprintf(stderr, "linking %s::%s\n", cl()->name()->cStr(), name()->cStr()); - - cl()->initialise(); - if(!isResolved()) - J3::noSuchMethodError("unable to find method", cl(), name(), signature()); - } - + cl()->initialise(); J3CodeGen::translate(this, !fnPtr(), withCaller); } } @@ -92,9 +84,7 @@ void* J3Method::getSymbolAddress() { return this; } -void J3Method::setResolved(uint32_t index) { - if(isResolved()) - J3::internalError("trying to re-resolve a resolved method, should not happen"); +void J3Method::setIndex(uint32_t index) { _index = index; } 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=198501&r1=198500&r2=198501&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Sat Jan 4 09:48:46 2014 @@ -56,10 +56,10 @@ J3VirtualTable* J3VirtualTable::create(J if(parent) { pm[i] = parent; - meth->setResolved(parent->index()); + meth->setIndex(parent->index()); } else { pm[i] = meth; - meth->setResolved(n); + meth->setIndex(n); n++; } } From gael.thomas at lip6.fr Sat Jan 4 09:40:06 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 17:40:06 -0000 Subject: [vmkit-commits] [vmkit] r198504 - Implement some JVM interface functions Message-ID: <20140104174006.E49472A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 11:40:06 2014 New Revision: 198504 URL: http://llvm.org/viewvc/llvm-project?rev=198504&view=rev Log: Implement some JVM interface functions Modified: vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3class.cc vmkit/branches/mcjit/lib/j3/vm/j3jni.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198504&r1=198503&r2=198504&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Sat Jan 4 11:40:06 2014 @@ -125,7 +125,6 @@ namespace j3 { J3InterfaceSlotDescriptor* slotDescriptorAt(uint32_t index) { return &_interfaceSlotDescriptors[index]; } void prepareInterfaceTable(); - virtual J3Method* findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error=1); bool isObjectType() { return 1; } @@ -133,7 +132,11 @@ namespace j3 { void dumpInterfaceSlotDescriptors(); + virtual J3Method* findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error=1); virtual J3ObjectHandle* clone(J3ObjectHandle* obj); + virtual uint16_t access(); + virtual uint16_t modifiers(); + virtual J3Class* super(); }; class J3Layout : public J3ObjectType { @@ -232,6 +235,7 @@ namespace j3 { J3Class** interfaces() { return _interfaces; } J3Class* super() { return _super; } uint16_t access() { return _access; } + uint16_t modifiers(); J3ObjectHandle* staticInstance(); @@ -275,6 +279,10 @@ namespace j3 { bool isArrayClass() { return 1; } J3Method* findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error=1); + + uint16_t access(); + uint16_t modifiers(); + J3Class* super(); }; class J3Primitive : public J3Type { Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=198504&r1=198503&r2=198504&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Sat Jan 4 11:40:06 2014 @@ -62,6 +62,7 @@ namespace j3 { uint32_t slot() { return _slot; } + static J3Method* nativeMethod(J3ObjectHandle* handle); J3ObjectHandle* javaMethod(); void* nativeFnPtr() { return _nativeFnPtr; } 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=198504&r1=198503&r2=198504&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 4 11:40:06 2014 @@ -401,7 +401,14 @@ jclass JNICALL JVM_DefineClassWithSource * Reflection support functions */ -jstring JNICALL JVM_GetClassName(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } +jstring JNICALL JVM_GetClassName(JNIEnv* env, jclass cls) { + jstring res; + enterJVM(); + res = J3Thread::get()->vm()->nameToString(J3ObjectType::nativeClass(cls)->name()); + leaveJVM(); + return res; +} + jobjectArray JNICALL JVM_GetClassInterfaces(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } jobject JNICALL JVM_GetClassLoader(JNIEnv* env, jclass cls) { enterJVM(); @@ -425,7 +432,14 @@ jobject JNICALL JVM_GetProtectionDomain( jboolean JNICALL JVM_IsArrayClass(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } jboolean JNICALL JVM_IsPrimitiveClass(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } jclass JNICALL JVM_GetComponentType(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_GetClassModifiers(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_GetClassModifiers(JNIEnv* env, jclass cls) { + jint res; + enterJVM(); + res = J3ObjectType::nativeClass(cls)->modifiers(); + leaveJVM(); + return res; +} + jobjectArray JNICALL JVM_GetDeclaredClasses(JNIEnv* env, jclass ofClass) { enterJVM(); NYI(); leaveJVM(); } jclass JNICALL JVM_GetDeclaringClass(JNIEnv* env, jclass ofClass) { enterJVM(); NYI(); leaveJVM(); } @@ -502,7 +516,13 @@ jobjectArray JNICALL JVM_GetClassDeclare present) to find the source-level access flags. Only the values of the low 13 bits (i.e., a mask of 0x1FFF) are guaranteed to be valid. */ -jint JNICALL JVM_GetClassAccessFlags(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_GetClassAccessFlags(JNIEnv* env, jclass cls) { + jint res; + enterJVM(); + res = J3ObjectType::nativeClass(cls)->access(); + leaveJVM(); + return res; +} /* The following two reflection routines are still needed due to startup time issues */ /* @@ -513,7 +533,16 @@ jobject JNICALL JVM_InvokeMethod(JNIEnv* /* * java.lang.reflect.Constructor */ -jobject JNICALL JVM_NewInstanceFromConstructor(JNIEnv* env, jobject c, jobjectArray args0) { enterJVM(); NYI(); leaveJVM(); } +jobject JNICALL JVM_NewInstanceFromConstructor(JNIEnv* env, jobject c, jobjectArray args0) { + enterJVM(); + J3Method* cons = J3Method::nativeMethod(c); + jobject res = J3ObjectHandle::doNewObject(cons->cl()); + if(cons->signature()->nbIns()) + J3::internalError("implement me: JVM_NewInstanceFromConstructor with arguments"); + cons->invokeSpecial(res); + leaveJVM(); + return res; +} /* * Constant pool access; currently used to implement reflective access to annotations (JDK 1.5) 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=198504&r1=198503&r2=198504&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sat Jan 4 11:40:06 2014 @@ -180,6 +180,18 @@ J3ObjectHandle* J3ObjectType::clone(J3Ob J3::internalError("should not happen"); } +uint16_t J3ObjectType::access() { + J3::internalError("should not happen"); +} + +uint16_t J3ObjectType::modifiers() { + J3::internalError("should not happen"); +} + +J3Class* J3ObjectType::super() { + J3::internalError("should not happen"); +} + void J3ObjectType::prepareInterfaceTable() { //fprintf(stderr, "prepare interface table of %s\n", name()->cStr()); @@ -296,6 +308,16 @@ J3Class::J3Class(J3ClassLoader* loader, status = LOADED; } +uint16_t J3Class::modifiers() { + return access(); +#if 0 + if (isEnum(res) && cl->getSuper() != vm->upcalls->EnumClass) { + // javac may put that flag to inner classes of enum classes. + res &= ~ACC_ENUM; + } +#endif +} + J3ObjectHandle* J3Class::clone(J3ObjectHandle* obj) { J3ObjectHandle* res = J3ObjectHandle::doNewObject(this); obj->rawObjectCopyTo(0, res, 0, structSize()); @@ -846,8 +868,20 @@ J3ObjectHandle* J3ArrayClass::clone(J3Ob return res; } +uint16_t J3ArrayClass::access() { + return super()->access(); +} + +uint16_t J3ArrayClass::modifiers() { + return super()->modifiers(); +} + +J3Class* J3ArrayClass::super() { + return loader()->vm()->objectClass; +} + J3Method* J3ArrayClass::findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error) { - return loader()->vm()->objectClass->findMethod(access, name, signature, error); + return super()->findMethod(access, name, signature, error); } void J3ArrayClass::doResolve(J3Field* hiddenFields, size_t nbHiddenFields) { 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=198504&r1=198503&r2=198504&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sat Jan 4 11:40:06 2014 @@ -37,7 +37,15 @@ jfieldID JNICALL FromReflectedField(JNIE jobject JNICALL ToReflectedMethod(JNIEnv* env, jclass cls, jmethodID methodID, jboolean isStatic) { enterJVM(); leaveJVM(); NYI(); } -jclass JNICALL GetSuperclass(JNIEnv* env, jclass sub) { enterJVM(); leaveJVM(); NYI(); } +jclass JNICALL GetSuperclass(JNIEnv* env, jclass sub) { + jclass res; + enterJVM(); + J3ObjectType* cl = J3ObjectType::nativeClass(sub); + res = J3Thread::get()->vm()->objectClass ? 0 : cl->javaClass(); + leaveJVM(); + return res; +} + jboolean JNICALL IsAssignableFrom(JNIEnv* env, jclass sub, jclass sup) { enterJVM(); leaveJVM(); NYI(); } jobject JNICALL ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID, jboolean isStatic) { enterJVM(); leaveJVM(); NYI(); } 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=198504&r1=198503&r2=198504&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sat Jan 4 11:40:06 2014 @@ -247,6 +247,19 @@ void J3Method::registerNative(void* fnPt _nativeFnPtr = fnPtr; } +J3Method* J3Method::nativeMethod(J3ObjectHandle* handle) { + J3* vm = J3Thread::get()->vm(); + if(handle->vt()->type() == vm->constructorClass) { + J3Class* cl = J3ObjectType::nativeClass(handle->getObject(vm->constructorClassClass))->asClass(); + uint32_t slot = handle->getInteger(vm->constructorClassSlot); + J3Method* res = cl->methods()[slot]; + if(res->name() != vm->initName) + J3::internalError("nativeName with a java.lang.reflect.Constructor with a non-constructot method"); + return res; + } else + J3::internalError("implement me: nativeMethod with method"); +} + J3ObjectHandle* J3Method::javaMethod() { if(!_javaMethod) { cl()->lock(); From gael.thomas at lip6.fr Sat Jan 4 09:44:35 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 17:44:35 -0000 Subject: [vmkit-commits] [vmkit] r198506 - Implement jni->newObject* Message-ID: <20140104174435.AA6FA2A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 11:44:35 2014 New Revision: 198506 URL: http://llvm.org/viewvc/llvm-project?rev=198506&view=rev Log: Implement jni->newObject* Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3jni.cc 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=198506&r1=198505&r2=198506&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 4 11:44:35 2014 @@ -534,9 +534,10 @@ jobject JNICALL JVM_InvokeMethod(JNIEnv* * java.lang.reflect.Constructor */ jobject JNICALL JVM_NewInstanceFromConstructor(JNIEnv* env, jobject c, jobjectArray args0) { + jobject res; enterJVM(); J3Method* cons = J3Method::nativeMethod(c); - jobject res = J3ObjectHandle::doNewObject(cons->cl()); + res = J3ObjectHandle::doNewObject(cons->cl()); if(cons->signature()->nbIns()) J3::internalError("implement me: JVM_NewInstanceFromConstructor with arguments"); cons->invokeSpecial(res); 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=198506&r1=198505&r2=198506&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sat Jan 4 11:44:35 2014 @@ -98,9 +98,34 @@ jint JNICALL EnsureLocalCapacity(JNIEnv* } jobject JNICALL AllocObject(JNIEnv* env, jclass clazz) { enterJVM(); leaveJVM(); NYI(); } -jobject JNICALL NewObject(JNIEnv* env, jclass clazz, jmethodID methodID, ...) { enterJVM(); leaveJVM(); NYI(); } -jobject JNICALL NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID, va_list args) { enterJVM(); leaveJVM(); NYI(); } -jobject JNICALL NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID, const jvalue* args) { enterJVM(); leaveJVM(); NYI(); } +jobject JNICALL NewObject(JNIEnv* env, jclass clazz, jmethodID methodID, ...) { + jobject res; + enterJVM(); + va_list va; + va_start(va, methodID); + res = env->NewObjectV(clazz, methodID, va); + va_end(va); + leaveJVM(); + return res; +} + +jobject JNICALL NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID, va_list args) { + jobject res; + enterJVM(); + res = J3ObjectHandle::doNewObject(methodID->cl()); + methodID->invokeSpecial(res, args); + leaveJVM(); + return res; +} + +jobject JNICALL NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID, const jvalue* args) { + jobject res; + enterJVM(); + res = J3ObjectHandle::doNewObject(methodID->cl()); + methodID->invokeSpecial(res, args); + leaveJVM(); + return res; +} jclass JNICALL GetObjectClass(JNIEnv* env, jobject obj) { jclass res; From gael.thomas at lip6.fr Sat Jan 4 09:54:32 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 17:54:32 -0000 Subject: [vmkit-commits] [vmkit] r198507 - Implements some bytecode. Only 13 bytecodes are still missing. Message-ID: <20140104175432.2A7EA2A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 11:54:31 2014 New Revision: 198507 URL: http://llvm.org/viewvc/llvm-project?rev=198507&view=rev Log: Implements some bytecode. Only 13 bytecodes are still missing. Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc 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=198507&r1=198506&r2=198507&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sat Jan 4 11:54:31 2014 @@ -1144,6 +1144,7 @@ void J3CodeGen::translate() { break; case J3Cst::BC_pop2: nyi(); /* 0x58 */ + case J3Cst::BC_dup: /* 0x59 */ stack.push(stack.top()); break; @@ -1289,24 +1290,53 @@ void J3CodeGen::translate() { stack.push(builder->CreateSIToFP(stack.pop(), vm->typeDouble->llvmType())); break; - case J3Cst::BC_l2i: nyi(); /* 0x88 */ - case J3Cst::BC_l2f: nyi(); /* 0x89 */ - case J3Cst::BC_l2d: nyi(); /* 0x8a */ + case J3Cst::BC_l2i: /* 0x88 */ + stack.push(builder->CreateTruncOrBitCast(stack.pop(), builder->getInt32Ty())); + break; + + case J3Cst::BC_l2f: /* 0x89 */ + stack.push(builder->CreateSIToFP(stack.pop(), vm->typeFloat->llvmType())); + break; + + case J3Cst::BC_l2d: /* 0x8a */ + stack.push(builder->CreateSIToFP(stack.pop(), vm->typeDouble->llvmType())); + break; + case J3Cst::BC_f2i: /* 0x8b */ floatToInteger(vm->typeFloat, vm->typeInteger); break; - case J3Cst::BC_f2l: nyi(); /* 0x8c */ - case J3Cst::BC_f2d: nyi(); /* 0x8d */ - case J3Cst::BC_d2i: nyi(); /* 0x8e */ - case J3Cst::BC_d2l: nyi(); /* 0x8f */ - case J3Cst::BC_d2f: nyi(); /* 0x90 */ - case J3Cst::BC_i2b: nyi(); /* 0x91 */ + case J3Cst::BC_f2l: /* 0x8c */ + floatToInteger(vm->typeFloat, vm->typeLong); + break; + + case J3Cst::BC_f2d: /* 0x8d */ + stack.push(builder->CreateFPExt(stack.pop(), vm->typeDouble->llvmType())); + break; + + case J3Cst::BC_d2i: /* 0x8e */ + floatToInteger(vm->typeDouble, vm->typeInteger); + break; + + case J3Cst::BC_d2l: /* 0x8f */ + floatToInteger(vm->typeDouble, vm->typeLong); + break; + + case J3Cst::BC_d2f: /* 0x90 */ + stack.push(builder->CreateFPTrunc(stack.pop(), vm->typeFloat->llvmType())); + break; + + case J3Cst::BC_i2b: /* 0x91 */ + stack.push(builder->CreateSExt(builder->CreateTrunc(stack.pop(), builder->getInt8Ty()), builder->getInt32Ty())); + break; + case J3Cst::BC_i2c: /* 0x92 */ stack.push(builder->CreateZExt(builder->CreateTrunc(stack.pop(), builder->getInt16Ty()), builder->getInt32Ty())); break; - case J3Cst::BC_i2s: nyi(); /* 0x93 */ + case J3Cst::BC_i2s: /* 0x93 */ + stack.push(builder->CreateSExt(builder->CreateTrunc(stack.pop(), builder->getInt16Ty()), builder->getInt32Ty())); + break; case J3Cst::BC_lcmp: /* 0x94 */ compareLong(); From gael.thomas at lip6.fr Sat Jan 4 10:06:00 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 18:06:00 -0000 Subject: [vmkit-commits] [vmkit] r198508 - define a InitProperties function, however, I don't define any property for the moment. Message-ID: <20140104180600.179E92A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 12:05:59 2014 New Revision: 198508 URL: http://llvm.org/viewvc/llvm-project?rev=198508&view=rev Log: define a InitProperties function, however, I don't define any property for the moment. Modified: vmkit/branches/mcjit/include/j3/j3object.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Modified: vmkit/branches/mcjit/include/j3/j3object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=198508&r1=198507&r2=198508&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3object.h (original) +++ vmkit/branches/mcjit/include/j3/j3object.h Sat Jan 4 12:05:59 2014 @@ -43,7 +43,7 @@ namespace j3 { friend class J3Trampoline; public: - static const uint32_t nbInterfaceMethodTable = 41; + static const uint32_t nbInterfaceMethodTable = 117;//41; static const uint32_t gepObjectClass = 0; static const uint32_t gepInterfaceMethods = 2; static const uint32_t gepVirtualMethods = 4; 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=198508&r1=198507&r2=198508&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 4 12:05:59 2014 @@ -102,7 +102,50 @@ void JNICALL JVM_ArrayCopy(JNIEnv* env, leaveJVM(); } -jobject JNICALL JVM_InitProperties(JNIEnv* env, jobject p) { enterJVM(); NYI(); leaveJVM(); } +jobject JNICALL JVM_InitProperties(JNIEnv* env, jobject p) { + enterJVM(); +#if 0 + /* + *
java.version
Java version number + *
java.vendor
Java vendor specific string + *
java.vendor.url
Java vendor URL + *
java.home
Java installation directory + *
java.class.version
Java class version number + *
java.class.path
Java classpath + *
os.name
Operating System Name + *
os.arch
Operating System Architecture + *
os.version
Operating System Version + *
file.separator
File separator ("/" on Unix) + *
path.separator
Path separator (":" on Unix) + *
line.separator
Line separator ("\n" on Unix) + *
user.name
User account name + *
user.home
User home directory + *
user.dir
User's current working directory + */ + JavaObject * prop = *(JavaObject**)p; + llvm_gcroot(prop, 0); + setProperties(prop); + setCommandLineProperties(prop); + + Jnjvm* vm = JavaThread::get()->getJVM(); + const char * tmp = getenv("JAVA_COMPILER"); + if (tmp) + setProperty(vm, prop, "java.compiler", tmp); + + // Override properties to indicate java version 1.6 + setProperty(vm, prop, "java.specification.version", "1.6"); + setProperty(vm, prop, "java.version", "1.6"); + setProperty(vm, prop, "java.runtime.version", "1.6"); + + // Set additional path properties + // For now, ignore JAVA_HOME. We don't want to be using a location + // other than the one we precompiled against anyway. + setProperty(vm, prop, "java.home", OpenJDKJRE); + setProperty(vm, prop, "java.ext.dirs", OpenJDKExtDirs); +#endif + leaveJVM(); + return p; +} /* * java.io.File 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=198508&r1=198507&r2=198508&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sat Jan 4 12:05:59 2014 @@ -43,6 +43,7 @@ uint32_t J3ClassLoader::interfaceIndex(J if(it == interfaces.end()) { res = interfaces.size(); + fprintf(stderr, " new interface: %s::%s%s ---> %d\n", method->cl()->name()->cStr(), method->name()->cStr(), method->signature()->name()->cStr(), res); interfaces[method] = res; } else { res = it->second; Modified: vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc?rev=198508&r1=198507&r2=198508&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Sat Jan 4 12:05:59 2014 @@ -20,7 +20,7 @@ void* J3Trampoline::interfaceTrampoline( res = desc->methods[0]->fnPtr(); handle->vt()->_interfaceMethodTable[index] = res; } else - J3::internalError("implement me: interface Trampoline with collision"); + J3::internalError("implement me: interface Trampoline with collision: %d", desc->nbMethods); J3Thread::get()->restore(prev); From gael.thomas at lip6.fr Sat Jan 4 10:10:56 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 18:10:56 -0000 Subject: [vmkit-commits] [vmkit] r198509 - Don't add the same interface method twice. Message-ID: <20140104181056.42BDF2A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 12:10:55 2014 New Revision: 198509 URL: http://llvm.org/viewvc/llvm-project?rev=198509&view=rev Log: Don't add the same interface method twice. Modified: vmkit/branches/mcjit/include/j3/j3object.h vmkit/branches/mcjit/lib/j3/vm/j3class.cc vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Modified: vmkit/branches/mcjit/include/j3/j3object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=198509&r1=198508&r2=198509&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3object.h (original) +++ vmkit/branches/mcjit/include/j3/j3object.h Sat Jan 4 12:10:55 2014 @@ -43,7 +43,7 @@ namespace j3 { friend class J3Trampoline; public: - static const uint32_t nbInterfaceMethodTable = 117;//41; + static const uint32_t nbInterfaceMethodTable = 41; static const uint32_t gepObjectClass = 0; static const uint32_t gepInterfaceMethods = 2; static const uint32_t gepVirtualMethods = 4; 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=198509&r1=198508&r2=198509&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sat Jan 4 12:10:55 2014 @@ -215,13 +215,21 @@ void J3ObjectType::prepareInterfaceTable if(!method) method = base; - total++; uint32_t index = base->interfaceIndex() % J3VirtualTable::nbInterfaceMethodTable; - J3Method** tmp = (J3Method**)alloca(sizeof(J3Method*)*(slots[index].nbMethods+1)); - memcpy(tmp, slots[index].methods, sizeof(J3Method*)*slots[index].nbMethods); - tmp[slots[index].nbMethods] = method; - slots[index].methods = tmp; - slots[index].nbMethods++; + uint32_t found = 0; + + for(uint32_t i=0; !found && i %d\n", method->cl()->name()->cStr(), method->name()->cStr(), method->signature()->name()->cStr(), res); + // fprintf(stderr, " new interface: %s::%s%s ---> %d\n", method->cl()->name()->cStr(), method->name()->cStr(), method->signature()->name()->cStr(), res); interfaces[method] = res; } else { res = it->second; Modified: vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc?rev=198509&r1=198508&r2=198509&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Sat Jan 4 12:10:55 2014 @@ -19,8 +19,12 @@ void* J3Trampoline::interfaceTrampoline( desc->methods[0]->ensureCompiled(0); res = desc->methods[0]->fnPtr(); handle->vt()->_interfaceMethodTable[index] = res; - } else + } else { + for(uint32_t i=0; inbMethods; i++) + fprintf(stderr, " method: %s::%s%s\n", desc->methods[i]->cl()->name()->cStr(), + desc->methods[i]->name()->cStr(), desc->methods[i]->signature()->name()->cStr()); J3::internalError("implement me: interface Trampoline with collision: %d", desc->nbMethods); + } J3Thread::get()->restore(prev); From gael.thomas at lip6.fr Sat Jan 4 10:29:58 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 18:29:58 -0000 Subject: [vmkit-commits] [vmkit] r198510 - Fix a bug in instanceof: if obj is null, return 0. Execute now more than 60000 bytecodes :) Message-ID: <20140104182958.9ED3D2A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 12:29:58 2014 New Revision: 198510 URL: http://llvm.org/viewvc/llvm-project?rev=198510&view=rev Log: Fix a bug in instanceof: if obj is null, return 0. Execute now more than 60000 bytecodes :) Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc 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=198510&r1=198509&r2=198510&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 4 12:29:58 2014 @@ -124,6 +124,72 @@ jobject JNICALL JVM_InitProperties(JNIEn */ JavaObject * prop = *(JavaObject**)p; llvm_gcroot(prop, 0); + + setProperty(vm, prop, "java.vm.specification.version", "1.0"); + setProperty(vm, prop, "java.vm.specification.vendor", + "Sun Microsystems, Inc"); + setProperty(vm, prop, "java.vm.specification.name", + "Java Virtual Machine Specification"); + setProperty(vm, prop, "java.specification.version", "1.5"); + setProperty(vm, prop, "java.specification.vendor", "Sun Microsystems, Inc"); + setProperty(vm, prop, "java.specification.name", + "Java Platform API Specification"); + setProperty(vm, prop, "java.version", "1.5"); + setProperty(vm, prop, "java.runtime.version", "1.5"); + setProperty(vm, prop, "java.vendor", "The VMKit Project"); + setProperty(vm, prop, "java.vendor.url", "http://vmkit.llvm.org"); + + tmp = getenv("JAVA_HOME"); + if (!tmp) tmp = ""; + setProperty(vm, prop, "java.home", tmp); + + JnjvmBootstrapLoader* JCL = vm->bootstrapLoader; + setProperty(vm, prop, "java.class.version", "49.0"); + setProperty(vm, prop, "java.class.path", vm->classpath); + setProperty(vm, prop, "java.boot.class.path", JCL->bootClasspathEnv); + setProperty(vm, prop, "sun.boot.class.path", JCL->bootClasspathEnv); + setProperty(vm, prop, "java.vm.version", "0.28"); + setProperty(vm, prop, "java.vm.vendor", "The VMKit Project"); + setProperty(vm, prop, "java.vm.name", "J3"); + setProperty(vm, prop, "java.specification.version", "1.5"); + setProperty(vm, prop, "java.io.tmpdir", "/tmp"); + + + setProperty(vm, prop, "build.compiler", "gcj"); + setProperty(vm, prop, "gcj.class.path", JCL->bootClasspathEnv); + setProperty(vm, prop, "gnu.classpath.boot.library.path", + JCL->libClasspathEnv); + //setProperty(vm, prop, "java.library.path", TODO: getenv("LD_LIBRARY_PATH")) + setProperty(vm, prop, "sun.boot.library.path", JCL->libClasspathEnv); + + // Align behavior with GNU Classpath for now, to pass mauve test + setProperty(vm, prop, "sun.lang.ClassLoader.allowArraySyntax", "true"); + + setUnameProp(vm, prop); + + setProperty(vm, prop, "file.separator", vm->dirSeparator); + setProperty(vm, prop, "path.separator", vm->envSeparator); + setProperty(vm, prop, "line.separator", "\n"); + + tmp = getenv("USERNAME"); + if (!tmp) tmp = getenv("LOGNAME"); + if (!tmp) tmp = getenv("NAME"); + if (!tmp) tmp = ""; + setProperty(vm, prop, "user.name", tmp); + + tmp = getenv("HOME"); + if (!tmp) tmp = ""; + setProperty(vm, prop, "user.home", tmp); + + tmp = getenv("PWD"); + if (!tmp) tmp = ""; + setProperty(vm, prop, "user.dir", tmp); + + // Disable this property. The Classpath iconv implementation is really + // not optimized (it over-abuses JNI calls). + //setProperty(vm, prop, "gnu.classpath.nio.charset.provider.iconv", "true"); + setProperty(vm, prop, "file.encoding", "ISO8859_1"); + setProperty(vm, prop, "gnu.java.util.zoneinfo.dir", "/usr/share/zoneinfo"); setProperties(prop); setCommandLineProperties(prop); 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=198510&r1=198509&r2=198510&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sat Jan 4 12:29:58 2014 @@ -433,17 +433,6 @@ void J3CodeGen::invokeVirtual(uint32_t i llvm::Value* func = builder->CreateBitCast(builder->CreateLoad(builder->CreateGEP(vt(obj), gepFunc)), target->signature()->functionType(target->access())->getPointerTo()); - char buf[65536]; snprintf(buf, 65536, "%s::%s%s", - target->cl()->name()->cStr(), - target->name()->cStr(), - target->signature()->name()->cStr()); - builder->CreateCall5(funcEchoDebugExecute, - builder->getInt32(2), - buildString("Invoking %s %p::%d\n"), - buildString(buf), - vt(obj), - funcEntry); - invoke(0, target, func); } @@ -600,13 +589,13 @@ llvm::Value* J3CodeGen::isAssignableTo(l void J3CodeGen::instanceof(llvm::Value* obj, J3ObjectType* type) { llvm::BasicBlock* after = forwardBranch("instanceof-after", codeReader->tell(), 0, 0); - llvm::BasicBlock* ok = newBB("instanceof-ok"); + llvm::BasicBlock* nok = newBB("instanceof-null"); llvm::BasicBlock* test = newBB("instanceof"); - builder->CreateCondBr(builder->CreateIsNull(obj), ok, test); + builder->CreateCondBr(builder->CreateIsNull(obj), nok, test); - builder->SetInsertPoint(ok); - stack.push(builder->getInt32(1)); + builder->SetInsertPoint(nok); + stack.push(builder->getInt32(0)); builder->CreateBr(after); stack.drop(1); From gael.thomas at lip6.fr Sat Jan 4 13:50:34 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 21:50:34 -0000 Subject: [vmkit-commits] [vmkit] r198511 - add a flag to specify whether we need a local or a global reference in javaClass, *ToString and stringAt functions. Message-ID: <20140104215035.0F8E22A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 15:50:33 2014 New Revision: 198511 URL: http://llvm.org/viewvc/llvm-project?rev=198511&view=rev Log: add a flag to specify whether we need a local or a global reference in javaClass, *ToString and stringAt functions. 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/j3meta.def vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc 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/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3field.cc vmkit/branches/mcjit/lib/j3/vm/j3jni.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=198511&r1=198510&r2=198511&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Sat Jan 4 15:50:33 2014 @@ -123,9 +123,9 @@ namespace j3 { J3Options* options() { return &_options; } vmkit::Names* names() { return &_names; } - J3ObjectHandle* utfToString(const char* name); - J3ObjectHandle* nameToString(const vmkit::Name* name); - J3ObjectHandle* arrayToString(J3ObjectHandle* array); + J3ObjectHandle* utfToString(const char* name, bool doPush); + J3ObjectHandle* nameToString(const vmkit::Name* name, bool doPush); + J3ObjectHandle* arrayToString(J3ObjectHandle* array, bool doPush); void run(); void start(int argc, char** argv); Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198511&r1=198510&r2=198511&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Sat Jan 4 15:50:33 2014 @@ -63,7 +63,7 @@ namespace j3 { public: J3Type(J3ClassLoader* loader, const vmkit::Name* name); - J3ObjectHandle* javaClass(); + J3ObjectHandle* javaClass(bool doPush); virtual uint32_t logSize() = 0; uint64_t getSizeInBits(); @@ -249,7 +249,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); + J3ObjectHandle* stringAt(uint16_t idx, bool doPush); 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/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=198511&r1=198510&r2=198511&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Sat Jan 4 15:50:33 2014 @@ -100,7 +100,7 @@ namespace j3 { llvm::Value* unflatten(llvm::Value* v, llvm::Type* type); llvm::Value* handleToObject(llvm::Value* obj); - llvm::Value* javaClass(J3ObjectType* type); + llvm::Value* javaClass(J3ObjectType* type, bool doPush); llvm::Value* staticInstance(J3Class* cl); llvm::Value* vt(J3ObjectType* cl, bool resolve=0); llvm::Value* vt(llvm::Value* obj); Modified: vmkit/branches/mcjit/include/j3/j3meta.def URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=198511&r1=198510&r2=198511&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3meta.def (original) +++ vmkit/branches/mcjit/include/j3/j3meta.def Sat Jan 4 15:50:33 2014 @@ -4,8 +4,8 @@ _x(funcJ3TypeVTAndResolve, "j3::J3 _x(funcJ3TypeInitialise, "j3::J3Type::initialise()") _x(funcJ3LayoutStructSize, "j3::J3Layout::structSize()") _x(funcJ3ClassStaticInstance, "j3::J3Class::staticInstance()") -_x(funcJ3ClassStringAt, "j3::J3Class::stringAt(unsigned short)") -_x(funcJ3TypeJavaClass, "j3::J3Type::javaClass()") +_x(funcJ3ClassStringAt, "j3::J3Class::stringAt(unsigned short, bool)") +_x(funcJ3TypeJavaClass, "j3::J3Type::javaClass(bool)") _x(funcJniEnv, "j3::J3::jniEnv()") _x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)") _x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*)") Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=198511&r1=198510&r2=198511&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Sat Jan 4 15:50:33 2014 @@ -33,7 +33,7 @@ void J3Lib::bootstrap(J3* vm) { J3Method* appThreadGroupInit = threadGroupClass->findMethod(0, vm->initName, z_signature("(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); J3ObjectHandle* appThreadGroup = J3ObjectHandle::doNewObject(threadGroupClass); - appThreadGroupInit->invokeSpecial(appThreadGroup, sysThreadGroup, vm->utfToString("main")); + appThreadGroupInit->invokeSpecial(appThreadGroup, sysThreadGroup, vm->utfToString("main", 0)); J3Method* threadInit = vm->threadClass->findMethod(0, vm->initName, z_signature("(Ljava/lang/ThreadGroup;Ljava/lang/String;)V")); J3ObjectHandle* mainThread = J3ObjectHandle::doNewObject(vm->threadClass); @@ -41,7 +41,7 @@ void J3Lib::bootstrap(J3* vm) { J3Thread::get()->assocJavaThread(mainThread); mainThread->setInteger(vm->threadClass->findField(0, vm->names()->get("priority"), vm->typeInteger), 5); - threadInit->invokeSpecial(mainThread, appThreadGroup, vm->utfToString("main")); + threadInit->invokeSpecial(mainThread, appThreadGroup, vm->utfToString("main", 0)); vm->initialClassLoader ->loadClass(vm->names()->get("java/lang/System")) 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=198511&r1=198510&r2=198511&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 4 15:50:33 2014 @@ -6,6 +6,7 @@ #include "j3/j3method.h" #include "j3/j3constants.h" #include "j3/j3field.h" +#include "j3/j3utf16.h" #include "jvm.h" using namespace j3; @@ -61,15 +62,11 @@ jstring JNICALL JVM_InternString(JNIEnv* J3* vm = J3Thread::get()->vm(); J3ObjectHandle* value = str->getObject(vm->stringClassValue); - uint32_t length = value->arrayLength(); - char copy[length+1]; + char copy[J3Utf16Decoder::maxSize(value)]; + + J3Utf16Decoder::decode(value, copy); - for(uint32_t i=0; igetCharAt(i); - - copy[length] = 0; - - res = vm->nameToString(vm->names()->get(copy)); + res = vm->utfToString(copy, 1); leaveJVM(); return res; @@ -403,7 +400,7 @@ jclass JNICALL JVM_GetCallerClass(JNIEnv if(!caller) J3::internalError("unable to find caller class, what should I do?"); - res = caller->cl()->javaClass(); + res = caller->cl()->javaClass(1); leaveJVM(); @@ -416,36 +413,39 @@ jclass JNICALL JVM_GetCallerClass(JNIEnv * utf: class name */ jclass JNICALL JVM_FindPrimitiveClass(JNIEnv* env, const char *utf) { + jclass res; + enterJVM(); J3* vm = J3Thread::get()->vm(); J3ClassLoader* loader = vm->initialClassLoader; vmkit::Names* names = vm->names(); - J3Class* res; + J3Class* cl; if(!strcmp(utf, "boolean")) - res = loader->loadClass(names->get("java/lang/Boolean")); + cl = loader->loadClass(names->get("java/lang/Boolean")); else if(!strcmp(utf, "byte")) - res = loader->loadClass(names->get("java/lang/Byte")); + cl = loader->loadClass(names->get("java/lang/Byte")); else if(!strcmp(utf, "char")) - res = loader->loadClass(names->get("java/lang/Character")); + cl = loader->loadClass(names->get("java/lang/Character")); else if(!strcmp(utf, "short")) - res = loader->loadClass(names->get("java/lang/Short")); + cl = loader->loadClass(names->get("java/lang/Short")); else if(!strcmp(utf, "int")) - res = loader->loadClass(names->get("java/lang/Integer")); + cl = loader->loadClass(names->get("java/lang/Integer")); else if(!strcmp(utf, "long")) - res = loader->loadClass(names->get("java/lang/Long")); + cl = loader->loadClass(names->get("java/lang/Long")); else if(!strcmp(utf, "float")) - res = loader->loadClass(names->get("java/lang/Float")); + cl = loader->loadClass(names->get("java/lang/Float")); else if(!strcmp(utf, "double")) - res = loader->loadClass(names->get("java/lang/Double")); + cl = loader->loadClass(names->get("java/lang/Double")); else if(!strcmp(utf, "void")) - res = loader->loadClass(names->get("java/lang/Void")); + cl = loader->loadClass(names->get("java/lang/Void")); else J3::internalError("unsupported primitive: %s", utf); + res = cl->javaClass(1); leaveJVM(); - return res->javaClass(); + return res; } /* @@ -484,7 +484,7 @@ jclass JNICALL JVM_FindClassFromClassLoa else cl->resolve(); - res = cl->javaClass(); + res = cl->javaClass(1); leaveJVM(); return res; @@ -513,7 +513,7 @@ jclass JNICALL JVM_DefineClassWithSource jstring JNICALL JVM_GetClassName(JNIEnv* env, jclass cls) { jstring res; enterJVM(); - res = J3Thread::get()->vm()->nameToString(J3ObjectType::nativeClass(cls)->name()); + res = J3Thread::get()->vm()->nameToString(J3ObjectType::nativeClass(cls)->name(), 1); leaveJVM(); return res; } 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=198511&r1=198510&r2=198511&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sat Jan 4 15:50:33 2014 @@ -146,7 +146,7 @@ JNIEnv* J3::jniEnv() { return J3Thread::get()->jniEnv(); } -J3ObjectHandle* J3::arrayToString(J3ObjectHandle* array) { +J3ObjectHandle* J3::arrayToString(J3ObjectHandle* array, bool doPush) { pthread_mutex_lock(&stringsMutex); J3ObjectHandle* res = charArrayToStrings[array]; if(!res) { @@ -159,10 +159,10 @@ J3ObjectHandle* J3::arrayToString(J3Obje charArrayToStrings[array] = res; } pthread_mutex_unlock(&stringsMutex); - return res; + return doPush ? J3Thread::get()->push(res) : res; } -J3ObjectHandle* J3::nameToString(const vmkit::Name* name) { +J3ObjectHandle* J3::nameToString(const vmkit::Name* name, bool doPush) { pthread_mutex_lock(&stringsMutex); J3ObjectHandle* res = nameToCharArrays[name]; if(!res) { @@ -181,11 +181,11 @@ J3ObjectHandle* J3::nameToString(const v nameToCharArrays[name] = res; } pthread_mutex_unlock(&stringsMutex); - return arrayToString(res); + return arrayToString(res, doPush); } -J3ObjectHandle* J3::utfToString(const char* name) { - return nameToString(names()->get(name)); +J3ObjectHandle* J3::utfToString(const char* name, bool doPush) { + return nameToString(names()->get(name), doPush); } void J3::classCastException() { 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=198511&r1=198510&r2=198511&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sat Jan 4 15:50:33 2014 @@ -49,19 +49,19 @@ void J3Type::dump() { fprintf(stderr, "Type: %s", name()->cStr()); } -J3ObjectHandle* J3Type::javaClass() { +J3ObjectHandle* J3Type::javaClass(bool doPush) { if(!_javaClass) { lock(); if(!_javaClass) { J3ObjectHandle* prev = J3Thread::get()->tell(); _javaClass = loader()->globalReferences()->add(J3ObjectHandle::doNewObject(loader()->vm()->classClass)); J3Thread::get()->restore(prev); - javaClass()->setLong(loader()->vm()->classClassVMData, (int64_t)(uintptr_t)this); - loader()->vm()->classClassInit->invokeSpecial(javaClass()); + _javaClass->setLong(loader()->vm()->classClassVMData, (int64_t)(uintptr_t)this); + loader()->vm()->classClassInit->invokeSpecial(_javaClass); } unlock(); } - return _javaClass; + return doPush ? J3Thread::get()->push(_javaClass) : _javaClass; } void J3Type::doNativeName() { @@ -436,7 +436,7 @@ void J3Class::doInitialise() { 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)); break; + case J3Cst::CONSTANT_String: staticInstance()->setObject(cur, stringAt(idx, 0)); break; default: J3::classFormatError(this, "invalid ctp entry ConstantAttribute with type %d", getCtpType(idx)); } @@ -688,11 +688,11 @@ void* J3Class::getCtpResolved(uint16_t i return ctpResolved[idx]; } -J3ObjectHandle* J3Class::stringAt(uint16_t idx) { +J3ObjectHandle* J3Class::stringAt(uint16_t idx, bool doPush) { check(idx, J3Cst::CONSTANT_String); J3ObjectHandle* res = (J3ObjectHandle*)ctpResolved[idx]; if(!res) { - ctpResolved[idx] = res = loader()->vm()->nameToString(nameAt(ctpValues[idx])); + ctpResolved[idx] = res = loader()->vm()->nameToString(nameAt(ctpValues[idx]), 0); } return (J3ObjectHandle*)res; } 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=198511&r1=198510&r2=198511&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sat Jan 4 15:50:33 2014 @@ -28,12 +28,12 @@ J3ClassLoader::J3ClassLoader(J3* v, J3Ob interfaces(j3InterfaceMethodLess, allocator), methodTypes(vmkit::Name::less, allocator), nativeLibraries(allocator) { - _javaClassLoader = javaClassLoader; - pthread_mutex_init(&_mutexClasses, 0); pthread_mutex_init(&_mutexTypes, 0); pthread_mutex_init(&_mutexInterfaces, 0); pthread_mutex_init(&_mutexMethodTypes, 0); + + _javaClassLoader = globalReferences()->add(javaClassLoader); } uint32_t J3ClassLoader::interfaceIndex(J3Method* method) { 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=198511&r1=198510&r2=198511&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sat Jan 4 15:50:33 2014 @@ -324,8 +324,8 @@ void J3CodeGen::initialiseJ3ObjectType(J builder->CreateCall(funcJ3TypeInitialise, typeDescriptor(cl, vm->typeJ3TypePtr)); } -llvm::Value* J3CodeGen::javaClass(J3ObjectType* type) { - return builder->CreateCall(funcJ3TypeJavaClass, typeDescriptor(type, vm->typeJ3TypePtr)); +llvm::Value* J3CodeGen::javaClass(J3ObjectType* type, bool doPush) { + return builder->CreateCall2(funcJ3TypeJavaClass, typeDescriptor(type, vm->typeJ3TypePtr), builder->getInt1(doPush)); } llvm::Value* J3CodeGen::handleToObject(llvm::Value* obj) { @@ -684,11 +684,12 @@ void J3CodeGen::ldc(uint32_t idx) { case J3Cst::CONSTANT_Integer: res = builder->getInt32(cl->integerAt(idx)); break; case J3Cst::CONSTANT_Float: res = llvm::ConstantFP::get(builder->getFloatTy(), cl->floatAt(idx)); break; case J3Cst::CONSTANT_Double: res = llvm::ConstantFP::get(builder->getDoubleTy(), cl->doubleAt(idx)); break; - case J3Cst::CONSTANT_Class: res = handleToObject(javaClass(cl->classAt(idx))); break; + case J3Cst::CONSTANT_Class: res = handleToObject(javaClass(cl->classAt(idx), 0)); break; case J3Cst::CONSTANT_String: - res = handleToObject(builder->CreateCall2(funcJ3ClassStringAt, + res = handleToObject(builder->CreateCall3(funcJ3ClassStringAt, typeDescriptor(cl, vm->typeJ3ClassPtr), - builder->getInt16(idx))); + builder->getInt16(idx), + builder->getInt1(0))); break; default: J3::classFormatError(cl, "wrong ldc type: %d\n", cl->getCtpType(idx)); @@ -1747,7 +1748,7 @@ void J3CodeGen::generateNative() { args.push_back(builder->CreateCall(funcJniEnv)); if(J3Cst::isStatic(method->access())) - args.push_back(builder->CreateCall2(funcJ3ThreadPushHandle, thread, javaClass(cl))); + args.push_back(javaClass(cl, 1)); uint32_t selfDone = 0; Modified: vmkit/branches/mcjit/lib/j3/vm/j3field.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3field.cc?rev=198511&r1=198510&r2=198511&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3field.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3field.cc Sat Jan 4 15:50:33 2014 @@ -18,13 +18,13 @@ J3ObjectHandle* J3Field::javaField() { J3* vm = layout()->loader()->vm(); - vm->fieldClassInit->invokeSpecial(_javaField, /* this */ - layout()->javaClass(), /* declaring class */ - vm->nameToString(name()), /* name */ - type()->javaClass(), /* type */ - access(), /* access */ - slot(), /* slot */ - vm->nameToString(type()->name()), /* signature */ + vm->fieldClassInit->invokeSpecial(_javaField, /* this */ + layout()->javaClass(0), /* declaring class */ + vm->nameToString(name(), 0), /* name */ + type()->javaClass(0), /* type */ + access(), /* access */ + slot(), /* slot */ + vm->nameToString(type()->name(), 0), /* signature */ layout()->extractAttribute(attributes()->lookup(vm->annotationsAttribute)));/* annotations */ J3Thread::get()->restore(prev); 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=198511&r1=198510&r2=198511&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sat Jan 4 15:50:33 2014 @@ -26,7 +26,7 @@ jclass JNICALL FindClass(JNIEnv* env, co J3ClassLoader* loader = m ? m->cl()->loader() : J3Thread::get()->vm()->initialClassLoader; J3Class* cl = loader->loadClass(loader->vm()->names()->get(name)); cl->initialise(); - res = cl->javaClass(); + res = cl->javaClass(1); leaveJVM(); return res; @@ -41,7 +41,7 @@ jclass JNICALL GetSuperclass(JNIEnv* env jclass res; enterJVM(); J3ObjectType* cl = J3ObjectType::nativeClass(sub); - res = J3Thread::get()->vm()->objectClass ? 0 : cl->javaClass(); + res = J3Thread::get()->vm()->objectClass ? 0 : cl->javaClass(1); leaveJVM(); return res; } @@ -131,7 +131,7 @@ jclass JNICALL GetObjectClass(JNIEnv* en jclass res; enterJVM(); - res = obj->vt()->type()->asObjectType()->javaClass(); + res = obj->vt()->type()->asObjectType()->javaClass(1); leaveJVM(); return res; @@ -146,7 +146,7 @@ jmethodID JNICALL GetMethodID(JNIEnv* en J3ObjectType* cl = J3ObjectType::nativeClass(clazz); cl->initialise(); vmkit::Names* n = cl->loader()->vm()->names(); - res = cl->findMethod(0, n->get(name), cl->loader()->getSignature(cl, n->get(sig))); + res = cl->findMethod(0, n->get(name), cl->loader()->getSignature(cl, n->get(sig)), 0); leaveJVM(); return res; @@ -160,7 +160,7 @@ jmethodID JNICALL GetStaticMethodID(JNIE J3ObjectType* cl = J3ObjectType::nativeClass(clazz); cl->initialise(); vmkit::Names* n = cl->loader()->vm()->names(); - res = cl->findMethod(J3Cst::ACC_STATIC, n->get(name), cl->loader()->getSignature(cl, n->get(sig))); + res = cl->findMethod(J3Cst::ACC_STATIC, n->get(name), cl->loader()->getSignature(cl, n->get(sig)), 0); leaveJVM(); @@ -347,7 +347,15 @@ void JNICALL CallStaticVoidMethodA(JNIEn leaveJVM(); } -jfieldID JNICALL GetFieldID(JNIEnv* env, jclass clazz, const char* name, const char* sig) { enterJVM(); leaveJVM(); NYI(); } +jfieldID JNICALL GetFieldID(JNIEnv* env, jclass clazz, const char* name, const char* sig) { + jfieldID res; + enterJVM(); + J3* vm = J3Thread::get()->vm(); + J3Class* cl = J3ObjectType::nativeClass(clazz)->asClass(); + res = cl->findField(0, vm->names()->get(name), cl->loader()->getType(cl, vm->names()->get(sig)), 0); + leaveJVM(); + return res; +} jobject JNICALL GetObjectField(JNIEnv* env, jobject obj, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } jboolean JNICALL GetBooleanField(JNIEnv* env, jobject obj, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } @@ -369,7 +377,16 @@ void JNICALL SetLongField(JNIEnv* env, j void JNICALL SetFloatField(JNIEnv* env, jobject obj, jfieldID fieldID, jfloat val) { enterJVM(); leaveJVM(); NYI(); } void JNICALL SetDoubleField(JNIEnv* env, jobject obj, jfieldID fieldID, jdouble val) { enterJVM(); leaveJVM(); NYI(); } -jfieldID JNICALL GetStaticFieldID(JNIEnv* env, jclass clazz, const char* name, const char* sig) { enterJVM(); leaveJVM(); NYI(); } +jfieldID JNICALL GetStaticFieldID(JNIEnv* env, jclass clazz, const char* name, const char* sig) { + jfieldID res; + enterJVM(); + J3* vm = J3Thread::get()->vm(); + J3Class* cl = J3ObjectType::nativeClass(clazz)->asClass(); + res = cl->findField(J3Cst::ACC_STATIC, vm->names()->get(name), cl->loader()->getType(cl, vm->names()->get(sig)), 0); + leaveJVM(); + return res; +} + jobject JNICALL GetStaticObjectField(JNIEnv* env, jclass clazz, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } jboolean JNICALL GetStaticBooleanField(JNIEnv* env, jclass clazz, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } jbyte JNICALL GetStaticByteField(JNIEnv* env, jclass clazz, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } @@ -406,7 +423,7 @@ jstring JNICALL NewStringUTF(JNIEnv* env jstring res; enterJVM(); - res = J3Thread::get()->push(J3Thread::get()->vm()->utfToString(utf)); /* harakiri want to kill me */ + res = J3Thread::get()->vm()->utfToString(utf, 1); leaveJVM(); return res; 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=198511&r1=198510&r2=198511&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sat Jan 4 15:50:33 2014 @@ -272,7 +272,7 @@ J3ObjectHandle* J3Method::javaMethod() { J3ObjectHandle* parameters = J3ObjectHandle::doNewArray(vm->classClass->getArray(), nbIns); for(uint32_t i=0; isetObjectAt(i, signature()->javaIns(i)->javaClass()); + parameters->setObjectAt(i, signature()->javaIns(i)->javaClass(0)); J3Attribute* exceptionAttribute = attributes()->lookup(vm->exceptionsAttribute); J3ObjectHandle* exceptions; @@ -289,12 +289,12 @@ J3ObjectHandle* J3Method::javaMethod() { _javaMethod = cl()->loader()->globalReferences()->add(J3ObjectHandle::doNewObject(vm->constructorClass)); vm->constructorClassInit->invokeSpecial(_javaMethod, - cl()->javaClass(), + cl()->javaClass(0), parameters, exceptions, access(), slot(), - vm->nameToString(signature()->name()), + vm->nameToString(signature()->name(), 0), annotations, paramAnnotations); } else From gael.thomas at lip6.fr Sat Jan 4 13:57:58 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 21:57:58 -0000 Subject: [vmkit-commits] [vmkit] r198512 - By default, push a local reference in javaClass, stringAt, javaClassLoader and *ToString Message-ID: <20140104215758.D9B792A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 15:57:58 2014 New Revision: 198512 URL: http://llvm.org/viewvc/llvm-project?rev=198512&view=rev Log: By default, push a local reference in javaClass, stringAt, javaClassLoader and *ToString 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/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3classloader.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=198512&r1=198511&r2=198512&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Sat Jan 4 15:57:58 2014 @@ -123,9 +123,9 @@ namespace j3 { J3Options* options() { return &_options; } vmkit::Names* names() { return &_names; } - J3ObjectHandle* utfToString(const char* name, bool doPush); - J3ObjectHandle* nameToString(const vmkit::Name* name, bool doPush); - J3ObjectHandle* arrayToString(J3ObjectHandle* array, bool doPush); + J3ObjectHandle* utfToString(const char* name, bool doPush=1); + J3ObjectHandle* nameToString(const vmkit::Name* name, bool doPush=1); + J3ObjectHandle* arrayToString(J3ObjectHandle* array, bool doPush=1); void run(); void start(int argc, char** argv); Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198512&r1=198511&r2=198512&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Sat Jan 4 15:57:58 2014 @@ -63,7 +63,7 @@ namespace j3 { public: J3Type(J3ClassLoader* loader, const vmkit::Name* name); - J3ObjectHandle* javaClass(bool doPush); + J3ObjectHandle* javaClass(bool doPush=1); virtual uint32_t logSize() = 0; uint64_t getSizeInBits(); Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=198512&r1=198511&r2=198512&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Sat Jan 4 15:57:58 2014 @@ -64,7 +64,7 @@ namespace j3 { J3GlobalReferences* globalReferences() { return &_globalReferences; } - J3ObjectHandle* javaClassLoader() { return _javaClassLoader; } + J3ObjectHandle* javaClassLoader(bool doPush=1); J3* vm() const { return (J3*)vmkit::CompilationUnit::vm(); }; 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=198512&r1=198511&r2=198512&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 4 15:57:58 2014 @@ -66,7 +66,7 @@ jstring JNICALL JVM_InternString(JNIEnv* J3Utf16Decoder::decode(value, copy); - res = vm->utfToString(copy, 1); + res = vm->utfToString(copy); leaveJVM(); return res; @@ -400,7 +400,7 @@ jclass JNICALL JVM_GetCallerClass(JNIEnv if(!caller) J3::internalError("unable to find caller class, what should I do?"); - res = caller->cl()->javaClass(1); + res = caller->cl()->javaClass(); leaveJVM(); @@ -443,7 +443,7 @@ jclass JNICALL JVM_FindPrimitiveClass(JN else J3::internalError("unsupported primitive: %s", utf); - res = cl->javaClass(1); + res = cl->javaClass(); leaveJVM(); return res; } @@ -484,7 +484,7 @@ jclass JNICALL JVM_FindClassFromClassLoa else cl->resolve(); - res = cl->javaClass(1); + res = cl->javaClass(); leaveJVM(); return res; 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=198512&r1=198511&r2=198512&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sat Jan 4 15:57:58 2014 @@ -15,6 +15,7 @@ #include "j3/j3method.h" #include "j3/j3lib.h" #include "j3/j3mangler.h" +#include "j3/j3thread.h" using namespace j3; @@ -36,6 +37,10 @@ J3ClassLoader::J3ClassLoader(J3* v, J3Ob _javaClassLoader = globalReferences()->add(javaClassLoader); } +J3ObjectHandle* J3ClassLoader::javaClassLoader(bool doPush) { + return (_javaClassLoader && doPush) ? J3Thread::get()->push(_javaClassLoader) : _javaClassLoader; +} + uint32_t J3ClassLoader::interfaceIndex(J3Method* method) { pthread_mutex_lock(&_mutexInterfaces); InterfaceMethodRefMap::iterator it = interfaces.find(method); 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=198512&r1=198511&r2=198512&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sat Jan 4 15:57:58 2014 @@ -26,7 +26,7 @@ jclass JNICALL FindClass(JNIEnv* env, co J3ClassLoader* loader = m ? m->cl()->loader() : J3Thread::get()->vm()->initialClassLoader; J3Class* cl = loader->loadClass(loader->vm()->names()->get(name)); cl->initialise(); - res = cl->javaClass(1); + res = cl->javaClass(); leaveJVM(); return res; @@ -41,7 +41,7 @@ jclass JNICALL GetSuperclass(JNIEnv* env jclass res; enterJVM(); J3ObjectType* cl = J3ObjectType::nativeClass(sub); - res = J3Thread::get()->vm()->objectClass ? 0 : cl->javaClass(1); + res = J3Thread::get()->vm()->objectClass ? 0 : cl->javaClass(); leaveJVM(); return res; } @@ -131,7 +131,7 @@ jclass JNICALL GetObjectClass(JNIEnv* en jclass res; enterJVM(); - res = obj->vt()->type()->asObjectType()->javaClass(1); + res = obj->vt()->type()->asObjectType()->javaClass(); leaveJVM(); return res; @@ -423,7 +423,7 @@ jstring JNICALL NewStringUTF(JNIEnv* env jstring res; enterJVM(); - res = J3Thread::get()->vm()->utfToString(utf, 1); + res = J3Thread::get()->vm()->utfToString(utf); leaveJVM(); return res; From gael.thomas at lip6.fr Sat Jan 4 14:13:36 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 22:13:36 -0000 Subject: [vmkit-commits] [vmkit] r198513 - Remove the vm field from CompilationUnit Message-ID: <20140104221337.2B61A2A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 16:13:36 2014 New Revision: 198513 URL: http://llvm.org/viewvc/llvm-project?rev=198513&view=rev Log: Remove the vm field from CompilationUnit Modified: vmkit/branches/mcjit/include/j3/j3classloader.h vmkit/branches/mcjit/include/vmkit/compiler.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/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3field.cc vmkit/branches/mcjit/lib/j3/vm/j3jni.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3object.cc vmkit/branches/mcjit/lib/j3/vm/j3signature.cc vmkit/branches/mcjit/lib/vmkit/compiler.cc Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=198513&r1=198512&r2=198513&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Sat Jan 4 16:13:36 2014 @@ -53,7 +53,7 @@ namespace j3 { std::vector > nativeLibraries; public: - J3ClassLoader(J3* vm, J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator); + J3ClassLoader(J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator); J3Type* getTypeInternal(J3ObjectType* from, const vmkit::Name* type, uint32_t start, uint32_t* end, bool unify); J3Type* getType(J3ObjectType* from, const vmkit::Name* type); /* find a type */ @@ -66,8 +66,6 @@ namespace j3 { J3ObjectHandle* javaClassLoader(bool doPush=1); - J3* vm() const { return (J3*)vmkit::CompilationUnit::vm(); }; - J3Class* defineClass(const vmkit::Name* name, J3ClassBytes* bytes); J3Class* findLoadedClass(const vmkit::Name* name); virtual J3Class* loadClass(const vmkit::Name* name); @@ -83,7 +81,7 @@ namespace j3 { J3ZipArchive* archive; std::map _cmangled; public: - J3InitialClassLoader(J3* vm, const char* rtjar, vmkit::BumpAllocator* allocator); + J3InitialClassLoader(const char* rtjar, vmkit::BumpAllocator* allocator); J3Class* loadClass(const vmkit::Name* name); const char* cmangled(const char* demangled) { return _cmangled[demangled]; } Modified: vmkit/branches/mcjit/include/vmkit/compiler.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/compiler.h?rev=198513&r1=198512&r2=198513&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/compiler.h (original) +++ vmkit/branches/mcjit/include/vmkit/compiler.h Sat Jan 4 16:13:36 2014 @@ -37,7 +37,6 @@ namespace vmkit { class CompilationUnit : public llvm::SectionMemoryManager { typedef std::map > > SymbolMap; - VMKit* _vmkit; BumpAllocator* _allocator; SymbolMap _symbolTable; pthread_mutex_t _mutexSymbolTable; @@ -50,13 +49,11 @@ namespace vmkit { public: void* operator new(size_t n, BumpAllocator* allocator); - CompilationUnit(BumpAllocator* allocator, VMKit* vmkit, const char* id); + CompilationUnit(BumpAllocator* allocator, const char* id); ~CompilationUnit(); static void destroy(CompilationUnit* unit); - VMKit* vm() const { return _vmkit; } - void addSymbol(const char* id, vmkit::Symbol* symbol); Symbol* getSymbol(const char* id); uint64_t getSymbolAddress(const std::string &Name); 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=198513&r1=198512&r2=198513&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 4 16:13:36 2014 @@ -572,6 +572,7 @@ jobjectArray JNICALL JVM_GetClassDeclare enterJVM(); J3ObjectType* type = J3ObjectType::nativeClass(ofClass); + J3* vm = J3Thread::get()->vm(); if(type->isClass()) { J3Class* cl = type->asClass(); @@ -580,7 +581,7 @@ jobjectArray JNICALL JVM_GetClassDeclare cl->nbPublicFields() + cl->staticLayout()->nbPublicFields() : cl->nbFields() + cl->staticLayout()->nbFields(); - res = J3ObjectHandle::doNewArray(type->loader()->vm()->fieldClass->getArray(), total); + res = J3ObjectHandle::doNewArray(vm->fieldClass->getArray(), total); size_t cur = 0; for(uint32_t i=0; inbFields(); i++) @@ -590,7 +591,7 @@ jobjectArray JNICALL JVM_GetClassDeclare if(!publicOnly || J3Cst::isPublic(cl->staticLayout()->fields()[i].access())) res->setObjectAt(cur++, cl->staticLayout()->fields()[i].javaField()); } else - res = J3ObjectHandle::doNewArray(type->loader()->vm()->fieldClass->getArray(), 0); + res = J3ObjectHandle::doNewArray(vm->fieldClass->getArray(), 0); leaveJVM(); 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=198513&r1=198512&r2=198513&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sat Jan 4 16:13:36 2014 @@ -87,7 +87,7 @@ void J3::run() { vmkit::BumpAllocator* loaderAllocator = vmkit::BumpAllocator::create(); initialClassLoader = new(loaderAllocator) - J3InitialClassLoader(this, options()->rtJar, loaderAllocator); + J3InitialClassLoader(options()->rtJar, loaderAllocator); vmkit::BumpAllocator* a = initialClassLoader->allocator(); 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=198513&r1=198512&r2=198513&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sat Jan 4 16:13:36 2014 @@ -53,11 +53,12 @@ J3ObjectHandle* J3Type::javaClass(bool d if(!_javaClass) { lock(); if(!_javaClass) { + J3* vm = J3Thread::get()->vm(); J3ObjectHandle* prev = J3Thread::get()->tell(); - _javaClass = loader()->globalReferences()->add(J3ObjectHandle::doNewObject(loader()->vm()->classClass)); + _javaClass = loader()->globalReferences()->add(J3ObjectHandle::doNewObject(vm->classClass)); J3Thread::get()->restore(prev); - _javaClass->setLong(loader()->vm()->classClassVMData, (int64_t)(uintptr_t)this); - loader()->vm()->classClassInit->invokeSpecial(_javaClass); + _javaClass->setLong(vm->classClassVMData, (int64_t)(uintptr_t)this); + vm->classClassInit->invokeSpecial(_javaClass); } unlock(); } @@ -165,7 +166,7 @@ J3ObjectType::J3ObjectType(J3ClassLoader } llvm::Type* J3ObjectType::llvmType() { - return loader()->vm()->typeJ3ObjectPtr; + return J3Thread::get()->vm()->typeJ3ObjectPtr; } J3Method* J3ObjectType::findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error) { @@ -336,7 +337,7 @@ J3ObjectHandle* J3Class::extractAttribut if(attr) J3::internalError("extract attribute"); else - return J3ObjectHandle::doNewArray(loader()->vm()->typeByte->getArray(), 0); + return J3ObjectHandle::doNewArray(J3Thread::get()->vm()->typeByte->getArray(), 0); } J3Method* J3Class::findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error) { @@ -402,7 +403,8 @@ void J3Class::doInitialise() { resolve(); lock(); if(status < INITED) { - if(loader()->vm()->options()->debugIniting) + J3* vm = J3Thread::get()->vm(); + if(vm->options()->debugIniting) fprintf(stderr, "Initing: %s\n", name()->cStr()); status = INITED; @@ -419,7 +421,7 @@ void J3Class::doInitialise() { for(size_t i=0; inbFields(); i++) { J3Field* cur = staticLayout()->fields() + i; - J3Attribute* attr = cur->attributes()->lookup(loader()->vm()->constantValueAttribute); + J3Attribute* attr = cur->attributes()->lookup(vm->constantValueAttribute); if(attr) { J3Reader reader(bytes()); @@ -443,7 +445,7 @@ void J3Class::doInitialise() { } } - J3Method* clinit = staticLayout()->localFindMethod(loader()->vm()->clinitName, loader()->vm()->clinitSign); + J3Method* clinit = staticLayout()->localFindMethod(vm->clinitName, vm->clinitSign); if(clinit) clinit->invokeStatic(); @@ -454,7 +456,7 @@ void J3Class::doInitialise() { void J3Class::doResolve(J3Field* hiddenFields, size_t nbHiddenFields) { lock(); if(status < RESOLVED) { - if(loader()->vm()->options()->debugResolve) + if(J3Thread::get()->vm()->options()->debugResolve) fprintf(stderr, "Resolving: %s\n", name()->cStr()); status = RESOLVED; @@ -632,7 +634,7 @@ void J3Class::readClassBytes(J3Field* hi layout = staticLayout(); else { layout = this; - if(methodsTmp[i]->name() == loader()->vm()->initName) { + if(methodsTmp[i]->name() == J3Thread::get()->vm()->initName) { _nbConstructors++; if(J3Cst::isPublic(methodsTmp[i]->access())) _nbPublicConstructors++; @@ -692,7 +694,7 @@ J3ObjectHandle* J3Class::stringAt(uint16 check(idx, J3Cst::CONSTANT_String); J3ObjectHandle* res = (J3ObjectHandle*)ctpResolved[idx]; if(!res) { - ctpResolved[idx] = res = loader()->vm()->nameToString(nameAt(ctpValues[idx]), 0); + ctpResolved[idx] = res = J3Thread::get()->vm()->nameToString(nameAt(ctpValues[idx]), 0); } return (J3ObjectHandle*)res; } @@ -813,7 +815,7 @@ const vmkit::Name* J3Class::nameAt(uint uint16_t len = reader.readU2(), i=0, n=0; - res = loader()->vm()->names()->get((const char*)reader.pointer(), 0, len); + res = J3Thread::get()->vm()->names()->get((const char*)reader.pointer(), 0, len); ctpResolved[idx] = (void*)res; @@ -865,7 +867,7 @@ J3ArrayClass::J3ArrayClass(J3ClassLoader buf[pos++] = J3Cst::ID_End; buf[pos] = 0; - _name = loader->vm()->names()->get(buf); + _name = J3Thread::get()->vm()->names()->get(buf); } } @@ -885,7 +887,7 @@ uint16_t J3ArrayClass::modifiers() { } J3Class* J3ArrayClass::super() { - return loader()->vm()->objectClass; + return J3Thread::get()->vm()->objectClass; } J3Method* J3ArrayClass::findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error) { @@ -922,7 +924,7 @@ void J3ArrayClass::doNativeName() { * ------------ J3Primitive ------------ */ J3Primitive::J3Primitive(J3ClassLoader* loader, char id, llvm::Type* type, uint32_t logSize) : - J3Type(loader, loader->vm()->names()->get(id)) { + J3Type(loader, J3Thread::get()->vm()->names()->get(id)) { _llvmType = type; _nativeName = (char*)loader->allocator()->allocate(2); _nativeName[0] = id; 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=198513&r1=198512&r2=198513&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sat Jan 4 16:13:36 2014 @@ -21,8 +21,8 @@ using namespace j3; J3ClassLoader::J3InterfaceMethodLess J3ClassLoader::j3InterfaceMethodLess; -J3ClassLoader::J3ClassLoader(J3* v, J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator) - : CompilationUnit(allocator, v, "class-loader"), +J3ClassLoader::J3ClassLoader(J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator) + : CompilationUnit(allocator, "class-loader"), _globalReferences(allocator), classes(vmkit::Name::less, allocator), types(vmkit::Name::less, allocator), @@ -95,6 +95,7 @@ void J3ClassLoader::wrongType(J3ObjectTy } J3Type* J3ClassLoader::getTypeInternal(J3ObjectType* from, const vmkit::Name* typeName, uint32_t start, uint32_t* pend, bool unify) { + J3* vm = J3Thread::get()->vm(); J3Type* res = 0; const char* type = typeName->cStr(); uint32_t len = typeName->length(); @@ -107,15 +108,15 @@ J3Type* J3ClassLoader::getTypeInternal(J switch(type[pos]) { case J3Cst::ID_Array: prof++; pos++; break; - case J3Cst::ID_Void: res = vm()->typeVoid; pos++; break; - case J3Cst::ID_Byte: res = vm()->typeByte; pos++; break; - case J3Cst::ID_Char: res = vm()->typeChar; pos++; break; - case J3Cst::ID_Double: res = vm()->typeDouble; pos++; break; - case J3Cst::ID_Float: res = vm()->typeFloat; pos++; break; - case J3Cst::ID_Integer: res = vm()->typeInteger; pos++; break; - case J3Cst::ID_Long: res = vm()->typeLong; pos++; break; - case J3Cst::ID_Short: res = vm()->typeShort; pos++; break; - case J3Cst::ID_Boolean: res = vm()->typeBoolean; pos++; break; + case J3Cst::ID_Void: res = vm->typeVoid; pos++; break; + case J3Cst::ID_Byte: res = vm->typeByte; pos++; break; + case J3Cst::ID_Char: res = vm->typeChar; pos++; break; + case J3Cst::ID_Double: res = vm->typeDouble; pos++; break; + case J3Cst::ID_Float: res = vm->typeFloat; pos++; break; + case J3Cst::ID_Integer: res = vm->typeInteger; pos++; break; + case J3Cst::ID_Long: res = vm->typeLong; pos++; break; + case J3Cst::ID_Short: res = vm->typeShort; pos++; break; + case J3Cst::ID_Boolean: res = vm->typeBoolean; pos++; break; case J3Cst::ID_Classname: if(unify) { uint32_t start = ++pos; @@ -125,7 +126,7 @@ J3Type* J3ClassLoader::getTypeInternal(J wrongType(from, typeName); pos++; - res = vm()->objectClass; + res = vm->objectClass; } else { uint32_t start = ++pos; char buf[len + 1 - start], c; @@ -140,7 +141,7 @@ J3Type* J3ClassLoader::getTypeInternal(J buf[pos++ - start] = 0; - res = loadClass(vm()->names()->get(buf)); + res = loadClass(vm->names()->get(buf)); } break; case J3Cst::ID_Left: @@ -154,7 +155,7 @@ J3Type* J3ClassLoader::getTypeInternal(J if(prof) { if(unify) - res = vm()->objectClass; + res = vm->objectClass; else res = res->getArray(prof, start ? 0 : typeName); } @@ -203,9 +204,9 @@ bool J3ClassLoader::J3InterfaceMethodLes && (lhs->signature() < rhs->signature())); } -J3InitialClassLoader::J3InitialClassLoader(J3* v, const char* rtjar, vmkit::BumpAllocator* _alloc) - : J3ClassLoader(v, 0, _alloc) { - const char* archives = vm()->options()->rtJar; +J3InitialClassLoader::J3InitialClassLoader(const char* rtjar, vmkit::BumpAllocator* _alloc) + : J3ClassLoader(0, _alloc) { + const char* archives = J3Thread::get()->vm()->options()->rtJar; J3ClassBytes* bytes = J3Reader::openFile(allocator(), archives); //makeLLVMFunctions_j3(); 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=198513&r1=198512&r2=198513&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sat Jan 4 16:13:36 2014 @@ -37,7 +37,7 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato cl = method->cl()->asClass(); signature = method->signature(); loader = cl->loader(); - vm = loader->vm(); + vm = J3Thread::get()->vm(); #if 0 if(m->cl()->name() == vm->names()->get("java/util/concurrent/atomic/AtomicInteger")) @@ -134,13 +134,13 @@ void J3CodeGen::operator delete(void* pt } void J3CodeGen::translate(J3Method* method, bool withMethod, bool withCaller) { - method->cl()->loader()->vm()->lockCompiler(); + J3Thread::get()->vm()->lockCompiler(); vmkit::BumpAllocator* allocator = vmkit::BumpAllocator::create(); delete new(allocator) J3CodeGen(allocator, method, withMethod, withCaller); vmkit::BumpAllocator::destroy(allocator); - method->cl()->loader()->vm()->unlockCompiler(); + J3Thread::get()->vm()->unlockCompiler(); } uint32_t J3CodeGen::wideReadU1() { Modified: vmkit/branches/mcjit/lib/j3/vm/j3field.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3field.cc?rev=198513&r1=198512&r2=198513&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3field.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3field.cc Sat Jan 4 16:13:36 2014 @@ -14,10 +14,9 @@ J3ObjectHandle* J3Field::javaField() { if(!_javaField) { J3ObjectHandle* prev = J3Thread::get()->tell(); - _javaField = layout()->loader()->globalReferences()->add(J3ObjectHandle::doNewObject(layout()->loader()->vm()->fieldClass)); - - J3* vm = layout()->loader()->vm(); + J3* vm = J3Thread::get()->vm(); + _javaField = layout()->loader()->globalReferences()->add(J3ObjectHandle::doNewObject(vm->fieldClass)); vm->fieldClassInit->invokeSpecial(_javaField, /* this */ layout()->javaClass(0), /* declaring class */ vm->nameToString(name(), 0), /* name */ 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=198513&r1=198512&r2=198513&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sat Jan 4 16:13:36 2014 @@ -23,8 +23,9 @@ jclass JNICALL FindClass(JNIEnv* env, co enterJVM(); J3Method* m = J3Thread::get()->getJavaCaller(); - J3ClassLoader* loader = m ? m->cl()->loader() : J3Thread::get()->vm()->initialClassLoader; - J3Class* cl = loader->loadClass(loader->vm()->names()->get(name)); + J3* vm = J3Thread::get()->vm(); + J3ClassLoader* loader = m ? m->cl()->loader() : vm->initialClassLoader; + J3Class* cl = loader->loadClass(vm->names()->get(name)); cl->initialise(); res = cl->javaClass(); leaveJVM(); @@ -145,7 +146,7 @@ jmethodID JNICALL GetMethodID(JNIEnv* en enterJVM(); J3ObjectType* cl = J3ObjectType::nativeClass(clazz); cl->initialise(); - vmkit::Names* n = cl->loader()->vm()->names(); + vmkit::Names* n = J3Thread::get()->vm()->names(); res = cl->findMethod(0, n->get(name), cl->loader()->getSignature(cl, n->get(sig)), 0); leaveJVM(); @@ -159,7 +160,7 @@ jmethodID JNICALL GetStaticMethodID(JNIE J3ObjectType* cl = J3ObjectType::nativeClass(clazz); cl->initialise(); - vmkit::Names* n = cl->loader()->vm()->names(); + vmkit::Names* n = J3Thread::get()->vm()->names(); res = cl->findMethod(J3Cst::ACC_STATIC, n->get(name), cl->loader()->getSignature(cl, n->get(sig)), 0); leaveJVM(); @@ -499,7 +500,7 @@ void JNICALL GetDoubleArrayRegion(JNIEnv jint JNICALL RegisterNatives(JNIEnv* env, jclass clazz, const JNINativeMethod* methods, jint nMethods) { enterJVM(); J3Class* cl = J3Class::nativeClass(clazz)->asClass(); - J3* j3 = cl->loader()->vm(); + J3* j3 = J3Thread::get()->vm(); for(jint i=0; iregisterNative(j3->names()->get(methods[i].name), j3->names()->get(methods[i].signature), methods[i].fnPtr); 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=198513&r1=198512&r2=198513&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sat Jan 4 16:13:36 2014 @@ -96,9 +96,10 @@ void J3Method::postInitialise(uint32_t a } J3Method* J3Method::resolve(J3ObjectHandle* obj) { - if(cl()->loader()->vm()->options()->debugLinking) + J3* vm = J3Thread::get()->vm(); + if(vm->options()->debugLinking) fprintf(stderr, "virtual linking %s::%s\n", cl()->name()->cStr(), name()->cStr()); - vmkit::Names* n = cl()->loader()->vm()->names(); + vmkit::Names* n = vm->names(); return obj->vt()->type()->asObjectType()->findMethod(0, name(), signature()); } @@ -121,7 +122,7 @@ J3Value J3Method::internalInvoke(J3Objec llvm::FunctionType* fType = signature()->functionType(J3Cst::ACC_STATIC); /* static signature for va */ J3Value* args = (J3Value*)alloca(sizeof(J3Value)*(fType->getNumParams() + 1)); - J3* vm = cl()->loader()->vm(); + J3* vm = J3Thread::get()->vm(); uint32_t i = 0; if(handle) @@ -265,7 +266,7 @@ J3ObjectHandle* J3Method::javaMethod() { cl()->lock(); if(!_javaMethod) { J3ObjectHandle* prev = J3Thread::get()->tell(); - J3* vm = cl()->loader()->vm(); + J3* vm = J3Thread::get()->vm(); uint32_t nbIns = signature()->nbIns(); @@ -285,7 +286,7 @@ J3ObjectHandle* J3Method::javaMethod() { J3ObjectHandle* annotations = cl()->asClass()->extractAttribute(attributes()->lookup(vm->annotationsAttribute)); J3ObjectHandle* paramAnnotations = cl()->asClass()->extractAttribute(attributes()->lookup(vm->paramAnnotationsAttribute)); - if(name() == cl()->loader()->vm()->initName) { + if(name() == vm->initName) { _javaMethod = cl()->loader()->globalReferences()->add(J3ObjectHandle::doNewObject(vm->constructorClass)); vm->constructorClassInit->invokeSpecial(_javaMethod, 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=198513&r1=198512&r2=198513&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Sat Jan 4 16:13:36 2014 @@ -78,7 +78,7 @@ J3VirtualTable* J3VirtualTable::create(J memcpy(res->_virtualMethods, super->vt()->_virtualMethods, sizeof(void*)*super->vt()->nbVirtualMethods()); if(!J3Cst::isAbstract(cl->access())) { - void* interfaceTrampoline = cl->loader()->vm()->interfaceTrampoline; + void* interfaceTrampoline = J3Thread::get()->vm()->interfaceTrampoline; for(uint32_t i=0; i_interfaceMethodTable[i] = interfaceTrampoline; } @@ -92,7 +92,8 @@ J3VirtualTable* J3VirtualTable::create(J } J3VirtualTable* J3VirtualTable::create(J3ArrayClass* cl) { - J3Class* objClass = cl->loader()->vm()->objectClass; + J3* vm = J3Thread::get()->vm(); + J3Class* objClass = vm->objectClass; J3Type* super = cl->component(); J3Type* base = super; uint32_t dim = 1; @@ -114,18 +115,18 @@ J3VirtualTable* J3VirtualTable::create(J if(base->isPrimitive()) { super = objClass->getArray(dim-1); - nbSecondaries = cl->loader()->vm()->nbArrayInterfaces; + nbSecondaries = vm->nbArrayInterfaces; secondaries = (J3Type**)cl->loader()->allocator()->allocate(nbSecondaries*sizeof(J3Type*)); for(uint32_t i=0; iloader()->vm()->arrayInterfaces[i]; + secondaries[i] = vm->arrayInterfaces[i]; if(dim > 1) secondaries[i] = secondaries[i]->getArray(dim-1); } } else if(base == objClass) { - nbSecondaries = cl->loader()->vm()->nbArrayInterfaces; + nbSecondaries = vm->nbArrayInterfaces; secondaries = (J3Type**)alloca(nbSecondaries*sizeof(J3Type*)); for(uint32_t i=0; iloader()->vm()->arrayInterfaces[i]; + secondaries[i] = vm->arrayInterfaces[i]; if(dim > 1) secondaries[i] = secondaries[i]->getArray(dim - 1); } Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=198513&r1=198512&r2=198513&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Sat Jan 4 16:13:36 2014 @@ -3,6 +3,7 @@ #include "j3/j3codegen.h" #include "j3/j3classloader.h" #include "j3/j3class.h" +#include "j3/j3thread.h" #include "j3/j3.h" #include "llvm/IR/Function.h" @@ -42,9 +43,10 @@ void J3Signature::checkInOut() { } J3LLVMSignature* J3Signature::buildLLVMSignature(llvm::FunctionType* fType) { - J3LLVMSignature* res = loader()->vm()->llvmSignatures[fType]; + J3* vm = J3Thread::get()->vm(); + J3LLVMSignature* res = vm->llvmSignatures[fType]; if(!res) { - loader()->vm()->llvmSignatures[fType] = res = new(loader()->vm()->allocator()) J3LLVMSignature(); + vm->llvmSignatures[fType] = res = new(vm->allocator()) J3LLVMSignature(); res->functionType = fType; } return res; @@ -56,7 +58,7 @@ void J3Signature::checkFunctionType() { std::vector sins; uint32_t cur = 1; - vins.push_back(loader()->vm()->objectClass->llvmType()); + vins.push_back(J3Thread::get()->vm()->objectClass->llvmType()); if(name()->cStr()[0] != J3Cst::ID_Left) loader()->wrongType(0, name()); Modified: vmkit/branches/mcjit/lib/vmkit/compiler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/compiler.cc?rev=198513&r1=198512&r2=198513&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/compiler.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/compiler.cc Sat Jan 4 16:13:36 2014 @@ -33,13 +33,11 @@ void* CompilationUnit::operator new(size void CompilationUnit::operator delete(void* self) { } -CompilationUnit::CompilationUnit(BumpAllocator* allocator, VMKit* vmkit, const char* id) : +CompilationUnit::CompilationUnit(BumpAllocator* allocator, const char* id) : _symbolTable(vmkit::Util::char_less, allocator) { _allocator = allocator; pthread_mutex_init(&_mutexSymbolTable, 0); - _vmkit = vmkit; - std::string err; llvm::TargetOptions opt; @@ -148,13 +146,14 @@ void CompilationUnit::compileModule(llvm ee()->finalizeObject(); vmkit::Safepoint* sf = Safepoint::get(this, module); + VMKit* vm = Thread::get()->vm(); if(!sf) - vm()->internalError("unable to find safepoints"); + vm->internalError("unable to find safepoints"); while(sf->addr()) { sf->setUnit(this); - vm()->addSafepoint(sf); + vm->addSafepoint(sf); //vm()->getSafepoint(sf->addr())->dump(); sf = sf->getNext(); From gael.thomas at lip6.fr Sat Jan 4 14:20:46 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 22:20:46 -0000 Subject: [vmkit-commits] [vmkit] r198514 - Implement SetStatic*Field Message-ID: <20140104222046.99B532A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 16:20:46 2014 New Revision: 198514 URL: http://llvm.org/viewvc/llvm-project?rev=198514&view=rev Log: Implement SetStatic*Field Modified: vmkit/branches/mcjit/lib/j3/vm/j3jni.cc 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=198514&r1=198513&r2=198514&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sat Jan 4 16:20:46 2014 @@ -271,15 +271,23 @@ jmethodID JNICALL GetStaticMethodID(JNIE leaveJVM(); \ } +#define defSetField(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); \ + leaveJVM(); \ + } + #define defJNIObj(jtype, id, j3type) \ defCall(jtype, id, j3type) \ defNonVirtualCall(jtype, id, j3type) \ defStaticCall(jtype, id, j3type) \ + defSetField(jtype, id, j3type) #define defJNI(jtype, id, j3type) \ defJNIObj(jtype, id, j3type) \ defNewArray(jtype, id, j3type) \ - defArrayRegion(jtype, id, j3type) + defArrayRegion(jtype, id, j3type) defJNIObj(jobject, Object, Object); defJNI (jboolean, Boolean, Boolean); @@ -398,16 +406,6 @@ jlong JNICALL GetStaticLongField(JNIEnv* jfloat JNICALL GetStaticFloatField(JNIEnv* env, jclass clazz, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } jdouble JNICALL GetStaticDoubleField(JNIEnv* env, jclass clazz, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL SetStaticObjectField(JNIEnv* env, jclass clazz, jfieldID fieldID, jobject value) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL SetStaticBooleanField(JNIEnv* env, jclass clazz, jfieldID fieldID, jboolean value) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL SetStaticByteField(JNIEnv* env, jclass clazz, jfieldID fieldID, jbyte value) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL SetStaticCharField(JNIEnv* env, jclass clazz, jfieldID fieldID, jchar value) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL SetStaticShortField(JNIEnv* env, jclass clazz, jfieldID fieldID, jshort value) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL SetStaticIntField(JNIEnv* env, jclass clazz, jfieldID fieldID, jint value) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL SetStaticLongField(JNIEnv* env, jclass clazz, jfieldID fieldID, jlong value) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL SetStaticFloatField(JNIEnv* env, jclass clazz, jfieldID fieldID, jfloat value) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL SetStaticDoubleField(JNIEnv* env, jclass clazz, jfieldID fieldID, jdouble value) { enterJVM(); leaveJVM(); NYI(); } - jstring JNICALL NewString(JNIEnv* env, const jchar* unicode, jsize len) { enterJVM(); leaveJVM(); NYI(); } jsize JNICALL GetStringLength(JNIEnv* env, jstring str) { jsize res; From gael.thomas at lip6.fr Sat Jan 4 14:56:59 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 22:56:59 -0000 Subject: [vmkit-commits] [vmkit] r198518 - Implements the lookupswitch opcode Message-ID: <20140104225700.14DBF2A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 16:56:59 2014 New Revision: 198518 URL: http://llvm.org/viewvc/llvm-project?rev=198518&view=rev Log: Implements the lookupswitch opcode Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=198518&r1=198517&r2=198518&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Sat Jan 4 16:56:59 2014 @@ -145,6 +145,8 @@ namespace j3 { void newArray(J3ArrayClass* type); void newObject(J3Class* cl); + void lookupSwitch(); + void ldc(uint32_t idx); void selectExceptionNode(uint32_t idx); 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=198518&r1=198517&r2=198518&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sat Jan 4 16:56:59 2014 @@ -40,13 +40,16 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato vm = J3Thread::get()->vm(); #if 0 - if(m->cl()->name() == vm->names()->get("java/util/concurrent/atomic/AtomicInteger")) - vm->options()->debugTranslate = 4; + /* usefull to debug a single function */ + if( cl->name() == vm->names()->get("java/nio/Bits") && + method->name() == vm->names()->get("") && + method->signature()->name() == vm->names()->get("()V") ) + vm->options()->debugTranslate = 3; #endif if(vm->options()->debugTranslate) fprintf(stderr, " translating bytecode of: %s::%s%s\n", - method->cl()->name()->cStr(), + cl->name()->cStr(), method->name()->cStr(), method->signature()->name()->cStr()); @@ -697,6 +700,21 @@ void J3CodeGen::ldc(uint32_t idx) { stack.push(res); } +void J3CodeGen::lookupSwitch() { + codeReader->seek(((codeReader->tell() - 1) & -4) + 4, J3Reader::SeekSet); + llvm::Value* val = stack.pop(); + llvm::BasicBlock* def = forwardBranch("lookupswitch-match", javaPC + codeReader->readU4(), 1, 1); + uint32_t n = codeReader->readU4(); + + for(uint32_t i=0; ireadS4(); + llvm::BasicBlock* ok = forwardBranch("lookupswitch-match", javaPC + codeReader->readS4(), 1, 1); + llvm::BasicBlock* nok = i == (n - 1) ? def : newBB("lookupswitch-next"); + builder->CreateCondBr(builder->CreateICmpEQ(val, builder->getInt32(match)), ok, nok); + builder->SetInsertPoint(nok); + } +} + llvm::BasicBlock* J3CodeGen::newBB(const char* name) { return llvm::BasicBlock::Create(llvmFunction->getContext(), name, llvmFunction); } @@ -708,6 +726,8 @@ void J3CodeGen::condBr(llvm::Value* op) } llvm::BasicBlock* J3CodeGen::forwardBranch(const char* id, uint32_t pc, bool doAlloc, bool doPush) { + if(vm->options()->debugTranslate > 2) + fprintf(stderr, " forward branch at %d\n", pc); llvm::BasicBlock* res = opInfos[pc].bb; if(res) @@ -908,7 +928,6 @@ void J3CodeGen::translate() { llvmFunction->dump(); case 4: case 3: - fprintf(stderr, "stack:\n"); stack.dump(); case 2: fprintf(stderr, " [%4d] decoding: %s\n", javaPC, J3Cst::opcodeNames[bc]); @@ -921,7 +940,7 @@ void J3CodeGen::translate() { if(vm->options()->genDebugExecute) { char buf[256]; snprintf(buf, 256, " [%4d] executing: %-20s in %s::%s", javaPC, - J3Cst::opcodeNames[bc], method->cl()->name()->cStr(), method->name()->cStr()); + J3Cst::opcodeNames[bc], cl->name()->cStr(), method->name()->cStr()); builder->CreateCall3(funcEchoDebugExecute, builder->getInt32(2), buildString("%s\n"), @@ -1412,7 +1431,10 @@ void J3CodeGen::translate() { case J3Cst::BC_jsr: nyi(); /* 0xa8 */ case J3Cst::BC_ret: nyi(); /* 0xa9 wide */ case J3Cst::BC_tableswitch: nyi(); /* 0xaa */ - case J3Cst::BC_lookupswitch: nyi(); /* 0xab */ + + case J3Cst::BC_lookupswitch: + lookupSwitch(); + break; case J3Cst::BC_ireturn: /* 0xac */ case J3Cst::BC_lreturn: /* 0xad */ @@ -1529,7 +1551,7 @@ void J3CodeGen::translate() { #if 0 void J3CodeGen::explore() { - printf(" exploring bytecode of: %s::%s%s\n", method->cl()->name()->cStr(), method->name()->cStr(), method->signature()->cStr()); + printf(" exploring bytecode of: %s::%s%s\n", cl->name()->cStr(), method->name()->cStr(), method->signature()->cStr()); while(codeReader->remaining()) { uint8_t bc = codeReader->readU1(); @@ -1591,7 +1613,7 @@ void J3CodeGen::generateJava() { if(vm->options()->genDebugExecute) { char buf[256]; - snprintf(buf, 256, "%s::%s", method->cl()->name()->cStr(), method->name()->cStr()); + snprintf(buf, 256, "%s::%s", cl->name()->cStr(), method->name()->cStr()); #if 0 fprintf(stderr, "bitcast: "); @@ -1643,7 +1665,7 @@ void J3CodeGen::generateJava() { builder->SetInsertPoint(bbRet); if(vm->options()->genDebugExecute) { char buf[256]; - snprintf(buf, 256, "%s::%s", method->cl()->name()->cStr(), method->name()->cStr()); + snprintf(buf, 256, "%s::%s", cl->name()->cStr(), method->name()->cStr()); builder->CreateCall3(funcEchoDebugEnter, builder->getInt32(1), buildString("%s\n"), @@ -1684,7 +1706,7 @@ llvm::Type* J3CodeGen::doNativeType(llvm llvm::Function* J3CodeGen::lookupNative() { J3Mangler mangler(cl); - mangler.mangle(mangler.javaId)->mangle(method->cl()->name(), method->name()); + mangler.mangle(mangler.javaId)->mangle(cl->name(), method->name()); uint32_t length = mangler.length(); mangler.mangle(method->signature()); Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc?rev=198518&r1=198517&r2=198518&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc Sat Jan 4 16:56:59 2014 @@ -70,26 +70,8 @@ void J3CodeGenVar::init(J3CodeGen* _code void J3CodeGenVar::dump() { for(uint32_t i=0; iisIntegerTy(64)) - v = doubleStack[i]; - else if(t->isIntegerTy()) - v = intStack[i]; - else if(t->isFloatTy()) - v = floatStack[i]; - else if(t->isDoubleTy()) - v = doubleStack[i]; - else if(t->isPointerTy()) - v = refStack[i]; - else { - t->dump(); - J3::internalError("should not happen"); - } - - v->dump(); + fprintf(stderr, " [%u]: ", i); + stackOf(metaStack[i])[i]->dump(); //fprintf(stderr, "\n"); } } 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=198518&r1=198517&r2=198518&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sat Jan 4 16:56:59 2014 @@ -255,6 +255,13 @@ jmethodID JNICALL GetStaticMethodID(JNIE return res.val##j3type; \ } +#define defSetField(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); \ + leaveJVM(); \ + } + #define defNewArray(jtype, id, j3type) \ jtype##Array JNICALL New##id##Array(JNIEnv* env, jsize len) { \ jtype##Array res; \ @@ -271,13 +278,6 @@ jmethodID JNICALL GetStaticMethodID(JNIE leaveJVM(); \ } -#define defSetField(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); \ - leaveJVM(); \ - } - #define defJNIObj(jtype, id, j3type) \ defCall(jtype, id, j3type) \ defNonVirtualCall(jtype, id, j3type) \ From gael.thomas at lip6.fr Sat Jan 4 15:13:27 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 23:13:27 -0000 Subject: [vmkit-commits] [vmkit] r198519 - Implements more unsafe functions Message-ID: <20140104231327.93DB52A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 17:13:27 2014 New Revision: 198519 URL: http://llvm.org/viewvc/llvm-project?rev=198519&view=rev Log: Implements more unsafe functions Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc?rev=198519&r1=198518&r2=198519&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc Sat Jan 4 17:13:27 2014 @@ -47,20 +47,48 @@ extern "C" { return fields[slot].offset(); } - JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwapObject(JNIEnv* env, jobject unsafe, - jobject handle, jlong offset, jobject orig, jobject value) { - return handle->rawCASObject(offset, orig, value) == orig; + JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_allocateMemory(JNIEnv* env, jobject unsafe, jlong bytes) { + return (jlong)(uintptr_t)malloc(bytes); } - JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwapInt(JNIEnv* env, jobject unsafe, - jobject handle, jlong offset, jint orig, jint value) { - return handle->rawCASInteger(offset, orig, value) == orig; + JNIEXPORT void JNICALL Java_sun_misc_Unsafe_freeMemory(JNIEnv* env, jobject unsafe, jlong addr) { + free((void*)(uintptr_t)addr); } - JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_getIntVolatile(JNIEnv* env, jobject unsafe, - jobject handle, jlong offset) { - return handle->rawGetInteger(offset); +#define unsafeGetPut(jtype, id, j3id, sign) \ + JNIEXPORT void JNICALL Java_sun_misc_Unsafe_put##id##__J##sign(JNIEnv* env, jobject unsafe, jlong addr, jtype value) { \ + *(jtype*)(uintptr_t)addr = value; \ + } \ + \ + JNIEXPORT jtype JNICALL Java_sun_misc_Unsafe_get##id##__J(JNIEnv* env, jobject unsafe, jlong addr) { \ + return *(jtype*)(uintptr_t)addr; \ } + +#define unsafeCAS(jtype, id, j3id, sign) \ + JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwap##id(JNIEnv* env, jobject unsafe, \ + jobject handle, jlong offset, jtype orig, jtype value) { \ + return handle->rawCAS##j3id(offset, orig, value) == orig; \ + } + +#define unsafeGetVolatile(jtype, id, j3id, sign) \ + JNIEXPORT jtype JNICALL Java_sun_misc_Unsafe_get##id##Volatile(JNIEnv* env, jobject unsafe, jobject handle, jlong offset) { \ + return handle->rawGet##j3id(offset); \ + } + +#define defUnsafe(jtype, id, j3id, sign) \ + unsafeGetVolatile(jtype, id, j3id, sign) \ + unsafeCAS(jtype, id, j3id, sign) \ + unsafeGetPut(jtype, id, j3id, sign) + + defUnsafe(jobject, Object, Object, Ljava_lang_Object_2); + defUnsafe(jboolean, Boolean, Boolean, Z); + defUnsafe(jbyte, Byte, Byte, B); + defUnsafe(jchar, Char, Char, C); + defUnsafe(jshort, Short, Short, S); + defUnsafe(jint, Int, Integer, I); + defUnsafe(jlong, Long, Long, J); + defUnsafe(jfloat, Float, Float, F); + defUnsafe(jdouble, Double, Double, D); } From gael.thomas at lip6.fr Sat Jan 4 15:16:46 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 23:16:46 -0000 Subject: [vmkit-commits] [vmkit] r198520 - fix a bug for array bound check in arraycopy Message-ID: <20140104231646.7D1222A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 17:16:46 2014 New Revision: 198520 URL: http://llvm.org/viewvc/llvm-project?rev=198520&view=rev Log: fix a bug for array bound check in arraycopy Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc 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=198520&r1=198519&r2=198520&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 4 17:16:46 2014 @@ -86,8 +86,9 @@ void JNICALL JVM_ArrayCopy(JNIEnv* env, if(!srcType0->isArrayClass() || !dstType0->isArrayClass() || !srcType0->isAssignableTo(dstType0)) J3::arrayStoreException(); - if(src_pos >= src->arrayLength() || - dst_pos >= dst->arrayLength() || + //fprintf(stderr, " array copy: [%d %d %d] [%d %d %d]\n", src_pos, length, src->arrayLength(), dst_pos, length, dst->arrayLength()); + if(src_pos < 0 || + dst_pos < 0 || (src_pos + length) > src->arrayLength() || (dst_pos + length) > dst->arrayLength()) J3::arrayIndexOutOfBoundsException(); From gael.thomas at lip6.fr Sat Jan 4 15:42:33 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 04 Jan 2014 23:42:33 -0000 Subject: [vmkit-commits] [vmkit] r198522 - Implements some jni function and fixes a bug in the j3mangler Message-ID: <20140104234233.83C8B2A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 17:42:33 2014 New Revision: 198522 URL: http://llvm.org/viewvc/llvm-project?rev=198522&view=rev Log: Implements some jni function and fixes a bug in the j3mangler Modified: vmkit/branches/mcjit/include/j3/j3mangler.h vmkit/branches/mcjit/lib/j3/vm/j3jni.cc vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc Modified: vmkit/branches/mcjit/include/j3/j3mangler.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3mangler.h?rev=198522&r1=198521&r2=198522&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3mangler.h (original) +++ vmkit/branches/mcjit/include/j3/j3mangler.h Sat Jan 4 17:42:33 2014 @@ -22,7 +22,7 @@ namespace j3 { char* next; void check(size_t n); - + char hex(uint32_t n); public: static const char* j3Id; static const char* javaId; 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=198522&r1=198521&r2=198522&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sat Jan 4 17:42:33 2014 @@ -406,7 +406,18 @@ jlong JNICALL GetStaticLongField(JNIEnv* jfloat JNICALL GetStaticFloatField(JNIEnv* env, jclass clazz, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } jdouble JNICALL GetStaticDoubleField(JNIEnv* env, jclass clazz, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } -jstring JNICALL NewString(JNIEnv* env, const jchar* unicode, jsize len) { enterJVM(); leaveJVM(); NYI(); } +jstring JNICALL NewString(JNIEnv* env, const jchar* unicode, jsize len) { + jstring res; + enterJVM(); + J3* vm = J3Thread::get()->vm(); + J3ObjectHandle* content = J3ObjectHandle::doNewArray(vm->typeChar->getArray(), len); + content->setRegionChar(0, unicode, 0, len); + res = J3ObjectHandle::doNewObject(vm->stringClass); + vm->stringClassInit->invokeSpecial(res, content, 0); + leaveJVM(); + return res; +} + jsize JNICALL GetStringLength(JNIEnv* env, jstring str) { jsize res; enterJVM(); @@ -462,7 +473,13 @@ void JNICALL ReleaseStringUTFChars(JNIEn } -jsize JNICALL GetArrayLength(JNIEnv* env, jarray array) { enterJVM(); leaveJVM(); NYI(); } +jsize JNICALL GetArrayLength(JNIEnv* env, jarray array) { + jsize res; + enterJVM(); + res = array->arrayLength(); + leaveJVM(); + return res; +} jobjectArray JNICALL NewObjectArray(JNIEnv* env, jsize len, jclass clazz, jobject init) { enterJVM(); leaveJVM(); NYI(); } jobject JNICALL GetObjectArrayElement(JNIEnv* env, jobjectArray array, jsize index) { enterJVM(); leaveJVM(); NYI(); } @@ -514,7 +531,11 @@ jint JNICALL MonitorExit(JNIEnv* env, jo jint JNICALL GetJavaVM(JNIEnv* env, JavaVM** vm) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len, jchar* buf) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len, jchar* buf) { + enterJVM(); + str->getObject(J3Thread::get()->vm()->stringClassValue)->getRegionChar(start, buf, 0, len); + leaveJVM(); +} void JNICALL GetStringUTFRegion(JNIEnv* env, jstring str, jsize start, jsize len, char* buf) { enterJVM(); Modified: vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc?rev=198522&r1=198521&r2=198522&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc Sat Jan 4 17:42:33 2014 @@ -77,51 +77,58 @@ J3Mangler* J3Mangler::mangle(const vmkit } J3Mangler* J3Mangler::mangle(uint16_t c) { - if(c > 256) { - check(6); - *cur++ = '_'; - *cur++ = '0'; - *cur++ = (c >> 24 & 0xf) + '0'; - *cur++ = (c >> 16 & 0xf) + '0'; - *cur++ = (c >> 8 & 0xf) + '0'; - *cur++ = (c >> 0 & 0xf) + '0'; - } else { - - switch(c) { - case '<': - case '>': - break; /* do not encode at all */ - case '(': - case ')': - J3Thread::get()->vm()->internalError("should not try to encode a special character such as %c", (char)c); - case '_': - check(2); - *cur++ = '_'; - *cur++ = '1'; - break; - case ';': - check(2); - *cur++ = '_'; - *cur++ = '2'; - break; - case '[': - check(2); - *cur++ = '_'; - *cur++ = '3'; - break; - case '/': - c = '_'; - default: + switch(c) { + case '<': + case '>': + break; /* do not encode at all */ + case '(': + case ')': + J3Thread::get()->vm()->internalError("should not try to encode a special character such as %c", (char)c); + case '_': + check(2); + *cur++ = '_'; + *cur++ = '1'; + break; + case ';': + check(2); + *cur++ = '_'; + *cur++ = '2'; + break; + case '[': + check(2); + *cur++ = '_'; + *cur++ = '3'; + break; + case '/': + c = '_'; + default: + if((c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z') || + (c >= '0' && c <= '9') || + (c == '_')) { check(1); *cur++ = c; - } - + } else { + check(6); + *cur++ = '_'; + *cur++ = '0'; + *cur++ = hex(c >> 12); + *cur++ = hex(c >> 8); + *cur++ = hex(c >> 4); + *cur++ = hex(c >> 0); + } } + cur = next; return this; } +char J3Mangler::hex(uint32_t n) { + n = n & 0xf; + return n < 10 ? (n + '0') : (n + 'a' - 10); +} + void J3Mangler::check(size_t n) { next = cur + n; if((next+1) >= (buf + max)) From gael.thomas at lip6.fr Sat Jan 4 16:05:21 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 05 Jan 2014 00:05:21 -0000 Subject: [vmkit-commits] [vmkit] r198524 - Few new JNI functions Message-ID: <20140105000521.B51C92A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 18:05:21 2014 New Revision: 198524 URL: http://llvm.org/viewvc/llvm-project?rev=198524&view=rev Log: Few new JNI functions Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3jni.cc 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=198524&r1=198523&r2=198524&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 4 18:05:21 2014 @@ -9,6 +9,8 @@ #include "j3/j3utf16.h" #include "jvm.h" +#include + using namespace j3; #define enterJVM() @@ -246,7 +248,16 @@ jlong JNICALL JVM_MaxMemory(void) { ente jint JNICALL JVM_ActiveProcessorCount(void) { enterJVM(); NYI(); leaveJVM(); } void * JNICALL JVM_LoadLibrary(const char *name) { enterJVM(); NYI(); leaveJVM(); } void JNICALL JVM_UnloadLibrary(void * handle) { enterJVM(); NYI(); leaveJVM(); } -void * JNICALL JVM_FindLibraryEntry(void *handle, const char *name) { enterJVM(); NYI(); leaveJVM(); } + +void * JNICALL JVM_FindLibraryEntry(void *handle, const char *name) { + void* res; + enterJVM(); + res = dlsym(handle, name); + fprintf(stderr, " find entry %s in %p => %p\n", name, handle, res); + leaveJVM(); + return res; +} + jboolean JNICALL JVM_IsSupportedJNIVersion(jint version) { enterJVM(); NYI(); leaveJVM(); } /* 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=198524&r1=198523&r2=198524&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sat Jan 4 18:05:21 2014 @@ -255,11 +255,33 @@ jmethodID JNICALL GetStaticMethodID(JNIE return res.val##j3type; \ } -#define defSetField(jtype, id, j3type) \ +#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); \ leaveJVM(); \ + } \ + \ + jtype JNICALL GetStatic##id##Field(JNIEnv* env, jclass clazz, jfieldID fieldID) { \ + jtype res; \ + enterJVM(); \ + res = J3ObjectType::nativeClass(clazz)->asClass()->staticInstance()->get##j3type(fieldID); \ + leaveJVM(); \ + return res; \ + } \ + \ + void JNICALL Set##id##Field(JNIEnv* env, jobject obj, jfieldID fieldID, jtype val) { \ + enterJVM(); \ + obj->set##j3type(fieldID, val); \ + leaveJVM(); \ + } \ + \ + jtype JNICALL Get##id##Field(JNIEnv* env, jobject obj, jfieldID fieldID) { \ + jtype res; \ + enterJVM(); \ + res = obj->get##j3type(fieldID); \ + leaveJVM(); \ + return res; \ } #define defNewArray(jtype, id, j3type) \ @@ -274,7 +296,12 @@ jmethodID JNICALL GetStaticMethodID(JNIE #define defArrayRegion(jtype, id, j3type) \ void JNICALL Set##id##ArrayRegion(JNIEnv* env, jtype##Array array, jsize start, jsize len, const jtype* buf) { \ enterJVM(); \ - array->setRegion##j3type(0, buf, start, len); \ + array->setRegion##j3type(start, buf, 0, len); \ + leaveJVM(); \ + } \ + void JNICALL Get##id##ArrayRegion(JNIEnv* env, jtype##Array array, jsize start, jsize len, jtype* buf) { \ + enterJVM(); \ + array->getRegion##j3type(start, buf, 0, len); \ leaveJVM(); \ } @@ -282,7 +309,7 @@ jmethodID JNICALL GetStaticMethodID(JNIE defCall(jtype, id, j3type) \ defNonVirtualCall(jtype, id, j3type) \ defStaticCall(jtype, id, j3type) \ - defSetField(jtype, id, j3type) + defGetSetField(jtype, id, j3type) #define defJNI(jtype, id, j3type) \ defJNIObj(jtype, id, j3type) \ @@ -366,26 +393,6 @@ jfieldID JNICALL GetFieldID(JNIEnv* env, return res; } -jobject JNICALL GetObjectField(JNIEnv* env, jobject obj, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } -jboolean JNICALL GetBooleanField(JNIEnv* env, jobject obj, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } -jbyte JNICALL GetByteField(JNIEnv* env, jobject obj, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } -jchar JNICALL GetCharField(JNIEnv* env, jobject obj, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } -jshort JNICALL GetShortField(JNIEnv* env, jobject obj, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } -jint JNICALL GetIntField(JNIEnv* env, jobject obj, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } -jlong JNICALL GetLongField(JNIEnv* env, jobject obj, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } -jfloat JNICALL GetFloatField(JNIEnv* env, jobject obj, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } -jdouble JNICALL GetDoubleField(JNIEnv* env, jobject obj, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } - -void JNICALL SetObjectField(JNIEnv* env, jobject obj, jfieldID fieldID, jobject val) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL SetBooleanField(JNIEnv* env, jobject obj, jfieldID fieldID, jboolean val) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL SetByteField(JNIEnv* env, jobject obj, jfieldID fieldID, jbyte val) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL SetCharField(JNIEnv* env, jobject obj, jfieldID fieldID, jchar val) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL SetShortField(JNIEnv* env, jobject obj, jfieldID fieldID, jshort val) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL SetIntField(JNIEnv* env, jobject obj, jfieldID fieldID, jint val) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL SetLongField(JNIEnv* env, jobject obj, jfieldID fieldID, jlong val) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL SetFloatField(JNIEnv* env, jobject obj, jfieldID fieldID, jfloat val) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL SetDoubleField(JNIEnv* env, jobject obj, jfieldID fieldID, jdouble val) { enterJVM(); leaveJVM(); NYI(); } - jfieldID JNICALL GetStaticFieldID(JNIEnv* env, jclass clazz, const char* name, const char* sig) { jfieldID res; enterJVM(); @@ -396,16 +403,6 @@ jfieldID JNICALL GetStaticFieldID(JNIEnv return res; } -jobject JNICALL GetStaticObjectField(JNIEnv* env, jclass clazz, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } -jboolean JNICALL GetStaticBooleanField(JNIEnv* env, jclass clazz, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } -jbyte JNICALL GetStaticByteField(JNIEnv* env, jclass clazz, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } -jchar JNICALL GetStaticCharField(JNIEnv* env, jclass clazz, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } -jshort JNICALL GetStaticShortField(JNIEnv* env, jclass clazz, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } -jint JNICALL GetStaticIntField(JNIEnv* env, jclass clazz, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } -jlong JNICALL GetStaticLongField(JNIEnv* env, jclass clazz, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } -jfloat JNICALL GetStaticFloatField(JNIEnv* env, jclass clazz, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } -jdouble JNICALL GetStaticDoubleField(JNIEnv* env, jclass clazz, jfieldID fieldID) { enterJVM(); leaveJVM(); NYI(); } - jstring JNICALL NewString(JNIEnv* env, const jchar* unicode, jsize len) { jstring res; enterJVM(); @@ -503,15 +500,6 @@ void JNICALL ReleaseLongArrayElements(JN void JNICALL ReleaseFloatArrayElements(JNIEnv* env, jfloatArray array, jfloat* elems, jint mode) { enterJVM(); leaveJVM(); NYI(); } void JNICALL ReleaseDoubleArrayElements(JNIEnv* env, jdoubleArray array, jdouble* elems, jint mode) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL GetBooleanArrayRegion(JNIEnv* env, jbooleanArray array, jsize start, jsize l, jboolean* buf) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL GetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte* buf) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL GetCharArrayRegion(JNIEnv* env, jcharArray array, jsize start, jsize len, jchar* buf) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL GetShortArrayRegion(JNIEnv* env, jshortArray array, jsize start, jsize len, jshort* buf) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL GetIntArrayRegion(JNIEnv* env, jintArray array, jsize start, jsize len, jint* buf) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL GetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, jsize len, jlong* buf) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL GetFloatArrayRegion(JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat* buf) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL GetDoubleArrayRegion(JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble* buf) { enterJVM(); leaveJVM(); NYI(); } - jint JNICALL RegisterNatives(JNIEnv* env, jclass clazz, const JNINativeMethod* methods, jint nMethods) { enterJVM(); J3Class* cl = J3Class::nativeClass(clazz)->asClass(); From gael.thomas at lip6.fr Sat Jan 4 16:21:28 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 05 Jan 2014 00:21:28 -0000 Subject: [vmkit-commits] [vmkit] r198525 - Begin to setup system properties. Message-ID: <20140105002128.BEE4A2A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 18:21:28 2014 New Revision: 198525 URL: http://llvm.org/viewvc/llvm-project?rev=198525&view=rev Log: Begin to setup system properties. Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc 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=198525&r1=198524&r2=198525&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 4 18:21:28 2014 @@ -10,6 +10,7 @@ #include "jvm.h" #include +#include using namespace j3; @@ -104,7 +105,17 @@ void JNICALL JVM_ArrayCopy(JNIEnv* env, jobject JNICALL JVM_InitProperties(JNIEnv* env, jobject p) { enterJVM(); -#if 0 + J3* vm = J3Thread::get()->vm(); + J3Class* pcl = p->vt()->type()->asClass(); + J3Method* _setProp = pcl->findMethod(0, + vm->names()->get("setProperty"), + pcl->loader() + ->getSignature(0, + vm->names()->get("(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;"))); + +#define setProp(key, val) _setProp->invokeVirtual(p, vm->utfToString(key), vm->utfToString(val)); +#define setEnvProp(key, val) ({ const char* tmp = getenv(val); if(!tmp) tmp = ""; setProp(key, val); }) + /* *
java.version
Java version number *
java.vendor
Java vendor specific string @@ -122,38 +133,36 @@ jobject JNICALL JVM_InitProperties(JNIEn *
user.home
User home directory *
user.dir
User's current working directory */ - JavaObject * prop = *(JavaObject**)p; - llvm_gcroot(prop, 0); - setProperty(vm, prop, "java.vm.specification.version", "1.0"); - setProperty(vm, prop, "java.vm.specification.vendor", - "Sun Microsystems, Inc"); - setProperty(vm, prop, "java.vm.specification.name", - "Java Virtual Machine Specification"); - setProperty(vm, prop, "java.specification.version", "1.5"); - setProperty(vm, prop, "java.specification.vendor", "Sun Microsystems, Inc"); - setProperty(vm, prop, "java.specification.name", - "Java Platform API Specification"); - setProperty(vm, prop, "java.version", "1.5"); - setProperty(vm, prop, "java.runtime.version", "1.5"); - setProperty(vm, prop, "java.vendor", "The VMKit Project"); - setProperty(vm, prop, "java.vendor.url", "http://vmkit.llvm.org"); - - tmp = getenv("JAVA_HOME"); - if (!tmp) tmp = ""; - setProperty(vm, prop, "java.home", tmp); + setProp("java.vm.specification.version", "1.2"); + setProp("java.vm.specification.vendor", "Sun Microsystems, Inc"); + setProp("java.vm.specification.name", "Java Virtual Machine Specification"); + setProp("java.specification.version", "1.8"); + setProp("java.specification.vendor", "Sun Microsystems, Inc"); + setProp("java.specification.name", "Java Platform API Specification"); + setProp("java.version", "1.8"); + setProp("java.runtime.version", "1.8"); + setProp("java.vendor", "The VMKit Project"); + setProp("java.vendor.url", "http://vmkit.llvm.org"); + setEnvProp("java.home", "JAVA_HOME"); + setProp("java.class.version", "52.0"); + setProp("java.vm.version", "0.5"); + setProp("java.vm.vendor", "The VMKit Project"); + setProp("java.vm.name", "J3"); + setProp("java.specification.version", "1.8"); + + struct utsname infos; + uname(&infos); + setProp("os.name", infos.sysname); + setProp("os.arch", infos.machine); + setProp("os.version", infos.release); +#if 0 + setProp("java.io.tmpdir", "/tmp"); JnjvmBootstrapLoader* JCL = vm->bootstrapLoader; - setProperty(vm, prop, "java.class.version", "49.0"); setProperty(vm, prop, "java.class.path", vm->classpath); setProperty(vm, prop, "java.boot.class.path", JCL->bootClasspathEnv); setProperty(vm, prop, "sun.boot.class.path", JCL->bootClasspathEnv); - setProperty(vm, prop, "java.vm.version", "0.28"); - setProperty(vm, prop, "java.vm.vendor", "The VMKit Project"); - setProperty(vm, prop, "java.vm.name", "J3"); - setProperty(vm, prop, "java.specification.version", "1.5"); - setProperty(vm, prop, "java.io.tmpdir", "/tmp"); - setProperty(vm, prop, "build.compiler", "gcj"); setProperty(vm, prop, "gcj.class.path", JCL->bootClasspathEnv); @@ -165,7 +174,11 @@ jobject JNICALL JVM_InitProperties(JNIEn // Align behavior with GNU Classpath for now, to pass mauve test setProperty(vm, prop, "sun.lang.ClassLoader.allowArraySyntax", "true"); - setUnameProp(vm, prop); + if (!strcmp(infos.machine, "ppc")) { + setProperty(vm, prop, "gnu.cpu.endian","big"); + } else { + setProperty(vm, prop, "gnu.cpu.endian","little"); + } setProperty(vm, prop, "file.separator", vm->dirSeparator); setProperty(vm, prop, "path.separator", vm->envSeparator); From gael.thomas at lip6.fr Sat Jan 4 16:34:45 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 05 Jan 2014 00:34:45 -0000 Subject: [vmkit-commits] [vmkit] r198527 - Add path properties. Message-ID: <20140105003445.CFC872A6C029@llvm.org> Author: gthomas Date: Sat Jan 4 18:34:44 2014 New Revision: 198527 URL: http://llvm.org/viewvc/llvm-project?rev=198527&view=rev Log: Add path properties. Modified: vmkit/branches/mcjit/include/j3/j3classloader.h vmkit/branches/mcjit/include/j3/j3lib.h vmkit/branches/mcjit/include/j3/j3options.h vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=198527&r1=198526&r2=198527&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Sat Jan 4 18:34:44 2014 @@ -81,7 +81,7 @@ namespace j3 { J3ZipArchive* archive; std::map _cmangled; public: - J3InitialClassLoader(const char* rtjar, vmkit::BumpAllocator* allocator); + J3InitialClassLoader(vmkit::BumpAllocator* allocator); J3Class* loadClass(const vmkit::Name* name); const char* cmangled(const char* demangled) { return _cmangled[demangled]; } Modified: vmkit/branches/mcjit/include/j3/j3lib.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3lib.h?rev=198527&r1=198526&r2=198527&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3lib.h (original) +++ vmkit/branches/mcjit/include/j3/j3lib.h Sat Jan 4 18:34:44 2014 @@ -11,6 +11,7 @@ namespace j3 { class J3Lib { public: static const char* systemClassesArchives(); + static const char* systemLibraryPath(); static int loadSystemLibraries(std::vector >* handles); static void bootstrap(J3* vm); Modified: vmkit/branches/mcjit/include/j3/j3options.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3options.h?rev=198527&r1=198526&r2=198527&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3options.h (original) +++ vmkit/branches/mcjit/include/j3/j3options.h Sat Jan 4 18:34:44 2014 @@ -25,7 +25,9 @@ namespace j3 { public: bool assertionsEnabled; const char* selfBitCodePath; - const char* rtJar; + const char* bootClasspath; + const char* systemLibraryPath; + const char* classpath; bool debugEnterIndent; uint32_t genDebugExecute; uint32_t debugExecute; Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=198527&r1=198526&r2=198527&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Sat Jan 4 18:34:44 2014 @@ -55,6 +55,10 @@ const char* J3Lib::systemClassesArchives return rtjar; } +const char* J3Lib::systemLibraryPath() { + return OPENJDK_LIBPATH; +} + int J3Lib::loadSystemLibraries(std::vector >* nativeLibraries) { /* JavaRuntimeSupport checks for a symbol defined in this library */ void* h0 = dlopen(OPENJDK_LIBPATH"/libinstrument"SHLIBEXT, RTLD_LAZY | RTLD_GLOBAL); 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=198527&r1=198526&r2=198527&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 4 18:34:44 2014 @@ -114,7 +114,7 @@ jobject JNICALL JVM_InitProperties(JNIEn vm->names()->get("(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;"))); #define setProp(key, val) _setProp->invokeVirtual(p, vm->utfToString(key), vm->utfToString(val)); -#define setEnvProp(key, val) ({ const char* tmp = getenv(val); if(!tmp) tmp = ""; setProp(key, val); }) +#define setPropEnv(key, val) ({ const char* tmp = getenv(val); if(!tmp) tmp = ""; setProp(key, val); }) /* *
java.version
Java version number @@ -134,6 +134,11 @@ jobject JNICALL JVM_InitProperties(JNIEn *
user.dir
User's current working directory */ + setProp("java.class.path", vm->options()->classpath); + setProp("java.boot.class.path", vm->options()->bootClasspath); + setProp("sun.boot.library.path", vm->options()->systemLibraryPath); + setProp("sun.boot.class.path", vm->options()->bootClasspath); +#if 0 setProp("java.vm.specification.version", "1.2"); setProp("java.vm.specification.vendor", "Sun Microsystems, Inc"); setProp("java.vm.specification.name", "Java Virtual Machine Specification"); @@ -144,32 +149,27 @@ jobject JNICALL JVM_InitProperties(JNIEn setProp("java.runtime.version", "1.8"); setProp("java.vendor", "The VMKit Project"); setProp("java.vendor.url", "http://vmkit.llvm.org"); - setEnvProp("java.home", "JAVA_HOME"); + setPropEnv("java.home", "JAVA_HOME"); setProp("java.class.version", "52.0"); setProp("java.vm.version", "0.5"); setProp("java.vm.vendor", "The VMKit Project"); setProp("java.vm.name", "J3"); setProp("java.specification.version", "1.8"); + setPropEnv("java.library.path", "LD_LIBRARY_PATH"); struct utsname infos; uname(&infos); setProp("os.name", infos.sysname); setProp("os.arch", infos.machine); setProp("os.version", infos.release); -#if 0 setProp("java.io.tmpdir", "/tmp"); JnjvmBootstrapLoader* JCL = vm->bootstrapLoader; - setProperty(vm, prop, "java.class.path", vm->classpath); - setProperty(vm, prop, "java.boot.class.path", JCL->bootClasspathEnv); - setProperty(vm, prop, "sun.boot.class.path", JCL->bootClasspathEnv); setProperty(vm, prop, "build.compiler", "gcj"); setProperty(vm, prop, "gcj.class.path", JCL->bootClasspathEnv); setProperty(vm, prop, "gnu.classpath.boot.library.path", JCL->libClasspathEnv); - //setProperty(vm, prop, "java.library.path", TODO: getenv("LD_LIBRARY_PATH")) - setProperty(vm, prop, "sun.boot.library.path", JCL->libClasspathEnv); // Align behavior with GNU Classpath for now, to pass mauve test setProperty(vm, prop, "sun.lang.ClassLoader.allowArraySyntax", "true"); 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=198527&r1=198526&r2=198527&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sat Jan 4 18:34:44 2014 @@ -85,9 +85,7 @@ void J3::run() { introspect(); vmkit::BumpAllocator* loaderAllocator = vmkit::BumpAllocator::create(); - initialClassLoader = - new(loaderAllocator) - J3InitialClassLoader(options()->rtJar, loaderAllocator); + initialClassLoader = new(loaderAllocator) J3InitialClassLoader(loaderAllocator); vmkit::BumpAllocator* a = initialClassLoader->allocator(); 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=198527&r1=198526&r2=198527&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sat Jan 4 18:34:44 2014 @@ -204,9 +204,9 @@ bool J3ClassLoader::J3InterfaceMethodLes && (lhs->signature() < rhs->signature())); } -J3InitialClassLoader::J3InitialClassLoader(const char* rtjar, vmkit::BumpAllocator* _alloc) +J3InitialClassLoader::J3InitialClassLoader(vmkit::BumpAllocator* _alloc) : J3ClassLoader(0, _alloc) { - const char* archives = J3Thread::get()->vm()->options()->rtJar; + const char* archives = J3Thread::get()->vm()->options()->bootClasspath; J3ClassBytes* bytes = J3Reader::openFile(allocator(), archives); //makeLLVMFunctions_j3(); 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=198527&r1=198526&r2=198527&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Sat Jan 4 18:34:44 2014 @@ -11,7 +11,9 @@ using namespace j3; J3Options::J3Options() { assertionsEnabled = 1; selfBitCodePath = SELF_BITCODE; - rtJar = J3Lib::systemClassesArchives(); + bootClasspath = J3Lib::systemClassesArchives(); + systemLibraryPath = J3Lib::systemLibraryPath(); + classpath = ""; debugEnterIndent = 1; From gael.thomas at lip6.fr Sun Jan 5 01:46:51 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 05 Jan 2014 09:46:51 -0000 Subject: [vmkit-commits] [vmkit] r198553 - Correctly define the java class of a primitive. Message-ID: <20140105094652.5DD842A6C029@llvm.org> Author: gthomas Date: Sun Jan 5 03:46:51 2014 New Revision: 198553 URL: http://llvm.org/viewvc/llvm-project?rev=198553&view=rev Log: Correctly define the java class of a primitive. Modified: vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/include/j3/j3constants.h vmkit/branches/mcjit/include/j3/j3typesdef.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc 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 vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198553&r1=198552&r2=198553&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Sun Jan 5 03:46:51 2014 @@ -295,6 +295,7 @@ namespace j3 { uint32_t logSize() { return _logSize; } bool isPrimitive() { return 1; } llvm::Type* llvmType() { return _llvmType; } + void defineJavaClass(const char* className); }; } Modified: vmkit/branches/mcjit/include/j3/j3constants.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3constants.h?rev=198553&r1=198552&r2=198553&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3constants.h (original) +++ vmkit/branches/mcjit/include/j3/j3constants.h Sun Jan 5 03:46:51 2014 @@ -81,7 +81,7 @@ namespace j3 { static const char ID_Void = 'V'; static const char ID_Byte = 'B'; - static const char ID_Char = 'C'; + static const char ID_Character = 'C'; static const char ID_Double = 'D'; static const char ID_Float = 'F'; static const char ID_Integer = 'I'; Modified: vmkit/branches/mcjit/include/j3/j3typesdef.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3typesdef.h?rev=198553&r1=198552&r2=198553&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3typesdef.h (original) +++ vmkit/branches/mcjit/include/j3/j3typesdef.h Sun Jan 5 03:46:51 2014 @@ -5,14 +5,14 @@ namespace j3 { /* name, ctype, llvmType, scale size */ #define onJavaPrimitives(_) \ - _(Boolean, bool, Int1, 0) \ - _(Byte, int8_t, Int8, 0) \ - _(Short, int16_t, Int16, 1) \ - _(Char, uint16_t, Int16, 1) \ - _(Integer, int32_t, Int32, 2) \ - _(Long, int64_t, Int64, 3) \ - _(Float, float, Float, 2) \ - _(Double, double, Double, 3) \ + _(Boolean, bool, Int1, 0) \ + _(Byte, int8_t, Int8, 0) \ + _(Short, int16_t, Int16, 1) \ + _(Character, uint16_t, Int16, 1) \ + _(Integer, int32_t, Int32, 2) \ + _(Long, int64_t, Int64, 3) \ + _(Float, float, Float, 2) \ + _(Double, double, Double, 3) \ #define onJavaVoid(_) \ _(Void, void, Void, 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=198553&r1=198552&r2=198553&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Jan 5 03:46:51 2014 @@ -563,9 +563,25 @@ jboolean JNICALL JVM_IsInterface(JNIEnv* jobjectArray JNICALL JVM_GetClassSigners(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } void JNICALL JVM_SetClassSigners(JNIEnv* env, jclass cls, jobjectArray signers) { enterJVM(); NYI(); leaveJVM(); } jobject JNICALL JVM_GetProtectionDomain(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } -jboolean JNICALL JVM_IsArrayClass(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } + +jboolean JNICALL JVM_IsArrayClass(JNIEnv* env, jclass cls) { + jboolean res; + enterJVM(); + res = J3ObjectType::nativeClass(cls)->isArrayClass(); + leaveJVM(); + return res; +} + jboolean JNICALL JVM_IsPrimitiveClass(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } -jclass JNICALL JVM_GetComponentType(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } +jclass JNICALL JVM_GetComponentType(JNIEnv* env, jclass cls) { + jclass res; + enterJVM(); + J3ObjectType* cl = J3ObjectType::nativeClass(cls); + res = cl->isArrayClass() ? cl->asArrayClass()->component()->javaClass() : 0; + leaveJVM(); + return res; +} + jint JNICALL JVM_GetClassModifiers(JNIEnv* env, jclass cls) { jint res; enterJVM(); Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc?rev=198553&r1=198552&r2=198553&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc Sun Jan 5 03:46:51 2014 @@ -80,15 +80,15 @@ extern "C" { unsafeCAS(jtype, id, j3id, sign) \ unsafeGetPut(jtype, id, j3id, sign) - defUnsafe(jobject, Object, Object, Ljava_lang_Object_2); - defUnsafe(jboolean, Boolean, Boolean, Z); - defUnsafe(jbyte, Byte, Byte, B); - defUnsafe(jchar, Char, Char, C); - defUnsafe(jshort, Short, Short, S); - defUnsafe(jint, Int, Integer, I); - defUnsafe(jlong, Long, Long, J); - defUnsafe(jfloat, Float, Float, F); - defUnsafe(jdouble, Double, Double, D); + defUnsafe(jobject, Object, Object, Ljava_lang_Object_2); + defUnsafe(jboolean, Boolean, Boolean, Z); + defUnsafe(jbyte, Byte, Byte, B); + defUnsafe(jchar, Char, Character, C); + defUnsafe(jshort, Short, Short, S); + defUnsafe(jint, Int, Integer, I); + defUnsafe(jlong, Long, Long, J); + defUnsafe(jfloat, Float, Float, F); + defUnsafe(jdouble, Double, Double, D); } 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=198553&r1=198552&r2=198553&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 5 03:46:51 2014 @@ -106,7 +106,7 @@ void J3::run() { arrayInterfaces[0] = z_class("java/lang/Cloneable"); arrayInterfaces[1] = z_class("java/io/Serializable"); - charArrayClass = typeChar->getArray(); + charArrayClass = typeCharacter->getArray(); objectClass = z_class("java/lang/Object"); objectClass->resolve(); @@ -137,6 +137,11 @@ void J3::run() { constructorClassInit = z_method(0, constructorClass, initName, names()->get("(Ljava/lang/Class;[Ljava/lang/Class;[Ljava/lang/Class;IILjava/lang/String;[B[B)V")); +#define defJavaClassPrimitive(name, ctype, llvmtype, scale) \ + type##name->defineJavaClass("java/lang/"#name); + onJavaTypes(defJavaClassPrimitive) +#undef defJavaClassPrimitive + J3Lib::bootstrap(this); } @@ -173,7 +178,7 @@ J3ObjectHandle* J3::nameToString(const v buf[pos++] = encoder.nextUtf16(); res = initialClassLoader->globalReferences()->add(J3ObjectHandle::doNewArray(charArrayClass, pos)); - res->setRegionChar(0, buf, 0, pos); + res->setRegionCharacter(0, buf, 0, pos); J3Thread::get()->restore(prev); nameToCharArrays[name] = res; 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=198553&r1=198552&r2=198553&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Jan 5 03:46:51 2014 @@ -934,3 +934,8 @@ J3Primitive::J3Primitive(J3ClassLoader* _logSize = logSize; } +void J3Primitive::defineJavaClass(const char* className) { + J3* vm = J3Thread::get()->vm(); + fprintf(stderr, " ---> %s\n", className); + _javaClass = vm->initialClassLoader->loadClass(vm->names()->get(className))->javaClass(0); +} 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=198553&r1=198552&r2=198553&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sun Jan 5 03:46:51 2014 @@ -108,15 +108,10 @@ J3Type* J3ClassLoader::getTypeInternal(J switch(type[pos]) { case J3Cst::ID_Array: prof++; pos++; break; - case J3Cst::ID_Void: res = vm->typeVoid; pos++; break; - case J3Cst::ID_Byte: res = vm->typeByte; pos++; break; - case J3Cst::ID_Char: res = vm->typeChar; pos++; break; - case J3Cst::ID_Double: res = vm->typeDouble; pos++; break; - case J3Cst::ID_Float: res = vm->typeFloat; pos++; break; - case J3Cst::ID_Integer: res = vm->typeInteger; pos++; break; - case J3Cst::ID_Long: res = vm->typeLong; pos++; break; - case J3Cst::ID_Short: res = vm->typeShort; pos++; break; - case J3Cst::ID_Boolean: res = vm->typeBoolean; pos++; break; +#define doIt(id, ctype, llvmType, scale) \ + case J3Cst::ID_##id: res = vm->type##id; pos++; break; + onJavaTypes(doIt) +#undef doIt case J3Cst::ID_Classname: if(unify) { uint32_t start = ++pos; 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=198553&r1=198552&r2=198553&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sun Jan 5 03:46:51 2014 @@ -171,7 +171,7 @@ llvm::Value* J3CodeGen::flatten(llvm::Va return v; else if(type == vm->typeBoolean->llvmType() || type == vm->typeByte->llvmType() || type == vm->typeShort->llvmType()) return builder->CreateSExt(v, vm->typeInteger->llvmType()); - else if(type == vm->typeChar->llvmType()) + else if(type == vm->typeCharacter->llvmType()) return builder->CreateZExt(v, vm->typeInteger->llvmType()); fprintf(stderr, " v: "); @@ -189,7 +189,7 @@ llvm::Value* J3CodeGen::unflatten(llvm:: return v; else if(type == vm->typeBoolean->llvmType() || type == vm->typeByte->llvmType() || type == vm->typeShort->llvmType()) return builder->CreateSExtOrTrunc(v, type); - else if(type == vm->typeChar->llvmType()) + else if(type == vm->typeCharacter->llvmType()) return builder->CreateZExtOrTrunc(v, type); fprintf(stderr, " v: "); @@ -543,7 +543,7 @@ void J3CodeGen::newArray(uint8_t atype) switch(atype) { case J3Cst::T_BOOLEAN: prim = vm->typeBoolean; break; - case J3Cst::T_CHAR: prim = vm->typeChar; break; + case J3Cst::T_CHAR: prim = vm->typeCharacter; break; case J3Cst::T_FLOAT: prim = vm->typeFloat; break; case J3Cst::T_DOUBLE: prim = vm->typeDouble; break; case J3Cst::T_BYTE: prim = vm->typeByte; break; @@ -1066,7 +1066,7 @@ void J3CodeGen::translate() { break; case J3Cst::BC_caload: /* 0x34 */ - arrayLoad(vm->typeChar); + arrayLoad(vm->typeCharacter); break; case J3Cst::BC_saload: /* 0x35 */ @@ -1141,7 +1141,7 @@ void J3CodeGen::translate() { break; case J3Cst::BC_castore: /* 0x55 */ - arrayStore(vm->typeChar); + arrayStore(vm->typeCharacter); break; case J3Cst::BC_sastore: /* 0x56 */ 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=198553&r1=198552&r2=198553&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sun Jan 5 03:46:51 2014 @@ -319,7 +319,7 @@ jmethodID JNICALL GetStaticMethodID(JNIE defJNIObj(jobject, Object, Object); defJNI (jboolean, Boolean, Boolean); defJNI (jbyte, Byte, Byte); - defJNI (jchar, Char, Char); + defJNI (jchar, Char, Character); defJNI (jshort, Short, Short); defJNI (jint, Int, Integer); defJNI (jlong, Long, Long); @@ -407,8 +407,8 @@ jstring JNICALL NewString(JNIEnv* env, c jstring res; enterJVM(); J3* vm = J3Thread::get()->vm(); - J3ObjectHandle* content = J3ObjectHandle::doNewArray(vm->typeChar->getArray(), len); - content->setRegionChar(0, unicode, 0, len); + J3ObjectHandle* content = J3ObjectHandle::doNewArray(vm->typeCharacter->getArray(), len); + content->setRegionCharacter(0, unicode, 0, len); res = J3ObjectHandle::doNewObject(vm->stringClass); vm->stringClassInit->invokeSpecial(res, content, 0); leaveJVM(); @@ -521,7 +521,7 @@ jint JNICALL GetJavaVM(JNIEnv* env, Java void JNICALL GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len, jchar* buf) { enterJVM(); - str->getObject(J3Thread::get()->vm()->stringClassValue)->getRegionChar(start, buf, 0, len); + str->getObject(J3Thread::get()->vm()->stringClassValue)->getRegionCharacter(start, buf, 0, len); leaveJVM(); } 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=198553&r1=198552&r2=198553&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sun Jan 5 03:46:51 2014 @@ -131,24 +131,14 @@ J3Value J3Method::internalInvoke(J3Objec for(llvm::FunctionType::param_iterator cur=fType->param_begin(); cur!=fType->param_end(); cur++, i++) { llvm::Type* t = *cur; - if(t == vm->typeBoolean->llvmType()) - args[i].valBoolean = va_arg(va, bool); - else if(t == vm->typeByte->llvmType()) - args[i].valByte = va_arg(va, int8_t); - else if(t == vm->typeShort->llvmType()) - args[i].valShort = va_arg(va, int16_t); - else if(t == vm->typeChar->llvmType()) - args[i].valChar = va_arg(va, uint16_t); - else if(t == vm->typeInteger->llvmType()) - args[i].valInteger = va_arg(va, int32_t); - else if(t == vm->typeLong->llvmType()) - args[i].valLong = va_arg(va, int64_t); - else if(t == vm->typeFloat->llvmType()) - args[i].valFloat = va_arg(va, float); - else if(t == vm->typeDouble->llvmType()) - args[i].valDouble = va_arg(va, double); + if(0) {} +#define doIt(id, ctype, lt, scale) \ + else if(t == vm->type##id->llvmType()) \ + args[i].val##id = va_arg(va, ctype); + onJavaPrimitives(doIt) else args[i].valObject = va_arg(va, J3ObjectHandle*); +#undef doIt } return cxxCaller()(fnPtr(), args); Modified: vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc?rev=198553&r1=198552&r2=198553&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc Sun Jan 5 03:46:51 2014 @@ -41,7 +41,7 @@ size_t J3Utf16Decoder::decode(J3ObjectHa size_t pos = 0; for(uint32_t i=0; igetCharAt(i); + uint16_t c = charArray->getCharacterAt(i); if(c > 127) { J3::internalError("implement me: fun char"); } else { From gael.thomas at lip6.fr Sun Jan 5 02:10:56 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 05 Jan 2014 10:10:56 -0000 Subject: [vmkit-commits] [vmkit] r198554 - Unify primitive classes + new openjdk interface functions + new properties. Message-ID: <20140105101056.E44532A6C029@llvm.org> Author: gthomas Date: Sun Jan 5 04:10:56 2014 New Revision: 198554 URL: http://llvm.org/viewvc/llvm-project?rev=198554&view=rev Log: Unify primitive classes + new openjdk interface functions + new properties. Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3class.cc 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=198554&r1=198553&r2=198554&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Jan 5 04:10:56 2014 @@ -11,6 +11,7 @@ #include #include +#include using namespace j3; @@ -78,7 +79,16 @@ jstring JNICALL JVM_InternString(JNIEnv* /* * java.lang.System */ -jlong JNICALL JVM_CurrentTimeMillis(JNIEnv* env, jclass ignored) { enterJVM(); NYI(); leaveJVM(); } +jlong JNICALL JVM_CurrentTimeMillis(JNIEnv* env, jclass ignored) { + jlong res; + enterJVM(); + struct timeval tv; + gettimeofday(&tv, 0); + res = tv.tv_sec*1e3 + tv.tv_usec/1000; + leaveJVM(); + return res; +} + jlong JNICALL JVM_NanoTime(JNIEnv* env, jclass ignored) { enterJVM(); NYI(); leaveJVM(); } void JNICALL JVM_ArrayCopy(JNIEnv* env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) { enterJVM(); @@ -138,6 +148,11 @@ jobject JNICALL JVM_InitProperties(JNIEn setProp("java.boot.class.path", vm->options()->bootClasspath); setProp("sun.boot.library.path", vm->options()->systemLibraryPath); setProp("sun.boot.class.path", vm->options()->bootClasspath); + setProp("file.separator", "/"); + setProp("path.separator", ":"); + setProp("line.separator", "\n"); + setPropEnv("java.home", "JAVA_HOME"); + #if 0 setProp("java.vm.specification.version", "1.2"); setProp("java.vm.specification.vendor", "Sun Microsystems, Inc"); @@ -149,7 +164,6 @@ jobject JNICALL JVM_InitProperties(JNIEn setProp("java.runtime.version", "1.8"); setProp("java.vendor", "The VMKit Project"); setProp("java.vendor.url", "http://vmkit.llvm.org"); - setPropEnv("java.home", "JAVA_HOME"); setProp("java.class.version", "52.0"); setProp("java.vm.version", "0.5"); setProp("java.vm.vendor", "The VMKit Project"); @@ -259,14 +273,21 @@ jlong JNICALL JVM_TotalMemory(void) { en jlong JNICALL JVM_FreeMemory(void) { enterJVM(); NYI(); leaveJVM(); } jlong JNICALL JVM_MaxMemory(void) { enterJVM(); NYI(); leaveJVM(); } jint JNICALL JVM_ActiveProcessorCount(void) { enterJVM(); NYI(); leaveJVM(); } -void * JNICALL JVM_LoadLibrary(const char *name) { enterJVM(); NYI(); leaveJVM(); } + +void* JNICALL JVM_LoadLibrary(const char *name) { + void* res; + enterJVM(); + res = dlopen(name, RTLD_LAZY | RTLD_LOCAL); + leaveJVM(); + return res; +} + void JNICALL JVM_UnloadLibrary(void * handle) { enterJVM(); NYI(); leaveJVM(); } void * JNICALL JVM_FindLibraryEntry(void *handle, const char *name) { void* res; enterJVM(); res = dlsym(handle, name); - fprintf(stderr, " find entry %s in %p => %p\n", name, handle, res); leaveJVM(); return res; } @@ -442,29 +463,28 @@ jclass JNICALL JVM_FindPrimitiveClass(JN enterJVM(); J3* vm = J3Thread::get()->vm(); - J3ClassLoader* loader = vm->initialClassLoader; vmkit::Names* names = vm->names(); - J3Class* cl; + J3Type* cl; if(!strcmp(utf, "boolean")) - cl = loader->loadClass(names->get("java/lang/Boolean")); + cl = vm->typeBoolean; else if(!strcmp(utf, "byte")) - cl = loader->loadClass(names->get("java/lang/Byte")); + cl = vm->typeByte; else if(!strcmp(utf, "char")) - cl = loader->loadClass(names->get("java/lang/Character")); + cl = vm->typeCharacter; else if(!strcmp(utf, "short")) - cl = loader->loadClass(names->get("java/lang/Short")); + cl = vm->typeShort; else if(!strcmp(utf, "int")) - cl = loader->loadClass(names->get("java/lang/Integer")); + cl = vm->typeInteger; else if(!strcmp(utf, "long")) - cl = loader->loadClass(names->get("java/lang/Long")); + cl = vm->typeLong; else if(!strcmp(utf, "float")) - cl = loader->loadClass(names->get("java/lang/Float")); + cl = vm->typeFloat; else if(!strcmp(utf, "double")) - cl = loader->loadClass(names->get("java/lang/Double")); + cl = vm->typeDouble; else if(!strcmp(utf, "void")) - cl = loader->loadClass(names->get("java/lang/Void")); + cl = vm->typeVoid; else J3::internalError("unsupported primitive: %s", utf); @@ -572,7 +592,20 @@ jboolean JNICALL JVM_IsArrayClass(JNIEnv return res; } -jboolean JNICALL JVM_IsPrimitiveClass(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } +jboolean JNICALL JVM_IsPrimitiveClass(JNIEnv* env, jclass cls) { + jboolean res = 0; + enterJVM(); + J3* vm = J3Thread::get()->vm(); + if(0) {} +#define testIt(id, ctype, llvmType, scale) \ + else if(cls->isSame(vm->type##id->javaClass())) \ + res = 1; + onJavaTypes(testIt) +#undef testIt + leaveJVM(); + return res; +} + jclass JNICALL JVM_GetComponentType(JNIEnv* env, jclass cls) { jclass res; enterJVM(); 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=198554&r1=198553&r2=198554&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Jan 5 04:10:56 2014 @@ -936,6 +936,5 @@ J3Primitive::J3Primitive(J3ClassLoader* void J3Primitive::defineJavaClass(const char* className) { J3* vm = J3Thread::get()->vm(); - fprintf(stderr, " ---> %s\n", className); _javaClass = vm->initialClassLoader->loadClass(vm->names()->get(className))->javaClass(0); } From gael.thomas at lip6.fr Sun Jan 5 02:30:20 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 05 Jan 2014 10:30:20 -0000 Subject: [vmkit-commits] [vmkit] r198555 - Implement more openjdk or jni functions, add the javavm interface. Message-ID: <20140105103020.B59B42A6C029@llvm.org> Author: gthomas Date: Sun Jan 5 04:30:20 2014 New Revision: 198555 URL: http://llvm.org/viewvc/llvm-project?rev=198555&view=rev Log: Implement more openjdk or jni functions, add the javavm interface. Added: vmkit/branches/mcjit/lib/j3/vm/j3javavm.cc Modified: vmkit/branches/mcjit/include/j3/j3jni.h vmkit/branches/mcjit/include/j3/j3thread.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3jni.cc vmkit/branches/mcjit/lib/j3/vm/j3thread.cc Modified: vmkit/branches/mcjit/include/j3/j3jni.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3jni.h?rev=198555&r1=198554&r2=198555&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3jni.h (original) +++ vmkit/branches/mcjit/include/j3/j3jni.h Sun Jan 5 04:30:20 2014 @@ -5,6 +5,7 @@ namespace j3 { extern struct JNINativeInterface_ jniEnvTable; + extern struct JNIInvokeInterface_ javaVMTable; } #endif Modified: vmkit/branches/mcjit/include/j3/j3thread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3thread.h?rev=198555&r1=198554&r2=198555&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3thread.h (original) +++ vmkit/branches/mcjit/include/j3/j3thread.h Sun Jan 5 04:30:20 2014 @@ -22,6 +22,7 @@ namespace j3 { vmkit::BumpAllocator* _allocator; JNIEnv _jniEnv; + JavaVM _javaVM; J3LocalReferences _localReferences; J3ObjectHandle* _pendingException; J3ObjectHandle _javaThread; @@ -54,6 +55,7 @@ namespace j3 { J3* vm() { return (J3*)Thread::vm(); } JNIEnv* jniEnv() { return &_jniEnv; } + JavaVM* javaVM() { return &_javaVM; } static J3Thread* get(); static J3Thread* get(void* ptr); 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=198555&r1=198554&r2=198555&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Jan 5 04:30:20 2014 @@ -25,7 +25,9 @@ using namespace j3; PART 0 ************************************************************************/ -jint JNICALL JVM_GetInterfaceVersion(void) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_GetInterfaceVersion(void) { + return JVM_INTERFACE_VERSION; +} /************************************************************************* PART 1: Functions for Native Libraries @@ -292,7 +294,13 @@ void * JNICALL JVM_FindLibraryEntry(void return res; } -jboolean JNICALL JVM_IsSupportedJNIVersion(jint version) { enterJVM(); NYI(); leaveJVM(); } +jboolean JNICALL JVM_IsSupportedJNIVersion(jint version) { + return version == JNI_VERSION_1_1 || + version == JNI_VERSION_1_2 || + version == JNI_VERSION_1_4 || + version == JNI_VERSION_1_6 || + version == JNI_VERSION_1_8; +} /* * java.lang.Float and java.lang.Double @@ -787,7 +795,31 @@ jobject JNICALL JVM_GetStackAccessContro void * JNICALL JVM_RegisterSignal(jint sig, void *handler) { enterJVM(); NYI(); leaveJVM(); } jboolean JNICALL JVM_RaiseSignal(jint sig) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_FindSignal(const char *name) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_FindSignal(const char *name) { + jint res = 0; + + enterJVM(); + + static struct { + const char * name; + int num; + } SignalMap[] = + { + { "TERM", SIGTERM }, + { "HUP", SIGHUP }, + { "INT", SIGINT } + }; + static uint32_t signal_count = sizeof(SignalMap)/sizeof(SignalMap[0]); + + for(uint32_t i = 0; i < signal_count; ++i) { + if (!strcmp(name, SignalMap[i].name)) + res = SignalMap[i].num; + } + + leaveJVM(); + + return res; +} /* * Retrieve the assertion directives for the specified class. Added: vmkit/branches/mcjit/lib/j3/vm/j3javavm.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3javavm.cc?rev=198555&view=auto ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3javavm.cc (added) +++ vmkit/branches/mcjit/lib/j3/vm/j3javavm.cc Sun Jan 5 04:30:20 2014 @@ -0,0 +1,30 @@ +#include "j3/j3jni.h" +#include "j3/j3thread.h" +#include "j3/j3.h" + +namespace j3 { + +#define enterJVM() try { +#define leaveJVM() } catch(void* e) { J3Thread::get()->setPendingException(J3Thread::get()->push((J3Object*)e)); } + +#define NYI() { J3Thread::get()->vm()->internalError("not yet implemented: '%s'", __PRETTY_FUNCTION__); } + +jint DestroyJavaVM(JavaVM *vm) { enterJVM(); leaveJVM(); NYI(); } +jint AttachCurrentThread(JavaVM *vm, void **penv, void *args) { enterJVM(); leaveJVM(); NYI(); } +jint DetachCurrentThread(JavaVM *vm) { enterJVM(); leaveJVM(); NYI(); } +jint GetEnv(JavaVM *vm, void **penv, jint version) { enterJVM(); leaveJVM(); NYI(); } +jint AttachCurrentThreadAsDaemon(JavaVM *vm, void **penv, void *args) { enterJVM(); leaveJVM(); NYI(); } + +struct JNIInvokeInterface_ javaVMTable = { + 0, + 0, + 0, + DestroyJavaVM, + AttachCurrentThread, + DetachCurrentThread, + GetEnv, + AttachCurrentThreadAsDaemon, +}; + +} + 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=198555&r1=198554&r2=198555&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sun Jan 5 04:30:20 2014 @@ -15,7 +15,9 @@ namespace j3 { -jint JNICALL GetVersion(JNIEnv* env) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL GetVersion(JNIEnv* env) { + return JNI_VERSION_1_8; +} jclass JNICALL DefineClass(JNIEnv* env, const char* name, jobject loader, const jbyte* buf, jsize len) { enterJVM(); leaveJVM(); NYI(); } jclass JNICALL FindClass(JNIEnv* env, const char* name) { @@ -517,7 +519,10 @@ jint JNICALL UnregisterNatives(JNIEnv* e jint JNICALL MonitorEnter(JNIEnv* env, jobject obj) { enterJVM(); leaveJVM(); NYI(); } jint JNICALL MonitorExit(JNIEnv* env, jobject obj) { enterJVM(); leaveJVM(); NYI(); } -jint JNICALL GetJavaVM(JNIEnv* env, JavaVM** vm) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL GetJavaVM(JNIEnv* env, JavaVM** vm) { + *vm = J3Thread::get()->javaVM(); + return 0; +} void JNICALL GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len, jchar* buf) { enterJVM(); 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=198555&r1=198554&r2=198555&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3thread.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3thread.cc Sun Jan 5 04:30:20 2014 @@ -13,6 +13,7 @@ J3Thread::J3Thread(J3* vm) : _allocator(vmkit::BumpAllocator::create()), _localReferences(_allocator) { _jniEnv.functions = &jniEnvTable; + _javaVM.functions = &javaVMTable; } J3Thread::~J3Thread() { From gael.thomas at lip6.fr Sun Jan 5 12:26:32 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 05 Jan 2014 20:26:32 -0000 Subject: [vmkit-commits] [vmkit] r198568 - The JVM is now bootstraped! Execute 109080 instructions. Message-ID: <20140105202632.9DA442A6C029@llvm.org> Author: gthomas Date: Sun Jan 5 14:26:32 2014 New Revision: 198568 URL: http://llvm.org/viewvc/llvm-project?rev=198568&view=rev Log: The JVM is now bootstraped! Execute 109080 instructions. Modified: vmkit/branches/mcjit/include/vmkit/thread.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/vmkit/thread.cc Modified: vmkit/branches/mcjit/include/vmkit/thread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/thread.h?rev=198568&r1=198567&r2=198568&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/thread.h (original) +++ vmkit/branches/mcjit/include/vmkit/thread.h Sun Jan 5 14:26:32 2014 @@ -11,13 +11,17 @@ namespace vmkit { class VMKit; class Thread { + public: + typedef void (*sa_action_t)(int, siginfo_t *, void *); + + private: VMKit* _vm; pthread_t _tid; static void* doRun(void* thread); static void sigsegvHandler(int n, siginfo_t* info, void* context); - static void sigendHandler(int n, siginfo_t* info, void* context); + void registerSignalInternal(int n, sa_action_t handler, bool altStack); public: Thread(VMKit* vm); virtual ~Thread() {} @@ -33,9 +37,10 @@ namespace vmkit { static Thread* get(void* ptr); static Thread* get(); + bool registerSignal(int n, sa_action_t handler); + void start(); void join(); - }; class StackWalker { 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=198568&r1=198567&r2=198568&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Jan 5 14:26:32 2014 @@ -793,8 +793,20 @@ jobject JNICALL JVM_GetStackAccessContro * Other platform-dependent signal values may also be supported. */ -void * JNICALL JVM_RegisterSignal(jint sig, void *handler) { enterJVM(); NYI(); leaveJVM(); } +void* JNICALL JVM_RegisterSignal(jint sig, void *handler) { + void* res; + enterJVM(); + if(sig == SIGINT || sig == SIGTERM || sig == SIGHUP) { + J3Thread::get()->registerSignal(sig, (J3Thread::sa_action_t)handler); + res = handler; + } else + res = (void*)-1; + leaveJVM(); + return res; +} + jboolean JNICALL JVM_RaiseSignal(jint sig) { enterJVM(); NYI(); leaveJVM(); } + jint JNICALL JVM_FindSignal(const char *name) { jint res = 0; 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=198568&r1=198567&r2=198568&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 5 14:26:32 2014 @@ -74,6 +74,8 @@ void J3::start(int argc, char** argv) { J3Thread* thread = new J3ThreadBootstrap(this); vmkitBootstrap(thread, options()->selfBitCodePath); + + fprintf(stderr, " vm is bootstraped, congratulation!\n"); } void J3::run() { Modified: vmkit/branches/mcjit/lib/vmkit/thread.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/thread.cc?rev=198568&r1=198567&r2=198568&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/thread.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/thread.cc Sun Jan 5 14:26:32 2014 @@ -12,10 +12,6 @@ void Thread::sigsegvHandler(int n, sigin get()->vm()->sigsegv((uintptr_t)info->si_addr); } -void Thread::sigendHandler(int n, siginfo_t* info, void* context) { - get()->vm()->sigend(); -} - void* Thread::operator new(size_t n) { return ThreadAllocator::allocator()->allocate(); } @@ -36,39 +32,39 @@ uintptr_t Thread::getThreadMask() { return ThreadAllocator::allocator()->magic(); } -void* Thread::doRun(void* _thread) { - Thread* thread = (Thread*)_thread; - - // Set the alternate stack as the second page of the thread's - // stack. - stack_t st; - st.ss_sp = ThreadAllocator::allocator()->alternateStackAddr(thread); - st.ss_flags = 0; - st.ss_size = ThreadAllocator::allocator()->alternateStackSize(thread); - sigaltstack(&st, NULL); - +void Thread::registerSignalInternal(int n, sa_action_t handler, bool altStack) { // Set the SIGSEGV handler to diagnose errors. struct sigaction sa; sigset_t mask; sigfillset(&mask); sa.sa_flags = SA_SIGINFO | SA_ONSTACK | SA_NODEFER; + if(altStack) + sa.sa_flags = SA_ONSTACK; sa.sa_mask = mask; - sa.sa_sigaction = sigsegvHandler; - sigaction(SIGSEGV, &sa, NULL); - sigaction(SIGBUS, &sa, NULL); + sa.sa_sigaction = handler; + sigaction(n, &sa, NULL); +} + +bool Thread::registerSignal(int n, sa_action_t handler) { + if(n == SIGSEGV || n == SIGBUS) + return 0; + registerSignalInternal(n, handler, 0); + return 1; +} - // to handle termination +void* Thread::doRun(void* _thread) { + Thread* thread = (Thread*)_thread; + + // Set the alternate stack as the second page of the thread's + // stack. + stack_t st; st.ss_sp = ThreadAllocator::allocator()->alternateStackAddr(thread); st.ss_flags = 0; st.ss_size = ThreadAllocator::allocator()->alternateStackSize(thread); sigaltstack(&st, NULL); - sigfillset(&mask); - sa.sa_flags = SA_SIGINFO | SA_ONSTACK | SA_NODEFER; - sa.sa_mask = mask; - sa.sa_sigaction = sigendHandler; - //sigaction(SIGHUP, &sa, NULL); - //sigaction(SIGINT, &sa, NULL); - //sigaction(SIGTERM, &sa, NULL); + + thread->registerSignalInternal(SIGSEGV, sigsegvHandler, 1); + thread->registerSignalInternal(SIGBUS, sigsegvHandler, 1); thread->run(); return 0; From gael.thomas at lip6.fr Sun Jan 5 13:18:18 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 05 Jan 2014 21:18:18 -0000 Subject: [vmkit-commits] [vmkit] r198570 - A static instance has to contain a J3Object at the beginning. Message-ID: <20140105211819.0AEF62A6C029@llvm.org> Author: gthomas Date: Sun Jan 5 15:18:18 2014 New Revision: 198570 URL: http://llvm.org/viewvc/llvm-project?rev=198570&view=rev Log: A static instance has to contain a J3Object at the beginning. Modified: vmkit/branches/mcjit/include/j3/j3options.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 vmkit/branches/mcjit/lib/j3/vm/j3options.cc vmkit/branches/mcjit/lib/vmkit/gc.cc Modified: vmkit/branches/mcjit/include/j3/j3options.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3options.h?rev=198570&r1=198569&r2=198570&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3options.h (original) +++ vmkit/branches/mcjit/include/j3/j3options.h Sun Jan 5 15:18:18 2014 @@ -36,6 +36,7 @@ namespace j3 { uint32_t debugIniting; uint32_t debugTranslate; uint32_t debugLinking; + uint32_t debugLifeCycle; uintptr_t stackSize; 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=198570&r1=198569&r2=198570&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Jan 5 15:18:18 2014 @@ -796,8 +796,8 @@ jobject JNICALL JVM_GetStackAccessContro void* JNICALL JVM_RegisterSignal(jint sig, void *handler) { void* res; enterJVM(); - if(sig == SIGINT || sig == SIGTERM || sig == SIGHUP) { - J3Thread::get()->registerSignal(sig, (J3Thread::sa_action_t)handler); + if(sig == SIGINT || sig == SIGTERM || sig == SIGHUP) { /* fixme: I need a full jvm to support this joke */ + //J3Thread::get()->registerSignal(sig, (J3Thread::sa_action_t)handler); res = handler; } else res = (void*)-1; 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=198570&r1=198569&r2=198570&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 5 15:18:18 2014 @@ -75,7 +75,8 @@ void J3::start(int argc, char** argv) { vmkitBootstrap(thread, options()->selfBitCodePath); - fprintf(stderr, " vm is bootstraped, congratulation!\n"); + if(options()->debugLifeCycle) + fprintf(stderr, " VM terminate\n"); } void J3::run() { @@ -144,7 +145,22 @@ void J3::run() { onJavaTypes(defJavaClassPrimitive) #undef defJavaClassPrimitive + if(options()->debugLifeCycle) + fprintf(stderr, " Bootstraping the system library\n"); + J3Lib::bootstrap(this); + + if(options()->debugLifeCycle) + fprintf(stderr, " Creating the system class loader\n"); + + z_method(J3Cst::ACC_STATIC, + z_class("java/lang/ClassLoader"), + names()->get("getSystemClassLoader"), + names()->get("()Ljava/lang/ClassLoader;")) + ->invokeStatic(); + + // public static ClassLoader getSystemClassLoader() { + } JNIEnv* J3::jniEnv() { 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=198570&r1=198569&r2=198570&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Jan 5 15:18:18 2014 @@ -597,6 +597,7 @@ void J3Class::readClassBytes(J3Field* hi _structSize = super()->structSize(); } + _staticLayout._structSize = sizeof(J3Object); _structSize = ((_structSize - 1) & -sizeof(uintptr_t)) + sizeof(uintptr_t); fillFields(pFields3, i3); 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=198570&r1=198569&r2=198570&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sun Jan 5 15:18:18 2014 @@ -938,6 +938,15 @@ void J3CodeGen::translate() { } if(vm->options()->genDebugExecute) { + if(vm->options()->genDebugExecute > 1) { + for(uint32_t i=0; iCreateCall4(funcEchoDebugExecute, + builder->getInt32(4), + buildString(" stack[%d]: %p\n"), + builder->getInt32(i), + stack.at(i)); + } + char buf[256]; snprintf(buf, 256, " [%4d] executing: %-20s in %s::%s", javaPC, J3Cst::opcodeNames[bc], cl->name()->cStr(), method->name()->cStr()); @@ -1642,7 +1651,7 @@ void J3CodeGen::generateJava() { for(llvm::Function::arg_iterator cur=llvmFunction->arg_begin(); cur!=llvmFunction->arg_end(); cur++) { locals.setAt(flatten(cur), pos); - if(vm->options()->debugExecute) + if(vm->options()->genDebugExecute) builder->CreateCall4(funcEchoDebugExecute, builder->getInt32(2), buildString(" arg[%d]: %p\n"), 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=198570&r1=198569&r2=198570&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Sun Jan 5 15:18:18 2014 @@ -23,8 +23,9 @@ J3Options::J3Options() { debugIniting = 0; debugTranslate = 0; debugLinking = 0; + debugLifeCycle = 1; - genDebugExecute = debugExecute ? 1 : 0; + genDebugExecute = 0;//debugExecute ? 1 : 0; stackSize = 0x80*0x1000; } Modified: vmkit/branches/mcjit/lib/vmkit/gc.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/gc.cc?rev=198570&r1=198569&r2=198570&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/gc.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/gc.cc Sun Jan 5 15:18:18 2014 @@ -1,5 +1,6 @@ #include "vmkit/gc.h" #include +#include using namespace vmkit; From gael.thomas at lip6.fr Sun Jan 5 13:30:44 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 05 Jan 2014 21:30:44 -0000 Subject: [vmkit-commits] [vmkit] r198571 - Full array copy implementation Message-ID: <20140105213044.E889E2A6C029@llvm.org> Author: gthomas Date: Sun Jan 5 15:30:44 2014 New Revision: 198571 URL: http://llvm.org/viewvc/llvm-project?rev=198571&view=rev Log: Full array copy implementation Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3jni.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc 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=198571&r1=198570&r2=198571&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Jan 5 15:30:44 2014 @@ -98,7 +98,8 @@ void JNICALL JVM_ArrayCopy(JNIEnv* env, J3Type* srcType0 = src->vt()->type(); J3Type* dstType0 = dst->vt()->type(); - if(!srcType0->isArrayClass() || !dstType0->isArrayClass() || !srcType0->isAssignableTo(dstType0)) + fprintf(stderr, " array copy from %s to %s\n", srcType0->name()->cStr(), dstType0->name()->cStr()); + if(!srcType0->isArrayClass() || !dstType0->isArrayClass()) J3::arrayStoreException(); //fprintf(stderr, " array copy: [%d %d %d] [%d %d %d]\n", src_pos, length, src->arrayLength(), dst_pos, length, dst->arrayLength()); @@ -110,7 +111,22 @@ void JNICALL JVM_ArrayCopy(JNIEnv* env, uint32_t scale = srcType0->asArrayClass()->component()->logSize(); - src->rawArrayCopyTo(src_pos << scale, dst, dst_pos << scale, length << scale); + if(srcType0->isAssignableTo(dstType0)) + src->rawArrayCopyTo(src_pos << scale, dst, dst_pos << scale, length << scale); + else { + J3Type* srcEl = srcType0->asArrayClass()->component(); + J3Type* dstEl = dstType0->asArrayClass()->component(); + + if(!srcEl->isObjectType() || !dstEl->isObjectType()) + J3::arrayStoreException(); + + for(uint32_t i=0; igetObjectAt(src_pos + i); + if(!val->vt()->type()->isAssignableTo(dstEl)) + J3::arrayStoreException(); + dst->setObjectAt(dst_pos + i, val); + } + } leaveJVM(); } 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=198571&r1=198570&r2=198571&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sun Jan 5 15:30:44 2014 @@ -49,7 +49,13 @@ jclass JNICALL GetSuperclass(JNIEnv* env return res; } -jboolean JNICALL IsAssignableFrom(JNIEnv* env, jclass sub, jclass sup) { enterJVM(); leaveJVM(); NYI(); } +jboolean JNICALL IsAssignableFrom(JNIEnv* env, jclass sub, jclass sup) { + jboolean res; + enterJVM(); + res = J3ObjectType::nativeClass(sub)->isAssignableTo(J3ObjectType::nativeClass(sup)); + leaveJVM(); + return res; +} jobject JNICALL ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID, jboolean isStatic) { enterJVM(); leaveJVM(); NYI(); } 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=198571&r1=198570&r2=198571&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Sun Jan 5 15:30:44 2014 @@ -21,11 +21,11 @@ J3Options::J3Options() { debugLoad = 0; debugResolve = 0; debugIniting = 0; - debugTranslate = 0; + debugTranslate = 1; debugLinking = 0; debugLifeCycle = 1; - genDebugExecute = 0;//debugExecute ? 1 : 0; + genDebugExecute = debugExecute ? 1 : 0; stackSize = 0x80*0x1000; } From gael.thomas at lip6.fr Sun Jan 5 13:50:05 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 05 Jan 2014 21:50:05 -0000 Subject: [vmkit-commits] [vmkit] r198572 - Only explore a catch block if the associated try block is inspected. Close the first basic block is needed. And most import, select the initial exception node after having selected the initial javaPC (otherwise, the first instruction could be the one of an exception handler). Message-ID: <20140105215005.D0B132A6C029@llvm.org> Author: gthomas Date: Sun Jan 5 15:50:05 2014 New Revision: 198572 URL: http://llvm.org/viewvc/llvm-project?rev=198572&view=rev Log: Only explore a catch block if the associated try block is inspected. Close the first basic block is needed. And most import, select the initial exception node after having selected the initial javaPC (otherwise, the first instruction could be the one of an exception handler). Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc 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=198572&r1=198571&r2=198572&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Jan 5 15:50:05 2014 @@ -98,7 +98,7 @@ void JNICALL JVM_ArrayCopy(JNIEnv* env, J3Type* srcType0 = src->vt()->type(); J3Type* dstType0 = dst->vt()->type(); - fprintf(stderr, " array copy from %s to %s\n", srcType0->name()->cStr(), dstType0->name()->cStr()); + //fprintf(stderr, " array copy from %s to %s\n", srcType0->name()->cStr(), dstType0->name()->cStr()); if(!srcType0->isArrayClass() || !dstType0->isArrayClass()) J3::arrayStoreException(); @@ -116,10 +116,10 @@ void JNICALL JVM_ArrayCopy(JNIEnv* env, else { J3Type* srcEl = srcType0->asArrayClass()->component(); J3Type* dstEl = dstType0->asArrayClass()->component(); - + if(!srcEl->isObjectType() || !dstEl->isObjectType()) J3::arrayStoreException(); - + for(uint32_t i=0; igetObjectAt(src_pos + i); if(!val->vt()->type()->isAssignableTo(dstEl)) 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=198572&r1=198571&r2=198572&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sun Jan 5 15:50:05 2014 @@ -41,10 +41,11 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato #if 0 /* usefull to debug a single function */ - if( cl->name() == vm->names()->get("java/nio/Bits") && - method->name() == vm->names()->get("") && - method->signature()->name() == vm->names()->get("()V") ) - vm->options()->debugTranslate = 3; + if( cl->name() == vm->names()->get("sun/misc/Launcher") && + method->name() == vm->names()->get("getFileURL") && + method->signature()->name() == vm->names()->get("(Ljava/io/File;)Ljava/net/URL;") ) { + vm->options()->debugTranslate = 2; + } #endif if(vm->options()->debugTranslate) @@ -861,11 +862,12 @@ void J3CodeGen::translate() { if(vm->options()->debugTranslate > 1) exceptions.dump(vm->options()->debugTranslate-1); - selectExceptionNode(0); - stack.topStack = 0; builder->SetInsertPoint(bb); _onEndPoint(); + closeBB = 1; + + selectExceptionNode(0); while(codeReader->remaining()) { llvm::Value* val1; Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc?rev=198572&r1=198571&r2=198572&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc Sun Jan 5 15:50:05 2014 @@ -102,7 +102,7 @@ void J3ExceptionTable::read(J3Reader* re entries[i].endPC = reader->readU2(); entries[i].handlerPC = reader->readU2(); entries[i].catchType = reader->readU2(); - entries[i].bb = codeGen->forwardBranch("exception-handler", entries[i].handlerPC, 0, 1); + entries[i].bb = codeGen->forwardBranch("exception-handler", entries[i].handlerPC, 0, 0); codeGen->opInfos[entries[i].handlerPC].topStack = -1; J3ExceptionNode** cur = findPos(entries[i].startPC); 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=198572&r1=198571&r2=198572&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Sun Jan 5 15:50:05 2014 @@ -21,7 +21,7 @@ J3Options::J3Options() { debugLoad = 0; debugResolve = 0; debugIniting = 0; - debugTranslate = 1; + debugTranslate = 0; debugLinking = 0; debugLifeCycle = 1; From gael.thomas at lip6.fr Sun Jan 5 14:12:08 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 05 Jan 2014 22:12:08 -0000 Subject: [vmkit-commits] [vmkit] r198573 - Interface lookup has to explore the parent interfaces, not the super class. Message-ID: <20140105221208.B400F2A6C029@llvm.org> Author: gthomas Date: Sun Jan 5 16:12:08 2014 New Revision: 198573 URL: http://llvm.org/viewvc/llvm-project?rev=198573&view=rev Log: Interface lookup has to explore the parent interfaces, not the super class. Modified: vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3class.cc Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198573&r1=198572&r2=198573&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Sun Jan 5 16:12:08 2014 @@ -218,7 +218,7 @@ namespace j3 { void doResolve(J3Field* hiddenFields, size_t nbHiddenFields); void doInitialise(); - J3Method* interfaceOrMethodAt(uint16_t idx, uint16_t access); + J3Method* interfaceOrMethodAt(uint16_t idx, uint16_t access, bool isInterfaceMethod); public: J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes); @@ -259,6 +259,7 @@ namespace j3 { bool isClass() { return 1; } + J3Method* findInterfaceMethod(const vmkit::Name* name, J3Signature* signature, bool error=1); J3Method* findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error=1); J3Field* findField(uint32_t access, const vmkit::Name* name, J3Type* type, bool error=1); }; 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=198573&r1=198572&r2=198573&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Jan 5 16:12:08 2014 @@ -290,7 +290,9 @@ void JNICALL JVM_TraceMethodCalls(jboole jlong JNICALL JVM_TotalMemory(void) { enterJVM(); NYI(); leaveJVM(); } jlong JNICALL JVM_FreeMemory(void) { enterJVM(); NYI(); leaveJVM(); } jlong JNICALL JVM_MaxMemory(void) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_ActiveProcessorCount(void) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_ActiveProcessorCount(void) { + return sysconf(_SC_NPROCESSORS_ONLN); +} void* JNICALL JVM_LoadLibrary(const char *name) { void* res; Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc?rev=198573&r1=198572&r2=198573&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc Sun Jan 5 16:12:08 2014 @@ -29,7 +29,7 @@ extern "C" { /// makes this type of access impossible or unsupported. /// JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_arrayIndexScale(JNIEnv* env, jobject unsafe, jclass clazz) { - return J3ObjectType::nativeClass(clazz)->asArrayClass()->component()->logSize(); + return 1<asArrayClass()->component()->logSize(); } JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_addressSize(JNIEnv* env, jobject unsafe) { 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=198573&r1=198572&r2=198573&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 5 16:12:08 2014 @@ -153,6 +153,9 @@ void J3::run() { if(options()->debugLifeCycle) fprintf(stderr, " Creating the system class loader\n"); + //options()->genDebugExecute = 1; + //options()->debugExecute = 2; + z_method(J3Cst::ACC_STATIC, z_class("java/lang/ClassLoader"), names()->get("getSystemClassLoader"), 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=198573&r1=198572&r2=198573&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Jan 5 16:12:08 2014 @@ -340,6 +340,33 @@ J3ObjectHandle* J3Class::extractAttribut return J3ObjectHandle::doNewArray(J3Thread::get()->vm()->typeByte->getArray(), 0); } +J3Method* J3Class::findInterfaceMethod(const vmkit::Name* name, J3Signature* signature, bool error) { + resolve(); + + J3Class* cur = this; + while(1) { + J3Method* res = cur->localFindMethod(name, signature); + + if(res) + return res; + + switch(cur->nbInterfaces()) { + case 1: cur = cur->interfaces()[0]; break; + default: + for(uint32_t i=0; inbInterfaces(); i++) { + res = cur->interfaces()[i]->findInterfaceMethod(name, signature, error); + if(res) + return res; + } + case 0: + if(error) + J3::noSuchMethodError("no such interface method", this, name, signature); + else + return 0; + } + } +} + J3Method* J3Class::findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error) { resolve(); @@ -724,7 +751,7 @@ uint64_t J3Class::longAt(uint16_t idx) { return ((uint64_t)ctpValues[idx] << 32) + (uint64_t)ctpValues[idx+1]; } -J3Method* J3Class::interfaceOrMethodAt(uint16_t idx, uint16_t access) { +J3Method* J3Class::interfaceOrMethodAt(uint16_t idx, uint16_t access, bool isInterfaceMethod) { J3Method* res = (J3Method*)ctpResolved[idx]; if(res) { @@ -743,7 +770,9 @@ J3Method* J3Class::interfaceOrMethodAt(u if(!signature) ctpResolved[idx] = signature = loader()->getSignature(this, nameAt(ctpValues[ntIdx] & 0xffff)); - res = cl->findMethod(access, name, signature); + res = (isInterfaceMethod && J3Cst::isInterface(cl->access())) ? + cl->asClass()->findInterfaceMethod(name, signature) : + cl->findMethod(access, name, signature); ctpResolved[idx] = res; @@ -752,12 +781,12 @@ J3Method* J3Class::interfaceOrMethodAt(u J3Method* J3Class::methodAt(uint16_t idx, uint16_t access) { check(idx, J3Cst::CONSTANT_Methodref); - return interfaceOrMethodAt(idx, access); + return interfaceOrMethodAt(idx, access, 0); } J3Method* J3Class::interfaceMethodAt(uint16_t idx, uint16_t access) { check(idx, J3Cst::CONSTANT_InterfaceMethodref); - return interfaceOrMethodAt(idx, access); + return interfaceOrMethodAt(idx, access, 1); } J3Field* J3Class::fieldAt(uint16_t idx, uint16_t access) { From gael.thomas at lip6.fr Sun Jan 5 14:51:57 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 05 Jan 2014 22:51:57 -0000 Subject: [vmkit-commits] [vmkit] r198574 - The type of a local can change in a function. Add thus a type parameter in locals.at to know from which local bucket we have to rerieve the local. Message-ID: <20140105225157.3FA422A6C029@llvm.org> Author: gthomas Date: Sun Jan 5 16:51:56 2014 New Revision: 198574 URL: http://llvm.org/viewvc/llvm-project?rev=198574&view=rev Log: The type of a local can change in a function. Add thus a type parameter in locals.at to know from which local bucket we have to rerieve the local. Modified: vmkit/branches/mcjit/include/j3/j3codegenvar.h vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc Modified: vmkit/branches/mcjit/include/j3/j3codegenvar.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegenvar.h?rev=198574&r1=198573&r2=198574&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegenvar.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegenvar.h Sun Jan 5 16:51:56 2014 @@ -34,7 +34,7 @@ namespace j3 { uint32_t metaStackSize(); - llvm::Value* at(uint32_t idx); + llvm::Value* at(uint32_t idx, llvm::Type* t); void setAt(llvm::Value* value, uint32_t idx); void drop(uint32_t n); llvm::Value* top(uint32_t idx=0); 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=198574&r1=198573&r2=198574&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sun Jan 5 16:51:56 2014 @@ -770,7 +770,7 @@ llvm::BasicBlock* J3CodeGen::forwardBran llvm::BasicBlock* res = newBB(id); if(doAlloc) { - opInfos[pc].metaStack = (llvm::Type**)allocator->allocate(sizeof(llvm::Type**)*stack.topStack); + opInfos[pc].metaStack = (llvm::Type**)allocator->allocate(sizeof(llvm::Type*)*stack.topStack); memcpy(opInfos[pc].metaStack, stack.metaStack, sizeof(llvm::Type*)*stack.topStack); } @@ -946,7 +946,7 @@ void J3CodeGen::translate() { builder->getInt32(4), buildString(" stack[%d]: %p\n"), builder->getInt32(i), - stack.at(i)); + stack.at(i, stack.metaStack[i])); } char buf[256]; @@ -1010,46 +1010,58 @@ void J3CodeGen::translate() { break; case J3Cst::BC_iload: /* 0x15 wide */ + stack.push(locals.at(wideReadU1(), vm->typeInteger->llvmType())); + break; + case J3Cst::BC_lload: /* 0x16 wide */ + stack.push(locals.at(wideReadU1(), vm->typeLong->llvmType())); + break; + case J3Cst::BC_fload: /* 0x17 wide */ + stack.push(locals.at(wideReadU1(), vm->typeFloat->llvmType())); + break; + case J3Cst::BC_dload: /* 0x18 wide */ + stack.push(locals.at(wideReadU1(), vm->typeDouble->llvmType())); + break; + case J3Cst::BC_aload: /* 0x19 wide */ - stack.push(locals.at(wideReadU1())); + stack.push(locals.at(wideReadU1(), vm->objectClass->llvmType())); break; case J3Cst::BC_iload_0: /* 0x1a */ case J3Cst::BC_iload_1: /* 0x1b */ case J3Cst::BC_iload_2: /* 0x1c */ case J3Cst::BC_iload_3: /* 0x1d */ - stack.push(locals.at(bc - J3Cst::BC_iload_0)); + stack.push(locals.at(bc - J3Cst::BC_iload_0, vm->typeInteger->llvmType())); break; case J3Cst::BC_lload_0: /* 0x1e */ case J3Cst::BC_lload_1: /* 0x1f */ case J3Cst::BC_lload_2: /* 0x20 */ case J3Cst::BC_lload_3: /* 0x21 */ - stack.push(locals.at(bc - J3Cst::BC_lload_0)); + stack.push(locals.at(bc - J3Cst::BC_lload_0, vm->typeLong->llvmType())); break; case J3Cst::BC_fload_0: /* 0x22 */ case J3Cst::BC_fload_1: /* 0x23 */ case J3Cst::BC_fload_2: /* 0x24 */ case J3Cst::BC_fload_3: /* 0x25 */ - stack.push(locals.at(bc - J3Cst::BC_fload_0)); + stack.push(locals.at(bc - J3Cst::BC_fload_0, vm->typeFloat->llvmType())); break; case J3Cst::BC_dload_0: /* 0x26 */ case J3Cst::BC_dload_1: /* 0x27 */ case J3Cst::BC_dload_2: /* 0x28 */ case J3Cst::BC_dload_3: /* 0x29 */ - stack.push(locals.at(bc - J3Cst::BC_dload_0)); + stack.push(locals.at(bc - J3Cst::BC_dload_0, vm->typeDouble->llvmType())); break; case J3Cst::BC_aload_0: /* 0x2a */ case J3Cst::BC_aload_1: /* 0x2b */ case J3Cst::BC_aload_2: /* 0x2c */ case J3Cst::BC_aload_3: /* 0x2d */ - stack.push(locals.at(bc - J3Cst::BC_aload_0)); + stack.push(locals.at(bc - J3Cst::BC_aload_0, vm->objectClass->llvmType())); break; case J3Cst::BC_iaload: /* 0x2e */ @@ -1295,7 +1307,7 @@ void J3CodeGen::translate() { case J3Cst::BC_iinc: /* 0x84 wide */ { uint32_t idx = wideReadU1(); int32_t val = wideReadS1(); - locals.setAt(builder->CreateAdd(locals.at(idx), builder->getInt32(val)), idx); + locals.setAt(builder->CreateAdd(locals.at(idx, vm->typeInteger->llvmType()), builder->getInt32(val)), idx); } break; case J3Cst::BC_i2l: /* 0x85 */ @@ -1658,7 +1670,7 @@ void J3CodeGen::generateJava() { builder->getInt32(2), buildString(" arg[%d]: %p\n"), builder->getInt32(pos), - locals.at(pos)); + locals.at(pos, cur->getType())); pos += (cur->getType() == vm->typeLong->llvmType() || cur->getType() == vm->typeDouble->llvmType()) ? 2 : 1; } @@ -1685,10 +1697,8 @@ void J3CodeGen::generateJava() { if(llvmFunction->getReturnType()->isVoidTy()) builder->CreateRetVoid(); - else { - ret.metaStack[0] = llvmFunction->getReturnType(); - builder->CreateRet(unflatten(ret.at(0), ret.metaStack[0])); - } + else + builder->CreateRet(unflatten(ret.at(0, llvmFunction->getReturnType()), llvmFunction->getReturnType())); if(J3Cst::isSynchronized(method->access())) { static bool echoDone = 0; Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc?rev=198574&r1=198573&r2=198574&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc Sun Jan 5 16:51:56 2014 @@ -101,12 +101,10 @@ llvm::AllocaInst** J3CodeGenVar::stackOf void J3CodeGenVar::setAt(llvm::Value* value, uint32_t idx) { llvm::Type* t = value->getType(); - metaStack[idx] = t; codeGen->builder->CreateStore(value, stackOf(t)[idx]); } -llvm::Value* J3CodeGenVar::at(uint32_t idx) { - llvm::Type* t = metaStack[idx]; +llvm::Value* J3CodeGenVar::at(uint32_t idx, llvm::Type* t) { return codeGen->builder->CreateLoad(stackOf(t)[idx]); } @@ -117,20 +115,23 @@ void J3CodeGenVar::push(llvm::Value* val if(topStack >= maxStack) J3::classFormatError(codeGen->cl, "too many push in... "); - setAt(value, topStack++); + metaStack[topStack] = value->getType(); + setAt(value, topStack); + topStack++; } llvm::Value* J3CodeGenVar::pop() { if(!topStack) J3::classFormatError(codeGen->cl, "too many pop in... "); - llvm::Value* res = at(--topStack); - return res; + --topStack; + return at(topStack, metaStack[topStack]); } llvm::Value* J3CodeGenVar::top(uint32_t idx) { if(topStack <= idx) J3::classFormatError(codeGen->cl, "too large top in... "); - - return at(topStack - idx - 1); + + uint32_t n = topStack - idx - 1; + return at(n, metaStack[n]); } From gael.thomas at lip6.fr Sun Jan 5 14:53:24 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 05 Jan 2014 22:53:24 -0000 Subject: [vmkit-commits] [vmkit] r198575 - Add a simple tableswitch opcode. Message-ID: <20140105225324.902BB2A6C029@llvm.org> Author: gthomas Date: Sun Jan 5 16:53:24 2014 New Revision: 198575 URL: http://llvm.org/viewvc/llvm-project?rev=198575&view=rev Log: Add a simple tableswitch opcode. Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc 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=198575&r1=198574&r2=198575&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sun Jan 5 16:53:24 2014 @@ -1453,7 +1453,9 @@ void J3CodeGen::translate() { case J3Cst::BC_jsr: nyi(); /* 0xa8 */ case J3Cst::BC_ret: nyi(); /* 0xa9 wide */ - case J3Cst::BC_tableswitch: nyi(); /* 0xaa */ + case J3Cst::BC_tableswitch: /* 0xaa */ + lookupSwitch(); /* TODO, generate a better code */ + break; case J3Cst::BC_lookupswitch: lookupSwitch(); From gael.thomas at lip6.fr Tue Jan 7 04:29:13 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Tue, 07 Jan 2014 12:29:13 -0000 Subject: [vmkit-commits] [vmkit] r198687 - Full implementation of tableswitch. Message-ID: <20140107122913.630E72A6C02A@llvm.org> Author: gthomas Date: Tue Jan 7 06:29:12 2014 New Revision: 198687 URL: http://llvm.org/viewvc/llvm-project?rev=198687&view=rev Log: Full implementation of tableswitch. Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=198687&r1=198686&r2=198687&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Tue Jan 7 06:29:12 2014 @@ -146,6 +146,7 @@ namespace j3 { void newObject(J3Class* cl); void lookupSwitch(); + void tableSwitch(); void ldc(uint32_t idx); 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=198687&r1=198686&r2=198687&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Tue Jan 7 06:29:12 2014 @@ -41,10 +41,10 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato #if 0 /* usefull to debug a single function */ - if( cl->name() == vm->names()->get("sun/misc/Launcher") && - method->name() == vm->names()->get("getFileURL") && - method->signature()->name() == vm->names()->get("(Ljava/io/File;)Ljava/net/URL;") ) { - vm->options()->debugTranslate = 2; + if( cl->name() == vm->names()->get("java/lang/CharacterData") && + method->name() == vm->names()->get("of") && + method->signature()->name() == vm->names()->get("(I)Ljava/lang/CharacterData;") ) { + vm->options()->debugTranslate = 3; } #endif @@ -704,7 +704,7 @@ void J3CodeGen::ldc(uint32_t idx) { void J3CodeGen::lookupSwitch() { codeReader->seek(((codeReader->tell() - 1) & -4) + 4, J3Reader::SeekSet); llvm::Value* val = stack.pop(); - llvm::BasicBlock* def = forwardBranch("lookupswitch-match", javaPC + codeReader->readU4(), 1, 1); + llvm::BasicBlock* def = forwardBranch("lookupswitch-default", javaPC + codeReader->readU4(), 1, 1); uint32_t n = codeReader->readU4(); for(uint32_t i=0; iseek(((codeReader->tell() - 1) & -4) + 4, J3Reader::SeekSet); + llvm::Value* val = stack.pop(); + llvm::BasicBlock* def = forwardBranch("tableswitch-default", javaPC + codeReader->readU4(), 1, 1); + int32_t low = codeReader->readU4(); + int32_t high = codeReader->readU4(); + llvm::SwitchInst* dispatch = builder->CreateSwitch(val, def, high - low + 1); + + for(uint32_t i=low; i<=high; i++) + dispatch->addCase(builder->getInt32(i), + forwardBranch("tableswitch-match", javaPC + codeReader->readU4(), 1, 1)); +} + llvm::BasicBlock* J3CodeGen::newBB(const char* name) { return llvm::BasicBlock::Create(llvmFunction->getContext(), name, llvmFunction); } @@ -727,13 +740,14 @@ void J3CodeGen::condBr(llvm::Value* op) } llvm::BasicBlock* J3CodeGen::forwardBranch(const char* id, uint32_t pc, bool doAlloc, bool doPush) { - if(vm->options()->debugTranslate > 2) - fprintf(stderr, " forward branch at %d\n", pc); llvm::BasicBlock* res = opInfos[pc].bb; if(res) return res; + if(vm->options()->debugTranslate > 2) + fprintf(stderr, " forward branch at %d\n", pc); + if(opInfos[pc].insn) { //printf("split at %d (%s)\n", pc, id); llvm::Instruction* insn = opInfos[pc].insn; @@ -1454,11 +1468,13 @@ void J3CodeGen::translate() { case J3Cst::BC_jsr: nyi(); /* 0xa8 */ case J3Cst::BC_ret: nyi(); /* 0xa9 wide */ case J3Cst::BC_tableswitch: /* 0xaa */ - lookupSwitch(); /* TODO, generate a better code */ + tableSwitch(); + _onEndPoint(); break; case J3Cst::BC_lookupswitch: lookupSwitch(); + _onEndPoint(); break; case J3Cst::BC_ireturn: /* 0xac */ From gael.thomas at lip6.fr Thu Jan 9 05:03:46 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 09 Jan 2014 13:03:46 -0000 Subject: [vmkit-commits] [vmkit] r198864 - modifs methodology Message-ID: <20140109130346.CDC4A2A6C02B@llvm.org> Author: gthomas Date: Thu Jan 9 07:03:45 2014 New Revision: 198864 URL: http://llvm.org/viewvc/llvm-project?rev=198864&view=rev Log: modifs methodology Modified: vmkit/branches/mcjit/include/j3/j3.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/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/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc vmkit/branches/mcjit/lib/vmkit/thread.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=198864&r1=198863&r2=198864&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Thu Jan 9 07:03:45 2014 @@ -85,6 +85,9 @@ namespace j3 { J3Method* classClassInit; J3Field* classClassVMData; + J3Class* classClassLoader; + J3Field* classClassLoaderVMData; + J3Class* threadClass; J3Field* threadClassVMData; J3Method* threadClassRun; @@ -126,6 +129,8 @@ namespace j3 { J3ObjectHandle* utfToString(const char* name, bool doPush=1); J3ObjectHandle* nameToString(const vmkit::Name* name, bool doPush=1); J3ObjectHandle* arrayToString(J3ObjectHandle* array, bool doPush=1); + const vmkit::Name* arrayToName(J3ObjectHandle* array); + const vmkit::Name* stringToName(J3ObjectHandle* str); void run(); void start(int argc, char** argv); Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=198864&r1=198863&r2=198864&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Thu Jan 9 07:03:45 2014 @@ -63,7 +63,8 @@ namespace j3 { uint32_t interfaceIndex(J3Method* signature); J3GlobalReferences* globalReferences() { return &_globalReferences; } - + + static J3ClassLoader* nativeClassLoader(J3ObjectHandle* jloader); J3ObjectHandle* javaClassLoader(bool doPush=1); J3Class* defineClass(const vmkit::Name* name, J3ClassBytes* bytes); Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=198864&r1=198863&r2=198864&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Thu Jan 9 07:03:45 2014 @@ -167,6 +167,7 @@ namespace j3 { static void echoDebugEnter(uint32_t isLeave, const char* msg, ...); static void echoDebugExecute(uint32_t level, const char* msg, ...); + static void echoElement(uint32_t level, uint32_t type, uintptr_t elmt); #define _x(name, id) \ llvm::Function* name; Modified: vmkit/branches/mcjit/include/j3/j3meta.def URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=198864&r1=198863&r2=198864&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3meta.def (original) +++ vmkit/branches/mcjit/include/j3/j3meta.def Thu Jan 9 07:03:45 2014 @@ -19,6 +19,7 @@ _x(funcJ3ThreadTell, "j3::J3 _x(funcJ3ThreadRestore, "j3::J3Thread::restore(j3::J3ObjectHandle*)") _x(funcEchoDebugEnter, "j3::J3CodeGen::echoDebugEnter(unsigned int, char const*, ...)") _x(funcEchoDebugExecute, "j3::J3CodeGen::echoDebugExecute(unsigned int, char const*, ...)") +_x(funcEchoElement, "j3::J3CodeGen::echoElement(unsigned int, unsigned int, unsigned long)") _x(funcIsAssignableTo, "j3::J3VirtualTable::isAssignableTo(j3::J3VirtualTable*)") _x(funcFastIsAssignableToPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToPrimaryChecker(j3::J3VirtualTable*, unsigned int)") _x(funcFastIsAssignableToNonPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToNonPrimaryChecker(j3::J3VirtualTable*)") 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=198864&r1=198863&r2=198864&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan 9 07:03:45 2014 @@ -20,7 +20,6 @@ using namespace j3; #define NYI() { J3Thread::get()->vm()->internalError("not yet implemented: '%s'", __PRETTY_FUNCTION__); } - /************************************************************************* PART 0 ************************************************************************/ @@ -67,12 +66,7 @@ jstring JNICALL JVM_InternString(JNIEnv* J3* vm = J3Thread::get()->vm(); - J3ObjectHandle* value = str->getObject(vm->stringClassValue); - char copy[J3Utf16Decoder::maxSize(value)]; - - J3Utf16Decoder::decode(value, copy); - - res = vm->utfToString(copy); + res = vm->nameToString(vm->stringToName(str)); leaveJVM(); return res; @@ -86,12 +80,22 @@ jlong JNICALL JVM_CurrentTimeMillis(JNIE enterJVM(); struct timeval tv; gettimeofday(&tv, 0); - res = tv.tv_sec*1e3 + tv.tv_usec/1000; + res = tv.tv_sec*1e3 + tv.tv_usec/1e3; + leaveJVM(); + return res; +} + +jlong JNICALL JVM_NanoTime(JNIEnv* env, jclass ignored) { + /* TODO: better timer? */ + jlong res; + enterJVM(); + struct timeval tv; + gettimeofday(&tv, 0); + res = tv.tv_sec*1e9 + tv.tv_usec*1e3; leaveJVM(); return res; } -jlong JNICALL JVM_NanoTime(JNIEnv* env, jclass ignored) { enterJVM(); NYI(); leaveJVM(); } void JNICALL JVM_ArrayCopy(JNIEnv* env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length) { enterJVM(); @@ -145,31 +149,47 @@ jobject JNICALL JVM_InitProperties(JNIEn #define setPropEnv(key, val) ({ const char* tmp = getenv(val); if(!tmp) tmp = ""; setProp(key, val); }) /* - *
java.version
Java version number - *
java.vendor
Java vendor specific string - *
java.vendor.url
Java vendor URL - *
java.home
Java installation directory - *
java.class.version
Java class version number - *
java.class.path
Java classpath - *
os.name
Operating System Name - *
os.arch
Operating System Architecture - *
os.version
Operating System Version - *
file.separator
File separator ("/" on Unix) - *
path.separator
Path separator (":" on Unix) - *
line.separator
Line separator ("\n" on Unix) - *
user.name
User account name - *
user.home
User home directory - *
user.dir
User's current working directory - */ + **
java.version
Java version number + **
java.vendor
Java vendor specific string + **
java.vendor.url
Java vendor URL + **
java.home
Java installation directory + **
java.class.version
Java class version number + **
java.class.path
Java classpath + **
os.name
Operating System Name + **
os.arch
Operating System Architecture + **
os.version
Operating System Version + **
file.separator
File separator ("/" on Unix) + **
path.separator
Path separator (":" on Unix) + **
line.separator
Line separator ("\n" on Unix) + **
user.name
User account name + **
user.home
User home directory + **
user.dir
User's current working directory + */ + + struct utsname infos; + uname(&infos); + setProp("java.version", "1.8"); + setProp("java.vendor", "The VMKit Project"); + setProp("java.vendor.url", "http://vmkit.llvm.org"); + setPropEnv("java.home", "JAVA_HOME"); + setProp("java.class.version", "52.0"); setProp("java.class.path", vm->options()->classpath); - setProp("java.boot.class.path", vm->options()->bootClasspath); - setProp("sun.boot.library.path", vm->options()->systemLibraryPath); - setProp("sun.boot.class.path", vm->options()->bootClasspath); + //"file:///Users/gthomas/research/vmkit4/vmkit");//vm->options()->classpath); + setProp("os.name", infos.sysname); + setProp("os.arch", infos.machine); + setProp("os.version", infos.release); setProp("file.separator", "/"); setProp("path.separator", ":"); setProp("line.separator", "\n"); - setPropEnv("java.home", "JAVA_HOME"); + setPropEnv("user.name", "USERNAME"); + setPropEnv("user.home", "HOME"); + setPropEnv("user.dir", "PWD"); + + setProp("java.boot.class.path", vm->options()->bootClasspath); + setProp("sun.boot.library.path", vm->options()->systemLibraryPath); + setProp("sun.boot.class.path", vm->options()->bootClasspath); + #if 0 setProp("java.vm.specification.version", "1.2"); @@ -178,22 +198,13 @@ jobject JNICALL JVM_InitProperties(JNIEn setProp("java.specification.version", "1.8"); setProp("java.specification.vendor", "Sun Microsystems, Inc"); setProp("java.specification.name", "Java Platform API Specification"); - setProp("java.version", "1.8"); setProp("java.runtime.version", "1.8"); - setProp("java.vendor", "The VMKit Project"); - setProp("java.vendor.url", "http://vmkit.llvm.org"); - setProp("java.class.version", "52.0"); setProp("java.vm.version", "0.5"); setProp("java.vm.vendor", "The VMKit Project"); setProp("java.vm.name", "J3"); setProp("java.specification.version", "1.8"); setPropEnv("java.library.path", "LD_LIBRARY_PATH"); - struct utsname infos; - uname(&infos); - setProp("os.name", infos.sysname); - setProp("os.arch", infos.machine); - setProp("os.version", infos.release); setProp("java.io.tmpdir", "/tmp"); JnjvmBootstrapLoader* JCL = vm->bootstrapLoader; @@ -527,7 +538,15 @@ void JNICALL JVM_ResolveClass(JNIEnv* en /* * Find a class from a boot class loader. Returns NULL if class not found. */ -jclass JNICALL JVM_FindClassFromBootLoader(JNIEnv* env, const char *name) { enterJVM(); NYI(); leaveJVM(); } +jclass JNICALL JVM_FindClassFromBootLoader(JNIEnv* env, const char *name) { + jclass res; + enterJVM(); + J3* vm = J3Thread::get()->vm(); + J3Class* cl = vm->initialClassLoader->findLoadedClass(vm->names()->get(name)); + res = cl ? cl->javaClass() : 0; + leaveJVM(); + return res; +} /* * Find a class from a given class loader. Throw ClassNotFoundException @@ -567,7 +586,14 @@ jclass JNICALL JVM_FindClassFromClassLoa jclass JNICALL JVM_FindClassFromClass(JNIEnv* env, const char *name, jboolean init, jclass from) { enterJVM(); NYI(); leaveJVM(); } /* Find a loaded class cached by the VM */ -jclass JNICALL JVM_FindLoadedClass(JNIEnv* env, jobject loader, jstring name) { enterJVM(); NYI(); leaveJVM(); } +jclass JNICALL JVM_FindLoadedClass(JNIEnv* env, jobject jloader, jstring name) { + jclass res; + enterJVM(); + J3Class* cl = J3ClassLoader::nativeClassLoader(jloader)->findLoadedClass(J3Thread::get()->vm()->stringToName(name)); + res = cl ? cl->javaClass() : 0; + leaveJVM(); + return res; +} /* Define a class */ jclass JNICALL JVM_DefineClass(JNIEnv* env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd) { enterJVM(); NYI(); leaveJVM(); } 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=198864&r1=198863&r2=198864&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Thu Jan 9 07:03:45 2014 @@ -123,6 +123,10 @@ void J3::run() { classClassInit = z_method(0, classClass, initName, names()->get("()V")); classClassVMData = classClass->findField(0, hf.name(), hf.type()); + classClassLoader = z_class("java/lang/ClassLoader"); + classClassLoader->resolve(&hf, 1); + classClassLoaderVMData = classClassLoader->findField(0, hf.name(), hf.type()); + threadClass = z_class("java/lang/Thread"); threadClassRun = z_method(0, threadClass, names()->get("run"), names()->get("()V")); threadClassVMData = z_field(0, threadClass, "eetop", typeLong); @@ -151,19 +155,27 @@ void J3::run() { J3Lib::bootstrap(this); if(options()->debugLifeCycle) - fprintf(stderr, " Creating the system class loader\n"); + fprintf(stderr, " Launching the application\n"); - //options()->genDebugExecute = 1; - //options()->debugExecute = 2; + options()->genDebugExecute = 1; + options()->debugExecute = 5; - z_method(J3Cst::ACC_STATIC, - z_class("java/lang/ClassLoader"), - names()->get("getSystemClassLoader"), - names()->get("()Ljava/lang/ClassLoader;")) - ->invokeStatic(); - +#if 0 + J3Class* loaderClass = z_class("java/lang/ClassLoader"); + J3ObjectHandle* sysLoader = z_method(J3Cst::ACC_STATIC, + loaderClass, + names()->get("getSystemClassLoader"), + names()->get("()Ljava/lang/ClassLoader;"))->invokeStatic().valObject; +#endif + + J3ObjectHandle* res = z_method(J3Cst::ACC_STATIC, + z_class("sun/launcher/LauncherHelper"), + names()->get("checkAndLoadMain"), + names()->get("(ZILjava/lang/String;)Ljava/lang/Class;")) + ->invokeStatic(1, 1, utfToString("HelloWorld")).valObject; + + fprintf(stderr, "system class loader: sysLoader: %p - %p\n", res, res->obj()); // public static ClassLoader getSystemClassLoader() { - } JNIEnv* J3::jniEnv() { @@ -212,6 +224,16 @@ J3ObjectHandle* J3::utfToString(const ch return nameToString(names()->get(name), doPush); } +const vmkit::Name* J3::arrayToName(J3ObjectHandle* array) { + char copy[J3Utf16Decoder::maxSize(array)]; + J3Utf16Decoder::decode(array, copy); + return names()->get(copy); +} + +const vmkit::Name* J3::stringToName(J3ObjectHandle* str) { + return arrayToName(str->getObject(stringClassValue)); +} + void J3::classCastException() { internalError("implement me: class cast exception"); } 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=198864&r1=198863&r2=198864&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Thu Jan 9 07:03:45 2014 @@ -684,7 +684,9 @@ void J3Class::fillFields(J3Field** field J3Field* cur = fields[i]; J3Layout* layout = J3Cst::isStatic(fields[i]->access()) ? (J3Layout*)staticLayout() : this; - //fprintf(stderr, " adding static field: %s %s::%s\n", cur->type()->name()->cStr(), name()->cStr(), cur->name()->cStr()); + //if(name() == J3Thread::get()->vm()->names()->get("java/lang/ClassLoader")) + //fprintf(stderr, " field %s: %s\n", J3Cst::isStatic(fields[i]->access()) ? "static" : "virtual", fields[i]->name()->cStr()); + cur->_offset = layout->structSize(); cur->_slot = layout->_nbFields; layout->_structSize += 1 << fields[i]->type()->logSize(); 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=198864&r1=198863&r2=198864&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Thu Jan 9 07:03:45 2014 @@ -41,6 +41,18 @@ J3ObjectHandle* J3ClassLoader::javaClass return (_javaClassLoader && doPush) ? J3Thread::get()->push(_javaClassLoader) : _javaClassLoader; } +J3ClassLoader* J3ClassLoader::nativeClassLoader(J3ObjectHandle* jloader) { + J3ClassLoader* res = (J3ClassLoader*)jloader->getLong(J3Thread::get()->vm()->classClassLoaderVMData); + + if(!res) { + vmkit::BumpAllocator* allocator = vmkit::BumpAllocator::create(); + res = new(allocator) J3ClassLoader(jloader, allocator); + jloader->setLong(J3Thread::get()->vm()->classClassLoaderVMData, (uint64_t)(uintptr_t)res); + } + + return res; +} + uint32_t J3ClassLoader::interfaceIndex(J3Method* method) { pthread_mutex_lock(&_mutexInterfaces); InterfaceMethodRefMap::iterator it = interfaces.find(method); 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=198864&r1=198863&r2=198864&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Thu Jan 9 07:03:45 2014 @@ -28,6 +28,10 @@ using namespace j3; #define _onEndPoint() ({ if(onEndPoint()) return; }) +#define DEBUG_TYPE_INT 0 +#define DEBUG_TYPE_FLOAT 1 +#define DEBUG_TYPE_OBJECT 2 + J3CodeGen::J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* m, bool withMethod, bool withCaller) : exceptions(this) { @@ -872,6 +876,24 @@ void J3CodeGen::echoDebugExecute(uint32_ } } +void J3CodeGen::echoElement(uint32_t level, uint32_t type, uintptr_t elmt) { + if(J3Thread::get()->vm()->options()->debugExecute >= level) { + switch(type) { + case DEBUG_TYPE_INT: + fprintf(stderr, "%lld", (uint64_t)elmt); + break; + + case DEBUG_TYPE_FLOAT: + fprintf(stderr, "%lf", *((double*)&elmt)); + break; + + case DEBUG_TYPE_OBJECT: + fprintf(stderr, "%p::%s", (void*)elmt, ((J3Object*)elmt)->vt()->type()->name()->cStr()); + break; + } + } +} + void J3CodeGen::translate() { if(vm->options()->debugTranslate > 1) exceptions.dump(vm->options()->debugTranslate-1); @@ -955,14 +977,39 @@ void J3CodeGen::translate() { if(vm->options()->genDebugExecute) { if(vm->options()->genDebugExecute > 1) { - for(uint32_t i=0; iCreateCall4(funcEchoDebugExecute, + llvm::BasicBlock* debug = newBB("debug"); + llvm::BasicBlock* after = newBB("after"); + builder + ->CreateCondBr(builder + ->CreateICmpSGE(builder->CreateLoad(builder + ->CreateIntToPtr(llvm::ConstantInt::get(uintPtrTy, + (uintptr_t)&vm->options()->debugExecute), + uintPtrTy->getPointerTo())), + builder->getInt32(4)), + debug, after); + builder->SetInsertPoint(debug); + for(uint32_t i=0; iCreateCall3(funcEchoDebugExecute, + builder->getInt32(4), + buildString(" stack[%d]: "), + builder->getInt32(i)); + if(stack.metaStack[i]->isIntegerTy()) + builder->CreateCall3(funcEchoElement, + builder->getInt32(4), + builder->getInt32(DEBUG_TYPE_INT), + builder->CreateSExtOrBitCast(stack.at(i, stack.metaStack[i]), uintPtrTy)); + else if(stack.metaStack[i]->isPointerTy()) + builder->CreateCall3(funcEchoElement, + builder->getInt32(4), + builder->getInt32(DEBUG_TYPE_OBJECT), + builder->CreatePtrToInt(stack.at(i, stack.metaStack[i]), uintPtrTy)); + builder->CreateCall2(funcEchoDebugExecute, builder->getInt32(4), - buildString(" stack[%d]: %p\n"), - builder->getInt32(i), - stack.at(i, stack.metaStack[i])); + buildString("\n")); + } + builder->CreateBr(after); + builder->SetInsertPoint(bb = after); } - char buf[256]; snprintf(buf, 256, " [%4d] executing: %-20s in %s::%s", javaPC, J3Cst::opcodeNames[bc], cl->name()->cStr(), method->name()->cStr()); 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=198864&r1=198863&r2=198864&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Thu Jan 9 07:03:45 2014 @@ -13,7 +13,7 @@ J3Options::J3Options() { selfBitCodePath = SELF_BITCODE; bootClasspath = J3Lib::systemClassesArchives(); systemLibraryPath = J3Lib::systemLibraryPath(); - classpath = ""; + classpath = "."; debugEnterIndent = 1; @@ -25,7 +25,7 @@ J3Options::J3Options() { debugLinking = 0; debugLifeCycle = 1; - genDebugExecute = debugExecute ? 1 : 0; + genDebugExecute = 2;//debugExecute ? 1 : 0; stackSize = 0x80*0x1000; } Modified: vmkit/branches/mcjit/lib/vmkit/thread.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/thread.cc?rev=198864&r1=198863&r2=198864&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/thread.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/thread.cc Thu Jan 9 07:03:45 2014 @@ -36,7 +36,7 @@ void Thread::registerSignalInternal(int // Set the SIGSEGV handler to diagnose errors. struct sigaction sa; sigset_t mask; - sigfillset(&mask); + sigemptyset(&mask); sa.sa_flags = SA_SIGINFO | SA_ONSTACK | SA_NODEFER; if(altStack) sa.sa_flags = SA_ONSTACK; From gael.thomas at lip6.fr Thu Jan 9 05:12:06 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 09 Jan 2014 13:12:06 -0000 Subject: [vmkit-commits] [vmkit] r198866 - No-op commit, just to explain the previous one (the comment is not related to vmkit:)). Add few openjdk functions, add the ability to associate a Java class loader to its native representation. Add new debug functions, but currently this code is broken. Message-ID: <20140109131207.0669C2A6C02B@llvm.org> Author: gthomas Date: Thu Jan 9 07:12:06 2014 New Revision: 198866 URL: http://llvm.org/viewvc/llvm-project?rev=198866&view=rev Log: No-op commit, just to explain the previous one (the comment is not related to vmkit:)). Add few openjdk functions, add the ability to associate a Java class loader to its native representation. Add new debug functions, but currently this code is broken. Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc 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=198866&r1=198865&r2=198866&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Thu Jan 9 07:12:06 2014 @@ -32,6 +32,7 @@ using namespace j3; #define DEBUG_TYPE_FLOAT 1 #define DEBUG_TYPE_OBJECT 2 + J3CodeGen::J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* m, bool withMethod, bool withCaller) : exceptions(this) { From gael.thomas at lip6.fr Thu Jan 9 09:51:54 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 09 Jan 2014 17:51:54 -0000 Subject: [vmkit-commits] [vmkit] r198877 - Debugging outside j3codegen. Better debug stack and locals. Message-ID: <20140109175154.D412C2A6C02C@llvm.org> Author: gthomas Date: Thu Jan 9 11:51:54 2014 New Revision: 198877 URL: http://llvm.org/viewvc/llvm-project?rev=198877&view=rev Log: Debugging outside j3codegen. Better debug stack and locals. Added: vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=198877&r1=198876&r2=198877&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Thu Jan 9 11:51:54 2014 @@ -70,6 +70,7 @@ namespace j3 { llvm::MDNode* dbgInfo; uint32_t javaPC; + uint32_t bc; J3CodeGenVar locals; J3CodeGenVar stack; @@ -168,6 +169,9 @@ namespace j3 { static void echoDebugEnter(uint32_t isLeave, const char* msg, ...); static void echoDebugExecute(uint32_t level, const char* msg, ...); static void echoElement(uint32_t level, uint32_t type, uintptr_t elmt); + void genEchoElement(const char* msg, uint32_t idx, llvm::Value* val); + void genDebugOpcode(); + void genDebugEnterLeave(bool isLeave); #define _x(name, id) \ llvm::Function* name; Added: vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc?rev=198877&view=auto ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc (added) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc Thu Jan 9 11:51:54 2014 @@ -0,0 +1,182 @@ +#include + +#include "j3/j3.h" +#include "j3/j3thread.h" +#include "j3/j3reader.h" +#include "j3/j3codegen.h" +#include "j3/j3class.h" +#include "j3/j3constants.h" +#include "j3/j3classloader.h" +#include "j3/j3method.h" +#include "j3/j3mangler.h" +#include "j3/j3jni.h" +#include "j3/j3object.h" +#include "j3/j3field.h" +#include "j3/j3attribute.h" +#include "j3/j3utf16.h" + +#include "llvm/ExecutionEngine/ExecutionEngine.h" + +#include "llvm/IR/Function.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/Argument.h" +#include "llvm/IR/Intrinsics.h" + +#include "llvm/DebugInfo.h" +#include "llvm/DIBuilder.h" + +#define DEBUG_TYPE_INT 0 +#define DEBUG_TYPE_FLOAT 1 +#define DEBUG_TYPE_OBJECT 2 + +using namespace j3; + +void J3CodeGen::echoDebugEnter(uint32_t isLeave, const char* msg, ...) { + static __thread uint32_t prof = 0; + if(J3Thread::get()->vm()->options()->debugExecute >= 1) { + const char* enter = isLeave ? "leaving" : "entering"; + va_list va; + va_start(va, msg); + + if(!isLeave) + prof += J3Thread::get()->vm()->options()->debugEnterIndent; + fprintf(stderr, "%*s", prof, ""); + if(isLeave) + prof -= J3Thread::get()->vm()->options()->debugEnterIndent; + + fprintf(stderr, "%s ", enter); + vfprintf(stderr, msg, va); + va_end(va); + } +} + +void J3CodeGen::echoDebugExecute(uint32_t level, const char* msg, ...) { + if(J3Thread::get()->vm()->options()->debugExecute >= level) { + va_list va; + va_start(va, msg); + vfprintf(stderr, msg, va); + va_end(va); + } +} + +void J3CodeGen::echoElement(uint32_t level, uint32_t type, uintptr_t elmt) { + if(J3Thread::get()->vm()->options()->debugExecute >= level) { + switch(type) { + case DEBUG_TYPE_INT: + fprintf(stderr, "%lld", (uint64_t)elmt); + break; + + case DEBUG_TYPE_FLOAT: + fprintf(stderr, "%lf", *((double*)&elmt)); + break; + + case DEBUG_TYPE_OBJECT: + if(elmt) { + J3Object* pobj = (J3Object*)elmt; + J3* vm = J3Thread::get()->vm(); + J3ObjectHandle* prev = J3Thread::get()->tell(); + J3ObjectHandle* content = 0; + + if(pobj->vt()->type() == vm->typeCharacter->getArray()) + content = J3Thread::get()->push(pobj); + else if(pobj->vt()->type() == vm->stringClass) { + J3ObjectHandle* str = J3Thread::get()->push(pobj); + content = str->getObject(vm->stringClassValue); + } + + if(content) { + char buf[J3Utf16Decoder::maxSize(content)]; + J3Utf16Decoder::decode(content, buf); + J3Thread::get()->restore(prev); + fprintf(stderr, "%s [%s]", pobj->vt()->type()->name()->cStr(), buf); + } else + fprintf(stderr, "%s@%p", pobj->vt()->type()->name()->cStr(), (void*)elmt); + } else + fprintf(stderr, "null"); + break; + } + } +} + +void J3CodeGen::genEchoElement(const char* msg, uint32_t idx, llvm::Value* val) { + llvm::Type* t = val->getType(); + builder->CreateCall3(funcEchoDebugExecute, + builder->getInt32(4), + buildString(msg), + builder->getInt32(idx)); + + if(t->isIntegerTy()) + builder->CreateCall3(funcEchoElement, + builder->getInt32(4), + builder->getInt32(DEBUG_TYPE_INT), + builder->CreateSExtOrBitCast(val, uintPtrTy)); + else if(t->isPointerTy()) + builder->CreateCall3(funcEchoElement, + builder->getInt32(4), + builder->getInt32(DEBUG_TYPE_OBJECT), + builder->CreatePtrToInt(val, uintPtrTy)); + builder->CreateCall2(funcEchoDebugExecute, + builder->getInt32(4), + buildString("\n")); +} + +void J3CodeGen::genDebugOpcode() { + if(vm->options()->genDebugExecute) { + llvm::BasicBlock* debug = newBB("debug"); + llvm::BasicBlock* after = newBB("after"); + builder + ->CreateCondBr(builder + ->CreateICmpSGT(builder->CreateLoad(builder + ->CreateIntToPtr(llvm::ConstantInt::get(uintPtrTy, + (uintptr_t)&vm->options()->debugExecute), + uintPtrTy->getPointerTo())), + llvm::ConstantInt::get(uintPtrTy, 0)), + debug, after); + builder->SetInsertPoint(debug); + + if(vm->options()->genDebugExecute > 1) { + for(uint32_t i=0; iname()->cStr(), method->name()->cStr()); + builder->CreateCall3(funcEchoDebugExecute, + builder->getInt32(2), + buildString("%s\n"), + buildString(buf)); + + builder->CreateBr(after); + builder->SetInsertPoint(bb = after); + } +} + +void J3CodeGen::genDebugEnterLeave(bool isLeave) { + if(vm->options()->genDebugExecute) { + if(isLeave) { + char buf[256]; + snprintf(buf, 256, "%s::%s", cl->name()->cStr(), method->name()->cStr()); + builder->CreateCall3(funcEchoDebugEnter, + builder->getInt32(1), + buildString("%s\n"), + buildString(buf)); + } else { + char buf[256]; + snprintf(buf, 256, "%s::%s", cl->name()->cStr(), method->name()->cStr()); + builder->CreateCall3(funcEchoDebugEnter, + builder->getInt32(0), + buildString("%s\n"), + buildString(buf)); + + if(vm->options()->genDebugExecute > 1) { + uint32_t i = 0; + for(llvm::Function::arg_iterator cur=llvmFunction->arg_begin(); cur!=llvmFunction->arg_end(); cur++) { + genEchoElement(" arg[%d]: ", i++, cur); + } + } + } + } +} + 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=198877&r1=198876&r2=198877&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Thu Jan 9 11:51:54 2014 @@ -28,11 +28,6 @@ using namespace j3; #define _onEndPoint() ({ if(onEndPoint()) return; }) -#define DEBUG_TYPE_INT 0 -#define DEBUG_TYPE_FLOAT 1 -#define DEBUG_TYPE_OBJECT 2 - - J3CodeGen::J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* m, bool withMethod, bool withCaller) : exceptions(this) { @@ -849,52 +844,6 @@ llvm::Value* J3CodeGen::buildString(cons return builder->CreateGEP(var, gep); } -void J3CodeGen::echoDebugEnter(uint32_t isLeave, const char* msg, ...) { - static __thread uint32_t prof = 0; - if(J3Thread::get()->vm()->options()->debugExecute >= 1) { - const char* enter = isLeave ? "leaving" : "entering"; - va_list va; - va_start(va, msg); - - if(!isLeave) - prof += J3Thread::get()->vm()->options()->debugEnterIndent; - fprintf(stderr, "%*s", prof, ""); - if(isLeave) - prof -= J3Thread::get()->vm()->options()->debugEnterIndent; - - fprintf(stderr, "%s ", enter); - vfprintf(stderr, msg, va); - va_end(va); - } -} - -void J3CodeGen::echoDebugExecute(uint32_t level, const char* msg, ...) { - if(J3Thread::get()->vm()->options()->debugExecute >= level) { - va_list va; - va_start(va, msg); - vfprintf(stderr, msg, va); - va_end(va); - } -} - -void J3CodeGen::echoElement(uint32_t level, uint32_t type, uintptr_t elmt) { - if(J3Thread::get()->vm()->options()->debugExecute >= level) { - switch(type) { - case DEBUG_TYPE_INT: - fprintf(stderr, "%lld", (uint64_t)elmt); - break; - - case DEBUG_TYPE_FLOAT: - fprintf(stderr, "%lf", *((double*)&elmt)); - break; - - case DEBUG_TYPE_OBJECT: - fprintf(stderr, "%p::%s", (void*)elmt, ((J3Object*)elmt)->vt()->type()->name()->cStr()); - break; - } - } -} - void J3CodeGen::translate() { if(vm->options()->debugTranslate > 1) exceptions.dump(vm->options()->debugTranslate-1); @@ -958,7 +907,7 @@ void J3CodeGen::translate() { else opInfos[javaPC].insn = bb->end()->getPrevNode(); - uint8_t bc = codeReader->readU1(); + bc = codeReader->readU1(); switch(vm->options()->debugTranslate) { default: @@ -976,49 +925,7 @@ void J3CodeGen::translate() { break; } - if(vm->options()->genDebugExecute) { - if(vm->options()->genDebugExecute > 1) { - llvm::BasicBlock* debug = newBB("debug"); - llvm::BasicBlock* after = newBB("after"); - builder - ->CreateCondBr(builder - ->CreateICmpSGE(builder->CreateLoad(builder - ->CreateIntToPtr(llvm::ConstantInt::get(uintPtrTy, - (uintptr_t)&vm->options()->debugExecute), - uintPtrTy->getPointerTo())), - builder->getInt32(4)), - debug, after); - builder->SetInsertPoint(debug); - for(uint32_t i=0; iCreateCall3(funcEchoDebugExecute, - builder->getInt32(4), - buildString(" stack[%d]: "), - builder->getInt32(i)); - if(stack.metaStack[i]->isIntegerTy()) - builder->CreateCall3(funcEchoElement, - builder->getInt32(4), - builder->getInt32(DEBUG_TYPE_INT), - builder->CreateSExtOrBitCast(stack.at(i, stack.metaStack[i]), uintPtrTy)); - else if(stack.metaStack[i]->isPointerTy()) - builder->CreateCall3(funcEchoElement, - builder->getInt32(4), - builder->getInt32(DEBUG_TYPE_OBJECT), - builder->CreatePtrToInt(stack.at(i, stack.metaStack[i]), uintPtrTy)); - builder->CreateCall2(funcEchoDebugExecute, - builder->getInt32(4), - buildString("\n")); - } - builder->CreateBr(after); - builder->SetInsertPoint(bb = after); - } - char buf[256]; - snprintf(buf, 256, " [%4d] executing: %-20s in %s::%s", javaPC, - J3Cst::opcodeNames[bc], cl->name()->cStr(), method->name()->cStr()); - builder->CreateCall3(funcEchoDebugExecute, - builder->getInt32(2), - buildString("%s\n"), - buildString(buf)); - } + genDebugOpcode(); switch(bc) { case J3Cst::BC_nop: /* 0x00 */ @@ -1642,7 +1549,7 @@ void J3CodeGen::translate() { void J3CodeGen::explore() { printf(" exploring bytecode of: %s::%s%s\n", cl->name()->cStr(), method->name()->cStr(), method->signature()->cStr()); while(codeReader->remaining()) { - uint8_t bc = codeReader->readU1(); + bc = codeReader->readU1(); printf(" exploring: %s (%d)\n", J3Cst::opcodeNames[bc], bc); switch(bc) { @@ -1699,45 +1606,11 @@ void J3CodeGen::generateJava() { stack.init(this, maxStack, allocator->allocate(J3CodeGenVar::reservedSize(maxStack))); ret.init(this, 1, allocator->allocate(J3CodeGenVar::reservedSize(1))); - - if(vm->options()->genDebugExecute) { - char buf[256]; - snprintf(buf, 256, "%s::%s", cl->name()->cStr(), method->name()->cStr()); -#if 0 - - fprintf(stderr, "bitcast: "); - builder->CreateBitCast(funcEchoDebugEnter, builder->getInt8PtrTy())->dump(); - fprintf(stderr, "\n"); - - llvm::Value* args[] = { - builder->getInt64(42), /* patch point id */ - builder->getInt32(0), /* pad */ - builder->CreateBitCast(funcEchoDebugEnter, builder->getInt8PtrTy()), /* function funcEchoDebugEnter */ - builder->getInt32(3), /* number of args */ - builder->getInt32(0), /* arg[0] */ - buildString("bip %s\n"), /* arg[1] */ - buildString(buf) /* arg[2] */ - }; - builder->CreateCall(patchPointVoid, args)->dump(); -#else - builder->CreateCall3(funcEchoDebugEnter, - builder->getInt32(0), - buildString("%s\n"), - buildString(buf)); -#endif - } + genDebugEnterLeave(0); uint32_t n=0, pos=0; for(llvm::Function::arg_iterator cur=llvmFunction->arg_begin(); cur!=llvmFunction->arg_end(); cur++) { locals.setAt(flatten(cur), pos); - - if(vm->options()->genDebugExecute) - builder->CreateCall4(funcEchoDebugExecute, - builder->getInt32(2), - buildString(" arg[%d]: %p\n"), - builder->getInt32(pos), - locals.at(pos, cur->getType())); - pos += (cur->getType() == vm->typeLong->llvmType() || cur->getType() == vm->typeDouble->llvmType()) ? 2 : 1; } @@ -1752,14 +1625,8 @@ void J3CodeGen::generateJava() { bbRet = newBB("ret"); builder->SetInsertPoint(bbRet); - if(vm->options()->genDebugExecute) { - char buf[256]; - snprintf(buf, 256, "%s::%s", cl->name()->cStr(), method->name()->cStr()); - builder->CreateCall3(funcEchoDebugEnter, - builder->getInt32(1), - buildString("%s\n"), - buildString(buf)); - } + + genDebugEnterLeave(1); if(llvmFunction->getReturnType()->isVoidTy()) builder->CreateRetVoid(); Modified: vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc?rev=198877&r1=198876&r2=198877&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3utf16.cc Thu Jan 9 11:51:54 2014 @@ -23,7 +23,7 @@ uint16_t J3Utf16Encoder::nextUtf16() { if(x & 0x80) { uint16_t y = str[pos++]; if (x & 0x20) { - char z = str[pos++]; + uint16_t z = str[pos++]; x = ((x & 0x0F) << 12) + ((y & 0x3F) << 6) + (z & 0x3F); @@ -42,10 +42,15 @@ size_t J3Utf16Decoder::decode(J3ObjectHa for(uint32_t i=0; igetCharacterAt(i); - if(c > 127) { - J3::internalError("implement me: fun char"); - } else { + if(c < (1<<7)) { dest[pos++] = (char)c; + } else if(c < (1<<11)) { + dest[pos++] = ((c>>6) & 0x1f) | 0x80; + dest[pos++] = c & 0x3f; + } else { + dest[pos++] = ((c>>12) & 0xf) | (0x80 + 0x20); + dest[pos++] = (c>>6) & 0x3f; + dest[pos++] = c & 0x3f; } } From gael.thomas at lip6.fr Thu Jan 9 14:46:57 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 09 Jan 2014 22:46:57 -0000 Subject: [vmkit-commits] [vmkit] r198895 - if_icmplt is an if_icmplt, not le... Message-ID: <20140109224657.BD54C2A6C02D@llvm.org> Author: gthomas Date: Thu Jan 9 16:46:57 2014 New Revision: 198895 URL: http://llvm.org/viewvc/llvm-project?rev=198895&view=rev Log: if_icmplt is an if_icmplt, not le... Modified: vmkit/branches/mcjit/include/j3/j3lib.h vmkit/branches/mcjit/include/j3/j3options.h vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc Modified: vmkit/branches/mcjit/include/j3/j3lib.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3lib.h?rev=198895&r1=198894&r2=198895&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3lib.h (original) +++ vmkit/branches/mcjit/include/j3/j3lib.h Thu Jan 9 16:46:57 2014 @@ -12,6 +12,7 @@ namespace j3 { public: static const char* systemClassesArchives(); static const char* systemLibraryPath(); + static const char* extDirs(); static int loadSystemLibraries(std::vector >* handles); static void bootstrap(J3* vm); Modified: vmkit/branches/mcjit/include/j3/j3options.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3options.h?rev=198895&r1=198894&r2=198895&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3options.h (original) +++ vmkit/branches/mcjit/include/j3/j3options.h Thu Jan 9 16:46:57 2014 @@ -28,6 +28,7 @@ namespace j3 { const char* bootClasspath; const char* systemLibraryPath; const char* classpath; + const char* extDirs; bool debugEnterIndent; uint32_t genDebugExecute; uint32_t debugExecute; Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=198895&r1=198894&r2=198895&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Thu Jan 9 16:46:57 2014 @@ -59,6 +59,10 @@ const char* J3Lib::systemLibraryPath() { return OPENJDK_LIBPATH; } +const char* J3Lib::extDirs() { + return OPENJDK_HOME"jre/lib/ext"; +} + int J3Lib::loadSystemLibraries(std::vector >* nativeLibraries) { /* JavaRuntimeSupport checks for a symbol defined in this library */ void* h0 = dlopen(OPENJDK_LIBPATH"/libinstrument"SHLIBEXT, RTLD_LAZY | RTLD_GLOBAL); @@ -74,33 +78,3 @@ int J3Lib::loadSystemLibraries(std::vect return 0; } - -#if 0 -// from openjdk - - -// Creates the initial Thread -static oop create_initial_thread(Handle thread_group, JavaThread* thread, TRAPS) { - Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK_NULL); - instanceKlassHandle klass (THREAD, k); - instanceHandle thread_oop = klass->allocate_instance_handle(CHECK_NULL); - - java_lang_Thread::set_thread(thread_oop(), thread); - java_lang_Thread::set_priority(thread_oop(), NormPriority); - thread->set_threadObj(thread_oop()); - - Handle string = java_lang_String::create_from_str("main", CHECK_NULL); - - JavaValue result(T_VOID); - JavaCalls::call_special(&result, thread_oop, - klass, - vmSymbols::object_initializer_name(), - vmSymbols::threadgroup_string_void_signature(), - thread_group, - string, - CHECK_NULL); - return thread_oop(); -} - -// Creates the initial ThreadGroup -#endif 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=198895&r1=198894&r2=198895&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan 9 16:46:57 2014 @@ -189,6 +189,7 @@ jobject JNICALL JVM_InitProperties(JNIEn setProp("java.boot.class.path", vm->options()->bootClasspath); setProp("sun.boot.library.path", vm->options()->systemLibraryPath); setProp("sun.boot.class.path", vm->options()->bootClasspath); + setProp("java.ext.dirs", vm->options()->extDirs); #if 0 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=198895&r1=198894&r2=198895&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Thu Jan 9 16:46:57 2014 @@ -157,25 +157,24 @@ void J3::run() { if(options()->debugLifeCycle) fprintf(stderr, " Launching the application\n"); - options()->genDebugExecute = 1; - options()->debugExecute = 5; + options()->debugExecute = 0; -#if 0 +#if 1 J3Class* loaderClass = z_class("java/lang/ClassLoader"); J3ObjectHandle* sysLoader = z_method(J3Cst::ACC_STATIC, loaderClass, names()->get("getSystemClassLoader"), names()->get("()Ljava/lang/ClassLoader;"))->invokeStatic().valObject; -#endif +#else J3ObjectHandle* res = z_method(J3Cst::ACC_STATIC, z_class("sun/launcher/LauncherHelper"), names()->get("checkAndLoadMain"), names()->get("(ZILjava/lang/String;)Ljava/lang/Class;")) ->invokeStatic(1, 1, utfToString("HelloWorld")).valObject; - + fprintf(stderr, "system class loader: sysLoader: %p - %p\n", res, res->obj()); - // public static ClassLoader getSystemClassLoader() { +#endif } JNIEnv* J3::jniEnv() { Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc?rev=198895&r1=198894&r2=198895&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc Thu Jan 9 16:46:57 2014 @@ -63,11 +63,11 @@ void J3CodeGen::echoElement(uint32_t lev if(J3Thread::get()->vm()->options()->debugExecute >= level) { switch(type) { case DEBUG_TYPE_INT: - fprintf(stderr, "%lld", (uint64_t)elmt); + fprintf(stderr, "(long)%lld", (uint64_t)elmt); break; case DEBUG_TYPE_FLOAT: - fprintf(stderr, "%lf", *((double*)&elmt)); + fprintf(stderr, "(double)%lf", *((double*)&elmt)); break; case DEBUG_TYPE_OBJECT: @@ -88,7 +88,7 @@ void J3CodeGen::echoElement(uint32_t lev char buf[J3Utf16Decoder::maxSize(content)]; J3Utf16Decoder::decode(content, buf); J3Thread::get()->restore(prev); - fprintf(stderr, "%s [%s]", pobj->vt()->type()->name()->cStr(), buf); + fprintf(stderr, "%s \"%s\"", pobj->vt()->type()->name()->cStr(), buf); } else fprintf(stderr, "%s@%p", pobj->vt()->type()->name()->cStr(), (void*)elmt); } else @@ -115,6 +115,15 @@ void J3CodeGen::genEchoElement(const cha builder->getInt32(4), builder->getInt32(DEBUG_TYPE_OBJECT), builder->CreatePtrToInt(val, uintPtrTy)); + else { + val = builder->CreateFPExt(val, builder->getDoubleTy()); + llvm::Value* loc = builder->CreateAlloca(val->getType()); + builder->CreateStore(val, loc); + builder->CreateCall3(funcEchoElement, + builder->getInt32(4), + builder->getInt32(DEBUG_TYPE_FLOAT), + builder->CreateLoad(builder->CreateBitCast(loc, uintPtrTy->getPointerTo()))); + } builder->CreateCall2(funcEchoDebugExecute, builder->getInt32(4), buildString("\n")); 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=198895&r1=198894&r2=198895&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Thu Jan 9 16:46:57 2014 @@ -1392,7 +1392,7 @@ void J3CodeGen::translate() { break; case J3Cst::BC_if_icmplt: /* 0xa1 */ - val2 = stack.pop(); val1 = stack.pop(); condBr(builder->CreateICmpSLE(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); condBr(builder->CreateICmpSLT(val1, val2)); break; case J3Cst::BC_if_icmpge: /* 0xa2 */ 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=198895&r1=198894&r2=198895&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Thu Jan 9 16:46:57 2014 @@ -14,6 +14,7 @@ J3Options::J3Options() { bootClasspath = J3Lib::systemClassesArchives(); systemLibraryPath = J3Lib::systemLibraryPath(); classpath = "."; + extDirs = J3Lib::extDirs(); debugEnterIndent = 1; @@ -25,7 +26,7 @@ J3Options::J3Options() { debugLinking = 0; debugLifeCycle = 1; - genDebugExecute = 2;//debugExecute ? 1 : 0; + genDebugExecute = 0;//debugExecute ? 1 : 0; stackSize = 0x80*0x1000; } From gael.thomas at lip6.fr Thu Jan 9 14:59:49 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 09 Jan 2014 22:59:49 -0000 Subject: [vmkit-commits] [vmkit] r198898 - Add few openjdk/jni functions Message-ID: <20140109225949.1D2502A6C02E@llvm.org> Author: gthomas Date: Thu Jan 9 16:59:48 2014 New Revision: 198898 URL: http://llvm.org/viewvc/llvm-project?rev=198898&view=rev Log: Add few openjdk/jni functions Modified: vmkit/branches/mcjit/include/j3/j3.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3.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=198898&r1=198897&r2=198898&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Thu Jan 9 16:59:48 2014 @@ -151,6 +151,7 @@ namespace j3 { static void nullPointerException() __attribute__((noreturn)); static void classCastException() __attribute__((noreturn)); + static void negativeArraySizeException(int32_t length) __attribute__((noreturn)); static void arrayStoreException() __attribute__((noreturn)); static void arrayIndexOutOfBoundsException() __attribute__((noreturn)); 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=198898&r1=198897&r2=198898&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan 9 16:59:48 2014 @@ -443,7 +443,16 @@ jobject JNICALL JVM_GetArrayElement(JNIE jvalue JNICALL JVM_GetPrimitiveArrayElement(JNIEnv* env, jobject arr, jint index, jint wCode) { enterJVM(); NYI(); leaveJVM(); } void JNICALL JVM_SetArrayElement(JNIEnv* env, jobject arr, jint index, jobject val) { enterJVM(); NYI(); leaveJVM(); } void JNICALL JVM_SetPrimitiveArrayElement(JNIEnv* env, jobject arr, jint index, jvalue v, unsigned char vCode) { enterJVM(); NYI(); leaveJVM(); } -jobject JNICALL JVM_NewArray(JNIEnv* env, jclass eltClass, jint length) { enterJVM(); NYI(); leaveJVM(); } + +jobject JNICALL JVM_NewArray(JNIEnv* env, jclass eltClass, jint length) { + jobject res; + enterJVM(); + if(length < 0) J3::negativeArraySizeException(length); + res = J3ObjectHandle::doNewArray(J3Class::nativeClass(eltClass)->getArray(), length); + leaveJVM(); + return res; +} + jobject JNICALL JVM_NewMultiArray(JNIEnv* env, jclass eltClass, jintArray dim) { enterJVM(); NYI(); leaveJVM(); } /* 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=198898&r1=198897&r2=198898&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Thu Jan 9 16:59:48 2014 @@ -273,6 +273,10 @@ void J3::linkageError(J3Method* method) method->signature()->name()->cStr()); } +void J3::negativeArraySizeException(int32_t length) { + internalError("negative array size exception: %ld", length); +} + void J3::arrayStoreException() { internalError("array store exception"); } 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=198898&r1=198897&r2=198898&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Thu Jan 9 16:59:48 2014 @@ -486,9 +486,37 @@ jsize JNICALL GetArrayLength(JNIEnv* env return res; } -jobjectArray JNICALL NewObjectArray(JNIEnv* env, jsize len, jclass clazz, jobject init) { enterJVM(); leaveJVM(); NYI(); } -jobject JNICALL GetObjectArrayElement(JNIEnv* env, jobjectArray array, jsize index) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL SetObjectArrayElement(JNIEnv* env, jobjectArray array, jsize index, jobject val) { enterJVM(); leaveJVM(); NYI(); } +jobjectArray JNICALL NewObjectArray(JNIEnv* env, jsize length, jclass elementClass, jobject initialElement) { + jobjectArray res; + enterJVM(); + if((signed)length < 0) J3::negativeArraySizeException(length); + res = J3ObjectHandle::doNewArray(J3ObjectType::nativeClass(elementClass)->getArray(), length); + if(initialElement) + for(jsize i=0; isetObjectAt(i, initialElement); + leaveJVM(); + return res; +} + +jobject JNICALL GetObjectArrayElement(JNIEnv* env, jobjectArray array, jsize index) { + jobject res; + enterJVM(); + if(index >= array->arrayLength()) + J3::arrayIndexOutOfBoundsException(); + res = array->getObjectAt(index); + leaveJVM(); + return res; +} + +void JNICALL SetObjectArrayElement(JNIEnv* env, jobjectArray array, jsize index, jobject val) { + enterJVM(); + if(index >= array->arrayLength()) + J3::arrayIndexOutOfBoundsException(); + if(!val->vt()->type()->isAssignableTo(array->vt()->type()->asArrayClass()->component())) + J3::arrayStoreException(); + array->setObjectAt(index, val); + leaveJVM(); +} jboolean* JNICALL GetBooleanArrayElements(JNIEnv* env, jbooleanArray array, jboolean* isCopy) { enterJVM(); leaveJVM(); NYI(); } jbyte* JNICALL GetByteArrayElements(JNIEnv* env, jbyteArray array, jboolean* isCopy) { enterJVM(); leaveJVM(); NYI(); } From gael.thomas at lip6.fr Sat Jan 11 02:54:50 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 11 Jan 2014 10:54:50 -0000 Subject: [vmkit-commits] [vmkit] r199002 - Try a new trampoline (partially implemented). Message-ID: <20140111105450.DB26C2A6C032@llvm.org> Author: gthomas Date: Sat Jan 11 04:54:50 2014 New Revision: 199002 URL: http://llvm.org/viewvc/llvm-project?rev=199002&view=rev Log: Try a new trampoline (partially implemented). Added: vmkit/branches/mcjit/include/j3/j3arch-dep.h vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s Modified: vmkit/branches/mcjit/Makefile.rules vmkit/branches/mcjit/include/j3/j3thread.h vmkit/branches/mcjit/include/j3/j3trampoline.h vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Modified: vmkit/branches/mcjit/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/Makefile.rules?rev=199002&r1=199001&r2=199002&view=diff ============================================================================== --- vmkit/branches/mcjit/Makefile.rules (original) +++ vmkit/branches/mcjit/Makefile.rules Sat Jan 11 04:54:50 2014 @@ -144,7 +144,7 @@ ifndef BASE_OBJ_FILES BASE_OBJ_FILES=$(call find-sources,.cc) endif BC_FILES+=$(addsuffix .bc,$(addprefix $(BUILD_DIR)/,$(BASE_OBJ_FILES))) -OBJ_FILES+=$(addsuffix .o,$(addprefix $(BUILD_DIR)/,$(BASE_OBJ_FILES))) +OBJ_FILES+=$(addsuffix .o,$(addprefix $(BUILD_DIR)/,$(BASE_OBJ_FILES) $(basename $(notdir $(wildcard $(PROJ_SRC_CWD)/*.s))))) DEP_FILES=$(addsuffix .d,$(addprefix $(BUILD_DIR)/,$(BASE_OBJ_FILES))) check:: @@ -312,21 +312,22 @@ $(GEN_MODULE).a: $(GC_OBJ_FILES) $(Echo) "Assembling '$(notdir $<)'" $(Verb) $(LLC) $(LLCFLAGS) $(GC_LLCFLAGS) -filetype=obj $< -o $@ +$(BUILD_DIR)/%.o: %.s $(SELF) $(BUILD_DIR)/.dir + $(Echo) "Assembling '$(notdir $<)'" + $(Verb) if $(CLANGXX) $(CXXFLAGS) $(DEPEND_OPTIONS) -c "$<" -o $@; $(DOM) + %-gc.bc: %.bc $(Echo) "Preparing GC '$(notdir $<)'" $(Verb) $(LLOPT) -load=$(STATIC_GC_PASS_LIB) $(OPTFLAGS) -StaticGCPass $< -o $@ define define_compile_rule -$(BUILD_DIR)/%.bc: %$1 $(SELF) $(BUILD_DIR)/.dir - $(Echo) "Compiling '$$(notdir $$<)'" - $(Verb) if $2 $3 $(DEPEND_OPTIONS) -emit-llvm -c "$$<" -o $$@; $(DOM) - -$(BUILD_DIR)/%.bc: $(BUILD_DIR)/%$1 $(SELF) $(BUILD_DIR)/.dir +$(BUILD_DIR)/%.bc: $4%$1 $(SELF) $(BUILD_DIR)/.dir $(Echo) "Compiling '$$(notdir $$<)'" $(Verb) if $2 $3 $(DEPEND_OPTIONS) -emit-llvm -c "$$<" -o $$@; $(DOM) endef -$(eval $(call define_compile_rule,.cc,$(CLANGXX),$(CXXFLAGS))) +$(eval $(call define_compile_rule,.cc,$(CLANGXX),$(CXXFLAGS),)) +$(eval $(call define_compile_rule,.cc,$(CLANGXX),$(CXXFLAGS),$(BUILD_DIR)/)) %/.dir: $(Verb) mkdir -p $(dir $@) && touch $@ Added: vmkit/branches/mcjit/include/j3/j3arch-dep.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3arch-dep.h?rev=199002&view=auto ============================================================================== --- vmkit/branches/mcjit/include/j3/j3arch-dep.h (added) +++ vmkit/branches/mcjit/include/j3/j3arch-dep.h Sat Jan 11 04:54:50 2014 @@ -0,0 +1,6 @@ +#ifndef _J3_ARCH_DEP_H_ +#define _J3_ARCH_DEP_H_ + +#define TRAMPOLINE_SAVE_ZONE (8*16 + 6*8 + 2*8) + +#endif Modified: vmkit/branches/mcjit/include/j3/j3thread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3thread.h?rev=199002&r1=199001&r2=199002&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3thread.h (original) +++ vmkit/branches/mcjit/include/j3/j3thread.h Sat Jan 11 04:54:50 2014 @@ -5,6 +5,7 @@ #include "vmkit/allocator.h" #include "j3/j3object.h" #include "j3/j3jni.h" +#include "j3/j3arch-dep.h" namespace vmkit { class Safepoint; @@ -16,6 +17,7 @@ namespace j3 { class J3Thread : public vmkit::Thread { friend class J3Monitor; friend class J3CodeGen; + friend class J3Trampoline; static const uint32_t gepInterfaceMethodIndex = 1; uint32_t _interfaceMethodIndex; @@ -26,6 +28,7 @@ namespace j3 { J3LocalReferences _localReferences; J3ObjectHandle* _pendingException; J3ObjectHandle _javaThread; + char _trampolineSaveZone[TRAMPOLINE_SAVE_ZONE]; virtual void run(); static void doRun(); Modified: vmkit/branches/mcjit/include/j3/j3trampoline.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3trampoline.h?rev=199002&r1=199001&r2=199002&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3trampoline.h (original) +++ vmkit/branches/mcjit/include/j3/j3trampoline.h Sat Jan 11 04:54:50 2014 @@ -1,6 +1,18 @@ #ifndef _J3_TRAMPOLINE_H_ #define _J3_TRAMPOLINE_H_ +#include + +extern "C" uintptr_t trampoline_mask; +extern "C" uintptr_t trampoline_offset; +extern "C" char trampoline_generic; +extern "C" char trampoline_generic_save; +extern "C" char trampoline_generic_method; +extern "C" char trampoline_generic_resolver; +extern "C" char trampoline_generic_end; +extern "C" char trampoline_save; +extern "C" void trampoline_restart(void* ptr, void* saveZone); + namespace vmkit { class BumpAllocator; } @@ -16,6 +28,8 @@ namespace j3 { static void* buildTrampoline(vmkit::BumpAllocator* allocator, J3Method* method, void* tra); public: + static void initialize(uintptr_t mask); + static void* buildStaticTrampoline(vmkit::BumpAllocator* allocator, J3Method* target); static void* buildVirtualTrampoline(vmkit::BumpAllocator* allocator, J3Method* target); static void* buildInterfaceTrampoline(vmkit::BumpAllocator* allocator); 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=199002&r1=199001&r2=199002&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sat Jan 11 04:54:50 2014 @@ -70,6 +70,7 @@ void J3::start(int argc, char** argv) { _options.process(argc, argv); vmkit::ThreadAllocator::initialize(sizeof(J3Thread), options()->stackSize); + J3Trampoline::initialize(vmkit::Thread::getThreadMask()); J3Thread* thread = new J3ThreadBootstrap(this); @@ -159,7 +160,7 @@ void J3::run() { options()->debugExecute = 0; -#if 1 +#if 0 J3Class* loaderClass = z_class("java/lang/ClassLoader"); J3ObjectHandle* sysLoader = z_method(J3Cst::ACC_STATIC, loaderClass, @@ -311,7 +312,7 @@ void J3::printStackTrace() { } else { Dl_info info; - if(dladdr(walker.ip(), &info)) { + if(dladdr((void*)((uintptr_t)walker.ip()-1), &info)) { int status; const char* demangled = abi::__cxa_demangle(info.dli_sname, 0, 0, &status); const char* name = demangled ? demangled : info.dli_sname; Added: vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s?rev=199002&view=auto ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s (added) +++ vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s Sat Jan 11 04:54:50 2014 @@ -0,0 +1,85 @@ + .section __DATA,__data + .globl _trampoline_mask, _trampoline_offset + +_trampoline_mask: + .quad 0 +_trampoline_offset: + .quad 0 + + .section __TEXT,__text,regular,pure_instructions + .globl _trampoline_generic, _trampoline_generic_save, _trampoline_save, _trampoline_generic_method + .globl _trampoline_generic_resolver, _trampoline_generic_end, _trampoline_restart + .align 4 + +_trampoline_generic: + .byte 0x48, 0xb8 /* mov _trampoline_save, %rax */ +_trampoline_generic_save: + .quad 0 + callq *%rax + mov %rsp, 184(%rax) + .byte 0x48, 0xbe /* mov _trampoline_generic_method, %rsi */ +_trampoline_generic_method: + .quad 0 + .byte 0x48, 0xb8 /* mov _trampoline_generic_resolver, %rax */ +_trampoline_generic_resolver: + .quad 0 + jmpq *%rax +_trampoline_generic_end: + + /* compute the adress of the save zone area */ + /* and return the adress in %rax */ +_trampoline_get_save_zone: + push %rbx + mov %rsp, %rax + movq _trampoline_mask(%rip), %rbx + and %rbx, %rax + movq _trampoline_offset(%rip), %rbx + add %rbx, %rax + pop %rbx + ret + +_trampoline_save: + call _trampoline_get_save_zone + + mov %xmm0, 0(%rax) + mov %xmm1, 16(%rax) + mov %xmm2, 32(%rax) + mov %xmm3, 48(%rax) + mov %xmm4, 64(%rax) + mov %xmm5, 80(%rax) + mov %xmm6, 96(%rax) + mov %xmm7, 112(%rax) + mov %rdi, 128(%rax) + mov %rsi, 136(%rax) + mov %rdx, 144(%rax) + mov %rcx, 152(%rax) + mov %r8, 160(%rax) + mov %r9, 168(%rax) + mov %rbp, 176(%rax) + + ret + + /* %rdi contains the function */ + /* %rsi contains the save zone area */ +_trampoline_restart: + mov %rdi, %rax + + mov 0(%rsi), %xmm0 + mov 16(%rsi), %xmm1 + mov 32(%rsi), %xmm2 + mov 48(%rsi), %xmm3 + mov 64(%rsi), %xmm4 + mov 80(%rsi), %xmm5 + mov 96(%rsi), %xmm6 + mov 112(%rsi), %xmm7 + mov 128(%rsi), %rdi + mov 144(%rsi), %rdx + mov 152(%rsi), %rcx + mov 160(%rsi), %r8 + mov 168(%rsi), %r9 + mov 176(%rsi), %rbp + mov 184(%rsi), %rsp + + mov 136(%rsi), %rsi + + jmpq *%rax Modified: vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc?rev=199002&r1=199001&r2=199002&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Sat Jan 11 04:54:50 2014 @@ -5,9 +5,11 @@ #include "j3/j3class.h" #include "j3/j3.h" + using namespace j3; void* J3Trampoline::interfaceTrampoline(J3Object* obj) { + J3::internalError("implement me it"); J3ObjectHandle* prev = J3Thread::get()->tell(); J3ObjectHandle* handle = J3Thread::get()->push(obj); J3ObjectType* type = obj->vt()->type()->asObjectType(); @@ -32,11 +34,16 @@ void* J3Trampoline::interfaceTrampoline( } void* J3Trampoline::staticTrampoline(J3Object* obj, J3Method* target) { + char saveZone[TRAMPOLINE_SAVE_ZONE]; + memcpy(saveZone, J3Thread::get()->_trampolineSaveZone, TRAMPOLINE_SAVE_ZONE); target->ensureCompiled(0); - return target->fnPtr(); + //return target->fnPtr(); + trampoline_restart(target->fnPtr(), saveZone); + return 0; } void* J3Trampoline::virtualTrampoline(J3Object* obj, J3Method* target) { + J3::internalError("implement me vt"); J3ObjectHandle* prev = J3Thread::get()->tell(); J3ObjectHandle* handle = J3Thread::get()->push(obj); J3ObjectType* cl = handle->vt()->type()->asObjectType(); @@ -52,50 +59,14 @@ void* J3Trampoline::virtualTrampoline(J3 } void* J3Trampoline::buildTrampoline(vmkit::BumpAllocator* allocator, J3Method* m, void* tra) { - size_t trampolineSize = 148; - void* res = allocator->allocate(trampolineSize); + size_t trampolineSize = &trampoline_generic_end - &trampoline_generic; + char* res = (char*)allocator->allocate(trampolineSize); -#define dd(p, n) ((((uintptr_t)p) >> n) & 0xff) - uint8_t code[] = { - 0x57, // 0: push %rdi - 0x56, // 1: push %rsi - 0x52, // 2: push %rdx - 0x51, // 3: push %rcx - 0x41, 0x50, // 4: push %r8 - 0x41, 0x51, // 6: push %r9 - 0x48, 0x81, 0xec, 0x88, 0x00, 0x00, 0x00, // 8: sub $128+8, %esp - 0xf3, 0x0f, 0x11, 0x04, 0x24, // 15: movss %xmm0, (%rsp) - 0xf3, 0x0f, 0x11, 0x4c, 0x24, 0x10, // 20: movss %xmm1, 16(%rsp) - 0xf3, 0x0f, 0x11, 0x54, 0x24, 0x20, // 26: movss %xmm2, 32(%rsp) - 0xf3, 0x0f, 0x11, 0x5c, 0x24, 0x30, // 32: movss %xmm3, 48(%rsp) - 0xf3, 0x0f, 0x11, 0x64, 0x24, 0x40, // 38: movss %xmm4, 64(%rsp) - 0xf3, 0x0f, 0x11, 0x6c, 0x24, 0x50, // 44: movss %xmm5, 80(%rsp) - 0xf3, 0x0f, 0x11, 0x74, 0x24, 0x60, // 50: movss %xmm6, 96(%rsp) - 0xf3, 0x0f, 0x11, 0x7c, 0x24, 0x70, // 56: movss %xmm7, 112(%rsp) - 0x48, 0xbe, dd(m, 0), dd(m, 8), dd(m, 16), dd(m, 24), dd(m, 32), dd(m, 40), dd(m, 48), dd(m, 56), // 62: mov -> %rsi - 0x48, 0xb8, dd(tra, 0), dd(tra, 8), dd(tra, 16), dd(tra, 24), dd(tra, 32), dd(tra, 40), dd(tra, 48), dd(tra, 56), // 72: mov -> %rax - 0xff, 0xd0, // 82: call %rax - 0xf3, 0x0f, 0x10, 0x04, 0x24, // 84: movss (%rsp), %xmm0 - 0xf3, 0x0f, 0x10, 0x4c, 0x24, 0x10, // 89: movss 16(%rsp), %xmm1 - 0xf3, 0x0f, 0x10, 0x54, 0x24, 0x20, // 95: movss 32(%rsp), %xmm2 - 0xf3, 0x0f, 0x10, 0x5c, 0x24, 0x30, // 101: movss 48(%rsp), %xmm3 - 0xf3, 0x0f, 0x10, 0x64, 0x24, 0x40, // 107: movss 64(%rsp), %xmm4 - 0xf3, 0x0f, 0x10, 0x6c, 0x24, 0x50, // 113: movss 80(%rsp), %xmm5 - 0xf3, 0x0f, 0x10, 0x74, 0x24, 0x60, // 119: movss 96(%rsp), %xmm6 - 0xf3, 0x0f, 0x10, 0x7c, 0x24, 0x70, // 125: movss 112(%rsp), %xmm7 - 0x48, 0x81, 0xc4, 0x88, 0x00, 0x00, 0x00, // 131: add $128+8, %esp - 0x41, 0x59, // 138: pop %r9 - 0x41, 0x58, // 140: pop %r8 - 0x59, // 142: pop %rcx - 0x5a, // 143: pop %rdx - 0x5e, // 144: pop %rsi - 0x5f, // 145: pop %rdi - 0xff, 0xe0 // 146: jmp %rax - // total: 148 - }; -#undef dd + memcpy(res, &trampoline_generic, trampolineSize); - memcpy(res, code, trampolineSize); + *((char**)(res + (&trampoline_generic_save - &trampoline_generic))) = &trampoline_save; + *((void**)(res + (&trampoline_generic_method - &trampoline_generic))) = (void*)m; + *((void**)(res + (&trampoline_generic_resolver - &trampoline_generic))) = tra; return res; } @@ -111,3 +82,10 @@ void* J3Trampoline::buildVirtualTrampoli void* J3Trampoline::buildInterfaceTrampoline(vmkit::BumpAllocator* allocator) { return buildTrampoline(allocator, 0, (void*)interfaceTrampoline); } + +void J3Trampoline::initialize(uintptr_t mask) { + J3Thread* thread = J3Thread::get(); + trampoline_mask = mask; + trampoline_offset = (uintptr_t)&thread->_trampolineSaveZone - (uintptr_t)thread; +} + From gael.thomas at lip6.fr Sat Jan 11 06:14:23 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 11 Jan 2014 14:14:23 -0000 Subject: [vmkit-commits] [vmkit] r199008 - Avoid one write in trampoline. Message-ID: <20140111141423.6BC2A2A6C032@llvm.org> Author: gthomas Date: Sat Jan 11 08:14:23 2014 New Revision: 199008 URL: http://llvm.org/viewvc/llvm-project?rev=199008&view=rev Log: Avoid one write in trampoline. Modified: vmkit/branches/mcjit/include/j3/j3trampoline.h vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Modified: vmkit/branches/mcjit/include/j3/j3trampoline.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3trampoline.h?rev=199008&r1=199007&r2=199008&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3trampoline.h (original) +++ vmkit/branches/mcjit/include/j3/j3trampoline.h Sat Jan 11 08:14:23 2014 @@ -6,7 +6,6 @@ extern "C" uintptr_t trampoline_mask; extern "C" uintptr_t trampoline_offset; extern "C" char trampoline_generic; -extern "C" char trampoline_generic_save; extern "C" char trampoline_generic_method; extern "C" char trampoline_generic_resolver; extern "C" char trampoline_generic_end; Modified: vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s?rev=199008&r1=199007&r2=199008&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s Sat Jan 11 08:14:23 2014 @@ -1,20 +1,15 @@ .section __DATA,__data .globl _trampoline_mask, _trampoline_offset + .globl _trampoline_generic, _trampoline_generic_method, _trampoline_generic_resolver, _trampoline_generic_end _trampoline_mask: .quad 0 _trampoline_offset: .quad 0 - - .section __TEXT,__text,regular,pure_instructions - .globl _trampoline_generic, _trampoline_generic_save, _trampoline_save, _trampoline_generic_method - .globl _trampoline_generic_resolver, _trampoline_generic_end, _trampoline_restart - .align 4 - + _trampoline_generic: - .byte 0x48, 0xb8 /* mov _trampoline_save, %rax */ -_trampoline_generic_save: - .quad 0 + .byte 0x48, 0xb8 /* mov _trampoline_save, %rax (absolute adressing, what is the mnemonic?) */ + .quad _trampoline_save callq *%rax mov %rsp, 184(%rax) .byte 0x48, 0xbe /* mov _trampoline_generic_method, %rsi */ @@ -25,6 +20,10 @@ _trampoline_generic_resolver: .quad 0 jmpq *%rax _trampoline_generic_end: + + .section __TEXT,__text,regular,pure_instructions + .globl _trampoline_save, _trampoline_restart + .align 4 /* compute the adress of the save zone area */ /* and return the adress in %rax */ Modified: vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc?rev=199008&r1=199007&r2=199008&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Sat Jan 11 08:14:23 2014 @@ -64,7 +64,6 @@ void* J3Trampoline::buildTrampoline(vmki memcpy(res, &trampoline_generic, trampolineSize); - *((char**)(res + (&trampoline_generic_save - &trampoline_generic))) = &trampoline_save; *((void**)(res + (&trampoline_generic_method - &trampoline_generic))) = (void*)m; *((void**)(res + (&trampoline_generic_resolver - &trampoline_generic))) = tra; From gael.thomas at lip6.fr Sat Jan 11 07:22:13 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 11 Jan 2014 15:22:13 -0000 Subject: [vmkit-commits] [vmkit] r199010 - Transparent trampoline for the stack (important for libunwind) Message-ID: <20140111152213.C07F619BE00D@llvm.org> Author: gthomas Date: Sat Jan 11 09:22:13 2014 New Revision: 199010 URL: http://llvm.org/viewvc/llvm-project?rev=199010&view=rev Log: Transparent trampoline for the stack (important for libunwind) Modified: vmkit/branches/mcjit/include/j3/j3arch-dep.h vmkit/branches/mcjit/include/j3/j3thread.h vmkit/branches/mcjit/include/j3/j3trampoline.h vmkit/branches/mcjit/include/vmkit/allocator.h vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc vmkit/branches/mcjit/lib/vmkit/allocator.cc vmkit/branches/mcjit/lib/vmkit/thread.cc Modified: vmkit/branches/mcjit/include/j3/j3arch-dep.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3arch-dep.h?rev=199010&r1=199009&r2=199010&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3arch-dep.h (original) +++ vmkit/branches/mcjit/include/j3/j3arch-dep.h Sat Jan 11 09:22:13 2014 @@ -1,6 +1,13 @@ #ifndef _J3_ARCH_DEP_H_ #define _J3_ARCH_DEP_H_ -#define TRAMPOLINE_SAVE_ZONE (8*16 + 6*8 + 2*8) +namespace j3 { + class J3Method; + + class J3TrampolineArg { + uint64_t savee[8*2 + 6 + 2]; + /* xmm0 - xmm7 + %rdi/%rsi/%rdx/%rcx/%r8/%r9 + %rbp, %rsp */ + }; +} #endif Modified: vmkit/branches/mcjit/include/j3/j3thread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3thread.h?rev=199010&r1=199009&r2=199010&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3thread.h (original) +++ vmkit/branches/mcjit/include/j3/j3thread.h Sat Jan 11 09:22:13 2014 @@ -17,7 +17,6 @@ namespace j3 { class J3Thread : public vmkit::Thread { friend class J3Monitor; friend class J3CodeGen; - friend class J3Trampoline; static const uint32_t gepInterfaceMethodIndex = 1; uint32_t _interfaceMethodIndex; @@ -28,7 +27,9 @@ namespace j3 { J3LocalReferences _localReferences; J3ObjectHandle* _pendingException; J3ObjectHandle _javaThread; - char _trampolineSaveZone[TRAMPOLINE_SAVE_ZONE]; + public: + J3TrampolineArg _trampolineArg; + private: virtual void run(); static void doRun(); Modified: vmkit/branches/mcjit/include/j3/j3trampoline.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3trampoline.h?rev=199010&r1=199009&r2=199010&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3trampoline.h (original) +++ vmkit/branches/mcjit/include/j3/j3trampoline.h Sat Jan 11 09:22:13 2014 @@ -3,13 +3,10 @@ #include -extern "C" uintptr_t trampoline_mask; -extern "C" uintptr_t trampoline_offset; extern "C" char trampoline_generic; extern "C" char trampoline_generic_method; extern "C" char trampoline_generic_resolver; extern "C" char trampoline_generic_end; -extern "C" char trampoline_save; extern "C" void trampoline_restart(void* ptr, void* saveZone); namespace vmkit { @@ -21,9 +18,9 @@ namespace j3 { class J3Object; class J3Trampoline { - static void* interfaceTrampoline(J3Object* obj); - static void* staticTrampoline(J3Object* obj, J3Method* ref); - static void* virtualTrampoline(J3Object* obj, J3Method* ref); + static void interfaceTrampoline(J3Object* obj); + static void staticTrampoline(J3Object* obj, J3Method* ref); + static void virtualTrampoline(J3Object* obj, J3Method* ref); static void* buildTrampoline(vmkit::BumpAllocator* allocator, J3Method* method, void* tra); public: Modified: vmkit/branches/mcjit/include/vmkit/allocator.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/allocator.h?rev=199010&r1=199009&r2=199010&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/allocator.h (original) +++ vmkit/branches/mcjit/include/vmkit/allocator.h Sat Jan 11 09:22:13 2014 @@ -119,29 +119,26 @@ namespace vmkit { class ThreadAllocator { static const uint32_t refill = 128; - static ThreadAllocator* _allocator; + static pthread_mutex_t mutex; + static uintptr_t baseStack; + static uintptr_t topStack; + static uintptr_t _magic; + static std::vector* spaces; + static std::vector* freeThreads; - pthread_mutex_t mutex; - std::vector spaces; - std::vector freeThreads; - uintptr_t baseStack; - uintptr_t topStack; - - ThreadAllocator(uintptr_t minThreadStruct, uintptr_t minFullSize); public: static void initialize(uintptr_t minThreadStruct, uintptr_t minFullSize); - static ThreadAllocator* allocator() { return _allocator; } - void* allocate(); - void release(void* thread); + static void* allocate(); + static void release(void* thread); - void* alternateStackAddr(void* thread); - size_t alternateStackSize(void* thread); + static void* alternateStackAddr(void* thread); + static size_t alternateStackSize(void* thread); - void* stackAddr(void* thread); - size_t stackSize(void* thread); + static void* stackAddr(void* thread); + static size_t stackSize(void* thread); - uintptr_t magic() { return -topStack; } + static uintptr_t magic() { return _magic; } }; } // end namespace vmkit 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=199010&r1=199009&r2=199010&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sat Jan 11 09:22:13 2014 @@ -70,7 +70,6 @@ void J3::start(int argc, char** argv) { _options.process(argc, argv); vmkit::ThreadAllocator::initialize(sizeof(J3Thread), options()->stackSize); - J3Trampoline::initialize(vmkit::Thread::getThreadMask()); J3Thread* thread = new J3ThreadBootstrap(this); Modified: vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s?rev=199010&r1=199009&r2=199010&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s Sat Jan 11 09:22:13 2014 @@ -1,44 +1,27 @@ .section __DATA,__data - .globl _trampoline_mask, _trampoline_offset + .globl _trampoline_offset, __ZN5vmkit15ThreadAllocator6_magicE .globl _trampoline_generic, _trampoline_generic_method, _trampoline_generic_resolver, _trampoline_generic_end -_trampoline_mask: - .quad 0 -_trampoline_offset: - .quad 0 - _trampoline_generic: - .byte 0x48, 0xb8 /* mov _trampoline_save, %rax (absolute adressing, what is the mnemonic?) */ - .quad _trampoline_save + movabsq $_trampoline_save, %rax /* absolute to avoid any problem of relocation */ callq *%rax - mov %rsp, 184(%rax) - .byte 0x48, 0xbe /* mov _trampoline_generic_method, %rsi */ + .byte 0x48, 0xbe /* movabsq _trampoline_generic_method, %rsi (i.e., replace second arg) */ _trampoline_generic_method: .quad 0 - .byte 0x48, 0xb8 /* mov _trampoline_generic_resolver, %rax */ + .byte 0x48, 0xb8 /* movabsq _trampoline_generic_resolver, %rax */ _trampoline_generic_resolver: .quad 0 jmpq *%rax _trampoline_generic_end: .section __TEXT,__text,regular,pure_instructions - .globl _trampoline_save, _trampoline_restart + .globl _trampoline_restart .align 4 - /* compute the adress of the save zone area */ - /* and return the adress in %rax */ -_trampoline_get_save_zone: - push %rbx - mov %rsp, %rax - movq _trampoline_mask(%rip), %rbx - and %rbx, %rax - movq _trampoline_offset(%rip), %rbx - add %rbx, %rax - pop %rbx - ret - _trampoline_save: - call _trampoline_get_save_zone + mov %rsp, %rax + and __ZN5vmkit15ThreadAllocator6_magicE(%rip), %rax + add _trampoline_offset(%rip), %rax mov %xmm0, 0(%rax) mov %xmm1, 16(%rax) @@ -55,11 +38,14 @@ _trampoline_save: mov %r8, 160(%rax) mov %r9, 168(%rax) mov %rbp, 176(%rax) - + mov %rsp, 184(%rax) + addq $8, 184(%rax) /* my own call :) */ + ret - /* %rdi contains the function */ - /* %rsi contains the save zone area */ + /* void trampoline_restart(void* ptr, void* saveZone); */ + /* %rsi: saveZone */ + /* %rdi: pointer to function */ _trampoline_restart: mov %rdi, %rax Modified: vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc?rev=199010&r1=199009&r2=199010&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Sat Jan 11 09:22:13 2014 @@ -8,8 +8,10 @@ using namespace j3; -void* J3Trampoline::interfaceTrampoline(J3Object* obj) { - J3::internalError("implement me it"); +extern "C" uintptr_t trampoline_offset = (uint64_t)&((J3Thread*)0)->_trampolineArg; + +void J3Trampoline::interfaceTrampoline(J3Object* obj) { + J3TrampolineArg arg = J3Thread::get()->_trampolineArg; J3ObjectHandle* prev = J3Thread::get()->tell(); J3ObjectHandle* handle = J3Thread::get()->push(obj); J3ObjectType* type = obj->vt()->type()->asObjectType(); @@ -30,20 +32,17 @@ void* J3Trampoline::interfaceTrampoline( J3Thread::get()->restore(prev); - return res; + trampoline_restart(res, &arg); } -void* J3Trampoline::staticTrampoline(J3Object* obj, J3Method* target) { - char saveZone[TRAMPOLINE_SAVE_ZONE]; - memcpy(saveZone, J3Thread::get()->_trampolineSaveZone, TRAMPOLINE_SAVE_ZONE); +void J3Trampoline::staticTrampoline(J3Object* obj, J3Method* target) { + J3TrampolineArg arg = J3Thread::get()->_trampolineArg; target->ensureCompiled(0); - //return target->fnPtr(); - trampoline_restart(target->fnPtr(), saveZone); - return 0; + trampoline_restart(target->fnPtr(), &arg); } -void* J3Trampoline::virtualTrampoline(J3Object* obj, J3Method* target) { - J3::internalError("implement me vt"); +void J3Trampoline::virtualTrampoline(J3Object* obj, J3Method* target) { + J3TrampolineArg arg = J3Thread::get()->_trampolineArg; J3ObjectHandle* prev = J3Thread::get()->tell(); J3ObjectHandle* handle = J3Thread::get()->push(obj); J3ObjectType* cl = handle->vt()->type()->asObjectType(); @@ -55,7 +54,7 @@ void* J3Trampoline::virtualTrampoline(J3 J3Thread::get()->restore(prev); - return res; + trampoline_restart(res, &arg); } void* J3Trampoline::buildTrampoline(vmkit::BumpAllocator* allocator, J3Method* m, void* tra) { @@ -82,9 +81,3 @@ void* J3Trampoline::buildInterfaceTrampo return buildTrampoline(allocator, 0, (void*)interfaceTrampoline); } -void J3Trampoline::initialize(uintptr_t mask) { - J3Thread* thread = J3Thread::get(); - trampoline_mask = mask; - trampoline_offset = (uintptr_t)&thread->_trampolineSaveZone - (uintptr_t)thread; -} - Modified: vmkit/branches/mcjit/lib/vmkit/allocator.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/allocator.cc?rev=199010&r1=199009&r2=199010&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/allocator.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/allocator.cc Sat Jan 11 09:22:13 2014 @@ -8,7 +8,12 @@ using namespace vmkit; -ThreadAllocator* ThreadAllocator::_allocator = 0; +pthread_mutex_t ThreadAllocator::mutex; +uintptr_t ThreadAllocator::baseStack = 0; +uintptr_t ThreadAllocator::topStack = 0; +uintptr_t ThreadAllocator::_magic = 0; +std::vector* ThreadAllocator::spaces = 0; +std::vector* ThreadAllocator::freeThreads = 0; void* BumpAllocator::operator new(size_t n) { return (void*)((uintptr_t)map(bucketSize) + sizeof(BumpAllocatorNode)); @@ -89,10 +94,15 @@ void PermanentObject::operator delete[]( Thread::get()->vm()->internalError("should not happen"); } -ThreadAllocator::ThreadAllocator(uintptr_t minThreadStruct, uintptr_t minFullSize) { +void ThreadAllocator::initialize(uintptr_t minThreadStruct, uintptr_t minFullSize) { + if(spaces) + VMKit::internalError("thread allocation system is already initialized"); + spaces = new std::vector(); + freeThreads = new std::vector(); + pthread_mutex_init(&mutex, 0); - spaces.reserve(1); - freeThreads.reserve(refill); + spaces->reserve(1); + freeThreads->reserve(refill); minThreadStruct = ((minThreadStruct - 1) & -PAGE_SIZE) + PAGE_SIZE; baseStack = minThreadStruct + PAGE_SIZE; @@ -102,19 +112,12 @@ ThreadAllocator::ThreadAllocator(uintptr minFullSize = min; topStack = 1L << (__builtin_clzl(0) - __builtin_clzl(minFullSize-1)); -} - -void ThreadAllocator::initialize(uintptr_t minThreadStruct, uintptr_t minFullSize) { - if(_allocator) { - fprintf(stderr, "Never try to modify the thread structure layout dynamically\n"); - abort(); - } - _allocator = new ThreadAllocator(minThreadStruct, minFullSize); + _magic = -topStack; } void* ThreadAllocator::allocate() { pthread_mutex_lock(&mutex); - if(!freeThreads.size()) { + if(!freeThreads->size()) { void* space = mmap(0, topStack*refill, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); if(space == MAP_FAILED) { @@ -122,27 +125,27 @@ void* ThreadAllocator::allocate() { abort(); } - spaces.push_back(space); + spaces->push_back(space); uintptr_t base = (((uintptr_t)space - 1) & -topStack) + topStack; uint32_t n = (base == (uintptr_t)space) ? refill : (refill - 1); for(uint32_t i=0; ipush_back((void*)base); base += topStack; } } - void* res = freeThreads.back(); - freeThreads.pop_back(); + void* res = freeThreads->back(); + freeThreads->pop_back(); pthread_mutex_unlock(&mutex); return res; } void ThreadAllocator::release(void* thread) { pthread_mutex_lock(&mutex); - freeThreads.push_back(thread); + freeThreads->push_back(thread); pthread_mutex_unlock(&mutex); } Modified: vmkit/branches/mcjit/lib/vmkit/thread.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/thread.cc?rev=199010&r1=199009&r2=199010&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/thread.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/thread.cc Sat Jan 11 09:22:13 2014 @@ -13,11 +13,11 @@ void Thread::sigsegvHandler(int n, sigin } void* Thread::operator new(size_t n) { - return ThreadAllocator::allocator()->allocate(); + return ThreadAllocator::allocate(); } void Thread::operator delete(void* p) { - ThreadAllocator::allocator()->release(p); + ThreadAllocator::release(p); } Thread* Thread::get() { @@ -29,7 +29,7 @@ Thread* Thread::get(void* ptr) { } uintptr_t Thread::getThreadMask() { - return ThreadAllocator::allocator()->magic(); + return ThreadAllocator::magic(); } void Thread::registerSignalInternal(int n, sa_action_t handler, bool altStack) { @@ -58,9 +58,9 @@ void* Thread::doRun(void* _thread) { // Set the alternate stack as the second page of the thread's // stack. stack_t st; - st.ss_sp = ThreadAllocator::allocator()->alternateStackAddr(thread); + st.ss_sp = ThreadAllocator::alternateStackAddr(thread); st.ss_flags = 0; - st.ss_size = ThreadAllocator::allocator()->alternateStackSize(thread); + st.ss_size = ThreadAllocator::alternateStackSize(thread); sigaltstack(&st, NULL); thread->registerSignalInternal(SIGSEGV, sigsegvHandler, 1); @@ -74,7 +74,7 @@ void Thread::start() { pthread_attr_t attr; pthread_attr_init(&attr); - pthread_attr_setstack(&attr, ThreadAllocator::allocator()->stackAddr(this), ThreadAllocator::allocator()->stackSize(this)); + pthread_attr_setstack(&attr, ThreadAllocator::stackAddr(this), ThreadAllocator::stackSize(this)); pthread_create(&_tid, &attr, doRun, this); From gael.thomas at lip6.fr Sat Jan 11 07:35:54 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 11 Jan 2014 15:35:54 -0000 Subject: [vmkit-commits] [vmkit] r199011 - Cleanup of trampolines Message-ID: <20140111153554.10AB72A6C032@llvm.org> Author: gthomas Date: Sat Jan 11 09:35:53 2014 New Revision: 199011 URL: http://llvm.org/viewvc/llvm-project?rev=199011&view=rev Log: Cleanup of trampolines Modified: vmkit/branches/mcjit/include/j3/j3arch-dep.h vmkit/branches/mcjit/include/j3/j3trampoline.h vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Modified: vmkit/branches/mcjit/include/j3/j3arch-dep.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3arch-dep.h?rev=199011&r1=199010&r2=199011&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3arch-dep.h (original) +++ vmkit/branches/mcjit/include/j3/j3arch-dep.h Sat Jan 11 09:35:53 2014 @@ -5,8 +5,8 @@ namespace j3 { class J3Method; class J3TrampolineArg { - uint64_t savee[8*2 + 6 + 2]; /* xmm0 - xmm7 + %rdi/%rsi/%rdx/%rcx/%r8/%r9 + %rbp, %rsp */ + uint64_t registers[8*2 + 6 + 2]; }; } Modified: vmkit/branches/mcjit/include/j3/j3trampoline.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3trampoline.h?rev=199011&r1=199010&r2=199011&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3trampoline.h (original) +++ vmkit/branches/mcjit/include/j3/j3trampoline.h Sat Jan 11 09:35:53 2014 @@ -3,11 +3,12 @@ #include -extern "C" char trampoline_generic; -extern "C" char trampoline_generic_method; -extern "C" char trampoline_generic_resolver; -extern "C" char trampoline_generic_end; -extern "C" void trampoline_restart(void* ptr, void* saveZone); +/* defined by j3arch-dep.s */ +extern "C" char trampoline_generic; +extern "C" char trampoline_generic_method; +extern "C" char trampoline_generic_resolver; +extern "C" char trampoline_generic_end; +extern "C" void trampoline_restart(void* ptr, void* saveZone); namespace vmkit { class BumpAllocator; @@ -18,6 +19,9 @@ namespace j3 { class J3Object; class J3Trampoline { + /* used by j3arch-dep.s */ + static uintptr_t argOffset; + static void interfaceTrampoline(J3Object* obj); static void staticTrampoline(J3Object* obj, J3Method* ref); static void virtualTrampoline(J3Object* obj, J3Method* ref); Modified: vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s?rev=199011&r1=199010&r2=199011&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3arch-dep.s Sat Jan 11 09:35:53 2014 @@ -1,5 +1,5 @@ .section __DATA,__data - .globl _trampoline_offset, __ZN5vmkit15ThreadAllocator6_magicE + .globl __ZN2j312J3Trampoline9argOffsetE, __ZN5vmkit15ThreadAllocator6_magicE .globl _trampoline_generic, _trampoline_generic_method, _trampoline_generic_resolver, _trampoline_generic_end _trampoline_generic: @@ -21,7 +21,7 @@ _trampoline_generic_end: _trampoline_save: mov %rsp, %rax and __ZN5vmkit15ThreadAllocator6_magicE(%rip), %rax - add _trampoline_offset(%rip), %rax + add __ZN2j312J3Trampoline9argOffsetE(%rip), %rax mov %xmm0, 0(%rax) mov %xmm1, 16(%rax) Modified: vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc?rev=199011&r1=199010&r2=199011&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Sat Jan 11 09:35:53 2014 @@ -5,13 +5,13 @@ #include "j3/j3class.h" #include "j3/j3.h" - using namespace j3; -extern "C" uintptr_t trampoline_offset = (uint64_t)&((J3Thread*)0)->_trampolineArg; +uintptr_t J3Trampoline::argOffset = (uint64_t)&((J3Thread*)0)->_trampolineArg; void J3Trampoline::interfaceTrampoline(J3Object* obj) { J3TrampolineArg arg = J3Thread::get()->_trampolineArg; + J3ObjectHandle* prev = J3Thread::get()->tell(); J3ObjectHandle* handle = J3Thread::get()->push(obj); J3ObjectType* type = obj->vt()->type()->asObjectType(); @@ -37,7 +37,9 @@ void J3Trampoline::interfaceTrampoline(J void J3Trampoline::staticTrampoline(J3Object* obj, J3Method* target) { J3TrampolineArg arg = J3Thread::get()->_trampolineArg; + target->ensureCompiled(0); + trampoline_restart(target->fnPtr(), &arg); } From gael.thomas at lip6.fr Sun Jan 12 11:58:15 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 12 Jan 2014 19:58:15 -0000 Subject: [vmkit-commits] [vmkit] r199062 - Better management of native libraries. Message-ID: <20140112195816.317902A6C032@llvm.org> Author: gthomas Date: Sun Jan 12 13:58:14 2014 New Revision: 199062 URL: http://llvm.org/viewvc/llvm-project?rev=199062&view=rev Log: Better management of native libraries. Modified: vmkit/branches/mcjit/include/j3/j3classloader.h vmkit/branches/mcjit/include/j3/j3jni.h vmkit/branches/mcjit/include/j3/j3lib.h vmkit/branches/mcjit/include/vmkit/allocator.h vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3jni.cc vmkit/branches/mcjit/lib/vmkit/allocator.cc Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=199062&r1=199061&r2=199062&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Sun Jan 12 13:58:14 2014 @@ -49,12 +49,14 @@ namespace j3 { pthread_mutex_t _mutexMethodTypes; vmkit::NameMap::map methodTypes; - protected: + pthread_mutex_t _mutexNativeLibraries; std::vector > nativeLibraries; public: J3ClassLoader(J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator); + void addNativeLibrary(void* handle); + J3Type* getTypeInternal(J3ObjectType* from, const vmkit::Name* type, uint32_t start, uint32_t* end, bool unify); J3Type* getType(J3ObjectType* from, const vmkit::Name* type); /* find a type */ J3Signature* getSignature(J3ObjectType* from, const vmkit::Name* signature); /* get a method type */ Modified: vmkit/branches/mcjit/include/j3/j3jni.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3jni.h?rev=199062&r1=199061&r2=199062&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3jni.h (original) +++ vmkit/branches/mcjit/include/j3/j3jni.h Sun Jan 12 13:58:14 2014 @@ -8,4 +8,7 @@ namespace j3 { extern struct JNIInvokeInterface_ javaVMTable; } +#define enterJVM() try { +#define leaveJVM() } catch(void* e) { J3Thread::get()->setPendingException(J3Thread::get()->push((J3Object*)e)); } + #endif Modified: vmkit/branches/mcjit/include/j3/j3lib.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3lib.h?rev=199062&r1=199061&r2=199062&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3lib.h (original) +++ vmkit/branches/mcjit/include/j3/j3lib.h Sun Jan 12 13:58:14 2014 @@ -6,14 +6,14 @@ namespace j3 { class J3; - class J3ClassBytes; + class J3ClassLoader; class J3Lib { public: static const char* systemClassesArchives(); static const char* systemLibraryPath(); static const char* extDirs(); - static int loadSystemLibraries(std::vector >* handles); + static void loadSystemLibraries(J3ClassLoader* loader); static void bootstrap(J3* vm); }; Modified: vmkit/branches/mcjit/include/vmkit/allocator.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/allocator.h?rev=199062&r1=199061&r2=199062&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/allocator.h (original) +++ vmkit/branches/mcjit/include/vmkit/allocator.h Sun Jan 12 13:58:14 2014 @@ -29,7 +29,7 @@ namespace vmkit { BumpAllocatorNode* current; void* operator new(size_t n); - BumpAllocator(); /* private to force an allocation via the new operator */ + BumpAllocator(); /* private to force an allocation via create */ ~BumpAllocator(); void operator delete(void* p); public: Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=199062&r1=199061&r2=199062&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Sun Jan 12 13:58:14 2014 @@ -63,18 +63,14 @@ const char* J3Lib::extDirs() { return OPENJDK_HOME"jre/lib/ext"; } -int J3Lib::loadSystemLibraries(std::vector >* nativeLibraries) { +void J3Lib::loadSystemLibraries(J3ClassLoader* loader) { /* JavaRuntimeSupport checks for a symbol defined in this library */ void* h0 = dlopen(OPENJDK_LIBPATH"/libinstrument"SHLIBEXT, RTLD_LAZY | RTLD_GLOBAL); void* handle = dlopen(OPENJDK_LIBPATH"/libjava"SHLIBEXT, RTLD_LAZY | RTLD_LOCAL); - if(!handle || !h0) { - fprintf(stderr, "Fatal: unable to find java system library: %s\n", dlerror()); - abort(); - } + if(!handle || !h0) + J3::internalError("Unable to find java system library: %s\n", dlerror()); - nativeLibraries->push_back(handle); - - return 0; + loader->addNativeLibrary(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=199062&r1=199061&r2=199062&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Jan 12 13:58:14 2014 @@ -15,9 +15,6 @@ using namespace j3; -#define enterJVM() -#define leaveJVM() - #define NYI() { J3Thread::get()->vm()->internalError("not yet implemented: '%s'", __PRETTY_FUNCTION__); } /************************************************************************* @@ -35,8 +32,9 @@ jint JNICALL JVM_GetInterfaceVersion(voi * java.lang.Object */ jint JNICALL JVM_IHashCode(JNIEnv* env, jobject obj) { + uint32_t res; enterJVM(); - uint32_t res = obj ? obj->hashCode() : 0; + res = obj ? obj->hashCode() : 0; leaveJVM(); return res; } @@ -47,8 +45,8 @@ void JNICALL JVM_MonitorWait(JNIEnv* env leaveJVM(); } -void JNICALL JVM_MonitorNotify(JNIEnv* env, jobject obj) { enterJVM(); NYI(); leaveJVM(); } -void JNICALL JVM_MonitorNotifyAll(JNIEnv* env, jobject obj) { enterJVM(); NYI(); leaveJVM(); } +void JNICALL JVM_MonitorNotify(JNIEnv* env, jobject obj) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL JVM_MonitorNotifyAll(JNIEnv* env, jobject obj) { enterJVM(); leaveJVM(); NYI(); } jobject JNICALL JVM_Clone(JNIEnv* env, jobject obj) { jobject res; enterJVM(); @@ -273,14 +271,14 @@ jobject JNICALL JVM_InitProperties(JNIEn /* * java.io.File */ -void JNICALL JVM_OnExit(void (*func)(void)) { enterJVM(); NYI(); leaveJVM(); } +void JNICALL JVM_OnExit(void (*func)(void)) { enterJVM(); leaveJVM(); NYI(); } /* * java.lang.Runtime */ -void JNICALL JVM_Exit(jint code) { enterJVM(); NYI(); leaveJVM(); } -void JNICALL JVM_Halt(jint code) { enterJVM(); NYI(); leaveJVM(); } -void JNICALL JVM_GC(void) { enterJVM(); NYI(); leaveJVM(); } +void JNICALL JVM_Exit(jint code) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL JVM_Halt(jint code) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL JVM_GC(void) { enterJVM(); leaveJVM(); NYI(); } /* Returns the number of real-time milliseconds that have elapsed since the * least-recently-inspected heap object was last inspected by the garbage @@ -296,12 +294,12 @@ void JNICALL JVM_GC(void) { enterJVM(); * longer strongly reachable may have to be inspected multiple times before it * can be reclaimed. */ -jlong JNICALL JVM_MaxObjectInspectionAge(void) { enterJVM(); NYI(); leaveJVM(); } -void JNICALL JVM_TraceInstructions(jboolean on) { enterJVM(); NYI(); leaveJVM(); } -void JNICALL JVM_TraceMethodCalls(jboolean on) { enterJVM(); NYI(); leaveJVM(); } -jlong JNICALL JVM_TotalMemory(void) { enterJVM(); NYI(); leaveJVM(); } -jlong JNICALL JVM_FreeMemory(void) { enterJVM(); NYI(); leaveJVM(); } -jlong JNICALL JVM_MaxMemory(void) { enterJVM(); NYI(); leaveJVM(); } +jlong JNICALL JVM_MaxObjectInspectionAge(void) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL JVM_TraceInstructions(jboolean on) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL JVM_TraceMethodCalls(jboolean on) { enterJVM(); leaveJVM(); NYI(); } +jlong JNICALL JVM_TotalMemory(void) { enterJVM(); leaveJVM(); NYI(); } +jlong JNICALL JVM_FreeMemory(void) { enterJVM(); leaveJVM(); NYI(); } +jlong JNICALL JVM_MaxMemory(void) { enterJVM(); leaveJVM(); NYI(); } jint JNICALL JVM_ActiveProcessorCount(void) { return sysconf(_SC_NPROCESSORS_ONLN); } @@ -310,11 +308,13 @@ void* JNICALL JVM_LoadLibrary(const char void* res; enterJVM(); res = dlopen(name, RTLD_LAZY | RTLD_LOCAL); + if(res) + J3Thread::get()->vm()->initialClassLoader->addNativeLibrary(res); leaveJVM(); return res; } -void JNICALL JVM_UnloadLibrary(void * handle) { enterJVM(); NYI(); leaveJVM(); } +void JNICALL JVM_UnloadLibrary(void * handle) { enterJVM(); leaveJVM(); NYI(); } void * JNICALL JVM_FindLibraryEntry(void *handle, const char *name) { void* res; @@ -335,25 +335,25 @@ jboolean JNICALL JVM_IsSupportedJNIVersi /* * java.lang.Float and java.lang.Double */ -jboolean JNICALL JVM_IsNaN(jdouble d) { enterJVM(); NYI(); leaveJVM(); } +jboolean JNICALL JVM_IsNaN(jdouble d) { enterJVM(); leaveJVM(); NYI(); } /* * java.lang.Throwable */ -void JNICALL JVM_FillInStackTrace(JNIEnv* env, jobject throwable) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_GetStackTraceDepth(JNIEnv* env, jobject throwable) { enterJVM(); NYI(); leaveJVM(); } -jobject JNICALL JVM_GetStackTraceElement(JNIEnv* env, jobject throwable, jint index) { enterJVM(); NYI(); leaveJVM(); } +void JNICALL JVM_FillInStackTrace(JNIEnv* env, jobject throwable) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_GetStackTraceDepth(JNIEnv* env, jobject throwable) { enterJVM(); leaveJVM(); NYI(); } +jobject JNICALL JVM_GetStackTraceElement(JNIEnv* env, jobject throwable, jint index) { enterJVM(); leaveJVM(); NYI(); } /* * java.lang.Compiler */ -void JNICALL JVM_InitializeCompiler (JNIEnv* env, jclass compCls) { enterJVM(); NYI(); leaveJVM(); } -jboolean JNICALL JVM_IsSilentCompiler(JNIEnv* env, jclass compCls) { enterJVM(); NYI(); leaveJVM(); } -jboolean JNICALL JVM_CompileClass(JNIEnv* env, jclass compCls, jclass cls) { enterJVM(); NYI(); leaveJVM(); } -jboolean JNICALL JVM_CompileClasses(JNIEnv* env, jclass cls, jstring jname) { enterJVM(); NYI(); leaveJVM(); } -jobject JNICALL JVM_CompilerCommand(JNIEnv* env, jclass compCls, jobject arg) { enterJVM(); NYI(); leaveJVM(); } -void JNICALL JVM_EnableCompiler(JNIEnv* env, jclass compCls) { enterJVM(); NYI(); leaveJVM(); } -void JNICALL JVM_DisableCompiler(JNIEnv* env, jclass compCls) { enterJVM(); NYI(); leaveJVM(); } +void JNICALL JVM_InitializeCompiler (JNIEnv* env, jclass compCls) { enterJVM(); leaveJVM(); NYI(); } +jboolean JNICALL JVM_IsSilentCompiler(JNIEnv* env, jclass compCls) { enterJVM(); leaveJVM(); NYI(); } +jboolean JNICALL JVM_CompileClass(JNIEnv* env, jclass compCls, jclass cls) { enterJVM(); leaveJVM(); NYI(); } +jboolean JNICALL JVM_CompileClasses(JNIEnv* env, jclass cls, jstring jname) { enterJVM(); leaveJVM(); NYI(); } +jobject JNICALL JVM_CompilerCommand(JNIEnv* env, jclass compCls, jobject arg) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL JVM_EnableCompiler(JNIEnv* env, jclass compCls) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL JVM_DisableCompiler(JNIEnv* env, jclass compCls) { enterJVM(); leaveJVM(); NYI(); } /* * java.lang.Thread @@ -364,7 +364,7 @@ void JNICALL JVM_StartThread(JNIEnv* env leaveJVM(); } -void JNICALL JVM_StopThread(JNIEnv* env, jobject thread, jobject exception) { enterJVM(); NYI(); leaveJVM(); } +void JNICALL JVM_StopThread(JNIEnv* env, jobject thread, jobject exception) { enterJVM(); leaveJVM(); NYI(); } jboolean JNICALL JVM_IsThreadAlive(JNIEnv* env, jobject thread) { jboolean res; @@ -375,8 +375,8 @@ jboolean JNICALL JVM_IsThreadAlive(JNIEn return res; } -void JNICALL JVM_SuspendThread(JNIEnv* env, jobject thread) { enterJVM(); NYI(); leaveJVM(); } -void JNICALL JVM_ResumeThread(JNIEnv* env, jobject thread) { enterJVM(); NYI(); leaveJVM(); } +void JNICALL JVM_SuspendThread(JNIEnv* env, jobject thread) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL JVM_ResumeThread(JNIEnv* env, jobject thread) { enterJVM(); leaveJVM(); NYI(); } void JNICALL JVM_SetThreadPriority(JNIEnv* env, jobject thread, jint prio) { enterJVM(); @@ -384,8 +384,8 @@ void JNICALL JVM_SetThreadPriority(JNIEn leaveJVM(); } -void JNICALL JVM_Yield(JNIEnv* env, jclass threadClass) { enterJVM(); NYI(); leaveJVM(); } -void JNICALL JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis) { enterJVM(); NYI(); leaveJVM(); } +void JNICALL JVM_Yield(JNIEnv* env, jclass threadClass) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis) { enterJVM(); leaveJVM(); NYI(); } jobject JNICALL JVM_CurrentThread(JNIEnv* env, jclass threadClass) { jobject res; @@ -395,54 +395,54 @@ jobject JNICALL JVM_CurrentThread(JNIEnv return res; } -jint JNICALL JVM_CountStackFrames(JNIEnv* env, jobject thread) { enterJVM(); NYI(); leaveJVM(); } -void JNICALL JVM_Interrupt(JNIEnv* env, jobject thread) { enterJVM(); NYI(); leaveJVM(); } -jboolean JNICALL JVM_IsInterrupted(JNIEnv* env, jobject thread, jboolean clearInterrupted) { enterJVM(); NYI(); leaveJVM(); } -jboolean JNICALL JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj) { enterJVM(); NYI(); leaveJVM(); } -void JNICALL JVM_DumpAllStacks(JNIEnv* env, jclass unused) { enterJVM(); NYI(); leaveJVM(); } -jobjectArray JNICALL JVM_GetAllThreads(JNIEnv* env, jclass dummy) { enterJVM(); NYI(); leaveJVM(); } -void JNICALL JVM_SetNativeThreadName(JNIEnv* env, jobject jthread, jstring name) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_CountStackFrames(JNIEnv* env, jobject thread) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL JVM_Interrupt(JNIEnv* env, jobject thread) { enterJVM(); leaveJVM(); NYI(); } +jboolean JNICALL JVM_IsInterrupted(JNIEnv* env, jobject thread, jboolean clearInterrupted) { enterJVM(); leaveJVM(); NYI(); } +jboolean JNICALL JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL JVM_DumpAllStacks(JNIEnv* env, jclass unused) { enterJVM(); leaveJVM(); NYI(); } +jobjectArray JNICALL JVM_GetAllThreads(JNIEnv* env, jclass dummy) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL JVM_SetNativeThreadName(JNIEnv* env, jobject jthread, jstring name) { enterJVM(); leaveJVM(); NYI(); } /* getStackTrace() and getAllStackTraces() method */ -jobjectArray JNICALL JVM_DumpThreads(JNIEnv* env, jclass threadClass, jobjectArray threads) { enterJVM(); NYI(); leaveJVM(); } +jobjectArray JNICALL JVM_DumpThreads(JNIEnv* env, jclass threadClass, jobjectArray threads) { enterJVM(); leaveJVM(); NYI(); } /* * java.lang.SecurityManager */ -jclass JNICALL JVM_CurrentLoadedClass(JNIEnv* env) { enterJVM(); NYI(); leaveJVM(); } -jobject JNICALL JVM_CurrentClassLoader(JNIEnv* env) { enterJVM(); NYI(); leaveJVM(); } -jobjectArray JNICALL JVM_GetClassContext(JNIEnv* env) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_ClassDepth(JNIEnv* env, jstring name) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_ClassLoaderDepth(JNIEnv* env) { enterJVM(); NYI(); leaveJVM(); } +jclass JNICALL JVM_CurrentLoadedClass(JNIEnv* env) { enterJVM(); leaveJVM(); NYI(); } +jobject JNICALL JVM_CurrentClassLoader(JNIEnv* env) { enterJVM(); leaveJVM(); NYI(); } +jobjectArray JNICALL JVM_GetClassContext(JNIEnv* env) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_ClassDepth(JNIEnv* env, jstring name) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_ClassLoaderDepth(JNIEnv* env) { enterJVM(); leaveJVM(); NYI(); } /* * java.lang.Package */ -jstring JNICALL JVM_GetSystemPackage(JNIEnv* env, jstring name) { enterJVM(); NYI(); leaveJVM(); } -jobjectArray JNICALL JVM_GetSystemPackages(JNIEnv* env) { enterJVM(); NYI(); leaveJVM(); } +jstring JNICALL JVM_GetSystemPackage(JNIEnv* env, jstring name) { enterJVM(); leaveJVM(); NYI(); } +jobjectArray JNICALL JVM_GetSystemPackages(JNIEnv* env) { enterJVM(); leaveJVM(); NYI(); } /* * java.io.ObjectInputStream */ -jobject JNICALL JVM_AllocateNewObject(JNIEnv* env, jobject obj, jclass currClass, jclass initClass) { enterJVM(); NYI(); leaveJVM(); } -jobject JNICALL JVM_AllocateNewArray(JNIEnv* env, jobject obj, jclass currClass, jint length) { enterJVM(); NYI(); leaveJVM(); } -jobject JNICALL JVM_LatestUserDefinedLoader(JNIEnv* env) { enterJVM(); NYI(); leaveJVM(); } +jobject JNICALL JVM_AllocateNewObject(JNIEnv* env, jobject obj, jclass currClass, jclass initClass) { enterJVM(); leaveJVM(); NYI(); } +jobject JNICALL JVM_AllocateNewArray(JNIEnv* env, jobject obj, jclass currClass, jint length) { enterJVM(); leaveJVM(); NYI(); } +jobject JNICALL JVM_LatestUserDefinedLoader(JNIEnv* env) { enterJVM(); leaveJVM(); NYI(); } /* * This function has been deprecated and should not be considered * part of the specified JVM interface. */ jclass JNICALL -JVM_LoadClass0(JNIEnv* env, jobject obj, jclass currClass, jstring currClassName) { enterJVM(); NYI(); leaveJVM(); } +JVM_LoadClass0(JNIEnv* env, jobject obj, jclass currClass, jstring currClassName) { enterJVM(); leaveJVM(); NYI(); } /* * java.lang.reflect.Array */ -jint JNICALL JVM_GetArrayLength(JNIEnv* env, jobject arr) { enterJVM(); NYI(); leaveJVM(); } -jobject JNICALL JVM_GetArrayElement(JNIEnv* env, jobject arr, jint index) { enterJVM(); NYI(); leaveJVM(); } -jvalue JNICALL JVM_GetPrimitiveArrayElement(JNIEnv* env, jobject arr, jint index, jint wCode) { enterJVM(); NYI(); leaveJVM(); } -void JNICALL JVM_SetArrayElement(JNIEnv* env, jobject arr, jint index, jobject val) { enterJVM(); NYI(); leaveJVM(); } -void JNICALL JVM_SetPrimitiveArrayElement(JNIEnv* env, jobject arr, jint index, jvalue v, unsigned char vCode) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_GetArrayLength(JNIEnv* env, jobject arr) { enterJVM(); leaveJVM(); NYI(); } +jobject JNICALL JVM_GetArrayElement(JNIEnv* env, jobject arr, jint index) { enterJVM(); leaveJVM(); NYI(); } +jvalue JNICALL JVM_GetPrimitiveArrayElement(JNIEnv* env, jobject arr, jint index, jint wCode) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL JVM_SetArrayElement(JNIEnv* env, jobject arr, jint index, jobject val) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL JVM_SetPrimitiveArrayElement(JNIEnv* env, jobject arr, jint index, jvalue v, unsigned char vCode) { enterJVM(); leaveJVM(); NYI(); } jobject JNICALL JVM_NewArray(JNIEnv* env, jclass eltClass, jint length) { jobject res; @@ -453,7 +453,7 @@ jobject JNICALL JVM_NewArray(JNIEnv* env return res; } -jobject JNICALL JVM_NewMultiArray(JNIEnv* env, jclass eltClass, jintArray dim) { enterJVM(); NYI(); leaveJVM(); } +jobject JNICALL JVM_NewMultiArray(JNIEnv* env, jclass eltClass, jintArray dim) { enterJVM(); leaveJVM(); NYI(); } /* * java.lang.Class and java.lang.ClassLoader @@ -543,7 +543,7 @@ jclass JNICALL JVM_FindPrimitiveClass(JN /* * Link the class */ -void JNICALL JVM_ResolveClass(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } +void JNICALL JVM_ResolveClass(JNIEnv* env, jclass cls) { enterJVM(); leaveJVM(); NYI(); } /* * Find a class from a boot class loader. Returns NULL if class not found. @@ -593,7 +593,7 @@ jclass JNICALL JVM_FindClassFromClassLoa /* * Find a class from a given class. */ -jclass JNICALL JVM_FindClassFromClass(JNIEnv* env, const char *name, jboolean init, jclass from) { enterJVM(); NYI(); leaveJVM(); } +jclass JNICALL JVM_FindClassFromClass(JNIEnv* env, const char *name, jboolean init, jclass from) { enterJVM(); leaveJVM(); NYI(); } /* Find a loaded class cached by the VM */ jclass JNICALL JVM_FindLoadedClass(JNIEnv* env, jobject jloader, jstring name) { @@ -606,12 +606,12 @@ jclass JNICALL JVM_FindLoadedClass(JNIEn } /* Define a class */ -jclass JNICALL JVM_DefineClass(JNIEnv* env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd) { enterJVM(); NYI(); leaveJVM(); } +jclass JNICALL JVM_DefineClass(JNIEnv* env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd) { enterJVM(); leaveJVM(); NYI(); } /* Define a class with a source (added in JDK1.5) */ jclass JNICALL JVM_DefineClassWithSource(JNIEnv* env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, - const char *source) { enterJVM(); NYI(); leaveJVM(); } + const char *source) { enterJVM(); leaveJVM(); NYI(); } /* * Reflection support functions @@ -625,10 +625,11 @@ jstring JNICALL JVM_GetClassName(JNIEnv* return res; } -jobjectArray JNICALL JVM_GetClassInterfaces(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } +jobjectArray JNICALL JVM_GetClassInterfaces(JNIEnv* env, jclass cls) { enterJVM(); leaveJVM(); NYI(); } jobject JNICALL JVM_GetClassLoader(JNIEnv* env, jclass cls) { + jobject res; enterJVM(); - jobject res = J3Class::nativeClass(cls)->loader()->javaClassLoader(); + res = J3Class::nativeClass(cls)->loader()->javaClassLoader(); leaveJVM(); return res; } @@ -642,9 +643,9 @@ jboolean JNICALL JVM_IsInterface(JNIEnv* return res; } -jobjectArray JNICALL JVM_GetClassSigners(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } -void JNICALL JVM_SetClassSigners(JNIEnv* env, jclass cls, jobjectArray signers) { enterJVM(); NYI(); leaveJVM(); } -jobject JNICALL JVM_GetProtectionDomain(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } +jobjectArray JNICALL JVM_GetClassSigners(JNIEnv* env, jclass cls) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL JVM_SetClassSigners(JNIEnv* env, jclass cls, jobjectArray signers) { enterJVM(); leaveJVM(); NYI(); } +jobject JNICALL JVM_GetProtectionDomain(JNIEnv* env, jclass cls) { enterJVM(); leaveJVM(); NYI(); } jboolean JNICALL JVM_IsArrayClass(JNIEnv* env, jclass cls) { jboolean res; @@ -685,24 +686,24 @@ jint JNICALL JVM_GetClassModifiers(JNIEn return res; } -jobjectArray JNICALL JVM_GetDeclaredClasses(JNIEnv* env, jclass ofClass) { enterJVM(); NYI(); leaveJVM(); } -jclass JNICALL JVM_GetDeclaringClass(JNIEnv* env, jclass ofClass) { enterJVM(); NYI(); leaveJVM(); } +jobjectArray JNICALL JVM_GetDeclaredClasses(JNIEnv* env, jclass ofClass) { enterJVM(); leaveJVM(); NYI(); } +jclass JNICALL JVM_GetDeclaringClass(JNIEnv* env, jclass ofClass) { enterJVM(); leaveJVM(); NYI(); } /* Generics support (JDK 1.5) */ -jstring JNICALL JVM_GetClassSignature(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } +jstring JNICALL JVM_GetClassSignature(JNIEnv* env, jclass cls) { enterJVM(); leaveJVM(); NYI(); } /* Annotations support (JDK 1.5) */ -jbyteArray JNICALL JVM_GetClassAnnotations(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } +jbyteArray JNICALL JVM_GetClassAnnotations(JNIEnv* env, jclass cls) { enterJVM(); leaveJVM(); NYI(); } /* Type use annotations support (JDK 1.8) */ -jbyteArray JNICALL JVM_GetClassTypeAnnotations(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } +jbyteArray JNICALL JVM_GetClassTypeAnnotations(JNIEnv* env, jclass cls) { enterJVM(); leaveJVM(); NYI(); } /* * New (JDK 1.4) reflection implementation */ -jobjectArray JNICALL JVM_GetClassDeclaredMethods(JNIEnv* env, jclass ofClass, jboolean publicOnly) { enterJVM(); NYI(); leaveJVM(); } +jobjectArray JNICALL JVM_GetClassDeclaredMethods(JNIEnv* env, jclass ofClass, jboolean publicOnly) { enterJVM(); leaveJVM(); NYI(); } jobjectArray JNICALL JVM_GetClassDeclaredFields(JNIEnv* env, jclass ofClass, jboolean publicOnly) { jobjectArray res; @@ -774,7 +775,7 @@ jint JNICALL JVM_GetClassAccessFlags(JNI /* * java.lang.reflect.Method */ -jobject JNICALL JVM_InvokeMethod(JNIEnv* env, jobject method, jobject obj, jobjectArray args0) { enterJVM(); NYI(); leaveJVM(); } +jobject JNICALL JVM_InvokeMethod(JNIEnv* env, jobject method, jobject obj, jobjectArray args0) { enterJVM(); leaveJVM(); NYI(); } /* * java.lang.reflect.Constructor @@ -795,44 +796,45 @@ jobject JNICALL JVM_NewInstanceFromConst * Constant pool access; currently used to implement reflective access to annotations (JDK 1.5) */ -jobject JNICALL JVM_GetClassConstantPool(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_ConstantPoolGetSize(JNIEnv* env, jobject unused, jobject jcpool) { enterJVM(); NYI(); leaveJVM(); } -jclass JNICALL JVM_ConstantPoolGetClassAt(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); NYI(); leaveJVM(); } -jclass JNICALL JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); NYI(); leaveJVM(); } -jobject JNICALL JVM_ConstantPoolGetMethodAt(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); NYI(); leaveJVM(); } -jobject JNICALL JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); NYI(); leaveJVM(); } -jobject JNICALL JVM_ConstantPoolGetFieldAt(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); NYI(); leaveJVM(); } -jobject JNICALL JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); NYI(); leaveJVM(); } -jobjectArray JNICALL JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_ConstantPoolGetIntAt(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); NYI(); leaveJVM(); } -jlong JNICALL JVM_ConstantPoolGetLongAt(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); NYI(); leaveJVM(); } -jfloat JNICALL JVM_ConstantPoolGetFloatAt(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); NYI(); leaveJVM(); } -jdouble JNICALL JVM_ConstantPoolGetDoubleAt(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); NYI(); leaveJVM(); } -jstring JNICALL JVM_ConstantPoolGetStringAt(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); NYI(); leaveJVM(); } -jstring JNICALL JVM_ConstantPoolGetUTF8At(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); NYI(); leaveJVM(); } +jobject JNICALL JVM_GetClassConstantPool(JNIEnv* env, jclass cls) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_ConstantPoolGetSize(JNIEnv* env, jobject unused, jobject jcpool) { enterJVM(); leaveJVM(); NYI(); } +jclass JNICALL JVM_ConstantPoolGetClassAt(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); leaveJVM(); NYI(); } +jclass JNICALL JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); leaveJVM(); NYI(); } +jobject JNICALL JVM_ConstantPoolGetMethodAt(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); leaveJVM(); NYI(); } +jobject JNICALL JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); leaveJVM(); NYI(); } +jobject JNICALL JVM_ConstantPoolGetFieldAt(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); leaveJVM(); NYI(); } +jobject JNICALL JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); leaveJVM(); NYI(); } +jobjectArray JNICALL JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_ConstantPoolGetIntAt(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); leaveJVM(); NYI(); } +jlong JNICALL JVM_ConstantPoolGetLongAt(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); leaveJVM(); NYI(); } +jfloat JNICALL JVM_ConstantPoolGetFloatAt(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); leaveJVM(); NYI(); } +jdouble JNICALL JVM_ConstantPoolGetDoubleAt(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); leaveJVM(); NYI(); } +jstring JNICALL JVM_ConstantPoolGetStringAt(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); leaveJVM(); NYI(); } +jstring JNICALL JVM_ConstantPoolGetUTF8At(JNIEnv* env, jobject unused, jobject jcpool, jint index) { enterJVM(); leaveJVM(); NYI(); } /* * Parameter reflection */ -jobjectArray JNICALL JVM_GetMethodParameters(JNIEnv* env, jobject method) { enterJVM(); NYI(); leaveJVM(); } +jobjectArray JNICALL JVM_GetMethodParameters(JNIEnv* env, jobject method) { enterJVM(); leaveJVM(); NYI(); } /* * java.security.* */ jobject JNICALL JVM_DoPrivileged(JNIEnv* env, jclass cls, jobject action, jobject context, jboolean wrapException) { + jobject res; enterJVM(); // For now, we don't do anything special, // just call the requested 'run()' method... jmethodID mid = env->GetMethodID(env->GetObjectClass(action), "run", "()Ljava/lang/Object;"); - jobject res = env->CallObjectMethod(action, mid); + res = env->CallObjectMethod(action, mid); leaveJVM(); return res; } -jobject JNICALL JVM_GetInheritedAccessControlContext(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); } +jobject JNICALL JVM_GetInheritedAccessControlContext(JNIEnv* env, jclass cls) { enterJVM(); leaveJVM(); NYI(); } jobject JNICALL JVM_GetStackAccessControlContext(JNIEnv* env, jclass cls) { enterJVM(); // not yet implemented @@ -859,7 +861,7 @@ void* JNICALL JVM_RegisterSignal(jint si return res; } -jboolean JNICALL JVM_RaiseSignal(jint sig) { enterJVM(); NYI(); leaveJVM(); } +jboolean JNICALL JVM_RaiseSignal(jint sig) { enterJVM(); leaveJVM(); NYI(); } jint JNICALL JVM_FindSignal(const char *name) { jint res = 0; @@ -891,9 +893,10 @@ jint JNICALL JVM_FindSignal(const char * * Retrieve the assertion directives for the specified class. */ jboolean JNICALL JVM_DesiredAssertionStatus(JNIEnv* env, jclass unused, jclass cls) { + jboolean res; enterJVM(); /* TODO: take into account the class name and its package (see j3options) */ - jboolean res = J3Thread::get()->vm()->options()->assertionsEnabled ? JNI_TRUE : JNI_FALSE; + res = J3Thread::get()->vm()->options()->assertionsEnabled ? JNI_TRUE : JNI_FALSE; leaveJVM(); return res; } @@ -901,17 +904,17 @@ jboolean JNICALL JVM_DesiredAssertionSta /* * Retrieve the assertion directives from the VM. */ -jobject JNICALL JVM_AssertionStatusDirectives(JNIEnv* env, jclass unused) { enterJVM(); NYI(); leaveJVM(); } +jobject JNICALL JVM_AssertionStatusDirectives(JNIEnv* env, jclass unused) { enterJVM(); leaveJVM(); NYI(); } /* * java.util.concurrent.atomic.AtomicLong */ -jboolean JNICALL JVM_SupportsCX8(void) { enterJVM(); NYI(); leaveJVM(); } +jboolean JNICALL JVM_SupportsCX8(void) { enterJVM(); leaveJVM(); NYI(); } /* * Get the version number the JVM was built with */ -jint JNICALL JVM_DTraceGetVersion(JNIEnv* env) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_DTraceGetVersion(JNIEnv* env) { enterJVM(); leaveJVM(); NYI(); } /* * Register new probe with given signature, return global handle @@ -920,22 +923,22 @@ jint JNICALL JVM_DTraceGetVersion(JNIEnv * built with. */ jlong JNICALL JVM_DTraceActivate(JNIEnv* env, jint version, jstring module_name, - jint providers_count, JVM_DTraceProvider* providers) { enterJVM(); NYI(); leaveJVM(); } + jint providers_count, JVM_DTraceProvider* providers) { enterJVM(); leaveJVM(); NYI(); } /* * Check JSDT probe */ -jboolean JNICALL JVM_DTraceIsProbeEnabled(JNIEnv* env, jmethodID method) { enterJVM(); NYI(); leaveJVM(); } +jboolean JNICALL JVM_DTraceIsProbeEnabled(JNIEnv* env, jmethodID method) { enterJVM(); leaveJVM(); NYI(); } /* * Destroy custom DOF */ -void JNICALL JVM_DTraceDispose(JNIEnv* env, jlong activation_handle) { enterJVM(); NYI(); leaveJVM(); } +void JNICALL JVM_DTraceDispose(JNIEnv* env, jlong activation_handle) { enterJVM(); leaveJVM(); NYI(); } /* * Check to see if DTrace is supported by OS */ -jboolean JNICALL JVM_DTraceIsSupported(JNIEnv* env) { enterJVM(); NYI(); leaveJVM(); } +jboolean JNICALL JVM_DTraceIsSupported(JNIEnv* env) { enterJVM(); leaveJVM(); NYI(); } /************************************************************************* PART 2: Support for the Verifier and Class File Format Checker @@ -947,23 +950,23 @@ jboolean JNICALL JVM_DTraceIsSupported(J * The caller must treat the string as a constant and not modify it * in any way. */ -const char * JNICALL JVM_GetClassNameUTF(JNIEnv* env, jclass cb) { enterJVM(); NYI(); leaveJVM(); } +const char * JNICALL JVM_GetClassNameUTF(JNIEnv* env, jclass cb) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the constant pool types in the buffer provided by "types." */ -void JNICALL JVM_GetClassCPTypes(JNIEnv* env, jclass cb, unsigned char *types) { enterJVM(); NYI(); leaveJVM(); } +void JNICALL JVM_GetClassCPTypes(JNIEnv* env, jclass cb, unsigned char *types) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the number of Constant Pool entries. */ -jint JNICALL JVM_GetClassCPEntriesCount(JNIEnv* env, jclass cb) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_GetClassCPEntriesCount(JNIEnv* env, jclass cb) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the number of *declared* fields or methods. */ -jint JNICALL JVM_GetClassFieldsCount(JNIEnv* env, jclass cb) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_GetClassMethodsCount(JNIEnv* env, jclass cb) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_GetClassFieldsCount(JNIEnv* env, jclass cb) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_GetClassMethodsCount(JNIEnv* env, jclass cb) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the CP indexes of exceptions raised by a given method. @@ -971,12 +974,12 @@ jint JNICALL JVM_GetClassMethodsCount(JN * * The method is identified by method_index. */ -void JNICALL JVM_GetMethodIxExceptionIndexes(JNIEnv* env, jclass cb, jint method_index, unsigned short *exceptions) { enterJVM(); NYI(); leaveJVM(); } +void JNICALL JVM_GetMethodIxExceptionIndexes(JNIEnv* env, jclass cb, jint method_index, unsigned short *exceptions) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the number of exceptions raised by a given method. * The method is identified by method_index. */ -jint JNICALL JVM_GetMethodIxExceptionsCount(JNIEnv* env, jclass cb, jint method_index) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_GetMethodIxExceptionsCount(JNIEnv* env, jclass cb, jint method_index) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the byte code sequence of a given method. @@ -984,13 +987,13 @@ jint JNICALL JVM_GetMethodIxExceptionsCo * * The method is identified by method_index. */ -void JNICALL JVM_GetMethodIxByteCode(JNIEnv* env, jclass cb, jint method_index, unsigned char *code) { enterJVM(); NYI(); leaveJVM(); } +void JNICALL JVM_GetMethodIxByteCode(JNIEnv* env, jclass cb, jint method_index, unsigned char *code) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the length of the byte code sequence of a given method. * The method is identified by method_index. */ -jint JNICALL JVM_GetMethodIxByteCodeLength(JNIEnv* env, jclass cb, jint method_index) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_GetMethodIxByteCodeLength(JNIEnv* env, jclass cb, jint method_index) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the exception table entry at entry_index of a given method. @@ -999,55 +1002,55 @@ jint JNICALL JVM_GetMethodIxByteCodeLeng * The method is identified by method_index. */ void JNICALL JVM_GetMethodIxExceptionTableEntry(JNIEnv* env, jclass cb, jint method_index, jint entry_index, - JVM_ExceptionTableEntryType *entry) { enterJVM(); NYI(); leaveJVM(); } + JVM_ExceptionTableEntryType *entry) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the length of the exception table of a given method. * The method is identified by method_index. */ -jint JNICALL JVM_GetMethodIxExceptionTableLength(JNIEnv* env, jclass cb, int index) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_GetMethodIxExceptionTableLength(JNIEnv* env, jclass cb, int index) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the modifiers of a given field. * The field is identified by field_index. */ -jint JNICALL JVM_GetFieldIxModifiers(JNIEnv* env, jclass cb, int index) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_GetFieldIxModifiers(JNIEnv* env, jclass cb, int index) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the modifiers of a given method. * The method is identified by method_index. */ -jint JNICALL JVM_GetMethodIxModifiers(JNIEnv* env, jclass cb, int index) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_GetMethodIxModifiers(JNIEnv* env, jclass cb, int index) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the number of local variables of a given method. * The method is identified by method_index. */ -jint JNICALL JVM_GetMethodIxLocalsCount(JNIEnv* env, jclass cb, int index) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_GetMethodIxLocalsCount(JNIEnv* env, jclass cb, int index) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the number of arguments (including this pointer) of a given method. * The method is identified by method_index. */ -jint JNICALL JVM_GetMethodIxArgsSize(JNIEnv* env, jclass cb, int index) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_GetMethodIxArgsSize(JNIEnv* env, jclass cb, int index) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the maximum amount of stack (in words) used by a given method. * The method is identified by method_index. */ -jint JNICALL JVM_GetMethodIxMaxStack(JNIEnv* env, jclass cb, int index) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_GetMethodIxMaxStack(JNIEnv* env, jclass cb, int index) { enterJVM(); leaveJVM(); NYI(); } /* * Is a given method a constructor. * The method is identified by method_index. */ -jboolean JNICALL JVM_IsConstructorIx(JNIEnv* env, jclass cb, int index) { enterJVM(); NYI(); leaveJVM(); } +jboolean JNICALL JVM_IsConstructorIx(JNIEnv* env, jclass cb, int index) { enterJVM(); leaveJVM(); NYI(); } /* * Is the given method generated by the VM. * The method is identified by method_index. */ -jboolean JNICALL JVM_IsVMGeneratedMethodIx(JNIEnv* env, jclass cb, int index) { enterJVM(); NYI(); leaveJVM(); } +jboolean JNICALL JVM_IsVMGeneratedMethodIx(JNIEnv* env, jclass cb, int index) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the name of a given method in UTF format. @@ -1056,7 +1059,7 @@ jboolean JNICALL JVM_IsVMGeneratedMethod * The caller must treat the string as a constant and not modify it * in any way. */ -const char * JNICALL JVM_GetMethodIxNameUTF(JNIEnv* env, jclass cb, jint index) { enterJVM(); NYI(); leaveJVM(); } +const char * JNICALL JVM_GetMethodIxNameUTF(JNIEnv* env, jclass cb, jint index) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the signature of a given method in UTF format. @@ -1065,7 +1068,7 @@ const char * JNICALL JVM_GetMethodIxName * The caller must treat the string as a constant and not modify it * in any way. */ -const char * JNICALL JVM_GetMethodIxSignatureUTF(JNIEnv* env, jclass cb, jint index) { enterJVM(); NYI(); leaveJVM(); } +const char * JNICALL JVM_GetMethodIxSignatureUTF(JNIEnv* env, jclass cb, jint index) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the name of the field refered to at a given constant pool @@ -1077,7 +1080,7 @@ const char * JNICALL JVM_GetMethodIxSign * The caller must treat the string as a constant and not modify it * in any way. */ -const char * JNICALL JVM_GetCPFieldNameUTF(JNIEnv* env, jclass cb, jint index) { enterJVM(); NYI(); leaveJVM(); } +const char * JNICALL JVM_GetCPFieldNameUTF(JNIEnv* env, jclass cb, jint index) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the name of the method refered to at a given constant pool @@ -1089,7 +1092,7 @@ const char * JNICALL JVM_GetCPFieldNameU * The caller must treat the string as a constant and not modify it * in any way. */ -const char * JNICALL JVM_GetCPMethodNameUTF(JNIEnv* env, jclass cb, jint index) { enterJVM(); NYI(); leaveJVM(); } +const char * JNICALL JVM_GetCPMethodNameUTF(JNIEnv* env, jclass cb, jint index) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the signature of the method refered to at a given constant pool @@ -1101,7 +1104,7 @@ const char * JNICALL JVM_GetCPMethodName * The caller must treat the string as a constant and not modify it * in any way. */ -const char * JNICALL JVM_GetCPMethodSignatureUTF(JNIEnv* env, jclass cb, jint index) { enterJVM(); NYI(); leaveJVM(); } +const char * JNICALL JVM_GetCPMethodSignatureUTF(JNIEnv* env, jclass cb, jint index) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the signature of the field refered to at a given constant pool @@ -1113,7 +1116,7 @@ const char * JNICALL JVM_GetCPMethodSign * The caller must treat the string as a constant and not modify it * in any way. */ -const char * JNICALL JVM_GetCPFieldSignatureUTF(JNIEnv* env, jclass cb, jint index) { enterJVM(); NYI(); leaveJVM(); } +const char * JNICALL JVM_GetCPFieldSignatureUTF(JNIEnv* env, jclass cb, jint index) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the class name refered to at a given constant pool index. @@ -1124,7 +1127,7 @@ const char * JNICALL JVM_GetCPFieldSigna * The caller must treat the string as a constant and not modify it * in any way. */ -const char * JNICALL JVM_GetCPClassNameUTF(JNIEnv* env, jclass cb, jint index) { enterJVM(); NYI(); leaveJVM(); } +const char * JNICALL JVM_GetCPClassNameUTF(JNIEnv* env, jclass cb, jint index) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the class name refered to at a given constant pool index. @@ -1137,7 +1140,7 @@ const char * JNICALL JVM_GetCPClassNameU * The caller must treat the string as a constant and not modify it * in any way. */ -const char * JNICALL JVM_GetCPFieldClassNameUTF(JNIEnv* env, jclass cb, jint index) { enterJVM(); NYI(); leaveJVM(); } +const char * JNICALL JVM_GetCPFieldClassNameUTF(JNIEnv* env, jclass cb, jint index) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the class name refered to at a given constant pool index. @@ -1151,7 +1154,7 @@ const char * JNICALL JVM_GetCPFieldClass * The caller must treat the string as a constant and not modify it * in any way. */ -const char * JNICALL JVM_GetCPMethodClassNameUTF(JNIEnv* env, jclass cb, jint index) { enterJVM(); NYI(); leaveJVM(); } +const char * JNICALL JVM_GetCPMethodClassNameUTF(JNIEnv* env, jclass cb, jint index) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the modifiers of a field in calledClass. The field is @@ -1162,7 +1165,7 @@ const char * JNICALL JVM_GetCPMethodClas * * Returns -1 if the field does not exist in calledClass. */ -jint JNICALL JVM_GetCPFieldModifiers(JNIEnv* env, jclass cb, int index, jclass calledClass) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_GetCPFieldModifiers(JNIEnv* env, jclass cb, int index, jclass calledClass) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the modifiers of a method in calledClass. The method is @@ -1170,17 +1173,17 @@ jint JNICALL JVM_GetCPFieldModifiers(JNI * * Returns -1 if the method does not exist in calledClass. */ -jint JNICALL JVM_GetCPMethodModifiers(JNIEnv* env, jclass cb, int index, jclass calledClass) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_GetCPMethodModifiers(JNIEnv* env, jclass cb, int index, jclass calledClass) { enterJVM(); leaveJVM(); NYI(); } /* * Releases the UTF string obtained from the VM. */ -void JNICALL JVM_ReleaseUTF(const char *utf) { enterJVM(); NYI(); leaveJVM(); } +void JNICALL JVM_ReleaseUTF(const char *utf) { enterJVM(); leaveJVM(); NYI(); } /* * Compare if two classes are in the same package. */ -jboolean JNICALL JVM_IsSameClassPackage(JNIEnv* env, jclass class1, jclass class2) { enterJVM(); NYI(); leaveJVM(); } +jboolean JNICALL JVM_IsSameClassPackage(JNIEnv* env, jclass class1, jclass class2) { enterJVM(); leaveJVM(); NYI(); } /************************************************************************* PART 3: I/O and Network Support @@ -1190,21 +1193,21 @@ jboolean JNICALL JVM_IsSameClassPackage( * that describes the most recent system-level error to occur in this thread. * Return the length of the string or zero if no error occurred. */ -jint JNICALL JVM_GetLastErrorString(char *buf, int len) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_GetLastErrorString(char *buf, int len) { enterJVM(); leaveJVM(); NYI(); } /* * Convert a pathname into native format. This function does syntactic * cleanup, such as removing redundant separator characters. It modifies * the given pathname string in place. */ -char * JNICALL JVM_NativePath(char *) { enterJVM(); NYI(); leaveJVM(); } +char * JNICALL JVM_NativePath(char *) { enterJVM(); leaveJVM(); NYI(); } /* * Open a file descriptor. This function returns a negative error code * on error, and a non-negative integer that is the file descriptor on * success. */ -jint JNICALL JVM_Open(const char *fname, jint flags, jint mode) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_Open(const char *fname, jint flags, jint mode) { enterJVM(); leaveJVM(); NYI(); } /* * Close a file descriptor. This function returns -1 on error, and 0 @@ -1212,7 +1215,7 @@ jint JNICALL JVM_Open(const char *fname, * * fd the file descriptor to close. */ -jint JNICALL JVM_Close(jint fd) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_Close(jint fd) { enterJVM(); leaveJVM(); NYI(); } /* * Read data from a file decriptor into a char array. @@ -1223,7 +1226,7 @@ jint JNICALL JVM_Close(jint fd) { enterJ * * This function returns -1 on error, and 0 on success. */ -jint JNICALL JVM_Read(jint fd, char *buf, jint nbytes) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_Read(jint fd, char *buf, jint nbytes) { enterJVM(); leaveJVM(); NYI(); } /* * Write data from a char array to a file decriptor. @@ -1234,13 +1237,13 @@ jint JNICALL JVM_Read(jint fd, char *buf * * This function returns -1 on error, and 0 on success. */ -jint JNICALL JVM_Write(jint fd, char *buf, jint nbytes) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_Write(jint fd, char *buf, jint nbytes) { enterJVM(); leaveJVM(); NYI(); } /* * Returns the number of bytes available for reading from a given file * descriptor */ -jint JNICALL JVM_Available(jint fd, jlong *pbytes) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_Available(jint fd, jlong *pbytes) { enterJVM(); leaveJVM(); NYI(); } /* * Move the file descriptor pointer from whence by offset. @@ -1251,7 +1254,7 @@ jint JNICALL JVM_Available(jint fd, jlon * * This function returns the resulting pointer location. */ -jlong JNICALL JVM_Lseek(jint fd, jlong offset, jint whence) { enterJVM(); NYI(); leaveJVM(); } +jlong JNICALL JVM_Lseek(jint fd, jlong offset, jint whence) { enterJVM(); leaveJVM(); NYI(); } /* * Set the length of the file associated with the given descriptor to the given @@ -1259,36 +1262,36 @@ jlong JNICALL JVM_Lseek(jint fd, jlong o * is extended; the contents of the extended portion are not defined. The * value of the file pointer is undefined after this procedure returns. */ -jint JNICALL JVM_SetLength(jint fd, jlong length) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_SetLength(jint fd, jlong length) { enterJVM(); leaveJVM(); NYI(); } /* * Synchronize the file descriptor's in memory state with that of the * physical device. Return of -1 is an error, 0 is OK. */ -jint JNICALL JVM_Sync(jint fd) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_Sync(jint fd) { enterJVM(); leaveJVM(); NYI(); } /* * Networking library support */ -jint JNICALL JVM_InitializeSocketLibrary(void) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_Socket(jint domain, jint type, jint protocol) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_SocketClose(jint fd) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_SocketShutdown(jint fd, jint howto) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_Recv(jint fd, char *buf, jint nBytes, jint flags) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_Send(jint fd, char *buf, jint nBytes, jint flags) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_Timeout(int fd, long timeout) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_Listen(jint fd, jint count) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_Connect(jint fd, struct sockaddr *him, jint len) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_Bind(jint fd, struct sockaddr *him, jint len) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_Accept(jint fd, struct sockaddr *him, jint *len) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_SocketAvailable(jint fd, jint *result) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_GetSockName(jint fd, struct sockaddr *him, int *len) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen) { enterJVM(); NYI(); leaveJVM(); } -int JNICALL JVM_GetHostName(char* name, int namelen) { enterJVM(); NYI(); leaveJVM(); } +jint JNICALL JVM_InitializeSocketLibrary(void) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_Socket(jint domain, jint type, jint protocol) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_SocketClose(jint fd) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_SocketShutdown(jint fd, jint howto) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_Recv(jint fd, char *buf, jint nBytes, jint flags) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_Send(jint fd, char *buf, jint nBytes, jint flags) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_Timeout(int fd, long timeout) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_Listen(jint fd, jint count) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_Connect(jint fd, struct sockaddr *him, jint len) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_Bind(jint fd, struct sockaddr *him, jint len) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_Accept(jint fd, struct sockaddr *him, jint *len) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_SocketAvailable(jint fd, jint *result) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_GetSockName(jint fd, struct sockaddr *him, int *len) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen) { enterJVM(); leaveJVM(); NYI(); } +int JNICALL JVM_GetHostName(char* name, int namelen) { enterJVM(); leaveJVM(); NYI(); } /* * The standard printing functions supported by the Java VM. (Should they @@ -1324,22 +1327,22 @@ int jio_vfprintf(FILE *f, const char *fm } -void * JNICALL JVM_RawMonitorCreate(void) { enterJVM(); NYI(); leaveJVM(); } -void JNICALL JVM_RawMonitorDestroy(void *mon) { enterJVM(); NYI(); leaveJVM(); } -jint JNICALL JVM_RawMonitorEnter(void *mon) { enterJVM(); NYI(); leaveJVM(); } -void JNICALL JVM_RawMonitorExit(void *mon) { enterJVM(); NYI(); leaveJVM(); } +void * JNICALL JVM_RawMonitorCreate(void) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL JVM_RawMonitorDestroy(void *mon) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_RawMonitorEnter(void *mon) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL JVM_RawMonitorExit(void *mon) { enterJVM(); leaveJVM(); NYI(); } /* * java.lang.management support */ -void* JNICALL JVM_GetManagement(jint version) { enterJVM(); NYI(); leaveJVM(); } +void* JNICALL JVM_GetManagement(jint version) { enterJVM(); leaveJVM(); NYI(); } /* * com.sun.tools.attach.VirtualMachine support * * Initialize the agent properties with the properties maintained in the VM. */ -jobject JNICALL JVM_InitAgentProperties(JNIEnv* env, jobject agent_props) { enterJVM(); NYI(); leaveJVM(); } +jobject JNICALL JVM_InitAgentProperties(JNIEnv* env, jobject agent_props) { enterJVM(); leaveJVM(); NYI(); } /* Generics reflection support. * @@ -1352,7 +1355,7 @@ jobject JNICALL JVM_InitAgentProperties( * and elements 1 and 2 are the java.lang.Strings for the enclosing * method's name and descriptor, respectively. */ -jobjectArray JNICALL JVM_GetEnclosingMethodInfo(JNIEnv* env, jclass ofClass) { enterJVM(); NYI(); leaveJVM(); } +jobjectArray JNICALL JVM_GetEnclosingMethodInfo(JNIEnv* env, jclass ofClass) { enterJVM(); leaveJVM(); NYI(); } /* * Returns an array of the threadStatus values representing the @@ -1360,7 +1363,7 @@ jobjectArray JNICALL JVM_GetEnclosingMet * incompatible with the JDK or doesn't support the given * Java thread state. */ -jintArray JNICALL JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState) { enterJVM(); NYI(); leaveJVM(); } +jintArray JNICALL JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState) { enterJVM(); leaveJVM(); NYI(); } /* * Returns an array of the substate names representing the @@ -1370,7 +1373,7 @@ jintArray JNICALL JVM_GetThreadStateValu * values must be the jintArray returned from JVM_GetThreadStateValues * and javaThreadState. */ -jobjectArray JNICALL JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values) { enterJVM(); NYI(); leaveJVM(); } +jobjectArray JNICALL JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values) { enterJVM(); leaveJVM(); NYI(); } /* ========================================================================= * The following defines a private JVM interface that the JDK can query Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc?rev=199062&r1=199061&r2=199062&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc Sun Jan 12 13:58:14 2014 @@ -11,10 +11,16 @@ using namespace j3; extern "C" { - JNIEXPORT void JNICALL Java_sun_misc_Unsafe_registerNatives(JNIEnv* env, jclass cls) { + JNIEXPORT void JNICALL Java_sun_misc_Unsafe_registerNatives(JNIEnv* env, jobject unsafe) { // Nothing, we define the Unsafe methods with the expected signatures. } + JNIEXPORT void JNICALL Java_sun_misc_Unsafe_ensureClassInitialized(JNIEnv* env, jobject unsafe, jclass clazz) { + enterJVM(); + J3ObjectType::nativeClass(clazz)->initialise(); + leaveJVM(); + } + /// arrayBaseOffset - Offset from the array object where the actual /// element data begins. /// @@ -29,22 +35,34 @@ extern "C" { /// makes this type of access impossible or unsupported. /// JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_arrayIndexScale(JNIEnv* env, jobject unsafe, jclass clazz) { - return 1<asArrayClass()->component()->logSize(); + jlong res; + enterJVM(); + res = 1<asArrayClass()->component()->logSize(); + leaveJVM(); + return res; } JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_addressSize(JNIEnv* env, jobject unsafe) { - return J3Thread::get()->vm()->objectClass->getSizeInBits()>>3; + jint res; + enterJVM(); + res = J3Thread::get()->vm()->objectClass->getSizeInBits()>>3; + leaveJVM(); + return res; } /// objectFieldOffset - Pointer offset of the specified field /// JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_objectFieldOffset(JNIEnv* env, jobject unsafe, jobject field) { + jlong res; + enterJVM(); J3* vm = J3Thread::get()->vm(); J3Class* cl = J3Class::nativeClass(field->getObject(vm->fieldClassClass))->asClass(); uint32_t slot = field->getInteger(vm->fieldClassSlot); uint32_t access = field->getInteger(vm->fieldClassAccess); J3Field* fields = J3Cst::isStatic(access) ? cl->staticLayout()->fields() : cl->fields(); - return fields[slot].offset(); + res = fields[slot].offset(); + leaveJVM(); + return res; } JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_allocateMemory(JNIEnv* env, jobject unsafe, jlong bytes) { @@ -67,12 +85,20 @@ extern "C" { #define unsafeCAS(jtype, id, j3id, sign) \ JNIEXPORT bool JNICALL Java_sun_misc_Unsafe_compareAndSwap##id(JNIEnv* env, jobject unsafe, \ jobject handle, jlong offset, jtype orig, jtype value) { \ - return handle->rawCAS##j3id(offset, orig, value) == orig; \ + bool res; \ + enterJVM(); \ + res = handle->rawCAS##j3id(offset, orig, value) == orig; \ + leaveJVM(); \ + return res; \ } #define unsafeGetVolatile(jtype, id, j3id, sign) \ JNIEXPORT jtype JNICALL Java_sun_misc_Unsafe_get##id##Volatile(JNIEnv* env, jobject unsafe, jobject handle, jlong offset) { \ - return handle->rawGet##j3id(offset); \ + jtype res; \ + enterJVM(); \ + res = handle->rawGet##j3id(offset); \ + leaveJVM(); \ + return res; \ } #define defUnsafe(jtype, id, j3id, sign) \ 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=199062&r1=199061&r2=199062&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sun Jan 12 13:58:14 2014 @@ -33,10 +33,17 @@ J3ClassLoader::J3ClassLoader(J3ObjectHan pthread_mutex_init(&_mutexTypes, 0); pthread_mutex_init(&_mutexInterfaces, 0); pthread_mutex_init(&_mutexMethodTypes, 0); + pthread_mutex_init(&_mutexNativeLibraries, 0); _javaClassLoader = globalReferences()->add(javaClassLoader); } +void J3ClassLoader::addNativeLibrary(void* handle) { + pthread_mutex_lock(&_mutexNativeLibraries); + nativeLibraries.push_back(handle); + pthread_mutex_unlock(&_mutexNativeLibraries); +} + J3ObjectHandle* J3ClassLoader::javaClassLoader(bool doPush) { return (_javaClassLoader && doPush) ? J3Thread::get()->push(_javaClassLoader) : _javaClassLoader; } @@ -72,11 +79,15 @@ uint32_t J3ClassLoader::interfaceIndex(J } void* J3ClassLoader::lookupNativeFunctionPointer(J3Method* method, const char* symbol) { + pthread_mutex_lock(&_mutexNativeLibraries); for(std::vector::size_type i=0; i!=nativeLibraries.size(); i++) { void* fnPtr = dlsym(nativeLibraries[i], symbol); - if(fnPtr) + if(fnPtr) { + pthread_mutex_unlock(&_mutexNativeLibraries); return fnPtr; + } } + pthread_mutex_unlock(&_mutexNativeLibraries); return 0; } @@ -226,8 +237,7 @@ J3InitialClassLoader::J3InitialClassLoad } else J3::internalError("unable to find system archive"); - if(J3Lib::loadSystemLibraries(&nativeLibraries) == -1) - J3::internalError("unable to find java library"); + J3Lib::loadSystemLibraries(this); } J3Class* J3InitialClassLoader::loadClass(const vmkit::Name* name) { 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=199062&r1=199061&r2=199062&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sun Jan 12 13:58:14 2014 @@ -8,9 +8,6 @@ #include "j3/j3utf16.h" #include -#define enterJVM() try { -#define leaveJVM() } catch(void* e) { J3Thread::get()->setPendingException(J3Thread::get()->push((J3Object*)e)); } - #define NYI() { J3Thread::get()->vm()->internalError("not yet implemented: '%s'", __PRETTY_FUNCTION__); } namespace j3 { Modified: vmkit/branches/mcjit/lib/vmkit/allocator.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/allocator.cc?rev=199062&r1=199061&r2=199062&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/allocator.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/allocator.cc Sun Jan 12 13:58:14 2014 @@ -87,11 +87,11 @@ void BumpAllocator::unmap(void* p, size_ } void PermanentObject::operator delete(void* ptr) { - Thread::get()->vm()->internalError("should not happen"); + //Thread::get()->vm()->internalError("should not happen"); } void PermanentObject::operator delete[](void* ptr) { - Thread::get()->vm()->internalError("should not happen"); + //Thread::get()->vm()->internalError("should not happen"); } void ThreadAllocator::initialize(uintptr_t minThreadStruct, uintptr_t minFullSize) { From gael.thomas at lip6.fr Sun Jan 12 13:35:44 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 12 Jan 2014 21:35:44 -0000 Subject: [vmkit-commits] [vmkit] r199063 - add two functions from sun/misc/Perf. Message-ID: <20140112213544.25A3C2A6C032@llvm.org> Author: gthomas Date: Sun Jan 12 15:35:43 2014 New Revision: 199063 URL: http://llvm.org/viewvc/llvm-project?rev=199063&view=rev Log: add two functions from sun/misc/Perf. Added: vmkit/branches/mcjit/lib/j3/openjdk/j3perf.cc Modified: vmkit/branches/mcjit/include/j3/j3.h vmkit/branches/mcjit/include/j3/j3lib.h vmkit/branches/mcjit/include/j3/j3monitor.h vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3jni.cc vmkit/branches/mcjit/lib/j3/vm/j3monitor.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199063&r1=199062&r2=199063&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Sun Jan 12 15:35:43 2014 @@ -148,6 +148,8 @@ namespace j3 { J3ObjectType* clName, const vmkit::Name* name, J3Type* type) __attribute__((noreturn)); static void linkageError(J3Method* method) __attribute__((noreturn)); + static void outOfMemoryError() __attribute__((noreturn)); + static void nullPointerException() __attribute__((noreturn)); static void classCastException() __attribute__((noreturn)); @@ -157,6 +159,8 @@ namespace j3 { static void illegalMonitorStateException() __attribute__((noreturn)); + static void illegalArgumentException(const char* msg) __attribute__((noreturn)); + static void printStackTrace(); void forceSymbolDefinition(); Modified: vmkit/branches/mcjit/include/j3/j3lib.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3lib.h?rev=199063&r1=199062&r2=199063&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3lib.h (original) +++ vmkit/branches/mcjit/include/j3/j3lib.h Sun Jan 12 15:35:43 2014 @@ -7,6 +7,7 @@ namespace j3 { class J3; class J3ClassLoader; + class J3ObjectHandle; class J3Lib { public: @@ -16,6 +17,8 @@ namespace j3 { static void loadSystemLibraries(J3ClassLoader* loader); static void bootstrap(J3* vm); + + static J3ObjectHandle* newDirectByteBuffer(void* address, size_t len); }; } Modified: vmkit/branches/mcjit/include/j3/j3monitor.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3monitor.h?rev=199063&r1=199062&r2=199063&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3monitor.h (original) +++ vmkit/branches/mcjit/include/j3/j3monitor.h Sun Jan 12 15:35:43 2014 @@ -40,7 +40,8 @@ namespace j3 { void init(J3Monitor* next); /* acquire the lock for the next inflate */ public: bool isDeflatable(); /* acquire the lock for the next inflate */ - void prepare(J3Object* _object, uintptr_t header, J3LockRecord* _record); + J3Monitor* prepare(J3Object* _object, uintptr_t header, J3LockRecord* _record); + J3Monitor* prepare(); void lock(); void unlock(); Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=199063&r1=199062&r2=199063&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Sun Jan 12 15:35:43 2014 @@ -74,3 +74,27 @@ void J3Lib::loadSystemLibraries(J3ClassL loader->addNativeLibrary(handle); } +J3ObjectHandle* J3Lib::newDirectByteBuffer(void* address, size_t len) { +#if 0 + JavaObject* res = 0; + llvm_gcroot(res, 0); + + BEGIN_JNI_EXCEPTION + + JavaThread* th = JavaThread::get(); + Jnjvm* myvm = th->getJVM(); + UserClass* BB = myvm->upcalls->newDirectByteBuffer; + + res = BB->doNew(myvm); + + myvm->upcalls->InitDirectByteBuffer->invokeIntSpecial(myvm, BB, res, + (uint64_t)(uintptr_t)address, (int)capacity); + + jobject ret = (jobject)th->pushJNIRef(res); + RETURN_FROM_JNI(ret); + END_JNI_EXCEPTION + + RETURN_FROM_JNI(0); +#endif + J3::internalError("not yet implemented"); +} 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=199063&r1=199062&r2=199063&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Jan 12 15:35:43 2014 @@ -12,6 +12,8 @@ #include #include #include +#include +#include using namespace j3; @@ -1200,14 +1202,43 @@ jint JNICALL JVM_GetLastErrorString(char * cleanup, such as removing redundant separator characters. It modifies * the given pathname string in place. */ -char * JNICALL JVM_NativePath(char *) { enterJVM(); leaveJVM(); NYI(); } +char* JNICALL JVM_NativePath(char* path) { + char buf[PATH_MAX]; + enterJVM(); + realpath(path, buf); + strcpy(path, buf); + leaveJVM(); + return path; +} /* * Open a file descriptor. This function returns a negative error code * on error, and a non-negative integer that is the file descriptor on * success. */ -jint JNICALL JVM_Open(const char *fname, jint flags, jint mode) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_Open(const char *fname, jint flags, jint mode) { + jint res; + enterJVM(); + // Special flag the JVM uses + // means to delete the file after opening. + static const int O_DELETE = 0x10000; + res = open(fname, flags & ~O_DELETE, mode); + + // Map EEXIST to special JVM_EEXIST, otherwise all errors are -1 + if (res < 0) { + if (errno == EEXIST) + res = JVM_EEXIST; + else + res = -1; + } + + // Handle O_DELETE flag, if specified + if (flags & O_DELETE) + unlink(fname); + leaveJVM(); + + return res; +} /* * Close a file descriptor. This function returns -1 on error, and 0 @@ -1327,10 +1358,35 @@ int jio_vfprintf(FILE *f, const char *fm } -void * JNICALL JVM_RawMonitorCreate(void) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL JVM_RawMonitorDestroy(void *mon) { enterJVM(); leaveJVM(); NYI(); } -jint JNICALL JVM_RawMonitorEnter(void *mon) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL JVM_RawMonitorExit(void *mon) { enterJVM(); leaveJVM(); NYI(); } +void* JNICALL JVM_RawMonitorCreate(void) { + void* res; + enterJVM(); + res = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t)); + if(!res) + J3::outOfMemoryError(); + leaveJVM(); + return res; +} + +void JNICALL JVM_RawMonitorDestroy(void *mon) { + enterJVM(); + free(mon); + leaveJVM(); +} + +jint JNICALL JVM_RawMonitorEnter(void *mon) { + jint res; + enterJVM(); + res = pthread_mutex_lock((pthread_mutex_t*)mon); + leaveJVM(); + return res; +} + +void JNICALL JVM_RawMonitorExit(void *mon) { + enterJVM(); + pthread_mutex_unlock((pthread_mutex_t*)mon); + leaveJVM(); +} /* * java.lang.management support Added: vmkit/branches/mcjit/lib/j3/openjdk/j3perf.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3perf.cc?rev=199063&view=auto ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3perf.cc (added) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3perf.cc Sun Jan 12 15:35:43 2014 @@ -0,0 +1,87 @@ +#include "j3/j3jni.h" +#include "j3/j3.h" +#include "j3/j3thread.h" + +namespace j3 { + class PerfData { + public: + // the Variability enum must be kept in synchronization with the + // the com.sun.hotspot.perfdata.Variability class + enum Variability { + V_Constant = 1, + V_Monotonic = 2, + V_Variable = 3, + V_last = V_Variable + }; + + // the Units enum must be kept in synchronization with the + // the com.sun.hotspot.perfdata.Units class + enum Units { + U_None = 1, + U_Bytes = 2, + U_Ticks = 3, + U_Events = 4, + U_String = 5, + U_Hertz = 6, + U_Last = U_Hertz + }; + + private: + const vmkit::Name* name; + Variability variability; + Units units; + uint64_t value; + + public: + PerfData(const vmkit::Name* _name, Variability _variability, Units _units, uint64_t _value) { + name = _name; + variability = _variability; + units = _units; + value = _value; + } + + uint64_t* address() { return &value; } + }; + + class PerfDataManager { + pthread_mutex_t mutex; + std::map perfDatas; + public: + static PerfDataManager manager; + + PerfDataManager() { + pthread_mutex_init(&mutex, 0); + } + + PerfData* define(const vmkit::Name* name, PerfData::Variability variability, PerfData::Units units, uint64_t value) { + pthread_mutex_lock(&mutex); + PerfData* res = perfDatas[name]; + if(res) + J3::illegalArgumentException("trying to redefine a perf counter"); + perfDatas[name] = res = new PerfData(name, variability, units, value); + pthread_mutex_unlock(&mutex); + return res; + } + }; + + PerfDataManager PerfDataManager::manager; +} + +using namespace j3; + +extern "C" { + JNIEXPORT void JNICALL Java_sun_misc_Perf_registerNatives(JNIEnv* env, jclass clazz) { + // Nothing, we define the Perf methods with the expected signatures. + } + + JNIEXPORT jobject JNICALL Java_sun_misc_Perf_createLong(JNIEnv* env, jobject perf, jstring name, + jint variability, jint units, jlong value) { + PerfData* pd; + enterJVM(); + J3* vm = J3Thread::get()->vm(); + pd = PerfDataManager::manager.define(vm->stringToName(name), + (PerfData::Variability)variability, (PerfData::Units)units, value); + leaveJVM(); + return env->NewDirectByteBuffer(pd->address(), sizeof(uint64_t)); + } +} Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc?rev=199063&r1=199062&r2=199063&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3unsafe.cc Sun Jan 12 15:35:43 2014 @@ -11,7 +11,7 @@ using namespace j3; extern "C" { - JNIEXPORT void JNICALL Java_sun_misc_Unsafe_registerNatives(JNIEnv* env, jobject unsafe) { + JNIEXPORT void JNICALL Java_sun_misc_Unsafe_registerNatives(JNIEnv* env, jclass clazz) { // Nothing, we define the Unsafe methods with the expected signatures. } @@ -66,11 +66,19 @@ extern "C" { } JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_allocateMemory(JNIEnv* env, jobject unsafe, jlong bytes) { - return (jlong)(uintptr_t)malloc(bytes); + jlong res; + enterJVM(); + res = (jlong)(uintptr_t)malloc(bytes); + if(!res) + J3::outOfMemoryError(); + leaveJVM(); + return res; } JNIEXPORT void JNICALL Java_sun_misc_Unsafe_freeMemory(JNIEnv* env, jobject unsafe, jlong addr) { + enterJVM(); free((void*)(uintptr_t)addr); + leaveJVM(); } #define unsafeGetPut(jtype, id, j3id, sign) \ 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=199063&r1=199062&r2=199063&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 12 15:35:43 2014 @@ -273,6 +273,10 @@ void J3::linkageError(J3Method* method) method->signature()->name()->cStr()); } +void J3::outOfMemoryError() { + internalError("out of memory error"); +} + void J3::negativeArraySizeException(int32_t length) { internalError("negative array size exception: %ld", length); } @@ -289,6 +293,10 @@ void J3::illegalMonitorStateException() internalError("illegal monitor state exception"); } +void J3::illegalArgumentException(const char* msg) { + internalError("illegal argument exception: %s", msg); +} + void J3::vinternalError(const char* msg, va_list va) { char buf[65536]; vsnprintf(buf, 65536, msg, va); 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=199063&r1=199062&r2=199063&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sun Jan 12 15:35:43 2014 @@ -6,6 +6,7 @@ #include "j3/j3method.h" #include "j3/j3thread.h" #include "j3/j3utf16.h" +#include "j3/j3lib.h" #include #define NYI() { J3Thread::get()->vm()->internalError("not yet implemented: '%s'", __PRETTY_FUNCTION__); } @@ -582,7 +583,14 @@ jboolean JNICALL ExceptionCheck(JNIEnv* return J3Thread::get()->hasPendingException(); } -jobject JNICALL NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity) { enterJVM(); leaveJVM(); NYI(); } +jobject JNICALL NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity) { + jobject res; + enterJVM(); + res = J3Lib::newDirectByteBuffer(address, capacity); + leaveJVM(); + return res; +} + void* JNICALL GetDirectBufferAddress(JNIEnv* env, jobject buf) { enterJVM(); leaveJVM(); NYI(); } jlong JNICALL GetDirectBufferCapacity(JNIEnv* env, jobject buf) { enterJVM(); leaveJVM(); NYI(); } Modified: vmkit/branches/mcjit/lib/j3/vm/j3monitor.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3monitor.cc?rev=199063&r1=199062&r2=199063&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3monitor.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3monitor.cc Sun Jan 12 15:35:43 2014 @@ -16,11 +16,16 @@ bool J3Monitor::isDeflatable() { return pthread_mutex_trylock(&mutex) == 0; } -void J3Monitor::prepare(J3Object* _object, uintptr_t _header, J3LockRecord* _record) { +J3Monitor* J3Monitor::prepare(J3Object* _object, uintptr_t _header, J3LockRecord* _record) { object = _object; record = _record; header = _header; owner = _record ? J3Thread::get(_record) : 0; + return this; +} + +J3Monitor* J3Monitor::prepare() { + return prepare(0, 0, 0); } void J3Monitor::checkRecord() { From gael.thomas at lip6.fr Sun Jan 12 14:01:54 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 12 Jan 2014 22:01:54 -0000 Subject: [vmkit-commits] [vmkit] r199064 - implement NewDirectByteBuffer Message-ID: <20140112220154.CF5712A6C032@llvm.org> Author: gthomas Date: Sun Jan 12 16:01:54 2014 New Revision: 199064 URL: http://llvm.org/viewvc/llvm-project?rev=199064&view=rev Log: implement NewDirectByteBuffer Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc vmkit/branches/mcjit/lib/j3/vm/j3class.cc Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=199064&r1=199063&r2=199064&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Sun Jan 12 16:01:54 2014 @@ -75,26 +75,9 @@ void J3Lib::loadSystemLibraries(J3ClassL } J3ObjectHandle* J3Lib::newDirectByteBuffer(void* address, size_t len) { -#if 0 - JavaObject* res = 0; - llvm_gcroot(res, 0); - - BEGIN_JNI_EXCEPTION - - JavaThread* th = JavaThread::get(); - Jnjvm* myvm = th->getJVM(); - UserClass* BB = myvm->upcalls->newDirectByteBuffer; - - res = BB->doNew(myvm); - - myvm->upcalls->InitDirectByteBuffer->invokeIntSpecial(myvm, BB, res, - (uint64_t)(uintptr_t)address, (int)capacity); - - jobject ret = (jobject)th->pushJNIRef(res); - RETURN_FROM_JNI(ret); - END_JNI_EXCEPTION - - RETURN_FROM_JNI(0); -#endif - J3::internalError("not yet implemented"); + J3* vm = J3Thread::get()->vm(); + J3Class* cl = vm->initialClassLoader->loadClass(vm->names()->get("java/nio/DirectByteBuffer")); + J3ObjectHandle* res = J3ObjectHandle::doNewObject(cl); + cl->findMethod(0, vm->initName, vm->initialClassLoader->getSignature(0, vm->names()->get("(JI)V")))->invokeSpecial(res, address, len); + return res; } 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=199064&r1=199063&r2=199064&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Jan 12 16:01:54 2014 @@ -282,11 +282,13 @@ uintptr_t J3Layout::structSize() { } J3Method* J3Layout::localFindMethod(const vmkit::Name* name, J3Signature* signature) { + //fprintf(stderr, " --- lookup %s::%s in %s\n", name->cStr(), signature->name()->cStr(), J3Layout::name()->cStr()); + for(size_t i=0; iname()->cStr(), cur->signature()->cStr()); - //printf("%s - %s\n", name->cStr(), signature->cStr()); + //fprintf(stderr, "%s::%s%s\n", cur->cl()->name()->cStr(), cur->name()->cStr(), cur->signature()->name()->cStr()); + if(cur->name() == name && cur->signature() == signature) { return cur; } From gael.thomas at lip6.fr Sun Jan 12 14:07:35 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 12 Jan 2014 22:07:35 -0000 Subject: [vmkit-commits] [vmkit] r199065 - Implements pop2 and wide, I have still 9 opcode to implements. Message-ID: <20140112220735.6AB702A6C032@llvm.org> Author: gthomas Date: Sun Jan 12 16:07:35 2014 New Revision: 199065 URL: http://llvm.org/viewvc/llvm-project?rev=199065&view=rev Log: Implements pop2 and wide, I have still 9 opcode to implements. Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc 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=199065&r1=199064&r2=199065&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 12 16:07:35 2014 @@ -314,8 +314,8 @@ void J3::printStackTrace() { if(sf) { J3Method* m = ((J3MethodCode*)sf->unit()->getSymbol(sf->functionName()))->self; - fprintf(stderr, " in %s %s::%s index %d\n", m->signature()->name()->cStr(), m->cl()->name()->cStr(), m->name()->cStr(), - sf->sourceIndex()); + fprintf(stderr, " in %s::%s%s index %d\n", m->cl()->name()->cStr(), m->name()->cStr(), + m->signature()->name()->cStr(), sf->sourceIndex()); } else { Dl_info info; 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=199065&r1=199064&r2=199065&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sun Jan 12 16:07:35 2014 @@ -1144,7 +1144,11 @@ void J3CodeGen::translate() { stack.pop(); break; - case J3Cst::BC_pop2: nyi(); /* 0x58 */ + case J3Cst::BC_pop2: /* 0x58 */ + val1 = stack.pop(); + if(!val1->getType()->isDoubleTy() && !val1->getType()->isIntegerTy(64)) + stack.pop(); + break; case J3Cst::BC_dup: /* 0x59 */ stack.push(stack.top()); @@ -1520,7 +1524,10 @@ void J3CodeGen::translate() { monitorExit(stack.pop()); break; - case J3Cst::BC_wide: nyi(); /* 0xc4 */ + case J3Cst::BC_wide: /* 0xc4 */ + isWide = 1; + break; + case J3Cst::BC_multianewarray: nyi(); /* 0xc5 */ case J3Cst::BC_ifnull: /* 0xc6 */ condBr(builder->CreateIsNull(stack.pop())); From gael.thomas at lip6.fr Mon Jan 13 01:41:27 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 13 Jan 2014 09:41:27 -0000 Subject: [vmkit-commits] [vmkit] r199085 - Better management of bootstrap paths Message-ID: <20140113094127.1BFF52A6C032@llvm.org> Author: gthomas Date: Mon Jan 13 03:41:26 2014 New Revision: 199085 URL: http://llvm.org/viewvc/llvm-project?rev=199085&view=rev Log: Better management of bootstrap paths Modified: vmkit/branches/mcjit/include/j3/j3lib.h vmkit/branches/mcjit/include/j3/j3options.h vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc Modified: vmkit/branches/mcjit/include/j3/j3lib.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3lib.h?rev=199085&r1=199084&r2=199085&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3lib.h (original) +++ vmkit/branches/mcjit/include/j3/j3lib.h Mon Jan 13 03:41:26 2014 @@ -8,15 +8,13 @@ namespace j3 { class J3; class J3ClassLoader; class J3ObjectHandle; + class J3Options; class J3Lib { public: - static const char* systemClassesArchives(); - static const char* systemLibraryPath(); - static const char* extDirs(); - static void loadSystemLibraries(J3ClassLoader* loader); - - static void bootstrap(J3* vm); + static void processOptions(J3* vm); + static void loadSystemLibraries(J3ClassLoader* loader); + static void bootstrap(J3* vm); static J3ObjectHandle* newDirectByteBuffer(void* address, size_t len); }; Modified: vmkit/branches/mcjit/include/j3/j3options.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3options.h?rev=199085&r1=199084&r2=199085&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3options.h (original) +++ vmkit/branches/mcjit/include/j3/j3options.h Mon Jan 13 03:41:26 2014 @@ -25,10 +25,14 @@ namespace j3 { public: bool assertionsEnabled; const char* selfBitCodePath; + + const char* javaHome; const char* bootClasspath; const char* systemLibraryPath; - const char* classpath; const char* extDirs; + + const char* classpath; + bool debugEnterIndent; uint32_t genDebugExecute; uint32_t debugExecute; Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=199085&r1=199084&r2=199085&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Mon Jan 13 03:41:26 2014 @@ -14,12 +14,48 @@ using namespace j3; #ifdef LINUX_OS -#define OPENJDK_LIBPATH OPENJDK_HOME"jre/lib/amd64" +#define OPENJDK_LIBPATH_SUFFIX "jre/lib/amd64" #else -#define OPENJDK_LIBPATH OPENJDK_HOME"jre/lib" +#define OPENJDK_LIBPATH_SUFFIX "jre/lib" #endif -static const char* rtjar = OPENJDK_HOME"jre/lib/rt.jar"; +static char* buildPath(const char* base, const char* suffix) { + size_t baseLen = strlen(base); + size_t suffixLen = strlen(suffix); + + char* res = (char*)malloc(baseLen + suffixLen + 1); + memcpy(res, base, baseLen); + memcpy(res + baseLen, suffix, suffixLen + 1); + + return res; +} + +void J3Lib::processOptions(J3* vm) { + const char* jh = getenv("JAVA_HOME"); + jh = jh ? jh : OPENJDK_HOME; + + vm->options()->javaHome = jh ? jh : OPENJDK_HOME; + vm->options()->bootClasspath = buildPath(jh, "jre/lib/rt.jar"); + vm->options()->systemLibraryPath = buildPath(jh, OPENJDK_LIBPATH_SUFFIX); + vm->options()->extDirs = buildPath(jh, "jre/lib/ext"); +} + +void J3Lib::loadSystemLibraries(J3ClassLoader* loader) { + const char* spath = J3Thread::get()->vm()->options()->systemLibraryPath; + char* libinstrument = buildPath(spath, "/libinstrument"SHLIBEXT); + char* libjava = buildPath(spath, "/libjava"SHLIBEXT); + /* JavaRuntimeSupport checks for a symbol defined in this library */ + void* h0 = dlopen(libinstrument, RTLD_LAZY | RTLD_GLOBAL); + void* handle = dlopen(libjava, RTLD_LAZY | RTLD_LOCAL); + + free(libinstrument); + free(libjava); + + if(!handle || !h0) + J3::internalError("Unable to find java system library: %s\n", dlerror()); + + loader->addNativeLibrary(handle); +} void J3Lib::bootstrap(J3* vm) { J3ObjectHandle* prev = J3Thread::get()->tell(); @@ -51,29 +87,6 @@ void J3Lib::bootstrap(J3* vm) { J3Thread::get()->restore(prev); } -const char* J3Lib::systemClassesArchives() { - return rtjar; -} - -const char* J3Lib::systemLibraryPath() { - return OPENJDK_LIBPATH; -} - -const char* J3Lib::extDirs() { - return OPENJDK_HOME"jre/lib/ext"; -} - -void J3Lib::loadSystemLibraries(J3ClassLoader* loader) { - /* JavaRuntimeSupport checks for a symbol defined in this library */ - void* h0 = dlopen(OPENJDK_LIBPATH"/libinstrument"SHLIBEXT, RTLD_LAZY | RTLD_GLOBAL); - void* handle = dlopen(OPENJDK_LIBPATH"/libjava"SHLIBEXT, RTLD_LAZY | RTLD_LOCAL); - - if(!handle || !h0) - J3::internalError("Unable to find java system library: %s\n", dlerror()); - - loader->addNativeLibrary(handle); -} - J3ObjectHandle* J3Lib::newDirectByteBuffer(void* address, size_t len) { J3* vm = J3Thread::get()->vm(); J3Class* cl = vm->initialClassLoader->loadClass(vm->names()->get("java/nio/DirectByteBuffer")); 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=199085&r1=199084&r2=199085&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Mon Jan 13 03:41:26 2014 @@ -146,7 +146,7 @@ jobject JNICALL JVM_InitProperties(JNIEn vm->names()->get("(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;"))); #define setProp(key, val) _setProp->invokeVirtual(p, vm->utfToString(key), vm->utfToString(val)); -#define setPropEnv(key, val) ({ const char* tmp = getenv(val); if(!tmp) tmp = ""; setProp(key, val); }) +#define setPropEnv(key, val, def) ({ const char* tmp = getenv(val); if(!tmp) tmp = def; setProp(key, val); }) /* **
java.version
Java version number @@ -172,7 +172,7 @@ jobject JNICALL JVM_InitProperties(JNIEn setProp("java.version", "1.8"); setProp("java.vendor", "The VMKit Project"); setProp("java.vendor.url", "http://vmkit.llvm.org"); - setPropEnv("java.home", "JAVA_HOME"); + setProp("java.home", vm->options()->javaHome); setProp("java.class.version", "52.0"); setProp("java.class.path", vm->options()->classpath); //"file:///Users/gthomas/research/vmkit4/vmkit");//vm->options()->classpath); @@ -182,9 +182,9 @@ jobject JNICALL JVM_InitProperties(JNIEn setProp("file.separator", "/"); setProp("path.separator", ":"); setProp("line.separator", "\n"); - setPropEnv("user.name", "USERNAME"); - setPropEnv("user.home", "HOME"); - setPropEnv("user.dir", "PWD"); + setPropEnv("user.name", "USERNAME", ""); + setPropEnv("user.home", "HOME", ""); + setPropEnv("user.dir", "PWD", ""); setProp("java.boot.class.path", vm->options()->bootClasspath); setProp("sun.boot.library.path", vm->options()->systemLibraryPath); @@ -204,7 +204,7 @@ jobject JNICALL JVM_InitProperties(JNIEn setProp("java.vm.vendor", "The VMKit Project"); setProp("java.vm.name", "J3"); setProp("java.specification.version", "1.8"); - setPropEnv("java.library.path", "LD_LIBRARY_PATH"); + setPropEnv("java.library.path", "LD_LIBRARY_PATH", ""); setProp("java.io.tmpdir", "/tmp"); 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=199085&r1=199084&r2=199085&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Mon Jan 13 03:41:26 2014 @@ -68,6 +68,7 @@ void J3::introspect() { void J3::start(int argc, char** argv) { _options.process(argc, argv); + J3Lib::processOptions(this); vmkit::ThreadAllocator::initialize(sizeof(J3Thread), options()->stackSize); 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=199085&r1=199084&r2=199085&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Mon Jan 13 03:41:26 2014 @@ -1425,7 +1425,7 @@ void J3CodeGen::translate() { break; case J3Cst::BC_jsr: nyi(); /* 0xa8 */ - case J3Cst::BC_ret: nyi(); /* 0xa9 wide */ + case J3Cst::BC_ret: /* wide */ nyi(); /* 0xa9 */ case J3Cst::BC_tableswitch: /* 0xaa */ tableSwitch(); _onEndPoint(); 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=199085&r1=199084&r2=199085&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Mon Jan 13 03:41:26 2014 @@ -11,10 +11,7 @@ using namespace j3; J3Options::J3Options() { assertionsEnabled = 1; selfBitCodePath = SELF_BITCODE; - bootClasspath = J3Lib::systemClassesArchives(); - systemLibraryPath = J3Lib::systemLibraryPath(); classpath = "."; - extDirs = J3Lib::extDirs(); debugEnterIndent = 1; From gael.thomas at lip6.fr Mon Jan 13 01:47:56 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 13 Jan 2014 09:47:56 -0000 Subject: [vmkit-commits] [vmkit] r199086 - JAVA_HOME is ...../jre Message-ID: <20140113094756.DD31F2A6C032@llvm.org> Author: gthomas Date: Mon Jan 13 03:47:56 2014 New Revision: 199086 URL: http://llvm.org/viewvc/llvm-project?rev=199086&view=rev Log: JAVA_HOME is ...../jre Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=199086&r1=199085&r2=199086&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Mon Jan 13 03:47:56 2014 @@ -14,9 +14,9 @@ using namespace j3; #ifdef LINUX_OS -#define OPENJDK_LIBPATH_SUFFIX "jre/lib/amd64" +#define OPENJDK_LIBPATH_SUFFIX "/lib/amd64" #else -#define OPENJDK_LIBPATH_SUFFIX "jre/lib" +#define OPENJDK_LIBPATH_SUFFIX "/lib" #endif static char* buildPath(const char* base, const char* suffix) { @@ -32,12 +32,12 @@ static char* buildPath(const char* base, void J3Lib::processOptions(J3* vm) { const char* jh = getenv("JAVA_HOME"); - jh = jh ? jh : OPENJDK_HOME; + jh = jh ? jh : OPENJDK_HOME"/jre"; vm->options()->javaHome = jh ? jh : OPENJDK_HOME; - vm->options()->bootClasspath = buildPath(jh, "jre/lib/rt.jar"); + vm->options()->bootClasspath = buildPath(jh, "/lib/rt.jar"); vm->options()->systemLibraryPath = buildPath(jh, OPENJDK_LIBPATH_SUFFIX); - vm->options()->extDirs = buildPath(jh, "jre/lib/ext"); + vm->options()->extDirs = buildPath(jh, "/lib/ext"); } void J3Lib::loadSystemLibraries(J3ClassLoader* loader) { 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=199086&r1=199085&r2=199086&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Mon Jan 13 03:47:56 2014 @@ -227,8 +227,6 @@ J3InitialClassLoader::J3InitialClassLoad const char* archives = J3Thread::get()->vm()->options()->bootClasspath; J3ClassBytes* bytes = J3Reader::openFile(allocator(), archives); - //makeLLVMFunctions_j3(); - if (bytes) { archive = new(allocator()) J3ZipArchive(bytes, allocator()); if(!archive) { From gael.thomas at lip6.fr Mon Jan 13 03:26:16 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 13 Jan 2014 11:26:16 -0000 Subject: [vmkit-commits] [vmkit] r199098 - Implements GetPrimitiveArrayCritical ReleasePrimitiveArrayCritical. Message-ID: <20140113112617.179D32A6C032@llvm.org> Author: gthomas Date: Mon Jan 13 05:26:16 2014 New Revision: 199098 URL: http://llvm.org/viewvc/llvm-project?rev=199098&view=rev Log: Implements GetPrimitiveArrayCritical ReleasePrimitiveArrayCritical. Implements dup* bytecodes. Simplify allocation of stacks/locals. Fix a memory bug in meta stack management for the control flow. Fix a memory bug in J3Class::clone. Modified: vmkit/branches/mcjit/include/j3/j3codegenvar.h vmkit/branches/mcjit/lib/j3/openjdk/j3lib.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 vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Modified: vmkit/branches/mcjit/include/j3/j3codegenvar.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegenvar.h?rev=199098&r1=199097&r2=199098&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegenvar.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegenvar.h Mon Jan 13 05:26:16 2014 @@ -27,8 +27,7 @@ namespace j3 { uint32_t topStack; uint32_t maxStack; - static uint32_t reservedSize(uint32_t max); - void init(J3CodeGen* _codeGen, uint32_t max, void* space); + void init(J3CodeGen* _codeGen, uint32_t max); void killUnused(); Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=199098&r1=199097&r2=199098&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Mon Jan 13 05:26:16 2014 @@ -33,8 +33,9 @@ static char* buildPath(const char* base, void J3Lib::processOptions(J3* vm) { const char* jh = getenv("JAVA_HOME"); jh = jh ? jh : OPENJDK_HOME"/jre"; + jh = strdup(jh); - vm->options()->javaHome = jh ? jh : OPENJDK_HOME; + vm->options()->javaHome = jh; vm->options()->bootClasspath = buildPath(jh, "/lib/rt.jar"); vm->options()->systemLibraryPath = buildPath(jh, OPENJDK_LIBPATH_SUFFIX); vm->options()->extDirs = buildPath(jh, "/lib/ext"); 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=199098&r1=199097&r2=199098&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Mon Jan 13 05:26:16 2014 @@ -158,7 +158,7 @@ void J3::run() { if(options()->debugLifeCycle) fprintf(stderr, " Launching the application\n"); - options()->debugExecute = 0; + //options()->debugExecute = 0; #if 0 J3Class* loaderClass = z_class("java/lang/ClassLoader"); @@ -340,5 +340,3 @@ void J3::forceSymbolDefinition() { } catch(void* e) { } } - - 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=199098&r1=199097&r2=199098&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Mon Jan 13 05:26:16 2014 @@ -331,7 +331,7 @@ uint16_t J3Class::modifiers() { J3ObjectHandle* J3Class::clone(J3ObjectHandle* obj) { J3ObjectHandle* res = J3ObjectHandle::doNewObject(this); - obj->rawObjectCopyTo(0, res, 0, structSize()); + obj->rawObjectCopyTo(0, res, 0, structSize() - sizeof(J3Object)); return res; } 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=199098&r1=199097&r2=199098&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Mon Jan 13 05:26:16 2014 @@ -41,9 +41,10 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato #if 0 /* usefull to debug a single function */ - if( cl->name() == vm->names()->get("java/lang/CharacterData") && - method->name() == vm->names()->get("of") && - method->signature()->name() == vm->names()->get("(I)Ljava/lang/CharacterData;") ) { + if( cl->name() == vm->names()->get("sun/util/calendar/BaseCalendar") && + method->name() == vm->names()->get("getFixedDate") && + method->signature()->name() == vm->names()->get("(IIILsun/util/calendar/BaseCalendar$Date;)J") ) { + vm->options()->debugTranslate = 3; } #endif @@ -107,7 +108,7 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato else generateJava(); - if(vm->options()->debugTranslate > 3) + if(vm->options()->debugTranslate > 4) llvmFunction->dump(); } @@ -399,8 +400,9 @@ void J3CodeGen::invoke(uint32_t access, res = builder->CreateInvoke(func, after, exceptions.nodes[curExceptionNode]->landingPad, args); bb = after; builder->SetInsertPoint(bb); - } else + } else { res = builder->CreateCall(func, args); + } if(!res->getType()->isVoidTy()) stack.push(flatten(res)); @@ -784,7 +786,7 @@ llvm::BasicBlock* J3CodeGen::forwardBran llvm::BasicBlock* res = newBB(id); if(doAlloc) { - opInfos[pc].metaStack = (llvm::Type**)allocator->allocate(sizeof(llvm::Type*)*stack.topStack); + opInfos[pc].metaStack = (llvm::Type**)allocator->allocate(sizeof(llvm::Type*)*stack.maxStack); memcpy(opInfos[pc].metaStack, stack.metaStack, sizeof(llvm::Type*)*stack.topStack); } @@ -858,6 +860,7 @@ void J3CodeGen::translate() { while(codeReader->remaining()) { llvm::Value* val1; llvm::Value* val2; + llvm::Value* val3; javaPC = codeReader->tell(); @@ -1159,7 +1162,16 @@ void J3CodeGen::translate() { stack.push(val1); stack.push(val2); stack.push(val1); break; - case J3Cst::BC_dup_x2: nyi(); /* 0x5b */ + case J3Cst::BC_dup_x2: /* 0x5b */ + val1 = stack.pop(); + val2 = stack.pop(); + if(val2->getType()->isDoubleTy() || val2->getType()->isIntegerTy(64)) { + stack.push(val1); stack.push(val2); stack.push(val1); + } else { + val3 = stack.pop(); + stack.push(val1); stack.push(val3); stack.push(val2); stack.push(val1); + } + break; case J3Cst::BC_dup2: /* 0x5c */ val1 = stack.top(); @@ -1171,9 +1183,32 @@ void J3CodeGen::translate() { } break; - case J3Cst::BC_dup2_x1: nyi(); /* 0x5d */ - case J3Cst::BC_dup2_x2: nyi(); /* 0x5e */ - case J3Cst::BC_swap: nyi(); /* 0x5f */ + case J3Cst::BC_dup2_x1: /* 0x5d */ + val1 = stack.pop(); + val2 = stack.pop(); + if(val1->getType()->isDoubleTy() || val1->getType()->isIntegerTy(64)) { + stack.push(val1); stack.push(val2); stack.push(val1); + } else { + val3 = stack.pop(); + stack.push(val2); stack.push(val1); stack.push(val3); stack.push(val2); stack.push(val1); + } + break; + + case J3Cst::BC_dup2_x2: /* 0x5e */ + val1 = stack.pop(); + val2 = stack.pop(); + val3 = stack.pop(); + if(val1->getType()->isDoubleTy() || val1->getType()->isIntegerTy(64)) { + stack.push(val1); stack.push(val3); stack.push(val2); stack.push(val1); + } else { + llvm::Value* val4 = stack.pop(); + stack.push(val2); stack.push(val1); stack.push(val4); stack.push(val3); stack.push(val2); stack.push(val1); + } + break; + + case J3Cst::BC_swap: /* 0x5f */ + val1 = stack.pop(); val2 = stack.pop(); stack.push(val1); stack.push(val2); + break; case J3Cst::BC_iadd: /* 0x60 */ case J3Cst::BC_ladd: /* 0x61 */ @@ -1609,9 +1644,9 @@ void J3CodeGen::generateJava() { uint32_t nbLocals = reader.readU2(); uint32_t codeLength = reader.readU4(); - locals.init(this, nbLocals, allocator->allocate(J3CodeGenVar::reservedSize(nbLocals))); - stack.init(this, maxStack, allocator->allocate(J3CodeGenVar::reservedSize(maxStack))); - ret.init(this, 1, allocator->allocate(J3CodeGenVar::reservedSize(1))); + locals.init(this, nbLocals); + stack.init(this, maxStack); + ret.init(this, 1); genDebugEnterLeave(0); Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc?rev=199098&r1=199097&r2=199098&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc Mon Jan 13 05:26:16 2014 @@ -40,16 +40,13 @@ void J3CodeGenVar::killUnused() { killUnused(refStack, 1); } -uint32_t J3CodeGenVar::reservedSize(uint32_t max) { - return max*5*sizeof(llvm::AllocaInst*) + max*sizeof(llvm::Type*); -} - uint32_t J3CodeGenVar::metaStackSize() { return topStack*sizeof(llvm::Type*); } -void J3CodeGenVar::init(J3CodeGen* _codeGen, uint32_t max, void* space) { +void J3CodeGenVar::init(J3CodeGen* _codeGen, uint32_t max) { codeGen = _codeGen; + void* space = codeGen->allocator->allocate(max*5*sizeof(llvm::AllocaInst*) + max*sizeof(llvm::Type*)); maxStack = max; intStack = (llvm::AllocaInst**)space; longStack = intStack + max; 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=199098&r1=199097&r2=199098&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Mon Jan 13 05:26:16 2014 @@ -570,8 +570,15 @@ void JNICALL GetStringUTFRegion(JNIEnv* leaveJVM(); } -void* JNICALL GetPrimitiveArrayCritical(JNIEnv* env, jarray array, jboolean* isCopy) { enterJVM(); leaveJVM(); NYI(); } -void JNICALL ReleasePrimitiveArrayCritical(JNIEnv* env, jarray array, void* carray, jint mode) { enterJVM(); leaveJVM(); NYI(); } +void* JNICALL GetPrimitiveArrayCritical(JNIEnv* env, jarray array, jboolean* isCopy) { + //GC::disable(); ? + if(isCopy) + isCopy = 0; + return array ? array->array()->content() : 0; +} + +void JNICALL ReleasePrimitiveArrayCritical(JNIEnv* env, jarray array, void* carray, jint mode) { +} const jchar* JNICALL GetStringCritical(JNIEnv* env, jstring string, jboolean* isCopy) { enterJVM(); leaveJVM(); NYI(); } void JNICALL ReleaseStringCritical(JNIEnv* env, jstring string, const jchar* cstring) { enterJVM(); leaveJVM(); NYI(); } From nicolas.geoffray at gmail.com Mon Jan 13 03:36:50 2014 From: nicolas.geoffray at gmail.com (Nicolas Geoffray) Date: Mon, 13 Jan 2014 11:36:50 +0000 Subject: [vmkit-commits] [vmkit] r199098 - Implements GetPrimitiveArrayCritical ReleasePrimitiveArrayCritical. In-Reply-To: <20140113112617.179D32A6C032@llvm.org> References: <20140113112617.179D32A6C032@llvm.org> Message-ID: On Mon, Jan 13, 2014 at 11:26 AM, Gael Thomas wrote: > Author: gthomas > Date: Mon Jan 13 05:26:16 2014 > New Revision: 199098 > > URL: http://llvm.org/viewvc/llvm-project?rev=199098&view=rev > Log: > Implements GetPrimitiveArrayCritical ReleasePrimitiveArrayCritical. > Implements dup* bytecodes. > Simplify allocation of stacks/locals. > Fix a memory bug in meta stack management for the control flow. > Fix a memory bug in J3Class::clone. > > > Modified: > vmkit/branches/mcjit/include/j3/j3codegenvar.h > vmkit/branches/mcjit/lib/j3/openjdk/j3lib.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 > vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc > vmkit/branches/mcjit/lib/j3/vm/j3jni.cc > > Modified: vmkit/branches/mcjit/include/j3/j3codegenvar.h > URL: > http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegenvar.h?rev=199098&r1=199097&r2=199098&view=diff > > ============================================================================== > --- vmkit/branches/mcjit/include/j3/j3codegenvar.h (original) > +++ vmkit/branches/mcjit/include/j3/j3codegenvar.h Mon Jan 13 05:26:16 2014 > @@ -27,8 +27,7 @@ namespace j3 { > uint32_t topStack; > uint32_t maxStack; > > - static uint32_t reservedSize(uint32_t max); > - void init(J3CodeGen* _codeGen, uint32_t > max, void* space); > + void init(J3CodeGen* _codeGen, uint32_t > max); > > void killUnused(); > > > Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc > URL: > http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=199098&r1=199097&r2=199098&view=diff > > ============================================================================== > --- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original) > +++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Mon Jan 13 05:26:16 2014 > @@ -33,8 +33,9 @@ static char* buildPath(const char* base, > void J3Lib::processOptions(J3* vm) { > const char* jh = getenv("JAVA_HOME"); > jh = jh ? jh : OPENJDK_HOME"/jre"; > + jh = strdup(jh); > > - vm->options()->javaHome = jh ? jh : OPENJDK_HOME; > + vm->options()->javaHome = jh; > vm->options()->bootClasspath = buildPath(jh, "/lib/rt.jar"); > vm->options()->systemLibraryPath = buildPath(jh, > OPENJDK_LIBPATH_SUFFIX); > vm->options()->extDirs = buildPath(jh, "/lib/ext"); > > 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=199098&r1=199097&r2=199098&view=diff > > ============================================================================== > --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) > +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Mon Jan 13 05:26:16 2014 > @@ -158,7 +158,7 @@ void J3::run() { > if(options()->debugLifeCycle) > fprintf(stderr, " Launching the application\n"); > > - options()->debugExecute = 0; > + //options()->debugExecute = 0; > > #if 0 > J3Class* loaderClass = z_class("java/lang/ClassLoader"); > @@ -340,5 +340,3 @@ void J3::forceSymbolDefinition() { > } catch(void* e) { > } > } > - > - > > 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=199098&r1=199097&r2=199098&view=diff > > ============================================================================== > --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) > +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Mon Jan 13 05:26:16 2014 > @@ -331,7 +331,7 @@ uint16_t J3Class::modifiers() { > > J3ObjectHandle* J3Class::clone(J3ObjectHandle* obj) { > J3ObjectHandle* res = J3ObjectHandle::doNewObject(this); > - obj->rawObjectCopyTo(0, res, 0, structSize()); > + obj->rawObjectCopyTo(0, res, 0, structSize() - sizeof(J3Object)); > return res; > } > > > 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=199098&r1=199097&r2=199098&view=diff > > ============================================================================== > --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) > +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Mon Jan 13 05:26:16 2014 > @@ -41,9 +41,10 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato > > #if 0 > /* usefull to debug a single function */ > - if( cl->name() == vm->names()->get("java/lang/CharacterData") && > - method->name() == vm->names()->get("of") && > - method->signature()->name() == > vm->names()->get("(I)Ljava/lang/CharacterData;") ) { > + if( cl->name() == > vm->names()->get("sun/util/calendar/BaseCalendar") && > + method->name() == > vm->names()->get("getFixedDate") && > + method->signature()->name() == > vm->names()->get("(IIILsun/util/calendar/BaseCalendar$Date;)J") ) { > + > vm->options()->debugTranslate = 3; > } > #endif > @@ -107,7 +108,7 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato > else > generateJava(); > > - if(vm->options()->debugTranslate > 3) > + if(vm->options()->debugTranslate > 4) > llvmFunction->dump(); > } > > @@ -399,8 +400,9 @@ void J3CodeGen::invoke(uint32_t access, > res = builder->CreateInvoke(func, after, > exceptions.nodes[curExceptionNode]->landingPad, args); > bb = after; > builder->SetInsertPoint(bb); > - } else > + } else { > res = builder->CreateCall(func, args); > + } > > if(!res->getType()->isVoidTy()) > stack.push(flatten(res)); > @@ -784,7 +786,7 @@ llvm::BasicBlock* J3CodeGen::forwardBran > llvm::BasicBlock* res = newBB(id); > > if(doAlloc) { > - opInfos[pc].metaStack = > (llvm::Type**)allocator->allocate(sizeof(llvm::Type*)*stack.topStack); > + opInfos[pc].metaStack = > (llvm::Type**)allocator->allocate(sizeof(llvm::Type*)*stack.maxStack); > memcpy(opInfos[pc].metaStack, stack.metaStack, > sizeof(llvm::Type*)*stack.topStack); > } > > @@ -858,6 +860,7 @@ void J3CodeGen::translate() { > while(codeReader->remaining()) { > llvm::Value* val1; > llvm::Value* val2; > + llvm::Value* val3; > > javaPC = codeReader->tell(); > > @@ -1159,7 +1162,16 @@ void J3CodeGen::translate() { > stack.push(val1); stack.push(val2); > stack.push(val1); > break; > > - case J3Cst::BC_dup_x2: nyi(); /* > 0x5b */ > + case J3Cst::BC_dup_x2: /* > 0x5b */ > + val1 = stack.pop(); > + val2 = stack.pop(); > + if(val2->getType()->isDoubleTy() || > val2->getType()->isIntegerTy(64)) { > + stack.push(val1); > stack.push(val2); stack.push(val1); > + } else { > + val3 = stack.pop(); > + stack.push(val1); > stack.push(val3); stack.push(val2); stack.push(val1); > + } > + break; > > case J3Cst::BC_dup2: /* > 0x5c */ > val1 = stack.top(); > @@ -1171,9 +1183,32 @@ void J3CodeGen::translate() { > } > break; > > - case J3Cst::BC_dup2_x1: nyi(); /* > 0x5d */ > - case J3Cst::BC_dup2_x2: nyi(); /* > 0x5e */ > - case J3Cst::BC_swap: nyi(); /* > 0x5f */ > + case J3Cst::BC_dup2_x1: /* > 0x5d */ > + val1 = stack.pop(); > + val2 = stack.pop(); > + if(val1->getType()->isDoubleTy() || > val1->getType()->isIntegerTy(64)) { > + stack.push(val1); > stack.push(val2); stack.push(val1); > + } else { > + val3 = stack.pop(); > + stack.push(val2); > stack.push(val1); stack.push(val3); stack.push(val2); stack.push(val1); > + } > + break; > + > + case J3Cst::BC_dup2_x2: /* > 0x5e */ > + val1 = stack.pop(); > + val2 = stack.pop(); > + val3 = stack.pop(); > + if(val1->getType()->isDoubleTy() || > val1->getType()->isIntegerTy(64)) { > + stack.push(val1); > stack.push(val3); stack.push(val2); stack.push(val1); > + } else { > + llvm::Value* val4 = stack.pop(); > + stack.push(val2); > stack.push(val1); stack.push(val4); stack.push(val3); stack.push(val2); > stack.push(val1); > + } > + break; > + > + case J3Cst::BC_swap: /* > 0x5f */ > + val1 = stack.pop(); val2 = stack.pop(); > stack.push(val1); stack.push(val2); > + break; > > case J3Cst::BC_iadd: /* > 0x60 */ > case J3Cst::BC_ladd: /* > 0x61 */ > @@ -1609,9 +1644,9 @@ void J3CodeGen::generateJava() { > uint32_t nbLocals = reader.readU2(); > uint32_t codeLength = reader.readU4(); > > - locals.init(this, nbLocals, > allocator->allocate(J3CodeGenVar::reservedSize(nbLocals))); > - stack.init(this, maxStack, > allocator->allocate(J3CodeGenVar::reservedSize(maxStack))); > - ret.init(this, 1, > allocator->allocate(J3CodeGenVar::reservedSize(1))); > + locals.init(this, nbLocals); > + stack.init(this, maxStack); > + ret.init(this, 1); > > genDebugEnterLeave(0); > > > Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc > URL: > http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc?rev=199098&r1=199097&r2=199098&view=diff > > ============================================================================== > --- vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc (original) > +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc Mon Jan 13 05:26:16 2014 > @@ -40,16 +40,13 @@ void J3CodeGenVar::killUnused() { > killUnused(refStack, 1); > } > > -uint32_t J3CodeGenVar::reservedSize(uint32_t max) { > - return max*5*sizeof(llvm::AllocaInst*) + max*sizeof(llvm::Type*); > -} > - > uint32_t J3CodeGenVar::metaStackSize() { > return topStack*sizeof(llvm::Type*); > } > > -void J3CodeGenVar::init(J3CodeGen* _codeGen, uint32_t max, void* space) { > +void J3CodeGenVar::init(J3CodeGen* _codeGen, uint32_t max) { > codeGen = _codeGen; > + void* space = > codeGen->allocator->allocate(max*5*sizeof(llvm::AllocaInst*) + > max*sizeof(llvm::Type*)); > maxStack = max; > intStack = (llvm::AllocaInst**)space; > longStack = intStack + max; > > 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=199098&r1=199097&r2=199098&view=diff > > ============================================================================== > --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) > +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Mon Jan 13 05:26:16 2014 > @@ -570,8 +570,15 @@ void JNICALL GetStringUTFRegion(JNIEnv* > leaveJVM(); > } > > -void* JNICALL GetPrimitiveArrayCritical(JNIEnv* env, jarray array, > jboolean* isCopy) { enterJVM(); leaveJVM(); NYI(); } > -void JNICALL ReleasePrimitiveArrayCritical(JNIEnv* env, jarray array, > void* carray, jint mode) { enterJVM(); leaveJVM(); NYI(); } > +void* JNICALL GetPrimitiveArrayCritical(JNIEnv* env, jarray array, > jboolean* isCopy) { > + //GC::disable(); ? > Hmmm, are you sure you want to comment this line? > + if(isCopy) > + isCopy = 0; > *isCopy = JNI_TRUE? > + return array ? array->array()->content() : 0; > +} > + > +void JNICALL ReleasePrimitiveArrayCritical(JNIEnv* env, jarray array, > void* carray, jint mode) { > +} > > const jchar* JNICALL GetStringCritical(JNIEnv* env, jstring string, > jboolean* isCopy) { enterJVM(); leaveJVM(); NYI(); } > void JNICALL ReleaseStringCritical(JNIEnv* env, jstring string, const > jchar* cstring) { enterJVM(); leaveJVM(); NYI(); } > > > _______________________________________________ > vmkit-commits mailing list > vmkit-commits at cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits > -------------- next part -------------- An HTML attachment was scrubbed... URL: From gael.thomas at lip6.fr Mon Jan 13 03:39:49 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 13 Jan 2014 11:39:49 -0000 Subject: [vmkit-commits] [vmkit] r199099 - Implements JVM_HoldsLock and fix a bug in GetPrimitiveArrayCritical when isCopy is not null. Message-ID: <20140113113949.B37232A6C032@llvm.org> Author: gthomas Date: Mon Jan 13 05:39:49 2014 New Revision: 199099 URL: http://llvm.org/viewvc/llvm-project?rev=199099&view=rev Log: Implements JVM_HoldsLock and fix a bug in GetPrimitiveArrayCritical when isCopy is not null. Modified: vmkit/branches/mcjit/include/j3/j3monitor.h vmkit/branches/mcjit/include/j3/j3object.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3jni.cc vmkit/branches/mcjit/lib/j3/vm/j3monitor.cc vmkit/branches/mcjit/lib/j3/vm/j3object.cc Modified: vmkit/branches/mcjit/include/j3/j3monitor.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3monitor.h?rev=199099&r1=199098&r2=199099&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3monitor.h (original) +++ vmkit/branches/mcjit/include/j3/j3monitor.h Mon Jan 13 05:39:49 2014 @@ -43,6 +43,7 @@ namespace j3 { J3Monitor* prepare(J3Object* _object, uintptr_t header, J3LockRecord* _record); J3Monitor* prepare(); + bool isOwner(J3Thread* thread); void lock(); void unlock(); Modified: vmkit/branches/mcjit/include/j3/j3object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=199099&r1=199098&r2=199099&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3object.h (original) +++ vmkit/branches/mcjit/include/j3/j3object.h Mon Jan 13 05:39:49 2014 @@ -43,7 +43,7 @@ namespace j3 { friend class J3Trampoline; public: - static const uint32_t nbInterfaceMethodTable = 41; + static const uint32_t nbInterfaceMethodTable = 43; static const uint32_t gepObjectClass = 0; static const uint32_t gepInterfaceMethods = 2; static const uint32_t gepVirtualMethods = 4; @@ -102,6 +102,7 @@ namespace j3 { J3Object(); /* never directly allocate an object */ + bool isLockOwner(); J3Monitor* monitor(); uint32_t hashCode(); @@ -157,6 +158,7 @@ namespace j3 { static J3ObjectHandle* doNewObject(J3Class* cl); static J3ObjectHandle* doNewArray(J3ArrayClass* cl, uint32_t length); + bool isLockOwner(); void wait(); bool isSame(J3ObjectHandle* handle) { return obj() == handle->obj(); } 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=199099&r1=199098&r2=199099&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Mon Jan 13 05:39:49 2014 @@ -400,7 +400,15 @@ jobject JNICALL JVM_CurrentThread(JNIEnv jint JNICALL JVM_CountStackFrames(JNIEnv* env, jobject thread) { enterJVM(); leaveJVM(); NYI(); } void JNICALL JVM_Interrupt(JNIEnv* env, jobject thread) { enterJVM(); leaveJVM(); NYI(); } jboolean JNICALL JVM_IsInterrupted(JNIEnv* env, jobject thread, jboolean clearInterrupted) { enterJVM(); leaveJVM(); NYI(); } -jboolean JNICALL JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj) { enterJVM(); leaveJVM(); NYI(); } + +jboolean JNICALL JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj) { + jboolean res; + enterJVM(); + res = obj->isLockOwner(); + leaveJVM(); + return res; +} + void JNICALL JVM_DumpAllStacks(JNIEnv* env, jclass unused) { enterJVM(); leaveJVM(); NYI(); } jobjectArray JNICALL JVM_GetAllThreads(JNIEnv* env, jclass dummy) { enterJVM(); leaveJVM(); NYI(); } void JNICALL JVM_SetNativeThreadName(JNIEnv* env, jobject jthread, jstring name) { enterJVM(); leaveJVM(); NYI(); } 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=199099&r1=199098&r2=199099&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Mon Jan 13 05:39:49 2014 @@ -462,7 +462,7 @@ const char* JNICALL GetStringUTFChars(JN J3Utf16Decoder::decode(content, res); if(isCopy) - *isCopy = 1; + *isCopy = JNI_TRUE; leaveJVM(); @@ -573,7 +573,7 @@ void JNICALL GetStringUTFRegion(JNIEnv* void* JNICALL GetPrimitiveArrayCritical(JNIEnv* env, jarray array, jboolean* isCopy) { //GC::disable(); ? if(isCopy) - isCopy = 0; + *isCopy = JNI_FALSE; return array ? array->array()->content() : 0; } Modified: vmkit/branches/mcjit/lib/j3/vm/j3monitor.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3monitor.cc?rev=199099&r1=199098&r2=199099&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3monitor.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3monitor.cc Mon Jan 13 05:39:49 2014 @@ -35,6 +35,10 @@ void J3Monitor::checkRecord() { } } +bool J3Monitor::isOwner(J3Thread* thread) { + return owner == thread; +} + void J3Monitor::lock() { J3Thread* self = J3Thread::get(); 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=199099&r1=199098&r2=199099&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Mon Jan 13 05:39:49 2014 @@ -333,6 +333,16 @@ uint32_t J3Object::hashCode() { } } +bool J3Object::isLockOwner() { + J3Thread* self = J3Thread::get(); + uintptr_t header = _header; + + if((header & 0x3) == 2) /* inflated */ + return ((J3Monitor*)(header & -2))->isOwner(self); + else + return !(header & 3) && (J3Thread*)(header & J3Thread::getThreadMask()) == self; +} + J3Monitor* J3Object::monitor() { uintptr_t header = _header; @@ -384,6 +394,10 @@ void J3ObjectHandle::wait() { obj()->monitor()->wait(); } +bool J3ObjectHandle::isLockOwner() { + return obj()->isLockOwner(); +} + uint32_t J3ObjectHandle::hashCode() { return obj()->hashCode(); } From gael.thomas at lip6.fr Mon Jan 13 03:51:10 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 13 Jan 2014 11:51:10 -0000 Subject: [vmkit-commits] [vmkit] r199100 - Small API for header access. Message-ID: <20140113115110.AC4BC2A6C034@llvm.org> Author: gthomas Date: Mon Jan 13 05:51:10 2014 New Revision: 199100 URL: http://llvm.org/viewvc/llvm-project?rev=199100&view=rev Log: Small API for header access. Modified: vmkit/branches/mcjit/include/j3/j3object.h vmkit/branches/mcjit/lib/j3/vm/j3object.cc Modified: vmkit/branches/mcjit/include/j3/j3object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=199100&r1=199099&r2=199100&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3object.h (original) +++ vmkit/branches/mcjit/include/j3/j3object.h Mon Jan 13 05:51:10 2014 @@ -23,6 +23,7 @@ namespace j3 { class J3FixedPoint; class J3Method; class J3Monitor; + class J3LockRecord; // see: Cliff Click and John Rose. 2002. Fast subtype checking in the HotSpot JVM. // In Proceedings of the 2002 joint ACM-ISCOPE conference on Java Grande (JGI '02). ACM, New York, NY, USA, 96-107. @@ -103,9 +104,15 @@ namespace j3 { J3Object(); /* never directly allocate an object */ bool isLockOwner(); - J3Monitor* monitor(); + J3Monitor* inflate(); uint32_t hashCode(); + static bool isUnlocked(uintptr_t header) { return (header & 7) == 1; } + static bool isInflated(uintptr_t header) { return (header & 3) == 2; } + static bool isStackLocked(uintptr_t header) { return !(header & 3); } + static J3LockRecord* asLockRecord(uintptr_t header) { return (J3LockRecord*)header; } + static J3Monitor* asMonitor(uintptr_t header) { return (J3Monitor*)(header & ~3); } + static void monitorEnter(J3Object* obj); static void monitorExit(J3Object* obj); 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=199100&r1=199099&r2=199100&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Mon Jan 13 05:51:10 2014 @@ -304,7 +304,7 @@ uint32_t J3Object::hashCode() { while(1) { uintptr_t header = _header; - if((header & 0x7) == 1) { /* not locked, not inflated */ + if(isUnlocked(header)) { /* not locked, not inflated */ uint32_t res = header >> 8; if(res) return res; @@ -316,7 +316,7 @@ uint32_t J3Object::hashCode() { return res; } else { /* if stack locked, force the inflation because I can not modify the stack of the owner */ - J3Monitor* m = monitor(); + J3Monitor* m = inflate(); header = m->header; @@ -333,24 +333,12 @@ uint32_t J3Object::hashCode() { } } -bool J3Object::isLockOwner() { - J3Thread* self = J3Thread::get(); - uintptr_t header = _header; - - if((header & 0x3) == 2) /* inflated */ - return ((J3Monitor*)(header & -2))->isOwner(self); - else - return !(header & 3) && (J3Thread*)(header & J3Thread::getThreadMask()) == self; -} - -J3Monitor* J3Object::monitor() { - uintptr_t header = _header; - +J3Monitor* J3Object::inflate() { while(1) { uintptr_t header = _header; - if((header & 0x3) == 2) { /* already inflated */ - J3Monitor* res = (J3Monitor*)(header & -2); + if(isInflated(header)) { /* already inflated */ + J3Monitor* res = asMonitor(header); if(res) return res; else @@ -359,16 +347,17 @@ J3Monitor* J3Object::monitor() { /* ok, I'm the boss */ J3Monitor* monitor = J3Thread::get()->vm()->monitorManager.allocate(); - if(!(header & 3)) { /* stack locked */ - J3LockRecord* record = (J3LockRecord*)header; + if(isStackLocked(header)) { /* stack locked */ + J3LockRecord* record = asLockRecord(header); /* I can read record->header because, in the worst case, the owner is blocked in the sched_yield loop */ /* however, I can not read lockCount because the owner is maybe playing with this value */ monitor->prepare(this, record->header, record); } else { /* not locked at all */ - if((header & 7) != 1) + if(!isUnlocked(header)) J3::internalError("should not happen"); monitor->prepare(this, header, 0); } + _header = (uintptr_t)monitor | 2; return monitor; @@ -376,6 +365,16 @@ J3Monitor* J3Object::monitor() { } } +bool J3Object::isLockOwner() { + J3Thread* self = J3Thread::get(); + uintptr_t header = _header; + + if(isInflated(header)) /* inflated */ + return asMonitor(header)->isOwner(self); + else + return !isUnlocked(header) && (J3Thread*)(header & J3Thread::getThreadMask()) == self; +} + /* * --- J3ArrayObject --- */ @@ -391,7 +390,7 @@ J3Object* J3ArrayObject::doNew(J3ArrayCl * J3ObjectHandle */ void J3ObjectHandle::wait() { - obj()->monitor()->wait(); + obj()->inflate()->wait(); } bool J3ObjectHandle::isLockOwner() { From gael.thomas at lip6.fr Mon Jan 13 03:59:37 2014 From: gael.thomas at lip6.fr (=?ISO-8859-1?Q?Ga=EBl_Thomas?=) Date: Mon, 13 Jan 2014 12:59:37 +0100 Subject: [vmkit-commits] [vmkit] r199098 - Implements GetPrimitiveArrayCritical ReleasePrimitiveArrayCritical. In-Reply-To: References: <20140113112617.179D32A6C032@llvm.org> Message-ID: :) Thanks! Gaël 2014/1/13 Nicolas Geoffray : > > > > On Mon, Jan 13, 2014 at 11:26 AM, Gael Thomas wrote: >> >> Author: gthomas >> Date: Mon Jan 13 05:26:16 2014 >> New Revision: 199098 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=199098&view=rev >> Log: >> Implements GetPrimitiveArrayCritical ReleasePrimitiveArrayCritical. >> Implements dup* bytecodes. >> Simplify allocation of stacks/locals. >> Fix a memory bug in meta stack management for the control flow. >> Fix a memory bug in J3Class::clone. >> >> >> Modified: >> vmkit/branches/mcjit/include/j3/j3codegenvar.h >> vmkit/branches/mcjit/lib/j3/openjdk/j3lib.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 >> vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc >> vmkit/branches/mcjit/lib/j3/vm/j3jni.cc >> >> Modified: vmkit/branches/mcjit/include/j3/j3codegenvar.h >> URL: >> http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegenvar.h?rev=199098&r1=199097&r2=199098&view=diff >> >> ============================================================================== >> --- vmkit/branches/mcjit/include/j3/j3codegenvar.h (original) >> +++ vmkit/branches/mcjit/include/j3/j3codegenvar.h Mon Jan 13 05:26:16 >> 2014 >> @@ -27,8 +27,7 @@ namespace j3 { >> uint32_t topStack; >> uint32_t maxStack; >> >> - static uint32_t reservedSize(uint32_t max); >> - void init(J3CodeGen* _codeGen, uint32_t >> max, void* space); >> + void init(J3CodeGen* _codeGen, uint32_t >> max); >> >> void killUnused(); >> >> >> Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc >> URL: >> http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=199098&r1=199097&r2=199098&view=diff >> >> ============================================================================== >> --- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original) >> +++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Mon Jan 13 05:26:16 2014 >> @@ -33,8 +33,9 @@ static char* buildPath(const char* base, >> void J3Lib::processOptions(J3* vm) { >> const char* jh = getenv("JAVA_HOME"); >> jh = jh ? jh : OPENJDK_HOME"/jre"; >> + jh = strdup(jh); >> >> - vm->options()->javaHome = jh ? jh : OPENJDK_HOME; >> + vm->options()->javaHome = jh; >> vm->options()->bootClasspath = buildPath(jh, "/lib/rt.jar"); >> vm->options()->systemLibraryPath = buildPath(jh, >> OPENJDK_LIBPATH_SUFFIX); >> vm->options()->extDirs = buildPath(jh, "/lib/ext"); >> >> 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=199098&r1=199097&r2=199098&view=diff >> >> ============================================================================== >> --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) >> +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Mon Jan 13 05:26:16 2014 >> @@ -158,7 +158,7 @@ void J3::run() { >> if(options()->debugLifeCycle) >> fprintf(stderr, " Launching the application\n"); >> >> - options()->debugExecute = 0; >> + //options()->debugExecute = 0; >> >> #if 0 >> J3Class* loaderClass = z_class("java/lang/ClassLoader"); >> @@ -340,5 +340,3 @@ void J3::forceSymbolDefinition() { >> } catch(void* e) { >> } >> } >> - >> - >> >> 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=199098&r1=199097&r2=199098&view=diff >> >> ============================================================================== >> --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) >> +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Mon Jan 13 05:26:16 2014 >> @@ -331,7 +331,7 @@ uint16_t J3Class::modifiers() { >> >> J3ObjectHandle* J3Class::clone(J3ObjectHandle* obj) { >> J3ObjectHandle* res = J3ObjectHandle::doNewObject(this); >> - obj->rawObjectCopyTo(0, res, 0, structSize()); >> + obj->rawObjectCopyTo(0, res, 0, structSize() - sizeof(J3Object)); >> return res; >> } >> >> >> 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=199098&r1=199097&r2=199098&view=diff >> >> ============================================================================== >> --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) >> +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Mon Jan 13 05:26:16 2014 >> @@ -41,9 +41,10 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato >> >> #if 0 >> /* usefull to debug a single function */ >> - if( cl->name() == vm->names()->get("java/lang/CharacterData") && >> - method->name() == vm->names()->get("of") >> && >> - method->signature()->name() == >> vm->names()->get("(I)Ljava/lang/CharacterData;") ) { >> + if( cl->name() == >> vm->names()->get("sun/util/calendar/BaseCalendar") && >> + method->name() == >> vm->names()->get("getFixedDate") && >> + method->signature()->name() == >> vm->names()->get("(IIILsun/util/calendar/BaseCalendar$Date;)J") ) { >> + >> vm->options()->debugTranslate = 3; >> } >> #endif >> @@ -107,7 +108,7 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato >> else >> generateJava(); >> >> - if(vm->options()->debugTranslate > 3) >> + if(vm->options()->debugTranslate > 4) >> llvmFunction->dump(); >> } >> >> @@ -399,8 +400,9 @@ void J3CodeGen::invoke(uint32_t access, >> res = builder->CreateInvoke(func, after, >> exceptions.nodes[curExceptionNode]->landingPad, args); >> bb = after; >> builder->SetInsertPoint(bb); >> - } else >> + } else { >> res = builder->CreateCall(func, args); >> + } >> >> if(!res->getType()->isVoidTy()) >> stack.push(flatten(res)); >> @@ -784,7 +786,7 @@ llvm::BasicBlock* J3CodeGen::forwardBran >> llvm::BasicBlock* res = newBB(id); >> >> if(doAlloc) { >> - opInfos[pc].metaStack = >> (llvm::Type**)allocator->allocate(sizeof(llvm::Type*)*stack.topStack); >> + opInfos[pc].metaStack = >> (llvm::Type**)allocator->allocate(sizeof(llvm::Type*)*stack.maxStack); >> memcpy(opInfos[pc].metaStack, stack.metaStack, >> sizeof(llvm::Type*)*stack.topStack); >> } >> >> @@ -858,6 +860,7 @@ void J3CodeGen::translate() { >> while(codeReader->remaining()) { >> llvm::Value* val1; >> llvm::Value* val2; >> + llvm::Value* val3; >> >> javaPC = codeReader->tell(); >> >> @@ -1159,7 +1162,16 @@ void J3CodeGen::translate() { >> stack.push(val1); stack.push(val2); >> stack.push(val1); >> break; >> >> - case J3Cst::BC_dup_x2: nyi(); /* >> 0x5b */ >> + case J3Cst::BC_dup_x2: /* >> 0x5b */ >> + val1 = stack.pop(); >> + val2 = stack.pop(); >> + if(val2->getType()->isDoubleTy() || >> val2->getType()->isIntegerTy(64)) { >> + stack.push(val1); >> stack.push(val2); stack.push(val1); >> + } else { >> + val3 = stack.pop(); >> + stack.push(val1); >> stack.push(val3); stack.push(val2); stack.push(val1); >> + } >> + break; >> >> case J3Cst::BC_dup2: /* >> 0x5c */ >> val1 = stack.top(); >> @@ -1171,9 +1183,32 @@ void J3CodeGen::translate() { >> } >> break; >> >> - case J3Cst::BC_dup2_x1: nyi(); /* >> 0x5d */ >> - case J3Cst::BC_dup2_x2: nyi(); /* >> 0x5e */ >> - case J3Cst::BC_swap: nyi(); /* >> 0x5f */ >> + case J3Cst::BC_dup2_x1: /* >> 0x5d */ >> + val1 = stack.pop(); >> + val2 = stack.pop(); >> + if(val1->getType()->isDoubleTy() || >> val1->getType()->isIntegerTy(64)) { >> + stack.push(val1); >> stack.push(val2); stack.push(val1); >> + } else { >> + val3 = stack.pop(); >> + stack.push(val2); >> stack.push(val1); stack.push(val3); stack.push(val2); stack.push(val1); >> + } >> + break; >> + >> + case J3Cst::BC_dup2_x2: /* >> 0x5e */ >> + val1 = stack.pop(); >> + val2 = stack.pop(); >> + val3 = stack.pop(); >> + if(val1->getType()->isDoubleTy() || >> val1->getType()->isIntegerTy(64)) { >> + stack.push(val1); >> stack.push(val3); stack.push(val2); stack.push(val1); >> + } else { >> + llvm::Value* val4 = stack.pop(); >> + stack.push(val2); >> stack.push(val1); stack.push(val4); stack.push(val3); stack.push(val2); >> stack.push(val1); >> + } >> + break; >> + >> + case J3Cst::BC_swap: /* >> 0x5f */ >> + val1 = stack.pop(); val2 = stack.pop(); >> stack.push(val1); stack.push(val2); >> + break; >> >> case J3Cst::BC_iadd: /* >> 0x60 */ >> case J3Cst::BC_ladd: /* >> 0x61 */ >> @@ -1609,9 +1644,9 @@ void J3CodeGen::generateJava() { >> uint32_t nbLocals = reader.readU2(); >> uint32_t codeLength = reader.readU4(); >> >> - locals.init(this, nbLocals, >> allocator->allocate(J3CodeGenVar::reservedSize(nbLocals))); >> - stack.init(this, maxStack, >> allocator->allocate(J3CodeGenVar::reservedSize(maxStack))); >> - ret.init(this, 1, >> allocator->allocate(J3CodeGenVar::reservedSize(1))); >> + locals.init(this, nbLocals); >> + stack.init(this, maxStack); >> + ret.init(this, 1); >> >> genDebugEnterLeave(0); >> >> >> Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc >> URL: >> http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc?rev=199098&r1=199097&r2=199098&view=diff >> >> ============================================================================== >> --- vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc (original) >> +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc Mon Jan 13 05:26:16 >> 2014 >> @@ -40,16 +40,13 @@ void J3CodeGenVar::killUnused() { >> killUnused(refStack, 1); >> } >> >> -uint32_t J3CodeGenVar::reservedSize(uint32_t max) { >> - return max*5*sizeof(llvm::AllocaInst*) + max*sizeof(llvm::Type*); >> -} >> - >> uint32_t J3CodeGenVar::metaStackSize() { >> return topStack*sizeof(llvm::Type*); >> } >> >> -void J3CodeGenVar::init(J3CodeGen* _codeGen, uint32_t max, void* space) { >> +void J3CodeGenVar::init(J3CodeGen* _codeGen, uint32_t max) { >> codeGen = _codeGen; >> + void* space = >> codeGen->allocator->allocate(max*5*sizeof(llvm::AllocaInst*) + >> max*sizeof(llvm::Type*)); >> maxStack = max; >> intStack = (llvm::AllocaInst**)space; >> longStack = intStack + max; >> >> 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=199098&r1=199097&r2=199098&view=diff >> >> ============================================================================== >> --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) >> +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Mon Jan 13 05:26:16 2014 >> @@ -570,8 +570,15 @@ void JNICALL GetStringUTFRegion(JNIEnv* >> leaveJVM(); >> } >> >> -void* JNICALL GetPrimitiveArrayCritical(JNIEnv* env, jarray array, >> jboolean* isCopy) { enterJVM(); leaveJVM(); NYI(); } >> -void JNICALL ReleasePrimitiveArrayCritical(JNIEnv* env, jarray array, >> void* carray, jint mode) { enterJVM(); leaveJVM(); NYI(); } >> +void* JNICALL GetPrimitiveArrayCritical(JNIEnv* env, jarray array, >> jboolean* isCopy) { >> + //GC::disable(); ? > > > Hmmm, are you sure you want to comment this line? > >> >> + if(isCopy) >> + isCopy = 0; > > > *isCopy = JNI_TRUE? > >> >> + return array ? array->array()->content() : 0; >> +} >> + >> +void JNICALL ReleasePrimitiveArrayCritical(JNIEnv* env, jarray array, >> void* carray, jint mode) { >> +} >> >> const jchar* JNICALL GetStringCritical(JNIEnv* env, jstring string, >> jboolean* isCopy) { enterJVM(); leaveJVM(); NYI(); } >> void JNICALL ReleaseStringCritical(JNIEnv* env, jstring string, const >> jchar* cstring) { enterJVM(); leaveJVM(); NYI(); } >> >> >> _______________________________________________ >> vmkit-commits mailing list >> vmkit-commits at cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits > > -- ------------------------------------------------------------------- Gaël Thomas, Associate Professor, UPMC http://pagesperso-systeme.lip6.fr/Gael.Thomas/ ------------------------------------------------------------------- From gael.thomas at lip6.fr Thu Jan 16 04:18:40 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Thu, 16 Jan 2014 12:18:40 -0000 Subject: [vmkit-commits] [vmkit] r199375 - Implement FillInStackTrace Message-ID: <20140116121841.0A4232A6C037@llvm.org> Author: gthomas Date: Thu Jan 16 06:18:40 2014 New Revision: 199375 URL: http://llvm.org/viewvc/llvm-project?rev=199375&view=rev Log: Implement FillInStackTrace Modified: vmkit/branches/mcjit/include/j3/j3.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199375&r1=199374&r2=199375&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Thu Jan 16 06:18:40 2014 @@ -103,6 +103,8 @@ namespace j3 { J3Field* constructorClassSlot; J3Method* constructorClassInit; + J3Field* throwableClassBacktrace; + llvm::Type* typeJNIEnvPtr; llvm::Type* typeJ3VirtualTablePtr; llvm::Type* typeJ3Type; 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=199375&r1=199374&r2=199375&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan 16 06:18:40 2014 @@ -342,7 +342,38 @@ jboolean JNICALL JVM_IsNaN(jdouble d) { /* * java.lang.Throwable */ -void JNICALL JVM_FillInStackTrace(JNIEnv* env, jobject throwable) { enterJVM(); leaveJVM(); NYI(); } +void JNICALL JVM_FillInStackTrace(JNIEnv* env, jobject throwable) { + enterJVM(); + uint32_t cur = 0; + uint32_t max = 1024; + int64_t _buf[max]; + int64_t* buf = _buf; + vmkit::StackWalker walker; + + while(walker.next()) { + if(cur == max) { + void* prev = buf; + buf = (int64_t*)malloc((max<<1)*sizeof(int64_t)); + memcpy(buf, prev, max*sizeof(int64_t)); + max <<= 1; + if(prev != _buf) + free(prev); + } + buf[cur++] = (int64_t)(uintptr_t)walker.ip(); + } + + J3* vm = J3Thread::get()->vm(); + jobject backtrace = J3ObjectHandle::doNewArray(vm->typeLong->getArray(), cur); + backtrace->setRegionLong(0, buf, 0, cur); + + if(buf != _buf) + free(buf); + + throwable->setObject(vm->throwableClassBacktrace, backtrace); + + leaveJVM(); +} + jint JNICALL JVM_GetStackTraceDepth(JNIEnv* env, jobject throwable) { enterJVM(); leaveJVM(); NYI(); } jobject JNICALL JVM_GetStackTraceElement(JNIEnv* env, jobject throwable, jint index) { enterJVM(); leaveJVM(); NYI(); } 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=199375&r1=199374&r2=199375&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Thu Jan 16 06:18:40 2014 @@ -145,6 +145,8 @@ void J3::run() { constructorClassInit = z_method(0, constructorClass, initName, names()->get("(Ljava/lang/Class;[Ljava/lang/Class;[Ljava/lang/Class;IILjava/lang/String;[B[B)V")); + throwableClassBacktrace = z_field(0, z_class("java/lang/Throwable"), "backtrace", objectClass); + #define defJavaClassPrimitive(name, ctype, llvmtype, scale) \ type##name->defineJavaClass("java/lang/"#name); onJavaTypes(defJavaClassPrimitive) From gael.thomas at lip6.fr Fri Jan 17 08:30:09 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Fri, 17 Jan 2014 16:30:09 -0000 Subject: [vmkit-commits] [vmkit] r199502 - Able to throw and catch my first exceptions. Message-ID: <20140117163010.152232A6C03A@llvm.org> Author: gthomas Date: Fri Jan 17 10:30:09 2014 New Revision: 199502 URL: http://llvm.org/viewvc/llvm-project?rev=199502&view=rev Log: Able to throw and catch my first exceptions. Modified: vmkit/branches/mcjit/include/j3/j3.h vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/include/j3/j3jni.h vmkit/branches/mcjit/include/j3/j3meta.def vmkit/branches/mcjit/include/j3/j3thread.h vmkit/branches/mcjit/include/vmkit/vmkit.h vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc vmkit/branches/mcjit/lib/j3/vm/j3javavm.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3thread.cc vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc vmkit/branches/mcjit/lib/vmkit/vmkit.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199502&r1=199501&r2=199502&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Fri Jan 17 10:30:09 2014 @@ -163,7 +163,7 @@ namespace j3 { static void illegalArgumentException(const char* msg) __attribute__((noreturn)); - static void printStackTrace(); + void printStackTrace(); void forceSymbolDefinition(); }; Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199502&r1=199501&r2=199502&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Fri Jan 17 10:30:09 2014 @@ -154,6 +154,7 @@ namespace j3 { void selectExceptionNode(uint32_t idx); void translate(); + void z_translate(); void initExceptionNode(J3ExceptionNode** pnode, uint32_t pc, J3ExceptionNode* node); void addToExceptionNode(J3ExceptionNode* node, J3ExceptionEntry* entry); Modified: vmkit/branches/mcjit/include/j3/j3jni.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3jni.h?rev=199502&r1=199501&r2=199502&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3jni.h (original) +++ vmkit/branches/mcjit/include/j3/j3jni.h Fri Jan 17 10:30:09 2014 @@ -9,6 +9,8 @@ namespace j3 { } #define enterJVM() try { -#define leaveJVM() } catch(void* e) { J3Thread::get()->setPendingException(J3Thread::get()->push((J3Object*)e)); } +#define leaveJVM() } catch(void* e) { \ + J3Thread::get()->setPendingException(J3Thread::get()->push((J3Object*)e)); \ + } #endif Modified: vmkit/branches/mcjit/include/j3/j3meta.def URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=199502&r1=199501&r2=199502&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3meta.def (original) +++ vmkit/branches/mcjit/include/j3/j3meta.def Fri Jan 17 10:30:09 2014 @@ -11,6 +11,7 @@ _x(funcJ3ObjectAllocate, "j3::J3 _x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*)") _x(funcJ3ObjectMonitorExit, "j3::J3Object::monitorExit(j3::J3Object*)") _x(funcThrowException, "vmkit::VMKit::throwException(void*)") +_x(funcReplayException, "j3::J3Thread::replayException()") _x(funcClassCastException, "j3::J3::classCastException()") _x(funcNullPointerException, "j3::J3::nullPointerException()") _x(funcJ3ThreadPushHandle, "j3::J3Thread::push(j3::J3ObjectHandle*)") @@ -26,4 +27,4 @@ _x(funcFastIsAssignableToNonPrimaryCheck _x(funcGXXPersonality, "__gxx_personality_v0") _x(funcCXABeginCatch, "__cxa_begin_catch") _x(funcCXAEndCatch, "__cxa_end_catch") -_x(funcFake, "j3::J3::forceSymbolDefinition()") \ No newline at end of file +_x(funcFake, "j3::J3::forceSymbolDefinition()") Modified: vmkit/branches/mcjit/include/j3/j3thread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3thread.h?rev=199502&r1=199501&r2=199502&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3thread.h (original) +++ vmkit/branches/mcjit/include/j3/j3thread.h Fri Jan 17 10:30:09 2014 @@ -50,6 +50,7 @@ namespace j3 { J3ObjectHandle* pendingException(); bool hasPendingException() { return _pendingException; } void setPendingException(J3ObjectHandle* handle) { _pendingException = handle; } + static void replayException(); J3ObjectHandle* push(J3ObjectHandle* handle); J3ObjectHandle* push(J3Object* obj); Modified: vmkit/branches/mcjit/include/vmkit/vmkit.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/vmkit.h?rev=199502&r1=199501&r2=199502&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/vmkit.h (original) +++ vmkit/branches/mcjit/include/vmkit/vmkit.h Fri Jan 17 10:30:09 2014 @@ -67,6 +67,7 @@ namespace vmkit { virtual void vinternalError(const char* msg, va_list va) __attribute__((noreturn)); virtual void sigsegv(uintptr_t addr) __attribute__((noreturn)); virtual void sigend() __attribute__((noreturn)); + virtual void printStackTrace() = 0; static void internalError(const char* msg, ...) __attribute__((noreturn)); static void throwException(void* obj) __attribute__((noreturn)); Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc?rev=199502&r1=199501&r2=199502&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc Fri Jan 17 10:30:09 2014 @@ -51,7 +51,7 @@ void J3CodeGen::echoDebugEnter(uint32_t } void J3CodeGen::echoDebugExecute(uint32_t level, const char* msg, ...) { - if(J3Thread::get()->vm()->options()->debugExecute >= level) { + if(level == -1 || J3Thread::get()->vm()->options()->debugExecute >= level) { va_list va; va_start(va, msg); vfprintf(stderr, msg, va); 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=199502&r1=199501&r2=199502&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Fri Jan 17 10:30:09 2014 @@ -108,7 +108,7 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato else generateJava(); - if(vm->options()->debugTranslate > 4) + if(vm->options()->debugTranslate > 2) llvmFunction->dump(); } @@ -918,8 +918,8 @@ void J3CodeGen::translate() { fprintf(stderr, "--------------------------------------------\n"); llvmFunction->dump(); case 4: - case 3: stack.dump(); + case 3: case 2: fprintf(stderr, " [%4d] decoding: %s\n", javaPC, J3Cst::opcodeNames[bc]); break; @@ -1536,11 +1536,16 @@ void J3CodeGen::translate() { break; case J3Cst::BC_athrow: /* 0xbf */ - builder->CreateCall(funcThrowException, - builder->CreateBitCast(stack.pop(), - funcThrowException->getFunctionType()->getParamType(0))); - builder->CreateBr(bbRet); - _onEndPoint(); + { + llvm::Value* excp = builder->CreateBitCast(stack.pop(), funcThrowException->getFunctionType()->getParamType(0)); + if(exceptions.nodes[curExceptionNode]->landingPad) + builder->CreateInvoke(funcThrowException, bbRet, exceptions.nodes[curExceptionNode]->landingPad, excp); + else { + builder->CreateCall(funcThrowException, excp); + builder->CreateBr(bbRet); + } + _onEndPoint(); + } break; case J3Cst::BC_checkcast: /* 0xc0 */ @@ -1606,6 +1611,39 @@ void J3CodeGen::explore() { } #endif +void J3CodeGen::z_translate() { + bbRet = newBB("ret"); + llvm::BasicBlock* landingPad = newBB("landing-pad"); + llvm::Value* val = builder->CreateIntToPtr(llvm::ConstantInt::get(uintPtrTy, (uintptr_t)0x42), + vm->typeJ3ObjectPtr); + builder->CreateInvoke(funcThrowException, bbRet, landingPad, + builder->CreateBitCast(val, funcThrowException->getFunctionType()->getParamType(0))); + + builder->SetInsertPoint(landingPad); + llvm::LandingPadInst *caughtResult = builder->CreateLandingPad(vm->typeGXXException, + funcGXXPersonality, + 1, + "landing-pad"); + caughtResult->addClause(gvTypeInfo); + + llvm::Value* excp = builder->CreateBitCast(builder->CreateCall(funcCXABeginCatch, + builder->CreateExtractValue(caughtResult, 0)), + vm->typeJ3ObjectPtr); + + builder->CreateCall(funcCXAEndCatch); + + builder->CreateCall3(funcEchoDebugExecute, + builder->getInt32(-1), /* just to see my first exception :) */ + buildString("catching exception %p!\n"), + excp); + builder->CreateBr(bbRet); + + builder->SetInsertPoint(bbRet); + builder->CreateRetVoid(); + + llvmFunction->dump(); +} + void J3CodeGen::generateJava() { J3Attribute* attr = method->attributes()->lookup(vm->codeAttribute); @@ -1778,6 +1816,7 @@ void J3CodeGen::generateNative() { } res = builder->CreateCall(nat, args); + builder->CreateCall(funcReplayException); if(llvmFunction->getReturnType()->isVoidTy()) { builder->CreateCall2(funcJ3ThreadRestore, thread, frame); Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc?rev=199502&r1=199501&r2=199502&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc Fri Jan 17 10:30:09 2014 @@ -26,16 +26,23 @@ void J3ExceptionNode::addEntry(J3CodeGen codeGen->funcGXXPersonality, 1, "landing-pad"); + caughtResult->addClause(codeGen->gvTypeInfo); + +#if 0 + codeGen->builder->CreateCall2(codeGen->funcEchoDebugExecute, + codeGen->builder->getInt32(-1), /* just to see my first exception :) */ + codeGen->buildString("catching exception!\n")); +#endif + llvm::Value* excp = codeGen->builder->CreateBitCast(codeGen->builder->CreateCall(codeGen->funcCXABeginCatch, codeGen->builder->CreateExtractValue(caughtResult, 0)), codeGen->vm->typeJ3ObjectPtr); codeGen->builder->CreateCall(codeGen->funcCXAEndCatch); - codeGen->builder->CreateCall2(codeGen->funcEchoDebugExecute, - codeGen->builder->getInt32(0), /* just to see my first exception :) */ - codeGen->buildString("entering launchpad!\n")); + codeGen->stack.topStack = 0; + codeGen->stack.push(excp); } entries[nbEntries++] = entry; @@ -61,6 +68,16 @@ void J3ExceptionNode::addEntry(J3CodeGen void J3ExceptionNode::close(J3CodeGen* codeGen) { if(curCheck) { codeGen->builder->SetInsertPoint(curCheck); +#if 0 + codeGen->builder->CreateCall2(codeGen->funcEchoDebugExecute, + codeGen->builder->getInt32(-1), + codeGen->buildString(" not catched here, rethrow\n")); +#endif + codeGen->stack.metaStack[0] = codeGen->vm->typeJ3ObjectPtr; + codeGen->stack.topStack = 1; + codeGen->builder->CreateCall(codeGen->funcThrowException, + codeGen->builder->CreateBitCast(codeGen->stack.pop(), + codeGen->funcThrowException->getFunctionType()->getParamType(0))); codeGen->builder->CreateBr(codeGen->bbRet); } } Modified: vmkit/branches/mcjit/lib/j3/vm/j3javavm.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3javavm.cc?rev=199502&r1=199501&r2=199502&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3javavm.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3javavm.cc Fri Jan 17 10:30:09 2014 @@ -4,9 +4,6 @@ namespace j3 { -#define enterJVM() try { -#define leaveJVM() } catch(void* e) { J3Thread::get()->setPendingException(J3Thread::get()->push((J3Object*)e)); } - #define NYI() { J3Thread::get()->vm()->internalError("not yet implemented: '%s'", __PRETTY_FUNCTION__); } jint DestroyJavaVM(JavaVM *vm) { enterJVM(); leaveJVM(); NYI(); } 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=199502&r1=199501&r2=199502&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Fri Jan 17 10:30:09 2014 @@ -114,7 +114,16 @@ J3Value J3Method::internalInvoke(J3Objec memcpy(reIn+1, inArgs, n*sizeof(J3Value)); } else reIn = inArgs; - return cxxCaller()(fnPtr(), reIn); + + J3Value res; + try { + res = cxxCaller()(fnPtr(), reIn); + } catch(void* e) { + fprintf(stderr, " catch exception e: %p during the execution of %s::%s%s\n", + e, cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr()); + throw e; + } + return res; } J3Value J3Method::internalInvoke(J3ObjectHandle* handle, va_list va) { 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=199502&r1=199501&r2=199502&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3thread.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3thread.cc Fri Jan 17 10:30:09 2014 @@ -58,6 +58,15 @@ J3ObjectHandle* J3Thread::pendingExcepti return 0; } +void J3Thread::replayException() { + J3Thread* self = J3Thread::get(); + J3ObjectHandle* pending = self->_pendingException; + if(pending) { + self->_pendingException = 0; + vmkit::VMKit::throwException(pending->obj()); + } +} + void J3Thread::ensureCapacity(uint32_t capacity) { _localReferences.ensureCapacity(capacity); } Modified: vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc?rev=199502&r1=199501&r2=199502&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Fri Jan 17 10:30:09 2014 @@ -25,8 +25,9 @@ void J3Trampoline::interfaceTrampoline(J handle->vt()->_interfaceMethodTable[index] = res; } else { for(uint32_t i=0; inbMethods; i++) - fprintf(stderr, " method: %s::%s%s\n", desc->methods[i]->cl()->name()->cStr(), - desc->methods[i]->name()->cStr(), desc->methods[i]->signature()->name()->cStr()); + fprintf(stderr, " method: %s::%s%s - %d\n", desc->methods[i]->cl()->name()->cStr(), + desc->methods[i]->name()->cStr(), desc->methods[i]->signature()->name()->cStr(), + desc->methods[i]->interfaceIndex()); J3::internalError("implement me: interface Trampoline with collision: %d", desc->nbMethods); } Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=199502&r1=199501&r2=199502&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Fri Jan 17 10:30:09 2014 @@ -183,16 +183,9 @@ void VMKit::sigend() { internalError("sig terminate"); } -static int fake = 0; - void VMKit::throwException(void* obj) { -#if 0 - void** exception = (void**)abi::__cxa_allocate_exception(sizeof(void*)); - *exception = obj; - abi::__cxa_throw(exception, (std::type_info*)Thread::get()->vm()->ptrTypeInfo, 0); -#endif - fprintf(stderr, " throw exception...\n"); - if(fake) - throw (void*)0; /* force the symbol typeinfo for void* to be conserved in the bc file */ - abort(); + //internalError("throw exception...\n"); + //fprintf(stderr, "throw %p\n", obj); + //Thread::get()->vm()->printStackTrace(); + throw obj; } From gael.thomas at lip6.fr Sat Jan 18 04:38:17 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 18 Jan 2014 12:38:17 -0000 Subject: [vmkit-commits] [vmkit] r199545 - Fix a bug in J3Object::clone (I was casting the object as an array...) Message-ID: <20140118123817.68B092A6C03A@llvm.org> Author: gthomas Date: Sat Jan 18 06:38:16 2014 New Revision: 199545 URL: http://llvm.org/viewvc/llvm-project?rev=199545&view=rev Log: Fix a bug in J3Object::clone (I was casting the object as an array...) Implements uncaughtException Modified: vmkit/branches/mcjit/include/j3/j3.h vmkit/branches/mcjit/include/j3/j3object.h vmkit/branches/mcjit/include/vmkit/vmkit.h vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3class.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc vmkit/branches/mcjit/lib/j3/vm/j3object.cc vmkit/branches/mcjit/lib/j3/vm/j3thread.cc vmkit/branches/mcjit/lib/vmkit/thread.cc vmkit/branches/mcjit/lib/vmkit/vmkit.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199545&r1=199544&r2=199545&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Sat Jan 18 06:38:16 2014 @@ -164,6 +164,7 @@ namespace j3 { static void illegalArgumentException(const char* msg) __attribute__((noreturn)); void printStackTrace(); + void uncatchedException(void* e); void forceSymbolDefinition(); }; Modified: vmkit/branches/mcjit/include/j3/j3object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=199545&r1=199544&r2=199545&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3object.h (original) +++ vmkit/branches/mcjit/include/j3/j3object.h Sat Jan 18 06:38:16 2014 @@ -44,7 +44,7 @@ namespace j3 { friend class J3Trampoline; public: - static const uint32_t nbInterfaceMethodTable = 43; + static const uint32_t nbInterfaceMethodTable = 173; static const uint32_t gepObjectClass = 0; static const uint32_t gepInterfaceMethods = 2; static const uint32_t gepVirtualMethods = 4; Modified: vmkit/branches/mcjit/include/vmkit/vmkit.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/vmkit.h?rev=199545&r1=199544&r2=199545&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/vmkit.h (original) +++ vmkit/branches/mcjit/include/vmkit/vmkit.h Sat Jan 18 06:38:16 2014 @@ -67,7 +67,8 @@ namespace vmkit { virtual void vinternalError(const char* msg, va_list va) __attribute__((noreturn)); virtual void sigsegv(uintptr_t addr) __attribute__((noreturn)); virtual void sigend() __attribute__((noreturn)); - virtual void printStackTrace() = 0; + virtual void printStackTrace(); + virtual void uncatchedException(void* e); static void internalError(const char* msg, ...) __attribute__((noreturn)); static void throwException(void* obj) __attribute__((noreturn)); 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=199545&r1=199544&r2=199545&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sat Jan 18 06:38:16 2014 @@ -334,6 +334,33 @@ void J3::printStackTrace() { } } +void J3::uncatchedException(void* e) { + J3Thread* thread = J3Thread::get(); + J3ObjectHandle* prev = thread->tell(); + + try { + J3ObjectHandle* excp = thread->push((J3Object*)e); + + J3ObjectHandle* handler = + thread->javaThread()->vt()->type()->asObjectType() + ->findMethod(0, + names()->get("getUncaughtExceptionHandler"), + initialClassLoader->getSignature(0, names()->get("()Ljava/lang/Thread$UncaughtExceptionHandler;"))) + ->invokeVirtual(thread->javaThread()) + .valObject; + + handler->vt()->type()->asObjectType() + ->findMethod(0, + names()->get("uncaughtException"), + initialClassLoader->getSignature(0, names()->get("(Ljava/lang/Thread;Ljava/lang/Throwable;)V"))) + ->invokeVirtual(handler, thread->javaThread(), excp); + + } catch(void* e2) { + fprintf(stderr, "Fatal: double exception %p and %p\n", e, e2); + } + thread->restore(prev); +} + void J3::forceSymbolDefinition() { J3ArrayObject a; a.length(); /* J3ArrayObject */ J3LockRecord* l = new J3LockRecord(); /* J3LockRecord */ 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=199545&r1=199544&r2=199545&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sat Jan 18 06:38:16 2014 @@ -330,6 +330,7 @@ uint16_t J3Class::modifiers() { } J3ObjectHandle* J3Class::clone(J3ObjectHandle* obj) { + //fprintf(stderr, " cloning %p with %lu bytes\n", obj->obj(), structSize()); J3ObjectHandle* res = J3ObjectHandle::doNewObject(this); obj->rawObjectCopyTo(0, res, 0, structSize() - sizeof(J3Object)); return res; Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc?rev=199545&r1=199544&r2=199545&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc Sat Jan 18 06:38:16 2014 @@ -76,6 +76,8 @@ void J3CodeGen::echoElement(uint32_t lev J3* vm = J3Thread::get()->vm(); J3ObjectHandle* prev = J3Thread::get()->tell(); J3ObjectHandle* content = 0; + + fprintf(stderr, " %p - ", pobj); if(pobj->vt()->type() == vm->typeCharacter->getArray()) content = J3Thread::get()->push(pobj); Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc?rev=199545&r1=199544&r2=199545&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc Sat Jan 18 06:38:16 2014 @@ -29,11 +29,13 @@ void J3ExceptionNode::addEntry(J3CodeGen caughtResult->addClause(codeGen->gvTypeInfo); -#if 0 - codeGen->builder->CreateCall2(codeGen->funcEchoDebugExecute, - codeGen->builder->getInt32(-1), /* just to see my first exception :) */ - codeGen->buildString("catching exception!\n")); -#endif + if(codeGen->vm->options()->debugExecute) { + char buf[256]; + snprintf(buf, 256, " catching exceptions in %s::%s", codeGen->cl->name()->cStr(), codeGen->method->name()->cStr()); + codeGen->builder->CreateCall2(codeGen->funcEchoDebugExecute, + codeGen->builder->getInt32(1), + codeGen->buildString(buf)); + } llvm::Value* excp = codeGen->builder->CreateBitCast(codeGen->builder->CreateCall(codeGen->funcCXABeginCatch, codeGen->builder->CreateExtractValue(caughtResult, 0)), @@ -68,11 +70,16 @@ void J3ExceptionNode::addEntry(J3CodeGen void J3ExceptionNode::close(J3CodeGen* codeGen) { if(curCheck) { codeGen->builder->SetInsertPoint(curCheck); -#if 0 - codeGen->builder->CreateCall2(codeGen->funcEchoDebugExecute, - codeGen->builder->getInt32(-1), - codeGen->buildString(" not catched here, rethrow\n")); -#endif + + if(codeGen->vm->options()->debugExecute) { + char buf[256]; + snprintf(buf, 256, " exceptions not catched in %s::%s, rethrowing", + codeGen->cl->name()->cStr(), codeGen->method->name()->cStr()); + codeGen->builder->CreateCall2(codeGen->funcEchoDebugExecute, + codeGen->builder->getInt32(1), + codeGen->buildString(buf)); + } + codeGen->stack.metaStack[0] = codeGen->vm->typeJ3ObjectPtr; codeGen->stack.topStack = 1; codeGen->builder->CreateCall(codeGen->funcThrowException, 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=199545&r1=199544&r2=199545&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Sat Jan 18 06:38:16 2014 @@ -513,9 +513,9 @@ J3ObjectHandle* J3ObjectHandle::getObjec void J3ObjectHandle::rawObjectCopyTo(uint32_t fromOffset, J3ObjectHandle* to, uint32_t toOffset, uint32_t nbb) { if(isSame(to)) - memmove((uint8_t*)(to->obj()+1) + toOffset, (uint8_t*)(array()+1) + fromOffset, nbb); + memmove((uint8_t*)(to->obj()+1) + toOffset, (uint8_t*)(obj()+1) + fromOffset, nbb); else - memcpy((uint8_t*)(to->obj()+1) + toOffset, (uint8_t*)(array()+1) + fromOffset, nbb); + memcpy((uint8_t*)(to->obj()+1) + toOffset, (uint8_t*)(obj()+1) + fromOffset, nbb); } void J3ObjectHandle::rawArrayCopyTo(uint32_t fromOffset, J3ObjectHandle* to, uint32_t toOffset, uint32_t nbb) { 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=199545&r1=199544&r2=199545&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3thread.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3thread.cc Sat Jan 18 06:38:16 2014 @@ -20,11 +20,6 @@ J3Thread::~J3Thread() { vmkit::BumpAllocator::destroy(_allocator); } -void J3Thread::doRun() { - J3ObjectHandle* handle = get()->javaThread(); - get()->vm()->threadClassRun->invokeVirtual(handle); -} - void J3Thread::run() { J3ObjectHandle* handle = javaThread(); vm()->threadClassRun->invokeVirtual(handle); Modified: vmkit/branches/mcjit/lib/vmkit/thread.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/thread.cc?rev=199545&r1=199544&r2=199545&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/thread.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/thread.cc Sat Jan 18 06:38:16 2014 @@ -66,7 +66,11 @@ void* Thread::doRun(void* _thread) { thread->registerSignalInternal(SIGSEGV, sigsegvHandler, 1); thread->registerSignalInternal(SIGBUS, sigsegvHandler, 1); - thread->run(); + try { + thread->run(); + } catch(void* e) { + thread->vm()->uncatchedException(e); + } return 0; } Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=199545&r1=199544&r2=199545&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Sat Jan 18 06:38:16 2014 @@ -189,3 +189,11 @@ void VMKit::throwException(void* obj) { //Thread::get()->vm()->printStackTrace(); throw obj; } + +void VMKit::printStackTrace() { + fprintf(stderr, " TODO: baseline printStackTrace\n"); +} + +void VMKit::uncatchedException(void* e) { + fprintf(stderr, "Uncatched exception: %p\n", e); +} From gael.thomas at lip6.fr Sat Jan 18 05:20:32 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 18 Jan 2014 13:20:32 -0000 Subject: [vmkit-commits] [vmkit] r199546 - Uncaught exceptions are now printed. Message-ID: <20140118132032.1C00F2A6C03A@llvm.org> Author: gthomas Date: Sat Jan 18 07:20:31 2014 New Revision: 199546 URL: http://llvm.org/viewvc/llvm-project?rev=199546&view=rev Log: Uncaught exceptions are now printed. Modified: vmkit/branches/mcjit/include/j3/j3.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199546&r1=199545&r2=199546&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Sat Jan 18 07:20:31 2014 @@ -105,6 +105,9 @@ namespace j3 { J3Field* throwableClassBacktrace; + J3Class* stackTraceElementClass; + J3Method* stackTraceElementClassInit; + llvm::Type* typeJNIEnvPtr; llvm::Type* typeJ3VirtualTablePtr; llvm::Type* typeJ3Type; 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=199546&r1=199545&r2=199546&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 18 07:20:31 2014 @@ -14,6 +14,7 @@ #include #include #include +#include using namespace j3; @@ -374,8 +375,98 @@ void JNICALL JVM_FillInStackTrace(JNIEnv leaveJVM(); } -jint JNICALL JVM_GetStackTraceDepth(JNIEnv* env, jobject throwable) { enterJVM(); leaveJVM(); NYI(); } -jobject JNICALL JVM_GetStackTraceElement(JNIEnv* env, jobject throwable, jint index) { enterJVM(); leaveJVM(); NYI(); } +jint JNICALL JVM_GetStackTraceDepth(JNIEnv* env, jobject throwable) { + jint res = 0; + enterJVM(); + J3* vm = J3Thread::get()->vm(); + J3ObjectHandle* backtrace = throwable->getObject(vm->throwableClassBacktrace); + + bool simplify = 1; + + if(simplify) { + uint32_t max = backtrace->arrayLength(); + int64_t buf[max]; + + for(uint32_t i=0; igetLongAt(i); + + if(vm->getSafepoint((void*)cur)) + buf[res++] = cur; + } + + jobject newBt = J3ObjectHandle::doNewArray(backtrace->vt()->type()->asArrayClass(), res); + newBt->setRegionLong(0, buf, 0, res); + throwable->setObject(vm->throwableClassBacktrace, newBt); + + } else + res = backtrace->arrayLength(); + + leaveJVM(); + + return res; +} + +jobject JNICALL JVM_GetStackTraceElement(JNIEnv* env, jobject throwable, jint index) { + jobject res; + + enterJVM(); + J3* vm = J3Thread::get()->vm(); + uintptr_t ip = (uintptr_t)throwable->getObject(vm->throwableClassBacktrace)->getLongAt(index); + J3ObjectHandle* className; + J3ObjectHandle* methodName; + J3ObjectHandle* fileName; + uint32_t lineNumber; + + res = J3ObjectHandle::doNewObject(vm->stackTraceElementClass); + + vmkit::Safepoint* sf = vm->getSafepoint((void*)ip); + + if(!sf) { + lineNumber = -1; + className = vm->utfToString(""); + Dl_info info; + + if(dladdr((void*)(ip-1), &info)) { + int status; + const char* demangled = abi::__cxa_demangle(info.dli_sname, 0, 0, &status); + const char* name = demangled ? demangled : info.dli_sname; + methodName = vm->utfToString(name); + fileName = vm->utfToString(info.dli_fname); + } else { + char buf[256]; + snprintf(buf, 256, "??@%p", (void*)ip); + methodName = vm->utfToString(buf); + fileName = vm->utfToString("??"); + } + } else { + J3Method* m = ((J3MethodCode*)sf->unit()->getSymbol(sf->functionName()))->self; + const vmkit::Name* cn = m->cl()->name(); + uint32_t length = cn->length()+6; + uint32_t lastToken = 0; + char buf[length]; + + for(uint32_t i=0; ilength(); i++) { + if(cn->cStr()[i] == '/') { + buf[i] = '.'; + lastToken = i+1; + } else + buf[i] = cn->cStr()[i]; + } + buf[cn->length()] = 0; + + lineNumber = sf->sourceIndex(); + className = vm->utfToString(buf); + methodName = m->name() == vm->initName ? vm->utfToString(buf+lastToken) : vm->nameToString(m->name()); + + snprintf(buf, length, "%s.java", cn->cStr()); + fileName = vm->utfToString(buf); + } + + vm->stackTraceElementClassInit->invokeSpecial(res, className, methodName, fileName, lineNumber); + + leaveJVM(); + return res; +} /* * java.lang.Compiler 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=199546&r1=199545&r2=199546&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sat Jan 18 07:20:31 2014 @@ -147,6 +147,10 @@ void J3::run() { throwableClassBacktrace = z_field(0, z_class("java/lang/Throwable"), "backtrace", objectClass); + stackTraceElementClass = z_class("java/lang/StackTraceElement"); + stackTraceElementClassInit = z_method(0, stackTraceElementClass, initName, + names()->get("(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V")); + #define defJavaClassPrimitive(name, ctype, llvmtype, scale) \ type##name->defineJavaClass("java/lang/"#name); onJavaTypes(defJavaClassPrimitive) From gael.thomas at lip6.fr Sat Jan 18 05:24:24 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 18 Jan 2014 13:24:24 -0000 Subject: [vmkit-commits] [vmkit] r199547 - Only print the relevant stack trace (aka, ignore the constructor of the exception Message-ID: <20140118132424.F39012A6C03A@llvm.org> Author: gthomas Date: Sat Jan 18 07:24:24 2014 New Revision: 199547 URL: http://llvm.org/viewvc/llvm-project?rev=199547&view=rev Log: Only print the relevant stack trace (aka, ignore the constructor of the exception Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc 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=199547&r1=199546&r2=199547&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 18 07:24:24 2014 @@ -382,16 +382,28 @@ jint JNICALL JVM_GetStackTraceDepth(JNIE J3ObjectHandle* backtrace = throwable->getObject(vm->throwableClassBacktrace); bool simplify = 1; + bool ignore = 1; if(simplify) { uint32_t max = backtrace->arrayLength(); int64_t buf[max]; - for(uint32_t i=0; igetLongAt(i); + while(!res) { + for(uint32_t i=0; igetLongAt(i); + vmkit::Safepoint* sf = vm->getSafepoint((void*)cur); - if(vm->getSafepoint((void*)cur)) - buf[res++] = cur; + if(sf) { + J3Method* m = ((J3MethodCode*)sf->unit()->getSymbol(sf->functionName()))->self; + if(ignore) { + if(m->name() == vm->initName && m->cl() == throwable->vt()->type()) { + ignore = 0; + } + } else + buf[res++] = cur; + } + } + ignore = 0; } jobject newBt = J3ObjectHandle::doNewArray(backtrace->vt()->type()->asArrayClass(), res); From gael.thomas at lip6.fr Sat Jan 18 05:25:18 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 18 Jan 2014 13:25:18 -0000 Subject: [vmkit-commits] [vmkit] r199548 - Only print the relevant stack, but print something if everything is buggy... Message-ID: <20140118132518.13EFA2A6C03A@llvm.org> Author: gthomas Date: Sat Jan 18 07:25:17 2014 New Revision: 199548 URL: http://llvm.org/viewvc/llvm-project?rev=199548&view=rev Log: Only print the relevant stack, but print something if everything is buggy... Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc 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=199548&r1=199547&r2=199548&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 18 07:25:17 2014 @@ -388,7 +388,7 @@ jint JNICALL JVM_GetStackTraceDepth(JNIE uint32_t max = backtrace->arrayLength(); int64_t buf[max]; - while(!res) { + while(max && !res) { for(uint32_t i=0; igetLongAt(i); vmkit::Safepoint* sf = vm->getSafepoint((void*)cur); From gael.thomas at lip6.fr Sat Jan 18 15:28:55 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sat, 18 Jan 2014 23:28:55 -0000 Subject: [vmkit-commits] [vmkit] r199566 - Define my first class in the AppClassLoader. Message-ID: <20140118232855.AAC382A6C03A@llvm.org> Author: gthomas Date: Sat Jan 18 17:28:54 2014 New Revision: 199566 URL: http://llvm.org/viewvc/llvm-project?rev=199566&view=rev Log: Define my first class in the AppClassLoader. 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/j3meta.def vmkit/branches/mcjit/include/j3/j3reader.h vmkit/branches/mcjit/include/j3/j3thread.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/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc vmkit/branches/mcjit/lib/vmkit/thread.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199566&r1=199565&r2=199566&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Sat Jan 18 17:28:54 2014 @@ -85,8 +85,8 @@ namespace j3 { J3Method* classClassInit; J3Field* classClassVMData; - J3Class* classClassLoader; - J3Field* classClassLoaderVMData; + J3Class* classLoaderClass; + J3Field* classLoaderClassVMData; J3Class* threadClass; J3Field* threadClassVMData; Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199566&r1=199565&r2=199566&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Sat Jan 18 17:28:54 2014 @@ -63,7 +63,7 @@ namespace j3 { public: J3Type(J3ClassLoader* loader, const vmkit::Name* name); - J3ObjectHandle* javaClass(bool doPush=1); + J3ObjectHandle* javaClass(bool doPush=1, J3ObjectHandle* protectionDomain=0); virtual uint32_t logSize() = 0; uint64_t getSizeInBits(); @@ -206,6 +206,9 @@ namespace j3 { /* GC Object */ J3ObjectHandle* _staticInstance; + J3ObjectHandle* _protectionDomain; + const char* _source; + J3Attributes* readAttributes(J3Reader* reader); void readClassBytes(J3Field* hiddenFields, uint32_t nbHiddenFields); @@ -220,7 +223,7 @@ namespace j3 { J3Method* interfaceOrMethodAt(uint16_t idx, uint16_t access, bool isInterfaceMethod); public: - J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes); + J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes, J3ObjectHandle* protectionDomain, const char* source); J3ObjectHandle* clone(J3ObjectHandle* obj); Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=199566&r1=199565&r2=199566&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Sat Jan 18 17:28:54 2014 @@ -69,7 +69,8 @@ namespace j3 { static J3ClassLoader* nativeClassLoader(J3ObjectHandle* jloader); J3ObjectHandle* javaClassLoader(bool doPush=1); - J3Class* defineClass(const vmkit::Name* name, J3ClassBytes* bytes); + J3Class* defineClass(const vmkit::Name* name, J3ClassBytes* bytes, + J3ObjectHandle* protectionDomain, const char* source); J3Class* findLoadedClass(const vmkit::Name* name); virtual J3Class* loadClass(const vmkit::Name* name); Modified: vmkit/branches/mcjit/include/j3/j3meta.def URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=199566&r1=199565&r2=199566&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3meta.def (original) +++ vmkit/branches/mcjit/include/j3/j3meta.def Sat Jan 18 17:28:54 2014 @@ -5,7 +5,7 @@ _x(funcJ3TypeInitialise, "j3::J3 _x(funcJ3LayoutStructSize, "j3::J3Layout::structSize()") _x(funcJ3ClassStaticInstance, "j3::J3Class::staticInstance()") _x(funcJ3ClassStringAt, "j3::J3Class::stringAt(unsigned short, bool)") -_x(funcJ3TypeJavaClass, "j3::J3Type::javaClass(bool)") +_x(funcJ3TypeJavaClass, "j3::J3Type::javaClass(bool, j3::J3ObjectHandle*)") _x(funcJniEnv, "j3::J3::jniEnv()") _x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)") _x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*)") Modified: vmkit/branches/mcjit/include/j3/j3reader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3reader.h?rev=199566&r1=199565&r2=199566&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3reader.h (original) +++ vmkit/branches/mcjit/include/j3/j3reader.h Sat Jan 18 17:28:54 2014 @@ -25,6 +25,11 @@ class J3ClassBytes : vmkit::PermanentObj uint32_t size; uint8_t elements[1]; + J3ClassBytes(uint8_t* buf, int l) { + memcpy(elements, buf, l); + size = l; + } + J3ClassBytes(int l) { size = l; } Modified: vmkit/branches/mcjit/include/j3/j3thread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3thread.h?rev=199566&r1=199565&r2=199566&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3thread.h (original) +++ vmkit/branches/mcjit/include/j3/j3thread.h Sat Jan 18 17:28:54 2014 @@ -27,6 +27,8 @@ namespace j3 { J3LocalReferences _localReferences; J3ObjectHandle* _pendingException; J3ObjectHandle _javaThread; + + bool _interrupted; public: J3TrampolineArg _trampolineArg; private: @@ -38,6 +40,9 @@ namespace j3 { J3Thread(J3* vm); ~J3Thread(); + bool isInterrupted() { return _interrupted; } + void markInterrupted() { _interrupted = 1; } + void assocJavaThread(J3ObjectHandle* javaThread); J3ObjectHandle* javaThread() { return &_javaThread; } static J3Thread* nativeThread(J3ObjectHandle* 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=199566&r1=199565&r2=199566&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 18 17:28:54 2014 @@ -7,6 +7,7 @@ #include "j3/j3constants.h" #include "j3/j3field.h" #include "j3/j3utf16.h" +#include "j3/j3reader.h" #include "jvm.h" #include @@ -147,7 +148,7 @@ jobject JNICALL JVM_InitProperties(JNIEn vm->names()->get("(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;"))); #define setProp(key, val) _setProp->invokeVirtual(p, vm->utfToString(key), vm->utfToString(val)); -#define setPropEnv(key, val, def) ({ const char* tmp = getenv(val); if(!tmp) tmp = def; setProp(key, val); }) +#define setPropEnv(key, val, def) ({ const char* tmp = getenv(val); if(!tmp) tmp = def; setProp(key, tmp); }) /* **
java.version
Java version number @@ -533,7 +534,13 @@ jobject JNICALL JVM_CurrentThread(JNIEnv jint JNICALL JVM_CountStackFrames(JNIEnv* env, jobject thread) { enterJVM(); leaveJVM(); NYI(); } void JNICALL JVM_Interrupt(JNIEnv* env, jobject thread) { enterJVM(); leaveJVM(); NYI(); } -jboolean JNICALL JVM_IsInterrupted(JNIEnv* env, jobject thread, jboolean clearInterrupted) { enterJVM(); leaveJVM(); NYI(); } +jboolean JNICALL JVM_IsInterrupted(JNIEnv* env, jobject thread, jboolean clearInterrupted) { + jboolean res; + enterJVM(); + res = J3Thread::nativeThread(thread)->isInterrupted(); + leaveJVM(); + return res; +} jboolean JNICALL JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj) { jboolean res; @@ -750,12 +757,23 @@ jclass JNICALL JVM_FindLoadedClass(JNIEn } /* Define a class */ -jclass JNICALL JVM_DefineClass(JNIEnv* env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd) { enterJVM(); leaveJVM(); NYI(); } +jclass JNICALL JVM_DefineClass(JNIEnv* env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd) { + return JVM_DefineClassWithSource(env, name, loader, buf, len, pd, 0); +} /* Define a class with a source (added in JDK1.5) */ -jclass JNICALL JVM_DefineClassWithSource(JNIEnv* env, const char *name, jobject loader, - const jbyte *buf, jsize len, jobject pd, - const char *source) { enterJVM(); leaveJVM(); NYI(); } +jclass JNICALL JVM_DefineClassWithSource(JNIEnv* env, const char *name, jobject _loader, + const jbyte *buf, jsize len, jobject pd, + const char *source) { + jclass res; + enterJVM(); + J3* vm = J3Thread::get()->vm(); + J3ClassLoader* loader = _loader ? J3ClassLoader::nativeClassLoader(_loader) : vm->initialClassLoader; + J3ClassBytes* bytes = new(loader->allocator(), len) J3ClassBytes((uint8_t*)buf, len); + res = loader->defineClass(vm->names()->get(name), bytes, pd, source)->javaClass(); + leaveJVM(); + return res; +} /* * Reflection support functions 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=199566&r1=199565&r2=199566&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sat Jan 18 17:28:54 2014 @@ -105,49 +105,49 @@ void J3::run() { #define z_field(access, cl, name, type) cl->findField(access, names()->get(name), type) - nbArrayInterfaces = 2; - arrayInterfaces = (J3Type**)initialClassLoader->allocator()->allocate(2*sizeof(J3Type*)); - arrayInterfaces[0] = z_class("java/lang/Cloneable"); - arrayInterfaces[1] = z_class("java/io/Serializable"); + nbArrayInterfaces = 2; + arrayInterfaces = (J3Type**)initialClassLoader->allocator()->allocate(2*sizeof(J3Type*)); + arrayInterfaces[0] = z_class("java/lang/Cloneable"); + arrayInterfaces[1] = z_class("java/io/Serializable"); - charArrayClass = typeCharacter->getArray(); - objectClass = z_class("java/lang/Object"); + charArrayClass = typeCharacter->getArray(); + objectClass = z_class("java/lang/Object"); objectClass->resolve(); - stringClass = z_class("java/lang/String"); - stringClassInit = z_method(0, stringClass, initName, names()->get("([CZ)V")); - stringClassValue = z_field(0, stringClass, "value", charArrayClass); - - classClass = z_class("java/lang/Class"); - J3Field hf(J3Cst::ACC_PRIVATE, names()->get("** vmData **"), typeLong); - classClass->resolve(&hf, 1); - classClassInit = z_method(0, classClass, initName, names()->get("()V")); - classClassVMData = classClass->findField(0, hf.name(), hf.type()); - - classClassLoader = z_class("java/lang/ClassLoader"); - classClassLoader->resolve(&hf, 1); - classClassLoaderVMData = classClassLoader->findField(0, hf.name(), hf.type()); - - threadClass = z_class("java/lang/Thread"); - threadClassRun = z_method(0, threadClass, names()->get("run"), names()->get("()V")); - threadClassVMData = z_field(0, threadClass, "eetop", typeLong); - - fieldClass = z_class("java/lang/reflect/Field"); - fieldClassClass = z_field(0, fieldClass, "clazz", classClass); - fieldClassSlot = z_field(0, fieldClass, "slot", typeInteger); - fieldClassAccess = z_field(0, fieldClass, "modifiers", typeInteger); - fieldClassInit = z_method(0, fieldClass, initName, - names()->get("(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;IILjava/lang/String;[B)V")); - - constructorClass = z_class("java/lang/reflect/Constructor"); - constructorClassClass = z_field(0, constructorClass, "clazz", classClass); - constructorClassSlot = z_field(0, constructorClass, "slot", typeInteger); - constructorClassInit = z_method(0, constructorClass, initName, + stringClass = z_class("java/lang/String"); + stringClassInit = z_method(0, stringClass, initName, names()->get("([CZ)V")); + stringClassValue = z_field(0, stringClass, "value", charArrayClass); + + classClass = z_class("java/lang/Class"); + J3Field vmData[] = { J3Field(J3Cst::ACC_PRIVATE, names()->get("** vmData **"), typeLong) }; + classClass->resolve(vmData, 1); + classClassInit = z_method(0, classClass, initName, names()->get("()V")); + classClassVMData = classClass->findField(0, vmData[0].name(), vmData[0].type()); + + classLoaderClass = z_class("java/lang/ClassLoader"); + classLoaderClass->resolve(vmData, 1); + classLoaderClassVMData = classLoaderClass->findField(0, vmData[0].name(), vmData[0].type()); + + threadClass = z_class("java/lang/Thread"); + threadClassRun = z_method(0, threadClass, names()->get("run"), names()->get("()V")); + threadClassVMData = z_field(0, threadClass, "eetop", typeLong); + + fieldClass = z_class("java/lang/reflect/Field"); + fieldClassClass = z_field(0, fieldClass, "clazz", classClass); + fieldClassSlot = z_field(0, fieldClass, "slot", typeInteger); + fieldClassAccess = z_field(0, fieldClass, "modifiers", typeInteger); + fieldClassInit = z_method(0, fieldClass, initName, + names()->get("(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;IILjava/lang/String;[B)V")); + + constructorClass = z_class("java/lang/reflect/Constructor"); + constructorClassClass = z_field(0, constructorClass, "clazz", classClass); + constructorClassSlot = z_field(0, constructorClass, "slot", typeInteger); + constructorClassInit = z_method(0, constructorClass, initName, names()->get("(Ljava/lang/Class;[Ljava/lang/Class;[Ljava/lang/Class;IILjava/lang/String;[B[B)V")); - throwableClassBacktrace = z_field(0, z_class("java/lang/Throwable"), "backtrace", objectClass); + throwableClassBacktrace = z_field(0, z_class("java/lang/Throwable"), "backtrace", objectClass); - stackTraceElementClass = z_class("java/lang/StackTraceElement"); + stackTraceElementClass = z_class("java/lang/StackTraceElement"); stackTraceElementClassInit = z_method(0, stackTraceElementClass, initName, names()->get("(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V")); 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=199566&r1=199565&r2=199566&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sat Jan 18 17:28:54 2014 @@ -49,7 +49,7 @@ void J3Type::dump() { fprintf(stderr, "Type: %s", name()->cStr()); } -J3ObjectHandle* J3Type::javaClass(bool doPush) { +J3ObjectHandle* J3Type::javaClass(bool doPush, J3ObjectHandle* protectionDomain) { if(!_javaClass) { lock(); if(!_javaClass) { @@ -312,9 +312,11 @@ J3Field* J3Layout::localFindField(const /* * ------------ J3Class ------------ */ -J3Class::J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes) : +J3Class::J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes, J3ObjectHandle* protectionDomain, const char* source) : J3Layout(loader, name), - _staticLayout(loader, this, name){ + _staticLayout(loader, this, name) { + _protectionDomain = protectionDomain ? loader->globalReferences()->add(protectionDomain) : 0; + _source = source; _bytes = bytes; status = LOADED; } 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=199566&r1=199565&r2=199566&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sat Jan 18 17:28:54 2014 @@ -49,12 +49,12 @@ J3ObjectHandle* J3ClassLoader::javaClass } J3ClassLoader* J3ClassLoader::nativeClassLoader(J3ObjectHandle* jloader) { - J3ClassLoader* res = (J3ClassLoader*)jloader->getLong(J3Thread::get()->vm()->classClassLoaderVMData); + J3ClassLoader* res = (J3ClassLoader*)jloader->getLong(J3Thread::get()->vm()->classLoaderClassVMData); if(!res) { vmkit::BumpAllocator* allocator = vmkit::BumpAllocator::create(); res = new(allocator) J3ClassLoader(jloader, allocator); - jloader->setLong(J3Thread::get()->vm()->classClassLoaderVMData, (uint64_t)(uintptr_t)res); + jloader->setLong(J3Thread::get()->vm()->classLoaderClassVMData, (uint64_t)(uintptr_t)res); } return res; @@ -100,11 +100,11 @@ J3Class* J3ClassLoader::findLoadedClass( return res; } -J3Class* J3ClassLoader::defineClass(const vmkit::Name* name, J3ClassBytes* bytes) { +J3Class* J3ClassLoader::defineClass(const vmkit::Name* name, J3ClassBytes* bytes, J3ObjectHandle* protectionDomain, const char* source) { pthread_mutex_lock(&_mutexClasses); J3Class* res = classes[name]; if(!res) - classes[name] = res = new(allocator()) J3Class(this, name, bytes); + classes[name] = res = new(allocator()) J3Class(this, name, bytes, protectionDomain, source); pthread_mutex_unlock(&_mutexClasses); return res; } @@ -258,7 +258,7 @@ J3Class* J3InitialClassLoader::loadClass J3ClassBytes* bytes = new(allocator(), file->ucsize) J3ClassBytes(file->ucsize); if(archive->readFile(bytes, file)) - return defineClass(name, bytes); + return defineClass(name, bytes, 0, 0); } return 0; 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=199566&r1=199565&r2=199566&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sat Jan 18 17:28:54 2014 @@ -330,7 +330,11 @@ void J3CodeGen::initialiseJ3ObjectType(J } llvm::Value* J3CodeGen::javaClass(J3ObjectType* type, bool doPush) { - return builder->CreateCall2(funcJ3TypeJavaClass, typeDescriptor(type, vm->typeJ3TypePtr), builder->getInt1(doPush)); + return builder->CreateCall3(funcJ3TypeJavaClass, + typeDescriptor(type, vm->typeJ3TypePtr), + builder->getInt1(doPush), + builder->CreateIntToPtr(llvm::ConstantInt::get(uintPtrTy, (uintptr_t)0), + vm->typeJ3ObjectHandlePtr)); } llvm::Value* J3CodeGen::handleToObject(llvm::Value* obj) { Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc?rev=199566&r1=199565&r2=199566&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc Sat Jan 18 17:28:54 2014 @@ -31,7 +31,7 @@ void J3ExceptionNode::addEntry(J3CodeGen if(codeGen->vm->options()->debugExecute) { char buf[256]; - snprintf(buf, 256, " catching exceptions in %s::%s", codeGen->cl->name()->cStr(), codeGen->method->name()->cStr()); + snprintf(buf, 256, " catching exceptions in %s::%s\n", codeGen->cl->name()->cStr(), codeGen->method->name()->cStr()); codeGen->builder->CreateCall2(codeGen->funcEchoDebugExecute, codeGen->builder->getInt32(1), codeGen->buildString(buf)); @@ -73,7 +73,7 @@ void J3ExceptionNode::close(J3CodeGen* c if(codeGen->vm->options()->debugExecute) { char buf[256]; - snprintf(buf, 256, " exceptions not catched in %s::%s, rethrowing", + snprintf(buf, 256, " exceptions not catched in %s::%s, rethrowing\n", codeGen->cl->name()->cStr(), codeGen->method->name()->cStr()); codeGen->builder->CreateCall2(codeGen->funcEchoDebugExecute, codeGen->builder->getInt32(1), Modified: vmkit/branches/mcjit/lib/vmkit/thread.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/thread.cc?rev=199566&r1=199565&r2=199566&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/thread.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/thread.cc Sat Jan 18 17:28:54 2014 @@ -13,7 +13,9 @@ void Thread::sigsegvHandler(int n, sigin } void* Thread::operator new(size_t n) { - return ThreadAllocator::allocate(); + void* res = ThreadAllocator::allocate(); + memset(res, 0, n); + return res; } void Thread::operator delete(void* p) { From gael.thomas at lip6.fr Sat Jan 18 16:22:18 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 19 Jan 2014 00:22:18 -0000 Subject: [vmkit-commits] [vmkit] r199567 - Implements get delcared methods Message-ID: <20140119002218.58FD02A6C03A@llvm.org> Author: gthomas Date: Sat Jan 18 18:22:17 2014 New Revision: 199567 URL: http://llvm.org/viewvc/llvm-project?rev=199567&view=rev Log: Implements get delcared methods Modified: vmkit/branches/mcjit/include/j3/j3.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199567&r1=199566&r2=199567&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Sat Jan 18 18:22:17 2014 @@ -87,6 +87,7 @@ namespace j3 { J3Class* classLoaderClass; J3Field* classLoaderClassVMData; + J3Method* classLoaderClassLoadClass; J3Class* threadClass; J3Field* threadClassVMData; 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=199567&r1=199566&r2=199567&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 18 18:22:17 2014 @@ -865,7 +865,40 @@ jbyteArray JNICALL JVM_GetClassTypeAnnot * New (JDK 1.4) reflection implementation */ -jobjectArray JNICALL JVM_GetClassDeclaredMethods(JNIEnv* env, jclass ofClass, jboolean publicOnly) { enterJVM(); leaveJVM(); NYI(); } +jobjectArray JNICALL JVM_GetClassDeclaredMethods(JNIEnv* env, jclass ofClass, jboolean publicOnly) { + jobjectArray res; + + enterJVM(); + J3* vm = J3Thread::get()->vm(); + J3ObjectType* type = J3ObjectType::nativeClass(ofClass); + + if(type->isClass()) { + J3Class* cl = type->asClass(); + cl->resolve(); + res = J3ObjectHandle::doNewArray(vm->constructorClass->getArray(), + publicOnly ? + cl->staticLayout()->nbPublicMethods() + cl->nbPublicMethods() - cl->nbPublicConstructors() : + cl->staticLayout()->nbMethods() + cl->nbMethods() - cl->nbConstructors()); + + uint32_t pos = 0; + for(uint32_t i=0; inbMethods(); i++) { + J3Method* m = cl->methods()[i]; + if(m->name() != vm->initName && (!publicOnly || J3Cst::isPublic(m->access()))) + res->setObjectAt(pos++, m->javaMethod()); + } + + for(uint32_t i=0; istaticLayout()->nbMethods(); i++) { + J3Method* m = cl->staticLayout()->methods()[i]; + if(!publicOnly || J3Cst::isPublic(m->access())) + res->setObjectAt(pos++, m->javaMethod()); + } + } else + res = J3ObjectHandle::doNewArray(vm->constructorClass->getArray(), 0); + + leaveJVM(); + return res; +} + jobjectArray JNICALL JVM_GetClassDeclaredFields(JNIEnv* env, jclass ofClass, jboolean publicOnly) { jobjectArray res; @@ -899,6 +932,7 @@ jobjectArray JNICALL JVM_GetClassDeclare jobjectArray JNICALL JVM_GetClassDeclaredConstructors(JNIEnv* env, jclass ofClass, jboolean publicOnly) { jobjectArray res; + enterJVM(); J3* vm = J3Thread::get()->vm(); J3ObjectType* type = J3ObjectType::nativeClass(ofClass); 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=199567&r1=199566&r2=199567&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sat Jan 18 18:22:17 2014 @@ -127,6 +127,8 @@ void J3::run() { classLoaderClass = z_class("java/lang/ClassLoader"); classLoaderClass->resolve(vmData, 1); classLoaderClassVMData = classLoaderClass->findField(0, vmData[0].name(), vmData[0].type()); + classLoaderClassLoadClass = z_method(0, classLoaderClass, names()->get("loadClass"), + names()->get("(Ljava/lang/String;)Ljava/lang/Class;")); threadClass = z_class("java/lang/Thread"); threadClassRun = z_method(0, threadClass, names()->get("run"), names()->get("()V")); 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=199567&r1=199566&r2=199567&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sat Jan 18 18:22:17 2014 @@ -110,7 +110,8 @@ J3Class* J3ClassLoader::defineClass(cons } J3Class* J3ClassLoader::loadClass(const vmkit::Name* name) { - J3::internalError("implement me: loadClass from a Java class loader"); + J3* vm = J3Thread::get()->vm(); + return J3Class::nativeClass(vm->classLoaderClassLoadClass->invokeVirtual(_javaClassLoader, vm->nameToString(name)).valObject)->asClass(); } void J3ClassLoader::wrongType(J3ObjectType* from, const vmkit::Name* type) { From gael.thomas at lip6.fr Sun Jan 19 15:01:35 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 19 Jan 2014 23:01:35 -0000 Subject: [vmkit-commits] [vmkit] r199616 - Remove the useless class J3MethodCode. Message-ID: <20140119230135.8AAAD2A6C03A@llvm.org> Author: gthomas Date: Sun Jan 19 17:01:35 2014 New Revision: 199616 URL: http://llvm.org/viewvc/llvm-project?rev=199616&view=rev Log: Remove the useless class J3MethodCode. Modified: vmkit/branches/mcjit/Makefile 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/j3method.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/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3thread.cc Modified: vmkit/branches/mcjit/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/Makefile?rev=199616&r1=199615&r2=199616&view=diff ============================================================================== --- vmkit/branches/mcjit/Makefile (original) +++ vmkit/branches/mcjit/Makefile Sun Jan 19 17:01:35 2014 @@ -5,6 +5,6 @@ LEVEL := . -DIRS := tools/vmkit-extract lib tools/j3 lib/mmtk +DIRS := tools/vmkit-extract lib tools/j3 include $(LEVEL)/Makefile.rules Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199616&r1=199615&r2=199616&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Sun Jan 19 17:01:35 2014 @@ -11,6 +11,7 @@ namespace llvm { class Type; + class Linker; } namespace vmkit { @@ -229,6 +230,7 @@ namespace j3 { J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes, J3ObjectHandle* protectionDomain, const char* source); void aotCompile(); + void aotSnapshot(llvm::Linker* linker); J3ObjectHandle* clone(J3ObjectHandle* obj); Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=199616&r1=199615&r2=199616&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Sun Jan 19 17:01:35 2014 @@ -10,6 +10,10 @@ #include "j3/j3object.h" +namespace llvm { + class Linker; +} + namespace vmkit { class Symbol; } @@ -55,6 +59,8 @@ namespace j3 { public: J3ClassLoader(J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator); + void aotSnapshot(llvm::Linker* linker); + void addNativeLibrary(void* handle); J3Type* getTypeInternal(J3ObjectType* from, const char* type, Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199616&r1=199615&r2=199616&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Sun Jan 19 17:01:35 2014 @@ -84,7 +84,6 @@ namespace j3 { uint32_t wideReadS1(); llvm::Function* buildFunction(J3Method* method, bool isStub=1); - llvm::Value* methodDescriptor(J3Method* method); llvm::Value* typeDescriptor(J3ObjectType* objectType, llvm::Type* type); llvm::Value* spToCurrentThread(llvm::Value* sp); Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=199616&r1=199615&r2=199616&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Sun Jan 19 17:01:35 2014 @@ -10,6 +10,7 @@ namespace llvm { class FunctionType; class Function; + class Linker; } namespace vmkit { @@ -27,18 +28,8 @@ namespace j3 { class J3ObjectHandle; class J3Signature; - class J3MethodCode : public vmkit::Symbol { - public: - J3Method* self; - - J3MethodCode(J3Method* _self) { self = _self; } - - void* getSymbolAddress(); - }; - class J3Method : public vmkit::Symbol { public: - J3MethodCode _selfCode; uint16_t _access; J3Class* _cl; const vmkit::Name* _name; @@ -60,9 +51,6 @@ namespace j3 { public: J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, J3Signature* signature); - - J3MethodCode* selfCode() { return &_selfCode; } - uint32_t slot() { return _slot; } static J3Method* nativeMethod(J3ObjectHandle* handle); @@ -77,7 +65,6 @@ namespace j3 { void* getSymbolAddress(); char* llvmFunctionName(J3Class* from=0); - char* llvmDescriptorName(J3Class* from=0); char* llvmStubName(J3Class* from=0); void postInitialise(uint32_t access, J3Attributes* attributes); @@ -106,6 +93,7 @@ namespace j3 { J3Value invokeVirtual(J3ObjectHandle* obj, va_list va); void aotCompile(); + void aotSnapshot(llvm::Linker* linker); void ensureCompiled(bool withCaller, bool onlyTranslate=0); J3Signature::function_t cxxCaller(); void* fnPtr(); 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=199616&r1=199615&r2=199616&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Jan 19 17:01:35 2014 @@ -395,7 +395,7 @@ jint JNICALL JVM_GetStackTraceDepth(JNIE vmkit::Safepoint* sf = vm->getSafepoint((void*)cur); if(sf) { - J3Method* m = ((J3MethodCode*)sf->unit()->getSymbol(sf->functionName()))->self; + J3Method* m = (J3Method*)sf->unit()->getSymbol(sf->functionName()); if(ignore) { if(m->name() == vm->initName && m->cl() == throwable->vt()->type()) { ignore = 0; @@ -452,7 +452,7 @@ jobject JNICALL JVM_GetStackTraceElement fileName = vm->utfToString("??"); } } else { - J3Method* m = ((J3MethodCode*)sf->unit()->getSymbol(sf->functionName()))->self; + J3Method* m = (J3Method*)sf->unit()->getSymbol(sf->functionName()); const vmkit::Name* cn = m->cl()->name(); uint32_t length = cn->length()+6; uint32_t lastToken = 0; @@ -645,7 +645,7 @@ jclass JNICALL JVM_GetCallerClass(JNIEnv if(sf) { if(!--depth) - caller = ((J3MethodCode*)sf->unit()->getSymbol(sf->functionName()))->self; + caller = (J3Method*)sf->unit()->getSymbol(sf->functionName()); } } 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=199616&r1=199615&r2=199616&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 19 17:01:35 2014 @@ -15,6 +15,8 @@ #include "llvm/IR/Type.h" #include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/Module.h" +#include "llvm/Linker.h" #include "vmkit/safepoint.h" #include "vmkit/system.h" @@ -207,12 +209,14 @@ void J3::compileApplication() { char buf[name->length() - 5]; memcpy(buf, name->cStr(), name->length() - 6); buf[name->length()-6] = 0; - J3Class* c = loader->getTypeFromQualified(0, buf)->asClass(); - - c->aotCompile(); + loader->getTypeFromQualified(0, buf)->asClass()->aotCompile(); } } } + + llvm::Module* res = new llvm::Module("yop", llvmContext()); + llvm::Linker* linker = new llvm::Linker(res); + loader->aotSnapshot(linker); } void J3::runApplication() { @@ -402,7 +406,7 @@ void J3::printStackTrace() { vmkit::Safepoint* sf = J3Thread::get()->vm()->getSafepoint(walker.ip()); if(sf) { - J3Method* m = ((J3MethodCode*)sf->unit()->getSymbol(sf->functionName()))->self; + J3Method* m = (J3Method*)sf->unit()->getSymbol(sf->functionName()); fprintf(stderr, " in %s::%s%s index %d\n", m->cl()->name()->cStr(), m->name()->cStr(), m->signature()->name()->cStr(), sf->sourceIndex()); } else { 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=199616&r1=199615&r2=199616&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Jan 19 17:01:35 2014 @@ -332,6 +332,16 @@ void J3Class::aotCompile() { } } +void J3Class::aotSnapshot(llvm::Linker* linker) { + for(uint32_t i=0; iaotSnapshot(linker); + } + + for(uint32_t i=0; inbMethods(); i++) { + staticLayout()->methods()[i]->aotSnapshot(linker); + } +} + uint16_t J3Class::modifiers() { return access(); #if 0 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=199616&r1=199615&r2=199616&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sun Jan 19 17:01:35 2014 @@ -109,6 +109,14 @@ J3Class* J3ClassLoader::defineClass(cons return res; } +void J3ClassLoader::aotSnapshot(llvm::Linker* linker) { + pthread_mutex_lock(&_mutexClasses); + for(vmkit::NameMap::map::iterator it=classes.begin(); it!=classes.end(); it++) { + it->second->aotSnapshot(linker); + } + pthread_mutex_unlock(&_mutexClasses); +} + J3Class* J3ClassLoader::loadClass(const vmkit::Name* name) { J3* vm = J3Thread::get()->vm(); return J3Class::nativeClass(vm->classLoaderClassLoadClass->invokeVirtual(_javaClassLoader, vm->nameToString(name)).valObject)->asClass(); 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=199616&r1=199615&r2=199616&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sun Jan 19 17:01:35 2014 @@ -205,7 +205,7 @@ llvm::Value* J3CodeGen::unflatten(llvm:: llvm::Function* J3CodeGen::buildFunction(J3Method* method, bool isStub) { const char* id = (isStub && !method->fnPtr()) ? method->llvmStubName(cl) : method->llvmFunctionName(cl); - loader->addSymbol(id, method->selfCode()); + loader->addSymbol(id, method); return (llvm::Function*)module->getOrInsertFunction(id, method->signature()->functionType(method->access())); } @@ -216,12 +216,6 @@ llvm::Value* J3CodeGen::typeDescriptor(J return type == vm->typeJ3ObjectTypePtr ? v : builder->CreateBitCast(v, type); } -llvm::Value* J3CodeGen::methodDescriptor(J3Method* method) { - const char* id = method->llvmDescriptorName(); - loader->addSymbol(id, method); - return module->getOrInsertGlobal(id, vm->typeJ3Method); -} - llvm::Value* J3CodeGen::spToCurrentThread(llvm::Value* sp) { return builder->CreateIntToPtr(builder->CreateAnd(builder->CreatePtrToInt(sp, uintPtrTy), llvm::ConstantInt::get(uintPtrTy, vmkit::Thread::getThreadMask())), 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=199616&r1=199615&r2=199616&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sun Jan 19 17:01:35 2014 @@ -14,6 +14,7 @@ #include "llvm/IR/Type.h" #include "llvm/IR/Module.h" #include "llvm/IR/Function.h" +#include "llvm/Linker.h" #include "llvm/ExecutionEngine/GenericValue.h" #include "llvm/ExecutionEngine/ExecutionEngine.h" @@ -22,8 +23,7 @@ using namespace j3; -J3Method::J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, J3Signature* signature) : - _selfCode(this) { +J3Method::J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, J3Signature* signature) { _access = access; _cl = cl; _name = name; @@ -59,6 +59,13 @@ void J3Method::aotCompile() { } } +void J3Method::aotSnapshot(llvm::Linker* linker) { + if(_llvmFunction) { + std::string err; + linker->linkInModule(_llvmFunction->getParent(), llvm::Linker::DestroySource, &err); + } +} + void J3Method::ensureCompiled(bool withCaller, bool onlyTranslate) { if(!fnPtr() || (withCaller && !cxxCaller())) { //fprintf(stderr, "materializing: %s::%s%s\n", cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr()); @@ -82,12 +89,8 @@ void* J3Method::functionPointerOrVirtual return _virtualTrampoline; } -void* J3MethodCode::getSymbolAddress() { - return self->functionPointerOrStaticTrampoline(); -} - void* J3Method::getSymbolAddress() { - return this; + return functionPointerOrStaticTrampoline(); } void J3Method::setIndex(uint32_t index) { @@ -229,12 +232,6 @@ char* J3Method::llvmFunctionName(J3Class return _llvmAllNames + 5; } -char* J3Method::llvmDescriptorName(J3Class* from) { - if(!_llvmAllNames) - buildLLVMNames(from ? from : cl()); - return _llvmAllNames + 4; -} - char* J3Method::llvmStubName(J3Class* from) { if(!_llvmAllNames) buildLLVMNames(from ? from : cl()); 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=199616&r1=199615&r2=199616&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3thread.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3thread.cc Sun Jan 19 17:01:35 2014 @@ -40,7 +40,7 @@ J3Method* J3Thread::getJavaCaller(uint32 vmkit::Safepoint* sf = vm()->getSafepoint(walker.ip()); if(sf && !level--) - return ((J3MethodCode*)sf->unit()->getSymbol(sf->functionName()))->self; + return (J3Method*)sf->unit()->getSymbol(sf->functionName()); } return 0; From gael.thomas at lip6.fr Sun Jan 19 13:58:11 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 19 Jan 2014 21:58:11 -0000 Subject: [vmkit-commits] [vmkit] r199615 - Add a new Makefile to generate the llvm bytecode of mmtk. Message-ID: <20140119215811.5E4A42A6C03A@llvm.org> Author: gthomas Date: Sun Jan 19 15:58:10 2014 New Revision: 199615 URL: http://llvm.org/viewvc/llvm-project?rev=199615&view=rev Log: Add a new Makefile to generate the llvm bytecode of mmtk. Added: vmkit/branches/mcjit/lib/mmtk/ (with props) vmkit/branches/mcjit/lib/mmtk/Makefile Modified: vmkit/branches/mcjit/Makefile vmkit/branches/mcjit/autoconf/configure.ac vmkit/branches/mcjit/configure vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3class.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc Modified: vmkit/branches/mcjit/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/Makefile?rev=199615&r1=199614&r2=199615&view=diff ============================================================================== --- vmkit/branches/mcjit/Makefile (original) +++ vmkit/branches/mcjit/Makefile Sun Jan 19 15:58:10 2014 @@ -5,6 +5,6 @@ LEVEL := . -DIRS := tools/vmkit-extract lib tools +DIRS := tools/vmkit-extract lib tools/j3 lib/mmtk include $(LEVEL)/Makefile.rules Modified: vmkit/branches/mcjit/autoconf/configure.ac URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/autoconf/configure.ac?rev=199615&r1=199614&r2=199615&view=diff ============================================================================== --- vmkit/branches/mcjit/autoconf/configure.ac (original) +++ vmkit/branches/mcjit/autoconf/configure.ac Sun Jan 19 15:58:10 2014 @@ -228,12 +228,12 @@ dnl ************************************ AC_ARG_WITH(mmtkpath, [AS_HELP_STRING(--with-mmtkpath=path, - [MMTk path (use mmtk.jar)])], + [MMTk path (default ../jikesrvm/target)])], [[mmtkpath=$with_mmtkpath]], - [[mmtkpath="`pwd`/mmtk.jar"]] + [[mmtkpath="`pwd`/../jikesrvm/target"]] ) -if test ! -f "$mmtkpath"; then +if test ! -f "$mmtkpath/mmtk/mmtk.jar"; then AC_MSG_ERROR([Cannot find MMTk in '$mmtkpath']) fi Modified: vmkit/branches/mcjit/configure URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/configure?rev=199615&r1=199614&r2=199615&view=diff ============================================================================== --- vmkit/branches/mcjit/configure (original) +++ vmkit/branches/mcjit/configure Sun Jan 19 15:58:10 2014 @@ -1322,7 +1322,7 @@ Optional Packages: --with-clang-path=path clang path (use llvm-config --bindir and then default path) --with-jdkhome JRE home (default is $JAVA_HOME) - --with-mmtkpath=path MMTk path (use mmtk.jar) + --with-mmtkpath=path MMTk path (default ../jikesrvm/target) Some influential environment variables: CC C compiler command @@ -2192,12 +2192,12 @@ fi if test "${with_mmtkpath+set}" = set; then : withval=$with_mmtkpath; mmtkpath=$with_mmtkpath else - mmtkpath="`pwd`/mmtk.jar" + mmtkpath="`pwd`/../jikesrvm/target" fi -if test ! -f "$mmtkpath"; then +if test ! -f "$mmtkpath/mmtk/mmtk.jar"; then as_fn_error $? "Cannot find MMTk in '$mmtkpath'" "$LINENO" 5 fi 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=199615&r1=199614&r2=199615&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 19 15:58:10 2014 @@ -209,8 +209,6 @@ void J3::compileApplication() { buf[name->length()-6] = 0; J3Class* c = loader->getTypeFromQualified(0, buf)->asClass(); - fprintf(stderr, " find: %s\n", c->name()->cStr()); - c->aotCompile(); } } 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=199615&r1=199614&r2=199615&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Jan 19 15:58:10 2014 @@ -1026,7 +1026,6 @@ void J3ArrayClass::doNativeName() { } J3ObjectHandle* J3ArrayClass::multianewArray(uint32_t dim, uint32_t* args) { - fprintf(stderr, "allocating %s %d\n", name()->cStr(), args[0]); J3ObjectHandle* res = J3ObjectHandle::doNewArray(this, args[0]); if(dim > 1) 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=199615&r1=199614&r2=199615&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sun Jan 19 15:58:10 2014 @@ -54,7 +54,7 @@ J3Signature::function_t J3Method::cxxCal void J3Method::aotCompile() { if(!J3Cst::isAbstract(access())) { - fprintf(stderr, "compiling: %s::%s%s\n", cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr()); + //fprintf(stderr, "compiling: %s::%s%s\n", cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr()); ensureCompiled(0, 1); } } Propchange: vmkit/branches/mcjit/lib/mmtk/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Sun Jan 19 15:58:10 2014 @@ -0,0 +1 @@ +Debug+Asserts Added: vmkit/branches/mcjit/lib/mmtk/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/mmtk/Makefile?rev=199615&view=auto ============================================================================== --- vmkit/branches/mcjit/lib/mmtk/Makefile (added) +++ vmkit/branches/mcjit/lib/mmtk/Makefile Sun Jan 19 15:58:10 2014 @@ -0,0 +1,17 @@ +#===- ./Makefile -------------------------------------------*- Makefile -*--===# +# +# The vmkit project +#===------------------------------------------------------------------------===# + +LEVEL := ../.. + +BASE_OBJ_FILES=mmtk-llvm +MODULE=mmtk + +include $(LEVEL)/Makefile.rules + +J3=$(BIN_DIR)/j3 + +$(BUILD_DIR)/mmtk-llvm.bc: $(BUILD_DIR)/.dir $(J3) $(SELF) + $(Echo) "Generating the llvm bytecode of mmtk" + $(Verb) $(J3) -Xaot -cp $(MMTK_PATH)/vmmagic-stub/classes/:$(MMTK_PATH)/options/classes/ -jar $(MMTK_PATH)/mmtk/mmtk.jar \ No newline at end of file From gael.thomas at lip6.fr Sun Jan 19 13:26:45 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 19 Jan 2014 21:26:45 -0000 Subject: [vmkit-commits] [vmkit] r199613 - Add the multianewarray (the runtime function is not implemented). Able to translate mmtk into llvm. Message-ID: <20140119212645.61C0C2A6C03A@llvm.org> Author: gthomas Date: Sun Jan 19 15:26:44 2014 New Revision: 199613 URL: http://llvm.org/viewvc/llvm-project?rev=199613&view=rev Log: Add the multianewarray (the runtime function is not implemented). Able to translate mmtk into llvm. Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/include/j3/j3meta.def vmkit/branches/mcjit/include/j3/j3object.h vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3object.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199613&r1=199612&r2=199613&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Sun Jan 19 15:26:44 2014 @@ -142,6 +142,7 @@ namespace j3 { void arrayStore(J3Type* cType); void arrayLoad(J3Type* cType); + void multianewArray(); void newArray(uint8_t atype); void newArray(J3ArrayClass* type); void newObject(J3Class* cl); Modified: vmkit/branches/mcjit/include/j3/j3meta.def URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=199613&r1=199612&r2=199613&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3meta.def (original) +++ vmkit/branches/mcjit/include/j3/j3meta.def Sun Jan 19 15:26:44 2014 @@ -1,30 +1,31 @@ -_x(funcJ3MethodIndex, "j3::J3Method::index()") -_x(funcJ3TypeVT, "j3::J3Type::vt()") -_x(funcJ3TypeVTAndResolve, "j3::J3Type::vtAndResolve()") -_x(funcJ3TypeInitialise, "j3::J3Type::initialise()") -_x(funcJ3LayoutStructSize, "j3::J3Layout::structSize()") -_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()") -_x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)") -_x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*)") -_x(funcJ3ObjectMonitorExit, "j3::J3Object::monitorExit(j3::J3Object*)") -_x(funcThrowException, "vmkit::VMKit::throwException(void*)") -_x(funcReplayException, "j3::J3Thread::replayException()") -_x(funcClassCastException, "j3::J3::classCastException()") -_x(funcNullPointerException, "j3::J3::nullPointerException()") -_x(funcJ3ThreadPushHandle, "j3::J3Thread::push(j3::J3ObjectHandle*)") -_x(funcJ3ThreadPush, "j3::J3Thread::push(j3::J3Object*)") -_x(funcJ3ThreadTell, "j3::J3Thread::tell()") -_x(funcJ3ThreadRestore, "j3::J3Thread::restore(j3::J3ObjectHandle*)") -_x(funcEchoDebugEnter, "j3::J3CodeGen::echoDebugEnter(unsigned int, char const*, ...)") -_x(funcEchoDebugExecute, "j3::J3CodeGen::echoDebugExecute(unsigned int, char const*, ...)") -_x(funcEchoElement, "j3::J3CodeGen::echoElement(unsigned int, unsigned int, unsigned long)") -_x(funcIsAssignableTo, "j3::J3VirtualTable::isAssignableTo(j3::J3VirtualTable*)") +_x(funcJ3MethodIndex, "j3::J3Method::index()") +_x(funcJ3TypeVT, "j3::J3Type::vt()") +_x(funcJ3TypeVTAndResolve, "j3::J3Type::vtAndResolve()") +_x(funcJ3TypeInitialise, "j3::J3Type::initialise()") +_x(funcJ3LayoutStructSize, "j3::J3Layout::structSize()") +_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()") +_x(funcJ3ArrayClassMultianewArray, "j3::J3Object::multianewArray(j3::J3ArrayClass*, unsigned int, unsigned int*)") +_x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)") +_x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*)") +_x(funcJ3ObjectMonitorExit, "j3::J3Object::monitorExit(j3::J3Object*)") +_x(funcThrowException, "vmkit::VMKit::throwException(void*)") +_x(funcReplayException, "j3::J3Thread::replayException()") +_x(funcClassCastException, "j3::J3::classCastException()") +_x(funcNullPointerException, "j3::J3::nullPointerException()") +_x(funcJ3ThreadPushHandle, "j3::J3Thread::push(j3::J3ObjectHandle*)") +_x(funcJ3ThreadPush, "j3::J3Thread::push(j3::J3Object*)") +_x(funcJ3ThreadTell, "j3::J3Thread::tell()") +_x(funcJ3ThreadRestore, "j3::J3Thread::restore(j3::J3ObjectHandle*)") +_x(funcEchoDebugEnter, "j3::J3CodeGen::echoDebugEnter(unsigned int, char const*, ...)") +_x(funcEchoDebugExecute, "j3::J3CodeGen::echoDebugExecute(unsigned int, char const*, ...)") +_x(funcEchoElement, "j3::J3CodeGen::echoElement(unsigned int, unsigned int, unsigned long)") +_x(funcIsAssignableTo, "j3::J3VirtualTable::isAssignableTo(j3::J3VirtualTable*)") _x(funcFastIsAssignableToPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToPrimaryChecker(j3::J3VirtualTable*, unsigned int)") _x(funcFastIsAssignableToNonPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToNonPrimaryChecker(j3::J3VirtualTable*)") -_x(funcGXXPersonality, "__gxx_personality_v0") -_x(funcCXABeginCatch, "__cxa_begin_catch") -_x(funcCXAEndCatch, "__cxa_end_catch") -_x(funcFake, "j3::J3::forceSymbolDefinition()") +_x(funcGXXPersonality, "__gxx_personality_v0") +_x(funcCXABeginCatch, "__cxa_begin_catch") +_x(funcCXAEndCatch, "__cxa_end_catch") +_x(funcFake, "j3::J3::forceSymbolDefinition()") Modified: vmkit/branches/mcjit/include/j3/j3object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=199613&r1=199612&r2=199613&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3object.h (original) +++ vmkit/branches/mcjit/include/j3/j3object.h Sun Jan 19 15:26:44 2014 @@ -116,6 +116,7 @@ namespace j3 { static void monitorEnter(J3Object* obj); static void monitorExit(J3Object* obj); + static J3Object* multianewArray(J3ArrayClass* cl, uint32_t dim, uint32_t* args); static J3Object* allocate(J3VirtualTable* vt, uintptr_t n); static J3Object* doNewNoInit(J3Class* cl); static J3Object* doNew(J3Class* cl); 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=199613&r1=199612&r2=199613&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sun Jan 19 15:26:44 2014 @@ -568,6 +568,21 @@ void J3CodeGen::newArray(uint8_t atype) newArray(prim->getArray()); } +void J3CodeGen::multianewArray() { + J3ObjectType* base = cl->classAt(codeReader->readU2()); + uint32_t dim = codeReader->readU1(); + + llvm::Value* values = builder->CreateAlloca(builder->getInt32Ty(), builder->getInt32(dim)); + + for(uint32_t i=0; iCreateStore(stack.pop(), builder->CreateGEP(values, builder->getInt32(dim-i-1))); + + stack.push(builder->CreateCall3(funcJ3ArrayClassMultianewArray, + typeDescriptor(base, vm->typeJ3ArrayClassPtr), + builder->getInt32(dim), + values)); +} + void J3CodeGen::newObject(J3Class* cl) { initialiseJ3ObjectType(cl); @@ -1576,7 +1591,10 @@ void J3CodeGen::translate() { isWide = 1; break; - case J3Cst::BC_multianewarray: nyi(); /* 0xc5 */ + case J3Cst::BC_multianewarray: /* 0xc5 */ + multianewArray(); + break; + case J3Cst::BC_ifnull: /* 0xc6 */ condBr(builder->CreateIsNull(stack.pop())); break; 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=199613&r1=199612&r2=199613&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Sun Jan 19 15:26:44 2014 @@ -291,6 +291,10 @@ J3Object* J3Object::doNew(J3Class* cl) { return doNewNoInit(cl); } +J3Object* J3Object::multianewArray(J3ArrayClass* array, uint32_t dim, uint32_t* args) { + J3::internalError("implement me: multianewarray"); +} + void J3Object::monitorEnter(J3Object* obj) { J3::internalError("implement me: monitorenter"); } From gael.thomas at lip6.fr Sun Jan 19 13:42:37 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 19 Jan 2014 21:42:37 -0000 Subject: [vmkit-commits] [vmkit] r199614 - Implements the runtime multianewarray method. Message-ID: <20140119214237.21DDF19BE001@llvm.org> Author: gthomas Date: Sun Jan 19 15:42:36 2014 New Revision: 199614 URL: http://llvm.org/viewvc/llvm-project?rev=199614&view=rev Log: Implements the runtime multianewarray method. Modified: vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/include/j3/j3meta.def vmkit/branches/mcjit/include/j3/j3object.h vmkit/branches/mcjit/lib/j3/vm/j3class.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3object.cc Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199614&r1=199613&r2=199614&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Sun Jan 19 15:42:36 2014 @@ -293,6 +293,8 @@ namespace j3 { uint16_t access(); uint16_t modifiers(); J3Class* super(); + + J3ObjectHandle* multianewArray(uint32_t dim, uint32_t* args); }; class J3Primitive : public J3Type { Modified: vmkit/branches/mcjit/include/j3/j3meta.def URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=199614&r1=199613&r2=199614&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3meta.def (original) +++ vmkit/branches/mcjit/include/j3/j3meta.def Sun Jan 19 15:42:36 2014 @@ -1,31 +1,31 @@ -_x(funcJ3MethodIndex, "j3::J3Method::index()") -_x(funcJ3TypeVT, "j3::J3Type::vt()") -_x(funcJ3TypeVTAndResolve, "j3::J3Type::vtAndResolve()") -_x(funcJ3TypeInitialise, "j3::J3Type::initialise()") -_x(funcJ3LayoutStructSize, "j3::J3Layout::structSize()") -_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()") -_x(funcJ3ArrayClassMultianewArray, "j3::J3Object::multianewArray(j3::J3ArrayClass*, unsigned int, unsigned int*)") -_x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)") -_x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*)") -_x(funcJ3ObjectMonitorExit, "j3::J3Object::monitorExit(j3::J3Object*)") -_x(funcThrowException, "vmkit::VMKit::throwException(void*)") -_x(funcReplayException, "j3::J3Thread::replayException()") -_x(funcClassCastException, "j3::J3::classCastException()") -_x(funcNullPointerException, "j3::J3::nullPointerException()") -_x(funcJ3ThreadPushHandle, "j3::J3Thread::push(j3::J3ObjectHandle*)") -_x(funcJ3ThreadPush, "j3::J3Thread::push(j3::J3Object*)") -_x(funcJ3ThreadTell, "j3::J3Thread::tell()") -_x(funcJ3ThreadRestore, "j3::J3Thread::restore(j3::J3ObjectHandle*)") -_x(funcEchoDebugEnter, "j3::J3CodeGen::echoDebugEnter(unsigned int, char const*, ...)") -_x(funcEchoDebugExecute, "j3::J3CodeGen::echoDebugExecute(unsigned int, char const*, ...)") -_x(funcEchoElement, "j3::J3CodeGen::echoElement(unsigned int, unsigned int, unsigned long)") -_x(funcIsAssignableTo, "j3::J3VirtualTable::isAssignableTo(j3::J3VirtualTable*)") +_x(funcJ3MethodIndex, "j3::J3Method::index()") +_x(funcJ3TypeVT, "j3::J3Type::vt()") +_x(funcJ3TypeVTAndResolve, "j3::J3Type::vtAndResolve()") +_x(funcJ3TypeInitialise, "j3::J3Type::initialise()") +_x(funcJ3LayoutStructSize, "j3::J3Layout::structSize()") +_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()") +_x(funcJ3ArrayObjectMultianewArray, "j3::J3ArrayObject::multianewArray(j3::J3ArrayClass*, unsigned int, unsigned int*)") +_x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)") +_x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*)") +_x(funcJ3ObjectMonitorExit, "j3::J3Object::monitorExit(j3::J3Object*)") +_x(funcThrowException, "vmkit::VMKit::throwException(void*)") +_x(funcReplayException, "j3::J3Thread::replayException()") +_x(funcClassCastException, "j3::J3::classCastException()") +_x(funcNullPointerException, "j3::J3::nullPointerException()") +_x(funcJ3ThreadPushHandle, "j3::J3Thread::push(j3::J3ObjectHandle*)") +_x(funcJ3ThreadPush, "j3::J3Thread::push(j3::J3Object*)") +_x(funcJ3ThreadTell, "j3::J3Thread::tell()") +_x(funcJ3ThreadRestore, "j3::J3Thread::restore(j3::J3ObjectHandle*)") +_x(funcEchoDebugEnter, "j3::J3CodeGen::echoDebugEnter(unsigned int, char const*, ...)") +_x(funcEchoDebugExecute, "j3::J3CodeGen::echoDebugExecute(unsigned int, char const*, ...)") +_x(funcEchoElement, "j3::J3CodeGen::echoElement(unsigned int, unsigned int, unsigned long)") +_x(funcIsAssignableTo, "j3::J3VirtualTable::isAssignableTo(j3::J3VirtualTable*)") _x(funcFastIsAssignableToPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToPrimaryChecker(j3::J3VirtualTable*, unsigned int)") _x(funcFastIsAssignableToNonPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToNonPrimaryChecker(j3::J3VirtualTable*)") -_x(funcGXXPersonality, "__gxx_personality_v0") -_x(funcCXABeginCatch, "__cxa_begin_catch") -_x(funcCXAEndCatch, "__cxa_end_catch") -_x(funcFake, "j3::J3::forceSymbolDefinition()") +_x(funcGXXPersonality, "__gxx_personality_v0") +_x(funcCXABeginCatch, "__cxa_begin_catch") +_x(funcCXAEndCatch, "__cxa_end_catch") +_x(funcFake, "j3::J3::forceSymbolDefinition()") Modified: vmkit/branches/mcjit/include/j3/j3object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=199614&r1=199613&r2=199614&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3object.h (original) +++ vmkit/branches/mcjit/include/j3/j3object.h Sun Jan 19 15:42:36 2014 @@ -116,7 +116,6 @@ namespace j3 { static void monitorEnter(J3Object* obj); static void monitorExit(J3Object* obj); - static J3Object* multianewArray(J3ArrayClass* cl, uint32_t dim, uint32_t* args); static J3Object* allocate(J3VirtualTable* vt, uintptr_t n); static J3Object* doNewNoInit(J3Class* cl); static J3Object* doNew(J3Class* cl); @@ -135,6 +134,7 @@ namespace j3 { private: uint32_t _length; static J3Object* doNew(J3ArrayClass* cl, uintptr_t length); + static J3Object* multianewArray(J3ArrayClass* cl, uint32_t dim, uint32_t* args); public: 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=199614&r1=199613&r2=199614&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Jan 19 15:42:36 2014 @@ -1025,6 +1025,17 @@ void J3ArrayClass::doNativeName() { _nativeName[_nativeNameLength] = 0; } +J3ObjectHandle* J3ArrayClass::multianewArray(uint32_t dim, uint32_t* args) { + fprintf(stderr, "allocating %s %d\n", name()->cStr(), args[0]); + J3ObjectHandle* res = J3ObjectHandle::doNewArray(this, args[0]); + + if(dim > 1) + for(uint32_t i=0; isetObjectAt(i, component()->asArrayClass()->multianewArray(dim-1, args+1)); + + return res; +} + /* * ------------ J3Primitive ------------ */ 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=199614&r1=199613&r2=199614&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sun Jan 19 15:42:36 2014 @@ -577,7 +577,7 @@ void J3CodeGen::multianewArray() { for(uint32_t i=0; iCreateStore(stack.pop(), builder->CreateGEP(values, builder->getInt32(dim-i-1))); - stack.push(builder->CreateCall3(funcJ3ArrayClassMultianewArray, + stack.push(builder->CreateCall3(funcJ3ArrayObjectMultianewArray, typeDescriptor(base, vm->typeJ3ArrayClassPtr), builder->getInt32(dim), values)); 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=199614&r1=199613&r2=199614&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Sun Jan 19 15:42:36 2014 @@ -291,10 +291,6 @@ J3Object* J3Object::doNew(J3Class* cl) { return doNewNoInit(cl); } -J3Object* J3Object::multianewArray(J3ArrayClass* array, uint32_t dim, uint32_t* args) { - J3::internalError("implement me: multianewarray"); -} - void J3Object::monitorEnter(J3Object* obj) { J3::internalError("implement me: monitorenter"); } @@ -390,6 +386,13 @@ J3Object* J3ArrayObject::doNew(J3ArrayCl return res; } +J3Object* J3ArrayObject::multianewArray(J3ArrayClass* cl, uint32_t dim, uint32_t* args) { + J3ObjectHandle* prev = J3Thread::get()->tell(); + J3Object* res = cl->multianewArray(dim, args)->obj(); + J3Thread::get()->restore(prev); + return res; +} + /* * J3ObjectHandle */ From gael.thomas at lip6.fr Sun Jan 19 12:53:30 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 19 Jan 2014 20:53:30 -0000 Subject: [vmkit-commits] [vmkit] r199611 - Also lookup static field in interfaces. Message-ID: <20140119205330.526E32A6C03A@llvm.org> Author: gthomas Date: Sun Jan 19 14:53:29 2014 New Revision: 199611 URL: http://llvm.org/viewvc/llvm-project?rev=199611&view=rev Log: Also lookup static field in interfaces. Modified: vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/lib/j3/vm/j3class.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/vmkit/vmkit.cc Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199611&r1=199610&r2=199611&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Sun Jan 19 14:53:29 2014 @@ -221,6 +221,10 @@ namespace j3 { void doInitialise(); J3Method* interfaceOrMethodAt(uint16_t idx, uint16_t access, bool isInterfaceMethod); + + J3Method* findInterfaceMethodRecursive(const vmkit::Name* name, J3Signature* signature); + J3Field* findInterfaceFieldRecursive(const vmkit::Name* name, J3Type* type); + public: J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes, J3ObjectHandle* protectionDomain, const char* source); 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=199611&r1=199610&r2=199611&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Jan 19 14:53:29 2014 @@ -300,8 +300,7 @@ J3Field* J3Layout::localFindField(const for(size_t i=0; iname()->cStr(), cur->type()->name()->cStr()); - //printf(" with %s - %s\n", name->cStr(), type->name()->cStr()); + //printf(" compare with %s - %s\n", cur->name()->cStr(), cur->type()->name()->cStr()); if(cur->name() == name && cur->type() == type) { return cur; } @@ -357,9 +356,7 @@ J3ObjectHandle* J3Class::extractAttribut return J3ObjectHandle::doNewArray(J3Thread::get()->vm()->typeByte->getArray(), 0); } -J3Method* J3Class::findInterfaceMethod(const vmkit::Name* name, J3Signature* signature, bool error) { - resolve(); - +J3Method* J3Class::findInterfaceMethodRecursive(const vmkit::Name* name, J3Signature* signature) { J3Class* cur = this; while(1) { J3Method* res = cur->localFindMethod(name, signature); @@ -371,19 +368,29 @@ J3Method* J3Class::findInterfaceMethod(c case 1: cur = cur->interfaces()[0]; break; default: for(uint32_t i=0; inbInterfaces(); i++) { - res = cur->interfaces()[i]->findInterfaceMethod(name, signature, error); + res = cur->interfaces()[i]->findInterfaceMethodRecursive(name, signature); if(res) return res; } case 0: - if(error) - J3::noSuchMethodError("no such interface method", this, name, signature); - else - return 0; + return 0; } } } +J3Method* J3Class::findInterfaceMethod(const vmkit::Name* name, J3Signature* signature, bool error) { + resolve(); + J3Method* res = findInterfaceMethodRecursive(name, signature); + + if(res) + return res; + + if(error) + J3::noSuchMethodError("no such interface method", this, name, signature); + else + return 0; +} + J3Method* J3Class::findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error) { resolve(); @@ -401,28 +408,67 @@ J3Method* J3Class::findMethod(uint32_t a else return 0; } + cur = cur->super(); } } +J3Field* J3Class::findInterfaceFieldRecursive(const vmkit::Name* name, J3Type* type) { + J3Class* cur = this; + + while(1) { + J3Field* res = cur->staticLayout()->localFindField(name, type); + + if(res) + return res; + + switch(cur->nbInterfaces()) { + case 1: cur = cur->interfaces()[0]; break; + default: + for(uint32_t i=0; inbInterfaces(); i++) { + res = cur->interfaces()[i]->findInterfaceFieldRecursive(name, type); + if(res) + return res; + } + case 0: + return 0; + } + } +} + J3Field* J3Class::findField(uint32_t access, const vmkit::Name* name, J3Type* type, bool error) { - //loader()->vm()->log("Lookup: %s %s in %s", type->name()->cStr(), name->cStr(), J3Class::name()->cStr()); resolve(); + J3Class* cur = this; while(1) { J3Layout* layout = J3Cst::isStatic(access) ? (J3Layout*)cur->staticLayout() : cur; J3Field* res = layout->localFindField(name, type); + //fprintf(stderr, "[%d] Lookup: %s %s in %s\n", access, type->name()->cStr(), name->cStr(), cur->name()->cStr()); + if(res) return res; if(cur == cur->super()) { + if(J3Cst::isStatic(access)) { + J3Class* prev = 0; + for(cur=this; cur!=prev; cur=cur->super()) { + for(uint32_t i=0; inbInterfaces(); i++) { + res = cur->interfaces()[i]->findInterfaceFieldRecursive(name, type); + if(res) + return res; + } + prev = cur; + } + } + if(error) J3::noSuchFieldError("no such field", this, name, type); else return 0; } + cur = cur->super(); } } 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=199611&r1=199610&r2=199611&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sun Jan 19 14:53:29 2014 @@ -53,13 +53,15 @@ J3Signature::function_t J3Method::cxxCal } void J3Method::aotCompile() { - fprintf(stderr, "compiling: %s::%s%s\n", cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr()); - ensureCompiled(0, 1); + if(!J3Cst::isAbstract(access())) { + fprintf(stderr, "compiling: %s::%s%s\n", cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr()); + ensureCompiled(0, 1); + } } void J3Method::ensureCompiled(bool withCaller, bool onlyTranslate) { if(!fnPtr() || (withCaller && !cxxCaller())) { - // fprintf(stderr, "materializing: %s::%s%s\n", this, cl()->name()->cStr(), name()->cStr(), signature()->cStr()); + //fprintf(stderr, "materializing: %s::%s%s\n", cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr()); J3CodeGen::translate(this, !fnPtr(), withCaller, onlyTranslate); } } Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=199611&r1=199610&r2=199611&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Sun Jan 19 14:53:29 2014 @@ -38,11 +38,11 @@ VMKit::VMKit(vmkit::BumpAllocator* alloc _allocator = allocator; pthread_mutex_init(&safepointMapLock, 0); - //pthread_mutexattr_t attr; - //pthread_mutexattr_init(&attr); - //pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); - pthread_mutex_init(&_compilerLock, 0); - //pthread_mutexattr_destroy(&attr); + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&_compilerLock, &attr); + pthread_mutexattr_destroy(&attr); } void* VMKit::operator new(size_t n, vmkit::BumpAllocator* allocator) { From gael.thomas at lip6.fr Sun Jan 19 09:12:29 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 19 Jan 2014 17:12:29 -0000 Subject: [vmkit-commits] [vmkit] r199606 - Begin the AOT compiler. For the moment, only find the .class in a jar file. Message-ID: <20140119171229.D86A319BE001@llvm.org> Author: gthomas Date: Sun Jan 19 11:12:29 2014 New Revision: 199606 URL: http://llvm.org/viewvc/llvm-project?rev=199606&view=rev Log: Begin the AOT compiler. For the moment, only find the .class in a jar file. Modified: vmkit/branches/mcjit/include/j3/j3.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199606&r1=199605&r2=199606&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Sun Jan 19 11:12:29 2014 @@ -50,6 +50,9 @@ namespace j3 { void introspect(); + void runApplication(); + void compileApplication(); + J3(vmkit::BumpAllocator* allocator); public: J3InitialClassLoader* initialClassLoader; @@ -144,6 +147,8 @@ namespace j3 { const vmkit::Name* arrayToName(J3ObjectHandle* array); const vmkit::Name* stringToName(J3ObjectHandle* str); + const vmkit::Name* qualifiedToBinaryName(const char* type, size_t length=-1); + void run(); void start(int argc, char** argv); 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=199606&r1=199605&r2=199606&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Jan 19 11:12:29 2014 @@ -569,7 +569,15 @@ jint JNICALL JVM_ClassLoaderDepth(JNIEnv /* * java.lang.Package */ -jstring JNICALL JVM_GetSystemPackage(JNIEnv* env, jstring name) { enterJVM(); leaveJVM(); NYI(); } +jstring JNICALL JVM_GetSystemPackage(JNIEnv* env, jstring _name) { + /* should implements this, but I don't see what I have to do... */ + //enterJVM(); + //const vmkit::Name* name = J3Thread::get()->vm()->stringToName(_name); + //fprintf(stderr, " get system package from: %s\n", name->cStr()); + //leaveJVM(); + return _name; +} + jobjectArray JNICALL JVM_GetSystemPackages(JNIEnv* env) { enterJVM(); leaveJVM(); NYI(); } /* @@ -771,7 +779,7 @@ jclass JNICALL JVM_DefineClassWithSource J3* vm = J3Thread::get()->vm(); J3ClassLoader* loader = _loader ? J3ClassLoader::nativeClassLoader(_loader) : vm->initialClassLoader; J3ClassBytes* bytes = new(loader->allocator(), len) J3ClassBytes((uint8_t*)buf, len); - res = loader->defineClass(vm->names()->get(name), bytes, pd, source)->javaClass(); + res = loader->defineClass(vm->qualifiedToBinaryName(name), bytes, pd, source)->javaClass(); leaveJVM(); return res; } 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=199606&r1=199605&r2=199606&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 19 11:12:29 2014 @@ -173,6 +173,49 @@ void J3::run() { J3Lib::bootstrap(this); + if(options()->isAOT) + compileApplication(); + else + runApplication(); +} + +void J3::compileApplication() { + if(options()->debugLifeCycle) + fprintf(stderr, " Find the class loader\n"); + + J3ClassLoader* loader = J3ClassLoader::nativeClassLoader(z_method(J3Cst::ACC_STATIC, z_class("java.lang.ClassLoader"), + names()->get("getSystemClassLoader"), + names()->get("()Ljava/lang/ClassLoader;"))->invokeStatic().valObject); + + + if(options()->mainClass) + J3::internalError("compiling a single class is not yet supported"); + else { + J3Class* jarFileClass = z_class("java.util.jar.JarFile"); + J3ObjectHandle* jarFile = J3ObjectHandle::doNewObject(jarFileClass); + z_method(0, jarFileClass, initName, names()->get("(Ljava/lang/String;)V"))->invokeSpecial(jarFile, utfToString(options()->jarFile)); + J3ObjectHandle* it = z_method(0, jarFileClass, names()->get("entries"), + names()->get("()Ljava/util/Enumeration;"))->invokeVirtual(jarFile).valObject; + J3Method* hasMore = z_method(0, it->vt()->type()->asObjectType(), names()->get("hasMoreElements"), names()->get("()Z")); + J3Method* nextEl = z_method(0, it->vt()->type()->asObjectType(), names()->get("nextElement"), names()->get("()Ljava/lang/Object;")); + J3Method* getName = z_method(0, z_class("java.util.zip.ZipEntry"), names()->get("getName"), names()->get("()Ljava/lang/String;")); + + while(hasMore->invokeVirtual(it).valBoolean) { + const vmkit::Name* name = stringToName(getName->invokeVirtual(nextEl->invokeVirtual(it).valObject).valObject); + + if(strcmp(name->cStr() + name->length() - 6, ".class") == 0) { + char buf[name->length() - 5]; + memcpy(buf, name->cStr(), name->length() - 6); + buf[name->length()-6] = 0; + J3Class* c = loader->getTypeFromQualified(0, buf)->asClass(); + + fprintf(stderr, " find: %s\n", c->name()->cStr()); + } + } + } +} + +void J3::runApplication() { if(options()->debugLifeCycle) fprintf(stderr, " Find the application\n"); @@ -215,6 +258,18 @@ JNIEnv* J3::jniEnv() { return J3Thread::get()->jniEnv(); } +const vmkit::Name* J3::qualifiedToBinaryName(const char* type, size_t length) { + if(length == -1) + length = strlen(type); + char buf[length+1]; + for(size_t i=0; iget(buf); +} + J3ObjectHandle* J3::arrayToString(J3ObjectHandle* array, bool doPush) { pthread_mutex_lock(&stringsMutex); J3ObjectHandle* res = charArrayToStrings[array]; 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=199606&r1=199605&r2=199606&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sun Jan 19 11:12:29 2014 @@ -209,17 +209,12 @@ J3ObjectType* J3ClassLoader::getTypeFrom if(length == -1) length = strlen(type); + J3* vm = J3Thread::get()->vm(); + if(type[0] == J3Cst::ID_Array) - return getTypeFromDescriptor(from, J3Thread::get()->vm()->names()->get(type, 0, length))->asObjectType(); - else { - char buf[length+1]; - for(size_t i=0; ivm()->names()->get(buf)); - } + return getTypeFromDescriptor(from, vm->names()->get(type, 0, length))->asObjectType(); + else + return loadClass(vm->qualifiedToBinaryName(type, length)); } J3Signature* J3ClassLoader::getSignature(J3ObjectType* from, const vmkit::Name* signature) { 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=199606&r1=199605&r2=199606&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Sun Jan 19 11:12:29 2014 @@ -111,6 +111,13 @@ void J3CmdLineParser::process() { if(!options->jarFile && !options->mainClass) help(); + if(options->jarFile) { + size_t tot = strlen(options->classpath) + strlen(options->jarFile) + 1; + char* buf = (char*)malloc(tot); + snprintf(buf, tot, "%s:%s", options->jarFile, options->classpath); + options->classpath = buf; + } + options->args = argv + cur; options->nbArgs = argc - cur; } From gael.thomas at lip6.fr Sun Jan 19 10:07:50 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 19 Jan 2014 18:07:50 -0000 Subject: [vmkit-commits] [vmkit] r199607 - Continue the aot. Message-ID: <20140119180750.6CA542A6C03A@llvm.org> Author: gthomas Date: Sun Jan 19 12:07:49 2014 New Revision: 199607 URL: http://llvm.org/viewvc/llvm-project?rev=199607&view=rev Log: Continue the aot. Modified: vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/lib/j3/vm/j3.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/j3trampoline.cc vmkit/branches/mcjit/lib/vmkit/vmkit.cc Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199607&r1=199606&r2=199607&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Sun Jan 19 12:07:49 2014 @@ -224,6 +224,8 @@ namespace j3 { public: J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes, J3ObjectHandle* protectionDomain, const char* source); + void aotCompile(); + J3ObjectHandle* clone(J3ObjectHandle* obj); size_t nbConstructors() { return _nbConstructors; } Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199607&r1=199606&r2=199607&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Sun Jan 19 12:07:49 2014 @@ -185,13 +185,13 @@ namespace j3 { llvm::Function* patchPoint64; llvm::Function* patchPointVoid; - J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* method, bool withMethod, bool withCaller); + J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* method, bool withMethod, bool withCaller, bool onlyTranslate); ~J3CodeGen(); void* operator new(size_t n, vmkit::BumpAllocator* _allocator); void operator delete(void* ptr); public: - static void translate(J3Method* method, bool withMethod=1, bool withCaller=1); + static void translate(J3Method* method, bool withMethod=1, bool withCaller=1, bool onlyTranslate=0); }; } Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=199607&r1=199606&r2=199607&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Sun Jan 19 12:07:49 2014 @@ -105,7 +105,8 @@ namespace j3 { J3Value invokeVirtual(J3ObjectHandle* obj, J3Value* args); J3Value invokeVirtual(J3ObjectHandle* obj, va_list va); - void ensureCompiled(bool withCaller); + void aotCompile(); + void ensureCompiled(bool withCaller, bool onlyTranslate=0); J3Signature::function_t cxxCaller(); void* fnPtr(); void* functionPointerOrStaticTrampoline(); 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=199607&r1=199606&r2=199607&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 19 12:07:49 2014 @@ -210,6 +210,8 @@ void J3::compileApplication() { J3Class* c = loader->getTypeFromQualified(0, buf)->asClass(); fprintf(stderr, " find: %s\n", c->name()->cStr()); + + c->aotCompile(); } } } 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=199607&r1=199606&r2=199607&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Jan 19 12:07:49 2014 @@ -321,6 +321,18 @@ J3Class::J3Class(J3ClassLoader* loader, status = LOADED; } +void J3Class::aotCompile() { + resolve(); + + for(uint32_t i=0; iaotCompile(); + } + + for(uint32_t i=0; inbMethods(); i++) { + staticLayout()->methods()[i]->aotCompile(); + } +} + uint16_t J3Class::modifiers() { return access(); #if 0 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=199607&r1=199606&r2=199607&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sun Jan 19 12:07:49 2014 @@ -28,7 +28,7 @@ using namespace j3; #define _onEndPoint() ({ if(onEndPoint()) return; }) -J3CodeGen::J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* m, bool withMethod, bool withCaller) : +J3CodeGen::J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* m, bool withMethod, bool withCaller, bool onlyTranslate) : exceptions(this) { allocator = _allocator; @@ -117,13 +117,14 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato if(needsCaller) signature->generateCallerIR(access, this, module, "generic-caller"); - loader->compileModule(module); + if(!onlyTranslate) + loader->compileModule(module); if(needsCaller) signature->setCaller(access, (J3Signature::function_t)loader->ee()->getFunctionAddress("generic-caller")); if(withMethod) { - void* fnPtr = (void*)loader->ee()->getFunctionAddress(llvmFunction->getName().data()); + void* fnPtr = onlyTranslate ? 0 : (void*)loader->ee()->getFunctionAddress(llvmFunction->getName().data()); method->markCompiled(llvmFunction, fnPtr); } } @@ -138,11 +139,11 @@ void* J3CodeGen::operator new(size_t n, void J3CodeGen::operator delete(void* ptr) { } -void J3CodeGen::translate(J3Method* method, bool withMethod, bool withCaller) { +void J3CodeGen::translate(J3Method* method, bool withMethod, bool withCaller, bool onlyTranslate) { J3Thread::get()->vm()->lockCompiler(); vmkit::BumpAllocator* allocator = vmkit::BumpAllocator::create(); - delete new(allocator) J3CodeGen(allocator, method, withMethod, withCaller); + delete new(allocator) J3CodeGen(allocator, method, withMethod, withCaller, onlyTranslate); vmkit::BumpAllocator::destroy(allocator); J3Thread::get()->vm()->unlockCompiler(); @@ -452,7 +453,6 @@ void J3CodeGen::invokeVirtual(uint32_t i void J3CodeGen::invokeStatic(uint32_t idx) { J3Method* target = cl->methodAt(idx, J3Cst::ACC_STATIC); - initialiseJ3ObjectType(target->cl()); invoke(J3Cst::ACC_STATIC, target, buildFunction(target)); } 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=199607&r1=199606&r2=199607&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sun Jan 19 12:07:49 2014 @@ -52,11 +52,15 @@ J3Signature::function_t J3Method::cxxCal return signature()->caller(access()); } -void J3Method::ensureCompiled(bool withCaller) { +void J3Method::aotCompile() { + fprintf(stderr, "compiling: %s::%s%s\n", cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr()); + ensureCompiled(0, 1); +} + +void J3Method::ensureCompiled(bool withCaller, bool onlyTranslate) { if(!fnPtr() || (withCaller && !cxxCaller())) { // fprintf(stderr, "materializing: %s::%s%s\n", this, cl()->name()->cStr(), name()->cStr(), signature()->cStr()); - cl()->initialise(); - J3CodeGen::translate(this, !fnPtr(), withCaller); + J3CodeGen::translate(this, !fnPtr(), withCaller, onlyTranslate); } } @@ -104,6 +108,7 @@ J3Method* J3Method::resolve(J3ObjectHand } J3Value J3Method::internalInvoke(J3ObjectHandle* handle, J3Value* inArgs) { + cl()->initialise(); ensureCompiled(1); /* force the generation of the code and thus of the functionType */ J3Value* reIn; @@ -127,6 +132,7 @@ J3Value J3Method::internalInvoke(J3Objec } J3Value J3Method::internalInvoke(J3ObjectHandle* handle, va_list va) { + cl()->initialise(); ensureCompiled(1); /* force the generation of the code and thus of the functionType */ llvm::FunctionType* fType = signature()->functionType(J3Cst::ACC_STATIC); /* static signature for va */ Modified: vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc?rev=199607&r1=199606&r2=199607&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Sun Jan 19 12:07:49 2014 @@ -39,6 +39,7 @@ void J3Trampoline::interfaceTrampoline(J void J3Trampoline::staticTrampoline(J3Object* obj, J3Method* target) { J3TrampolineArg arg = J3Thread::get()->_trampolineArg; + target->cl()->initialise(); target->ensureCompiled(0); trampoline_restart(target->fnPtr(), &arg); Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=199607&r1=199606&r2=199607&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Sun Jan 19 12:07:49 2014 @@ -37,7 +37,12 @@ VMKit::VMKit(vmkit::BumpAllocator* alloc llvm::llvm_start_multithreaded(); _allocator = allocator; pthread_mutex_init(&safepointMapLock, 0); + + //pthread_mutexattr_t attr; + //pthread_mutexattr_init(&attr); + //pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&_compilerLock, 0); + //pthread_mutexattr_destroy(&attr); } void* VMKit::operator new(size_t n, vmkit::BumpAllocator* allocator) { From gael.thomas at lip6.fr Sun Jan 19 07:37:33 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 19 Jan 2014 15:37:33 -0000 Subject: [vmkit-commits] [vmkit] r199603 - process some command line Message-ID: <20140119153733.632E02A6C03A@llvm.org> Author: gthomas Date: Sun Jan 19 09:37:33 2014 New Revision: 199603 URL: http://llvm.org/viewvc/llvm-project?rev=199603&view=rev Log: process some command line Modified: vmkit/branches/mcjit/include/j3/j3options.h vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc Modified: vmkit/branches/mcjit/include/j3/j3options.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3options.h?rev=199603&r1=199602&r2=199603&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3options.h (original) +++ vmkit/branches/mcjit/include/j3/j3options.h Sun Jan 19 09:37:33 2014 @@ -1,6 +1,7 @@ #ifndef _J3_CMD_LINE_H_ #define _J3_CMD_LINE_H_ +#include #include namespace j3 { @@ -33,6 +34,11 @@ namespace j3 { const char* classpath; + const char* jarFile; + const char* mainClass; + char** args; + size_t nbArgs; + bool debugEnterIndent; uint32_t genDebugExecute; uint32_t debugExecute; @@ -45,6 +51,8 @@ namespace j3 { uintptr_t stackSize; + bool isAOT; + J3Options(); void process(int argc, char** argv); 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=199603&r1=199602&r2=199603&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 19 09:37:33 2014 @@ -178,19 +178,37 @@ void J3::run() { //options()->debugExecute = 0; +#define LM_CLASS 1 +#define LM_JAR 2 + + uint32_t mode; + const char* what; + + if(options()->mainClass) { + mode = LM_CLASS; + what = options()->mainClass; + } else { + mode = LM_JAR; + what = options()->jarFile; + } + J3Class* main = J3ObjectType::nativeClass(z_method(J3Cst::ACC_STATIC, z_class("sun.launcher.LauncherHelper"), names()->get("checkAndLoadMain"), names()->get("(ZILjava/lang/String;)Ljava/lang/Class;")) - ->invokeStatic(1, 1, utfToString("HelloWorld")).valObject)->asClass(); + ->invokeStatic(1, mode, utfToString(what)).valObject)->asClass(); if(options()->debugLifeCycle) fprintf(stderr, " Launch the application\n"); + J3ObjectHandle* args = J3ObjectHandle::doNewArray(stringClass->getArray(), options()->nbArgs); + for(uint32_t i=0; inbArgs; i++) + args->setObjectAt(i, utfToString(options()->args[i])); + main ->findMethod(J3Cst::ACC_STATIC, names()->get("main"), initialClassLoader->getSignature(0, names()->get("([Ljava/lang/String;)V"))) - ->invokeStatic((J3ObjectHandle*)0); + ->invokeStatic(args); } JNIEnv* J3::jniEnv() { 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=199603&r1=199602&r2=199603&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Sun Jan 19 09:37:33 2014 @@ -11,21 +11,24 @@ using namespace j3; J3Options::J3Options() { assertionsEnabled = 1; selfBitCodePath = SELF_BITCODE; - classpath = "."; + classpath = getenv("CLASSPATH"); + classpath = classpath ? classpath : "."; debugEnterIndent = 1; - debugExecute = 1; + debugExecute = 0; debugLoad = 0; debugResolve = 0; debugIniting = 0; debugTranslate = 0; debugLinking = 0; - debugLifeCycle = 0; + debugLifeCycle = 1; - genDebugExecute = 1;//debugExecute ? 1 : 0; + genDebugExecute = 0;//debugExecute ? 1 : 0; stackSize = 0x80*0x1000; + + isAOT = 0; } #define nyi(cmd) ({ fprintf(stderr, "option '%s' not yet implemented\n", cmd); }) @@ -40,14 +43,15 @@ J3CmdLineParser::J3CmdLineParser(J3Optio #define optbeg(opt) (!memcmp(argv[cur], opt, strlen(opt))) void J3CmdLineParser::process() { + bool done = 0; cur = 1; - while(cur < argc) { + while(!done && cur < argc) { if(opteq("-jar")) { - nyi("-jar"); - return; + options->jarFile = argv[++cur]; + done = 1; } else if(opteq("-cp") || opteq("-classpath")) - nyi("-cp/-classpath"); + options->classpath = argv[++cur]; else if(optbeg("-D")) nyi("-D="); else if(opteq("-verbose:class")) @@ -70,6 +74,10 @@ void J3CmdLineParser::process() { nyi("-no-jre-restrict-search"); else if(opteq("-?") || opteq("-help")) help(); + else if(opteq("-Xaot")) + options->isAOT = 1; + else if(opteq("-Xno-aot")) + options->isAOT = 0; else if(optbeg("-X")) nyi("-X"); else if(optbeg("-ea:") || optbeg("-enableassertions:")) @@ -93,13 +101,18 @@ void J3CmdLineParser::process() { else if(optbeg("-")) help(); else { - nyi("class args"); - return; + options->mainClass = argv[cur]; + done = 1; } + cur++; } - help(); + if(!options->jarFile && !options->mainClass) + help(); + + options->args = argv + cur; + options->nbArgs = argc - cur; } void J3CmdLineParser::help() { From gael.thomas at lip6.fr Sun Jan 19 07:11:01 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 19 Jan 2014 15:11:01 -0000 Subject: [vmkit-commits] [vmkit] r199601 - Add the configuration option for the location of mmtk.jar Message-ID: <20140119151101.E79BE19BE015@llvm.org> Author: gthomas Date: Sun Jan 19 09:11:01 2014 New Revision: 199601 URL: http://llvm.org/viewvc/llvm-project?rev=199601&view=rev Log: Add the configuration option for the location of mmtk.jar Modified: vmkit/branches/mcjit/Makefile.config.in vmkit/branches/mcjit/autoconf/configure.ac vmkit/branches/mcjit/configure vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc Modified: vmkit/branches/mcjit/Makefile.config.in URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/Makefile.config.in?rev=199601&r1=199600&r2=199601&view=diff ============================================================================== --- vmkit/branches/mcjit/Makefile.config.in (original) +++ vmkit/branches/mcjit/Makefile.config.in Sun Jan 19 09:11:01 2014 @@ -31,4 +31,6 @@ LLVM_LDFLAGS=@LLVM_LDFLAGS@ OPENJDK_HOME=@jdkhome@ +MMTK_PATH=@mmtkpath@ + OS=@OS@ \ No newline at end of file Modified: vmkit/branches/mcjit/autoconf/configure.ac URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/autoconf/configure.ac?rev=199601&r1=199600&r2=199601&view=diff ============================================================================== --- vmkit/branches/mcjit/autoconf/configure.ac (original) +++ vmkit/branches/mcjit/autoconf/configure.ac Sun Jan 19 09:11:01 2014 @@ -207,7 +207,7 @@ dnl ************************************ AC_ARG_WITH(jdkhome, [AS_HELP_STRING(--with-jdkhome, - [Build J3 with OpenJDK JRE install (default is $JAVA_HOME or /usr/lib/java)])], + [JRE home (default is $JAVA_HOME)])], [[jdkhome=$with_jdkhome]], [[jdkhome=""]] ) @@ -222,6 +222,23 @@ fi AC_SUBST([jdkhome]) +dnl ************************************************************************** +dnl MMTk +dnl ************************************************************************** + +AC_ARG_WITH(mmtkpath, + [AS_HELP_STRING(--with-mmtkpath=path, + [MMTk path (use mmtk.jar)])], + [[mmtkpath=$with_mmtkpath]], + [[mmtkpath="`pwd`/mmtk.jar"]] +) + +if test ! -f "$mmtkpath"; then + AC_MSG_ERROR([Cannot find MMTk in '$mmtkpath']) +fi + +AC_SUBST([mmtkpath]) + dnl===-----------------------------------------------------------------------=== dnl=== dnl=== SECTION 4: Check for programs we need and that they are the right version Modified: vmkit/branches/mcjit/configure URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/configure?rev=199601&r1=199600&r2=199601&view=diff ============================================================================== --- vmkit/branches/mcjit/configure (original) +++ vmkit/branches/mcjit/configure Sun Jan 19 09:11:01 2014 @@ -608,6 +608,7 @@ CPPFLAGS LDFLAGS CFLAGS CC +mmtkpath jdkhome LLVM_LDFLAGS LLVM_LIBS @@ -681,6 +682,7 @@ with_llvm_config_path with_llvm_runtime_config_path with_clang_path with_jdkhome +with_mmtkpath ' ac_precious_vars='build_alias host_alias @@ -1319,8 +1321,8 @@ Optional Packages: llvm-runtime-config path (use llvm-config-path) --with-clang-path=path clang path (use llvm-config --bindir and then default path) - --with-jdkhome Build J3 with OpenJDK JRE install (default is - $JAVA_HOME or /usr/lib/java) + --with-jdkhome JRE home (default is $JAVA_HOME) + --with-mmtkpath=path MMTk path (use mmtk.jar) Some influential environment variables: CC C compiler command @@ -2183,6 +2185,23 @@ if test -z "$jdkhome"; then fi + + + +# Check whether --with-mmtkpath was given. +if test "${with_mmtkpath+set}" = set; then : + withval=$with_mmtkpath; mmtkpath=$with_mmtkpath +else + mmtkpath="`pwd`/mmtk.jar" + +fi + + +if test ! -f "$mmtkpath"; then + as_fn_error $? "Cannot find MMTk in '$mmtkpath'" "$LINENO" 5 +fi + + ac_ext=c ac_cpp='$CPP $CPPFLAGS' 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=199601&r1=199600&r2=199601&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 19 09:11:01 2014 @@ -169,12 +169,12 @@ void J3::run() { #undef defJavaClassPrimitive if(options()->debugLifeCycle) - fprintf(stderr, " Bootstraping the system library\n"); + fprintf(stderr, " Bootstrap the system library\n"); J3Lib::bootstrap(this); if(options()->debugLifeCycle) - fprintf(stderr, " Launching the application\n"); + fprintf(stderr, " Find the application\n"); //options()->debugExecute = 0; @@ -185,7 +185,8 @@ void J3::run() { ->invokeStatic(1, 1, utfToString("HelloWorld")).valObject)->asClass(); - fprintf(stderr, " main class: %s\n", main->name()->cStr()); + if(options()->debugLifeCycle) + fprintf(stderr, " Launch the application\n"); main ->findMethod(J3Cst::ACC_STATIC, names()->get("main"), initialClassLoader->getSignature(0, names()->get("([Ljava/lang/String;)V"))) 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=199601&r1=199600&r2=199601&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Sun Jan 19 09:11:01 2014 @@ -15,15 +15,15 @@ J3Options::J3Options() { debugEnterIndent = 1; - debugExecute = 0; + debugExecute = 1; debugLoad = 0; debugResolve = 0; debugIniting = 0; debugTranslate = 0; debugLinking = 0; - debugLifeCycle = 1; + debugLifeCycle = 0; - genDebugExecute = 0;//debugExecute ? 1 : 0; + genDebugExecute = 1;//debugExecute ? 1 : 0; stackSize = 0x80*0x1000; } From gael.thomas at lip6.fr Sun Jan 19 05:40:51 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 19 Jan 2014 13:40:51 -0000 Subject: [vmkit-commits] [vmkit] r199599 - Able to resolve the main method. Message-ID: <20140119134051.CAECD19BE015@llvm.org> Author: gthomas Date: Sun Jan 19 07:40:51 2014 New Revision: 199599 URL: http://llvm.org/viewvc/llvm-project?rev=199599&view=rev Log: Able to resolve the main method. Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3class.cc 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=199599&r1=199598&r2=199599&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 19 07:40:51 2014 @@ -178,13 +178,18 @@ void J3::run() { //options()->debugExecute = 0; - J3ObjectHandle* res = z_method(J3Cst::ACC_STATIC, - z_class("sun.launcher.LauncherHelper"), - names()->get("checkAndLoadMain"), - names()->get("(ZILjava/lang/String;)Ljava/lang/Class;")) - ->invokeStatic(1, 1, utfToString("HelloWorld")).valObject; + J3Class* main = J3ObjectType::nativeClass(z_method(J3Cst::ACC_STATIC, + z_class("sun.launcher.LauncherHelper"), + names()->get("checkAndLoadMain"), + names()->get("(ZILjava/lang/String;)Ljava/lang/Class;")) + ->invokeStatic(1, 1, utfToString("HelloWorld")).valObject)->asClass(); - fprintf(stderr, "system class loader: sysLoader: %p - %p\n", res, res->obj()); + + fprintf(stderr, " main class: %s\n", main->name()->cStr()); + + main + ->findMethod(J3Cst::ACC_STATIC, names()->get("main"), initialClassLoader->getSignature(0, names()->get("([Ljava/lang/String;)V"))) + ->invokeStatic((J3ObjectHandle*)0); } JNIEnv* J3::jniEnv() { 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=199599&r1=199598&r2=199599&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Jan 19 07:40:51 2014 @@ -170,7 +170,7 @@ llvm::Type* J3ObjectType::llvmType() { } J3Method* J3ObjectType::findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error) { - J3::internalError("should not happe: %s::%s\n", J3ObjectType::name()->cStr(), name->cStr()); + J3::internalError("should not happen - findMethod: %s::%s\n", J3ObjectType::name()->cStr(), name->cStr()); } J3ObjectType* J3ObjectType::nativeClass(J3ObjectHandle* handle) { @@ -282,14 +282,14 @@ uintptr_t J3Layout::structSize() { } J3Method* J3Layout::localFindMethod(const vmkit::Name* name, J3Signature* signature) { - //fprintf(stderr, " --- lookup %s::%s in %s\n", name->cStr(), signature->name()->cStr(), J3Layout::name()->cStr()); + //fprintf(stderr, " --- lookup %s%s in %s\n", name->cStr(), signature->name()->cStr(), J3Layout::name()->cStr()); for(size_t i=0; icl()->name()->cStr(), cur->name()->cStr(), cur->signature()->name()->cStr()); - if(cur->name() == name && cur->signature() == signature) { + if(cur->name() == name && cur->signature()->name() == signature->name()) { return cur; } } From gael.thomas at lip6.fr Sun Jan 19 05:58:22 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 19 Jan 2014 13:58:22 -0000 Subject: [vmkit-commits] [vmkit] r199600 - Execute the HelloWorld class, yipa! Message-ID: <20140119135822.83C5B2A6C03A@llvm.org> Author: gthomas Date: Sun Jan 19 07:58:22 2014 New Revision: 199600 URL: http://llvm.org/viewvc/llvm-project?rev=199600&view=rev Log: Execute the HelloWorld class, yipa! execute addSymbol in each compilationUnit because a class loader can reference symbols from another class loader. Modified: vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/lib/j3/vm/j3class.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=199600&r1=199599&r2=199600&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Sun Jan 19 07:58:22 2014 @@ -60,6 +60,9 @@ namespace j3 { public: J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, J3Signature* signature); + + J3MethodCode* selfCode() { return &_selfCode; } + uint32_t slot() { return _slot; } static J3Method* nativeMethod(J3ObjectHandle* handle); 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=199600&r1=199599&r2=199600&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Jan 19 07:58:22 2014 @@ -887,8 +887,6 @@ void J3Class::doNativeName() { _nativeName[_nativeNameLength-2] = '_'; _nativeName[_nativeNameLength-1] = '2'; _nativeName[_nativeNameLength] = 0; - - loader()->addSymbol(_nativeName, this); } /* @@ -958,13 +956,15 @@ void J3ArrayClass::doInitialise() { void J3ArrayClass::doNativeName() { uint32_t len = component()->nativeNameLength(); + _nativeNameLength = len + 2; _nativeName = (char*)loader()->allocator()->allocate(_nativeNameLength + 1); + _nativeName[0] = '_'; _nativeName[1] = '3'; + memcpy(_nativeName+2, component()->nativeName(), len); _nativeName[_nativeNameLength] = 0; - loader()->addSymbol(_nativeName, this); } /* 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=199600&r1=199599&r2=199600&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sun Jan 19 07:58:22 2014 @@ -204,17 +204,21 @@ llvm::Value* J3CodeGen::unflatten(llvm:: llvm::Function* J3CodeGen::buildFunction(J3Method* method, bool isStub) { const char* id = (isStub && !method->fnPtr()) ? method->llvmStubName(cl) : method->llvmFunctionName(cl); + loader->addSymbol(id, method->selfCode()); return (llvm::Function*)module->getOrInsertFunction(id, method->signature()->functionType(method->access())); } llvm::Value* J3CodeGen::typeDescriptor(J3ObjectType* objectType, llvm::Type* type) { - llvm::Value* v = module->getOrInsertGlobal(objectType->nativeName(), - vm->typeJ3ObjectType); + const char* id = objectType->nativeName(); + loader->addSymbol(id, objectType); + llvm::Value* v = module->getOrInsertGlobal(id, vm->typeJ3ObjectType); return type == vm->typeJ3ObjectTypePtr ? v : builder->CreateBitCast(v, type); } llvm::Value* J3CodeGen::methodDescriptor(J3Method* method) { - return module->getOrInsertGlobal(method->llvmDescriptorName(), vm->typeJ3Method); + const char* id = method->llvmDescriptorName(); + loader->addSymbol(id, method); + return module->getOrInsertGlobal(id, vm->typeJ3Method); } llvm::Value* J3CodeGen::spToCurrentThread(llvm::Value* sp) { 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=199600&r1=199599&r2=199600&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sun Jan 19 07:58:22 2014 @@ -213,10 +213,6 @@ void J3Method::buildLLVMNames(J3Class* f memcpy(_llvmAllNames, prefix, plen); memcpy(_llvmAllNames+plen, mangler.cStr(), mangler.length()); _llvmAllNames[length] = 0; - - cl()->loader()->addSymbol(_llvmAllNames+0, &_selfCode); - cl()->loader()->addSymbol(_llvmAllNames+4, this); - cl()->loader()->addSymbol(_llvmAllNames+plen, &_selfCode); } char* J3Method::llvmFunctionName(J3Class* from) { From gael.thomas at lip6.fr Sun Jan 19 04:01:26 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 19 Jan 2014 12:01:26 -0000 Subject: [vmkit-commits] [vmkit] r199588 - Able to find the main class. Message-ID: <20140119120126.6B6102A6C03A@llvm.org> Author: gthomas Date: Sun Jan 19 06:01:26 2014 New Revision: 199588 URL: http://llvm.org/viewvc/llvm-project?rev=199588&view=rev Log: Able to find the main class. Modified: vmkit/branches/mcjit/include/j3/j3.h vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199588&r1=199587&r2=199588&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Sun Jan 19 06:01:26 2014 @@ -72,7 +72,7 @@ namespace j3 { void* interfaceTrampoline; - J3Type** arrayInterfaces; + J3Class** arrayInterfaces; uint32_t nbArrayInterfaces; J3Class* objectClass; J3ArrayClass* charArrayClass; @@ -105,6 +105,11 @@ namespace j3 { J3Field* constructorClassSlot; J3Method* constructorClassInit; + J3Class* methodClass; + J3Field* methodClassClass; + J3Field* methodClassSlot; + J3Method* methodClassInit; + J3Field* throwableClassBacktrace; J3Class* stackTraceElementClass; Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199588&r1=199587&r2=199588&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Sun Jan 19 06:01:26 2014 @@ -125,7 +125,6 @@ namespace j3 { J3InterfaceSlotDescriptor* slotDescriptorAt(uint32_t index) { return &_interfaceSlotDescriptors[index]; } void prepareInterfaceTable(); - bool isObjectType() { return 1; } static J3ObjectType* nativeClass(J3ObjectHandle* 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=199588&r1=199587&r2=199588&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Jan 19 06:01:26 2014 @@ -788,11 +788,37 @@ jstring JNICALL JVM_GetClassName(JNIEnv* return res; } -jobjectArray JNICALL JVM_GetClassInterfaces(JNIEnv* env, jclass cls) { enterJVM(); leaveJVM(); NYI(); } +jobjectArray JNICALL JVM_GetClassInterfaces(JNIEnv* env, jclass cls) { + jobject res; + enterJVM(); + J3* vm = J3Thread::get()->vm(); + J3ObjectType* type = J3ObjectType::nativeClass(cls); + J3Class** interfaces; + uint32_t nbInterfaces; + + if(type->isClass()) { + J3Class* cl = type->asClass(); + interfaces = cl->interfaces(); + nbInterfaces = cl->nbInterfaces(); + } else { + interfaces = vm->arrayInterfaces; + nbInterfaces = vm->nbArrayInterfaces; + } + + res = J3ObjectHandle::doNewArray(vm->classClass->getArray(), nbInterfaces); + + for(uint32_t i=0; isetObjectAt(i, interfaces[i]->javaClass()); + + leaveJVM(); + + return res; +} + jobject JNICALL JVM_GetClassLoader(JNIEnv* env, jclass cls) { jobject res; enterJVM(); - res = J3Class::nativeClass(cls)->loader()->javaClassLoader(); + res = J3ObjectType::nativeClass(cls)->loader()->javaClassLoader(); leaveJVM(); return res; } @@ -876,7 +902,7 @@ jobjectArray JNICALL JVM_GetClassDeclare if(type->isClass()) { J3Class* cl = type->asClass(); cl->resolve(); - res = J3ObjectHandle::doNewArray(vm->constructorClass->getArray(), + res = J3ObjectHandle::doNewArray(vm->methodClass->getArray(), publicOnly ? cl->staticLayout()->nbPublicMethods() + cl->nbPublicMethods() - cl->nbPublicConstructors() : cl->staticLayout()->nbMethods() + cl->nbMethods() - cl->nbConstructors()); 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=199588&r1=199587&r2=199588&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 19 06:01:26 2014 @@ -106,7 +106,7 @@ void J3::run() { nbArrayInterfaces = 2; - arrayInterfaces = (J3Type**)initialClassLoader->allocator()->allocate(2*sizeof(J3Type*)); + arrayInterfaces = (J3Class**)initialClassLoader->allocator()->allocate(2*sizeof(J3Type*)); arrayInterfaces[0] = z_class("java.lang.Cloneable"); arrayInterfaces[1] = z_class("java.io.Serializable"); @@ -151,6 +151,12 @@ void J3::run() { constructorClassInit = z_method(0, constructorClass, initName, names()->get("(Ljava/lang/Class;[Ljava/lang/Class;[Ljava/lang/Class;IILjava/lang/String;[B[B)V")); + methodClass = z_class("java.lang.reflect.Method"); + methodClassClass = z_field(0, methodClass, "clazz", classClass); + methodClassSlot = z_field(0, methodClass, "slot", typeInteger); + methodClassInit = z_method(0, methodClass, initName, + names()->get("(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;Ljava/lang/Class;[Ljava/lang/Class;IILjava/lang/String;[B[B[B)V")); + throwableClassBacktrace = z_field(0, z_class("java.lang.Throwable"), "backtrace", objectClass); stackTraceElementClass = z_class("java.lang.StackTraceElement"); 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=199588&r1=199587&r2=199588&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sun Jan 19 06:01:26 2014 @@ -297,8 +297,24 @@ J3ObjectHandle* J3Method::javaMethod() { vm->nameToString(signature()->name(), 0), annotations, paramAnnotations); - } else - J3::internalError("implement me: javaMethod"); + } else { + J3ObjectHandle* annotationDefault = cl()->asClass()->extractAttribute(attributes()->lookup(vm->annotationDefaultAttribute)); + + _javaMethod = cl()->loader()->globalReferences()->add(J3ObjectHandle::doNewObject(vm->methodClass)); + + vm->methodClassInit->invokeSpecial(_javaMethod, + cl()->javaClass(0), + vm->nameToString(name(), 0), + parameters, + signature()->javaOut()->javaClass(0), + exceptions, + access(), + slot(), + vm->nameToString(signature()->name(), 0), + annotations, + paramAnnotations, + annotationDefault); + } J3Thread::get()->restore(prev); } From gael.thomas at lip6.fr Sun Jan 19 03:28:24 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 19 Jan 2014 11:28:24 -0000 Subject: [vmkit-commits] [vmkit] r199584 - App class loader seems ok. Message-ID: <20140119112824.D69702A6C03A@llvm.org> Author: gthomas Date: Sun Jan 19 05:28:24 2014 New Revision: 199584 URL: http://llvm.org/viewvc/llvm-project?rev=199584&view=rev Log: App class loader seems ok. Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc?rev=199584&r1=199583&r2=199584&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3lib.cc Sun Jan 19 05:28:24 2014 @@ -63,7 +63,7 @@ void J3Lib::bootstrap(J3* vm) { #define z_signature(id) vm->initialClassLoader->getSignature(0, vm->names()->get(id)) - J3Class* threadGroupClass = vm->initialClassLoader->loadClass(vm->names()->get("java/lang/ThreadGroup")); + J3Class* threadGroupClass = vm->initialClassLoader->loadClass(vm->names()->get("java.lang.ThreadGroup")); J3Method* sysThreadGroupInit = threadGroupClass->findMethod(0, vm->initName, z_signature("()V")); J3ObjectHandle* sysThreadGroup = J3ObjectHandle::doNewObject(threadGroupClass); sysThreadGroupInit->invokeSpecial(sysThreadGroup); @@ -81,7 +81,7 @@ void J3Lib::bootstrap(J3* vm) { threadInit->invokeSpecial(mainThread, appThreadGroup, vm->utfToString("main", 0)); vm->initialClassLoader - ->loadClass(vm->names()->get("java/lang/System")) + ->loadClass(vm->names()->get("java.lang.System")) ->findMethod(J3Cst::ACC_STATIC, vm->names()->get("initializeSystemClass"), z_signature("()V")) ->invokeStatic(); @@ -90,7 +90,7 @@ void J3Lib::bootstrap(J3* vm) { J3ObjectHandle* J3Lib::newDirectByteBuffer(void* address, size_t len) { J3* vm = J3Thread::get()->vm(); - J3Class* cl = vm->initialClassLoader->loadClass(vm->names()->get("java/nio/DirectByteBuffer")); + J3Class* cl = vm->initialClassLoader->loadClass(vm->names()->get("java.nio.DirectByteBuffer")); J3ObjectHandle* res = J3ObjectHandle::doNewObject(cl); cl->findMethod(0, vm->initName, vm->initialClassLoader->getSignature(0, vm->names()->get("(JI)V")))->invokeSpecial(res, address, len); return res; 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=199584&r1=199583&r2=199584&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original) +++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sun Jan 19 05:28:24 2014 @@ -703,7 +703,7 @@ jclass JNICALL JVM_FindClassFromBootLoad jclass res; enterJVM(); J3* vm = J3Thread::get()->vm(); - J3Class* cl = vm->initialClassLoader->findLoadedClass(vm->names()->get(name)); + J3ObjectType* cl = vm->initialClassLoader->getTypeFromQualified(0, name); res = cl ? cl->javaClass() : 0; leaveJVM(); return res; @@ -721,9 +721,10 @@ jclass JNICALL JVM_FindClassFromClassLoa if(jloader) J3::internalError("implement me: jloader"); J3ClassLoader* loader = J3Thread::get()->vm()->initialClassLoader; - const vmkit::Name* name = vm->names()->get(jname); - J3Class* cl = loader->loadClass(name); + J3ObjectType* cl = loader->getTypeFromQualified(0, jname); + if(!cl) { + const vmkit::Name* name = vm->names()->get(jname); if(throwError) J3::noClassDefFoundError(name); else 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=199584&r1=199583&r2=199584&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 19 05:28:24 2014 @@ -107,24 +107,24 @@ void J3::run() { nbArrayInterfaces = 2; arrayInterfaces = (J3Type**)initialClassLoader->allocator()->allocate(2*sizeof(J3Type*)); - arrayInterfaces[0] = z_class("java/lang/Cloneable"); - arrayInterfaces[1] = z_class("java/io/Serializable"); + arrayInterfaces[0] = z_class("java.lang.Cloneable"); + arrayInterfaces[1] = z_class("java.io.Serializable"); charArrayClass = typeCharacter->getArray(); - objectClass = z_class("java/lang/Object"); + objectClass = z_class("java.lang.Object"); objectClass->resolve(); - stringClass = z_class("java/lang/String"); + stringClass = z_class("java.lang.String"); stringClassInit = z_method(0, stringClass, initName, names()->get("([CZ)V")); stringClassValue = z_field(0, stringClass, "value", charArrayClass); - classClass = z_class("java/lang/Class"); + classClass = z_class("java.lang.Class"); J3Field vmData[] = { J3Field(J3Cst::ACC_PRIVATE, names()->get("** vmData **"), typeLong) }; classClass->resolve(vmData, 1); classClassInit = z_method(0, classClass, initName, names()->get("()V")); classClassVMData = classClass->findField(0, vmData[0].name(), vmData[0].type()); - classLoaderClass = z_class("java/lang/ClassLoader"); + classLoaderClass = z_class("java.lang.ClassLoader"); classLoaderClass->resolve(vmData, 1); classLoaderClassVMData = classLoaderClass->findField(0, vmData[0].name(), vmData[0].type()); classLoaderClassLoadClass = z_method(0, classLoaderClass, names()->get("loadClass"), @@ -134,26 +134,26 @@ void J3::run() { names()->get("getSystemClassLoader"), names()->get("()Ljava/lang/ClassLoader;")); - threadClass = z_class("java/lang/Thread"); + threadClass = z_class("java.lang.Thread"); threadClassRun = z_method(0, threadClass, names()->get("run"), names()->get("()V")); threadClassVMData = z_field(0, threadClass, "eetop", typeLong); - fieldClass = z_class("java/lang/reflect/Field"); + fieldClass = z_class("java.lang.reflect.Field"); fieldClassClass = z_field(0, fieldClass, "clazz", classClass); fieldClassSlot = z_field(0, fieldClass, "slot", typeInteger); fieldClassAccess = z_field(0, fieldClass, "modifiers", typeInteger); fieldClassInit = z_method(0, fieldClass, initName, names()->get("(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;IILjava/lang/String;[B)V")); - constructorClass = z_class("java/lang/reflect/Constructor"); + constructorClass = z_class("java.lang.reflect.Constructor"); constructorClassClass = z_field(0, constructorClass, "clazz", classClass); constructorClassSlot = z_field(0, constructorClass, "slot", typeInteger); constructorClassInit = z_method(0, constructorClass, initName, names()->get("(Ljava/lang/Class;[Ljava/lang/Class;[Ljava/lang/Class;IILjava/lang/String;[B[B)V")); - throwableClassBacktrace = z_field(0, z_class("java/lang/Throwable"), "backtrace", objectClass); + throwableClassBacktrace = z_field(0, z_class("java.lang.Throwable"), "backtrace", objectClass); - stackTraceElementClass = z_class("java/lang/StackTraceElement"); + stackTraceElementClass = z_class("java.lang.StackTraceElement"); stackTraceElementClassInit = z_method(0, stackTraceElementClass, initName, names()->get("(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V")); @@ -173,7 +173,7 @@ void J3::run() { //options()->debugExecute = 0; J3ObjectHandle* res = z_method(J3Cst::ACC_STATIC, - z_class("sun/launcher/LauncherHelper"), + z_class("sun.launcher.LauncherHelper"), names()->get("checkAndLoadMain"), names()->get("(ZILjava/lang/String;)Ljava/lang/Class;")) ->invokeStatic(1, 1, utfToString("HelloWorld")).valObject; 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=199584&r1=199583&r2=199584&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sun Jan 19 05:28:24 2014 @@ -152,7 +152,7 @@ J3Type* J3ClassLoader::getTypeInternal(J memset(buf, 0, len + 1 - pos); for(; pos < len && (c = type[pos]) != J3Cst::ID_End; pos++) - buf[pos - start] = c; + buf[pos - start] = c == '/' ? '.' : c; if(type[pos] != J3Cst::ID_End) wrongType(from, type, len); @@ -213,8 +213,10 @@ J3ObjectType* J3ClassLoader::getTypeFrom return getTypeFromDescriptor(from, J3Thread::get()->vm()->names()->get(type, 0, length))->asObjectType(); else { char buf[length+1]; - for(size_t i=0; ivm()->names()->get(buf)); } Modified: vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc?rev=199584&r1=199583&r2=199584&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3mangler.cc Sun Jan 19 05:28:24 2014 @@ -99,6 +99,7 @@ J3Mangler* J3Mangler::mangle(uint16_t c) *cur++ = '_'; *cur++ = '3'; break; + case '.': case '/': c = '_'; default: From gael.thomas at lip6.fr Sun Jan 19 03:02:14 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 19 Jan 2014 11:02:14 -0000 Subject: [vmkit-commits] [vmkit] r199581 - Rationalizes the ClassLoader::getType* functions (Java is irrational:)) Message-ID: <20140119110214.A27372A6C03A@llvm.org> Author: gthomas Date: Sun Jan 19 05:02:13 2014 New Revision: 199581 URL: http://llvm.org/viewvc/llvm-project?rev=199581&view=rev Log: Rationalizes the ClassLoader::getType* functions (Java is irrational:)) 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/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/j3jni.cc vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199581&r1=199580&r2=199581&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Sun Jan 19 05:02:13 2014 @@ -88,6 +88,7 @@ namespace j3 { J3Class* classLoaderClass; J3Field* classLoaderClassVMData; J3Method* classLoaderClassLoadClass; + J3Method* classLoaderClassGetSystemClassLoader; J3Class* threadClass; J3Field* threadClassVMData; Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199581&r1=199580&r2=199581&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Sun Jan 19 05:02:13 2014 @@ -247,6 +247,7 @@ namespace j3 { uint8_t getCtpType(uint16_t idx); void* getCtpResolved(uint16_t idx); + void utfAt(uint16_t idx, const char** buf, size_t* length); const vmkit::Name* nameAt(uint16_t idx); float floatAt(uint16_t idx); double doubleAt(uint16_t idx); Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=199581&r1=199580&r2=199581&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Sun Jan 19 05:02:13 2014 @@ -57,10 +57,12 @@ namespace j3 { void addNativeLibrary(void* handle); - J3Type* getTypeInternal(J3ObjectType* from, const vmkit::Name* type, uint32_t start, uint32_t* end, bool unify); - J3Type* getType(J3ObjectType* from, const vmkit::Name* type); /* find a type */ + J3Type* getTypeInternal(J3ObjectType* from, const char* type, + size_t start, size_t len, size_t* end, bool unify); + J3Type* getTypeFromDescriptor(J3ObjectType* from, const vmkit::Name* type); /* find a type */ + J3ObjectType* getTypeFromQualified(J3ObjectType* from, const char* type, size_t length=-1); /* find a type */ J3Signature* getSignature(J3ObjectType* from, const vmkit::Name* signature); /* get a method type */ - void wrongType(J3ObjectType* from, const vmkit::Name* type); + void wrongType(J3ObjectType* from, const char* type, size_t length); uint32_t interfaceIndex(J3Method* signature); 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=199581&r1=199580&r2=199581&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 19 05:02:13 2014 @@ -129,6 +129,10 @@ void J3::run() { classLoaderClassVMData = classLoaderClass->findField(0, vmData[0].name(), vmData[0].type()); classLoaderClassLoadClass = z_method(0, classLoaderClass, names()->get("loadClass"), names()->get("(Ljava/lang/String;)Ljava/lang/Class;")); + classLoaderClassGetSystemClassLoader = z_method(J3Cst::ACC_STATIC, + classLoaderClass, + names()->get("getSystemClassLoader"), + names()->get("()Ljava/lang/ClassLoader;")); threadClass = z_class("java/lang/Thread"); threadClassRun = z_method(0, threadClass, names()->get("run"), names()->get("()V")); @@ -168,14 +172,6 @@ void J3::run() { //options()->debugExecute = 0; -#if 0 - J3Class* loaderClass = z_class("java/lang/ClassLoader"); - J3ObjectHandle* sysLoader = z_method(J3Cst::ACC_STATIC, - loaderClass, - names()->get("getSystemClassLoader"), - names()->get("()Ljava/lang/ClassLoader;"))->invokeStatic().valObject; -#else - J3ObjectHandle* res = z_method(J3Cst::ACC_STATIC, z_class("sun/launcher/LauncherHelper"), names()->get("checkAndLoadMain"), @@ -183,7 +179,6 @@ void J3::run() { ->invokeStatic(1, 1, utfToString("HelloWorld")).valObject; fprintf(stderr, "system class loader: sysLoader: %p - %p\n", res, res->obj()); -#endif } JNIEnv* J3::jniEnv() { 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=199581&r1=199580&r2=199581&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Jan 19 05:02:13 2014 @@ -598,7 +598,7 @@ void J3Class::readClassBytes(J3Field* hi } else { f->_access = reader.readU2(); f->_name = nameAt(reader.readU2()); - f->_type = loader()->getType(this, nameAt(reader.readU2())); + f->_type = loader()->getTypeFromDescriptor(this, nameAt(reader.readU2())); f->_attributes = readAttributes(&reader); } @@ -814,7 +814,7 @@ J3Field* J3Class::fieldAt(uint16_t idx, J3Type* type = (J3Type*)ctpResolved[ntIdx]; if(!type) - ctpResolved[ntIdx] = type = loader()->getType(this, nameAt(ctpValues[ntIdx] & 0xffff)); + ctpResolved[ntIdx] = type = loader()->getTypeFromDescriptor(this, nameAt(ctpValues[ntIdx] & 0xffff)); res = cl->findField(access, name, type); @@ -827,18 +827,30 @@ J3ObjectType* J3Class::classAt(uint16_t if(res) return res; - - const vmkit::Name* name = nameAt(ctpValues[idx]); - if(name->cStr()[0] == J3Cst::ID_Array) - res = loader()->getType(this, name)->asObjectType(); - else - res = loader()->loadClass(name); + + const char* buf; + size_t length; + + utfAt(ctpValues[idx], &buf, &length); + + res = loader()->getTypeFromQualified(this, buf, length); ctpResolved[idx] = res; return res; } +void J3Class::utfAt(uint16_t idx, const char** buf, size_t* length) { + check(idx, J3Cst::CONSTANT_Utf8); + + J3Reader reader(_bytes); + + reader.seek(ctpValues[idx], reader.SeekSet); + + *length = reader.readU2(); + *buf = (const char*)reader.pointer(); +} + const vmkit::Name* J3Class::nameAt(uint16_t idx) { check(idx, J3Cst::CONSTANT_Utf8); const vmkit::Name* res = (const vmkit::Name*)ctpResolved[idx]; @@ -846,13 +858,11 @@ const vmkit::Name* J3Class::nameAt(uint if(res) return res; - J3Reader reader(_bytes); - - reader.seek(ctpValues[idx], reader.SeekSet); - - uint16_t len = reader.readU2(), i=0, n=0; + const char* buf; + size_t length; + utfAt(idx, &buf, &length); - res = J3Thread::get()->vm()->names()->get((const char*)reader.pointer(), 0, len); + res = J3Thread::get()->vm()->names()->get(buf, 0, length);//(const char*)reader.pointer(), 0, len); ctpResolved[idx] = (void*)res; 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=199581&r1=199580&r2=199581&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sun Jan 19 05:02:13 2014 @@ -114,21 +114,20 @@ J3Class* J3ClassLoader::loadClass(const return J3Class::nativeClass(vm->classLoaderClassLoadClass->invokeVirtual(_javaClassLoader, vm->nameToString(name)).valObject)->asClass(); } -void J3ClassLoader::wrongType(J3ObjectType* from, const vmkit::Name* type) { - J3::classFormatError(from, "wrong type: %s", type->cStr()); +void J3ClassLoader::wrongType(J3ObjectType* from, const char* type, size_t length) { + J3::classFormatError(from, "wrong type: %s", J3Thread::get()->vm()->names()->get(type, 0, length)); } -J3Type* J3ClassLoader::getTypeInternal(J3ObjectType* from, const vmkit::Name* typeName, uint32_t start, uint32_t* pend, bool unify) { +J3Type* J3ClassLoader::getTypeInternal(J3ObjectType* from, const char* type, + size_t start, size_t len, size_t* pend, bool unify) { J3* vm = J3Thread::get()->vm(); J3Type* res = 0; - const char* type = typeName->cStr(); - uint32_t len = typeName->length(); uint32_t pos = start; uint32_t prof = 0; while(!res) { if(pos >= len) - wrongType(from, typeName); + wrongType(from, type, len); switch(type[pos]) { case J3Cst::ID_Array: prof++; pos++; break; @@ -138,16 +137,16 @@ J3Type* J3ClassLoader::getTypeInternal(J #undef doIt case J3Cst::ID_Classname: if(unify) { - uint32_t start = ++pos; + size_t start = ++pos; for(; pos < len && type[pos] != J3Cst::ID_End; pos++); if(type[pos] != J3Cst::ID_End) - wrongType(from, typeName); + wrongType(from, type, len); pos++; res = vm->objectClass; } else { - uint32_t start = ++pos; + size_t start = ++pos; char buf[len + 1 - start], c; memset(buf, 0, len + 1 - pos); @@ -156,7 +155,7 @@ J3Type* J3ClassLoader::getTypeInternal(J buf[pos - start] = c; if(type[pos] != J3Cst::ID_End) - wrongType(from, typeName); + wrongType(from, type, len); buf[pos++ - start] = 0; @@ -166,7 +165,7 @@ J3Type* J3ClassLoader::getTypeInternal(J case J3Cst::ID_Left: case J3Cst::ID_Right: default: - wrongType(from, typeName); + wrongType(from, type, len); } } @@ -176,34 +175,50 @@ J3Type* J3ClassLoader::getTypeInternal(J if(unify) res = vm->objectClass; else - res = res->getArray(prof, start ? 0 : typeName); + res = res->getArray(prof); } return res; } -J3Type* J3ClassLoader::getType(J3ObjectType* from, const vmkit::Name* type) { +J3Type* J3ClassLoader::getTypeFromDescriptor(J3ObjectType* from, const vmkit::Name* typeName) { pthread_mutex_lock(&_mutexTypes); - J3Type* res = types[type]; + J3Type* res = types[typeName]; pthread_mutex_unlock(&_mutexTypes); if(!res) { - uint32_t end; - res = getTypeInternal(from, type, 0, &end, 0); + const char* type = typeName->cStr(); + size_t length = typeName->length(); + size_t end; + res = getTypeInternal(from, type, 0, length, &end, 0); - if(end != type->length()) - wrongType(from, type); + if(end != length) + wrongType(from, type, length); //printf("Analyse %s => %ls\n", type->cStr(), res->name()->cStr()); pthread_mutex_lock(&_mutexTypes); - types[type] = res; + types[typeName] = res; pthread_mutex_unlock(&_mutexTypes); } return res; } +J3ObjectType* J3ClassLoader::getTypeFromQualified(J3ObjectType* from, const char* type, size_t length) { + if(length == -1) + length = strlen(type); + + if(type[0] == J3Cst::ID_Array) + return getTypeFromDescriptor(from, J3Thread::get()->vm()->names()->get(type, 0, length))->asObjectType(); + else { + char buf[length+1]; + for(size_t i=0; ivm()->names()->get(buf)); + } +} J3Signature* J3ClassLoader::getSignature(J3ObjectType* from, const vmkit::Name* signature) { pthread_mutex_lock(&_mutexMethodTypes); 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=199581&r1=199580&r2=199581&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sun Jan 19 05:02:13 2014 @@ -18,14 +18,16 @@ jint JNICALL GetVersion(JNIEnv* env) { } jclass JNICALL DefineClass(JNIEnv* env, const char* name, jobject loader, const jbyte* buf, jsize len) { enterJVM(); leaveJVM(); NYI(); } + jclass JNICALL FindClass(JNIEnv* env, const char* name) { jclass res; enterJVM(); J3Method* m = J3Thread::get()->getJavaCaller(); J3* vm = J3Thread::get()->vm(); - J3ClassLoader* loader = m ? m->cl()->loader() : vm->initialClassLoader; - J3Class* cl = loader->loadClass(vm->names()->get(name)); + J3ClassLoader* loader = m ? m->cl()->loader() : + J3ClassLoader::nativeClassLoader(vm->classLoaderClassGetSystemClassLoader->invokeStatic().valObject); + J3ObjectType* cl = loader->getTypeFromQualified(m ? m->cl() : 0, name); cl->initialise(); res = cl->javaClass(); leaveJVM(); @@ -394,7 +396,7 @@ jfieldID JNICALL GetFieldID(JNIEnv* env, enterJVM(); J3* vm = J3Thread::get()->vm(); J3Class* cl = J3ObjectType::nativeClass(clazz)->asClass(); - res = cl->findField(0, vm->names()->get(name), cl->loader()->getType(cl, vm->names()->get(sig)), 0); + res = cl->findField(0, vm->names()->get(name), cl->loader()->getTypeFromDescriptor(cl, vm->names()->get(sig)), 0); leaveJVM(); return res; } @@ -404,7 +406,7 @@ jfieldID JNICALL GetStaticFieldID(JNIEnv enterJVM(); J3* vm = J3Thread::get()->vm(); J3Class* cl = J3ObjectType::nativeClass(clazz)->asClass(); - res = cl->findField(J3Cst::ACC_STATIC, vm->names()->get(name), cl->loader()->getType(cl, vm->names()->get(sig)), 0); + res = cl->findField(J3Cst::ACC_STATIC, vm->names()->get(name), cl->loader()->getTypeFromDescriptor(cl, vm->names()->get(sig)), 0); leaveJVM(); return res; } Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=199581&r1=199580&r2=199581&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Sun Jan 19 05:02:13 2014 @@ -22,13 +22,15 @@ void J3Signature::checkInOut() { if(!_out) { J3Type* args[1+name()->length()]; uint32_t nbArgs = 0; - uint32_t cur = 1; + size_t cur = 1; + const char* type = name()->cStr(); + size_t length = name()->length(); if(name()->cStr()[0] != J3Cst::ID_Left) - loader()->wrongType(0, name()); + loader()->wrongType(0, type, length); while(name()->cStr()[cur] != J3Cst::ID_Right) - args[nbArgs++] = loader()->getTypeInternal(0, name(), cur, &cur, 0); + args[nbArgs++] = loader()->getTypeInternal(0, type, cur, length, &cur, 0); if(nbArgs != nbIns()) J3::internalError("should not happen %d %d", nbArgs, nbIns()); @@ -36,9 +38,9 @@ void J3Signature::checkInOut() { _ins = (J3Type**)loader()->allocator()->allocate(nbArgs*sizeof(J3Type*)); memcpy(_ins, args, nbArgs*sizeof(J3Type*)); - _out = loader()->getTypeInternal(0, name(), cur+1, &cur, 0); /* out has to be the last (thread safety) */ - if(cur != name()->length()) - loader()->wrongType(0, name()); + _out = loader()->getTypeInternal(0, type, cur+1, length, &cur, 0); /* out has to be the last (thread safety) */ + if(cur != length) + loader()->wrongType(0, type, length); } } @@ -56,20 +58,22 @@ void J3Signature::checkFunctionType() { if(!_virtualLLVMSignature) { std::vector vins; std::vector sins; - uint32_t cur = 1; + size_t cur = 1; + const char* type = name()->cStr(); + size_t length = name()->length(); vins.push_back(J3Thread::get()->vm()->objectClass->llvmType()); - if(name()->cStr()[0] != J3Cst::ID_Left) - loader()->wrongType(0, name()); + if(type[0] != J3Cst::ID_Left) + loader()->wrongType(0, type, length); while(name()->cStr()[cur] != J3Cst::ID_Right) { - llvm::Type* in = loader()->getTypeInternal(0, name(), cur, &cur, 1)->llvmType(); + llvm::Type* in = loader()->getTypeInternal(0, type, cur, length, &cur, 1)->llvmType(); sins.push_back(in); vins.push_back(in); } - llvm::Type* out = loader()->getTypeInternal(0, name(), cur+1, &cur, 1)->llvmType(); + llvm::Type* out = loader()->getTypeInternal(0, type, cur+1, length, &cur, 1)->llvmType(); _staticLLVMSignature = buildLLVMSignature(llvm::FunctionType::get(out, sins, 0)); _virtualLLVMSignature = buildLLVMSignature(llvm::FunctionType::get(out, vins, 0)); From gael.thomas at lip6.fr Mon Jan 20 01:53:24 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 20 Jan 2014 09:53:24 -0000 Subject: [vmkit-commits] [vmkit] r199634 - Refactor the constructor of J3CodeGen and its IRBuilder definition. Message-ID: <20140120095324.5FAE03128078@llvm.org> Author: gthomas Date: Mon Jan 20 03:53:23 2014 New Revision: 199634 URL: http://llvm.org/viewvc/llvm-project?rev=199634&view=rev Log: Refactor the constructor of J3CodeGen and its IRBuilder definition. Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199634&r1=199633&r2=199634&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Mon Jan 20 03:53:23 2014 @@ -44,7 +44,7 @@ namespace j3 { vmkit::BumpAllocator* allocator; llvm::Module* module; llvm::BasicBlock* bb; - llvm::IRBuilder<>* builder; + llvm::IRBuilder<> builder; llvm::Function* llvmFunction; J3* vm; Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc?rev=199634&r1=199633&r2=199634&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc Mon Jan 20 03:53:23 2014 @@ -102,32 +102,32 @@ void J3CodeGen::echoElement(uint32_t lev void J3CodeGen::genEchoElement(const char* msg, uint32_t idx, llvm::Value* val) { llvm::Type* t = val->getType(); - builder->CreateCall3(funcEchoDebugExecute, - builder->getInt32(4), + builder.CreateCall3(funcEchoDebugExecute, + builder.getInt32(4), buildString(msg), - builder->getInt32(idx)); + builder.getInt32(idx)); if(t->isIntegerTy()) - builder->CreateCall3(funcEchoElement, - builder->getInt32(4), - builder->getInt32(DEBUG_TYPE_INT), - builder->CreateSExtOrBitCast(val, uintPtrTy)); + builder.CreateCall3(funcEchoElement, + builder.getInt32(4), + builder.getInt32(DEBUG_TYPE_INT), + builder.CreateSExtOrBitCast(val, uintPtrTy)); else if(t->isPointerTy()) - builder->CreateCall3(funcEchoElement, - builder->getInt32(4), - builder->getInt32(DEBUG_TYPE_OBJECT), - builder->CreatePtrToInt(val, uintPtrTy)); + builder.CreateCall3(funcEchoElement, + builder.getInt32(4), + builder.getInt32(DEBUG_TYPE_OBJECT), + builder.CreatePtrToInt(val, uintPtrTy)); else { - val = builder->CreateFPExt(val, builder->getDoubleTy()); - llvm::Value* loc = builder->CreateAlloca(val->getType()); - builder->CreateStore(val, loc); - builder->CreateCall3(funcEchoElement, - builder->getInt32(4), - builder->getInt32(DEBUG_TYPE_FLOAT), - builder->CreateLoad(builder->CreateBitCast(loc, uintPtrTy->getPointerTo()))); + val = builder.CreateFPExt(val, builder.getDoubleTy()); + llvm::Value* loc = builder.CreateAlloca(val->getType()); + builder.CreateStore(val, loc); + builder.CreateCall3(funcEchoElement, + builder.getInt32(4), + builder.getInt32(DEBUG_TYPE_FLOAT), + builder.CreateLoad(builder.CreateBitCast(loc, uintPtrTy->getPointerTo()))); } - builder->CreateCall2(funcEchoDebugExecute, - builder->getInt32(4), + builder.CreateCall2(funcEchoDebugExecute, + builder.getInt32(4), buildString("\n")); } @@ -136,14 +136,14 @@ void J3CodeGen::genDebugOpcode() { llvm::BasicBlock* debug = newBB("debug"); llvm::BasicBlock* after = newBB("after"); builder - ->CreateCondBr(builder - ->CreateICmpSGT(builder->CreateLoad(builder - ->CreateIntToPtr(llvm::ConstantInt::get(uintPtrTy, - (uintptr_t)&vm->options()->debugExecute), - uintPtrTy->getPointerTo())), - llvm::ConstantInt::get(uintPtrTy, 0)), - debug, after); - builder->SetInsertPoint(debug); + .CreateCondBr(builder + .CreateICmpSGT(builder.CreateLoad(builder + .CreateIntToPtr(llvm::ConstantInt::get(uintPtrTy, + (uintptr_t)&vm->options()->debugExecute), + uintPtrTy->getPointerTo())), + llvm::ConstantInt::get(uintPtrTy, 0)), + debug, after); + builder.SetInsertPoint(debug); if(vm->options()->genDebugExecute > 1) { for(uint32_t i=0; iname()->cStr(), method->name()->cStr()); - builder->CreateCall3(funcEchoDebugExecute, - builder->getInt32(2), + builder.CreateCall3(funcEchoDebugExecute, + builder.getInt32(2), buildString("%s\n"), buildString(buf)); - builder->CreateBr(after); - builder->SetInsertPoint(bb = after); + builder.CreateBr(after); + builder.SetInsertPoint(bb = after); } } @@ -169,15 +169,15 @@ void J3CodeGen::genDebugEnterLeave(bool if(isLeave) { char buf[256]; snprintf(buf, 256, "%s::%s", cl->name()->cStr(), method->name()->cStr()); - builder->CreateCall3(funcEchoDebugEnter, - builder->getInt32(1), + builder.CreateCall3(funcEchoDebugEnter, + builder.getInt32(1), buildString("%s\n"), buildString(buf)); } else { char buf[256]; snprintf(buf, 256, "%s::%s", cl->name()->cStr(), method->name()->cStr()); - builder->CreateCall3(funcEchoDebugEnter, - builder->getInt32(0), + builder.CreateCall3(funcEchoDebugEnter, + builder.getInt32(0), buildString("%s\n"), buildString(buf)); 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=199634&r1=199633&r2=199634&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Mon Jan 20 03:53:23 2014 @@ -29,8 +29,9 @@ using namespace j3; #define _onEndPoint() ({ if(onEndPoint()) return; }) J3CodeGen::J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* m, bool withMethod, bool withCaller, bool onlyTranslate) : + builder(J3Thread::get()->vm()->llvmContext()), exceptions(this) { - + allocator = _allocator; method = m; @@ -55,7 +56,7 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato method->name()->cStr(), method->signature()->name()->cStr()); - module = new llvm::Module(method->llvmFunctionName(), vm->llvmContext()); + module = new llvm::Module(method->llvmFunctionName(), builder.getContext()); llvmFunction = buildFunction(method, 0); llvmFunction->setGC("vmkit"); @@ -64,12 +65,8 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato topPendingBranchs = 0; isWide = 0; - bb = newBB("entry"); - llvm::IRBuilder<> _builder(bb); - - builder = &_builder; - - uintPtrTy = builder->getIntPtrTy(vm->dataLayout()); + uintPtrTy = vm->dataLayout()->getIntPtrType(module->getContext()); + nullValue = llvm::ConstantPointerNull::get((llvm::PointerType*)vm->typeJ3ObjectPtr); #define _x(name, id) \ name = vm->introspectFunction(module, id); @@ -87,22 +84,22 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato //patchPointVoid = llvm::Intrinsic::getDeclaration(module, llvm::Intrinsic::experimental_patchpoint_i64); { llvm::Type* ins[] = { - builder->getInt64Ty(), - builder->getInt32Ty(), - builder->getInt8PtrTy(), - builder->getInt32Ty() + builder.getInt64Ty(), + builder.getInt32Ty(), + builder.getInt8PtrTy(), + builder.getInt32Ty() }; patchPointVoid = (llvm::Function*) module->getOrInsertFunction(llvm::Intrinsic::getName(llvm::Intrinsic::experimental_patchpoint_void), - llvm::FunctionType::get(builder->getVoidTy(), ins, 1)); + llvm::FunctionType::get(builder.getVoidTy(), ins, 1)); } #endif - nullValue = builder - ->CreateIntToPtr(llvm::ConstantInt::get(uintPtrTy, (uintptr_t)0), - vm->typeJ3ObjectPtr); - if(withMethod) { + bb = newBB("entry"); + + builder.SetInsertPoint(bb); + if(J3Cst::isNative(method->access())) generateNative(); else @@ -173,9 +170,9 @@ llvm::Value* J3CodeGen::flatten(llvm::Va (type->isPointerTy() && (v->getType() == vm->typeJ3ObjectPtr))) return v; else if(type == vm->typeBoolean->llvmType() || type == vm->typeByte->llvmType() || type == vm->typeShort->llvmType()) - return builder->CreateSExt(v, vm->typeInteger->llvmType()); + return builder.CreateSExt(v, vm->typeInteger->llvmType()); else if(type == vm->typeCharacter->llvmType()) - return builder->CreateZExt(v, vm->typeInteger->llvmType()); + return builder.CreateZExt(v, vm->typeInteger->llvmType()); fprintf(stderr, " v: "); v->getType()->dump(); @@ -191,9 +188,9 @@ llvm::Value* J3CodeGen::unflatten(llvm:: (type->isPointerTy() && type == v->getType())) return v; else if(type == vm->typeBoolean->llvmType() || type == vm->typeByte->llvmType() || type == vm->typeShort->llvmType()) - return builder->CreateSExtOrTrunc(v, type); + return builder.CreateSExtOrTrunc(v, type); else if(type == vm->typeCharacter->llvmType()) - return builder->CreateZExtOrTrunc(v, type); + return builder.CreateZExtOrTrunc(v, type); fprintf(stderr, " v: "); v->getType()->dump(); @@ -213,24 +210,24 @@ llvm::Value* J3CodeGen::typeDescriptor(J const char* id = objectType->nativeName(); loader->addSymbol(id, objectType); llvm::Value* v = module->getOrInsertGlobal(id, vm->typeJ3ObjectType); - return type == vm->typeJ3ObjectTypePtr ? v : builder->CreateBitCast(v, type); + return type == vm->typeJ3ObjectTypePtr ? v : builder.CreateBitCast(v, type); } llvm::Value* J3CodeGen::spToCurrentThread(llvm::Value* sp) { - return builder->CreateIntToPtr(builder->CreateAnd(builder->CreatePtrToInt(sp, uintPtrTy), + return builder.CreateIntToPtr(builder.CreateAnd(builder.CreatePtrToInt(sp, uintPtrTy), llvm::ConstantInt::get(uintPtrTy, vmkit::Thread::getThreadMask())), vm->typeJ3Thread); } llvm::Value* J3CodeGen::currentThread() { - return spToCurrentThread(builder->CreateCall(frameAddress, builder->getInt32(0))); + return spToCurrentThread(builder.CreateCall(frameAddress, builder.getInt32(0))); } void J3CodeGen::monitorEnter(llvm::Value* obj) { llvm::Type* recordTy = vm->typeJ3LockRecord; llvm::Type* recordPtrTy = vm->typeJ3LockRecord->getPointerTo(); - llvm::AllocaInst* recordPtr = builder->CreateAlloca(recordPtrTy); + llvm::AllocaInst* recordPtr = builder.CreateAlloca(recordPtrTy); llvm::BasicBlock* ok = forwardBranch("lock-ok", codeReader->tell(), 0, 0); llvm::BasicBlock* stackLocked = newBB("stack-locked"); @@ -238,41 +235,41 @@ void J3CodeGen::monitorEnter(llvm::Value llvm::BasicBlock* stackFail = newBB("stack-lock-fail"); /* already stack locked by myself? */ - llvm::Value* gepH[] = { builder->getInt32(0), builder->getInt32(J3Object::gepHeader) }; - llvm::Value* headerPtr = builder->CreateGEP(obj, gepH); - llvm::Value* header = builder->CreateLoad(headerPtr); + llvm::Value* gepH[] = { builder.getInt32(0), builder.getInt32(J3Object::gepHeader) }; + llvm::Value* headerPtr = builder.CreateGEP(obj, gepH); + llvm::Value* header = builder.CreateLoad(headerPtr); - builder->CreateStore(builder->CreateIntToPtr(header, recordPtrTy), recordPtr); - builder->CreateCondBr(builder->CreateICmpEQ(currentThread(), spToCurrentThread(header)), + builder.CreateStore(builder.CreateIntToPtr(header, recordPtrTy), recordPtr); + builder.CreateCondBr(builder.CreateICmpEQ(currentThread(), spToCurrentThread(header)), stackLocked, tryStackLock); /* try to stack lock */ - builder->SetInsertPoint(tryStackLock); - llvm::AllocaInst* record = builder->CreateAlloca(recordTy); - builder->CreateStore(record, recordPtr); - llvm::Value* gepR[] = { builder->getInt32(0), builder->getInt32(J3LockRecord::gepHeader) }; - builder->CreateStore(header, builder->CreateGEP(record, gepR)); - llvm::Value* gepC[] = { builder->getInt32(0), builder->getInt32(J3LockRecord::gepLockCount) }; - builder->CreateStore(builder->getInt32(0), builder->CreateGEP(record, gepC)); - llvm::Value* orig = builder->CreateOr(builder->CreateAnd(header, llvm::ConstantInt::get(uintPtrTy, ~6)), + builder.SetInsertPoint(tryStackLock); + llvm::AllocaInst* record = builder.CreateAlloca(recordTy); + builder.CreateStore(record, recordPtr); + llvm::Value* gepR[] = { builder.getInt32(0), builder.getInt32(J3LockRecord::gepHeader) }; + builder.CreateStore(header, builder.CreateGEP(record, gepR)); + llvm::Value* gepC[] = { builder.getInt32(0), builder.getInt32(J3LockRecord::gepLockCount) }; + builder.CreateStore(builder.getInt32(0), builder.CreateGEP(record, gepC)); + llvm::Value* orig = builder.CreateOr(builder.CreateAnd(header, llvm::ConstantInt::get(uintPtrTy, ~6)), llvm::ConstantInt::get(uintPtrTy, 1)); /* ...001 */ - llvm::Value* res = builder->CreateAtomicCmpXchg(headerPtr, + llvm::Value* res = builder.CreateAtomicCmpXchg(headerPtr, orig, - builder->CreatePtrToInt(record, uintPtrTy), + builder.CreatePtrToInt(record, uintPtrTy), llvm::SequentiallyConsistent, llvm::CrossThread); - builder->CreateCondBr(builder->CreateICmpEQ(res, orig), stackLocked, stackFail); + builder.CreateCondBr(builder.CreateICmpEQ(res, orig), stackLocked, stackFail); /* stack locked, increment the counter */ - builder->SetInsertPoint(stackLocked); - llvm::Value* countPtr = builder->CreateGEP(builder->CreateLoad(recordPtr), gepC); - builder->CreateStore(builder->CreateAdd(builder->CreateLoad(countPtr), builder->getInt32(1)), countPtr); - builder->CreateBr(ok); + builder.SetInsertPoint(stackLocked); + llvm::Value* countPtr = builder.CreateGEP(builder.CreateLoad(recordPtr), gepC); + builder.CreateStore(builder.CreateAdd(builder.CreateLoad(countPtr), builder.getInt32(1)), countPtr); + builder.CreateBr(ok); /* unable to stack lock, fall back to monitor */ - builder->SetInsertPoint(stackFail); - builder->CreateCall(funcJ3ObjectMonitorEnter, obj); - builder->CreateBr(ok); + builder.SetInsertPoint(stackFail); + builder.CreateCall(funcJ3ObjectMonitorEnter, obj); + builder.CreateBr(ok); } void J3CodeGen::monitorExit(llvm::Value* obj) { @@ -286,78 +283,78 @@ void J3CodeGen::monitorExit(llvm::Value* llvm::BasicBlock* stackRec = newBB("stack-rec"); /* stack locked by myself? */ - llvm::Value* gepH[] = { builder->getInt32(0), builder->getInt32(J3Object::gepHeader) }; - llvm::Value* headerPtr = builder->CreateGEP(obj, gepH); - llvm::Value* header = builder->CreateLoad(headerPtr); + llvm::Value* gepH[] = { builder.getInt32(0), builder.getInt32(J3Object::gepHeader) }; + llvm::Value* headerPtr = builder.CreateGEP(obj, gepH); + llvm::Value* header = builder.CreateLoad(headerPtr); - builder->CreateCondBr(builder->CreateICmpEQ(currentThread(), spToCurrentThread(header)), + builder.CreateCondBr(builder.CreateICmpEQ(currentThread(), spToCurrentThread(header)), stackUnlock, monitorUnlock); /* ok, I'm the owner */ - builder->SetInsertPoint(stackUnlock); - llvm::Value* gepC[] = { builder->getInt32(0), builder->getInt32(J3LockRecord::gepLockCount) }; - llvm::Value* recordPtr = builder->CreateIntToPtr(header, recordPtrTy); - llvm::Value* countPtr = builder->CreateGEP(recordPtr, gepC); - llvm::Value* count = builder->CreateSub(builder->CreateLoad(countPtr), builder->getInt32(1)); - builder->CreateCondBr(builder->CreateICmpEQ(count, builder->getInt32(0)), stackRelease, stackRec); + builder.SetInsertPoint(stackUnlock); + llvm::Value* gepC[] = { builder.getInt32(0), builder.getInt32(J3LockRecord::gepLockCount) }; + llvm::Value* recordPtr = builder.CreateIntToPtr(header, recordPtrTy); + llvm::Value* countPtr = builder.CreateGEP(recordPtr, gepC); + llvm::Value* count = builder.CreateSub(builder.CreateLoad(countPtr), builder.getInt32(1)); + builder.CreateCondBr(builder.CreateICmpEQ(count, builder.getInt32(0)), stackRelease, stackRec); /* last unlock */ - builder->SetInsertPoint(stackRelease); - llvm::Value* gepR[] = { builder->getInt32(0), builder->getInt32(J3LockRecord::gepHeader) }; - llvm::Value* orig = builder->CreateLoad(builder->CreateGEP(recordPtr, gepR)); - llvm::Value* res = builder->CreateAtomicCmpXchg(headerPtr, + builder.SetInsertPoint(stackRelease); + llvm::Value* gepR[] = { builder.getInt32(0), builder.getInt32(J3LockRecord::gepHeader) }; + llvm::Value* orig = builder.CreateLoad(builder.CreateGEP(recordPtr, gepR)); + llvm::Value* res = builder.CreateAtomicCmpXchg(headerPtr, header, orig, llvm::SequentiallyConsistent, llvm::CrossThread); - builder->CreateCondBr(builder->CreateICmpEQ(res, header), ok, monitorUnlock); + builder.CreateCondBr(builder.CreateICmpEQ(res, header), ok, monitorUnlock); /* recursive unlock */ - builder->SetInsertPoint(stackRec); - builder->CreateStore(count, countPtr); - builder->CreateBr(ok); + builder.SetInsertPoint(stackRec); + builder.CreateStore(count, countPtr); + builder.CreateBr(ok); /* monitor unlock */ - builder->SetInsertPoint(monitorUnlock); - builder->CreateCall(funcJ3ObjectMonitorExit, obj); - builder->CreateBr(ok); + builder.SetInsertPoint(monitorUnlock); + builder.CreateCall(funcJ3ObjectMonitorExit, obj); + builder.CreateBr(ok); } void J3CodeGen::initialiseJ3ObjectType(J3ObjectType* cl) { if(!cl->isInitialised()) - builder->CreateCall(funcJ3TypeInitialise, typeDescriptor(cl, vm->typeJ3TypePtr)); + builder.CreateCall(funcJ3TypeInitialise, typeDescriptor(cl, vm->typeJ3TypePtr)); } llvm::Value* J3CodeGen::javaClass(J3ObjectType* type, bool doPush) { - return builder->CreateCall3(funcJ3TypeJavaClass, + return builder.CreateCall3(funcJ3TypeJavaClass, typeDescriptor(type, vm->typeJ3TypePtr), - builder->getInt1(doPush), - builder->CreateIntToPtr(llvm::ConstantInt::get(uintPtrTy, (uintptr_t)0), + builder.getInt1(doPush), + builder.CreateIntToPtr(llvm::ConstantInt::get(uintPtrTy, (uintptr_t)0), vm->typeJ3ObjectHandlePtr)); } llvm::Value* J3CodeGen::handleToObject(llvm::Value* obj) { - llvm::Value* gep[] = { builder->getInt32(0), builder->getInt32(J3ObjectHandle::gepObj) }; - return builder->CreateLoad(builder->CreateGEP(obj, gep)); + llvm::Value* gep[] = { builder.getInt32(0), builder.getInt32(J3ObjectHandle::gepObj) }; + return builder.CreateLoad(builder.CreateGEP(obj, gep)); } llvm::Value* J3CodeGen::staticInstance(J3Class* cl) { initialiseJ3ObjectType(cl); - return handleToObject(builder->CreateCall(funcJ3ClassStaticInstance, + return handleToObject(builder.CreateCall(funcJ3ClassStaticInstance, typeDescriptor(cl, vm->typeJ3ClassPtr))); } llvm::Value* J3CodeGen::vt(llvm::Value* obj) { - llvm::Value* gepVT[] = { builder->getInt32(0), - builder->getInt32(J3Object::gepVT) }; - llvm::Instruction* res = builder->CreateLoad(builder->CreateGEP(obj, gepVT)); + llvm::Value* gepVT[] = { builder.getInt32(0), + builder.getInt32(J3Object::gepVT) }; + llvm::Instruction* res = builder.CreateLoad(builder.CreateGEP(obj, gepVT)); res->setDebugLoc(llvm::DebugLoc::get(javaPC, 1, dbgInfo)); return res; } llvm::Value* J3CodeGen::vt(J3ObjectType* type, bool doResolve) { llvm::Value* func = doResolve && !type->isResolved() ? funcJ3TypeVTAndResolve : funcJ3TypeVT; - return builder->CreateCall(func, typeDescriptor(type, vm->typeJ3TypePtr)); + return builder.CreateCall(func, typeDescriptor(type, vm->typeJ3TypePtr)); } llvm::Value* J3CodeGen::nullCheck(llvm::Value* obj) { @@ -365,17 +362,17 @@ llvm::Value* J3CodeGen::nullCheck(llvm:: llvm::BasicBlock* succeed = newBB("nullcheck-succeed"); if(!bbNullCheckFailed) { - llvm::BasicBlock* prev = builder->GetInsertBlock(); + llvm::BasicBlock* prev = builder.GetInsertBlock(); bbNullCheckFailed = newBB("nullcheck-failed"); - builder->SetInsertPoint(bbNullCheckFailed); - builder->CreateInvoke(funcNullPointerException, bbRet, exceptions.nodes[curExceptionNode]->landingPad); - builder->SetInsertPoint(prev); + builder.SetInsertPoint(bbNullCheckFailed); + builder.CreateInvoke(funcNullPointerException, bbRet, exceptions.nodes[curExceptionNode]->landingPad); + builder.SetInsertPoint(prev); } - builder->CreateCondBr(builder->CreateIsNotNull(obj), succeed, bbNullCheckFailed); + builder.CreateCondBr(builder.CreateIsNotNull(obj), succeed, bbNullCheckFailed); bb = succeed; - builder->SetInsertPoint(bb); + builder.SetInsertPoint(bb); } return obj; @@ -400,11 +397,11 @@ void J3CodeGen::invoke(uint32_t access, if(exceptions.nodes[curExceptionNode]->landingPad) { //llvm::BasicBlock* after = forwardBranch("invoke-after", codeReader->tell(), 0, 0); llvm::BasicBlock* after = newBB("invoke-after"); - res = builder->CreateInvoke(func, after, exceptions.nodes[curExceptionNode]->landingPad, args); + res = builder.CreateInvoke(func, after, exceptions.nodes[curExceptionNode]->landingPad, args); bb = after; - builder->SetInsertPoint(bb); + builder.SetInsertPoint(bb); } else { - res = builder->CreateCall(func, args); + res = builder.CreateCall(func, args); } if(!res->getType()->isVoidTy()) @@ -417,14 +414,14 @@ void J3CodeGen::invokeInterface(uint32_t uint32_t index = target->interfaceIndex(); llvm::Value* thread = currentThread(); - llvm::Value* gep[] = { builder->getInt32(0), builder->getInt32(J3Thread::gepInterfaceMethodIndex) }; - builder->CreateStore(builder->getInt32(index), builder->CreateGEP(thread, gep)); + llvm::Value* gep[] = { builder.getInt32(0), builder.getInt32(J3Thread::gepInterfaceMethodIndex) }; + builder.CreateStore(builder.getInt32(index), builder.CreateGEP(thread, gep)); llvm::Value* obj = nullCheck(stack.top(type->nbIns())); - llvm::Value* gepFunc[] = { builder->getInt32(0), - builder->getInt32(J3VirtualTable::gepInterfaceMethods), - builder->getInt32(index % J3VirtualTable::nbInterfaceMethodTable) }; - llvm::Value* func = builder->CreateBitCast(builder->CreateLoad(builder->CreateGEP(vt(obj), gepFunc)), + llvm::Value* gepFunc[] = { builder.getInt32(0), + builder.getInt32(J3VirtualTable::gepInterfaceMethods), + builder.getInt32(index % J3VirtualTable::nbInterfaceMethodTable) }; + llvm::Value* func = builder.CreateBitCast(builder.CreateLoad(builder.CreateGEP(vt(obj), gepFunc)), target->signature()->functionType(target->access())->getPointerTo()); invoke(0, target, func); @@ -433,13 +430,13 @@ void J3CodeGen::invokeInterface(uint32_t void J3CodeGen::invokeVirtual(uint32_t idx) { J3Method* target = cl->methodAt(idx, 0); J3Signature* type = target->signature(); - llvm::Value* funcEntry = funcEntry = builder->getInt32(target->index()); + llvm::Value* funcEntry = funcEntry = builder.getInt32(target->index()); llvm::Value* obj = nullCheck(stack.top(type->nbIns())); - llvm::Value* gepFunc[] = { builder->getInt32(0), - builder->getInt32(J3VirtualTable::gepVirtualMethods), + llvm::Value* gepFunc[] = { builder.getInt32(0), + builder.getInt32(J3VirtualTable::gepVirtualMethods), funcEntry }; - llvm::Value* func = builder->CreateBitCast(builder->CreateLoad(builder->CreateGEP(vt(obj), gepFunc)), + llvm::Value* func = builder.CreateBitCast(builder.CreateLoad(builder.CreateGEP(vt(obj), gepFunc)), target->signature()->functionType(target->access())->getPointerTo()); invoke(0, target, func); @@ -456,13 +453,13 @@ void J3CodeGen::invokeSpecial(uint32_t i } llvm::Value* J3CodeGen::fieldOffset(llvm::Value* obj, J3Field* f) { - return builder->CreateIntToPtr(builder->CreateAdd(builder->CreatePtrToInt(obj, uintPtrTy), + return builder.CreateIntToPtr(builder.CreateAdd(builder.CreatePtrToInt(obj, uintPtrTy), llvm::ConstantInt::get(uintPtrTy, f->offset())), f->type()->llvmType()->getPointerTo()); } void J3CodeGen::get(llvm::Value* src, J3Field* f) { - llvm::Value* res = flatten(builder->CreateLoad(fieldOffset(src, f))); + llvm::Value* res = flatten(builder.CreateLoad(fieldOffset(src, f))); stack.push(res); } @@ -478,7 +475,7 @@ void J3CodeGen::getStatic(uint32_t idx) } void J3CodeGen::put(llvm::Value* dest, llvm::Value* val, J3Field* f) { - builder->CreateStore(unflatten(val, f->type()->llvmType()), fieldOffset(dest, f)); + builder.CreateStore(unflatten(val, f->type()->llvmType()), fieldOffset(dest, f)); } void J3CodeGen::putStatic(uint32_t idx) { @@ -497,8 +494,8 @@ void J3CodeGen::arrayBoundCheck(llvm::Va } llvm::Value* J3CodeGen::arrayContent(J3Type* cType, llvm::Value* array, llvm::Value* idx) { - array = builder->CreateBitCast(array, vm->typeJ3ArrayObjectPtr); - return builder->CreateGEP(builder->CreateBitCast(builder->CreateGEP(array, builder->getInt32(1)), cType->llvmType()->getPointerTo()), + array = builder.CreateBitCast(array, vm->typeJ3ArrayObjectPtr); + return builder.CreateGEP(builder.CreateBitCast(builder.CreateGEP(array, builder.getInt32(1)), cType->llvmType()->getPointerTo()), idx); } @@ -508,7 +505,7 @@ void J3CodeGen::arrayStore(J3Type* cType llvm::Value* array = stack.pop(); arrayBoundCheck(array, idx); - builder->CreateStore(unflatten(val, cType->llvmType()), arrayContent(cType, array, idx)); + builder.CreateStore(unflatten(val, cType->llvmType()), arrayContent(cType, array, idx)); } void J3CodeGen::arrayLoad(J3Type* cType) { @@ -516,29 +513,29 @@ void J3CodeGen::arrayLoad(J3Type* cType) llvm::Value* array = stack.pop(); arrayBoundCheck(array, idx); - stack.push(flatten(builder->CreateLoad(arrayContent(cType, array, idx)))); + stack.push(flatten(builder.CreateLoad(arrayContent(cType, array, idx)))); } llvm::Value* J3CodeGen::arrayLengthPtr(llvm::Value* obj) { - llvm::Value* gep[2] = { builder->getInt32(0), builder->getInt32(J3ArrayObject::gepLength) }; - return builder->CreateGEP(builder->CreateBitCast(obj, vm->typeJ3ArrayObjectPtr), gep); + llvm::Value* gep[2] = { builder.getInt32(0), builder.getInt32(J3ArrayObject::gepLength) }; + return builder.CreateGEP(builder.CreateBitCast(obj, vm->typeJ3ArrayObjectPtr), gep); } llvm::Value* J3CodeGen::arrayLength(llvm::Value* obj) { - return builder->CreateLoad(arrayLengthPtr(obj)); + return builder.CreateLoad(arrayLengthPtr(obj)); } void J3CodeGen::newArray(J3ArrayClass* array) { initialiseJ3ObjectType(array); llvm::Value* length = stack.pop(); llvm::Value* nbb = - builder->CreateAdd(llvm::ConstantInt::get(uintPtrTy, sizeof(J3ArrayObject)), - builder->CreateMul(llvm::ConstantInt::get(uintPtrTy, 1 << array->component()->logSize()), - builder->CreateZExtOrBitCast(length, uintPtrTy))); + builder.CreateAdd(llvm::ConstantInt::get(uintPtrTy, sizeof(J3ArrayObject)), + builder.CreateMul(llvm::ConstantInt::get(uintPtrTy, 1 << array->component()->logSize()), + builder.CreateZExtOrBitCast(length, uintPtrTy))); - llvm::Value* res = builder->CreateCall2(funcJ3ObjectAllocate, vt(array), nbb); + llvm::Value* res = builder.CreateCall2(funcJ3ObjectAllocate, vt(array), nbb); - builder->CreateStore(length, arrayLengthPtr(res)); + builder.CreateStore(length, arrayLengthPtr(res)); stack.push(res); } @@ -566,14 +563,14 @@ void J3CodeGen::multianewArray() { J3ObjectType* base = cl->classAt(codeReader->readU2()); uint32_t dim = codeReader->readU1(); - llvm::Value* values = builder->CreateAlloca(builder->getInt32Ty(), builder->getInt32(dim)); + llvm::Value* values = builder.CreateAlloca(builder.getInt32Ty(), builder.getInt32(dim)); for(uint32_t i=0; iCreateStore(stack.pop(), builder->CreateGEP(values, builder->getInt32(dim-i-1))); + builder.CreateStore(stack.pop(), builder.CreateGEP(values, builder.getInt32(dim-i-1))); - stack.push(builder->CreateCall3(funcJ3ArrayObjectMultianewArray, + stack.push(builder.CreateCall3(funcJ3ArrayObjectMultianewArray, typeDescriptor(base, vm->typeJ3ArrayClassPtr), - builder->getInt32(dim), + builder.getInt32(dim), values)); } @@ -583,12 +580,12 @@ void J3CodeGen::newObject(J3Class* cl) { llvm::Value* size; if(!cl->isResolved()) { - size = builder->CreateCall(funcJ3LayoutStructSize, typeDescriptor(cl, vm->typeJ3LayoutPtr)); + size = builder.CreateCall(funcJ3LayoutStructSize, typeDescriptor(cl, vm->typeJ3LayoutPtr)); } else { - size = builder->getInt64(cl->structSize()); + size = builder.getInt64(cl->structSize()); } - llvm::Value* res = builder->CreateCall2(funcJ3ObjectAllocate, vt(cl), size); + llvm::Value* res = builder.CreateCall2(funcJ3ObjectAllocate, vt(cl), size); stack.push(res); } @@ -599,14 +596,14 @@ llvm::Value* J3CodeGen::isAssignableTo(l if(type->isResolved()) { if(type->vt()->isPrimaryChecker()) - return builder->CreateCall3(funcFastIsAssignableToPrimaryChecker, + return builder.CreateCall3(funcFastIsAssignableToPrimaryChecker, vtObj, vtType, - builder->getInt32(type->vt()->offset())); + builder.getInt32(type->vt()->offset())); else - return builder->CreateCall2(funcFastIsAssignableToNonPrimaryChecker, vtObj, vtType); + return builder.CreateCall2(funcFastIsAssignableToNonPrimaryChecker, vtObj, vtType); } else { - return builder->CreateCall2(funcIsAssignableTo, vtObj, vtType); + return builder.CreateCall2(funcIsAssignableTo, vtObj, vtType); } } @@ -615,38 +612,38 @@ void J3CodeGen::instanceof(llvm::Value* llvm::BasicBlock* nok = newBB("instanceof-null"); llvm::BasicBlock* test = newBB("instanceof"); - builder->CreateCondBr(builder->CreateIsNull(obj), nok, test); + builder.CreateCondBr(builder.CreateIsNull(obj), nok, test); - builder->SetInsertPoint(nok); - stack.push(builder->getInt32(0)); - builder->CreateBr(after); + builder.SetInsertPoint(nok); + stack.push(builder.getInt32(0)); + builder.CreateBr(after); stack.drop(1); - builder->SetInsertPoint(test); - stack.push(builder->CreateZExt(isAssignableTo(obj, type), builder->getInt32Ty())); - builder->CreateBr(after); + builder.SetInsertPoint(test); + stack.push(builder.CreateZExt(isAssignableTo(obj, type), builder.getInt32Ty())); + builder.CreateBr(after); } void J3CodeGen::checkCast(llvm::Value* obj, J3ObjectType* type) { llvm::BasicBlock* succeed = forwardBranch("checkcast-succeed", codeReader->tell(), 0, 0); llvm::BasicBlock* test = newBB("checkcast"); - builder->CreateCondBr(builder->CreateIsNull(obj), succeed, test); + builder.CreateCondBr(builder.CreateIsNull(obj), succeed, test); if(!bbCheckCastFailed) { bbCheckCastFailed = newBB("checkcast-failed"); - builder->SetInsertPoint(bbCheckCastFailed); - builder->CreateCall(funcClassCastException); - builder->CreateBr(bbRet); + builder.SetInsertPoint(bbCheckCastFailed); + builder.CreateCall(funcClassCastException); + builder.CreateBr(bbRet); } - builder->SetInsertPoint(test); + builder.SetInsertPoint(test); llvm::Value* res = isAssignableTo(obj, type); - builder->CreateCondBr(res, succeed, bbCheckCastFailed); + builder.CreateCondBr(res, succeed, bbCheckCastFailed); - builder->SetInsertPoint(bb); + builder.SetInsertPoint(bb); } void J3CodeGen::floatToInteger(J3Type* ftype, J3Type* itype) { @@ -656,28 +653,28 @@ void J3CodeGen::floatToInteger(J3Type* f llvm::APInt::getSignedMaxValue(itype->llvmType()->getPrimitiveSizeInBits()).getZExtValue()); llvm::Value* v = stack.pop(); - llvm::Value* c = builder->CreateFCmpONE(v, v); - v = builder->CreateSelect(c, llvm::ConstantFP::get(ftype->llvmType(), 0), v); /* nan => 0 */ + llvm::Value* c = builder.CreateFCmpONE(v, v); + v = builder.CreateSelect(c, llvm::ConstantFP::get(ftype->llvmType(), 0), v); /* nan => 0 */ - c = builder->CreateFCmpOGE(v, max); - v = builder->CreateSelect(c, max, v); - c = builder->CreateFCmpOLE(v, min); - v = builder->CreateSelect(c, min, v); + c = builder.CreateFCmpOGE(v, max); + v = builder.CreateSelect(c, max, v); + c = builder.CreateFCmpOLE(v, min); + v = builder.CreateSelect(c, min, v); - stack.push(builder->CreateFPToSI(v, itype->llvmType())); + stack.push(builder.CreateFPToSI(v, itype->llvmType())); } void J3CodeGen::compareLong() { llvm::Value* val2 = stack.pop(); llvm::Value* val1 = stack.pop(); - llvm::Value* one = builder->getInt32(1); - llvm::Value* zero = builder->getInt32(0); - llvm::Value* minus = builder->getInt32(-1); - - llvm::Value* c = builder->CreateICmpSGT(val1, val2); - llvm::Value* r = builder->CreateSelect(c, one, zero); - c = builder->CreateICmpSLT(val1, val2); - r = builder->CreateSelect(c, minus, r); + llvm::Value* one = builder.getInt32(1); + llvm::Value* zero = builder.getInt32(0); + llvm::Value* minus = builder.getInt32(-1); + + llvm::Value* c = builder.CreateICmpSGT(val1, val2); + llvm::Value* r = builder.CreateSelect(c, one, zero); + c = builder.CreateICmpSLT(val1, val2); + r = builder.CreateSelect(c, minus, r); stack.push(r); } @@ -685,16 +682,16 @@ void J3CodeGen::compareLong() { void J3CodeGen::compareFP(bool isL) { llvm::Value* val2 = stack.pop(); llvm::Value* val1 = stack.pop(); - llvm::Value* one = builder->getInt32(1); - llvm::Value* zero = builder->getInt32(0); - llvm::Value* minus = builder->getInt32(-1); - - llvm::Value* c = builder->CreateFCmpUGT(val1, val2); - llvm::Value* r = builder->CreateSelect(c, one, zero); - c = builder->CreateFCmpULT(val1, val2); - r = builder->CreateSelect(c, minus, r); - c = builder->CreateFCmpUNO(val1, val2); - r = builder->CreateSelect(c, isL ? one : minus, r); + llvm::Value* one = builder.getInt32(1); + llvm::Value* zero = builder.getInt32(0); + llvm::Value* minus = builder.getInt32(-1); + + llvm::Value* c = builder.CreateFCmpUGT(val1, val2); + llvm::Value* r = builder.CreateSelect(c, one, zero); + c = builder.CreateFCmpULT(val1, val2); + r = builder.CreateSelect(c, minus, r); + c = builder.CreateFCmpUNO(val1, val2); + r = builder.CreateSelect(c, isL ? one : minus, r); stack.push(r); } @@ -703,16 +700,16 @@ void J3CodeGen::ldc(uint32_t idx) { llvm::Value* res; switch(cl->getCtpType(idx)) { - case J3Cst::CONSTANT_Long: res = builder->getInt64(cl->longAt(idx)); break; - case J3Cst::CONSTANT_Integer: res = builder->getInt32(cl->integerAt(idx)); break; - case J3Cst::CONSTANT_Float: res = llvm::ConstantFP::get(builder->getFloatTy(), cl->floatAt(idx)); break; - case J3Cst::CONSTANT_Double: res = llvm::ConstantFP::get(builder->getDoubleTy(), cl->doubleAt(idx)); break; + case J3Cst::CONSTANT_Long: res = builder.getInt64(cl->longAt(idx)); break; + case J3Cst::CONSTANT_Integer: res = builder.getInt32(cl->integerAt(idx)); break; + case J3Cst::CONSTANT_Float: res = llvm::ConstantFP::get(builder.getFloatTy(), cl->floatAt(idx)); break; + 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, + res = handleToObject(builder.CreateCall3(funcJ3ClassStringAt, typeDescriptor(cl, vm->typeJ3ClassPtr), - builder->getInt16(idx), - builder->getInt1(0))); + builder.getInt16(idx), + builder.getInt1(0))); break; default: J3::classFormatError(cl, "wrong ldc type: %d\n", cl->getCtpType(idx)); @@ -730,8 +727,8 @@ void J3CodeGen::lookupSwitch() { int32_t match = codeReader->readS4(); llvm::BasicBlock* ok = forwardBranch("lookupswitch-match", javaPC + codeReader->readS4(), 1, 1); llvm::BasicBlock* nok = i == (n - 1) ? def : newBB("lookupswitch-next"); - builder->CreateCondBr(builder->CreateICmpEQ(val, builder->getInt32(match)), ok, nok); - builder->SetInsertPoint(nok); + builder.CreateCondBr(builder.CreateICmpEQ(val, builder.getInt32(match)), ok, nok); + builder.SetInsertPoint(nok); } } @@ -741,10 +738,10 @@ void J3CodeGen::tableSwitch() { llvm::BasicBlock* def = forwardBranch("tableswitch-default", javaPC + codeReader->readU4(), 1, 1); int32_t low = codeReader->readU4(); int32_t high = codeReader->readU4(); - llvm::SwitchInst* dispatch = builder->CreateSwitch(val, def, high - low + 1); + llvm::SwitchInst* dispatch = builder.CreateSwitch(val, def, high - low + 1); for(uint32_t i=low; i<=high; i++) - dispatch->addCase(builder->getInt32(i), + dispatch->addCase(builder.getInt32(i), forwardBranch("tableswitch-match", javaPC + codeReader->readU4(), 1, 1)); } @@ -753,7 +750,7 @@ llvm::BasicBlock* J3CodeGen::newBB(const } void J3CodeGen::condBr(llvm::Value* op) { - builder->CreateCondBr(op, + builder.CreateCondBr(op, forwardBranch("if-true", javaPC + codeReader->readS2(), 1, 1), forwardBranch("if-false", codeReader->tell(), 0, 0)); } @@ -777,7 +774,7 @@ llvm::BasicBlock* J3CodeGen::forwardBran //insn->dump(); llvm::BasicBlock* before = insn->getParent(); llvm::BranchInst* fakeTerminator = 0; - bool isSelf = builder->GetInsertBlock() == before; + bool isSelf = builder.GetInsertBlock() == before; //fprintf(stderr, "--- before split ---\n"); //before->dump(); @@ -791,7 +788,7 @@ llvm::BasicBlock* J3CodeGen::forwardBran if(isSelf) { bb = after; - builder->SetInsertPoint(after); + builder.SetInsertPoint(after); } //fprintf(stderr, "--- after split ---\n"); //before->dump(); @@ -848,19 +845,19 @@ llvm::Value* J3CodeGen::buildString(cons uint32_t n; for(n=0; msg[n]; n++) - elmts.push_back(builder->getInt8(msg[n])); + elmts.push_back(builder.getInt8(msg[n])); - elmts.push_back(builder->getInt8(0)); + elmts.push_back(builder.getInt8(0)); - llvm::Constant* str = llvm::ConstantArray::get(llvm::ArrayType::get(builder->getInt8Ty(), n+1), elmts); + llvm::Constant* str = llvm::ConstantArray::get(llvm::ArrayType::get(builder.getInt8Ty(), n+1), elmts); llvm::Value* var = new llvm::GlobalVariable(*module, str->getType(), 1, llvm::GlobalVariable::InternalLinkage, str); - llvm::Value* gep[] = { builder->getInt32(0), builder->getInt32(0) }; + llvm::Value* gep[] = { builder.getInt32(0), builder.getInt32(0) }; - return builder->CreateGEP(var, gep); + return builder.CreateGEP(var, gep); } void J3CodeGen::translate() { @@ -868,7 +865,7 @@ void J3CodeGen::translate() { exceptions.dump(vm->options()->debugTranslate-1); stack.topStack = 0; - builder->SetInsertPoint(bb); + builder.SetInsertPoint(bb); _onEndPoint(); closeBB = 1; @@ -897,7 +894,7 @@ void J3CodeGen::translate() { if(closeBB && !bb->getTerminator()) { if(!opInfos[javaPC].bb) J3::internalError("random split???"); - builder->CreateBr(opInfos[javaPC].bb); + builder.CreateBr(opInfos[javaPC].bb); } } @@ -910,7 +907,7 @@ void J3CodeGen::translate() { if(opInfos[javaPC].bb) { bb = opInfos[javaPC].bb; - builder->SetInsertPoint(bb); + builder.SetInsertPoint(bb); //printf("Meta stack before: %p\n", metaStack); if(opInfos[javaPC].metaStack) { stack.metaStack = opInfos[javaPC].metaStack; @@ -962,31 +959,31 @@ void J3CodeGen::translate() { case J3Cst::BC_iconst_3: /* 0x06 */ case J3Cst::BC_iconst_4: /* 0x07 */ case J3Cst::BC_iconst_5: /* 0x08 */ - stack.push(builder->getInt32(bc - J3Cst::BC_iconst_0)); + stack.push(builder.getInt32(bc - J3Cst::BC_iconst_0)); break; case J3Cst::BC_lconst_0: /* 0x09 */ case J3Cst::BC_lconst_1: /* 0x0a */ - stack.push(builder->getInt64(bc - J3Cst::BC_lconst_0)); + stack.push(builder.getInt64(bc - J3Cst::BC_lconst_0)); break; case J3Cst::BC_fconst_0: /* 0x0b */ case J3Cst::BC_fconst_1: /* 0x0c */ case J3Cst::BC_fconst_2: /* 0x0d */ - stack.push(llvm::ConstantFP::get(builder->getFloatTy(), (bc - J3Cst::BC_fconst_0))); + stack.push(llvm::ConstantFP::get(builder.getFloatTy(), (bc - J3Cst::BC_fconst_0))); break; case J3Cst::BC_dconst_0: /* 0x0e */ case J3Cst::BC_dconst_1: /* 0x0f */ - stack.push(llvm::ConstantFP::get(builder->getDoubleTy(), (bc - J3Cst::BC_dconst_0))); + stack.push(llvm::ConstantFP::get(builder.getDoubleTy(), (bc - J3Cst::BC_dconst_0))); break; case J3Cst::BC_bipush: /* 0x10 */ - stack.push(builder->getInt32(codeReader->readS1())); + stack.push(builder.getInt32(codeReader->readS1())); break; case J3Cst::BC_sipush: /* 0x11 */ - stack.push(builder->getInt32(codeReader->readS2())); + stack.push(builder.getInt32(codeReader->readS2())); break; case J3Cst::BC_ldc: /* 0x12 */ @@ -1229,134 +1226,134 @@ void J3CodeGen::translate() { case J3Cst::BC_iadd: /* 0x60 */ case J3Cst::BC_ladd: /* 0x61 */ - val2 = stack.pop(); val1 = stack.pop(); stack.push(builder->CreateAdd(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); stack.push(builder.CreateAdd(val1, val2)); break; case J3Cst::BC_fadd: /* 0x62 */ case J3Cst::BC_dadd: /* 0x63 */ - val2 = stack.pop(); val1 = stack.pop(); stack.push(builder->CreateFAdd(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); stack.push(builder.CreateFAdd(val1, val2)); break; case J3Cst::BC_isub: /* 0x64 */ case J3Cst::BC_lsub: /* 0x65 */ - val2 = stack.pop(); val1 = stack.pop(); stack.push(builder->CreateSub(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); stack.push(builder.CreateSub(val1, val2)); break; case J3Cst::BC_fsub: /* 0x66 */ case J3Cst::BC_dsub: /* 0x67 */ - val2 = stack.pop(); val1 = stack.pop(); stack.push(builder->CreateFSub(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); stack.push(builder.CreateFSub(val1, val2)); break; case J3Cst::BC_imul: /* 0x68 */ case J3Cst::BC_lmul: /* 0x69 */ - val2 = stack.pop(); val1 = stack.pop(); stack.push(builder->CreateMul(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); stack.push(builder.CreateMul(val1, val2)); break; case J3Cst::BC_fmul: /* 0x6a */ case J3Cst::BC_dmul: /* 0x6b */ - val2 = stack.pop(); val1 = stack.pop(); stack.push(builder->CreateFMul(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); stack.push(builder.CreateFMul(val1, val2)); break; case J3Cst::BC_idiv: /* 0x6c */ case J3Cst::BC_ldiv: /* 0x6d */ - val2 = stack.pop(); val1 = stack.pop(); stack.push(builder->CreateSDiv(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); stack.push(builder.CreateSDiv(val1, val2)); break; case J3Cst::BC_fdiv: /* 0x6e */ case J3Cst::BC_ddiv: /* 0x6f */ - val2 = stack.pop(); val1 = stack.pop(); stack.push(builder->CreateFDiv(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); stack.push(builder.CreateFDiv(val1, val2)); break; case J3Cst::BC_irem: /* 0x70 */ case J3Cst::BC_lrem: /* 0x71 */ - val2 = stack.pop(); val1 = stack.pop(); stack.push(builder->CreateSRem(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); stack.push(builder.CreateSRem(val1, val2)); break; case J3Cst::BC_frem: /* 0x72 */ case J3Cst::BC_drem: /* 0x73 */ - val2 = stack.pop(); val1 = stack.pop(); stack.push(builder->CreateFRem(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); stack.push(builder.CreateFRem(val1, val2)); break; case J3Cst::BC_ineg: /* 0x74 */ case J3Cst::BC_lneg: /* 0x75 */ - stack.push(builder->CreateNeg(stack.pop())); + stack.push(builder.CreateNeg(stack.pop())); break; case J3Cst::BC_fneg: /* 0x76 */ case J3Cst::BC_dneg: /* 0x77 */ - stack.push(builder->CreateFNeg(stack.pop())); + stack.push(builder.CreateFNeg(stack.pop())); break; case J3Cst::BC_ishl: /* 0x78 */ - val2 = stack.pop(); val1 = stack.pop(); stack.push(builder->CreateShl(val1, builder->CreateAnd(val2, 0x1f))); + val2 = stack.pop(); val1 = stack.pop(); stack.push(builder.CreateShl(val1, builder.CreateAnd(val2, 0x1f))); break; case J3Cst::BC_lshl: /* 0x79 */ val2 = stack.pop(); val1 = stack.pop(); - stack.push(builder->CreateShl(val1, builder->CreateZExt(builder->CreateAnd(val2, 0x3f), builder->getInt64Ty()))); + stack.push(builder.CreateShl(val1, builder.CreateZExt(builder.CreateAnd(val2, 0x3f), builder.getInt64Ty()))); break; case J3Cst::BC_ishr: /* 0x7a */ - val2 = stack.pop(); val1 = stack.pop(); stack.push(builder->CreateAShr(val1, builder->CreateAnd(val2, 0x1f))); + val2 = stack.pop(); val1 = stack.pop(); stack.push(builder.CreateAShr(val1, builder.CreateAnd(val2, 0x1f))); break; case J3Cst::BC_lshr: /* 0x7b */ val2 = stack.pop(); val1 = stack.pop(); - stack.push(builder->CreateAShr(val1, builder->CreateZExt(builder->CreateAnd(val2, 0x3f), builder->getInt64Ty()))); + stack.push(builder.CreateAShr(val1, builder.CreateZExt(builder.CreateAnd(val2, 0x3f), builder.getInt64Ty()))); break; case J3Cst::BC_iushr: /* 0x7c */ - val2 = stack.pop(); val1 = stack.pop(); stack.push(builder->CreateLShr(val1, builder->CreateAnd(val2, 0x1f))); + val2 = stack.pop(); val1 = stack.pop(); stack.push(builder.CreateLShr(val1, builder.CreateAnd(val2, 0x1f))); break; case J3Cst::BC_lushr: /* 0x7d */ val2 = stack.pop(); val1 = stack.pop(); - stack.push(builder->CreateLShr(val1, builder->CreateZExt(builder->CreateAnd(val2, 0x3f), builder->getInt64Ty()))); + stack.push(builder.CreateLShr(val1, builder.CreateZExt(builder.CreateAnd(val2, 0x3f), builder.getInt64Ty()))); break; case J3Cst::BC_iand: /* 0x7e */ case J3Cst::BC_land: /* 0x7f */ - val2 = stack.pop(); val1 = stack.pop(); stack.push(builder->CreateAnd(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); stack.push(builder.CreateAnd(val1, val2)); break; case J3Cst::BC_ior: /* 0x80 */ case J3Cst::BC_lor: /* 0x81 */ - val2 = stack.pop(); val1 = stack.pop(); stack.push(builder->CreateOr(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); stack.push(builder.CreateOr(val1, val2)); break; case J3Cst::BC_ixor: /* 0x82 */ case J3Cst::BC_lxor: /* 0x83 */ - val2 = stack.pop(); val1 = stack.pop(); stack.push(builder->CreateXor(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); stack.push(builder.CreateXor(val1, val2)); break; case J3Cst::BC_iinc: /* 0x84 wide */ { uint32_t idx = wideReadU1(); int32_t val = wideReadS1(); - locals.setAt(builder->CreateAdd(locals.at(idx, vm->typeInteger->llvmType()), builder->getInt32(val)), idx); + locals.setAt(builder.CreateAdd(locals.at(idx, vm->typeInteger->llvmType()), builder.getInt32(val)), idx); } break; case J3Cst::BC_i2l: /* 0x85 */ - stack.push(builder->CreateSExt(stack.pop(), vm->typeLong->llvmType())); + stack.push(builder.CreateSExt(stack.pop(), vm->typeLong->llvmType())); break; case J3Cst::BC_i2f: /* 0x86 */ - stack.push(builder->CreateSIToFP(stack.pop(), vm->typeFloat->llvmType())); + stack.push(builder.CreateSIToFP(stack.pop(), vm->typeFloat->llvmType())); break; case J3Cst::BC_i2d: /* 0x87 */ - stack.push(builder->CreateSIToFP(stack.pop(), vm->typeDouble->llvmType())); + stack.push(builder.CreateSIToFP(stack.pop(), vm->typeDouble->llvmType())); break; case J3Cst::BC_l2i: /* 0x88 */ - stack.push(builder->CreateTruncOrBitCast(stack.pop(), builder->getInt32Ty())); + stack.push(builder.CreateTruncOrBitCast(stack.pop(), builder.getInt32Ty())); break; case J3Cst::BC_l2f: /* 0x89 */ - stack.push(builder->CreateSIToFP(stack.pop(), vm->typeFloat->llvmType())); + stack.push(builder.CreateSIToFP(stack.pop(), vm->typeFloat->llvmType())); break; case J3Cst::BC_l2d: /* 0x8a */ - stack.push(builder->CreateSIToFP(stack.pop(), vm->typeDouble->llvmType())); + stack.push(builder.CreateSIToFP(stack.pop(), vm->typeDouble->llvmType())); break; case J3Cst::BC_f2i: /* 0x8b */ @@ -1368,7 +1365,7 @@ void J3CodeGen::translate() { break; case J3Cst::BC_f2d: /* 0x8d */ - stack.push(builder->CreateFPExt(stack.pop(), vm->typeDouble->llvmType())); + stack.push(builder.CreateFPExt(stack.pop(), vm->typeDouble->llvmType())); break; case J3Cst::BC_d2i: /* 0x8e */ @@ -1380,19 +1377,19 @@ void J3CodeGen::translate() { break; case J3Cst::BC_d2f: /* 0x90 */ - stack.push(builder->CreateFPTrunc(stack.pop(), vm->typeFloat->llvmType())); + stack.push(builder.CreateFPTrunc(stack.pop(), vm->typeFloat->llvmType())); break; case J3Cst::BC_i2b: /* 0x91 */ - stack.push(builder->CreateSExt(builder->CreateTrunc(stack.pop(), builder->getInt8Ty()), builder->getInt32Ty())); + stack.push(builder.CreateSExt(builder.CreateTrunc(stack.pop(), builder.getInt8Ty()), builder.getInt32Ty())); break; case J3Cst::BC_i2c: /* 0x92 */ - stack.push(builder->CreateZExt(builder->CreateTrunc(stack.pop(), builder->getInt16Ty()), builder->getInt32Ty())); + stack.push(builder.CreateZExt(builder.CreateTrunc(stack.pop(), builder.getInt16Ty()), builder.getInt32Ty())); break; case J3Cst::BC_i2s: /* 0x93 */ - stack.push(builder->CreateSExt(builder->CreateTrunc(stack.pop(), builder->getInt16Ty()), builder->getInt32Ty())); + stack.push(builder.CreateSExt(builder.CreateTrunc(stack.pop(), builder.getInt16Ty()), builder.getInt32Ty())); break; case J3Cst::BC_lcmp: /* 0x94 */ @@ -1416,63 +1413,63 @@ void J3CodeGen::translate() { break; case J3Cst::BC_ifeq: /* 0x99 */ - condBr(builder->CreateICmpEQ(stack.pop(), builder->getInt32(0))); + condBr(builder.CreateICmpEQ(stack.pop(), builder.getInt32(0))); break; case J3Cst::BC_ifne: /* 0x9a */ - condBr(builder->CreateICmpNE(stack.pop(), builder->getInt32(0))); + condBr(builder.CreateICmpNE(stack.pop(), builder.getInt32(0))); break; case J3Cst::BC_iflt: /* 0x9b */ - condBr(builder->CreateICmpSLT(stack.pop(), builder->getInt32(0))); + condBr(builder.CreateICmpSLT(stack.pop(), builder.getInt32(0))); break; case J3Cst::BC_ifge: /* 0x9c */ - condBr(builder->CreateICmpSGE(stack.pop(), builder->getInt32(0))); + condBr(builder.CreateICmpSGE(stack.pop(), builder.getInt32(0))); break; case J3Cst::BC_ifgt: /* 0x9d */ - condBr(builder->CreateICmpSGT(stack.pop(), builder->getInt32(0))); + condBr(builder.CreateICmpSGT(stack.pop(), builder.getInt32(0))); break; case J3Cst::BC_ifle: /* 0x9e */ - condBr(builder->CreateICmpSLE(stack.pop(), builder->getInt32(0))); + condBr(builder.CreateICmpSLE(stack.pop(), builder.getInt32(0))); break; case J3Cst::BC_if_icmpeq: /* 0x9f */ - val2 = stack.pop(); val1 = stack.pop(); condBr(builder->CreateICmpEQ(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); condBr(builder.CreateICmpEQ(val1, val2)); break; case J3Cst::BC_if_icmpne: /* 0xa0 */ - val2 = stack.pop(); val1 = stack.pop(); condBr(builder->CreateICmpNE(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); condBr(builder.CreateICmpNE(val1, val2)); break; case J3Cst::BC_if_icmplt: /* 0xa1 */ - val2 = stack.pop(); val1 = stack.pop(); condBr(builder->CreateICmpSLT(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); condBr(builder.CreateICmpSLT(val1, val2)); break; case J3Cst::BC_if_icmpge: /* 0xa2 */ - val2 = stack.pop(); val1 = stack.pop(); condBr(builder->CreateICmpSGE(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); condBr(builder.CreateICmpSGE(val1, val2)); break; case J3Cst::BC_if_icmpgt: /* 0xa3 */ - val2 = stack.pop(); val1 = stack.pop(); condBr(builder->CreateICmpSGT(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); condBr(builder.CreateICmpSGT(val1, val2)); break; case J3Cst::BC_if_icmple: /* 0xa4 */ - val2 = stack.pop(); val1 = stack.pop(); condBr(builder->CreateICmpSLE(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); condBr(builder.CreateICmpSLE(val1, val2)); break; case J3Cst::BC_if_acmpeq: /* 0xa5 */ - val2 = stack.pop(); val1 = stack.pop(); condBr(builder->CreateICmpEQ(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); condBr(builder.CreateICmpEQ(val1, val2)); break; case J3Cst::BC_if_acmpne: /* 0xa6 */ - val2 = stack.pop(); val1 = stack.pop(); condBr(builder->CreateICmpNE(val1, val2)); + val2 = stack.pop(); val1 = stack.pop(); condBr(builder.CreateICmpNE(val1, val2)); break; case J3Cst::BC_goto: /* 0xa7 */ - builder->CreateBr(forwardBranch("goto", javaPC + codeReader->readS2(), 0, 1)); + builder.CreateBr(forwardBranch("goto", javaPC + codeReader->readS2(), 0, 1)); _onEndPoint(); break; @@ -1494,12 +1491,12 @@ void J3CodeGen::translate() { case J3Cst::BC_dreturn: /* 0xaf */ case J3Cst::BC_areturn: /* 0xb0 */ ret.setAt(stack.pop(), 0); - builder->CreateBr(bbRet); + builder.CreateBr(bbRet); _onEndPoint(); break; case J3Cst::BC_return: /* 0xb1 */ - builder->CreateBr(bbRet); + builder.CreateBr(bbRet); _onEndPoint(); break; @@ -1554,12 +1551,12 @@ void J3CodeGen::translate() { case J3Cst::BC_athrow: /* 0xbf */ { - llvm::Value* excp = builder->CreateBitCast(stack.pop(), funcThrowException->getFunctionType()->getParamType(0)); + llvm::Value* excp = builder.CreateBitCast(stack.pop(), funcThrowException->getFunctionType()->getParamType(0)); if(exceptions.nodes[curExceptionNode]->landingPad) - builder->CreateInvoke(funcThrowException, bbRet, exceptions.nodes[curExceptionNode]->landingPad, excp); + builder.CreateInvoke(funcThrowException, bbRet, exceptions.nodes[curExceptionNode]->landingPad, excp); else { - builder->CreateCall(funcThrowException, excp); - builder->CreateBr(bbRet); + builder.CreateCall(funcThrowException, excp); + builder.CreateBr(bbRet); } _onEndPoint(); } @@ -1590,11 +1587,11 @@ void J3CodeGen::translate() { break; case J3Cst::BC_ifnull: /* 0xc6 */ - condBr(builder->CreateIsNull(stack.pop())); + condBr(builder.CreateIsNull(stack.pop())); break; case J3Cst::BC_ifnonnull: /* 0xc7 */ - condBr(builder->CreateIsNotNull(stack.pop())); + condBr(builder.CreateIsNotNull(stack.pop())); break; @@ -1634,32 +1631,32 @@ void J3CodeGen::explore() { void J3CodeGen::z_translate() { bbRet = newBB("ret"); llvm::BasicBlock* landingPad = newBB("landing-pad"); - llvm::Value* val = builder->CreateIntToPtr(llvm::ConstantInt::get(uintPtrTy, (uintptr_t)0x42), + llvm::Value* val = builder.CreateIntToPtr(llvm::ConstantInt::get(uintPtrTy, (uintptr_t)0x42), vm->typeJ3ObjectPtr); - builder->CreateInvoke(funcThrowException, bbRet, landingPad, - builder->CreateBitCast(val, funcThrowException->getFunctionType()->getParamType(0))); + builder.CreateInvoke(funcThrowException, bbRet, landingPad, + builder.CreateBitCast(val, funcThrowException->getFunctionType()->getParamType(0))); - builder->SetInsertPoint(landingPad); - llvm::LandingPadInst *caughtResult = builder->CreateLandingPad(vm->typeGXXException, + builder.SetInsertPoint(landingPad); + llvm::LandingPadInst *caughtResult = builder.CreateLandingPad(vm->typeGXXException, funcGXXPersonality, 1, "landing-pad"); caughtResult->addClause(gvTypeInfo); - llvm::Value* excp = builder->CreateBitCast(builder->CreateCall(funcCXABeginCatch, - builder->CreateExtractValue(caughtResult, 0)), + llvm::Value* excp = builder.CreateBitCast(builder.CreateCall(funcCXABeginCatch, + builder.CreateExtractValue(caughtResult, 0)), vm->typeJ3ObjectPtr); - builder->CreateCall(funcCXAEndCatch); + builder.CreateCall(funcCXAEndCatch); - builder->CreateCall3(funcEchoDebugExecute, - builder->getInt32(-1), /* just to see my first exception :) */ + builder.CreateCall3(funcEchoDebugExecute, + builder.getInt32(-1), /* just to see my first exception :) */ buildString("catching exception %p!\n"), excp); - builder->CreateBr(bbRet); + builder.CreateBr(bbRet); - builder->SetInsertPoint(bbRet); - builder->CreateRetVoid(); + builder.SetInsertPoint(bbRet); + builder.CreateRetVoid(); llvmFunction->dump(); } @@ -1714,7 +1711,7 @@ void J3CodeGen::generateJava() { pos += (cur->getType() == vm->typeLong->llvmType() || cur->getType() == vm->typeDouble->llvmType()) ? 2 : 1; } - //builder->CreateCall(ziTry); + //builder.CreateCall(ziTry); pendingBranchs = (uint32_t*)allocator->allocate(sizeof(uint32_t) * codeLength); opInfos = (J3OpInfo*)allocator->allocate(sizeof(J3OpInfo) * codeLength); @@ -1724,14 +1721,14 @@ void J3CodeGen::generateJava() { codeReader = &codeReaderTmp; bbRet = newBB("ret"); - builder->SetInsertPoint(bbRet); + builder.SetInsertPoint(bbRet); genDebugEnterLeave(1); if(llvmFunction->getReturnType()->isVoidTy()) - builder->CreateRetVoid(); + builder.CreateRetVoid(); else - builder->CreateRet(unflatten(ret.at(0, llvmFunction->getReturnType()), llvmFunction->getReturnType())); + builder.CreateRet(unflatten(ret.at(0, llvmFunction->getReturnType()), llvmFunction->getReturnType())); if(J3Cst::isSynchronized(method->access())) { static bool echoDone = 0; @@ -1812,7 +1809,7 @@ void J3CodeGen::generateNative() { llvm::Value* res; llvm::Value* thread = currentThread(); - llvm::Value* frame = builder->CreateCall(funcJ3ThreadTell, thread); + llvm::Value* frame = builder.CreateCall(funcJ3ThreadTell, thread); if(J3Cst::isSynchronized(method->access())) { static bool echoDone = 0; @@ -1822,7 +1819,7 @@ void J3CodeGen::generateNative() { } } - args.push_back(builder->CreateCall(funcJniEnv)); + args.push_back(builder.CreateCall(funcJniEnv)); if(J3Cst::isStatic(method->access())) args.push_back(javaClass(cl, 1)); @@ -1831,30 +1828,30 @@ void J3CodeGen::generateNative() { for(llvm::Function::arg_iterator cur=llvmFunction->arg_begin(); cur!=llvmFunction->arg_end(); cur++) { llvm::Value* v = cur; args.push_back(v->getType()->isPointerTy() ? - builder->CreateCall2(funcJ3ThreadPush, thread, v) : + builder.CreateCall2(funcJ3ThreadPush, thread, v) : v); } - res = builder->CreateCall(nat, args); - builder->CreateCall(funcReplayException); + res = builder.CreateCall(nat, args); + builder.CreateCall(funcReplayException); if(llvmFunction->getReturnType()->isVoidTy()) { - builder->CreateCall2(funcJ3ThreadRestore, thread, frame); - builder->CreateRetVoid(); + builder.CreateCall2(funcJ3ThreadRestore, thread, frame); + builder.CreateRetVoid(); } else { if(llvmFunction->getReturnType()->isPointerTy()) { llvm::BasicBlock* ifnull = newBB("ifnull"); llvm::BasicBlock* ifnotnull = newBB("ifnotnull"); - builder->CreateCondBr(builder->CreateIsNull(res), ifnull, ifnotnull); + builder.CreateCondBr(builder.CreateIsNull(res), ifnull, ifnotnull); - builder->SetInsertPoint(bb = ifnull); - builder->CreateCall2(funcJ3ThreadRestore, thread, frame); - builder->CreateRet(nullValue); + builder.SetInsertPoint(bb = ifnull); + builder.CreateCall2(funcJ3ThreadRestore, thread, frame); + builder.CreateRet(nullValue); - builder->SetInsertPoint(bb = ifnotnull); + builder.SetInsertPoint(bb = ifnotnull); res = handleToObject(res); - builder->CreateCall2(funcJ3ThreadRestore, thread, frame); + builder.CreateCall2(funcJ3ThreadRestore, thread, frame); } - builder->CreateRet(res); + builder.CreateRet(res); } } Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc?rev=199634&r1=199633&r2=199634&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc Mon Jan 20 03:53:23 2014 @@ -20,9 +20,9 @@ void J3ExceptionNode::addEntry(J3CodeGen if(!nbEntries) { landingPad = codeGen->newBB("landing-pad"); curCheck = landingPad; - codeGen->builder->SetInsertPoint(landingPad); + codeGen->builder.SetInsertPoint(landingPad); - llvm::LandingPadInst *caughtResult = codeGen->builder->CreateLandingPad(codeGen->vm->typeGXXException, + llvm::LandingPadInst *caughtResult = codeGen->builder.CreateLandingPad(codeGen->vm->typeGXXException, codeGen->funcGXXPersonality, 1, "landing-pad"); @@ -32,16 +32,16 @@ void J3ExceptionNode::addEntry(J3CodeGen if(codeGen->vm->options()->debugExecute) { char buf[256]; snprintf(buf, 256, " catching exceptions in %s::%s\n", codeGen->cl->name()->cStr(), codeGen->method->name()->cStr()); - codeGen->builder->CreateCall2(codeGen->funcEchoDebugExecute, - codeGen->builder->getInt32(1), + codeGen->builder.CreateCall2(codeGen->funcEchoDebugExecute, + codeGen->builder.getInt32(1), codeGen->buildString(buf)); } - llvm::Value* excp = codeGen->builder->CreateBitCast(codeGen->builder->CreateCall(codeGen->funcCXABeginCatch, - codeGen->builder->CreateExtractValue(caughtResult, 0)), + llvm::Value* excp = codeGen->builder.CreateBitCast(codeGen->builder.CreateCall(codeGen->funcCXABeginCatch, + codeGen->builder.CreateExtractValue(caughtResult, 0)), codeGen->vm->typeJ3ObjectPtr); - codeGen->builder->CreateCall(codeGen->funcCXAEndCatch); + codeGen->builder.CreateCall(codeGen->funcCXAEndCatch); codeGen->stack.topStack = 0; codeGen->stack.push(excp); @@ -50,18 +50,18 @@ void J3ExceptionNode::addEntry(J3CodeGen entries[nbEntries++] = entry; if(curCheck) { /* = 0 if I already have a finally */ - codeGen->builder->SetInsertPoint(curCheck); + codeGen->builder.SetInsertPoint(curCheck); curCheck = codeGen->newBB("next-exception-check"); if(entry->catchType) { codeGen->stack.metaStack[0] = codeGen->vm->typeJ3ObjectPtr; codeGen->stack.topStack = 1; - codeGen->builder->CreateCondBr(codeGen->isAssignableTo(codeGen->stack.top(0), + codeGen->builder.CreateCondBr(codeGen->isAssignableTo(codeGen->stack.top(0), codeGen->cl->classAt(entry->catchType)), entry->bb, curCheck); } else { - codeGen->builder->CreateBr(entry->bb); + codeGen->builder.CreateBr(entry->bb); curCheck = 0; } } @@ -69,23 +69,23 @@ void J3ExceptionNode::addEntry(J3CodeGen void J3ExceptionNode::close(J3CodeGen* codeGen) { if(curCheck) { - codeGen->builder->SetInsertPoint(curCheck); + codeGen->builder.SetInsertPoint(curCheck); if(codeGen->vm->options()->debugExecute) { char buf[256]; snprintf(buf, 256, " exceptions not catched in %s::%s, rethrowing\n", codeGen->cl->name()->cStr(), codeGen->method->name()->cStr()); - codeGen->builder->CreateCall2(codeGen->funcEchoDebugExecute, - codeGen->builder->getInt32(1), + codeGen->builder.CreateCall2(codeGen->funcEchoDebugExecute, + codeGen->builder.getInt32(1), codeGen->buildString(buf)); } codeGen->stack.metaStack[0] = codeGen->vm->typeJ3ObjectPtr; codeGen->stack.topStack = 1; - codeGen->builder->CreateCall(codeGen->funcThrowException, - codeGen->builder->CreateBitCast(codeGen->stack.pop(), + codeGen->builder.CreateCall(codeGen->funcThrowException, + codeGen->builder.CreateBitCast(codeGen->stack.pop(), codeGen->funcThrowException->getFunctionType()->getParamType(0))); - codeGen->builder->CreateBr(codeGen->bbRet); + codeGen->builder.CreateBr(codeGen->bbRet); } } Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc?rev=199634&r1=199633&r2=199634&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc Mon Jan 20 03:53:23 2014 @@ -10,8 +10,8 @@ using namespace j3; void J3CodeGenVar::killUnused(llvm::AllocaInst** stack, bool isObj) { - llvm::Type* i8ptr = codeGen->builder->getInt8Ty()->getPointerTo(); - llvm::Value* meta = codeGen->builder->CreateBitCast(codeGen->nullValue, i8ptr); + llvm::Type* i8ptr = codeGen->builder.getInt8Ty()->getPointerTo(); + llvm::Value* meta = codeGen->builder.CreateBitCast(codeGen->nullValue, i8ptr); llvm::Type* i8ptrptr = i8ptr->getPointerTo(); for(uint32_t i=0; i(*(cur->use_begin()))->eraseFromParent(); cur->eraseFromParent(); } else if(isObj) { - codeGen->builder->SetInsertPoint(cur->getNextNode()); - codeGen->builder->CreateCall2(codeGen->gcRoot, codeGen->builder->CreateBitCast(refStack[i], i8ptrptr), meta); - //codeGen->builder->CreateStore(codeGen->nullValue, cur); + codeGen->builder.SetInsertPoint(cur->getNextNode()); + codeGen->builder.CreateCall2(codeGen->gcRoot, codeGen->builder.CreateBitCast(refStack[i], i8ptrptr), meta); + //codeGen->builder.CreateStore(codeGen->nullValue, cur); // } } @@ -57,11 +57,11 @@ void J3CodeGenVar::init(J3CodeGen* _code topStack = 0; for(uint32_t i=0; ibuilder->CreateAlloca(codeGen->builder->getInt32Ty()); - longStack[i] = codeGen->builder->CreateAlloca(codeGen->builder->getInt64Ty()); - floatStack[i] = codeGen->builder->CreateAlloca(codeGen->builder->getFloatTy()); - doubleStack[i] = codeGen->builder->CreateAlloca(codeGen->builder->getDoubleTy()); - refStack[i] = codeGen->builder->CreateAlloca(codeGen->vm->typeJ3ObjectPtr); + intStack[i] = codeGen->builder.CreateAlloca(codeGen->builder.getInt32Ty()); + longStack[i] = codeGen->builder.CreateAlloca(codeGen->builder.getInt64Ty()); + floatStack[i] = codeGen->builder.CreateAlloca(codeGen->builder.getFloatTy()); + doubleStack[i] = codeGen->builder.CreateAlloca(codeGen->builder.getDoubleTy()); + refStack[i] = codeGen->builder.CreateAlloca(codeGen->vm->typeJ3ObjectPtr); } } @@ -98,11 +98,11 @@ llvm::AllocaInst** J3CodeGenVar::stackOf void J3CodeGenVar::setAt(llvm::Value* value, uint32_t idx) { llvm::Type* t = value->getType(); - codeGen->builder->CreateStore(value, stackOf(t)[idx]); + codeGen->builder.CreateStore(value, stackOf(t)[idx]); } llvm::Value* J3CodeGenVar::at(uint32_t idx, llvm::Type* t) { - return codeGen->builder->CreateLoad(stackOf(t)[idx]); + return codeGen->builder.CreateLoad(stackOf(t)[idx]); } void J3CodeGenVar::push(llvm::Value* value) { Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=199634&r1=199633&r2=199634&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Mon Jan 20 03:53:23 2014 @@ -108,9 +108,11 @@ void J3Signature::generateCallerIR(uint3 llvm::Type* uint64Ty = llvm::Type::getInt64Ty(module->getContext()); llvm::Type* callerIn[] = { llvm::Type::getInt8Ty(module->getContext())->getPointerTo(), uint64Ty->getPointerTo() }; - llvm::Function* caller = (llvm::Function*)module->getOrInsertFunction(id, llvm::FunctionType::get(uint64Ty, callerIn, 0)); - llvm::BasicBlock* bb = llvm::BasicBlock::Create(caller->getContext(), "entry", caller); - llvm::IRBuilder<> builder(bb); + llvm::Function* caller = (llvm::Function*)module->getOrInsertFunction(id, llvm::FunctionType::get(uint64Ty, callerIn, 0)); + llvm::BasicBlock* bb = llvm::BasicBlock::Create(caller->getContext(), "entry", caller); + llvm::IRBuilder<>& builder = codeGen->builder; + + builder.SetInsertPoint(bb); llvm::Function::arg_iterator cur = caller->arg_begin(); llvm::Value* method = builder.CreateBitCast(cur++, fType->getPointerTo()); @@ -159,7 +161,6 @@ void J3Signature::generateCallerIR(uint3 if(ret != builder.getVoidTy()) { if(ret->isPointerTy()) { - codeGen->builder = &builder; codeGen->currentThread(); res = builder.CreatePtrToInt(builder.CreateCall2(codeGen->funcJ3ThreadPush, codeGen->currentThread(), res), uint64Ty); From gael.thomas at lip6.fr Mon Jan 20 02:04:21 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 20 Jan 2014 10:04:21 -0000 Subject: [vmkit-commits] [vmkit] r199635 - Prepare the removal of the bb field from J3CodeGen. Message-ID: <20140120100421.A9A503128078@llvm.org> Author: gthomas Date: Mon Jan 20 04:04:21 2014 New Revision: 199635 URL: http://llvm.org/viewvc/llvm-project?rev=199635&view=rev Log: Prepare the removal of the bb field from J3CodeGen. Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc 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=199635&r1=199634&r2=199635&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Mon Jan 20 04:04:21 2014 @@ -96,10 +96,6 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato #endif if(withMethod) { - bb = newBB("entry"); - - builder.SetInsertPoint(bb); - if(J3Cst::isNative(method->access())) generateNative(); else @@ -372,7 +368,7 @@ llvm::Value* J3CodeGen::nullCheck(llvm:: builder.CreateCondBr(builder.CreateIsNotNull(obj), succeed, bbNullCheckFailed); bb = succeed; - builder.SetInsertPoint(bb); + builder.SetInsertPoint(succeed); } return obj; @@ -399,7 +395,7 @@ void J3CodeGen::invoke(uint32_t access, llvm::BasicBlock* after = newBB("invoke-after"); res = builder.CreateInvoke(func, after, exceptions.nodes[curExceptionNode]->landingPad, args); bb = after; - builder.SetInsertPoint(bb); + builder.SetInsertPoint(after); } else { res = builder.CreateCall(func, args); } @@ -642,8 +638,6 @@ void J3CodeGen::checkCast(llvm::Value* o llvm::Value* res = isAssignableTo(obj, type); builder.CreateCondBr(res, succeed, bbCheckCastFailed); - - builder.SetInsertPoint(bb); } void J3CodeGen::floatToInteger(J3Type* ftype, J3Type* itype) { @@ -865,7 +859,6 @@ void J3CodeGen::translate() { exceptions.dump(vm->options()->debugTranslate-1); stack.topStack = 0; - builder.SetInsertPoint(bb); _onEndPoint(); closeBB = 1; @@ -907,7 +900,7 @@ void J3CodeGen::translate() { if(opInfos[javaPC].bb) { bb = opInfos[javaPC].bb; - builder.SetInsertPoint(bb); + builder.SetInsertPoint(opInfos[javaPC].bb); //printf("Meta stack before: %p\n", metaStack); if(opInfos[javaPC].metaStack) { stack.metaStack = opInfos[javaPC].metaStack; @@ -919,10 +912,10 @@ void J3CodeGen::translate() { //printf("Meta stack after: %p\n", metaStack); } - if(opInfos[javaPC].bb || bb->empty()) - opInfos[javaPC].insn = bb->begin(); + if(opInfos[javaPC].bb || builder.GetInsertBlock()->empty()) + opInfos[javaPC].insn = builder.GetInsertBlock()->begin(); else - opInfos[javaPC].insn = bb->end()->getPrevNode(); + opInfos[javaPC].insn = builder.GetInsertBlock()->end()->getPrevNode(); bc = codeReader->readU1(); @@ -1662,6 +1655,11 @@ void J3CodeGen::z_translate() { } void J3CodeGen::generateJava() { + llvm::BasicBlock* entry = newBB("entry"); + builder.SetInsertPoint(entry); + + bb = entry; + J3Attribute* attr = method->attributes()->lookup(vm->codeAttribute); if(!attr) @@ -1743,6 +1741,9 @@ void J3CodeGen::generateJava() { exceptions.read(&reader, codeLength); pendingBranchs[topPendingBranchs++] = codeReader->tell(); + + builder.SetInsertPoint(entry); + translate(); locals.killUnused(); @@ -1803,6 +1804,9 @@ llvm::Function* J3CodeGen::lookupNative( } void J3CodeGen::generateNative() { + bb = newBB("entry"); + builder.SetInsertPoint(bb); + std::vector args; llvm::Function* nat = lookupNative(); From gael.thomas at lip6.fr Mon Jan 20 02:06:52 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 20 Jan 2014 10:06:52 -0000 Subject: [vmkit-commits] [vmkit] r199636 - Remove the redundant bb field from J3CodeGen. Message-ID: <20140120100652.BA4602A6C03A@llvm.org> Author: gthomas Date: Mon Jan 20 04:06:52 2014 New Revision: 199636 URL: http://llvm.org/viewvc/llvm-project?rev=199636&view=rev Log: Remove the redundant bb field from J3CodeGen. Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199636&r1=199635&r2=199636&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Mon Jan 20 04:06:52 2014 @@ -43,7 +43,6 @@ namespace j3 { vmkit::BumpAllocator* allocator; llvm::Module* module; - llvm::BasicBlock* bb; llvm::IRBuilder<> builder; llvm::Function* llvmFunction; Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc?rev=199636&r1=199635&r2=199636&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc Mon Jan 20 04:06:52 2014 @@ -160,7 +160,7 @@ void J3CodeGen::genDebugOpcode() { buildString(buf)); builder.CreateBr(after); - builder.SetInsertPoint(bb = after); + builder.SetInsertPoint(after); } } 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=199636&r1=199635&r2=199636&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Mon Jan 20 04:06:52 2014 @@ -366,8 +366,6 @@ llvm::Value* J3CodeGen::nullCheck(llvm:: } builder.CreateCondBr(builder.CreateIsNotNull(obj), succeed, bbNullCheckFailed); - - bb = succeed; builder.SetInsertPoint(succeed); } @@ -394,7 +392,6 @@ void J3CodeGen::invoke(uint32_t access, //llvm::BasicBlock* after = forwardBranch("invoke-after", codeReader->tell(), 0, 0); llvm::BasicBlock* after = newBB("invoke-after"); res = builder.CreateInvoke(func, after, exceptions.nodes[curExceptionNode]->landingPad, args); - bb = after; builder.SetInsertPoint(after); } else { res = builder.CreateCall(func, args); @@ -780,10 +777,9 @@ llvm::BasicBlock* J3CodeGen::forwardBran if(fakeTerminator) fakeTerminator->eraseFromParent(); - if(isSelf) { - bb = after; + if(isSelf) builder.SetInsertPoint(after); - } + //fprintf(stderr, "--- after split ---\n"); //before->dump(); //after->dump(); @@ -884,7 +880,7 @@ void J3CodeGen::translate() { } if(opInfos[javaPC].insn || opInfos[javaPC].bb) { - if(closeBB && !bb->getTerminator()) { + if(closeBB && !builder.GetInsertBlock()->getTerminator()) { if(!opInfos[javaPC].bb) J3::internalError("random split???"); builder.CreateBr(opInfos[javaPC].bb); @@ -899,7 +895,6 @@ void J3CodeGen::translate() { closeBB = 1; if(opInfos[javaPC].bb) { - bb = opInfos[javaPC].bb; builder.SetInsertPoint(opInfos[javaPC].bb); //printf("Meta stack before: %p\n", metaStack); if(opInfos[javaPC].metaStack) { @@ -1658,8 +1653,6 @@ void J3CodeGen::generateJava() { llvm::BasicBlock* entry = newBB("entry"); builder.SetInsertPoint(entry); - bb = entry; - J3Attribute* attr = method->attributes()->lookup(vm->codeAttribute); if(!attr) @@ -1804,8 +1797,7 @@ llvm::Function* J3CodeGen::lookupNative( } void J3CodeGen::generateNative() { - bb = newBB("entry"); - builder.SetInsertPoint(bb); + builder.SetInsertPoint(newBB("entry")); std::vector args; @@ -1848,11 +1840,11 @@ void J3CodeGen::generateNative() { llvm::BasicBlock* ifnotnull = newBB("ifnotnull"); builder.CreateCondBr(builder.CreateIsNull(res), ifnull, ifnotnull); - builder.SetInsertPoint(bb = ifnull); + builder.SetInsertPoint(ifnull); builder.CreateCall2(funcJ3ThreadRestore, thread, frame); builder.CreateRet(nullValue); - builder.SetInsertPoint(bb = ifnotnull); + builder.SetInsertPoint(ifnotnull); res = handleToObject(res); builder.CreateCall2(funcJ3ThreadRestore, thread, frame); } From gael.thomas at lip6.fr Mon Jan 20 02:45:42 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 20 Jan 2014 10:45:42 -0000 Subject: [vmkit-commits] [vmkit] r199641 - Use a single flag to drive the code generator. Message-ID: <20140120104542.50F8B19BE001@llvm.org> Author: gthomas Date: Mon Jan 20 04:45:41 2014 New Revision: 199641 URL: http://llvm.org/viewvc/llvm-project?rev=199641&view=rev Log: Use a single flag to drive the code generator. Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199641&r1=199640&r2=199641&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Mon Jan 20 04:45:41 2014 @@ -36,11 +36,27 @@ namespace j3 { }; class J3CodeGen { + public: + enum { + WithMethod = 1, + WithCaller = 2, + OnlyTranslate = 4, + NotUseStub = 8 + }; + + bool withMethod() { return mode & WithMethod; } + bool withCaller() { return mode & WithCaller; } + bool onlyTranslate() { return mode & OnlyTranslate; } + bool useStub() { return !(mode & NotUseStub); } + + private: friend class J3CodeGenVar; friend class J3ExceptionTable; friend class J3ExceptionNode; friend class J3Signature; + uint32_t mode; + vmkit::BumpAllocator* allocator; llvm::Module* module; llvm::IRBuilder<> builder; @@ -52,6 +68,7 @@ namespace j3 { J3Method* method; J3Signature* signature; J3Reader* codeReader; + uint32_t access; llvm::BasicBlock* bbCheckCastFailed; llvm::BasicBlock* bbNullCheckFailed; @@ -184,13 +201,13 @@ namespace j3 { llvm::Function* patchPoint64; llvm::Function* patchPointVoid; - J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* method, bool withMethod, bool withCaller, bool onlyTranslate); + J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* method, uint32_t mode); ~J3CodeGen(); void* operator new(size_t n, vmkit::BumpAllocator* _allocator); void operator delete(void* ptr); public: - static void translate(J3Method* method, bool withMethod=1, bool withCaller=1, bool onlyTranslate=0); + static void translate(J3Method* method, uint32_t mode); }; } Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=199641&r1=199640&r2=199641&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Mon Jan 20 04:45:41 2014 @@ -94,9 +94,10 @@ namespace j3 { void aotCompile(); void aotSnapshot(llvm::Linker* linker); - void ensureCompiled(bool withCaller, bool onlyTranslate=0); + void ensureCompiled(uint32_t mode); J3Signature::function_t cxxCaller(); void* fnPtr(); + llvm::Function* llvmFunction() { return _llvmFunction; } void* functionPointerOrStaticTrampoline(); void* functionPointerOrVirtualTrampoline(); 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=199641&r1=199640&r2=199641&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Mon Jan 20 04:45:41 2014 @@ -28,17 +28,19 @@ using namespace j3; #define _onEndPoint() ({ if(onEndPoint()) return; }) -J3CodeGen::J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* m, bool withMethod, bool withCaller, bool onlyTranslate) : +J3CodeGen::J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* m, uint32_t _mode) : builder(J3Thread::get()->vm()->llvmContext()), exceptions(this) { allocator = _allocator; + mode = _mode; method = m; cl = method->cl()->asClass(); signature = method->signature(); loader = cl->loader(); vm = J3Thread::get()->vm(); + access = method->access(); #if 0 /* usefull to debug a single function */ @@ -56,9 +58,8 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato method->name()->cStr(), method->signature()->name()->cStr()); - module = new llvm::Module(method->llvmFunctionName(), builder.getContext()); - llvmFunction = buildFunction(method, 0); - llvmFunction->setGC("vmkit"); + llvmFunction = method->llvmFunction(); + module = llvmFunction ? llvmFunction->getParent() : new llvm::Module(method->llvmFunctionName(), builder.getContext()); bbCheckCastFailed = 0; bbNullCheckFailed = 0; @@ -95,8 +96,12 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato } #endif - if(withMethod) { - if(J3Cst::isNative(method->access())) + /* only translate of requested and not already translated */ + if(withMethod() && !llvmFunction) { + llvmFunction = buildFunction(method, 0); + llvmFunction->setGC("vmkit"); + + if(J3Cst::isNative(access)) generateNative(); else generateJava(); @@ -105,21 +110,23 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato llvmFunction->dump(); } - uint32_t access = method->access(); - uint32_t needsCaller = withCaller && !signature->caller(access); + uint32_t needsCaller = withCaller() && !signature->caller(access); + if(needsCaller) signature->generateCallerIR(access, this, module, "generic-caller"); - if(!onlyTranslate) + /* compile only if requested and not already compiled */ + void* fnPtr; + if(withMethod() && !onlyTranslate() && !method->fnPtr()) { loader->compileModule(module); + fnPtr = (void*)loader->ee()->getFunctionAddress(llvmFunction->getName().data()); + } else + fnPtr = method->fnPtr(); if(needsCaller) signature->setCaller(access, (J3Signature::function_t)loader->ee()->getFunctionAddress("generic-caller")); - if(withMethod) { - void* fnPtr = onlyTranslate ? 0 : (void*)loader->ee()->getFunctionAddress(llvmFunction->getName().data()); - method->markCompiled(llvmFunction, fnPtr); - } + method->markCompiled(llvmFunction, fnPtr); } J3CodeGen::~J3CodeGen() { @@ -132,11 +139,11 @@ void* J3CodeGen::operator new(size_t n, void J3CodeGen::operator delete(void* ptr) { } -void J3CodeGen::translate(J3Method* method, bool withMethod, bool withCaller, bool onlyTranslate) { +void J3CodeGen::translate(J3Method* method, uint32_t mode) { J3Thread::get()->vm()->lockCompiler(); vmkit::BumpAllocator* allocator = vmkit::BumpAllocator::create(); - delete new(allocator) J3CodeGen(allocator, method, withMethod, withCaller, onlyTranslate); + delete new(allocator) J3CodeGen(allocator, method, mode); vmkit::BumpAllocator::destroy(allocator); J3Thread::get()->vm()->unlockCompiler(); @@ -1721,7 +1728,7 @@ void J3CodeGen::generateJava() { else builder.CreateRet(unflatten(ret.at(0, llvmFunction->getReturnType()), llvmFunction->getReturnType())); - if(J3Cst::isSynchronized(method->access())) { + if(J3Cst::isSynchronized(access)) { static bool echoDone = 0; if(!echoDone) { fprintf(stderr, "IMPLEMENT ME: synchronized java\n"); @@ -1773,10 +1780,10 @@ llvm::Function* J3CodeGen::lookupNative( nativeIns.push_back(vm->typeJNIEnvPtr); - if(J3Cst::isStatic(method->access())) + if(J3Cst::isStatic(access)) nativeIns.push_back(doNativeType(vm->classClass->llvmType())); - llvm::FunctionType* origFType = method->signature()->functionType(method->access()); + llvm::FunctionType* origFType = method->signature()->functionType(access); for(llvm::FunctionType::param_iterator it=origFType->param_begin(); it!=origFType->param_end(); it++) nativeIns.push_back(doNativeType(*it)); @@ -1807,7 +1814,7 @@ void J3CodeGen::generateNative() { llvm::Value* thread = currentThread(); llvm::Value* frame = builder.CreateCall(funcJ3ThreadTell, thread); - if(J3Cst::isSynchronized(method->access())) { + if(J3Cst::isSynchronized(access)) { static bool echoDone = 0; if(!echoDone) { fprintf(stderr, "IMPLEMENT ME: synchronized java\n"); @@ -1816,7 +1823,7 @@ void J3CodeGen::generateNative() { } args.push_back(builder.CreateCall(funcJniEnv)); - if(J3Cst::isStatic(method->access())) + if(J3Cst::isStatic(access)) args.push_back(javaClass(cl, 1)); uint32_t selfDone = 0; 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=199641&r1=199640&r2=199641&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Mon Jan 20 04:45:41 2014 @@ -55,7 +55,7 @@ J3Signature::function_t J3Method::cxxCal void J3Method::aotCompile() { if(!J3Cst::isAbstract(access())) { //fprintf(stderr, "compiling: %s::%s%s\n", cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr()); - ensureCompiled(0, 1); + ensureCompiled(J3CodeGen::WithMethod | J3CodeGen::OnlyTranslate); } } @@ -66,10 +66,10 @@ void J3Method::aotSnapshot(llvm::Linker* } } -void J3Method::ensureCompiled(bool withCaller, bool onlyTranslate) { - if(!fnPtr() || (withCaller && !cxxCaller())) { +void J3Method::ensureCompiled(uint32_t mode) { + if(((mode & J3CodeGen::WithMethod) && !fnPtr()) || ((mode & J3CodeGen::WithCaller) && !cxxCaller())) { //fprintf(stderr, "materializing: %s::%s%s\n", cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr()); - J3CodeGen::translate(this, !fnPtr(), withCaller, onlyTranslate); + J3CodeGen::translate(this, mode); } } @@ -114,7 +114,7 @@ J3Method* J3Method::resolve(J3ObjectHand J3Value J3Method::internalInvoke(J3ObjectHandle* handle, J3Value* inArgs) { cl()->initialise(); - ensureCompiled(1); /* force the generation of the code and thus of the functionType */ + ensureCompiled(J3CodeGen::WithMethod | J3CodeGen::WithCaller); /* force the generation of the code and thus of the functionType */ J3Value* reIn; if(handle) { @@ -138,7 +138,7 @@ J3Value J3Method::internalInvoke(J3Objec J3Value J3Method::internalInvoke(J3ObjectHandle* handle, va_list va) { cl()->initialise(); - ensureCompiled(1); /* force the generation of the code and thus of the functionType */ + ensureCompiled(J3CodeGen::WithMethod | J3CodeGen::WithCaller); /* force the generation of the code and thus of the functionType */ llvm::FunctionType* fType = signature()->functionType(J3Cst::ACC_STATIC); /* static signature for va */ J3Value* args = (J3Value*)alloca(sizeof(J3Value)*(fType->getNumParams() + 1)); Modified: vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc?rev=199641&r1=199640&r2=199641&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Mon Jan 20 04:45:41 2014 @@ -3,6 +3,7 @@ #include "j3/j3method.h" #include "j3/j3thread.h" #include "j3/j3class.h" +#include "j3/j3codegen.h" #include "j3/j3.h" using namespace j3; @@ -20,7 +21,7 @@ void J3Trampoline::interfaceTrampoline(J void* res; if(desc->nbMethods == 1) { - desc->methods[0]->ensureCompiled(0); + desc->methods[0]->ensureCompiled(J3CodeGen::WithMethod); res = desc->methods[0]->fnPtr(); handle->vt()->_interfaceMethodTable[index] = res; } else { @@ -40,7 +41,7 @@ void J3Trampoline::staticTrampoline(J3Ob J3TrampolineArg arg = J3Thread::get()->_trampolineArg; target->cl()->initialise(); - target->ensureCompiled(0); + target->ensureCompiled(J3CodeGen::WithMethod); trampoline_restart(target->fnPtr(), &arg); } @@ -52,7 +53,7 @@ void J3Trampoline::virtualTrampoline(J3O J3ObjectType* cl = handle->vt()->type()->asObjectType(); J3Method* impl = cl == target->cl() ? target : cl->findMethod(0, target->name(), target->signature()); - impl->ensureCompiled(0); + impl->ensureCompiled(J3CodeGen::WithMethod); void* res = impl->fnPtr(); handle->vt()->virtualMethods()[impl->index()] = res; From gael.thomas at lip6.fr Mon Jan 20 02:53:34 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 20 Jan 2014 10:53:34 -0000 Subject: [vmkit-commits] [vmkit] r199643 - Don't use stub in aot mode. Message-ID: <20140120105335.061B019BE001@llvm.org> Author: gthomas Date: Mon Jan 20 04:53:34 2014 New Revision: 199643 URL: http://llvm.org/viewvc/llvm-project?rev=199643&view=rev Log: Don't use stub in aot mode. Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc 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=199643&r1=199642&r2=199643&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Mon Jan 20 04:53:34 2014 @@ -217,6 +217,8 @@ void J3::compileApplication() { llvm::Module* res = new llvm::Module("yop", llvmContext()); llvm::Linker* linker = new llvm::Linker(res); loader->aotSnapshot(linker); + + res->dump(); } void J3::runApplication() { 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=199643&r1=199642&r2=199643&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Mon Jan 20 04:53:34 2014 @@ -204,7 +204,7 @@ llvm::Value* J3CodeGen::unflatten(llvm:: } llvm::Function* J3CodeGen::buildFunction(J3Method* method, bool isStub) { - const char* id = (isStub && !method->fnPtr()) ? method->llvmStubName(cl) : method->llvmFunctionName(cl); + const char* id = (useStub() && isStub && !method->fnPtr()) ? method->llvmStubName(cl) : method->llvmFunctionName(cl); loader->addSymbol(id, method); return (llvm::Function*)module->getOrInsertFunction(id, method->signature()->functionType(method->access())); } 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=199643&r1=199642&r2=199643&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Mon Jan 20 04:53:34 2014 @@ -55,7 +55,7 @@ J3Signature::function_t J3Method::cxxCal void J3Method::aotCompile() { if(!J3Cst::isAbstract(access())) { //fprintf(stderr, "compiling: %s::%s%s\n", cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr()); - ensureCompiled(J3CodeGen::WithMethod | J3CodeGen::OnlyTranslate); + ensureCompiled(J3CodeGen::WithMethod | J3CodeGen::OnlyTranslate | J3CodeGen::NotUseStub); } } From gael.thomas at lip6.fr Mon Jan 20 03:03:15 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 20 Jan 2014 11:03:15 -0000 Subject: [vmkit-commits] [vmkit] r199645 - Define the compilation mode directly in the class loader. Message-ID: <20140120110315.D694B2A6C03A@llvm.org> Author: gthomas Date: Mon Jan 20 05:03:15 2014 New Revision: 199645 URL: http://llvm.org/viewvc/llvm-project?rev=199645&view=rev Log: Define the compilation mode directly in the class loader. Modified: vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/include/j3/j3classloader.h vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3class.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199645&r1=199644&r2=199645&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Mon Jan 20 05:03:15 2014 @@ -229,7 +229,7 @@ namespace j3 { public: J3Class(J3ClassLoader* loader, const vmkit::Name* name, J3ClassBytes* bytes, J3ObjectHandle* protectionDomain, const char* source); - void aotCompile(); + void compileAll(); void aotSnapshot(llvm::Linker* linker); J3ObjectHandle* clone(J3ObjectHandle* obj); Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=199645&r1=199644&r2=199645&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Mon Jan 20 05:03:15 2014 @@ -38,6 +38,8 @@ namespace j3 { static J3InterfaceMethodLess j3InterfaceMethodLess; + uint32_t _compileMode; + J3ObjectHandle* _javaClassLoader; J3GlobalReferences _globalReferences; @@ -59,6 +61,9 @@ namespace j3 { public: J3ClassLoader(J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator); + uint32_t compileMode() { return _compileMode; } + void setCompileMode(uint32_t mode) { _compileMode = mode; } + void aotSnapshot(llvm::Linker* linker); void addNativeLibrary(void* handle); Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=199645&r1=199644&r2=199645&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Mon Jan 20 05:03:15 2014 @@ -92,7 +92,6 @@ namespace j3 { J3Value invokeVirtual(J3ObjectHandle* obj, J3Value* args); J3Value invokeVirtual(J3ObjectHandle* obj, va_list va); - void aotCompile(); void aotSnapshot(llvm::Linker* linker); void ensureCompiled(uint32_t mode); J3Signature::function_t cxxCaller(); 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=199645&r1=199644&r2=199645&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Mon Jan 20 05:03:15 2014 @@ -12,6 +12,7 @@ #include "j3/j3lib.h" #include "j3/j3field.h" #include "j3/j3utf16.h" +#include "j3/j3codegen.h" #include "llvm/IR/Type.h" #include "llvm/IR/DerivedTypes.h" @@ -190,6 +191,8 @@ void J3::compileApplication() { names()->get("()Ljava/lang/ClassLoader;"))->invokeStatic().valObject); + loader->setCompileMode(J3CodeGen::OnlyTranslate | J3CodeGen::NotUseStub); + if(options()->mainClass) J3::internalError("compiling a single class is not yet supported"); else { @@ -209,7 +212,7 @@ void J3::compileApplication() { char buf[name->length() - 5]; memcpy(buf, name->cStr(), name->length() - 6); buf[name->length()-6] = 0; - loader->getTypeFromQualified(0, buf)->asClass()->aotCompile(); + loader->getTypeFromQualified(0, buf)->asClass()->compileAll(); } } } 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=199645&r1=199644&r2=199645&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Mon Jan 20 05:03:15 2014 @@ -17,6 +17,7 @@ #include "j3/j3thread.h" #include "j3/j3field.h" #include "j3/j3attribute.h" +#include "j3/j3codegen.h" using namespace j3; @@ -320,15 +321,17 @@ J3Class::J3Class(J3ClassLoader* loader, status = LOADED; } -void J3Class::aotCompile() { +void J3Class::compileAll() { resolve(); for(uint32_t i=0; iaotCompile(); + if(!J3Cst::isAbstract(methods()[i]->access())) + methods()[i]->ensureCompiled(J3CodeGen::WithMethod); } for(uint32_t i=0; inbMethods(); i++) { - staticLayout()->methods()[i]->aotCompile(); + if(!J3Cst::isAbstract(staticLayout()->methods()[i]->access())) + staticLayout()->methods()[i]->ensureCompiled(J3CodeGen::WithMethod); } } 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=199645&r1=199644&r2=199645&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Mon Jan 20 05:03:15 2014 @@ -52,13 +52,6 @@ J3Signature::function_t J3Method::cxxCal return signature()->caller(access()); } -void J3Method::aotCompile() { - if(!J3Cst::isAbstract(access())) { - //fprintf(stderr, "compiling: %s::%s%s\n", cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr()); - ensureCompiled(J3CodeGen::WithMethod | J3CodeGen::OnlyTranslate | J3CodeGen::NotUseStub); - } -} - void J3Method::aotSnapshot(llvm::Linker* linker) { if(_llvmFunction) { std::string err; From gael.thomas at lip6.fr Mon Jan 20 03:43:15 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 20 Jan 2014 11:43:15 -0000 Subject: [vmkit-commits] [vmkit] r199647 - Generate the llvm bytecode in a file when in aot mode. Message-ID: <20140120114315.51B8519BE001@llvm.org> Author: gthomas Date: Mon Jan 20 05:43:14 2014 New Revision: 199647 URL: http://llvm.org/viewvc/llvm-project?rev=199647&view=rev Log: Generate the llvm bytecode in a file when in aot mode. Modified: vmkit/branches/mcjit/include/j3/j3classloader.h vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/include/j3/j3options.h vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc vmkit/branches/mcjit/lib/mmtk/Makefile Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=199647&r1=199646&r2=199647&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Mon Jan 20 05:43:14 2014 @@ -38,7 +38,7 @@ namespace j3 { static J3InterfaceMethodLess j3InterfaceMethodLess; - uint32_t _compileMode; + uint32_t _compilationMode; J3ObjectHandle* _javaClassLoader; J3GlobalReferences _globalReferences; @@ -61,8 +61,8 @@ namespace j3 { public: J3ClassLoader(J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator); - uint32_t compileMode() { return _compileMode; } - void setCompileMode(uint32_t mode) { _compileMode = mode; } + uint32_t compilationMode() { return _compilationMode; } + void setCompilationMode(uint32_t mode) { _compilationMode = mode; } void aotSnapshot(llvm::Linker* linker); Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199647&r1=199646&r2=199647&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Mon Jan 20 05:43:14 2014 @@ -41,13 +41,15 @@ namespace j3 { WithMethod = 1, WithCaller = 2, OnlyTranslate = 4, - NotUseStub = 8 + NotUseStub = 8, + NotNeedGC = 16 }; bool withMethod() { return mode & WithMethod; } bool withCaller() { return mode & WithCaller; } bool onlyTranslate() { return mode & OnlyTranslate; } bool useStub() { return !(mode & NotUseStub); } + bool needGC() { return !(mode & NotNeedGC); } private: friend class J3CodeGenVar; Modified: vmkit/branches/mcjit/include/j3/j3options.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3options.h?rev=199647&r1=199646&r2=199647&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3options.h (original) +++ vmkit/branches/mcjit/include/j3/j3options.h Mon Jan 20 05:43:14 2014 @@ -52,6 +52,7 @@ namespace j3 { uintptr_t stackSize; bool isAOT; + const char* aotFile; J3Options(); 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=199647&r1=199646&r2=199647&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Mon Jan 20 05:43:14 2014 @@ -18,6 +18,9 @@ #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/Module.h" #include "llvm/Linker.h" +#include "llvm/Support/ToolOutputFile.h" +#include "llvm/PassManager.h" +#include "llvm/Bitcode/ReaderWriter.h" #include "vmkit/safepoint.h" #include "vmkit/system.h" @@ -191,7 +194,7 @@ void J3::compileApplication() { names()->get("()Ljava/lang/ClassLoader;"))->invokeStatic().valObject); - loader->setCompileMode(J3CodeGen::OnlyTranslate | J3CodeGen::NotUseStub); + loader->setCompilationMode(J3CodeGen::OnlyTranslate | J3CodeGen::NotUseStub | J3CodeGen::NotNeedGC); if(options()->mainClass) J3::internalError("compiling a single class is not yet supported"); @@ -221,7 +224,16 @@ void J3::compileApplication() { llvm::Linker* linker = new llvm::Linker(res); loader->aotSnapshot(linker); - res->dump(); + std::string err; + llvm::tool_output_file out(options()->aotFile, err, llvm::sys::fs::F_Binary); + if(!err.empty()) + fprintf(stderr, "%s\n", err.c_str()); + else { + llvm::PassManager pm; + pm.add(llvm::createBitcodeWriterPass(out.os())); + pm.run(*res); + out.keep(); + } } void J3::runApplication() { 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=199647&r1=199646&r2=199647&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Mon Jan 20 05:43:14 2014 @@ -99,7 +99,9 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato /* only translate of requested and not already translated */ if(withMethod() && !llvmFunction) { llvmFunction = buildFunction(method, 0); - llvmFunction->setGC("vmkit"); + + if(needGC()) + llvmFunction->setGC("vmkit"); if(J3Cst::isNative(access)) generateNative(); Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc?rev=199647&r1=199646&r2=199647&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc Mon Jan 20 05:43:14 2014 @@ -24,8 +24,10 @@ void J3CodeGenVar::killUnused(llvm::Allo llvm::dyn_cast(*(cur->use_begin()))->eraseFromParent(); cur->eraseFromParent(); } else if(isObj) { - codeGen->builder.SetInsertPoint(cur->getNextNode()); - codeGen->builder.CreateCall2(codeGen->gcRoot, codeGen->builder.CreateBitCast(refStack[i], i8ptrptr), meta); + if(codeGen->needGC()) { + codeGen->builder.SetInsertPoint(cur->getNextNode()); + codeGen->builder.CreateCall2(codeGen->gcRoot, codeGen->builder.CreateBitCast(refStack[i], i8ptrptr), meta); + } //codeGen->builder.CreateStore(codeGen->nullValue, cur); // } 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=199647&r1=199646&r2=199647&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Mon Jan 20 05:43:14 2014 @@ -62,7 +62,7 @@ void J3Method::aotSnapshot(llvm::Linker* void J3Method::ensureCompiled(uint32_t mode) { if(((mode & J3CodeGen::WithMethod) && !fnPtr()) || ((mode & J3CodeGen::WithCaller) && !cxxCaller())) { //fprintf(stderr, "materializing: %s::%s%s\n", cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr()); - J3CodeGen::translate(this, mode); + J3CodeGen::translate(this, mode | cl()->loader()->compilationMode()); } } 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=199647&r1=199646&r2=199647&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Mon Jan 20 05:43:14 2014 @@ -74,9 +74,10 @@ void J3CmdLineParser::process() { nyi("-no-jre-restrict-search"); else if(opteq("-?") || opteq("-help")) help(); - else if(opteq("-Xaot")) + else if(opteq("-Xaot")) { options->isAOT = 1; - else if(opteq("-Xno-aot")) + options->aotFile = argv[++cur]; + } else if(opteq("-Xno-aot")) options->isAOT = 0; else if(optbeg("-X")) nyi("-X"); Modified: vmkit/branches/mcjit/lib/mmtk/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/mmtk/Makefile?rev=199647&r1=199646&r2=199647&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/mmtk/Makefile (original) +++ vmkit/branches/mcjit/lib/mmtk/Makefile Mon Jan 20 05:43:14 2014 @@ -14,4 +14,4 @@ J3=$(BIN_DIR)/j3 $(BUILD_DIR)/mmtk-llvm.bc: $(BUILD_DIR)/.dir $(J3) $(SELF) $(Echo) "Generating the llvm bytecode of mmtk" - $(Verb) $(J3) -Xaot -cp $(MMTK_PATH)/vmmagic-stub/classes/:$(MMTK_PATH)/options/classes/ -jar $(MMTK_PATH)/mmtk/mmtk.jar \ No newline at end of file + $(Verb) $(J3) -Xaot $@ -cp $(MMTK_PATH)/vmmagic-stub/classes/:$(MMTK_PATH)/options/classes/ -jar $(MMTK_PATH)/mmtk/mmtk.jar \ No newline at end of file From gael.thomas at lip6.fr Mon Jan 20 05:35:01 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 20 Jan 2014 13:35:01 -0000 Subject: [vmkit-commits] [vmkit] r199656 - Add the lowering pass for MMTk. Message-ID: <20140120133502.07EB419BE001@llvm.org> Author: gthomas Date: Mon Jan 20 07:35:01 2014 New Revision: 199656 URL: http://llvm.org/viewvc/llvm-project?rev=199656&view=rev Log: Add the lowering pass for MMTk. Added: vmkit/branches/mcjit/lib/mmtk/magic/ (with props) vmkit/branches/mcjit/lib/mmtk/magic/Makefile vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc Modified: vmkit/branches/mcjit/Makefile vmkit/branches/mcjit/Makefile.rules vmkit/branches/mcjit/lib/mmtk/Makefile Modified: vmkit/branches/mcjit/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/Makefile?rev=199656&r1=199655&r2=199656&view=diff ============================================================================== --- vmkit/branches/mcjit/Makefile (original) +++ vmkit/branches/mcjit/Makefile Mon Jan 20 07:35:01 2014 @@ -5,6 +5,6 @@ LEVEL := . -DIRS := tools/vmkit-extract lib tools/j3 +DIRS := tools/vmkit-extract lib tools/j3 lib/mmtk/ include $(LEVEL)/Makefile.rules Modified: vmkit/branches/mcjit/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/Makefile.rules?rev=199656&r1=199655&r2=199656&view=diff ============================================================================== --- vmkit/branches/mcjit/Makefile.rules (original) +++ vmkit/branches/mcjit/Makefile.rules Mon Jan 20 07:35:01 2014 @@ -60,49 +60,38 @@ SHFLAGS=-lpthread -ldl -lz -lncurses -fr ############################################################################### # Targets ############################################################################### -.PHONY: all tidy clean confclean +.PHONY: all all-recursive clean clean-recursive clean-local tidy confclean check .SECONDARY: .SUFFIXES: -all:: - -check:: - $(Echo) "---- building with: " - $(Echo) " PROJ_SRC_ROOT: $(PROJ_SRC_ROOT)" - $(Echo) " PROJ_OBJ_ROOT: $(PROJ_OBJ_ROOT)" - $(Echo) " SHFLAGS: $(SHFLAGS)" - $(Echo) " EXEEXT: $(EXEEXT)" - $(Echo) " SHLIBEXT: $(SHLIBEXT)" - $(Echo) " OPTIMIZED: $(OPTIMIZED)" - $(Echo) " DEBUG: $(DEBUG)" - $(Echo) " ASSERT: $(ASSERT)" - $(Echo) " CONFIG_FILES: $(CONFIG_FILES)" - $(Echo) " CONFIG_HEADERS: $(CONFIG_HEADERS)" - $(Echo) " BUILD_NAME: $(BUILD_NAME)" - $(Echo) " CLANG: $(CLANG)" - $(Echo) " CLANGXX: $(CLANGXX)" - $(Echo) " LLC: $(LLC)" - $(Echo) " LOPT: $(LOPT)" - ############################################################################### # Recursive target managment ############################################################################### RECURSIVE_TARGETS=all clean define do_sub_target -$1:: +$1-recursive:: #$(Echo) "Entering directory $$(PROF)/$2" $(Verb) +$(MAKE) $(SUB_OPT) -C $2 $1 PROF=$(PROF)/$2; \ if [ $$$$? != 0 ]; then echo "$$(EchoMsg) abort with errors in $$(PROF)/$2"; exit 1; fi endef -$(foreach target,$(RECURSIVE_TARGETS),$(foreach dir,$(DIRS),$(eval $(call do_sub_target,$(target),$(dir))))) +define do_recursive_target +$1: + $(Verb) +$(MAKE) $(SUB_OPT) $1-recursive + $(Verb) +$(MAKE) $1-local +$1-recursive:: +$1-local:: +$$(foreach dir,$$(DIRS),$$(eval $$(call do_sub_target,$1,$$(dir)))) +endef + +$(foreach target,$(RECURSIVE_TARGETS),$(eval $(call do_recursive_target,$(target)))) tidy: $(Echo) "Cleaning temporary files" $(Verb) find $(PROJ_OBJ_ROOT) \( -iname "*~" -o -iname "\#*" \) -exec rm -f {} \; -clean:: +clean-local:: $(Echo) "Cleaning compilation files" $(Verb) rm -Rf $(BUILD_DIR) @@ -113,6 +102,24 @@ confclean: clean $(Verb) rm -Rf $(PROJ_OBJ_ROOT)/config.status $(PROJ_OBJ_ROOT)/config.log $(Verb) rm -Rf $(PROJ_OBJ_ROOT)/autoconf/autom4te.cache $(PROJ_OBJ_ROOT)/autoconf/configure.bak +check:: + $(Echo) "---- building with: " + $(Echo) " PROJ_SRC_ROOT: $(PROJ_SRC_ROOT)" + $(Echo) " PROJ_OBJ_ROOT: $(PROJ_OBJ_ROOT)" + $(Echo) " SHFLAGS: $(SHFLAGS)" + $(Echo) " EXEEXT: $(EXEEXT)" + $(Echo) " SHLIBEXT: $(SHLIBEXT)" + $(Echo) " OPTIMIZED: $(OPTIMIZED)" + $(Echo) " DEBUG: $(DEBUG)" + $(Echo) " ASSERT: $(ASSERT)" + $(Echo) " CONFIG_FILES: $(CONFIG_FILES)" + $(Echo) " CONFIG_HEADERS: $(CONFIG_HEADERS)" + $(Echo) " BUILD_NAME: $(BUILD_NAME)" + $(Echo) " CLANG: $(CLANG)" + $(Echo) " CLANGXX: $(CLANGXX)" + $(Echo) " LLC: $(LLC)" + $(Echo) " LOPT: $(LOPT)" + ############################################################################### # Build system managment ############################################################################### @@ -158,7 +165,7 @@ ifdef MODULE GEN_MODULE=$(LIB_DIR)/$(MODULE) -all:: $(LIB_DIR)/.dir $(GEN_MODULE).a $(GEN_MODULE).bc +all-local:: $(LIB_DIR)/.dir $(GEN_MODULE).a $(GEN_MODULE).bc # not used for the moment ifdef __EXTRACT__ @@ -249,7 +256,7 @@ TOOL_FLAGS=$(LLVM_LDFLAGS) $(SHFLAGS) LDFLAGS=$(SO_LIBS) endif -all:: $(TOOL_ALL) +all-local:: $(TOOL_ALL) $(TOOL_OUT): $(TOOL_DEP) $(Echo) "Linking '$(notdir $@)'" @@ -270,7 +277,7 @@ endif ############################################################################### ifdef LIBRARY SONAME=$(LIB_DIR)/$(LIBRARY) -all:: $(LIB_DIR)/.dir $(SONAME)$(SHLIBEXT) +all-local:: $(LIB_DIR)/.dir $(SONAME)$(SHLIBEXT) SO_FILES=$(OBJ_FILES) Modified: vmkit/branches/mcjit/lib/mmtk/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/mmtk/Makefile?rev=199656&r1=199655&r2=199656&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/mmtk/Makefile (original) +++ vmkit/branches/mcjit/lib/mmtk/Makefile Mon Jan 20 07:35:01 2014 @@ -5,13 +5,21 @@ LEVEL := ../.. -BASE_OBJ_FILES=mmtk-llvm +DIRS:=magic + +BASE_OBJ_FILES=mmtk-lowered MODULE=mmtk include $(LEVEL)/Makefile.rules +MMTK_JAR=$(MMTK_PATH)/mmtk/mmtk.jar +LOWER=$(LIB_DIR)/mmtk-pass$(SHLIBEXT) J3=$(BIN_DIR)/j3 -$(BUILD_DIR)/mmtk-llvm.bc: $(BUILD_DIR)/.dir $(J3) $(SELF) - $(Echo) "Generating the llvm bytecode of mmtk" - $(Verb) $(J3) -Xaot $@ -cp $(MMTK_PATH)/vmmagic-stub/classes/:$(MMTK_PATH)/options/classes/ -jar $(MMTK_PATH)/mmtk/mmtk.jar \ No newline at end of file +$(BUILD_DIR)/mmtk-lowered.bc: $(BUILD_DIR)/mmtk-bc.bc $(LOWER) + $(Echo) "Lowering '$(notdir $<)'" + $(Verb) cp $< $@ + +$(BUILD_DIR)/mmtk-bc.bc: $(MMTK_JAR) $(BUILD_DIR)/.dir $(J3) $(SELF) + $(Echo) "Compiling '$(notdir $<)'" + $(Verb) $(J3) -Xaot $@ -cp $(MMTK_PATH)/vmmagic-stub/classes/:$(MMTK_PATH)/options/classes/ -jar $(MMTK_JAR) \ No newline at end of file Propchange: vmkit/branches/mcjit/lib/mmtk/magic/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Mon Jan 20 07:35:01 2014 @@ -0,0 +1 @@ +Debug+Asserts Added: vmkit/branches/mcjit/lib/mmtk/magic/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/mmtk/magic/Makefile?rev=199656&view=auto ============================================================================== --- vmkit/branches/mcjit/lib/mmtk/magic/Makefile (added) +++ vmkit/branches/mcjit/lib/mmtk/magic/Makefile Mon Jan 20 07:35:01 2014 @@ -0,0 +1,15 @@ +##===- mmtk/magic/Makefile ---------------------------------*- Makefile -*-===## +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LEVEL = ../../.. + +LIBRARY=mmtk-pass + +include $(LEVEL)/Makefile.rules + Added: vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc?rev=199656&view=auto ============================================================================== --- vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc (added) +++ vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc Mon Jan 20 07:35:01 2014 @@ -0,0 +1,155 @@ +//===-- LowerJavaRT.cpp - Remove references to RT classes and functions --===// +// +// The VMKit project +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#if 0 + +#include "llvm/IR/Constants.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Module.h" +#include "llvm/Pass.h" +#include "llvm/Support/CallSite.h" +#include "llvm/Support/Compiler.h" +#include "llvm/Support/Debug.h" +#include "llvm/Support/raw_ostream.h" + +using namespace llvm; + +namespace { + + class LowerJavaRT : public ModulePass { + public: + static char ID; + LowerJavaRT() : ModulePass(ID) { } + + virtual bool runOnModule(Module &M); + private: + }; + char LowerJavaRT::ID = 0; + static RegisterPass X("LowerJavaRT", + "Remove references to RT"); + +bool LowerJavaRT::runOnModule(Module& M) { + bool Changed = true; + + for (Module::iterator I = M.begin(), E = M.end(); I != E;) { + Function& GV = *I; + ++I; + if (!strncmp(GV.getName().data(), "JnJVM_java", 10) || + !strncmp(GV.getName().data(), "java", 4)) { + if (!strcmp(GV.getName().data(), "JnJVM_java_lang_String_charAt__I")) { + Function* F = M.getFunction("MMTkCharAt"); + if (!F) + F = Function::Create(GV.getFunctionType(), + GlobalValue::ExternalLinkage, "MMTkCharAt", &M); + + GV.replaceAllUsesWith(F); + } else if (!strcmp(GV.getName().data(), "JnJVM_java_lang_Object_getClass__")) { + Function* F = M.getFunction("MMTkGetClass"); + if (!F) + F = Function::Create(GV.getFunctionType(), + GlobalValue::ExternalLinkage, "MMTkGetClass", &M); + GV.replaceAllUsesWith(F); + } else if (!strcmp(GV.getName().data(), "JnJVM_java_lang_String_equals__Ljava_lang_Object_2")) { + Function* F = M.getFunction("MMTkStringEquals"); + if (!F) + F = Function::Create(GV.getFunctionType(), + GlobalValue::ExternalLinkage, "MMTkStringEquals", &M); + GV.replaceAllUsesWith(F); + } else if (!strcmp(GV.getName().data(), "JnJVM_java_lang_String_length__")) { + Function* F = M.getFunction("MMTkStringLength"); + if (!F) + F = Function::Create(GV.getFunctionType(), + GlobalValue::ExternalLinkage, "MMTkStringLength", &M); + GV.replaceAllUsesWith(F); + } else if (!strcmp(GV.getName().data(), "JnJVM_java_lang_String_indexOf__I")) { + Function* F = M.getFunction("MMTkStringIndexOf"); + if (!F) + F = Function::Create(GV.getFunctionType(), + GlobalValue::ExternalLinkage, "MMTkStringIndexOf", &M); + GV.replaceAllUsesWith(F); + } else if (!strcmp(GV.getName().data(), "JnJVM_java_lang_String_substring__II")) { + Function* F = M.getFunction("MMTkStringSubstringII"); + if (!F) + F = Function::Create(GV.getFunctionType(), + GlobalValue::ExternalLinkage, "MMTkStringSubstringII", &M); + GV.replaceAllUsesWith(F); + } else if (!strcmp(GV.getName().data(), "JnJVM_java_lang_String_substring__I")) { + Function* F = M.getFunction("MMTkStringSubstringI"); + if (!F) + F = Function::Create(GV.getFunctionType(), + GlobalValue::ExternalLinkage, "MMTkStringSubstringI", &M); + GV.replaceAllUsesWith(F); + } else { + GV.replaceAllUsesWith(Constant::getNullValue(GV.getType())); + } + GV.eraseFromParent(); + } + } + + // Remove all references to magic methods. + for (Module::iterator I = M.begin(), E = M.end(); I != E;) { + Function& GV = *I; + ++I; + if (!strncmp(GV.getName().data(), "JnJVM_org_vmmagic", 17)) { + GV.replaceAllUsesWith(Constant::getNullValue(GV.getType())); + GV.eraseFromParent(); + } + } + + for (Module::global_iterator I = M.global_begin(), E = M.global_end(); + I != E;) { + GlobalValue& GV = *I; + ++I; + if (!strncmp(GV.getName().data(), "JnJVM_java", 10) || + !strncmp(GV.getName().data(), "java", 4) || + !strncmp(GV.getName().data(), "JnJVM_gnu", 9) || + !strncmp(GV.getName().data(), "_3", 2) || // Arrays + !strncmp(GV.getName().data(), "gnu", 3)) { + GV.replaceAllUsesWith(Constant::getNullValue(GV.getType())); + GV.eraseFromParent(); + } + } + + // Replace finalization calls with null. + Function* F = M.getFunction("addFinalizationCandidate"); + F->replaceAllUsesWith(Constant::getNullValue(F->getType())); + F->eraseFromParent(); + + // Replace VTgcmalloc with the allocator of MMTk objects in VMKit + F = M.getFunction("VTgcmalloc"); + Function* Ma = M.getFunction("AllocateMagicArray"); + + Function* NewFunction = + Function::Create(F->getFunctionType(), GlobalValue::ExternalLinkage, + "MMTkMutatorAllocate", &M); + + F->replaceAllUsesWith(NewFunction); + F->eraseFromParent(); + + Ma->replaceAllUsesWith(NewFunction); + Ma->eraseFromParent(); + + // Finally, remove GC info from the methods. They must not have any + // gcroot. + for (Module::iterator I = M.begin(), E = M.end(); I != E; I++) { + I->clearGC(); + } + + // Rename JavaObject type to avoid collisions when inlining + // malloc and barriers. + M.getTypeByName("JavaObject")->setName("MMTk.JavaObject"); + + return Changed; +} + +} + +#endif Added: vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc?rev=199656&view=auto ============================================================================== --- vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc (added) +++ vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc Mon Jan 20 07:35:01 2014 @@ -0,0 +1,1318 @@ +//===----- LowerConstantCalls.cpp - Changes arrayLength calls --------------===// +// +// JnJVM +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#if 0 +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/IR/Constants.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Module.h" +#include "llvm/Pass.h" +#include "llvm/Support/CallSite.h" +#include "llvm/Support/Compiler.h" +#include "llvm/Support/Debug.h" +#include "llvm/Support/raw_ostream.h" + +#include + +#include "vmkit/GC.h" +#include "vmkit/System.h" + +using namespace llvm; + +namespace vmmagic { + + class LowerMagic : public FunctionPass { + public: + static char ID; + LowerMagic() : FunctionPass(ID) { } + + virtual bool runOnFunction(Function &F); + private: + }; + char LowerMagic::ID = 0; + static RegisterPass X("LowerMagic", + "Lower magic calls"); + typedef SmallPtrSet InstSet; + +static const char* AddressClass = "JnJVM_org_vmmagic_unboxed_Address_"; +static const char* AddressZeroMethod = 0; +static const char* AddressIsZeroMethod; +static const char* AddressMaxMethod; +//static const char* AddressIsMaxMethod; +//static const char* AddressFromIntSignExtendMethod; +static const char* AddressFromIntZeroExtendMethod; +//static const char* AddressFromLongMethod; +static const char* AddressToObjectReferenceMethod; +static const char* AddressToIntMethod; +static const char* AddressToLongMethod; +static const char* AddressToWordMethod; +static const char* AddressPlusIntMethod; +static const char* AddressPlusOffsetMethod; +static const char* AddressPlusExtentMethod; +static const char* AddressMinusIntMethod; +//static const char* AddressMinusOffsetMethod; +static const char* AddressMinusExtentMethod; +static const char* AddressDiffMethod; +static const char* AddressLTMethod; +static const char* AddressLEMethod; +static const char* AddressGTMethod; +static const char* AddressGEMethod; +static const char* AddressEQMethod; +static const char* AddressNEMethod; +//static const char* AddressPrefetchMethod; +static const char* AddressLoadObjectReferenceMethod; +static const char* AddressLoadObjectReferenceAtOffsetMethod; +static const char* AddressLoadByteMethod; +static const char* AddressLoadByteAtOffsetMethod; +//static const char* AddressLoadCharMethod; +//static const char* AddressLoadCharAtOffsetMethod; +static const char* AddressLoadShortMethod; +static const char* AddressLoadShortAtOffsetMethod; +//static const char* AddressLoadFloatMethod; +//static const char* AddressLoadFloatAtOffsetMethod; +static const char* AddressLoadIntMethod; +static const char* AddressLoadIntAtOffsetMethod; +//static const char* AddressLoadLongMethod; +//static const char* AddressLoadLongAtOffsetMethod; +//static const char* AddressLoadDoubleMethod; +//static const char* AddressLoadDoubleAtOffsetMethod; +static const char* AddressLoadAddressMethod; +static const char* AddressLoadAddressAtOffsetMethod; +static const char* AddressLoadWordMethod; +static const char* AddressLoadWordAtOffsetMethod; +static const char* AddressStoreObjectReferenceMethod; +static const char* AddressStoreObjectReferenceAtOffsetMethod; +static const char* AddressStoreAddressMethod; +static const char* AddressStoreAddressAtOffsetMethod; +//static const char* AddressStoreFloatMethod; +//static const char* AddressStoreFloatAtOffsetMethod; +static const char* AddressStoreWordMethod; +static const char* AddressStoreWordAtOffsetMethod; +static const char* AddressStoreByteMethod; +static const char* AddressStoreByteAtOffsetMethod; +static const char* AddressStoreIntMethod; +//static const char* AddressStoreIntAtOffsetMethod; +//static const char* AddressStoreDoubleMethod; +//static const char* AddressStoreDoubleAtOffsetMethod; +//static const char* AddressStoreLongMethod; +//static const char* AddressStoreLongAtOffsetMethod; +//static const char* AddressStoreCharMethod; +//static const char* AddressStoreCharAtOffsetMethod; +static const char* AddressStoreShortMethod; +static const char* AddressStoreShortAtOffsetMethod; +static const char* AddressPrepareWordMethod; +static const char* AddressPrepareWordAtOffsetMethod; +//static const char* AddressPrepareObjectReferenceMethod; +//static const char* AddressPrepareObjectReferenceAtOffsetMethod; +//static const char* AddressPrepareAddressMethod; +//static const char* AddressPrepareAddressAtOffsetMethod; +//static const char* AddressPrepareIntMethod; +//static const char* AddressPrepareIntAtOffsetMethod; +//static const char* AddressAttemptIntMethod; +//static const char* AddressAttemptIntAtOffsetMethod; +static const char* AddressAttemptWordMethod; +static const char* AddressAttemptWordAtOffsetMethod; +static const char* AddressAttemptObjectReferenceMethod; +static const char* AddressAttemptObjectReferenceAtOffsetMethod; +//static const char* AddressAttemptAddressMethod; +//static const char* AddressAttemptAddressAtOffsetMethod; + +static const char* ExtentClass = "JnJVM_org_vmmagic_unboxed_Extent_"; +static const char* ExtentToWordMethod = 0; +static const char* ExtentFromIntSignExtendMethod; +static const char* ExtentFromIntZeroExtendMethod; +static const char* ExtentZeroMethod; +static const char* ExtentOneMethod; +static const char* ExtentMaxMethod; +static const char* ExtentToIntMethod; +static const char* ExtentToLongMethod; +static const char* ExtentPlusIntMethod; +static const char* ExtentPlusExtentMethod; +static const char* ExtentMinusIntMethod; +static const char* ExtentMinusExtentMethod; +static const char* ExtentLTMethod; +//static const char* ExtentLEMethod; +static const char* ExtentGTMethod; +//static const char* ExtentGEMethod; +static const char* ExtentEQMethod; +static const char* ExtentNEMethod; + +static const char* ObjectReferenceClass = + "JnJVM_org_vmmagic_unboxed_ObjectReference_"; +static const char* ObjectReferenceFromObjectMethod = 0; +static const char* ObjectReferenceNullReferenceMethod; +static const char* ObjectReferenceToObjectMethod; +static const char* ObjectReferenceToAddressMethod; +static const char* ObjectReferenceIsNullMethod; + +static const char* OffsetClass = "JnJVM_org_vmmagic_unboxed_Offset_"; +static const char* OffsetFromIntSignExtendMethod = 0; +static const char* OffsetFromIntZeroExtendMethod; +static const char* OffsetZeroMethod; +//static const char* OffsetMaxMethod; +static const char* OffsetToIntMethod; +static const char* OffsetToLongMethod; +static const char* OffsetToWordMethod; +static const char* OffsetPlusIntMethod; +static const char* OffsetMinusIntMethod; +static const char* OffsetMinusOffsetMethod; +static const char* OffsetEQMethod; +//static const char* OffsetNEMethod; +static const char* OffsetSLTMethod; +static const char* OffsetSLEMethod; +static const char* OffsetSGTMethod; +static const char* OffsetSGEMethod; +static const char* OffsetIsZeroMethod; +//static const char* OffsetIsMaxMethod; + +static const char* WordClass = "JnJVM_org_vmmagic_unboxed_Word_"; +static const char* WordFromIntSignExtendMethod = 0; +static const char* WordFromIntZeroExtendMethod; +//static const char* WordFromLongMethod; +static const char* WordZeroMethod; +static const char* WordOneMethod; +static const char* WordMaxMethod; +static const char* WordToIntMethod; +static const char* WordToLongMethod; +static const char* WordToAddressMethod; +static const char* WordToOffsetMethod; +static const char* WordToExtentMethod; +static const char* WordPlusWordMethod; +//static const char* WordPlusOffsetMethod; +//static const char* WordPlusExtentMethod; +static const char* WordMinusWordMethod; +//static const char* WordMinusOffsetMethod; +static const char* WordMinusExtentMethod; +static const char* WordIsZeroMethod; +//static const char* WordIsMaxMethod; +static const char* WordLTMethod; +static const char* WordLEMethod; +static const char* WordGTMethod; +static const char* WordGEMethod; +static const char* WordEQMethod; +static const char* WordNEMethod; +static const char* WordAndMethod; +static const char* WordOrMethod; +static const char* WordNotMethod; +static const char* WordXorMethod; +static const char* WordLshMethod; +static const char* WordRshlMethod; +//static const char* WordRshaMethod; + +static const char* AddressArrayClass = "JnJVM_org_vmmagic_unboxed_AddressArray_"; +static const char* ExtentArrayClass = "JnJVM_org_vmmagic_unboxed_ExtentArray_"; +static const char* ObjectReferenceArrayClass = "JnJVM_org_vmmagic_unboxed_ObjectReferenceArray_"; +static const char* OffsetArrayClass = "JnJVM_org_vmmagic_unboxed_OffsetArray_"; +static const char* WordArrayClass = "JnJVM_org_vmmagic_unboxed_WordArray_"; + +static const char* AddressArrayCreateMethod = "JnJVM_org_vmmagic_unboxed_AddressArray_create__I"; +static const char* ExtentArrayCreateMethod = "JnJVM_org_vmmagic_unboxed_ExtentArray_create__I"; +static const char* ObjectReferenceArrayCreateMethod = "JnJVM_org_vmmagic_unboxed_ObjectReferenceArray_create__I"; +static const char* OffsetArrayCreateMethod = "JnJVM_org_vmmagic_unboxed_OffsetArray_create__I"; +static const char* WordArrayCreateMethod = "JnJVM_org_vmmagic_unboxed_WordArray_create__I"; + +static const char* AddressArrayGetMethod = "JnJVM_org_vmmagic_unboxed_AddressArray_get__I"; +static const char* ExtentArrayGetMethod = "JnJVM_org_vmmagic_unboxed_ExtentArray_get__I"; +static const char* ObjectReferenceArrayGetMethod = "JnJVM_org_vmmagic_unboxed_ObjectReferenceArray_get__I"; +static const char* OffsetArrayGetMethod = "JnJVM_org_vmmagic_unboxed_OffsetArray_get__I"; +static const char* WordArrayGetMethod = "JnJVM_org_vmmagic_unboxed_WordArray_get__I"; + +static const char* AddressArraySetMethod = "JnJVM_org_vmmagic_unboxed_AddressArray_set__ILorg_vmmagic_unboxed_Address_2"; +static const char* ExtentArraySetMethod = "JnJVM_org_vmmagic_unboxed_ExtentArray_set__ILorg_vmmagic_unboxed_Extent_2"; +static const char* ObjectReferenceArraySetMethod = "JnJVM_org_vmmagic_unboxed_ObjectReferenceArray_set__ILorg_vmmagic_unboxed_ObjectReference_2"; +static const char* OffsetArraySetMethod = "JnJVM_org_vmmagic_unboxed_OffsetArray_set__ILorg_vmmagic_unboxed_Offset_2"; +static const char* WordArraySetMethod = "JnJVM_org_vmmagic_unboxed_WordArray_set__ILorg_vmmagic_unboxed_Word_2"; + +static const char* AddressArrayLengthMethod = "JnJVM_org_vmmagic_unboxed_AddressArray_lenght__"; +static const char* ExtentArrayLengthMethod = "JnJVM_org_vmmagic_unboxed_ExtentArray_length__"; +static const char* ObjectReferenceArrayLengthMethod = "JnJVM_org_vmmagic_unboxed_ObjectReferenceArray_length__"; +static const char* OffsetArrayLengthMethod = "JnJVM_org_vmmagic_unboxed_OffsetArray_length__"; +static const char* WordArrayLengthMethod = "JnJVM_org_vmmagic_unboxed_WordArray_length__"; + + + +static void initialiseFunctions(Module* M) { + if (!AddressZeroMethod) { + AddressZeroMethod = "JnJVM_org_vmmagic_unboxed_Address_zero__"; + AddressMaxMethod = "JnJVM_org_vmmagic_unboxed_Address_max__"; + AddressStoreObjectReferenceMethod = "JnJVM_org_vmmagic_unboxed_Address_store__Lorg_vmmagic_unboxed_ObjectReference_2"; + AddressStoreObjectReferenceAtOffsetMethod = "JnJVM_org_vmmagic_unboxed_Address_store__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Offset_2"; + AddressLoadObjectReferenceMethod = "JnJVM_org_vmmagic_unboxed_Address_loadObjectReference__"; + AddressLoadAddressMethod = "JnJVM_org_vmmagic_unboxed_Address_loadAddress__"; + AddressLoadWordMethod = "JnJVM_org_vmmagic_unboxed_Address_loadWord__"; + AddressDiffMethod = "JnJVM_org_vmmagic_unboxed_Address_diff__Lorg_vmmagic_unboxed_Address_2"; + AddressPlusOffsetMethod = "JnJVM_org_vmmagic_unboxed_Address_plus__Lorg_vmmagic_unboxed_Offset_2"; + AddressStoreAddressMethod = "JnJVM_org_vmmagic_unboxed_Address_store__Lorg_vmmagic_unboxed_Address_2"; + AddressPlusIntMethod = "JnJVM_org_vmmagic_unboxed_Address_plus__I"; + AddressLTMethod = "JnJVM_org_vmmagic_unboxed_Address_LT__Lorg_vmmagic_unboxed_Address_2"; + AddressGEMethod = "JnJVM_org_vmmagic_unboxed_Address_GE__Lorg_vmmagic_unboxed_Address_2"; + AddressStoreWordMethod = "JnJVM_org_vmmagic_unboxed_Address_store__Lorg_vmmagic_unboxed_Word_2"; + AddressToObjectReferenceMethod = "JnJVM_org_vmmagic_unboxed_Address_toObjectReference__"; + AddressToWordMethod = "JnJVM_org_vmmagic_unboxed_Address_toWord__"; + AddressPrepareWordMethod = "JnJVM_org_vmmagic_unboxed_Address_prepareWord__"; + AddressAttemptWordAtOffsetMethod = "JnJVM_org_vmmagic_unboxed_Address_attempt__Lorg_vmmagic_unboxed_Word_2Lorg_vmmagic_unboxed_Word_2Lorg_vmmagic_unboxed_Offset_2"; + AddressAttemptObjectReferenceAtOffsetMethod = "JnJVM_org_vmmagic_unboxed_Address_attempt__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Offset_2"; + AddressPrepareWordAtOffsetMethod = "JnJVM_org_vmmagic_unboxed_Address_prepareWord__Lorg_vmmagic_unboxed_Offset_2"; + AddressLoadWordAtOffsetMethod = "JnJVM_org_vmmagic_unboxed_Address_loadWord__Lorg_vmmagic_unboxed_Offset_2"; + AddressStoreWordAtOffsetMethod = "JnJVM_org_vmmagic_unboxed_Address_store__Lorg_vmmagic_unboxed_Word_2Lorg_vmmagic_unboxed_Offset_2"; + AddressPlusExtentMethod = "JnJVM_org_vmmagic_unboxed_Address_plus__Lorg_vmmagic_unboxed_Extent_2"; + AddressIsZeroMethod = "JnJVM_org_vmmagic_unboxed_Address_isZero__"; + AddressStoreAddressAtOffsetMethod = "JnJVM_org_vmmagic_unboxed_Address_store__Lorg_vmmagic_unboxed_Address_2Lorg_vmmagic_unboxed_Offset_2"; + AddressGTMethod = "JnJVM_org_vmmagic_unboxed_Address_GT__Lorg_vmmagic_unboxed_Address_2"; + AddressLoadAddressAtOffsetMethod = "JnJVM_org_vmmagic_unboxed_Address_loadAddress__Lorg_vmmagic_unboxed_Offset_2"; + AddressEQMethod = "JnJVM_org_vmmagic_unboxed_Address_EQ__Lorg_vmmagic_unboxed_Address_2"; + AddressLoadObjectReferenceAtOffsetMethod = "JnJVM_org_vmmagic_unboxed_Address_loadObjectReference__Lorg_vmmagic_unboxed_Offset_2"; + AddressLEMethod = "JnJVM_org_vmmagic_unboxed_Address_LE__Lorg_vmmagic_unboxed_Address_2"; + AddressAttemptWordMethod = "JnJVM_org_vmmagic_unboxed_Address_attempt__Lorg_vmmagic_unboxed_Word_2Lorg_vmmagic_unboxed_Word_2"; + AddressAttemptObjectReferenceMethod = "JnJVM_org_vmmagic_unboxed_Address_attempt__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2"; + AddressNEMethod = "JnJVM_org_vmmagic_unboxed_Address_NE__Lorg_vmmagic_unboxed_Address_2"; + AddressToLongMethod = "JnJVM_org_vmmagic_unboxed_Address_toLong__"; + AddressMinusExtentMethod = "JnJVM_org_vmmagic_unboxed_Address_minus__Lorg_vmmagic_unboxed_Extent_2"; + AddressLoadShortAtOffsetMethod = "JnJVM_org_vmmagic_unboxed_Address_loadShort__Lorg_vmmagic_unboxed_Offset_2"; + AddressStoreShortAtOffsetMethod = "JnJVM_org_vmmagic_unboxed_Address_store__SLorg_vmmagic_unboxed_Offset_2"; + AddressLoadShortMethod = "JnJVM_org_vmmagic_unboxed_Address_loadShort__"; + AddressStoreShortMethod = "JnJVM_org_vmmagic_unboxed_Address_store__S"; + AddressLoadByteMethod = "JnJVM_org_vmmagic_unboxed_Address_loadByte__"; + AddressLoadIntMethod = "JnJVM_org_vmmagic_unboxed_Address_loadInt__"; + AddressStoreIntMethod = "JnJVM_org_vmmagic_unboxed_Address_store__I"; + AddressStoreByteMethod = "JnJVM_org_vmmagic_unboxed_Address_store__B"; + AddressLoadByteAtOffsetMethod = "JnJVM_org_vmmagic_unboxed_Address_loadByte__Lorg_vmmagic_unboxed_Offset_2"; + AddressMinusIntMethod = "JnJVM_org_vmmagic_unboxed_Address_minus__I"; + AddressLoadIntAtOffsetMethod = "JnJVM_org_vmmagic_unboxed_Address_loadInt__Lorg_vmmagic_unboxed_Offset_2"; + AddressStoreByteAtOffsetMethod = "JnJVM_org_vmmagic_unboxed_Address_store__BLorg_vmmagic_unboxed_Offset_2"; + AddressFromIntZeroExtendMethod = "JnJVM_org_vmmagic_unboxed_Address_fromIntZeroExtend__I"; + AddressToIntMethod = "JnJVM_org_vmmagic_unboxed_Address_toInt__"; + + ExtentToWordMethod = "JnJVM_org_vmmagic_unboxed_Extent_toWord__"; + ExtentMinusExtentMethod = "JnJVM_org_vmmagic_unboxed_Extent_minus__Lorg_vmmagic_unboxed_Extent_2"; + ExtentPlusExtentMethod = "JnJVM_org_vmmagic_unboxed_Extent_plus__Lorg_vmmagic_unboxed_Extent_2"; + ExtentPlusIntMethod = "JnJVM_org_vmmagic_unboxed_Extent_plus__I"; + ExtentMinusIntMethod = "JnJVM_org_vmmagic_unboxed_Extent_minus__I"; + ExtentFromIntZeroExtendMethod = "JnJVM_org_vmmagic_unboxed_Extent_fromIntZeroExtend__I"; + ExtentFromIntSignExtendMethod = "JnJVM_org_vmmagic_unboxed_Extent_fromIntSignExtend__I"; + ExtentOneMethod = "JnJVM_org_vmmagic_unboxed_Extent_one__"; + ExtentNEMethod = "JnJVM_org_vmmagic_unboxed_Extent_NE__Lorg_vmmagic_unboxed_Extent_2"; + ExtentZeroMethod = "JnJVM_org_vmmagic_unboxed_Extent_zero__"; + ExtentToLongMethod = "JnJVM_org_vmmagic_unboxed_Extent_toLong__"; + ExtentToIntMethod = "JnJVM_org_vmmagic_unboxed_Extent_toInt__"; + ExtentEQMethod = "JnJVM_org_vmmagic_unboxed_Extent_EQ__Lorg_vmmagic_unboxed_Extent_2"; + ExtentGTMethod = "JnJVM_org_vmmagic_unboxed_Extent_GT__Lorg_vmmagic_unboxed_Extent_2"; + ExtentLTMethod = "JnJVM_org_vmmagic_unboxed_Extent_LT__Lorg_vmmagic_unboxed_Extent_2"; + ExtentMaxMethod = "JnJVM_org_vmmagic_unboxed_Extent_max__"; + + ObjectReferenceFromObjectMethod = "JnJVM_org_vmmagic_unboxed_ObjectReference_fromObject__Ljava_lang_Object_2"; + ObjectReferenceToObjectMethod = "JnJVM_org_vmmagic_unboxed_ObjectReference_toObject__"; + ObjectReferenceNullReferenceMethod = "JnJVM_org_vmmagic_unboxed_ObjectReference_nullReference__"; + ObjectReferenceToAddressMethod = "JnJVM_org_vmmagic_unboxed_ObjectReference_toAddress__"; + ObjectReferenceIsNullMethod = "JnJVM_org_vmmagic_unboxed_ObjectReference_isNull__"; + + WordOrMethod = "JnJVM_org_vmmagic_unboxed_Word_or__Lorg_vmmagic_unboxed_Word_2"; + WordRshlMethod = "JnJVM_org_vmmagic_unboxed_Word_rshl__I"; + WordToIntMethod = "JnJVM_org_vmmagic_unboxed_Word_toInt__"; + WordNotMethod = "JnJVM_org_vmmagic_unboxed_Word_not__"; + WordZeroMethod = "JnJVM_org_vmmagic_unboxed_Word_zero__"; + WordOneMethod = "JnJVM_org_vmmagic_unboxed_Word_one__"; + WordAndMethod = "JnJVM_org_vmmagic_unboxed_Word_and__Lorg_vmmagic_unboxed_Word_2"; + WordToAddressMethod = "JnJVM_org_vmmagic_unboxed_Word_toAddress__"; + WordLshMethod = "JnJVM_org_vmmagic_unboxed_Word_lsh__I"; + WordMinusWordMethod = "JnJVM_org_vmmagic_unboxed_Word_minus__Lorg_vmmagic_unboxed_Word_2"; + WordLTMethod = "JnJVM_org_vmmagic_unboxed_Word_LT__Lorg_vmmagic_unboxed_Word_2"; + WordPlusWordMethod = "JnJVM_org_vmmagic_unboxed_Word_plus__Lorg_vmmagic_unboxed_Word_2"; + WordLEMethod = "JnJVM_org_vmmagic_unboxed_Word_LE__Lorg_vmmagic_unboxed_Word_2"; + WordGEMethod = "JnJVM_org_vmmagic_unboxed_Word_GE__Lorg_vmmagic_unboxed_Word_2"; + WordEQMethod = "JnJVM_org_vmmagic_unboxed_Word_EQ__Lorg_vmmagic_unboxed_Word_2"; + WordNEMethod = "JnJVM_org_vmmagic_unboxed_Word_NE__Lorg_vmmagic_unboxed_Word_2"; + WordFromIntSignExtendMethod = "JnJVM_org_vmmagic_unboxed_Word_fromIntSignExtend__I"; + WordIsZeroMethod = "JnJVM_org_vmmagic_unboxed_Word_isZero__"; + WordXorMethod = "JnJVM_org_vmmagic_unboxed_Word_xor__Lorg_vmmagic_unboxed_Word_2"; + WordFromIntZeroExtendMethod = "JnJVM_org_vmmagic_unboxed_Word_fromIntZeroExtend__I"; + WordToExtentMethod = "JnJVM_org_vmmagic_unboxed_Word_toExtent__"; + WordMinusExtentMethod = "JnJVM_org_vmmagic_unboxed_Word_minus__Lorg_vmmagic_unboxed_Extent_2"; + WordToLongMethod = "JnJVM_org_vmmagic_unboxed_Word_toLong__"; + WordMaxMethod = "JnJVM_org_vmmagic_unboxed_Word_max__"; + WordToOffsetMethod = "JnJVM_org_vmmagic_unboxed_Word_toOffset__"; + WordGTMethod = "JnJVM_org_vmmagic_unboxed_Word_GT__Lorg_vmmagic_unboxed_Word_2"; + + + OffsetSLTMethod = "JnJVM_org_vmmagic_unboxed_Offset_sLT__Lorg_vmmagic_unboxed_Offset_2"; + OffsetFromIntSignExtendMethod = "JnJVM_org_vmmagic_unboxed_Offset_fromIntSignExtend__I"; + OffsetSGTMethod = "JnJVM_org_vmmagic_unboxed_Offset_sGT__Lorg_vmmagic_unboxed_Offset_2"; + OffsetPlusIntMethod = "JnJVM_org_vmmagic_unboxed_Offset_plus__I"; + OffsetZeroMethod = "JnJVM_org_vmmagic_unboxed_Offset_zero__"; + OffsetToWordMethod = "JnJVM_org_vmmagic_unboxed_Offset_toWord__"; + OffsetFromIntZeroExtendMethod = "JnJVM_org_vmmagic_unboxed_Offset_fromIntZeroExtend__I"; + OffsetSGEMethod = "JnJVM_org_vmmagic_unboxed_Offset_sGE__Lorg_vmmagic_unboxed_Offset_2"; + OffsetToIntMethod = "JnJVM_org_vmmagic_unboxed_Offset_toInt__"; + OffsetToLongMethod = "JnJVM_org_vmmagic_unboxed_Offset_toLong__"; + OffsetIsZeroMethod = "JnJVM_org_vmmagic_unboxed_Offset_isZero__"; + OffsetMinusIntMethod = "JnJVM_org_vmmagic_unboxed_Offset_minus__I"; + OffsetSLEMethod = "JnJVM_org_vmmagic_unboxed_Offset_sLE__Lorg_vmmagic_unboxed_Offset_2"; + OffsetEQMethod = "JnJVM_org_vmmagic_unboxed_Offset_EQ__Lorg_vmmagic_unboxed_Offset_2"; + OffsetMinusOffsetMethod = "JnJVM_org_vmmagic_unboxed_Offset_minus__Lorg_vmmagic_unboxed_Offset_2"; + } +} + +static bool removePotentialNullCheck(BasicBlock* Cur, Value* Obj, InstSet& RemoveSet) { + if (!Obj->getType()->isPointerTy()) return false; + + if (vmkit::System::SupportsHardwareNullCheck()) { + bool changed = false; + for (Value::use_iterator I = Obj->use_begin(), E = Obj->use_end(); I != E; I++) { + if (GetElementPtrInst* GE = dyn_cast(*I)) { + for (Value::use_iterator II = GE->use_begin(), EE = GE->use_end(); II != EE; II++) { + if (LoadInst* LI = dyn_cast(*II)) { + if (LI->isVolatile()) { + assert(LI->use_empty()); + RemoveSet.insert(LI); + changed = true; + } + } + } + } + } + return changed; + } else { + BasicBlock* BB = Cur->getUniquePredecessor(); + LLVMContext& Context = Cur->getParent()->getContext(); + if (BB) { + Instruction* T = BB->getTerminator(); + if (dyn_cast(T) && T != BB->begin()) { + BasicBlock::iterator BIE = BB->end(); + --BIE; // Terminator + --BIE; // Null test + if (ICmpInst* IE = dyn_cast(BIE)) { + if (IE->getPredicate() == ICmpInst::ICMP_EQ && + IE->getOperand(0) == Obj && + IE->getOperand(1) == Constant::getNullValue(Obj->getType())) { + BIE->replaceAllUsesWith(ConstantInt::getFalse(Context)); + BIE->eraseFromParent(); + return true; + } + } + } + } + } + return false; +} + +bool LowerMagic::runOnFunction(Function& F) { + Module* globalModule = F.getParent(); + LLVMContext& Context = globalModule->getContext(); + bool Changed = false; + llvm::Type* pointerSizeType = + globalModule->getPointerSize() == llvm::Module::Pointer32 ? + Type::getInt32Ty(Context) : Type::getInt64Ty(Context); + + Constant* constantPtrLogSize = + ConstantInt::get(Type::getInt32Ty(Context), sizeof(void*) == 8 ? 3 : 2); + + llvm::Type* ptrType = PointerType::getUnqual(Type::getInt8Ty(Context)); + llvm::Type* ptrSizeType = PointerType::getUnqual(pointerSizeType); + + + initialiseFunctions(globalModule); + + Function* MMalloc = globalModule->getFunction("AllocateMagicArray"); + if (!MMalloc) { + std::vectorFuncTyArgs; + FuncTyArgs.push_back(Type::getInt32Ty(Context)); + FuncTyArgs.push_back(ptrType); + FunctionType* FuncTy = FunctionType::get(ptrType, FuncTyArgs, false); + + + MMalloc = Function::Create(FuncTy, GlobalValue::ExternalLinkage, "AllocateMagicArray", + globalModule); + } + + + InstSet RemoveSet; + + for (Function::iterator BI = F.begin(), BE = F.end(); BI != BE; BI++) { + BasicBlock *Cur = BI; + for (BasicBlock::iterator II = Cur->begin(), IE = Cur->end(); II != IE;) { + Instruction *I = II; + II++; + if (I->getOpcode() != Instruction::Call && + I->getOpcode() != Instruction::Invoke) { + continue; + } + + CallSite Call(I); + Instruction* CI = I; + Value* V = Call.getCalledValue(); + if (Function* FCur = dyn_cast(V)) { + const char* name = FCur->getName().data(); + unsigned len = FCur->getName().size(); + if (len > strlen(AddressClass) && + !memcmp(AddressClass, name, strlen(AddressClass))) { + + Changed = true; + // Remove the null check + if (Call.arg_begin() != Call.arg_end()) { + removePotentialNullCheck(Cur, Call.getArgument(0), RemoveSet); + } + + if (!strcmp(FCur->getName().data(), AddressZeroMethod)) { + Constant* N = Constant::getNullValue(FCur->getReturnType()); + CI->replaceAllUsesWith(N); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressMaxMethod)) { + ConstantInt* M = ConstantInt::get(Type::getInt64Ty(Context), (uint64_t)-1); + Constant* N = ConstantExpr::getIntToPtr(M, FCur->getReturnType()); + CI->replaceAllUsesWith(N); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressStoreObjectReferenceMethod) || + !strcmp(FCur->getName().data(), AddressStoreAddressMethod) || + !strcmp(FCur->getName().data(), AddressStoreShortMethod) || + !strcmp(FCur->getName().data(), AddressStoreByteMethod) || + !strcmp(FCur->getName().data(), AddressStoreIntMethod) || + !strcmp(FCur->getName().data(), AddressStoreWordMethod)) { + Value* Addr = Call.getArgument(0); + Value* Obj = Call.getArgument(1); + Type* Ty = PointerType::getUnqual(Obj->getType()); + Addr = new BitCastInst(Addr, Ty, "", CI); + new StoreInst(Obj, Addr, CI); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressLoadObjectReferenceMethod) || + !strcmp(FCur->getName().data(), AddressLoadAddressMethod) || + !strcmp(FCur->getName().data(), AddressLoadWordMethod) || + !strcmp(FCur->getName().data(), AddressLoadShortMethod) || + !strcmp(FCur->getName().data(), AddressLoadByteMethod) || + !strcmp(FCur->getName().data(), AddressLoadIntMethod) || + !strcmp(FCur->getName().data(), AddressPrepareWordMethod)) { + Value* Addr = Call.getArgument(0); + Type* Ty = PointerType::getUnqual(FCur->getReturnType()); + Addr = new BitCastInst(Addr, Ty, "", CI); + Value* LD = new LoadInst(Addr, "", CI); + CI->replaceAllUsesWith(LD); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressDiffMethod) || + !strcmp(FCur->getName().data(), AddressMinusExtentMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = BinaryOperator::CreateSub(Val1, Val2, "", CI); + res = new IntToPtrInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressPlusOffsetMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = BinaryOperator::CreateAdd(Val1, Val2, "", CI); + res = new IntToPtrInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressPlusIntMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + if (Val2->getType() != pointerSizeType) + Val2 = new ZExtInst(Val2, pointerSizeType, "", CI); + Value* res = BinaryOperator::CreateAdd(Val1, Val2, "", CI); + res = new IntToPtrInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressMinusIntMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + if (Val2->getType() != pointerSizeType) + Val2 = new ZExtInst(Val2, pointerSizeType, "", CI); + Value* res = BinaryOperator::CreateSub(Val1, Val2, "", CI); + res = new IntToPtrInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressLTMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Constant* M = ConstantInt::get(pointerSizeType, gcHeader::hiddenHeaderSize()); + Val1 = BinaryOperator::CreateAdd(Val1, M, "", CI); + Val2 = BinaryOperator::CreateAdd(Val2, M, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_ULT, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressGTMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Constant* M = ConstantInt::get(pointerSizeType, gcHeader::hiddenHeaderSize()); + Val1 = BinaryOperator::CreateAdd(Val1, M, "", CI); + Val2 = BinaryOperator::CreateAdd(Val2, M, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_UGT, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressEQMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_EQ, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressNEMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_NE, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressLEMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Constant* M = ConstantInt::get(pointerSizeType, gcHeader::hiddenHeaderSize()); + Val1 = BinaryOperator::CreateAdd(Val1, M, "", CI); + Val2 = BinaryOperator::CreateAdd(Val2, M, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_ULE, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressGEMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Constant* M = ConstantInt::get(pointerSizeType, gcHeader::hiddenHeaderSize()); + Val1 = BinaryOperator::CreateAdd(Val1, M, "", CI); + Val2 = BinaryOperator::CreateAdd(Val2, M, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_UGE, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressToObjectReferenceMethod)){ + Value* Val = Call.getArgument(0); + Val = new PtrToIntInst(Val, pointerSizeType, "", CI); + Constant* M = ConstantInt::get(pointerSizeType, gcHeader::hiddenHeaderSize()); + Val = BinaryOperator::CreateAdd(Val, M, "", CI); + Val = new IntToPtrInst(Val, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if(!strcmp(FCur->getName().data(), AddressToWordMethod)) { + Value* Val = Call.getArgument(0); + Val = new BitCastInst(Val, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressAttemptWordAtOffsetMethod) || + !strcmp(FCur->getName().data(), AddressAttemptObjectReferenceAtOffsetMethod)) { + Value* Ptr = Call.getArgument(0); + Value* Old = Call.getArgument(1); + Value* Val = Call.getArgument(2); + Value* Offset = Call.getArgument(3); + + Ptr = new PtrToIntInst(Ptr, pointerSizeType, "", CI); + Offset = new PtrToIntInst(Offset, pointerSizeType, "", CI); + Ptr = BinaryOperator::CreateAdd(Ptr, Offset, "", CI); + Type* Ty = PointerType::getUnqual(pointerSizeType); + Ptr = new IntToPtrInst(Ptr, Ty, "", CI); + Old = new PtrToIntInst(Old, pointerSizeType, "", CI); + Val = new PtrToIntInst(Val, pointerSizeType, "", CI); + + Value* res = new AtomicCmpXchgInst( + Ptr, Old, Val, SequentiallyConsistent, CrossThread, CI); + res = new ICmpInst(CI, ICmpInst::ICMP_EQ, res, Old, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressAttemptWordMethod) || + !strcmp(FCur->getName().data(), AddressAttemptObjectReferenceMethod)) { + Value* Ptr = Call.getArgument(0); + Value* Old = Call.getArgument(1); + Value* Val = Call.getArgument(2); + + Type* Ty = PointerType::getUnqual(pointerSizeType); + Ptr = new BitCastInst(Ptr, Ty, "", CI); + Old = new PtrToIntInst(Old, pointerSizeType, "", CI); + Val = new PtrToIntInst(Val, pointerSizeType, "", CI); + + Value* res = new AtomicCmpXchgInst( + Ptr, Old, Val, SequentiallyConsistent, CrossThread, CI); + res = new ICmpInst(CI, ICmpInst::ICMP_EQ, res, Old, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressPrepareWordAtOffsetMethod) || + !strcmp(FCur->getName().data(), AddressLoadWordAtOffsetMethod) || + !strcmp(FCur->getName().data(), AddressLoadAddressAtOffsetMethod) || + !strcmp(FCur->getName().data(), AddressLoadObjectReferenceAtOffsetMethod) || + !strcmp(FCur->getName().data(), AddressLoadByteAtOffsetMethod) || + !strcmp(FCur->getName().data(), AddressLoadIntAtOffsetMethod) || + !strcmp(FCur->getName().data(), AddressLoadShortAtOffsetMethod)) { + Value* Ptr = Call.getArgument(0); + Value* Offset = Call.getArgument(1); + + Ptr = new PtrToIntInst(Ptr, pointerSizeType, "", CI); + Offset = new PtrToIntInst(Offset, pointerSizeType, "", CI); + Ptr = BinaryOperator::CreateAdd(Ptr, Offset, "", CI); + Type* Ty = PointerType::getUnqual(FCur->getReturnType()); + Ptr = new IntToPtrInst(Ptr, Ty, "", CI); + Value* res = new LoadInst(Ptr, "", CI); + + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressStoreWordAtOffsetMethod) || + !strcmp(FCur->getName().data(), AddressStoreAddressAtOffsetMethod) || + !strcmp(FCur->getName().data(), AddressStoreByteAtOffsetMethod) || + !strcmp(FCur->getName().data(), AddressStoreShortAtOffsetMethod) || + !strcmp(FCur->getName().data(), AddressStoreObjectReferenceAtOffsetMethod)) { + Value* Ptr = Call.getArgument(0); + Value* Val = Call.getArgument(1); + Value* Offset = Call.getArgument(2); + + Ptr = new PtrToIntInst(Ptr, pointerSizeType, "", CI); + Offset = new PtrToIntInst(Offset, pointerSizeType, "", CI); + Ptr = BinaryOperator::CreateAdd(Ptr, Offset, "", CI); + Type* Ty = PointerType::getUnqual(Val->getType()); + Ptr = new IntToPtrInst(Ptr, Ty, "", CI); + new StoreInst(Val, Ptr, CI); + + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressPlusExtentMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = BinaryOperator::CreateAdd(Val1, Val2, "", CI); + res = new IntToPtrInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressIsZeroMethod)) { + Value* Val = Call.getArgument(0); + Constant* N = Constant::getNullValue(Val->getType()); + Value* Res = new ICmpInst(CI, ICmpInst::ICMP_EQ, Val, N, ""); + Res = new ZExtInst(Res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressToLongMethod)) { + Value* Val = Call.getArgument(0); + Val = new PtrToIntInst(Val, Type::getInt64Ty(Context), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressFromIntZeroExtendMethod)) { + Value* Val = Call.getArgument(0); + if (pointerSizeType != Type::getInt32Ty(Context)) + Val = new ZExtInst(Val, pointerSizeType, "", CI); + Val = new IntToPtrInst(Val, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), AddressToIntMethod)) { + Value* Val = Call.getArgument(0); + Val = new PtrToIntInst(Val, Type::getInt32Ty(Context), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else { + fprintf(stderr, "Implement me %s\n", name); + abort(); + } + + } else if (len > strlen(ExtentClass) && + !memcmp(ExtentClass, name, strlen(ExtentClass))) { + + Changed = true; + // Remove the null check + if (Call.arg_begin() != Call.arg_end()) { + removePotentialNullCheck(Cur, Call.getArgument(0), RemoveSet); + } + + if (!strcmp(FCur->getName().data(), ExtentToWordMethod)) { + CI->replaceAllUsesWith(Call.getArgument(0)); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ExtentMinusExtentMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = BinaryOperator::CreateSub(Val1, Val2, "", CI); + res = new IntToPtrInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ExtentPlusExtentMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = BinaryOperator::CreateAdd(Val1, Val2, "", CI); + res = new IntToPtrInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ExtentPlusIntMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + if (Val2->getType() != pointerSizeType) + Val2 = new ZExtInst(Val2, pointerSizeType, "", CI); + Value* res = BinaryOperator::CreateAdd(Val1, Val2, "", CI); + res = new IntToPtrInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ExtentMinusIntMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + if (Val2->getType() != pointerSizeType) + Val2 = new ZExtInst(Val2, pointerSizeType, "", CI); + Value* res = BinaryOperator::CreateSub(Val1, Val2, "", CI); + res = new IntToPtrInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ExtentFromIntZeroExtendMethod)) { + Value* Val = Call.getArgument(0); + if (pointerSizeType != Type::getInt32Ty(Context)) + Val = new ZExtInst(Val, pointerSizeType, "", CI); + Val = new IntToPtrInst(Val, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ExtentFromIntSignExtendMethod)) { + Value* Val = Call.getArgument(0); + if (pointerSizeType != Type::getInt32Ty(Context)) + Val = new SExtInst(Val, pointerSizeType, "", CI); + Val = new IntToPtrInst(Val, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ExtentOneMethod)) { + Constant* N = ConstantInt::get(pointerSizeType, 1); + N = ConstantExpr::getIntToPtr(N, FCur->getReturnType()); + CI->replaceAllUsesWith(N); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ExtentNEMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_NE, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ExtentEQMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_EQ, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ExtentGTMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_UGT, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ExtentLTMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_ULT, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ExtentZeroMethod)) { + Constant* N = Constant::getNullValue(FCur->getReturnType()); + CI->replaceAllUsesWith(N); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ExtentToLongMethod)) { + Value* Val = Call.getArgument(0); + Val = new PtrToIntInst(Val, Type::getInt64Ty(Context), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ExtentToIntMethod)) { + Value* Val = Call.getArgument(0); + Val = new PtrToIntInst(Val, Type::getInt32Ty(Context), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ExtentMaxMethod)) { + ConstantInt* M = ConstantInt::get(Type::getInt64Ty(Context), (uint64_t)-1); + Constant* N = ConstantExpr::getIntToPtr(M, FCur->getReturnType()); + CI->replaceAllUsesWith(N); + CI->eraseFromParent(); + } else { + fprintf(stderr, "Implement me %s\n", name); + abort(); + } + } else if (len > strlen(OffsetClass) && + !memcmp(OffsetClass, name, strlen(OffsetClass))) { + + Changed = true; + // Remove the null check + if (Call.arg_begin() != Call.arg_end()) { + removePotentialNullCheck(Cur, Call.getArgument(0), RemoveSet); + } + + if (!strcmp(FCur->getName().data(), OffsetSLTMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_SLT, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), OffsetToWordMethod)) { + Value* Val = Call.getArgument(0); + Val = new BitCastInst(Val, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), OffsetZeroMethod)) { + Constant* N = Constant::getNullValue(FCur->getReturnType()); + CI->replaceAllUsesWith(N); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), OffsetSGTMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_SGT, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), OffsetSGEMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_SGE, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), OffsetSLEMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_SLE, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), OffsetEQMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_EQ, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), OffsetFromIntSignExtendMethod)) { + Value* Val = Call.getArgument(0); + if (pointerSizeType != Type::getInt32Ty(Context)) + Val = new SExtInst(Val, pointerSizeType, "", CI); + Val = new IntToPtrInst(Val, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), OffsetFromIntZeroExtendMethod)) { + Value* Val = Call.getArgument(0); + if (pointerSizeType != Type::getInt32Ty(Context)) + Val = new ZExtInst(Val, pointerSizeType, "", CI); + Val = new IntToPtrInst(Val, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), OffsetPlusIntMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + if (Val2->getType() != pointerSizeType) + Val2 = new ZExtInst(Val2, pointerSizeType, "", CI); + Value* res = BinaryOperator::CreateAdd(Val1, Val2, "", CI); + res = new IntToPtrInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), OffsetToIntMethod)) { + Value* Val = Call.getArgument(0); + Val = new PtrToIntInst(Val, Type::getInt32Ty(Context), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), OffsetToLongMethod)) { + Value* Val = Call.getArgument(0); + Val = new PtrToIntInst(Val, Type::getInt64Ty(Context), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), OffsetIsZeroMethod)) { + Value* Val = Call.getArgument(0); + Constant* N = Constant::getNullValue(Val->getType()); + Value* Res = new ICmpInst(CI, ICmpInst::ICMP_EQ, Val, N, ""); + Res = new ZExtInst(Res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), OffsetMinusIntMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + if (Val2->getType() != pointerSizeType) + Val2 = new ZExtInst(Val2, pointerSizeType, "", CI); + Value* res = BinaryOperator::CreateSub(Val1, Val2, "", CI); + res = new IntToPtrInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), OffsetMinusOffsetMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = BinaryOperator::CreateSub(Val1, Val2, "", CI); + res = new IntToPtrInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else { + fprintf(stderr, "Implement me %s\n", name); + abort(); + } + } else if (len > strlen(ObjectReferenceClass) && + !memcmp(ObjectReferenceClass, name, strlen(ObjectReferenceClass))) { + + Changed = true; + // Remove the null check + if (Call.arg_begin() != Call.arg_end()) { + removePotentialNullCheck(Cur, Call.getArgument(0), RemoveSet); + } + + if (!strcmp(FCur->getName().data(), ObjectReferenceNullReferenceMethod)) { + Constant* N = Constant::getNullValue(FCur->getReturnType()); + CI->replaceAllUsesWith(N); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ObjectReferenceFromObjectMethod)) { + Value* Val = Call.getArgument(0); + Val = new BitCastInst(Val, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ObjectReferenceToAddressMethod)) { + Value* Val = Call.getArgument(0); + Val = new PtrToIntInst(Val, pointerSizeType, "", CI); + Constant* M = ConstantInt::get(pointerSizeType, gcHeader::hiddenHeaderSize()); + Val = BinaryOperator::CreateSub(Val, M, "", CI); + Val = new IntToPtrInst(Val, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ObjectReferenceToObjectMethod)) { + Value* Val = Call.getArgument(0); + Val = new BitCastInst(Val, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), ObjectReferenceIsNullMethod)) { + Value* Val = Call.getArgument(0); + Constant* N = Constant::getNullValue(Val->getType()); + Value* Res = new ICmpInst(CI, ICmpInst::ICMP_EQ, Val, N, ""); + Res = new ZExtInst(Res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Res); + CI->eraseFromParent(); + } else { + fprintf(stderr, "Implement me %s\n", name); + abort(); + } + } else if (len > strlen(WordClass) && + !memcmp(WordClass, name, strlen(WordClass))) { + + Changed = true; + // Remove the null check + if (Call.arg_begin() != Call.arg_end()) { + removePotentialNullCheck(Cur, Call.getArgument(0), RemoveSet); + } + + if (!strcmp(FCur->getName().data(), WordOrMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* Res = BinaryOperator::CreateOr(Val1, Val2, "", CI); + Res = new IntToPtrInst(Res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordAndMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* Res = BinaryOperator::CreateAnd(Val1, Val2, "", CI); + Res = new IntToPtrInst(Res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordXorMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* Res = BinaryOperator::CreateXor(Val1, Val2, "", CI); + Res = new IntToPtrInst(Res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordRshlMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + if (Val2->getType() != pointerSizeType) + Val2 = new ZExtInst(Val2, pointerSizeType, "", CI); + Value* Res = BinaryOperator::CreateLShr(Val1, Val2, "", CI); + Res = new IntToPtrInst(Res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordLshMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + if (Val2->getType() != pointerSizeType) + Val2 = new ZExtInst(Val2, pointerSizeType, "", CI); + Value* Res = BinaryOperator::CreateShl(Val1, Val2, "", CI); + Res = new IntToPtrInst(Res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordToIntMethod)) { + Value* Val = Call.getArgument(0); + Val = new PtrToIntInst(Val, Type::getInt32Ty(Context), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordNotMethod)) { + Value* Val = Call.getArgument(0); + Val = new PtrToIntInst(Val, pointerSizeType, "", CI); + Constant* M1 = ConstantInt::get(pointerSizeType, -1); + Value* Res = BinaryOperator::CreateXor(Val, M1, "", CI); + Res = new IntToPtrInst(Res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordZeroMethod)) { + Constant* N = Constant::getNullValue(FCur->getReturnType()); + CI->replaceAllUsesWith(N); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordOneMethod)) { + Constant* N = ConstantInt::get(pointerSizeType, 1); + N = ConstantExpr::getIntToPtr(N, FCur->getReturnType()); + CI->replaceAllUsesWith(N); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordToAddressMethod) || + !strcmp(FCur->getName().data(), WordToOffsetMethod) || + !strcmp(FCur->getName().data(), WordToExtentMethod)) { + Value* Val = Call.getArgument(0); + Val = new BitCastInst(Val, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordMinusWordMethod) || + !strcmp(FCur->getName().data(), WordMinusExtentMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = BinaryOperator::CreateSub(Val1, Val2, "", CI); + res = new IntToPtrInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordPlusWordMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = BinaryOperator::CreateAdd(Val1, Val2, "", CI); + res = new IntToPtrInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordLTMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_ULT, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordLEMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_ULE, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordGEMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_UGE, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordEQMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_EQ, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordGTMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_UGT, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordNEMethod)) { + Value* Val1 = Call.getArgument(0); + Value* Val2 = Call.getArgument(1); + Val1 = new PtrToIntInst(Val1, pointerSizeType, "", CI); + Val2 = new PtrToIntInst(Val2, pointerSizeType, "", CI); + Value* res = new ICmpInst(CI, ICmpInst::ICMP_NE, Val1, Val2, ""); + res = new ZExtInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordFromIntSignExtendMethod)) { + Value* Val = Call.getArgument(0); + if (pointerSizeType != Type::getInt32Ty(Context)) + Val = new SExtInst(Val, pointerSizeType, "", CI); + Val = new IntToPtrInst(Val, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordFromIntZeroExtendMethod)) { + Value* Val = Call.getArgument(0); + if (pointerSizeType != Type::getInt32Ty(Context)) + Val = new ZExtInst(Val, pointerSizeType, "", CI); + Val = new IntToPtrInst(Val, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordIsZeroMethod)) { + Value* Val = Call.getArgument(0); + Constant* N = Constant::getNullValue(Val->getType()); + Value* Res = new ICmpInst(CI, ICmpInst::ICMP_EQ, Val, N, ""); + Res = new ZExtInst(Res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(Res); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordToLongMethod)) { + Value* Val = Call.getArgument(0); + Val = new PtrToIntInst(Val, Type::getInt64Ty(Context), "", CI); + CI->replaceAllUsesWith(Val); + CI->eraseFromParent(); + } else if (!strcmp(FCur->getName().data(), WordMaxMethod)) { + ConstantInt* M = ConstantInt::get(Type::getInt64Ty(Context), (uint64_t)-1); + Constant* N = ConstantExpr::getIntToPtr(M, FCur->getReturnType()); + CI->replaceAllUsesWith(N); + CI->eraseFromParent(); + } else { + fprintf(stderr, "Implement me %s\n", name); + abort(); + } + } else if ( + (len > strlen(AddressArrayClass) && + !memcmp(AddressArrayClass, name, strlen(AddressArrayClass))) || + (len > strlen(OffsetArrayClass) && + !memcmp(OffsetArrayClass, name, strlen(OffsetArrayClass))) || + (len > strlen(WordArrayClass) && + !memcmp(WordArrayClass, name, strlen(WordArrayClass))) || + (len > strlen(ObjectReferenceArrayClass) && + !memcmp(ObjectReferenceArrayClass, name, strlen(ObjectReferenceArrayClass))) || + (len > strlen(ExtentArrayClass) && + !memcmp(ExtentArrayClass, name, strlen(ExtentArrayClass)))) { + Changed = true; + + if (!strcmp(FCur->getName().data(), AddressArrayCreateMethod) || + !strcmp(FCur->getName().data(), OffsetArrayCreateMethod) || + !strcmp(FCur->getName().data(), WordArrayCreateMethod) || + !strcmp(FCur->getName().data(), ExtentArrayCreateMethod) || + !strcmp(FCur->getName().data(), ObjectReferenceArrayCreateMethod)) { + Value* Val = Call.getArgument(0); + ConstantInt* One = ConstantInt::get(Type::getInt32Ty(Context), (uint64_t)1); + Value* Length = BinaryOperator::CreateAdd(Val, One, "", CI); + Length = BinaryOperator::CreateShl(Length, constantPtrLogSize, "", CI); + Val = new IntToPtrInst(Val, ptrType, "", CI); + Value* args[2] = { Length, Val }; + Value* res = CallInst::Create(MMalloc, args, "", CI); + res = new BitCastInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + + } else if (!strcmp(FCur->getName().data(), AddressArrayGetMethod) || + !strcmp(FCur->getName().data(), OffsetArrayGetMethod) || + !strcmp(FCur->getName().data(), WordArrayGetMethod) || + !strcmp(FCur->getName().data(), ExtentArrayGetMethod) || + !strcmp(FCur->getName().data(), ObjectReferenceArrayGetMethod)) { + + Value* Array = Call.getArgument(0); + Value* Index = Call.getArgument(1); + ConstantInt* One = ConstantInt::get(Type::getInt32Ty(Context), (uint64_t)1); + Index = BinaryOperator::CreateAdd(Index, One, "", CI); + Array = new BitCastInst(Array, ptrSizeType, "", CI); + Value* res = GetElementPtrInst::Create(Array, Index, "", CI); + res = new LoadInst(res, "", CI); + res = new IntToPtrInst(res, FCur->getReturnType(), "", CI); + CI->replaceAllUsesWith(res); + CI->eraseFromParent(); + + } else if (!strcmp(FCur->getName().data(), AddressArraySetMethod) || + !strcmp(FCur->getName().data(), OffsetArraySetMethod) || + !strcmp(FCur->getName().data(), WordArraySetMethod) || + !strcmp(FCur->getName().data(), ExtentArraySetMethod) || + !strcmp(FCur->getName().data(), ObjectReferenceArraySetMethod)) { + + Value* Array = Call.getArgument(0); + Value* Index = Call.getArgument(1); + Value* Element = Call.getArgument(2); + ConstantInt* One = ConstantInt::get(Type::getInt32Ty(Context), (uint64_t)1); + + Index = BinaryOperator::CreateAdd(Index, One, "", CI); + Array = new BitCastInst(Array, ptrSizeType, "", CI); + Value* ptr = GetElementPtrInst::Create(Array, Index, "", CI); + Element = new PtrToIntInst(Element, pointerSizeType, "", CI); + new StoreInst(Element, ptr, CI); + CI->eraseFromParent(); + + } else if (!strcmp(FCur->getName().data(), AddressArrayLengthMethod) || + !strcmp(FCur->getName().data(), OffsetArrayLengthMethod) || + !strcmp(FCur->getName().data(), WordArrayLengthMethod) || + !strcmp(FCur->getName().data(), ExtentArrayLengthMethod) || + !strcmp(FCur->getName().data(), ObjectReferenceArrayLengthMethod)) { + + Value* Array = Call.getArgument(0); + Array = new BitCastInst(Array, ptrSizeType, "", CI); + Value* Length = new LoadInst(Array, "", CI); + if (Length->getType() != Type::getInt32Ty(Context)) { + Length = new TruncInst(Length, Type::getInt32Ty(Context), "", CI); + } + CI->replaceAllUsesWith(Length); + CI->eraseFromParent(); + } + } + } + } + } + + Changed |= !RemoveSet.empty(); + for (InstSet::iterator I = RemoveSet.begin(), + E = RemoveSet.end(); I != E; ++I) { + (*I)->eraseFromParent(); + } + + return Changed; +} + + +FunctionPass* createLowerMagicPass() { + return new LowerMagic(); +} + +} +#endif From gael.thomas at lip6.fr Mon Jan 20 07:57:13 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 20 Jan 2014 15:57:13 -0000 Subject: [vmkit-commits] [vmkit] r199668 - Better management of parallelism during compilation. Add a mmtk lowering pass (which is currently empty). Message-ID: <20140120155713.28AE83128078@llvm.org> Author: gthomas Date: Mon Jan 20 09:57:12 2014 New Revision: 199668 URL: http://llvm.org/viewvc/llvm-project?rev=199668&view=rev Log: Better management of parallelism during compilation. Add a mmtk lowering pass (which is currently empty). Removed: vmkit/branches/mcjit/tools/Makefile Modified: vmkit/branches/mcjit/Makefile.rules vmkit/branches/mcjit/lib/Makefile vmkit/branches/mcjit/lib/j3/Makefile vmkit/branches/mcjit/lib/mmtk/Makefile Modified: vmkit/branches/mcjit/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/Makefile.rules?rev=199668&r1=199667&r2=199668&view=diff ============================================================================== --- vmkit/branches/mcjit/Makefile.rules (original) +++ vmkit/branches/mcjit/Makefile.rules Mon Jan 20 09:57:12 2014 @@ -60,7 +60,7 @@ SHFLAGS=-lpthread -ldl -lz -lncurses -fr ############################################################################### # Targets ############################################################################### -.PHONY: all all-recursive clean clean-recursive clean-local tidy confclean check +.PHONY: all all-parallel-recursive clean clean-parallel-recursive clean-local tidy confclean check .SECONDARY: .SUFFIXES: @@ -69,8 +69,8 @@ SHFLAGS=-lpthread -ldl -lz -lncurses -fr ############################################################################### RECURSIVE_TARGETS=all clean -define do_sub_target -$1-recursive:: +define do_parallel_subdirs +$1-parallel-recursive:: #$(Echo) "Entering directory $$(PROF)/$2" $(Verb) +$(MAKE) $(SUB_OPT) -C $2 $1 PROF=$(PROF)/$2; \ if [ $$$$? != 0 ]; then echo "$$(EchoMsg) abort with errors in $$(PROF)/$2"; exit 1; fi @@ -78,11 +78,18 @@ endef define do_recursive_target $1: - $(Verb) +$(MAKE) $(SUB_OPT) $1-recursive - $(Verb) +$(MAKE) $1-local -$1-recursive:: + $(Verb) for f in $$(DIRS); do \ + $(MAKE) $(SUB_OPT) -C $$$$f $1 PROF=$(PROF)/$$$$f; \ + if [ $$$$? != 0 ]; then echo "$$(EchoMsg) abort with errors in $$(PROF)/$$$$f"; exit 1; fi; \ + done + $(Verb) +$(MAKE) -s $1-parallel-recursive + +$1-parallel-recursive:: + $(Verb) +$(MAKE) -s $1-local + $1-local:: -$$(foreach dir,$$(DIRS),$$(eval $$(call do_sub_target,$1,$$(dir)))) + +$$(foreach dir,$$(PARALLEL_DIRS),$$(eval $$(call do_parallel_subdirs,$1,$$(dir)))) endef $(foreach target,$(RECURSIVE_TARGETS),$(eval $(call do_recursive_target,$(target)))) Modified: vmkit/branches/mcjit/lib/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/Makefile?rev=199668&r1=199667&r2=199668&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/Makefile (original) +++ vmkit/branches/mcjit/lib/Makefile Mon Jan 20 09:57:12 2014 @@ -5,6 +5,6 @@ LEVEL := .. -DIRS := vmkit j3 +PARALLEL_DIRS := vmkit j3 include $(LEVEL)/Makefile.rules Modified: vmkit/branches/mcjit/lib/j3/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/Makefile?rev=199668&r1=199667&r2=199668&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/Makefile (original) +++ vmkit/branches/mcjit/lib/j3/Makefile Mon Jan 20 09:57:12 2014 @@ -5,6 +5,6 @@ LEVEL := ../.. -DIRS := vm openjdk +PARALLEL_DIRS := vm openjdk include $(LEVEL)/Makefile.rules Modified: vmkit/branches/mcjit/lib/mmtk/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/mmtk/Makefile?rev=199668&r1=199667&r2=199668&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/mmtk/Makefile (original) +++ vmkit/branches/mcjit/lib/mmtk/Makefile Mon Jan 20 09:57:12 2014 @@ -5,7 +5,7 @@ LEVEL := ../.. -DIRS:=magic +PARALLEL_DIRS:=magic BASE_OBJ_FILES=mmtk-lowered MODULE=mmtk Removed: vmkit/branches/mcjit/tools/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/tools/Makefile?rev=199667&view=auto ============================================================================== --- vmkit/branches/mcjit/tools/Makefile (original) +++ vmkit/branches/mcjit/tools/Makefile (removed) @@ -1,10 +0,0 @@ -#===- ./Makefile -------------------------------------------*- Makefile -*--===# -# -# The vmkit project -#===------------------------------------------------------------------------===# - -LEVEL := .. - -DIRS := j3 - -include $(LEVEL)/Makefile.rules From gael.thomas at lip6.fr Mon Jan 20 08:50:37 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 20 Jan 2014 16:50:37 -0000 Subject: [vmkit-commits] [vmkit] r199673 - Apply the lowring passes during compilation (they currently don't do anything). Message-ID: <20140120165037.6EF5E3128078@llvm.org> Author: gthomas Date: Mon Jan 20 10:50:37 2014 New Revision: 199673 URL: http://llvm.org/viewvc/llvm-project?rev=199673&view=rev Log: Apply the lowring passes during compilation (they currently don't do anything). Modified: vmkit/branches/mcjit/lib/mmtk/Makefile vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc Modified: vmkit/branches/mcjit/lib/mmtk/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/mmtk/Makefile?rev=199673&r1=199672&r2=199673&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/mmtk/Makefile (original) +++ vmkit/branches/mcjit/lib/mmtk/Makefile Mon Jan 20 10:50:37 2014 @@ -5,7 +5,7 @@ LEVEL := ../.. -PARALLEL_DIRS:=magic +DIRS:=magic BASE_OBJ_FILES=mmtk-lowered MODULE=mmtk @@ -16,9 +16,9 @@ MMTK_JAR=$(MMTK_PATH)/mmtk/mmtk.jar LOWER=$(LIB_DIR)/mmtk-pass$(SHLIBEXT) J3=$(BIN_DIR)/j3 -$(BUILD_DIR)/mmtk-lowered.bc: $(BUILD_DIR)/mmtk-bc.bc $(LOWER) - $(Echo) "Lowering '$(notdir $<)'" - $(Verb) cp $< $@ +$(BUILD_DIR)/mmtk-lowered.bc: $(BUILD_DIR)/mmtk-bc.bc $(LOWER) + $(Echo) "Lowering magic '$(notdir $<)'" + $(Verb) $(LLOPT) -load=$(LOWER) -LowerMagic -LowerJavaRT $(OPTFLAGS) -f $< -o $@ $(BUILD_DIR)/mmtk-bc.bc: $(MMTK_JAR) $(BUILD_DIR)/.dir $(J3) $(SELF) $(Echo) "Compiling '$(notdir $<)'" Modified: vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc?rev=199673&r1=199672&r2=199673&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc (original) +++ vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc Mon Jan 20 10:50:37 2014 @@ -7,8 +7,6 @@ // //===----------------------------------------------------------------------===// -#if 0 - #include "llvm/IR/Constants.h" #include "llvm/IR/Function.h" #include "llvm/IR/Instructions.h" @@ -36,9 +34,16 @@ namespace { static RegisterPass X("LowerJavaRT", "Remove references to RT"); + bool LowerJavaRT::runOnModule(Module& M) { bool Changed = true; + fprintf(stderr, "Lowering java runtime in %s\n", M.getModuleIdentifier().data()); + + return Changed; +} +#if 0 + for (Module::iterator I = M.begin(), E = M.end(); I != E;) { Function& GV = *I; ++I; @@ -147,9 +152,6 @@ bool LowerJavaRT::runOnModule(Module& M) // malloc and barriers. M.getTypeByName("JavaObject")->setName("MMTk.JavaObject"); - return Changed; -} - } - #endif +} Modified: vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc?rev=199673&r1=199672&r2=199673&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc (original) +++ vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc Mon Jan 20 10:50:37 2014 @@ -7,7 +7,6 @@ // //===----------------------------------------------------------------------===// -#if 0 #include "llvm/ADT/SmallPtrSet.h" #include "llvm/IR/Constants.h" #include "llvm/IR/Function.h" @@ -22,8 +21,8 @@ #include -#include "vmkit/GC.h" -#include "vmkit/System.h" +//#include "vmkit/GC.h" +//#include "vmkit/System.h" using namespace llvm; @@ -37,10 +36,19 @@ namespace vmmagic { virtual bool runOnFunction(Function &F); private: }; - char LowerMagic::ID = 0; - static RegisterPass X("LowerMagic", - "Lower magic calls"); - typedef SmallPtrSet InstSet; + +char LowerMagic::ID = 0; +static RegisterPass X("LowerMagic", + "Lower magic calls"); +typedef SmallPtrSet InstSet; + +bool LowerMagic::runOnFunction(Function& F) { + bool Changed = false; + fprintf(stderr, "Lowering magic of %s\n", F.getName().data()); + return Changed; +} +} +#if 0 static const char* AddressClass = "JnJVM_org_vmmagic_unboxed_Address_"; static const char* AddressZeroMethod = 0; From gael.thomas at lip6.fr Mon Jan 20 14:11:54 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 20 Jan 2014 22:11:54 -0000 Subject: [vmkit-commits] [vmkit] r199691 - Remove simple call backs to the runtime from mmtk. Message-ID: <20140120221154.3916019BE001@llvm.org> Author: gthomas Date: Mon Jan 20 16:11:53 2014 New Revision: 199691 URL: http://llvm.org/viewvc/llvm-project?rev=199691&view=rev Log: Remove simple call backs to the runtime from mmtk. Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/include/j3/j3meta.def vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199691&r1=199690&r2=199691&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Mon Jan 20 16:11:53 2014 @@ -42,7 +42,9 @@ namespace j3 { WithCaller = 2, OnlyTranslate = 4, NotUseStub = 8, - NotNeedGC = 16 + NotNeedGC = 16, + SupposeClinited = 32, + NoRuntimeCheck = 64 }; bool withMethod() { return mode & WithMethod; } @@ -50,6 +52,8 @@ namespace j3 { bool onlyTranslate() { return mode & OnlyTranslate; } bool useStub() { return !(mode & NotUseStub); } bool needGC() { return !(mode & NotNeedGC); } + bool supposeClinited() { return mode & SupposeClinited; } + bool noRuntimeCheck() { return mode & NoRuntimeCheck; } private: friend class J3CodeGenVar; Modified: vmkit/branches/mcjit/include/j3/j3meta.def URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=199691&r1=199690&r2=199691&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3meta.def (original) +++ vmkit/branches/mcjit/include/j3/j3meta.def Mon Jan 20 16:11:53 2014 @@ -1,8 +1,6 @@ -_x(funcJ3MethodIndex, "j3::J3Method::index()") _x(funcJ3TypeVT, "j3::J3Type::vt()") _x(funcJ3TypeVTAndResolve, "j3::J3Type::vtAndResolve()") _x(funcJ3TypeInitialise, "j3::J3Type::initialise()") -_x(funcJ3LayoutStructSize, "j3::J3Layout::structSize()") _x(funcJ3ClassStaticInstance, "j3::J3Class::staticInstance()") _x(funcJ3ClassStringAt, "j3::J3Class::stringAt(unsigned short, bool)") _x(funcJ3TypeJavaClass, "j3::J3Type::javaClass(bool, j3::J3ObjectHandle*)") 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=199691&r1=199690&r2=199691&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Mon Jan 20 16:11:53 2014 @@ -194,7 +194,11 @@ void J3::compileApplication() { names()->get("()Ljava/lang/ClassLoader;"))->invokeStatic().valObject); - loader->setCompilationMode(J3CodeGen::OnlyTranslate | J3CodeGen::NotUseStub | J3CodeGen::NotNeedGC); + loader->setCompilationMode(J3CodeGen::OnlyTranslate | + J3CodeGen::NotUseStub | + J3CodeGen::NotNeedGC | + J3CodeGen::SupposeClinited | + J3CodeGen::NoRuntimeCheck); if(options()->mainClass) J3::internalError("compiling a single class is not yet supported"); 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=199691&r1=199690&r2=199691&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Mon Jan 20 16:11:53 2014 @@ -326,7 +326,7 @@ void J3CodeGen::monitorExit(llvm::Value* } void J3CodeGen::initialiseJ3ObjectType(J3ObjectType* cl) { - if(!cl->isInitialised()) + if(!supposeClinited() && !cl->isInitialised()) builder.CreateCall(funcJ3TypeInitialise, typeDescriptor(cl, vm->typeJ3TypePtr)); } @@ -358,12 +358,12 @@ llvm::Value* J3CodeGen::vt(llvm::Value* } llvm::Value* J3CodeGen::vt(J3ObjectType* type, bool doResolve) { - llvm::Value* func = doResolve && !type->isResolved() ? funcJ3TypeVTAndResolve : funcJ3TypeVT; + llvm::Value* func = !supposeClinited() && doResolve && !type->isResolved() ? funcJ3TypeVTAndResolve : funcJ3TypeVT; return builder.CreateCall(func, typeDescriptor(type, vm->typeJ3TypePtr)); } llvm::Value* J3CodeGen::nullCheck(llvm::Value* obj) { - if(exceptions.nodes[curExceptionNode]->landingPad) { + if(!noRuntimeCheck() && exceptions.nodes[curExceptionNode]->landingPad) { llvm::BasicBlock* succeed = newBB("nullcheck-succeed"); if(!bbNullCheckFailed) { @@ -431,17 +431,22 @@ void J3CodeGen::invokeInterface(uint32_t void J3CodeGen::invokeVirtual(uint32_t idx) { J3Method* target = cl->methodAt(idx, 0); - J3Signature* type = target->signature(); - llvm::Value* funcEntry = funcEntry = builder.getInt32(target->index()); - llvm::Value* obj = nullCheck(stack.top(type->nbIns())); - llvm::Value* gepFunc[] = { builder.getInt32(0), - builder.getInt32(J3VirtualTable::gepVirtualMethods), - funcEntry }; - llvm::Value* func = builder.CreateBitCast(builder.CreateLoad(builder.CreateGEP(vt(obj), gepFunc)), - target->signature()->functionType(target->access())->getPointerTo()); + if(J3Cst::isFinal(target->cl()->access()) || J3Cst::isFinal(target->cl()->access())) + invoke(0, target, buildFunction(target)); /* do not remove this optimization */ + else { + J3Signature* type = target->signature(); + llvm::Value* funcEntry = funcEntry = builder.getInt32(target->index()); + + llvm::Value* obj = nullCheck(stack.top(type->nbIns())); + llvm::Value* gepFunc[] = { builder.getInt32(0), + builder.getInt32(J3VirtualTable::gepVirtualMethods), + funcEntry }; + llvm::Value* func = builder.CreateBitCast(builder.CreateLoad(builder.CreateGEP(vt(obj), gepFunc)), + target->signature()->functionType(target->access())->getPointerTo()); - invoke(0, target, func); + invoke(0, target, func); + } } void J3CodeGen::invokeStatic(uint32_t idx) { @@ -493,6 +498,9 @@ void J3CodeGen::putField(uint32_t idx) { } void J3CodeGen::arrayBoundCheck(llvm::Value* obj, llvm::Value* idx) { + if(!noRuntimeCheck()) { + /* implement me */ + } } llvm::Value* J3CodeGen::arrayContent(J3Type* cType, llvm::Value* array, llvm::Value* idx) { @@ -581,11 +589,8 @@ void J3CodeGen::newObject(J3Class* cl) { llvm::Value* size; - if(!cl->isResolved()) { - size = builder.CreateCall(funcJ3LayoutStructSize, typeDescriptor(cl, vm->typeJ3LayoutPtr)); - } else { - size = builder.getInt64(cl->structSize()); - } + cl->resolve(); + size = builder.getInt64(cl->structSize()); llvm::Value* res = builder.CreateCall2(funcJ3ObjectAllocate, vt(cl), size); @@ -627,23 +632,25 @@ void J3CodeGen::instanceof(llvm::Value* } void J3CodeGen::checkCast(llvm::Value* obj, J3ObjectType* type) { - llvm::BasicBlock* succeed = forwardBranch("checkcast-succeed", codeReader->tell(), 0, 0); - llvm::BasicBlock* test = newBB("checkcast"); - - builder.CreateCondBr(builder.CreateIsNull(obj), succeed, test); - - if(!bbCheckCastFailed) { - bbCheckCastFailed = newBB("checkcast-failed"); - builder.SetInsertPoint(bbCheckCastFailed); - builder.CreateCall(funcClassCastException); - builder.CreateBr(bbRet); - } + if(!noRuntimeCheck()) { + llvm::BasicBlock* succeed = forwardBranch("checkcast-succeed", codeReader->tell(), 0, 0); + llvm::BasicBlock* test = newBB("checkcast"); + + builder.CreateCondBr(builder.CreateIsNull(obj), succeed, test); + + if(!bbCheckCastFailed) { + bbCheckCastFailed = newBB("checkcast-failed"); + builder.SetInsertPoint(bbCheckCastFailed); + builder.CreateCall(funcClassCastException); + builder.CreateBr(bbRet); + } - builder.SetInsertPoint(test); + builder.SetInsertPoint(test); - llvm::Value* res = isAssignableTo(obj, type); + llvm::Value* res = isAssignableTo(obj, type); - builder.CreateCondBr(res, succeed, bbCheckCastFailed); + builder.CreateCondBr(res, succeed, bbCheckCastFailed); + } } void J3CodeGen::floatToInteger(J3Type* ftype, J3Type* itype) { Modified: vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc?rev=199691&r1=199690&r2=199691&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc (original) +++ vmkit/branches/mcjit/lib/mmtk/magic/lower-java-runtime.cc Mon Jan 20 16:11:53 2014 @@ -18,27 +18,36 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" -using namespace llvm; - namespace { - - class LowerJavaRT : public ModulePass { + class LowerJavaRT : public llvm::ModulePass { public: static char ID; - LowerJavaRT() : ModulePass(ID) { } + LowerJavaRT() : llvm::ModulePass(ID) { } - virtual bool runOnModule(Module &M); + virtual bool runOnModule(llvm::Module &M); private: }; + char LowerJavaRT::ID = 0; - static RegisterPass X("LowerJavaRT", - "Remove references to RT"); + static llvm::RegisterPass X("LowerJavaRT", + "Remove references to RT"); -bool LowerJavaRT::runOnModule(Module& M) { - bool Changed = true; + bool LowerJavaRT::runOnModule(llvm::Module& module) { + bool Changed = true; - fprintf(stderr, "Lowering java runtime in %s\n", M.getModuleIdentifier().data()); + for(llvm::Module::global_iterator it = module.global_begin(); it!=module.global_end(); it++) { + llvm::GlobalValue* gv = it; + + fprintf(stderr, "Global: %s\n", gv->getName().data()); + } + + for(llvm::Module::iterator it = module.begin(); it!=module.end(); it++) { + llvm::Function* function = it; + + if(!strncmp(function->getName().data(), "j3_java", 7)) + fprintf(stderr, "processing %s\n", function->getName().data()); + } return Changed; } Modified: vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc?rev=199691&r1=199690&r2=199691&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc (original) +++ vmkit/branches/mcjit/lib/mmtk/magic/lower-magic.cc Mon Jan 20 16:11:53 2014 @@ -44,7 +44,7 @@ typedef SmallPtrSet In bool LowerMagic::runOnFunction(Function& F) { bool Changed = false; - fprintf(stderr, "Lowering magic of %s\n", F.getName().data()); + //fprintf(stderr, "Lowering magic of %s\n", F.getName().data()); return Changed; } } From gael.thomas at lip6.fr Mon Jan 20 14:45:40 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 20 Jan 2014 22:45:40 -0000 Subject: [vmkit-commits] [vmkit] r199692 - J3Globalreference is now a template class. Message-ID: <20140120224540.CE3343128078@llvm.org> Author: gthomas Date: Mon Jan 20 16:45:39 2014 New Revision: 199692 URL: http://llvm.org/viewvc/llvm-project?rev=199692&view=rev Log: J3Globalreference is now a template class. Modified: vmkit/branches/mcjit/Makefile vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/include/j3/j3classloader.h vmkit/branches/mcjit/include/j3/j3object.h vmkit/branches/mcjit/lib/j3/vm/j3object.cc Modified: vmkit/branches/mcjit/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/Makefile?rev=199692&r1=199691&r2=199692&view=diff ============================================================================== --- vmkit/branches/mcjit/Makefile (original) +++ vmkit/branches/mcjit/Makefile Mon Jan 20 16:45:39 2014 @@ -5,6 +5,6 @@ LEVEL := . -DIRS := tools/vmkit-extract lib tools/j3 lib/mmtk/ +DIRS := tools/vmkit-extract lib tools/j3 # lib/mmtk/ include $(LEVEL)/Makefile.rules Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199692&r1=199691&r2=199692&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Mon Jan 20 16:45:39 2014 @@ -40,7 +40,6 @@ namespace j3 { J3Method** methods; }; - class J3Type : public vmkit::Symbol { pthread_mutex_t _mutex; J3ClassLoader* _loader; @@ -52,7 +51,7 @@ namespace j3 { const vmkit::Name* _name; char* _nativeName; uint32_t _nativeNameLength; - J3VirtualTable* _vt; + J3VirtualTable* _vt; J3ObjectHandle* volatile _javaClass; volatile int status; Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=199692&r1=199691&r2=199692&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Mon Jan 20 16:45:39 2014 @@ -41,7 +41,7 @@ namespace j3 { uint32_t _compilationMode; J3ObjectHandle* _javaClassLoader; - J3GlobalReferences _globalReferences; + J3GlobalReferences _globalReferences; pthread_mutex_t _mutexClasses; vmkit::NameMap::map classes; /* classes managed by this class loader */ @@ -77,7 +77,7 @@ namespace j3 { uint32_t interfaceIndex(J3Method* signature); - J3GlobalReferences* globalReferences() { return &_globalReferences; } + J3GlobalReferences* globalReferences() { return &_globalReferences; } static J3ClassLoader* nativeClassLoader(J3ObjectHandle* jloader); J3ObjectHandle* javaClassLoader(bool doPush=1); Modified: vmkit/branches/mcjit/include/j3/j3object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=199692&r1=199691&r2=199692&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3object.h (original) +++ vmkit/branches/mcjit/include/j3/j3object.h Mon Jan 20 16:45:39 2014 @@ -144,7 +144,6 @@ namespace j3 { class J3ObjectHandle { friend class J3LocalReferences; - friend class J3GlobalReferences; friend class J3Method; public: @@ -200,25 +199,6 @@ namespace j3 { #undef defAccessor }; - class J3LocalReferences : public vmkit::Stack { - public: - J3LocalReferences(vmkit::BumpAllocator* _allocator) : vmkit::Stack(_allocator) {} - - J3ObjectHandle* push(J3ObjectHandle* handle) { return handle ? push(handle->obj()) : 0; } - J3ObjectHandle* push(J3Object* obj); - }; - - class J3GlobalReferences { - pthread_mutex_t mutex; - vmkit::Stack references; - vmkit::Stack emptySlots; - public: - J3GlobalReferences(vmkit::BumpAllocator* _allocator); - - J3ObjectHandle* add(J3ObjectHandle* handle); - void del(J3ObjectHandle* handle); - }; - class J3Value { public: union { @@ -235,6 +215,48 @@ namespace j3 { J3Value() {} }; + + class J3LocalReferences : public vmkit::Stack { + public: + J3LocalReferences(vmkit::BumpAllocator* _allocator) : vmkit::Stack(_allocator) {} + + J3ObjectHandle* push(J3ObjectHandle* handle) { return handle ? push(handle->obj()) : 0; } + J3ObjectHandle* push(J3Object* obj); + }; + + template + class J3GlobalReferences { + pthread_mutex_t mutex; + vmkit::Stack references; + vmkit::Stack emptySlots; + + public: + J3GlobalReferences(vmkit::BumpAllocator* _allocator) : + references(_allocator), + emptySlots(_allocator) { + pthread_mutex_init(&mutex, 0); + } + + T* add(T* handle) { + if(handle) { + pthread_mutex_lock(&mutex); + T* res = emptySlots.isEmpty() ? references.push() : *emptySlots.pop(); + *res = *handle; + pthread_mutex_unlock(&mutex); + return res; + } else + return 0; + } + + void del(T* handle) { + if(handle) { + handle->harakiri(); + pthread_mutex_lock(&mutex); + *emptySlots.push() = handle; + pthread_mutex_unlock(&mutex); + } + } + }; } #endif 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=199692&r1=199691&r2=199692&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Mon Jan 20 16:45:39 2014 @@ -544,32 +544,4 @@ J3ObjectHandle* J3LocalReferences::push( return 0; } -/* - * J3GlobalReferences - */ -J3GlobalReferences::J3GlobalReferences(vmkit::BumpAllocator* _allocator) : - references(_allocator), - emptySlots(_allocator) { - pthread_mutex_init(&mutex, 0); -} - -J3ObjectHandle* J3GlobalReferences::add(J3ObjectHandle* handle) { - if(handle) { - pthread_mutex_lock(&mutex); - J3ObjectHandle* res = emptySlots.isEmpty() ? references.push() : *emptySlots.pop(); - res->_obj = handle->_obj; - pthread_mutex_unlock(&mutex); - return res; - } else - return 0; -} - -void J3GlobalReferences::del(J3ObjectHandle* handle) { - if(handle) { - handle->harakiri(); - pthread_mutex_lock(&mutex); - *emptySlots.push() = handle; - pthread_mutex_unlock(&mutex); - } -} From gael.thomas at lip6.fr Mon Jan 20 14:52:31 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Mon, 20 Jan 2014 22:52:31 -0000 Subject: [vmkit-commits] [vmkit] r199693 - Abort last commit and revert to r199691 Message-ID: <20140120225231.5031A2A6C03A@llvm.org> Author: gthomas Date: Mon Jan 20 16:52:30 2014 New Revision: 199693 URL: http://llvm.org/viewvc/llvm-project?rev=199693&view=rev Log: Abort last commit and revert to r199691 Modified: vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/include/j3/j3classloader.h vmkit/branches/mcjit/include/j3/j3object.h vmkit/branches/mcjit/lib/j3/vm/j3object.cc Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199693&r1=199692&r2=199693&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Mon Jan 20 16:52:30 2014 @@ -40,6 +40,7 @@ namespace j3 { J3Method** methods; }; + class J3Type : public vmkit::Symbol { pthread_mutex_t _mutex; J3ClassLoader* _loader; @@ -51,7 +52,7 @@ namespace j3 { const vmkit::Name* _name; char* _nativeName; uint32_t _nativeNameLength; - J3VirtualTable* _vt; + J3VirtualTable* _vt; J3ObjectHandle* volatile _javaClass; volatile int status; Modified: vmkit/branches/mcjit/include/j3/j3classloader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=199693&r1=199692&r2=199693&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3classloader.h (original) +++ vmkit/branches/mcjit/include/j3/j3classloader.h Mon Jan 20 16:52:30 2014 @@ -41,7 +41,7 @@ namespace j3 { uint32_t _compilationMode; J3ObjectHandle* _javaClassLoader; - J3GlobalReferences _globalReferences; + J3GlobalReferences _globalReferences; pthread_mutex_t _mutexClasses; vmkit::NameMap::map classes; /* classes managed by this class loader */ @@ -77,7 +77,7 @@ namespace j3 { uint32_t interfaceIndex(J3Method* signature); - J3GlobalReferences* globalReferences() { return &_globalReferences; } + J3GlobalReferences* globalReferences() { return &_globalReferences; } static J3ClassLoader* nativeClassLoader(J3ObjectHandle* jloader); J3ObjectHandle* javaClassLoader(bool doPush=1); Modified: vmkit/branches/mcjit/include/j3/j3object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=199693&r1=199692&r2=199693&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3object.h (original) +++ vmkit/branches/mcjit/include/j3/j3object.h Mon Jan 20 16:52:30 2014 @@ -144,6 +144,7 @@ namespace j3 { class J3ObjectHandle { friend class J3LocalReferences; + friend class J3GlobalReferences; friend class J3Method; public: @@ -199,6 +200,25 @@ namespace j3 { #undef defAccessor }; + class J3LocalReferences : public vmkit::Stack { + public: + J3LocalReferences(vmkit::BumpAllocator* _allocator) : vmkit::Stack(_allocator) {} + + J3ObjectHandle* push(J3ObjectHandle* handle) { return handle ? push(handle->obj()) : 0; } + J3ObjectHandle* push(J3Object* obj); + }; + + class J3GlobalReferences { + pthread_mutex_t mutex; + vmkit::Stack references; + vmkit::Stack emptySlots; + public: + J3GlobalReferences(vmkit::BumpAllocator* _allocator); + + J3ObjectHandle* add(J3ObjectHandle* handle); + void del(J3ObjectHandle* handle); + }; + class J3Value { public: union { @@ -215,48 +235,6 @@ namespace j3 { J3Value() {} }; - - class J3LocalReferences : public vmkit::Stack { - public: - J3LocalReferences(vmkit::BumpAllocator* _allocator) : vmkit::Stack(_allocator) {} - - J3ObjectHandle* push(J3ObjectHandle* handle) { return handle ? push(handle->obj()) : 0; } - J3ObjectHandle* push(J3Object* obj); - }; - - template - class J3GlobalReferences { - pthread_mutex_t mutex; - vmkit::Stack references; - vmkit::Stack emptySlots; - - public: - J3GlobalReferences(vmkit::BumpAllocator* _allocator) : - references(_allocator), - emptySlots(_allocator) { - pthread_mutex_init(&mutex, 0); - } - - T* add(T* handle) { - if(handle) { - pthread_mutex_lock(&mutex); - T* res = emptySlots.isEmpty() ? references.push() : *emptySlots.pop(); - *res = *handle; - pthread_mutex_unlock(&mutex); - return res; - } else - return 0; - } - - void del(T* handle) { - if(handle) { - handle->harakiri(); - pthread_mutex_lock(&mutex); - *emptySlots.push() = handle; - pthread_mutex_unlock(&mutex); - } - } - }; } #endif 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=199693&r1=199692&r2=199693&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Mon Jan 20 16:52:30 2014 @@ -544,4 +544,32 @@ J3ObjectHandle* J3LocalReferences::push( return 0; } +/* + * J3GlobalReferences + */ +J3GlobalReferences::J3GlobalReferences(vmkit::BumpAllocator* _allocator) : + references(_allocator), + emptySlots(_allocator) { + pthread_mutex_init(&mutex, 0); +} + +J3ObjectHandle* J3GlobalReferences::add(J3ObjectHandle* handle) { + if(handle) { + pthread_mutex_lock(&mutex); + J3ObjectHandle* res = emptySlots.isEmpty() ? references.push() : *emptySlots.pop(); + res->_obj = handle->_obj; + pthread_mutex_unlock(&mutex); + return res; + } else + return 0; +} + +void J3GlobalReferences::del(J3ObjectHandle* handle) { + if(handle) { + handle->harakiri(); + pthread_mutex_lock(&mutex); + *emptySlots.push() = handle; + pthread_mutex_unlock(&mutex); + } +} From gael.thomas at lip6.fr Tue Jan 21 02:34:54 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Tue, 21 Jan 2014 10:34:54 -0000 Subject: [vmkit-commits] [vmkit] r199717 - Define vmkit::Symbols for vts, staticObjects and java.lang.Strings. For the moment, only use these symbols for staticObjects. Message-ID: <20140121103454.6B6CB19BE001@llvm.org> 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 _staticObjects; + pthread_mutex_t _mutexClasses; vmkit::NameMap::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* 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* 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 LockedStack : private Stack { + pthread_mutex_t mutex; + + public: + LockedStack(BumpAllocator* _allocator) : Stack(_allocator) { + pthread_mutex_init(&mutex, 0); + } + + T* push() { + pthread_mutex_lock(&mutex); + T* res = Stack::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 #include #include @@ -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; inbFields(); 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; \ } \ From gael.thomas at lip6.fr Tue Jan 21 02:42:26 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Tue, 21 Jan 2014 10:42:26 -0000 Subject: [vmkit-commits] [vmkit] r199720 - Uniformize vt access from runtime. Message-ID: <20140121104226.8D4CC2A6C03B@llvm.org> Author: gthomas Date: Tue Jan 21 04:42:26 2014 New Revision: 199720 URL: http://llvm.org/viewvc/llvm-project?rev=199720&view=rev Log: Uniformize vt access from runtime. Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/include/j3/j3meta.def vmkit/branches/mcjit/include/j3/j3symbols.h vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199720&r1=199719&r2=199720&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Tue Jan 21 04:42:26 2014 @@ -126,6 +126,7 @@ namespace j3 { llvm::Value* staticObject(J3Class* cl); llvm::Value* vt(J3ObjectType* cl, bool resolve=0); llvm::Value* vt(llvm::Value* obj); + void resolveJ3ObjectType(J3ObjectType* cl); void initialiseJ3ObjectType(J3ObjectType* cl); void monitorEnter(llvm::Value* obj); Modified: vmkit/branches/mcjit/include/j3/j3meta.def URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=199720&r1=199719&r2=199720&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3meta.def (original) +++ vmkit/branches/mcjit/include/j3/j3meta.def Tue Jan 21 04:42:26 2014 @@ -1,6 +1,6 @@ _x(funcJ3TypeVT, "j3::J3Type::vt()") -_x(funcJ3TypeVTAndResolve, "j3::J3Type::vtAndResolve()") -_x(funcJ3TypeInitialise, "j3::J3Type::initialise()") +_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()") Modified: vmkit/branches/mcjit/include/j3/j3symbols.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3symbols.h?rev=199720&r1=199719&r2=199720&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3symbols.h (original) +++ vmkit/branches/mcjit/include/j3/j3symbols.h Tue Jan 21 04:42:26 2014 @@ -18,10 +18,13 @@ namespace j3 { public: J3VTSymbol() {} + J3VirtualTable* vt() { return _vt; } + char* id() { return _id; } - void* getSymbolAddress() { return _vt; } + void* getSymbolAddress() { return vt(); } - void set(char* id, J3VirtualTable* vt) { _id = id; _vt = vt; } + void setId(char* id) { _id = id; } + void setVt(J3VirtualTable* vt) { _vt = vt; } }; class J3StaticObjectSymbol : public vmkit::Symbol { 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=199720&r1=199719&r2=199720&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Tue Jan 21 04:42:26 2014 @@ -325,9 +325,14 @@ void J3CodeGen::monitorExit(llvm::Value* builder.CreateBr(ok); } +void J3CodeGen::resolveJ3ObjectType(J3ObjectType* cl) { + if(!supposeClinited() && !cl->isResolved()) + builder.CreateCall(funcJ3ObjectTypeResolve, typeDescriptor(cl, vm->typeJ3TypePtr)); +} + void J3CodeGen::initialiseJ3ObjectType(J3ObjectType* cl) { if(!supposeClinited() && !cl->isInitialised()) - builder.CreateCall(funcJ3TypeInitialise, typeDescriptor(cl, vm->typeJ3TypePtr)); + builder.CreateCall(funcJ3ObjectTypeInitialise, typeDescriptor(cl, vm->typeJ3TypePtr)); } llvm::Value* J3CodeGen::javaClass(J3ObjectType* type, bool doPush) { @@ -361,8 +366,9 @@ llvm::Value* J3CodeGen::vt(llvm::Value* } llvm::Value* J3CodeGen::vt(J3ObjectType* type, bool doResolve) { - llvm::Value* func = !supposeClinited() && doResolve && !type->isResolved() ? funcJ3TypeVTAndResolve : funcJ3TypeVT; - return builder.CreateCall(func, typeDescriptor(type, vm->typeJ3TypePtr)); + if(doResolve) + resolveJ3ObjectType(type); + return builder.CreateCall(funcJ3TypeVT, typeDescriptor(type, vm->typeJ3TypePtr)); } llvm::Value* J3CodeGen::nullCheck(llvm::Value* obj) { From gael.thomas at lip6.fr Tue Jan 21 02:46:15 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Tue, 21 Jan 2014 10:46:15 -0000 Subject: [vmkit-commits] [vmkit] r199721 - Remove the vt and resolve function. Message-ID: <20140121104615.8AECA19BE001@llvm.org> Author: gthomas Date: Tue Jan 21 04:46:15 2014 New Revision: 199721 URL: http://llvm.org/viewvc/llvm-project?rev=199721&view=rev Log: Remove the vt and resolve function. Modified: vmkit/branches/mcjit/include/j3/j3class.h vmkit/branches/mcjit/include/j3/j3object.h vmkit/branches/mcjit/lib/j3/vm/j3class.cc vmkit/branches/mcjit/lib/j3/vm/j3object.cc Modified: vmkit/branches/mcjit/include/j3/j3class.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199721&r1=199720&r2=199721&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3class.h (original) +++ vmkit/branches/mcjit/include/j3/j3class.h Tue Jan 21 04:46:15 2014 @@ -80,7 +80,6 @@ namespace j3 { J3Type* initialise(); J3VirtualTable* vt(); - J3VirtualTable* vtAndResolve(); bool isAssignableTo(J3Type* parent); Modified: vmkit/branches/mcjit/include/j3/j3object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=199721&r1=199720&r2=199721&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3object.h (original) +++ vmkit/branches/mcjit/include/j3/j3object.h Tue Jan 21 04:46:15 2014 @@ -117,7 +117,6 @@ namespace j3 { static void monitorExit(J3Object* obj); static J3Object* allocate(J3VirtualTable* vt, uintptr_t n); - static J3Object* doNewNoInit(J3Class* cl); static J3Object* doNew(J3Class* cl); public: 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=199721&r1=199720&r2=199721&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Tue Jan 21 04:46:15 2014 @@ -41,11 +41,6 @@ J3VirtualTable* J3Type::vt() { return _vt; } -J3VirtualTable* J3Type::vtAndResolve() { - resolve(); - return vt(); -} - void J3Type::dump() { fprintf(stderr, "Type: %s", name()->cStr()); } 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=199721&r1=199720&r2=199721&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Tue Jan 21 04:46:15 2014 @@ -282,13 +282,9 @@ J3Object* J3Object::allocate(J3VirtualTa return res; } -J3Object* J3Object::doNewNoInit(J3Class* cl) { - return allocate(cl->vtAndResolve(), cl->structSize()); -} - J3Object* J3Object::doNew(J3Class* cl) { cl->initialise(); - return doNewNoInit(cl); + return allocate(cl->vt(), cl->structSize()); } void J3Object::monitorEnter(J3Object* obj) { @@ -379,7 +375,8 @@ bool J3Object::isLockOwner() { * --- J3ArrayObject --- */ J3Object* J3ArrayObject::doNew(J3ArrayClass* cl, uintptr_t length) { - J3ArrayObject* res = (J3ArrayObject*)allocate(cl->vtAndResolve(), sizeof(J3ArrayObject) + (1 << cl->component()->logSize()) * length); + cl->resolve(); + J3ArrayObject* res = (J3ArrayObject*)allocate(cl->vt(), sizeof(J3ArrayObject) + (1 << cl->component()->logSize()) * length); res->_length = length; From gael.thomas at lip6.fr Tue Jan 21 03:21:05 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Tue, 21 Jan 2014 11:21:05 -0000 Subject: [vmkit-commits] [vmkit] r199726 - Use the vmkit::Symbol to load the virtual table f a class. Message-ID: <20140121112105.DDC463128078@llvm.org> 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* stack) { return stack->push(); } + void* operator new(size_t n, vmkit::LockedStack* 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) { From gael.thomas at lip6.fr Tue Jan 21 05:23:27 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Tue, 21 Jan 2014 13:23:27 -0000 Subject: [vmkit-commits] [vmkit] r199740 - Use J3StringSymbol to find string at runtime. Message-ID: <20140121132327.B21DD2A6C03B@llvm.org> 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 _staticObjectHandles; vmkit::LockedStack _staticObjects; pthread_mutex_t _mutexClasses; @@ -61,9 +62,12 @@ namespace j3 { pthread_mutex_t _mutexNativeLibraries; std::vector > 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* staticObjectHandles() { return &_staticObjectHandles; } vmkit::LockedStack* 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* 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)); From gael.thomas at lip6.fr Tue Jan 21 06:17:27 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Tue, 21 Jan 2014 14:17:27 -0000 Subject: [vmkit-commits] [vmkit] r199744 - Add a flag in j3meta.def to explicitly inform j3codegen when we want to create a local symbol. Message-ID: <20140121141727.880022A6C03B@llvm.org> Author: gthomas Date: Tue Jan 21 08:17:26 2014 New Revision: 199744 URL: http://llvm.org/viewvc/llvm-project?rev=199744&view=rev Log: Add a flag in j3meta.def to explicitly inform j3codegen when we want to create a local symbol. Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/include/j3/j3meta.def vmkit/branches/mcjit/include/j3/j3object.h vmkit/branches/mcjit/lib/j3/vm/j3class.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3object.cc vmkit/branches/mcjit/lib/vmkit/vmkit.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199744&r1=199743&r2=199744&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Tue Jan 21 08:17:26 2014 @@ -197,7 +197,7 @@ namespace j3 { void genDebugOpcode(); void genDebugEnterLeave(bool isLeave); -#define _x(name, id) \ +#define _x(name, id, isLocal) \ llvm::Function* name; #include "j3/j3meta.def" #undef _x Modified: vmkit/branches/mcjit/include/j3/j3meta.def URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=199744&r1=199743&r2=199744&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3meta.def (original) +++ vmkit/branches/mcjit/include/j3/j3meta.def Tue Jan 21 08:17:26 2014 @@ -1,27 +1,25 @@ -_x(funcJ3TypeVT, "j3::J3Type::vt()") -_x(funcJ3ObjectTypeResolve, "j3::J3Type::resolve()") -_x(funcJ3ObjectTypeInitialise, "j3::J3Type::initialise()") -_x(funcJ3TypeJavaClass, "j3::J3Type::javaClass(bool, j3::J3ObjectHandle*)") -_x(funcJniEnv, "j3::J3::jniEnv()") -_x(funcJ3ArrayObjectMultianewArray, "j3::J3ArrayObject::multianewArray(j3::J3ArrayClass*, unsigned int, unsigned int*)") -_x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)") -_x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*)") -_x(funcJ3ObjectMonitorExit, "j3::J3Object::monitorExit(j3::J3Object*)") -_x(funcThrowException, "vmkit::VMKit::throwException(void*)") -_x(funcReplayException, "j3::J3Thread::replayException()") -_x(funcClassCastException, "j3::J3::classCastException()") -_x(funcNullPointerException, "j3::J3::nullPointerException()") -_x(funcJ3ThreadPushHandle, "j3::J3Thread::push(j3::J3ObjectHandle*)") -_x(funcJ3ThreadPush, "j3::J3Thread::push(j3::J3Object*)") -_x(funcJ3ThreadTell, "j3::J3Thread::tell()") -_x(funcJ3ThreadRestore, "j3::J3Thread::restore(j3::J3ObjectHandle*)") -_x(funcEchoDebugEnter, "j3::J3CodeGen::echoDebugEnter(unsigned int, char const*, ...)") -_x(funcEchoDebugExecute, "j3::J3CodeGen::echoDebugExecute(unsigned int, char const*, ...)") -_x(funcEchoElement, "j3::J3CodeGen::echoElement(unsigned int, unsigned int, unsigned long)") -_x(funcIsAssignableTo, "j3::J3VirtualTable::isAssignableTo(j3::J3VirtualTable*)") -_x(funcFastIsAssignableToPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToPrimaryChecker(j3::J3VirtualTable*, unsigned int)") -_x(funcFastIsAssignableToNonPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToNonPrimaryChecker(j3::J3VirtualTable*)") -_x(funcGXXPersonality, "__gxx_personality_v0") -_x(funcCXABeginCatch, "__cxa_begin_catch") -_x(funcCXAEndCatch, "__cxa_end_catch") -_x(funcFake, "j3::J3::forceSymbolDefinition()") +_x(funcJ3ObjectTypeResolve, "j3::J3Type::resolve()", 1) +_x(funcJ3ObjectTypeInitialise, "j3::J3Type::initialise()", 1) +_x(funcJ3TypeJavaClass, "j3::J3Type::javaClass(bool, j3::J3ObjectHandle*)", 1) +_x(funcJniEnv, "j3::J3::jniEnv()", 1) +_x(funcJ3ArrayObjectMultianewArray, "j3::J3ArrayObject::multianewArray(j3::J3ArrayClass*, unsigned int, unsigned int*)", 1) +_x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)", 1) +_x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*)", 1) +_x(funcJ3ObjectMonitorExit, "j3::J3Object::monitorExit(j3::J3Object*)", 1) +_x(funcThrowException, "vmkit::VMKit::throwException(void*)", 1) +_x(funcReplayException, "j3::J3Thread::replayException()", 1) +_x(funcClassCastException, "j3::J3::classCastException()", 1) +_x(funcNullPointerException, "j3::J3::nullPointerException()", 1) +_x(funcJ3ThreadPushHandle, "j3::J3Thread::push(j3::J3ObjectHandle*)", 1) +_x(funcJ3ThreadPush, "j3::J3Thread::push(j3::J3Object*)", 1) +_x(funcJ3ThreadTell, "j3::J3Thread::tell()", 1) +_x(funcJ3ThreadRestore, "j3::J3Thread::restore(j3::J3ObjectHandle*)", 1) +_x(funcEchoDebugEnter, "j3::J3CodeGen::echoDebugEnter(unsigned int, char const*, ...)", 1) +_x(funcEchoDebugExecute, "j3::J3CodeGen::echoDebugExecute(unsigned int, char const*, ...)", 1) +_x(funcEchoElement, "j3::J3CodeGen::echoElement(unsigned int, unsigned int, unsigned long)", 1) +_x(funcFastIsAssignableToPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToPrimaryChecker(j3::J3VirtualTable*, unsigned int)", 1) +_x(funcFastIsAssignableToNonPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToNonPrimaryChecker(j3::J3VirtualTable*)", 1) +_x(funcGXXPersonality, "__gxx_personality_v0", 1) +_x(funcCXABeginCatch, "__cxa_begin_catch", 1) +_x(funcCXAEndCatch, "__cxa_end_catch", 1) +_x(funcFake, "j3::J3::forceSymbolDefinition()", 1) Modified: vmkit/branches/mcjit/include/j3/j3object.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=199744&r1=199743&r2=199744&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3object.h (original) +++ vmkit/branches/mcjit/include/j3/j3object.h Tue Jan 21 08:17:26 2014 @@ -51,7 +51,9 @@ namespace j3 { private: J3Type* _type; - J3TypeChecker _checker; + public: + J3TypeChecker checker; + private: // see: Bowen Alpern, Anthony Cocchi, Stephen Fink, and David Grove. 2001. // Efficient implementation of Java interfaces: Invokeinterface considered harmless. OOPSLA 2001. void* _interfaceMethodTable[nbInterfaceMethodTable]; @@ -66,12 +68,10 @@ namespace j3 { static J3VirtualTable* create(J3ArrayClass* cl); static J3VirtualTable* create(J3Primitive* prim); - J3TypeChecker* checker() { return &_checker; } - - uint32_t offset() { return _checker.offset; } - bool isPrimaryChecker() { return _checker.offset < J3TypeChecker::cacheOffset; } + uint32_t offset() { return checker.offset; } + bool isPrimaryChecker() { return checker.offset < J3TypeChecker::cacheOffset; } - bool slowIsAssignableTo(J3VirtualTable* parent); + bool slowIsAssignableTo(J3VirtualTable* parent) __attribute__((always_inline)); bool fastIsAssignableToPrimaryChecker(J3VirtualTable* parent, uint32_t parentOffset); bool fastIsAssignableToNonPrimaryChecker(J3VirtualTable* parent); bool isAssignableTo(J3VirtualTable* parent); 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=199744&r1=199743&r2=199744&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Tue Jan 21 08:17:26 2014 @@ -217,11 +217,11 @@ void J3ObjectType::prepareInterfaceTable uint32_t total = 0; J3InterfaceSlotDescriptor* slots = _interfaceSlotDescriptors; - for(uint32_t i=0; ichecker()->nbSecondaryTypes; i++) { - J3Type* type = vt()->checker()->secondaryTypes[i]->type(); + for(uint32_t i=0; ichecker.nbSecondaryTypes; i++) { + J3Type* type = vt()->checker.secondaryTypes[i]->type(); if(type->isClass()) { - J3Class* ifce = vt()->checker()->secondaryTypes[i]->type()->asClass(); + J3Class* ifce = vt()->checker.secondaryTypes[i]->type()->asClass(); if(J3Cst::isInterface(ifce->access())) { //fprintf(stderr, " processing interface: %s\n", ifce->name()->cStr()); for(uint32_t j=0; jnbMethods(); j++) { 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=199744&r1=199743&r2=199744&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Tue Jan 21 08:17:26 2014 @@ -21,6 +21,9 @@ #include "llvm/IR/Argument.h" #include "llvm/IR/Intrinsics.h" +#include "llvm/Transforms/Utils/Cloning.h" +#include "llvm/Support/CallSite.h" + #include "llvm/DebugInfo.h" #include "llvm/DIBuilder.h" @@ -69,8 +72,8 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato uintPtrTy = vm->dataLayout()->getIntPtrType(module->getContext()); nullValue = llvm::ConstantPointerNull::get((llvm::PointerType*)vm->typeJ3ObjectPtr); -#define _x(name, id) \ - name = vm->introspectFunction(module, id); +#define _x(name, id, isLocal) \ + name = vm->introspectFunction(isLocal ? module : 0, id); #include "j3/j3meta.def" #undef _x @@ -608,14 +611,38 @@ void J3CodeGen::newObject(J3Class* cl) { llvm::Value* J3CodeGen::isAssignableTo(llvm::Value* obj, J3ObjectType* type) { llvm::Value* vtType = vt(type); /* force the resolution of type */ llvm::Value* vtObj = vt(obj); + llvm::CallInst* res; + +#if 0 + llvm::Function* pc = vm->introspectFunction(0, "j3::J3VirtualTable::fastIsAssignableToPrimaryChecker(j3::J3VirtualTable*, unsigned int)"); + llvm::Function* npc = vm->introspectFunction(0, "j3::J3VirtualTable::fastIsAssignableToNonPrimaryChecker(j3::J3VirtualTable*)"); +#endif if(type->vt()->isPrimaryChecker()) - return builder.CreateCall3(funcFastIsAssignableToPrimaryChecker, - vtObj, - vtType, - builder.getInt32(type->vt()->offset())); + res = builder.CreateCall3(funcFastIsAssignableToPrimaryChecker, + vtObj, + vtType, + builder.getInt32(type->vt()->offset())); else - return builder.CreateCall2(funcFastIsAssignableToNonPrimaryChecker, vtObj, vtType); + res = builder.CreateCall2(funcFastIsAssignableToNonPrimaryChecker, + vtObj, + vtType); + +#if 0 + llvmFunction->dump(); + fprintf(stderr, " *** \n"); + + llvm::InlineFunctionInfo ifi; + llvm::InlineFunction(res, ifi); + + llvmFunction->dump(); + fprintf(stderr, " ----- \n"); + //res->dump(); + + J3::internalError("implement me"); +#endif + + return res; } void J3CodeGen::instanceof(llvm::Value* obj, J3ObjectType* type) { 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=199744&r1=199743&r2=199744&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Tue Jan 21 08:17:26 2014 @@ -139,11 +139,11 @@ J3VirtualTable* J3VirtualTable::create(J super->resolve(); //printf("%s super is %ls (%d)\n", cl->name()->cStr(), super->name()->cStr(), isSecondary); - uint32_t n = baseClass->vt()->checker()->nbSecondaryTypes; + uint32_t n = baseClass->vt()->checker.nbSecondaryTypes; secondaries = (J3Type**)alloca(n*sizeof(J3Type*)); for(uint32_t i=0; ivt()->checker()->secondaryTypes[i]->type(); + secondaries[nbSecondaries] = baseClass->vt()->checker.secondaryTypes[i]->type(); if(secondaries[i] != baseClass) { /* don't add myself */ secondaries[nbSecondaries] = secondaries[nbSecondaries]->getArray(dim); nbSecondaries++; @@ -176,67 +176,67 @@ J3VirtualTable::J3VirtualTable(J3Type* t // printf("*** Building the vt of %s based on %ls at %p\n", type->name()->cStr(), super->name()->cStr(), this); if(super == type) { - checker()->offset = 0; - checker()->display[checker()->offset] = this; + checker.offset = 0; + checker.display[checker.offset] = this; if(nbInterfaces) J3::internalError("a root J3VirtualTable should not have interfaces"); } else { - uint32_t parentDisplayLength = super->vt()->checker()->offset + 1; + uint32_t parentDisplayLength = super->vt()->checker.offset + 1; - //printf("%s (%p) secondary: %p %p (%d)\n", type->name()->cStr(), this, checker()->secondaryTypes, checker()->display[6], parentDisplayLength); + //printf("%s (%p) secondary: %p %p (%d)\n", type->name()->cStr(), this, checker.secondaryTypes, checker.display[6], parentDisplayLength); if(parentDisplayLength >= J3TypeChecker::cacheOffset) isSecondary = 1; - memcpy(checker()->display, super->vt()->checker()->display, parentDisplayLength*sizeof(J3VirtualTable*)); + memcpy(checker.display, super->vt()->checker.display, parentDisplayLength*sizeof(J3VirtualTable*)); - checker()->nbSecondaryTypes = super->vt()->checker()->nbSecondaryTypes + nbInterfaces + isSecondary; - checker()->secondaryTypes = (J3VirtualTable**)super->loader()->allocator()->allocate(checker()->nbSecondaryTypes*sizeof(J3VirtualTable*)); + checker.nbSecondaryTypes = super->vt()->checker.nbSecondaryTypes + nbInterfaces + isSecondary; + checker.secondaryTypes = (J3VirtualTable**)super->loader()->allocator()->allocate(checker.nbSecondaryTypes*sizeof(J3VirtualTable*)); //printf("%s: %d - %d %d\n", type->name()->cStr(), isSecondary, parentDisplayLength, J3TypeChecker::displayLength); if(isSecondary) { - checker()->offset = J3TypeChecker::cacheOffset; - checker()->secondaryTypes[0] = this; + checker.offset = J3TypeChecker::cacheOffset; + checker.secondaryTypes[0] = this; } else { - checker()->offset = parentDisplayLength; - checker()->display[checker()->offset] = this; + checker.offset = parentDisplayLength; + checker.display[checker.offset] = this; } - memcpy(checker()->secondaryTypes + isSecondary, - super->vt()->checker()->secondaryTypes, - super->vt()->checker()->nbSecondaryTypes*sizeof(J3VirtualTable*)); + memcpy(checker.secondaryTypes + isSecondary, + super->vt()->checker.secondaryTypes, + super->vt()->checker.nbSecondaryTypes*sizeof(J3VirtualTable*)); - for(uint32_t i=0, n=isSecondary+super->vt()->checker()->nbSecondaryTypes; ivt()->checker.nbSecondaryTypes; iresolve(); - checker()->secondaryTypes[n++] = sec->vt(); + checker.secondaryTypes[n++] = sec->vt(); } } - if(checker()->nbSecondaryTypes) { - std::sort(checker()->secondaryTypes, &checker()->secondaryTypes[checker()->nbSecondaryTypes]); - J3VirtualTable** it = std::unique(checker()->secondaryTypes, &checker()->secondaryTypes[checker()->nbSecondaryTypes]); - checker()->nbSecondaryTypes = std::distance(checker()->secondaryTypes, it); + if(checker.nbSecondaryTypes) { + std::sort(checker.secondaryTypes, &checker.secondaryTypes[checker.nbSecondaryTypes]); + J3VirtualTable** it = std::unique(checker.secondaryTypes, &checker.secondaryTypes[checker.nbSecondaryTypes]); + checker.nbSecondaryTypes = std::distance(checker.secondaryTypes, it); } //dump(); } bool J3VirtualTable::slowIsAssignableTo(J3VirtualTable* parent) { - for(uint32_t i=0; inbSecondaryTypes; i++) - if(checker()->secondaryTypes[i] == parent) { - checker()->display[J3TypeChecker::cacheOffset] = parent; + for(uint32_t i=0; idisplay[parentOffset] == parent; + return checker.display[parentOffset] == parent; } bool J3VirtualTable::fastIsAssignableToNonPrimaryChecker(J3VirtualTable* parent) { - if(checker()->display[J3TypeChecker::cacheOffset] == parent) + if(checker.display[J3TypeChecker::cacheOffset] == parent) return true; else if(parent == this) return true; @@ -245,8 +245,8 @@ bool J3VirtualTable::fastIsAssignableToN } bool J3VirtualTable::isAssignableTo(J3VirtualTable* parent) { - uint32_t parentOffset = parent->checker()->offset; - if(checker()->display[parentOffset] == parent) + uint32_t parentOffset = parent->checker.offset; + if(checker.display[parentOffset] == parent) return true; else if(parentOffset != J3TypeChecker::cacheOffset) return false; @@ -260,7 +260,7 @@ void J3VirtualTable::dump() { fprintf(stderr, "VirtualTable: %s%s (%p)\n", type()->isLayout() && !type()->isClass() ? "static_" : "", type()->name()->cStr(), this); - checker()->dump(); + checker.dump(); } Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=199744&r1=199743&r2=199744&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Tue Jan 21 08:17:26 2014 @@ -90,14 +90,14 @@ llvm::Function* VMKit::introspectFunctio if(!orig) internalError("unable to find internal function: %s", name); - return (llvm::Function*)dest->getOrInsertFunction(orig->getName(), orig->getFunctionType()); + return dest ? (llvm::Function*)dest->getOrInsertFunction(orig->getName(), orig->getFunctionType()) : orig; } llvm::GlobalValue* VMKit::introspectGlobalValue(llvm::Module* dest, const char* name) { llvm::GlobalValue* orig = mangleMap[name]; if(!orig) internalError("unable to find internal global value: %s", name); - return (llvm::GlobalValue*)dest->getOrInsertGlobal(orig->getName(), orig->getType()); + return dest ? (llvm::GlobalValue*)dest->getOrInsertGlobal(orig->getName(), orig->getType()) : orig; } void VMKit::addSymbol(llvm::GlobalValue* gv) { @@ -110,6 +110,7 @@ void VMKit::addSymbol(llvm::GlobalValue* char* mangled = (char*)allocator()->allocate(length+1); strcpy(mangled, tmp); mangleMap[mangled] = gv; + gv->Materialize(); free(realname); } From gael.thomas at lip6.fr Tue Jan 21 06:29:22 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Tue, 21 Jan 2014 14:29:22 -0000 Subject: [vmkit-commits] [vmkit] r199745 - Inline isassignable to functions. Message-ID: <20140121142922.2DAE92A6C03B@llvm.org> Author: gthomas Date: Tue Jan 21 08:29:21 2014 New Revision: 199745 URL: http://llvm.org/viewvc/llvm-project?rev=199745&view=rev Log: Inline isassignable to functions. Modified: vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/include/j3/j3meta.def vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199745&r1=199744&r2=199745&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Tue Jan 21 08:29:21 2014 @@ -132,7 +132,8 @@ namespace j3 { void monitorEnter(llvm::Value* obj); void monitorExit(llvm::Value* obj); - llvm::Value* isAssignableTo(llvm::Value* obj, J3ObjectType* type); + llvm::CallInst* isAssignableTo(llvm::Value* obj, J3ObjectType* type); + void inlineCall(llvm::CallInst* call); void instanceof(llvm::Value* obj, J3ObjectType* type); void checkCast(llvm::Value* obj, J3ObjectType* type); Modified: vmkit/branches/mcjit/include/j3/j3meta.def URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=199745&r1=199744&r2=199745&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3meta.def (original) +++ vmkit/branches/mcjit/include/j3/j3meta.def Tue Jan 21 08:29:21 2014 @@ -17,8 +17,8 @@ _x(funcJ3ThreadRestore, "j3: _x(funcEchoDebugEnter, "j3::J3CodeGen::echoDebugEnter(unsigned int, char const*, ...)", 1) _x(funcEchoDebugExecute, "j3::J3CodeGen::echoDebugExecute(unsigned int, char const*, ...)", 1) _x(funcEchoElement, "j3::J3CodeGen::echoElement(unsigned int, unsigned int, unsigned long)", 1) -_x(funcFastIsAssignableToPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToPrimaryChecker(j3::J3VirtualTable*, unsigned int)", 1) -_x(funcFastIsAssignableToNonPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToNonPrimaryChecker(j3::J3VirtualTable*)", 1) +_x(funcFastIsAssignableToPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToPrimaryChecker(j3::J3VirtualTable*, unsigned int)", 0) +_x(funcFastIsAssignableToNonPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToNonPrimaryChecker(j3::J3VirtualTable*)", 0) _x(funcGXXPersonality, "__gxx_personality_v0", 1) _x(funcCXABeginCatch, "__cxa_begin_catch", 1) _x(funcCXAEndCatch, "__cxa_end_catch", 1) 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=199745&r1=199744&r2=199745&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Tue Jan 21 08:29:21 2014 @@ -608,41 +608,24 @@ void J3CodeGen::newObject(J3Class* cl) { stack.push(res); } -llvm::Value* J3CodeGen::isAssignableTo(llvm::Value* obj, J3ObjectType* type) { +llvm::CallInst* J3CodeGen::isAssignableTo(llvm::Value* obj, J3ObjectType* type) { llvm::Value* vtType = vt(type); /* force the resolution of type */ llvm::Value* vtObj = vt(obj); - llvm::CallInst* res; - -#if 0 - llvm::Function* pc = vm->introspectFunction(0, "j3::J3VirtualTable::fastIsAssignableToPrimaryChecker(j3::J3VirtualTable*, unsigned int)"); - llvm::Function* npc = vm->introspectFunction(0, "j3::J3VirtualTable::fastIsAssignableToNonPrimaryChecker(j3::J3VirtualTable*)"); -#endif if(type->vt()->isPrimaryChecker()) - res = builder.CreateCall3(funcFastIsAssignableToPrimaryChecker, - vtObj, - vtType, - builder.getInt32(type->vt()->offset())); + return builder.CreateCall3(funcFastIsAssignableToPrimaryChecker, + vtObj, + vtType, + builder.getInt32(type->vt()->offset())); else - res = builder.CreateCall2(funcFastIsAssignableToNonPrimaryChecker, - vtObj, - vtType); - -#if 0 - llvmFunction->dump(); - fprintf(stderr, " *** \n"); + return builder.CreateCall2(funcFastIsAssignableToNonPrimaryChecker, + vtObj, + vtType); +} +void J3CodeGen::inlineCall(llvm::CallInst* call) { llvm::InlineFunctionInfo ifi; - llvm::InlineFunction(res, ifi); - - llvmFunction->dump(); - fprintf(stderr, " ----- \n"); - //res->dump(); - - J3::internalError("implement me"); -#endif - - return res; + llvm::InlineFunction(call, ifi, 0); } void J3CodeGen::instanceof(llvm::Value* obj, J3ObjectType* type) { @@ -658,8 +641,10 @@ void J3CodeGen::instanceof(llvm::Value* stack.drop(1); builder.SetInsertPoint(test); - stack.push(builder.CreateZExt(isAssignableTo(obj, type), builder.getInt32Ty())); + llvm::CallInst* is = isAssignableTo(obj, type); + stack.push(builder.CreateZExt(is, builder.getInt32Ty())); builder.CreateBr(after); + inlineCall(is); } void J3CodeGen::checkCast(llvm::Value* obj, J3ObjectType* type) { @@ -678,9 +663,9 @@ void J3CodeGen::checkCast(llvm::Value* o builder.SetInsertPoint(test); - llvm::Value* res = isAssignableTo(obj, type); - - builder.CreateCondBr(res, succeed, bbCheckCastFailed); + llvm::CallInst* is = isAssignableTo(obj, type); + builder.CreateCondBr(is, succeed, bbCheckCastFailed); + inlineCall(is); } } Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc?rev=199745&r1=199744&r2=199745&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc Tue Jan 21 08:29:21 2014 @@ -56,10 +56,10 @@ void J3ExceptionNode::addEntry(J3CodeGen if(entry->catchType) { codeGen->stack.metaStack[0] = codeGen->vm->typeJ3ObjectPtr; codeGen->stack.topStack = 1; - codeGen->builder.CreateCondBr(codeGen->isAssignableTo(codeGen->stack.top(0), - codeGen->cl->classAt(entry->catchType)), - entry->bb, - curCheck); + llvm::CallInst* is = codeGen->isAssignableTo(codeGen->stack.top(0), + codeGen->cl->classAt(entry->catchType)); + codeGen->builder.CreateCondBr(is, entry->bb, curCheck); + codeGen->inlineCall(is); } else { codeGen->builder.CreateBr(entry->bb); curCheck = 0; From gael.thomas at lip6.fr Wed Jan 22 08:51:04 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Wed, 22 Jan 2014 16:51:04 -0000 Subject: [vmkit-commits] [vmkit] r199816 - Add an inlining pass in vmkit, which is able to inline functions from foreign modules. Message-ID: <20140122165105.817A92A6C03B@llvm.org> Author: gthomas Date: Wed Jan 22 10:51:04 2014 New Revision: 199816 URL: http://llvm.org/viewvc/llvm-project?rev=199816&view=rev Log: Add an inlining pass in vmkit, which is able to inline functions from foreign modules. As we can inline anything, we have to be sure that all the functions generated during the compilation of VMKit are externally visible. For that purpose, vmkit-prepare-code changes the linkonce_odr linkage into a weak_odr linkage and a linkonce into a weak linkage. Added: vmkit/branches/mcjit/include/vmkit/inliner.h vmkit/branches/mcjit/lib/vmkit-prepare-code/ (with props) vmkit/branches/mcjit/lib/vmkit-prepare-code/Makefile vmkit/branches/mcjit/lib/vmkit-prepare-code/adapt-linkage.cc vmkit/branches/mcjit/lib/vmkit/inliner.cc Modified: vmkit/branches/mcjit/Makefile vmkit/branches/mcjit/Makefile.rules vmkit/branches/mcjit/include/j3/j3codegen.h vmkit/branches/mcjit/include/j3/j3meta.def vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/include/j3/j3options.h vmkit/branches/mcjit/include/vmkit/compiler.h vmkit/branches/mcjit/include/vmkit/system.h vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc vmkit/branches/mcjit/lib/vmkit/compiler.cc vmkit/branches/mcjit/lib/vmkit/safpoint.cc vmkit/branches/mcjit/tools/vmkit-extract/Makefile Modified: vmkit/branches/mcjit/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/Makefile?rev=199816&r1=199815&r2=199816&view=diff ============================================================================== --- vmkit/branches/mcjit/Makefile (original) +++ vmkit/branches/mcjit/Makefile Wed Jan 22 10:51:04 2014 @@ -5,6 +5,6 @@ LEVEL := . -DIRS := tools/vmkit-extract lib tools/j3 # lib/mmtk/ +DIRS := lib/vmkit-prepare-code tools/vmkit-extract lib tools/j3 # lib/mmtk/ include $(LEVEL)/Makefile.rules Modified: vmkit/branches/mcjit/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/Makefile.rules?rev=199816&r1=199815&r2=199816&view=diff ============================================================================== --- vmkit/branches/mcjit/Makefile.rules (original) +++ vmkit/branches/mcjit/Makefile.rules Wed Jan 22 10:51:04 2014 @@ -72,20 +72,20 @@ RECURSIVE_TARGETS=all clean define do_parallel_subdirs $1-parallel-recursive:: #$(Echo) "Entering directory $$(PROF)/$2" - $(Verb) +$(MAKE) $(SUB_OPT) -C $2 $1 PROF=$(PROF)/$2; \ + $(Verb) +$(MAKE) $(SUB_OPT) -C $2 $1 PROF=$(PROF)/$2 VERBOSE=$(VERBOSE); \ if [ $$$$? != 0 ]; then echo "$$(EchoMsg) abort with errors in $$(PROF)/$2"; exit 1; fi endef define do_recursive_target $1: $(Verb) for f in $$(DIRS); do \ - $(MAKE) $(SUB_OPT) -C $$$$f $1 PROF=$(PROF)/$$$$f; \ + $(MAKE) $(SUB_OPT) -C $$$$f $1 PROF=$(PROF)/$$$$f VERBOSE=$(VERBOSE); \ if [ $$$$? != 0 ]; then echo "$$(EchoMsg) abort with errors in $$(PROF)/$$$$f"; exit 1; fi; \ done - $(Verb) +$(MAKE) -s $1-parallel-recursive + $(Verb) +$(MAKE) $(SUB_OPT) $1-parallel-recursive VERBOSE=$(VERBOSE) $1-parallel-recursive:: - $(Verb) +$(MAKE) -s $1-local + $(Verb) +$(MAKE) $(SUB_OPT) $1-local VERBOSE=$(VERBOSE) $1-local:: @@ -291,17 +291,11 @@ SO_FILES=$(OBJ_FILES) endif ############################################################################### -# GC Managment +# Prepare the code ############################################################################### -STATIC_GC_PASS_LIB=$(LIB_DIR)/static-gc-pass$(SHLIBEXT) -STATIC_GC_PRINTER_LIB=$(LIB_DIR)/static-gc-printer$(SHLIBEXT) - -NO_GC=1 -ifdef NO_GC -GC_OBJ_FILES=$(OBJ_FILES) -else -GC_OBJ_FILES=$(patsubst %.o,%-gc.o,$(OBJ_FILES)) -GC_LLCFLAGS:=-load=$(STATIC_GC_PRINTER_LIB) +ifndef NO_PREPARE_CODE +DO_PREPARE_CODE_LIB=$(LIB_DIR)/vmkit-prepare-code$(SHLIBEXT) +DO_PREPARE_CODE=-load=$(DO_PREPARE_CODE_LIB) -VMKitAdaptLinkage endif ############################################################################### @@ -311,29 +305,25 @@ DEPEND_OPTIONS=-MMD -MP -MF "$(BUILD_DIR DOM=then mv -f "$(BUILD_DIR)/$$*.d.tmp" "$(BUILD_DIR)/$$*.d"; else rm -f "$(BUILD_DIR)/$$*.d.tmp"; exit 1; fi $(SONAME)$(SHLIBEXT): $(SO_FILES) - $(Echo) "Linking shared library '$(notdir $@)'" - $(Verb) $(CLANGXX) -shared $(LLVM_LDFLAGS) $(SHFLAGS) -o $@ $(SHALL) $^ $(SHNOALL) $(SO_LIBS) + $(Echo) "Linking shared library '$(notdir $@)'" + $(Verb) $(CLANGXX) -shared $(LLVM_LDFLAGS) $(SHFLAGS) -o $@ $(SHALL) $^ $(SHNOALL) $(SO_LIBS) $(GEN_MODULE).bc: $(BC_FILES) $(Echo) "Linking bc module '$(notdir $@)'" $(Verb) $(LLLINK) $^ -o $@ -$(GEN_MODULE).a: $(GC_OBJ_FILES) +$(GEN_MODULE).a: $(OBJ_FILES) $(Echo) "Linking module '$(notdir $@)'" $(Verb) ar cru $@ $^ && ranlib $@ -%.o: %.bc +%.o: %.bc $(DO_PREPARE_CODE_LIB) $(Echo) "Assembling '$(notdir $<)'" - $(Verb) $(LLC) $(LLCFLAGS) $(GC_LLCFLAGS) -filetype=obj $< -o $@ + $(Verb) $(LLOPT) $(DO_PREPARE_CODE) $(OPTFLAGS) $< -o - | $(LLC) $(LLCFLAGS) -filetype=obj -o $@ $(BUILD_DIR)/%.o: %.s $(SELF) $(BUILD_DIR)/.dir $(Echo) "Assembling '$(notdir $<)'" $(Verb) if $(CLANGXX) $(CXXFLAGS) $(DEPEND_OPTIONS) -c "$<" -o $@; $(DOM) -%-gc.bc: %.bc - $(Echo) "Preparing GC '$(notdir $<)'" - $(Verb) $(LLOPT) -load=$(STATIC_GC_PASS_LIB) $(OPTFLAGS) -StaticGCPass $< -o $@ - define define_compile_rule $(BUILD_DIR)/%.bc: $4%$1 $(SELF) $(BUILD_DIR)/.dir $(Echo) "Compiling '$$(notdir $$<)'" Modified: vmkit/branches/mcjit/include/j3/j3codegen.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199816&r1=199815&r2=199816&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3codegen.h (original) +++ vmkit/branches/mcjit/include/j3/j3codegen.h Wed Jan 22 10:51:04 2014 @@ -198,7 +198,7 @@ namespace j3 { void genDebugOpcode(); void genDebugEnterLeave(bool isLeave); -#define _x(name, id, isLocal) \ +#define _x(name, id, forceInline) \ llvm::Function* name; #include "j3/j3meta.def" #undef _x Modified: vmkit/branches/mcjit/include/j3/j3meta.def URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=199816&r1=199815&r2=199816&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3meta.def (original) +++ vmkit/branches/mcjit/include/j3/j3meta.def Wed Jan 22 10:51:04 2014 @@ -1,25 +1,25 @@ -_x(funcJ3ObjectTypeResolve, "j3::J3Type::resolve()", 1) -_x(funcJ3ObjectTypeInitialise, "j3::J3Type::initialise()", 1) -_x(funcJ3TypeJavaClass, "j3::J3Type::javaClass(bool, j3::J3ObjectHandle*)", 1) +_x(funcJ3ObjectTypeResolve, "j3::J3Type::resolve()", 0) +_x(funcJ3ObjectTypeInitialise, "j3::J3Type::initialise()", 0) +_x(funcJ3TypeJavaClass, "j3::J3Type::javaClass(bool, j3::J3ObjectHandle*)", 0) _x(funcJniEnv, "j3::J3::jniEnv()", 1) -_x(funcJ3ArrayObjectMultianewArray, "j3::J3ArrayObject::multianewArray(j3::J3ArrayClass*, unsigned int, unsigned int*)", 1) -_x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)", 1) -_x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*)", 1) -_x(funcJ3ObjectMonitorExit, "j3::J3Object::monitorExit(j3::J3Object*)", 1) -_x(funcThrowException, "vmkit::VMKit::throwException(void*)", 1) -_x(funcReplayException, "j3::J3Thread::replayException()", 1) -_x(funcClassCastException, "j3::J3::classCastException()", 1) -_x(funcNullPointerException, "j3::J3::nullPointerException()", 1) +_x(funcJ3ArrayObjectMultianewArray, "j3::J3ArrayObject::multianewArray(j3::J3ArrayClass*, unsigned int, unsigned int*)", 0) +_x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)", 0) +_x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*)", 0) +_x(funcJ3ObjectMonitorExit, "j3::J3Object::monitorExit(j3::J3Object*)", 0) +_x(funcThrowException, "vmkit::VMKit::throwException(void*)", 0) +_x(funcReplayException, "j3::J3Thread::replayException()", 0) +_x(funcClassCastException, "j3::J3::classCastException()", 0) +_x(funcNullPointerException, "j3::J3::nullPointerException()", 0) _x(funcJ3ThreadPushHandle, "j3::J3Thread::push(j3::J3ObjectHandle*)", 1) _x(funcJ3ThreadPush, "j3::J3Thread::push(j3::J3Object*)", 1) _x(funcJ3ThreadTell, "j3::J3Thread::tell()", 1) _x(funcJ3ThreadRestore, "j3::J3Thread::restore(j3::J3ObjectHandle*)", 1) -_x(funcEchoDebugEnter, "j3::J3CodeGen::echoDebugEnter(unsigned int, char const*, ...)", 1) -_x(funcEchoDebugExecute, "j3::J3CodeGen::echoDebugExecute(unsigned int, char const*, ...)", 1) -_x(funcEchoElement, "j3::J3CodeGen::echoElement(unsigned int, unsigned int, unsigned long)", 1) -_x(funcFastIsAssignableToPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToPrimaryChecker(j3::J3VirtualTable*, unsigned int)", 0) +_x(funcEchoDebugEnter, "j3::J3CodeGen::echoDebugEnter(unsigned int, char const*, ...)", 0) +_x(funcEchoDebugExecute, "j3::J3CodeGen::echoDebugExecute(unsigned int, char const*, ...)", 0) +_x(funcEchoElement, "j3::J3CodeGen::echoElement(unsigned int, unsigned int, unsigned long)", 0) +_x(funcFastIsAssignableToPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToPrimaryChecker(j3::J3VirtualTable*, unsigned int)", 1) _x(funcFastIsAssignableToNonPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToNonPrimaryChecker(j3::J3VirtualTable*)", 0) -_x(funcGXXPersonality, "__gxx_personality_v0", 1) -_x(funcCXABeginCatch, "__cxa_begin_catch", 1) -_x(funcCXAEndCatch, "__cxa_end_catch", 1) -_x(funcFake, "j3::J3::forceSymbolDefinition()", 1) +_x(funcGXXPersonality, "__gxx_personality_v0", 0) +_x(funcCXABeginCatch, "__cxa_begin_catch", 0) +_x(funcCXAEndCatch, "__cxa_end_catch", 0) +_x(funcFake, "j3::J3::forceSymbolDefinition()", 0) Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=199816&r1=199815&r2=199816&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Wed Jan 22 10:51:04 2014 @@ -96,7 +96,8 @@ namespace j3 { void ensureCompiled(uint32_t mode); J3Signature::function_t cxxCaller(); void* fnPtr(); - llvm::Function* llvmFunction() { return _llvmFunction; } + llvm::Function* llvmFunction() { return _llvmFunction; } /* overwrite vmkit::Symbol */ + bool isInlinable(); void* functionPointerOrStaticTrampoline(); void* functionPointerOrVirtualTrampoline(); Modified: vmkit/branches/mcjit/include/j3/j3options.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3options.h?rev=199816&r1=199815&r2=199816&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3options.h (original) +++ vmkit/branches/mcjit/include/j3/j3options.h Wed Jan 22 10:51:04 2014 @@ -53,6 +53,7 @@ namespace j3 { bool isAOT; const char* aotFile; + bool enableInlining; J3Options(); Modified: vmkit/branches/mcjit/include/vmkit/compiler.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/compiler.h?rev=199816&r1=199815&r2=199816&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/compiler.h (original) +++ vmkit/branches/mcjit/include/vmkit/compiler.h Wed Jan 22 10:51:04 2014 @@ -10,6 +10,7 @@ namespace llvm { class Module; class ExecutionEngine; class GlobalValue; + class Function; namespace legacy { class PassManager; @@ -23,15 +24,20 @@ namespace vmkit { class Symbol : public PermanentObject { public: - virtual void* getSymbolAddress(); + virtual void* getSymbolAddress(); + virtual llvm::Function* llvmFunction() { return 0; } + virtual bool isInlinable() { return 0; } }; class NativeSymbol : public Symbol { - void* addr; + llvm::Function* original; + void* addr; public: - NativeSymbol(void* _addr) { addr = _addr; } + NativeSymbol(llvm::Function* _original, void* _addr) { original = _original; addr = _addr; } - void* getSymbolAddress() { return addr; } + llvm::Function* llvmFunction() { return original; } + void* getSymbolAddress() { return addr; } + virtual bool isInlinable() { return 1; } }; class CompilationUnit : public llvm::SectionMemoryManager { @@ -55,7 +61,7 @@ namespace vmkit { static void destroy(CompilationUnit* unit); void addSymbol(const char* id, vmkit::Symbol* symbol); - Symbol* getSymbol(const char* id); + Symbol* getSymbol(const char* id, bool error=1); uint64_t getSymbolAddress(const std::string &Name); BumpAllocator* allocator() { return _allocator; } Added: vmkit/branches/mcjit/include/vmkit/inliner.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/inliner.h?rev=199816&view=auto ============================================================================== --- vmkit/branches/mcjit/include/vmkit/inliner.h (added) +++ vmkit/branches/mcjit/include/vmkit/inliner.h Wed Jan 22 10:51:04 2014 @@ -0,0 +1,12 @@ +#ifndef _INLINER_H_ +#define _INLINER_H_ + +#include "llvm/Pass.h" + +namespace vmkit { + class CompilationUnit; + + llvm::FunctionPass* createFunctionInlinerPass(CompilationUnit* compiler); +} + +#endif Modified: vmkit/branches/mcjit/include/vmkit/system.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/system.h?rev=199816&r1=199815&r2=199816&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/system.h (original) +++ vmkit/branches/mcjit/include/vmkit/system.h Wed Jan 22 10:51:04 2014 @@ -24,11 +24,11 @@ namespace vmkit { class System { public: - static const char* mcjitSymbol(const std::string &Name) { + static const char* mcjitSymbol(const char* name) { #if defined(MACOS_OS) - return Name.c_str() + 1; + return name + 1; #elif defined(LINUX_OS) - return Name.c_str(); + return name; #else #error "what is the correct symbol for your os?" #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=199816&r1=199815&r2=199816&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Wed Jan 22 10:51:04 2014 @@ -90,13 +90,19 @@ void J3::start(int argc, char** argv) { } void J3::run() { -#define defJavaConstantName(name, id) \ +#define defJavaConstantName(name, id) \ name = names()->get(id); onJavaConstantNames(defJavaConstantName) #undef defJavaConstantName introspect(); +#define _x(name, id, forceInline) \ + if(forceInline) \ + introspectFunction(0, id)->addFnAttr(llvm::Attribute::AlwaysInline); +#include "j3/j3meta.def" +#undef _x + vmkit::BumpAllocator* loaderAllocator = vmkit::BumpAllocator::create(); initialClassLoader = new(loaderAllocator) J3InitialClassLoader(loaderAllocator); 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=199816&r1=199815&r2=199816&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Wed Jan 22 10:51:04 2014 @@ -5,6 +5,7 @@ #include "llvm/ExecutionEngine/ExecutionEngine.h" #include "vmkit/allocator.h" +#include "vmkit/system.h" #include "j3/j3classloader.h" #include "j3/j3.h" @@ -38,6 +39,16 @@ J3ClassLoader::J3ClassLoader(J3ObjectHan pthread_mutex_init(&_mutexNativeLibraries, 0); _javaClassLoader = globalReferences()->add(javaClassLoader); + + J3* vm = J3Thread::get()->vm(); +#define _x(name, id, forceInline) \ + { \ + llvm::Function* function = vm->introspectFunction(0, id); \ + void* addr = dlsym(SELF_HANDLE, function->getName().data()); \ + addSymbol(function->getName().data(), new(allocator) vmkit::NativeSymbol(function, addr)); \ + } +#include "j3/j3meta.def" +#undef _x } J3StringSymbol* J3ClassLoader::newStringSymbol(J3ObjectHandle* 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=199816&r1=199815&r2=199816&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Wed Jan 22 10:51:04 2014 @@ -72,8 +72,8 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato uintPtrTy = vm->dataLayout()->getIntPtrType(module->getContext()); nullValue = llvm::ConstantPointerNull::get((llvm::PointerType*)vm->typeJ3ObjectPtr); -#define _x(name, id, isLocal) \ - name = vm->introspectFunction(isLocal ? module : 0, id); +#define _x(name, id, forceInline) \ + name = vm->introspectFunction(forceInline ? 0 : module, id); #include "j3/j3meta.def" #undef _x @@ -609,7 +609,7 @@ void J3CodeGen::newObject(J3Class* cl) { } llvm::CallInst* J3CodeGen::isAssignableTo(llvm::Value* obj, J3ObjectType* type) { - llvm::Value* vtType = vt(type); /* force the resolution of type */ + llvm::Value* vtType = vt(type); /* force the type resolution */ llvm::Value* vtObj = vt(obj); if(type->vt()->isPrimaryChecker()) @@ -624,8 +624,8 @@ llvm::CallInst* J3CodeGen::isAssignableT } void J3CodeGen::inlineCall(llvm::CallInst* call) { - llvm::InlineFunctionInfo ifi; - llvm::InlineFunction(call, ifi, 0); + //llvm::InlineFunctionInfo ifi; + //llvm::InlineFunction(call, ifi, 0); } void J3CodeGen::instanceof(llvm::Value* obj, J3ObjectType* type) { @@ -1820,7 +1820,7 @@ llvm::Function* J3CodeGen::lookupNative( buf, module); - loader->addSymbol(buf, new(loader->allocator()) vmkit::NativeSymbol(fnPtr)); + loader->addSymbol(buf, new(loader->allocator()) vmkit::NativeSymbol(0, fnPtr)); return res; } 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=199816&r1=199815&r2=199816&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Wed Jan 22 10:51:04 2014 @@ -31,6 +31,10 @@ J3Method::J3Method(uint16_t access, J3Cl _index = -1; } +bool J3Method::isInlinable() { + return J3Thread::get()->vm()->options()->enableInlining; +} + uint32_t J3Method::interfaceIndex() { return cl()->loader()->interfaceIndex(this); } 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=199816&r1=199815&r2=199816&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Wed Jan 22 10:51:04 2014 @@ -29,6 +29,7 @@ J3Options::J3Options() { stackSize = 0x80*0x1000; isAOT = 0; + enableInlining = 1; } #define nyi(cmd) ({ fprintf(stderr, "option '%s' not yet implemented\n", cmd); }) @@ -77,6 +78,7 @@ void J3CmdLineParser::process() { else if(opteq("-Xaot")) { options->isAOT = 1; options->aotFile = argv[++cur]; + options->enableInlining = 0; } else if(opteq("-Xno-aot")) options->isAOT = 0; else if(optbeg("-X")) Propchange: vmkit/branches/mcjit/lib/vmkit-prepare-code/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Wed Jan 22 10:51:04 2014 @@ -0,0 +1 @@ +Debug+Asserts Added: vmkit/branches/mcjit/lib/vmkit-prepare-code/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit-prepare-code/Makefile?rev=199816&view=auto ============================================================================== --- vmkit/branches/mcjit/lib/vmkit-prepare-code/Makefile (added) +++ vmkit/branches/mcjit/lib/vmkit-prepare-code/Makefile Wed Jan 22 10:51:04 2014 @@ -0,0 +1,16 @@ +##===- lib/vmkit/StaticGCPass/Makefile -----------------------*- Makefile -*-===## +# +# The VMKit project +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LEVEL = ../.. + +NO_PREPARE_CODE=1 +LIBRARY=vmkit-prepare-code + +include $(LEVEL)/Makefile.rules + Added: vmkit/branches/mcjit/lib/vmkit-prepare-code/adapt-linkage.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit-prepare-code/adapt-linkage.cc?rev=199816&view=auto ============================================================================== --- vmkit/branches/mcjit/lib/vmkit-prepare-code/adapt-linkage.cc (added) +++ vmkit/branches/mcjit/lib/vmkit-prepare-code/adapt-linkage.cc Wed Jan 22 10:51:04 2014 @@ -0,0 +1,42 @@ +//===---- StaticGCPass.cpp - Put GC information in functions compiled --------// +//===----------------------- with llvm-gcc --------------------------------===// +// +// The VMKit project +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + +#include "llvm/IR/Intrinsics.h" +#include "llvm/IR/Module.h" +#include "llvm/Pass.h" +#include "llvm/Support/raw_ostream.h" + +#include + +namespace vmkit { + class VMKitAdaptLinkage : public llvm::FunctionPass { + public: + static char ID; + + VMKitAdaptLinkage() : llvm::FunctionPass(ID) {} + + virtual bool runOnFunction(llvm::Function& function) { + llvm::Function::LinkageTypes linkage = function.getLinkage(); + + if(linkage == llvm::GlobalValue::LinkOnceODRLinkage) + function.setLinkage(llvm::GlobalValue::WeakODRLinkage); + if(linkage == llvm::GlobalValue::LinkOnceAnyLinkage) + function.setLinkage(llvm::GlobalValue::WeakAnyLinkage); + //if(linkage + //fprintf(stderr, "run on function: %s\n", function.getName().data()); + return 0; + } + }; + + char VMKitAdaptLinkage::ID = 0; + llvm::RegisterPass X("VMKitAdaptLinkage", + "Adapt the linkage for vmkit"); +} Modified: vmkit/branches/mcjit/lib/vmkit/compiler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/compiler.cc?rev=199816&r1=199815&r2=199816&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/compiler.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/compiler.cc Wed Jan 22 10:51:04 2014 @@ -5,6 +5,7 @@ #include "vmkit/thread.h" #include "vmkit/vmkit.h" #include "vmkit/safepoint.h" +#include "vmkit/inliner.h" #include "llvm/LinkAllPasses.h" #include "llvm/PassManager.h" @@ -62,7 +63,8 @@ CompilationUnit::CompilationUnit(BumpAll #if 0 pm->add(llvm::createBasicAliasAnalysisPass()); #endif - + + pm->add(vmkit::createFunctionInlinerPass(this)); pm->add(llvm::createCFGSimplificationPass()); // Clean up disgusting code #if 0 @@ -114,21 +116,25 @@ void CompilationUnit::addSymbol(const ch pthread_mutex_unlock(&_mutexSymbolTable); } -Symbol* CompilationUnit::getSymbol(const char* id) { +Symbol* CompilationUnit::getSymbol(const char* id, bool error) { pthread_mutex_lock(&_mutexSymbolTable); std::map::iterator it = _symbolTable.find(id); - vmkit::Symbol* res; + vmkit::Symbol* res = 0; if(it == _symbolTable.end()) { uint8_t* addr = (uint8_t*)dlsym(SELF_HANDLE, id); - if(!addr) - Thread::get()->vm()->internalError("unable to resolve native symbol: %s", id); - res = new(allocator()) vmkit::NativeSymbol(addr); - size_t len = strlen(id); - char* buf = (char*)allocator()->allocate(len+1); - memcpy(buf, id, len+1); - _symbolTable[buf] = res; + //fprintf(stderr, "lookup: %s => %p\n", id, addr); + if(!addr) { + if(error) + Thread::get()->vm()->internalError("unable to resolve native symbol: %s", id); + } else { + res = new(allocator()) vmkit::NativeSymbol(0, addr); + size_t len = strlen(id); + char* buf = (char*)allocator()->allocate(len+1); + memcpy(buf, id, len+1); + _symbolTable[buf] = res; + } } else res = it->second; @@ -137,7 +143,7 @@ Symbol* CompilationUnit::getSymbol(const } uint64_t CompilationUnit::getSymbolAddress(const std::string &Name) { - return (uint64_t)(uintptr_t)getSymbol(System::mcjitSymbol(Name))->getSymbolAddress(); + return (uint64_t)(uintptr_t)getSymbol(System::mcjitSymbol(Name.c_str()))->getSymbolAddress(); } void CompilationUnit::compileModule(llvm::Module* module) { Added: vmkit/branches/mcjit/lib/vmkit/inliner.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/inliner.cc?rev=199816&view=auto ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/inliner.cc (added) +++ vmkit/branches/mcjit/lib/vmkit/inliner.cc Wed Jan 22 10:51:04 2014 @@ -0,0 +1,105 @@ +#include "llvm/IR/Function.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/Module.h" +#include "llvm/Pass.h" +#include "llvm/Support/CallSite.h" +//#include "llvm/Target/TargetData.h" +#include "llvm/Analysis/InlineCost.h" +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/Transforms/Utils/Cloning.h" + +#include "vmkit/compiler.h" + +namespace vmkit { + class FunctionInliner : public llvm::FunctionPass { + public: + static char ID; + + CompilationUnit* compiler; + llvm::InlineCostAnalysis costAnalysis; + unsigned int inlineThreshold; + + //FunctionInliner() : FunctionPass(ID) {} + FunctionInliner(CompilationUnit* _compiler, unsigned int _inlineThreshold=225) : FunctionPass(ID) { + compiler = _compiler; + inlineThreshold = _inlineThreshold; + } + + virtual const char* getPassName() const { + return "Simple inliner"; + } + + llvm::InlineCost getInlineCost(llvm::CallSite callSite, llvm::Function* callee) { + return costAnalysis.getInlineCost(callSite, inlineThreshold); + } + + virtual bool runOnFunction(llvm::Function &function); + private: + }; + + char FunctionInliner::ID = 0; + +#if 0 + llvm::RegisterPass X("FunctionInliner", + "Inlining Pass that inlines evaluator's functions."); +#endif + + bool FunctionInliner::runOnFunction(llvm::Function& function) { + bool Changed = false; + + for (llvm::Function::iterator bit=function.begin(); bit!=function.end(); bit++) { + llvm::BasicBlock* bb = bit; + + for(llvm::BasicBlock::iterator it=bb->begin(); it!=bb->end();) { + llvm::Instruction *insn = it++; + + if (insn->getOpcode() != llvm::Instruction::Call && + insn->getOpcode() != llvm::Instruction::Invoke) { + continue; + } + + llvm::CallSite call(insn); + llvm::Function* original = call.getCalledFunction(); + llvm::Function* callee = original; + + if(!callee) + continue; + + if(callee->isDeclaration()) { /* ok, resolve */ + Symbol* s = compiler->getSymbol(callee->getName().data(), 0); + + if(s && s->isInlinable()) + callee = s->llvmFunction(); + } + + if(callee && !callee->isDeclaration()) { + llvm::InlineCost cost = getInlineCost(call, callee); + if(cost.isAlways()) {// || (!cost.isNever() && (cost))) { + //fprintf(stderr, "---- Inlining: %s\n", callee->getName().data()); + + llvm::InlineFunctionInfo ifi(0); + bool isInlined = llvm::InlineFunction(call, ifi, false); + Changed |= isInlined; + + if(isInlined){ + it = bb->begin(); + continue; + } + } + } + + if(original->getParent() != function.getParent()) { + callee = (llvm::Function*)function.getParent()->getOrInsertFunction(original->getName(), original->getFunctionType()); + original->replaceAllUsesWith(callee); + Changed = 1; + } + } + } + + return Changed; + } + + llvm::FunctionPass* createFunctionInlinerPass(CompilationUnit* compiler) { + return new FunctionInliner(compiler); + } +} Modified: vmkit/branches/mcjit/lib/vmkit/safpoint.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/safpoint.cc?rev=199816&r1=199815&r2=199816&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/safpoint.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/safpoint.cc Wed Jan 22 10:51:04 2014 @@ -189,7 +189,7 @@ Safepoint* Safepoint::get(CompilationUni symName += '_'; symName += module->getModuleIdentifier(); symName += "__frametable"; - return (vmkit::Safepoint*)unit->ee()->getGlobalValueAddress(System::mcjitSymbol(symName)); + return (vmkit::Safepoint*)unit->ee()->getGlobalValueAddress(System::mcjitSymbol(symName.c_str())); } void Safepoint::dump() { Modified: vmkit/branches/mcjit/tools/vmkit-extract/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/tools/vmkit-extract/Makefile?rev=199816&r1=199815&r2=199816&view=diff ============================================================================== --- vmkit/branches/mcjit/tools/vmkit-extract/Makefile (original) +++ vmkit/branches/mcjit/tools/vmkit-extract/Makefile Wed Jan 22 10:51:04 2014 @@ -5,6 +5,7 @@ LEVEL := ../.. +NO_PREPARE_CODE=1 LIBS := TOOL := vmkit-extract From gael.thomas at lip6.fr Wed Jan 22 15:05:39 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Wed, 22 Jan 2014 23:05:39 -0000 Subject: [vmkit-commits] [vmkit] r199849 - Better inlining. However, I have two problems with this inliner: Message-ID: <20140122230539.BD7972A6C03B@llvm.org> Author: gthomas Date: Wed Jan 22 17:05:38 2014 New Revision: 199849 URL: http://llvm.org/viewvc/llvm-project?rev=199849&view=rev Log: Better inlining. However, I have two problems with this inliner: - the inline cost analyzer provided by llvm has to analyze the whole call graph. Inadequate for a JIT. - strings (char*) defined in C are not visible with dlsym. So I can not inline functions that manipulate strings (or other symbols that are not externally visible). Modified: vmkit/branches/mcjit/include/j3/j3meta.def vmkit/branches/mcjit/include/vmkit/compiler.h vmkit/branches/mcjit/include/vmkit/inliner.h vmkit/branches/mcjit/lib/j3/vm/j3.cc vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc vmkit/branches/mcjit/lib/j3/vm/j3options.cc vmkit/branches/mcjit/lib/vmkit/compiler.cc vmkit/branches/mcjit/lib/vmkit/inliner.cc vmkit/branches/mcjit/tools/vmkit-extract/main.cc Modified: vmkit/branches/mcjit/include/j3/j3meta.def URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=199849&r1=199848&r2=199849&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3meta.def (original) +++ vmkit/branches/mcjit/include/j3/j3meta.def Wed Jan 22 17:05:38 2014 @@ -1,7 +1,7 @@ _x(funcJ3ObjectTypeResolve, "j3::J3Type::resolve()", 0) _x(funcJ3ObjectTypeInitialise, "j3::J3Type::initialise()", 0) _x(funcJ3TypeJavaClass, "j3::J3Type::javaClass(bool, j3::J3ObjectHandle*)", 0) -_x(funcJniEnv, "j3::J3::jniEnv()", 1) +_x(funcJniEnv, "j3::J3::jniEnv()", 0) _x(funcJ3ArrayObjectMultianewArray, "j3::J3ArrayObject::multianewArray(j3::J3ArrayClass*, unsigned int, unsigned int*)", 0) _x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)", 0) _x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*)", 0) @@ -10,10 +10,10 @@ _x(funcThrowException, "vmk _x(funcReplayException, "j3::J3Thread::replayException()", 0) _x(funcClassCastException, "j3::J3::classCastException()", 0) _x(funcNullPointerException, "j3::J3::nullPointerException()", 0) -_x(funcJ3ThreadPushHandle, "j3::J3Thread::push(j3::J3ObjectHandle*)", 1) -_x(funcJ3ThreadPush, "j3::J3Thread::push(j3::J3Object*)", 1) -_x(funcJ3ThreadTell, "j3::J3Thread::tell()", 1) -_x(funcJ3ThreadRestore, "j3::J3Thread::restore(j3::J3ObjectHandle*)", 1) +_x(funcJ3ThreadPushHandle, "j3::J3Thread::push(j3::J3ObjectHandle*)", 0) +_x(funcJ3ThreadPush, "j3::J3Thread::push(j3::J3Object*)", 0) +_x(funcJ3ThreadTell, "j3::J3Thread::tell()", 0) +_x(funcJ3ThreadRestore, "j3::J3Thread::restore(j3::J3ObjectHandle*)", 0) _x(funcEchoDebugEnter, "j3::J3CodeGen::echoDebugEnter(unsigned int, char const*, ...)", 0) _x(funcEchoDebugExecute, "j3::J3CodeGen::echoDebugExecute(unsigned int, char const*, ...)", 0) _x(funcEchoElement, "j3::J3CodeGen::echoElement(unsigned int, unsigned int, unsigned long)", 0) @@ -23,3 +23,8 @@ _x(funcGXXPersonality, "__g _x(funcCXABeginCatch, "__cxa_begin_catch", 0) _x(funcCXAEndCatch, "__cxa_end_catch", 0) _x(funcFake, "j3::J3::forceSymbolDefinition()", 0) + +_x(funcJ3ThreadGet, "j3::J3Thread::get()", 0) +_x(funcVMKitThreadGet, "vmkit::Thread::get()", 0) +_x(funcVMKitThreadGetP, "vmkit::Thread::get(void*)", 0) +_x(funcJ3ThreadJniEnv, "j3::J3Thread::jniEnv()", 0) Modified: vmkit/branches/mcjit/include/vmkit/compiler.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/compiler.h?rev=199849&r1=199848&r2=199849&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/compiler.h (original) +++ vmkit/branches/mcjit/include/vmkit/compiler.h Wed Jan 22 17:05:38 2014 @@ -55,7 +55,7 @@ namespace vmkit { public: void* operator new(size_t n, BumpAllocator* allocator); - CompilationUnit(BumpAllocator* allocator, const char* id); + CompilationUnit(BumpAllocator* allocator, const char* id, bool runInlinePass, bool onlyAlwaysInline); ~CompilationUnit(); static void destroy(CompilationUnit* unit); Modified: vmkit/branches/mcjit/include/vmkit/inliner.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/inliner.h?rev=199849&r1=199848&r2=199849&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/inliner.h (original) +++ vmkit/branches/mcjit/include/vmkit/inliner.h Wed Jan 22 17:05:38 2014 @@ -6,7 +6,7 @@ namespace vmkit { class CompilationUnit; - llvm::FunctionPass* createFunctionInlinerPass(CompilationUnit* compiler); + llvm::FunctionPass* createFunctionInlinerPass(CompilationUnit* compiler, bool onlyAlwaysInline); } #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=199849&r1=199848&r2=199849&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Wed Jan 22 17:05:38 2014 @@ -97,11 +97,13 @@ void J3::run() { introspect(); + if(options()->isAOT) { #define _x(name, id, forceInline) \ - if(forceInline) \ - introspectFunction(0, id)->addFnAttr(llvm::Attribute::AlwaysInline); + if(forceInline) \ + introspectFunction(0, id)->addFnAttr(llvm::Attribute::AlwaysInline); #include "j3/j3meta.def" #undef _x + } vmkit::BumpAllocator* loaderAllocator = vmkit::BumpAllocator::create(); initialClassLoader = new(loaderAllocator) J3InitialClassLoader(loaderAllocator); 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=199849&r1=199848&r2=199849&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Wed Jan 22 17:05:38 2014 @@ -23,7 +23,7 @@ using namespace j3; J3ClassLoader::J3InterfaceMethodLess J3ClassLoader::j3InterfaceMethodLess; J3ClassLoader::J3ClassLoader(J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator) - : CompilationUnit(allocator, "class-loader"), + : CompilationUnit(allocator, "class-loader", J3Thread::get()->vm()->options()->enableInlining, J3Thread::get()->vm()->options()->isAOT), _globalReferences(allocator), _staticObjectHandles(allocator), _staticObjects(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=199849&r1=199848&r2=199849&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Wed Jan 22 17:05:38 2014 @@ -72,8 +72,8 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato uintPtrTy = vm->dataLayout()->getIntPtrType(module->getContext()); nullValue = llvm::ConstantPointerNull::get((llvm::PointerType*)vm->typeJ3ObjectPtr); -#define _x(name, id, forceInline) \ - name = vm->introspectFunction(forceInline ? 0 : module, id); +#define _x(name, id, forceInline) \ + name = vm->introspectFunction(module, id); #include "j3/j3meta.def" #undef _x 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=199849&r1=199848&r2=199849&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Wed Jan 22 17:05:38 2014 @@ -78,7 +78,6 @@ void J3CmdLineParser::process() { else if(opteq("-Xaot")) { options->isAOT = 1; options->aotFile = argv[++cur]; - options->enableInlining = 0; } else if(opteq("-Xno-aot")) options->isAOT = 0; else if(optbeg("-X")) @@ -123,6 +122,9 @@ void J3CmdLineParser::process() { options->args = argv + cur; options->nbArgs = argc - cur; + + if(options->isAOT) + options->enableInlining = 1; } void J3CmdLineParser::help() { Modified: vmkit/branches/mcjit/lib/vmkit/compiler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/compiler.cc?rev=199849&r1=199848&r2=199849&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/compiler.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/compiler.cc Wed Jan 22 17:05:38 2014 @@ -34,7 +34,7 @@ void* CompilationUnit::operator new(size void CompilationUnit::operator delete(void* self) { } -CompilationUnit::CompilationUnit(BumpAllocator* allocator, const char* id) : +CompilationUnit::CompilationUnit(BumpAllocator* allocator, const char* id, bool runInlinePass, bool onlyAlwaysInline) : _symbolTable(vmkit::Util::char_less, allocator) { _allocator = allocator; pthread_mutex_init(&_mutexSymbolTable, 0); @@ -64,7 +64,8 @@ CompilationUnit::CompilationUnit(BumpAll pm->add(llvm::createBasicAliasAnalysisPass()); #endif - pm->add(vmkit::createFunctionInlinerPass(this)); + if(runInlinePass || onlyAlwaysInline) + pm->add(vmkit::createFunctionInlinerPass(this, onlyAlwaysInline)); pm->add(llvm::createCFGSimplificationPass()); // Clean up disgusting code #if 0 @@ -139,6 +140,7 @@ Symbol* CompilationUnit::getSymbol(const res = it->second; pthread_mutex_unlock(&_mutexSymbolTable); + return res; } Modified: vmkit/branches/mcjit/lib/vmkit/inliner.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/inliner.cc?rev=199849&r1=199848&r2=199849&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/inliner.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/inliner.cc Wed Jan 22 17:05:38 2014 @@ -3,7 +3,6 @@ #include "llvm/IR/Module.h" #include "llvm/Pass.h" #include "llvm/Support/CallSite.h" -//#include "llvm/Target/TargetData.h" #include "llvm/Analysis/InlineCost.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/Transforms/Utils/Cloning.h" @@ -15,14 +14,17 @@ namespace vmkit { public: static char ID; - CompilationUnit* compiler; - llvm::InlineCostAnalysis costAnalysis; - unsigned int inlineThreshold; + CompilationUnit* compiler; + llvm::InlineCostAnalysis costAnalysis; + unsigned int inlineThreshold; // 225 in llvm + bool onlyAlwaysInline; //FunctionInliner() : FunctionPass(ID) {} - FunctionInliner(CompilationUnit* _compiler, unsigned int _inlineThreshold=225) : FunctionPass(ID) { + FunctionInliner(CompilationUnit* _compiler, unsigned int _inlineThreshold, bool _onlyAlwaysInline) : + FunctionPass(ID) { compiler = _compiler; inlineThreshold = _inlineThreshold; + onlyAlwaysInline = _onlyAlwaysInline; } virtual const char* getPassName() const { @@ -45,13 +47,20 @@ namespace vmkit { #endif bool FunctionInliner::runOnFunction(llvm::Function& function) { - bool Changed = false; + bool Changed = false; + //fprintf(stderr, "Analyzing: %s\n", function.getName().data()); + + restart: for (llvm::Function::iterator bit=function.begin(); bit!=function.end(); bit++) { llvm::BasicBlock* bb = bit; + uint32_t prof = 0; + + for(llvm::BasicBlock::iterator it=bb->begin(), prev=0; it!=bb->end() && prof<42; prev=it++) { + llvm::Instruction *insn = it; - for(llvm::BasicBlock::iterator it=bb->begin(); it!=bb->end();) { - llvm::Instruction *insn = it++; + //fprintf(stderr, " process: "); + //insn->dump(); if (insn->getOpcode() != llvm::Instruction::Call && insn->getOpcode() != llvm::Instruction::Invoke) { @@ -59,47 +68,75 @@ namespace vmkit { } llvm::CallSite call(insn); - llvm::Function* original = call.getCalledFunction(); - llvm::Function* callee = original; + llvm::Function* callee = call.getCalledFunction(); if(!callee) continue; + llvm::Function* bc = callee; + if(callee->isDeclaration()) { /* ok, resolve */ - Symbol* s = compiler->getSymbol(callee->getName().data(), 0); + if(callee->isMaterializable()) + callee->Materialize(); + + if(callee->isDeclaration()) { + Symbol* s = compiler->getSymbol(bc->getName().data(), 0); - if(s && s->isInlinable()) - callee = s->llvmFunction(); + if(s && s->isInlinable()) + bc = s->llvmFunction(); + } } - if(callee && !callee->isDeclaration()) { - llvm::InlineCost cost = getInlineCost(call, callee); - if(cost.isAlways()) {// || (!cost.isNever() && (cost))) { - //fprintf(stderr, "---- Inlining: %s\n", callee->getName().data()); + /* getInlineCost does not like inter-module references */ + if(callee->getParent() != function.getParent()) { + llvm::Function* local = (llvm::Function*)function.getParent()->getOrInsertFunction(callee->getName(), + callee->getFunctionType()); + callee->replaceAllUsesWith(local); + callee = local; + Changed = 1; + } + if(bc && !bc->isDeclaration()) { + //fprintf(stderr, " processing %s\n", bc->getName().data()); + //function.dump(); + //fprintf(stderr, " %p and %p\n", function.getParent(), callee->getParent()); + //callee->dump(); + + llvm::InlineCost cost = getInlineCost(call, bc); + + //fprintf(stderr, " Inlining: %s ", bc->getName().data()); + //if(cost.isAlways()) + //fprintf(stderr, " is always\n"); + //else if(cost.isNever()) + //fprintf(stderr, " is never\n"); + //else + //fprintf(stderr, " cost: %d (=> %s)\n", cost.getCost(), !cost ? "false" : "true"); + + if(cost.isAlways()) {// || (!onlyAlwaysInline && !cost.isNever() && cost)) { + if(bc != callee) + callee->replaceAllUsesWith(bc); + llvm::InlineFunctionInfo ifi(0); bool isInlined = llvm::InlineFunction(call, ifi, false); Changed |= isInlined; - if(isInlined){ - it = bb->begin(); - continue; + if(isInlined) { + // prof++; + // it = prev ? prev : bb->begin(); + // continue; + goto restart; } } } - - if(original->getParent() != function.getParent()) { - callee = (llvm::Function*)function.getParent()->getOrInsertFunction(original->getName(), original->getFunctionType()); - original->replaceAllUsesWith(callee); - Changed = 1; - } } } + //function.dump(); + return Changed; } - llvm::FunctionPass* createFunctionInlinerPass(CompilationUnit* compiler) { - return new FunctionInliner(compiler); + llvm::FunctionPass* createFunctionInlinerPass(CompilationUnit* compiler, bool onlyAlwaysInline) { + return new FunctionInliner(compiler, 2, onlyAlwaysInline); } } Modified: vmkit/branches/mcjit/tools/vmkit-extract/main.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/tools/vmkit-extract/main.cc?rev=199849&r1=199848&r2=199849&view=diff ============================================================================== --- vmkit/branches/mcjit/tools/vmkit-extract/main.cc (original) +++ vmkit/branches/mcjit/tools/vmkit-extract/main.cc Wed Jan 22 17:05:38 2014 @@ -57,8 +57,16 @@ int main(int argc, char** argv) { char* buf; while(getline(&buf, &linecapp, fp) > 0) { - char* p = strchr(buf, '"') + 1; - char* e = strchr(p, '"'); + char* p = strchr(buf, '"'); + + if(!p) + continue; + + char* e = strchr(++p, '"'); + + if(!e) + continue; + *e = 0; llvm::GlobalValue* gv = mangler[p]; From gael.thomas at lip6.fr Sun Jan 26 05:12:24 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 26 Jan 2014 13:12:24 -0000 Subject: [vmkit-commits] [vmkit] r200151 - Rename external symbols and make them visible. Inlining don't work to inline Java code into Java code. Message-ID: <20140126131225.1414B2A6C03D@llvm.org> Author: gthomas Date: Sun Jan 26 07:12:24 2014 New Revision: 200151 URL: http://llvm.org/viewvc/llvm-project?rev=200151&view=rev Log: Rename external symbols and make them visible. Inlining don't work to inline Java code into Java code. Modified: vmkit/branches/mcjit/Makefile.rules vmkit/branches/mcjit/include/j3/j3.h vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/include/vmkit/compiler.h vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/j3/vm/j3object.cc vmkit/branches/mcjit/lib/vmkit-prepare-code/adapt-linkage.cc vmkit/branches/mcjit/lib/vmkit/compiler.cc vmkit/branches/mcjit/lib/vmkit/inliner.cc Modified: vmkit/branches/mcjit/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/Makefile.rules?rev=200151&r1=200150&r2=200151&view=diff ============================================================================== --- vmkit/branches/mcjit/Makefile.rules (original) +++ vmkit/branches/mcjit/Makefile.rules Sun Jan 26 07:12:24 2014 @@ -296,6 +296,12 @@ endif ifndef NO_PREPARE_CODE DO_PREPARE_CODE_LIB=$(LIB_DIR)/vmkit-prepare-code$(SHLIBEXT) DO_PREPARE_CODE=-load=$(DO_PREPARE_CODE_LIB) -VMKitAdaptLinkage +RAW=-raw + +%.bc: %$(RAW).bc $(DO_PREPARE_CODE_LIB) + $(Echo) "Prepare code for vmkit '$(notdir $@)'" + $(Verb) $(LLOPT) $(DO_PREPARE_CODE) $(OPTFLAGS) $< -o $@ + endif ############################################################################### @@ -316,16 +322,16 @@ $(GEN_MODULE).a: $(OBJ_FILES) $(Echo) "Linking module '$(notdir $@)'" $(Verb) ar cru $@ $^ && ranlib $@ -%.o: %.bc $(DO_PREPARE_CODE_LIB) +%.o: %.bc $(Echo) "Assembling '$(notdir $<)'" - $(Verb) $(LLOPT) $(DO_PREPARE_CODE) $(OPTFLAGS) $< -o - | $(LLC) $(LLCFLAGS) -filetype=obj -o $@ + $(Verb) $(LLC) $(LLCFLAGS) -filetype=obj -o $@ $< $(BUILD_DIR)/%.o: %.s $(SELF) $(BUILD_DIR)/.dir $(Echo) "Assembling '$(notdir $<)'" $(Verb) if $(CLANGXX) $(CXXFLAGS) $(DEPEND_OPTIONS) -c "$<" -o $@; $(DOM) define define_compile_rule -$(BUILD_DIR)/%.bc: $4%$1 $(SELF) $(BUILD_DIR)/.dir +$(BUILD_DIR)/%$(RAW).bc: $4%$1 $(SELF) $(BUILD_DIR)/.dir $(Echo) "Compiling '$$(notdir $$<)'" $(Verb) if $2 $3 $(DEPEND_OPTIONS) -emit-llvm -c "$$<" -o $$@; $(DOM) endef Modified: vmkit/branches/mcjit/include/j3/j3.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=200151&r1=200150&r2=200151&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3.h (original) +++ vmkit/branches/mcjit/include/j3/j3.h Sun Jan 26 07:12:24 2014 @@ -158,27 +158,27 @@ namespace j3 { static JNIEnv* jniEnv(); - static void classNotFoundException(const vmkit::Name* name) __attribute__((noreturn)); - static void noClassDefFoundError(const vmkit::Name* name) __attribute__((noreturn)); - static void classFormatError(J3ObjectType* cl, const char* reason, ...) __attribute__((noreturn)); + static void classNotFoundException(const vmkit::Name* name) __attribute__((noreturn, noinline)); + static void noClassDefFoundError(const vmkit::Name* name) __attribute__((noreturn, noinline)); + static void classFormatError(J3ObjectType* cl, const char* reason, ...) __attribute__((noreturn, noinline)); static void noSuchMethodError(const char* msg, - J3ObjectType* clName, const vmkit::Name* name, J3Signature* signature) __attribute__((noreturn)); + J3ObjectType* clName, const vmkit::Name* name, J3Signature* signature) __attribute__((noreturn, noinline)); static void noSuchFieldError(const char* msg, - J3ObjectType* clName, const vmkit::Name* name, J3Type* type) __attribute__((noreturn)); - static void linkageError(J3Method* method) __attribute__((noreturn)); + J3ObjectType* clName, const vmkit::Name* name, J3Type* type) __attribute__((noreturn, noinline)); + static void linkageError(J3Method* method) __attribute__((noreturn, noinline)); - static void outOfMemoryError() __attribute__((noreturn)); + static void outOfMemoryError() __attribute__((noreturn, noinline)); - static void nullPointerException() __attribute__((noreturn)); - static void classCastException() __attribute__((noreturn)); + static void nullPointerException() __attribute__((noreturn, noinline)); + static void classCastException() __attribute__((noreturn, noinline)); - static void negativeArraySizeException(int32_t length) __attribute__((noreturn)); + static void negativeArraySizeException(int32_t length) __attribute__((noreturn, noinline)); static void arrayStoreException() __attribute__((noreturn)); - static void arrayIndexOutOfBoundsException() __attribute__((noreturn)); + static void arrayIndexOutOfBoundsException() __attribute__((noreturn, noinline)); - static void illegalMonitorStateException() __attribute__((noreturn)); + static void illegalMonitorStateException() __attribute__((noreturn, noinline)); - static void illegalArgumentException(const char* msg) __attribute__((noreturn)); + static void illegalArgumentException(const char* msg) __attribute__((noreturn, noinline)); void printStackTrace(); void uncatchedException(void* e); Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=200151&r1=200150&r2=200151&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Sun Jan 26 07:12:24 2014 @@ -97,7 +97,7 @@ namespace j3 { J3Signature::function_t cxxCaller(); void* fnPtr(); llvm::Function* llvmFunction() { return _llvmFunction; } /* overwrite vmkit::Symbol */ - bool isInlinable(); + uint64_t inlineWeight(); void* functionPointerOrStaticTrampoline(); void* functionPointerOrVirtualTrampoline(); Modified: vmkit/branches/mcjit/include/vmkit/compiler.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/compiler.h?rev=200151&r1=200150&r2=200151&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/compiler.h (original) +++ vmkit/branches/mcjit/include/vmkit/compiler.h Sun Jan 26 07:12:24 2014 @@ -23,10 +23,11 @@ namespace vmkit { class VMKit; class Symbol : public PermanentObject { + uint64_t cachedWeight; public: virtual void* getSymbolAddress(); virtual llvm::Function* llvmFunction() { return 0; } - virtual bool isInlinable() { return 0; } + virtual uint64_t inlineWeight(); }; class NativeSymbol : public Symbol { @@ -37,7 +38,6 @@ namespace vmkit { llvm::Function* llvmFunction() { return original; } void* getSymbolAddress() { return addr; } - virtual bool isInlinable() { return 1; } }; class CompilationUnit : public llvm::SectionMemoryManager { 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=200151&r1=200150&r2=200151&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sun Jan 26 07:12:24 2014 @@ -31,8 +31,11 @@ J3Method::J3Method(uint16_t access, J3Cl _index = -1; } -bool J3Method::isInlinable() { - return J3Thread::get()->vm()->options()->enableInlining; +uint64_t J3Method::inlineWeight() { + if(J3Thread::get()->vm()->options()->enableInlining) + return vmkit::Symbol::inlineWeight(); + else + return (uint64_t)-1; } uint32_t J3Method::interfaceIndex() { 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=200151&r1=200150&r2=200151&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Sun Jan 26 07:12:24 2014 @@ -288,11 +288,11 @@ J3Object* J3Object::doNew(J3Class* cl) { } void J3Object::monitorEnter(J3Object* obj) { - J3::internalError("implement me: monitorenter"); + J3::internalError("implement me: monitor"); } void J3Object::monitorExit(J3Object* obj) { - J3::internalError("implement me: monitorexit"); + J3::internalError("implement me: monitor"); } uint32_t J3Object::hashCode() { Modified: vmkit/branches/mcjit/lib/vmkit-prepare-code/adapt-linkage.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit-prepare-code/adapt-linkage.cc?rev=200151&r1=200150&r2=200151&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit-prepare-code/adapt-linkage.cc (original) +++ vmkit/branches/mcjit/lib/vmkit-prepare-code/adapt-linkage.cc Sun Jan 26 07:12:24 2014 @@ -17,26 +17,72 @@ #include namespace vmkit { - class VMKitAdaptLinkage : public llvm::FunctionPass { + class VMKitAdaptLinkage : public llvm::ModulePass { public: static char ID; - VMKitAdaptLinkage() : llvm::FunctionPass(ID) {} + VMKitAdaptLinkage() : llvm::ModulePass(ID) {} - virtual bool runOnFunction(llvm::Function& function) { - llvm::Function::LinkageTypes linkage = function.getLinkage(); - - if(linkage == llvm::GlobalValue::LinkOnceODRLinkage) - function.setLinkage(llvm::GlobalValue::WeakODRLinkage); - if(linkage == llvm::GlobalValue::LinkOnceAnyLinkage) - function.setLinkage(llvm::GlobalValue::WeakAnyLinkage); - //if(linkage - //fprintf(stderr, "run on function: %s\n", function.getName().data()); - return 0; - } - }; + virtual bool runOnModule(llvm::Module &module); + }; char VMKitAdaptLinkage::ID = 0; llvm::RegisterPass X("VMKitAdaptLinkage", "Adapt the linkage for vmkit"); + + class VMKitRenamer { + public: + size_t moduleLen; + size_t reserved; + char* buf; + + VMKitRenamer(llvm::Module* module) { + const char* moduleId = module->getModuleIdentifier().data(); + moduleLen = strlen(moduleId); + reserved = 1024; + buf = (char*)malloc(moduleLen + reserved + 1); + memcpy(buf, moduleId, moduleLen); + } + + bool makeVisible(llvm::GlobalValue* gv) { + llvm::GlobalValue::LinkageTypes linkage = gv->getLinkage(); + + if(linkage == llvm::GlobalValue::LinkOnceODRLinkage) { + gv->setLinkage(llvm::GlobalValue::WeakODRLinkage); + return 1; + } + + if(linkage == llvm::GlobalValue::LinkOnceAnyLinkage) { + gv->setLinkage(llvm::GlobalValue::WeakAnyLinkage); + return 1; + } + + if(linkage == llvm::GlobalValue::PrivateLinkage) { + size_t len = strlen(gv->getName().data()); + if(len > reserved) { + reserved = (len << 2); + buf = (char*)realloc(buf, moduleLen + reserved + 1); + } + memcpy(buf + moduleLen, gv->getName().data(), len + 1); + gv->setName(buf); + gv->setLinkage(llvm::GlobalValue::ExternalLinkage); + return 1; + } + + return 0; + } + }; + + bool VMKitAdaptLinkage::runOnModule(llvm::Module &module) { + bool changed = 0; + VMKitRenamer renamer(&module); + + for (llvm::Module::iterator it=module.begin(); it!=module.end(); it++) + changed |= renamer.makeVisible(it); + + for (llvm::Module::global_iterator it=module.global_begin(); it!=module.global_end(); it++) + changed |= renamer.makeVisible(it); + + return changed; + }; } Modified: vmkit/branches/mcjit/lib/vmkit/compiler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/compiler.cc?rev=200151&r1=200150&r2=200151&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/compiler.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/compiler.cc Sun Jan 26 07:12:24 2014 @@ -27,6 +27,25 @@ void* Symbol::getSymbolAddress() { Thread::get()->vm()->internalError("implement me: getSymbolAddress"); } +uint64_t Symbol::inlineWeight() { + if(cachedWeight) + return cachedWeight; + + uint64_t infinity = (uint64_t)-1; + + if(llvmFunction()->size() > 4) + return cachedWeight = infinity; + + uint64_t weight = 0; + + for (llvm::Function::iterator bit=llvmFunction()->begin(); bit!=llvmFunction()->end(); bit++) + weight += bit->size(); + + weight = weight * 100; + + return cachedWeight = weight; +} + void* CompilationUnit::operator new(size_t n, BumpAllocator* allocator) { return allocator->allocate(n); } Modified: vmkit/branches/mcjit/lib/vmkit/inliner.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/inliner.cc?rev=200151&r1=200150&r2=200151&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/inliner.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/inliner.cc Sun Jan 26 07:12:24 2014 @@ -8,6 +8,10 @@ #include "llvm/Transforms/Utils/Cloning.h" #include "vmkit/compiler.h" +#include "vmkit/system.h" +#include "vmkit/vmkit.h" + +#include namespace vmkit { class FunctionInliner : public llvm::FunctionPass { @@ -31,112 +35,135 @@ namespace vmkit { return "Simple inliner"; } - llvm::InlineCost getInlineCost(llvm::CallSite callSite, llvm::Function* callee) { - return costAnalysis.getInlineCost(callSite, inlineThreshold); + bool ensureLocal(llvm::Function* function, llvm::Function* callee) { + /* prevent exernal references because some llvm passes don't like that */ + if(callee->getParent() != function->getParent()) { + //fprintf(stderr, " rewrite local\n"); + llvm::Function* local = (llvm::Function*)function->getParent()->getOrInsertFunction(callee->getName().data(), + callee->getFunctionType()); + callee->replaceAllUsesWith(local); + callee = local; + return 1; + } else + return 0; } + + Symbol* tryInline(llvm::Function* function, llvm::Function* callee) { + if(callee->isIntrinsic()) + return 0; + + const char* id = callee->getName().data(); + Symbol* symbol = compiler->getSymbol(id, 0); + llvm::Function* bc; + + //fprintf(stderr, " processing: %s => %p\n", id, symbol); + + if(symbol) { + bc = symbol->llvmFunction(); + if(!bc) + return 0; + } else { + bc = callee; - virtual bool runOnFunction(llvm::Function &function); - private: - }; - - char FunctionInliner::ID = 0; - -#if 0 - llvm::RegisterPass X("FunctionInliner", - "Inlining Pass that inlines evaluator's functions."); -#endif - - bool FunctionInliner::runOnFunction(llvm::Function& function) { - bool Changed = false; - - //fprintf(stderr, "Analyzing: %s\n", function.getName().data()); + if(callee->isDeclaration() && callee->isMaterializable()) + callee->Materialize(); - restart: - for (llvm::Function::iterator bit=function.begin(); bit!=function.end(); bit++) { - llvm::BasicBlock* bb = bit; - uint32_t prof = 0; + if(callee->isDeclaration()) + return 0; + + uint8_t* addr = (uint8_t*)dlsym(SELF_HANDLE, id); + symbol = new(compiler->allocator()) NativeSymbol(callee, addr); + compiler->addSymbol(id, symbol); + } - for(llvm::BasicBlock::iterator it=bb->begin(), prev=0; it!=bb->end() && prof<42; prev=it++) { - llvm::Instruction *insn = it; + //fprintf(stderr, " weight: %lld\n", symbol->inlineWeight()); - //fprintf(stderr, " process: "); - //insn->dump(); + return (!bc->hasFnAttribute(llvm::Attribute::NoInline) + && (bc->hasFnAttribute(llvm::Attribute::AlwaysInline) || + (!onlyAlwaysInline && (uint64_t)(symbol->inlineWeight()-1) < inlineThreshold))) ? symbol : 0; + } - if (insn->getOpcode() != llvm::Instruction::Call && - insn->getOpcode() != llvm::Instruction::Invoke) { - continue; - } + //llvm::SmallPtrSet NeverInline; - llvm::CallSite call(insn); - llvm::Function* callee = call.getCalledFunction(); + bool runOnFunction(llvm::Function& function) { + bool changed = false; + + //fprintf(stderr, "Analyzing: %s\n", function.getName().data()); + + restart: + for (llvm::Function::iterator bit=function.begin(); bit!=function.end(); bit++) { + llvm::BasicBlock* bb = bit; + uint32_t prof = 0; - if(!callee) - continue; + for(llvm::BasicBlock::iterator it=bb->begin(), prev=0; it!=bb->end() && prof<42; prev=it++) { + llvm::Instruction *insn = it; - llvm::Function* bc = callee; + //fprintf(stderr, " process: "); + //insn->dump(); - if(callee->isDeclaration()) { /* ok, resolve */ - if(callee->isMaterializable()) - callee->Materialize(); +#if 0 + if(insn->getOpcode() == llvm::Instruction::LandingPad) { + llvm::LandingPadInst* lp = (llvm::LandingPadInst*)insn; + ensureLocal(&function, (llvm::Function*)lp->getPersonalityFn()); + continue; + } +#endif - if(callee->isDeclaration()) { - Symbol* s = compiler->getSymbol(bc->getName().data(), 0); - - if(s && s->isInlinable()) - bc = s->llvmFunction(); + if (insn->getOpcode() != llvm::Instruction::Call && + insn->getOpcode() != llvm::Instruction::Invoke) { + continue; } - } - /* getInlineCost does not like inter-module references */ - if(callee->getParent() != function.getParent()) { - llvm::Function* local = (llvm::Function*)function.getParent()->getOrInsertFunction(callee->getName(), - callee->getFunctionType()); - callee->replaceAllUsesWith(local); - callee = local; - Changed = 1; - } + llvm::CallSite call(insn); + llvm::Function* callee = call.getCalledFunction(); - if(bc && !bc->isDeclaration()) { - //fprintf(stderr, " processing %s\n", bc->getName().data()); - //function.dump(); - //fprintf(stderr, " %p and %p\n", function.getParent(), callee->getParent()); - //callee->dump(); - - llvm::InlineCost cost = getInlineCost(call, bc); - - //fprintf(stderr, " Inlining: %s ", bc->getName().data()); - //if(cost.isAlways()) - //fprintf(stderr, " is always\n"); - //else if(cost.isNever()) - //fprintf(stderr, " is never\n"); - //else - //fprintf(stderr, " cost: %d (=> %s)\n", cost.getCost(), !cost ? "false" : "true"); + if(!callee) + continue; - if(cost.isAlways()) {// || (!onlyAlwaysInline && !cost.isNever() && cost)) { + Symbol* symbol = tryInline(&function, callee); + llvm::Function* bc; + + if(symbol && (bc = symbol->llvmFunction()) != &function) { if(bc != callee) callee->replaceAllUsesWith(bc); - + + //fprintf(stderr, " inlining: %s\n", bc->getName().data()); + //bc->dump(); llvm::InlineFunctionInfo ifi(0); bool isInlined = llvm::InlineFunction(call, ifi, false); - Changed |= isInlined; + changed |= isInlined; if(isInlined) { - // prof++; - // it = prev ? prev : bb->begin(); - // continue; + prof++; + //it = prev ? prev : bb->begin(); + //continue; + //fprintf(stderr, "... restart ....\n"); goto restart; } - } + } else + changed |= ensureLocal(&function, callee); } } + + //#if 0 + if(changed) { + //function.dump(); + //abort(); + } + //#endif + + return changed; } + }; - //function.dump(); + char FunctionInliner::ID = 0; - return Changed; - } +#if 0 + llvm::RegisterPass X("FunctionInliner", + "Inlining Pass that inlines evaluator's functions."); +#endif llvm::FunctionPass* createFunctionInlinerPass(CompilationUnit* compiler, bool onlyAlwaysInline) { - return new FunctionInliner(compiler, 2, onlyAlwaysInline); + return new FunctionInliner(compiler, 2000, onlyAlwaysInline); } } From gael.thomas at lip6.fr Sun Jan 26 15:07:34 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 26 Jan 2014 23:07:34 -0000 Subject: [vmkit-commits] [vmkit] r200162 - New inline pass able to resolve symbols in any compilation unit. Message-ID: <20140126230734.6E9F62A6C03D@llvm.org> Author: gthomas Date: Sun Jan 26 17:07:33 2014 New Revision: 200162 URL: http://llvm.org/viewvc/llvm-project?rev=200162&view=rev Log: New inline pass able to resolve symbols in any compilation unit. Modified: vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/include/vmkit/compiler.h vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/vmkit/inliner.cc Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=200162&r1=200161&r2=200162&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Sun Jan 26 17:07:33 2014 @@ -51,57 +51,59 @@ namespace j3 { public: J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, J3Signature* signature); - uint32_t slot() { return _slot; } + vmkit::CompilationUnit* unit(); - static J3Method* nativeMethod(J3ObjectHandle* handle); - J3ObjectHandle* javaMethod(); + uint32_t slot() { return _slot; } - void* nativeFnPtr() { return _nativeFnPtr; } + static J3Method* nativeMethod(J3ObjectHandle* handle); + J3ObjectHandle* javaMethod(); - void markCompiled(llvm::Function* llvmFunction, void* fnPtr); + void* nativeFnPtr() { return _nativeFnPtr; } - uint32_t interfaceIndex(); + void markCompiled(llvm::Function* llvmFunction, void* fnPtr); - void* getSymbolAddress(); + uint32_t interfaceIndex(); - char* llvmFunctionName(J3Class* from=0); - char* llvmStubName(J3Class* from=0); + void* getSymbolAddress(); - void postInitialise(uint32_t access, J3Attributes* attributes); - void setIndex(uint32_t index); + char* llvmFunctionName(J3Class* from=0); + char* llvmStubName(J3Class* from=0); - J3Method* resolve(J3ObjectHandle* obj); + void postInitialise(uint32_t access, J3Attributes* attributes); + void setIndex(uint32_t index); - uint32_t index(); + J3Method* resolve(J3ObjectHandle* obj); - J3Attributes* attributes() const { return _attributes; } - uint16_t access() const { return _access; } - J3Class* cl() const { return _cl; } - const vmkit::Name* name() const { return _name; } - J3Signature* signature() const { return _signature; } + uint32_t index(); - void registerNative(void* ptr); + J3Attributes* attributes() const { return _attributes; } + uint16_t access() const { return _access; } + J3Class* cl() const { return _cl; } + const vmkit::Name* name() const { return _name; } + J3Signature* signature() const { return _signature; } - J3Value invokeStatic(...); - J3Value invokeStatic(J3Value* args); - J3Value invokeStatic(va_list va); - J3Value invokeSpecial(J3ObjectHandle* obj, ...); - J3Value invokeSpecial(J3ObjectHandle* obj, J3Value* args); - J3Value invokeSpecial(J3ObjectHandle* obj, va_list va); - J3Value invokeVirtual(J3ObjectHandle* obj, ...); - J3Value invokeVirtual(J3ObjectHandle* obj, J3Value* args); - J3Value invokeVirtual(J3ObjectHandle* obj, va_list va); + void registerNative(void* ptr); - void aotSnapshot(llvm::Linker* linker); - void ensureCompiled(uint32_t mode); + J3Value invokeStatic(...); + J3Value invokeStatic(J3Value* args); + J3Value invokeStatic(va_list va); + J3Value invokeSpecial(J3ObjectHandle* obj, ...); + J3Value invokeSpecial(J3ObjectHandle* obj, J3Value* args); + J3Value invokeSpecial(J3ObjectHandle* obj, va_list va); + J3Value invokeVirtual(J3ObjectHandle* obj, ...); + J3Value invokeVirtual(J3ObjectHandle* obj, J3Value* args); + J3Value invokeVirtual(J3ObjectHandle* obj, va_list va); + + void aotSnapshot(llvm::Linker* linker); + void ensureCompiled(uint32_t mode); J3Signature::function_t cxxCaller(); - void* fnPtr(); - llvm::Function* llvmFunction() { return _llvmFunction; } /* overwrite vmkit::Symbol */ - uint64_t inlineWeight(); - void* functionPointerOrStaticTrampoline(); - void* functionPointerOrVirtualTrampoline(); + void* fnPtr(); + llvm::Function* llvmFunction() { return _llvmFunction; } /* overwrite vmkit::Symbol */ + uint64_t inlineWeight(); + void* functionPointerOrStaticTrampoline(); + void* functionPointerOrVirtualTrampoline(); - void dump(); + void dump(); }; } Modified: vmkit/branches/mcjit/include/vmkit/compiler.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/compiler.h?rev=200162&r1=200161&r2=200162&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/compiler.h (original) +++ vmkit/branches/mcjit/include/vmkit/compiler.h Sun Jan 26 17:07:33 2014 @@ -21,23 +21,28 @@ namespace llvm { namespace vmkit { class VMKit; + class CompilationUnit; class Symbol : public PermanentObject { uint64_t cachedWeight; public: - virtual void* getSymbolAddress(); - virtual llvm::Function* llvmFunction() { return 0; } - virtual uint64_t inlineWeight(); + virtual void* getSymbolAddress(); + virtual llvm::Function* llvmFunction() { return 0; } + virtual uint64_t inlineWeight(); + virtual CompilationUnit* unit() { return 0; } }; class NativeSymbol : public Symbol { - llvm::Function* original; - void* addr; + llvm::Function* original; + void* addr; public: - NativeSymbol(llvm::Function* _original, void* _addr) { original = _original; addr = _addr; } + NativeSymbol(llvm::Function* _original, void* _addr) { + original = _original; + addr = _addr; + } - llvm::Function* llvmFunction() { return original; } - void* getSymbolAddress() { return addr; } + llvm::Function* llvmFunction() { return original; } + void* getSymbolAddress() { return addr; } }; class CompilationUnit : public llvm::SectionMemoryManager { 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=200162&r1=200161&r2=200162&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sun Jan 26 17:07:33 2014 @@ -31,6 +31,10 @@ J3Method::J3Method(uint16_t access, J3Cl _index = -1; } +vmkit::CompilationUnit* J3Method::unit() { + return cl()->loader(); +} + uint64_t J3Method::inlineWeight() { if(J3Thread::get()->vm()->options()->enableInlining) return vmkit::Symbol::inlineWeight(); Modified: vmkit/branches/mcjit/lib/vmkit/inliner.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/inliner.cc?rev=200162&r1=200161&r2=200162&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/inliner.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/inliner.cc Sun Jan 26 17:07:33 2014 @@ -14,156 +14,325 @@ #include namespace vmkit { - class FunctionInliner : public llvm::FunctionPass { - public: - static char ID; - - CompilationUnit* compiler; - llvm::InlineCostAnalysis costAnalysis; - unsigned int inlineThreshold; // 225 in llvm - bool onlyAlwaysInline; - - //FunctionInliner() : FunctionPass(ID) {} - FunctionInliner(CompilationUnit* _compiler, unsigned int _inlineThreshold, bool _onlyAlwaysInline) : - FunctionPass(ID) { - compiler = _compiler; - inlineThreshold = _inlineThreshold; + class FunctionInliner { + public: + llvm::Function* function; + llvm::SmallPtrSet visited; + llvm::SmallVector, 8> visitStack; + CompilationUnit* originalUnit; + Symbol* curSymbol; + bool onlyAlwaysInline; + uint64_t inlineThreshold; + + FunctionInliner(CompilationUnit* unit, llvm::Function* _function, uint64_t inlineThreshold, bool _onlyAlwaysInline) { + function = _function; + originalUnit = unit; onlyAlwaysInline = _onlyAlwaysInline; + push(0, &function->getEntryBlock()); } - virtual const char* getPassName() const { - return "Simple inliner"; - } - - bool ensureLocal(llvm::Function* function, llvm::Function* callee) { - /* prevent exernal references because some llvm passes don't like that */ - if(callee->getParent() != function->getParent()) { - //fprintf(stderr, " rewrite local\n"); - llvm::Function* local = (llvm::Function*)function->getParent()->getOrInsertFunction(callee->getName().data(), - callee->getFunctionType()); - callee->replaceAllUsesWith(local); - callee = local; - return 1; - } else - return 0; + void push(Symbol* symbol, llvm::BasicBlock* bb) { + if(visited.insert(bb)) + visitStack.push_back(std::make_pair(symbol, bb)); } - - Symbol* tryInline(llvm::Function* function, llvm::Function* callee) { + + llvm::BasicBlock* pop() { + std::pair top = visitStack.pop_back_val(); + curSymbol = top.first; + return top.second; + } + + Symbol* tryInline(llvm::Function* callee) { if(callee->isIntrinsic()) return 0; const char* id = callee->getName().data(); - Symbol* symbol = compiler->getSymbol(id, 0); + CompilationUnit* unit = curSymbol ? curSymbol->unit() : originalUnit; + if(!unit) + unit = originalUnit; + Symbol* symbol = unit->getSymbol(id, 0); llvm::Function* bc; //fprintf(stderr, " processing: %s => %p\n", id, symbol); - + if(symbol) { bc = symbol->llvmFunction(); if(!bc) return 0; } else { bc = callee; - + if(callee->isDeclaration() && callee->isMaterializable()) callee->Materialize(); - + if(callee->isDeclaration()) return 0; - + uint8_t* addr = (uint8_t*)dlsym(SELF_HANDLE, id); - symbol = new(compiler->allocator()) NativeSymbol(callee, addr); - compiler->addSymbol(id, symbol); + symbol = new(unit->allocator()) NativeSymbol(callee, addr); + unit->addSymbol(id, symbol); } - - //fprintf(stderr, " weight: %lld\n", symbol->inlineWeight()); + //fprintf(stderr, " weight: %lld\n", symbol->inlineWeight()); return (!bc->hasFnAttribute(llvm::Attribute::NoInline) && (bc->hasFnAttribute(llvm::Attribute::AlwaysInline) || - (!onlyAlwaysInline && (uint64_t)(symbol->inlineWeight()-1) < inlineThreshold))) ? symbol : 0; + (0 && !onlyAlwaysInline && (uint64_t)(symbol->inlineWeight()-1) < inlineThreshold))) ? symbol : 0; } - //llvm::SmallPtrSet NeverInline; + bool visitBB(llvm::BasicBlock* bb) { + bool changed = 0; + bool takeNext = 0; + + //fprintf(stderr, " visit basic block: %s\n", bb->getName().data()); + + for(llvm::BasicBlock::iterator it=bb->begin(), prev=0; it!=bb->end(); takeNext && (prev=it++)) { + llvm::Instruction *insn = it; + takeNext = 1; + + //fprintf(stderr, " visit insn: "); + //insn->dump(); + + //fprintf(stderr, " %d operands\n", insn->getNumOperands()); + for(unsigned i=0; igetNumOperands(); i++) { + llvm::Value* op = insn->getOperand(i); + + //fprintf(stderr, " ----> "); + //op->dump(); + //fprintf(stderr, " => %s\n", llvm::isa(op) ? "global" : "not global"); + + if(llvm::isa(op)) { + llvm::GlobalValue* gv = llvm::cast(op); + if(gv->getParent() != function->getParent()) { + llvm::Value* copy = + llvm::isa(gv) ? + function->getParent()->getOrInsertFunction(gv->getName().data(), + llvm::cast(gv)->getFunctionType()) : + function->getParent()->getOrInsertGlobal(gv->getName().data(), gv->getType()->getContainedType(0)); - bool runOnFunction(llvm::Function& function) { - bool changed = false; - - //fprintf(stderr, "Analyzing: %s\n", function.getName().data()); - - restart: - for (llvm::Function::iterator bit=function.begin(); bit!=function.end(); bit++) { - llvm::BasicBlock* bb = bit; - uint32_t prof = 0; + //fprintf(stderr, "<<>>: %s\n", gv->getName().data()); + gv->replaceAllUsesWith(copy); + } + } + } - for(llvm::BasicBlock::iterator it=bb->begin(), prev=0; it!=bb->end() && prof<42; prev=it++) { - llvm::Instruction *insn = it; + if(insn->getOpcode() != llvm::Instruction::Call && + insn->getOpcode() != llvm::Instruction::Invoke) { + continue; + } - //fprintf(stderr, " process: "); - //insn->dump(); + llvm::CallSite call(insn); + llvm::Function* callee = call.getCalledFunction(); + + if(!callee) + continue; + + Symbol* symbol = tryInline(callee); + + if(symbol) { + llvm::Function* bc = symbol->llvmFunction(); -#if 0 - if(insn->getOpcode() == llvm::Instruction::LandingPad) { - llvm::LandingPadInst* lp = (llvm::LandingPadInst*)insn; - ensureLocal(&function, (llvm::Function*)lp->getPersonalityFn()); - continue; - } -#endif + if(bc != callee) + callee->replaceAllUsesWith(bc); + + fprintf(stderr, " inlining %s in %s\n", bc->getName().data(), function->getName().data()); - if (insn->getOpcode() != llvm::Instruction::Call && - insn->getOpcode() != llvm::Instruction::Invoke) { - continue; + if(llvm::isa(insn)) { + llvm::TerminatorInst* terminator = llvm::cast(insn); + for(unsigned i=0; igetNumSuccessors(); i++) + push(symbol, terminator->getSuccessor(i)); + } else { + size_t len = strlen(bc->getName().data()); + char buf[len + 16]; + memcpy(buf, bc->getName().data(), len); + memcpy(buf+len, ".after-inline", 14); + push(symbol, bb->splitBasicBlock(insn->getNextNode(), buf)); } + + llvm::InlineFunctionInfo ifi(0); + bool isInlined = llvm::InlineFunction(call, ifi, false); + //fprintf(stderr, " ok?: %d\n", isInlined); + changed |= isInlined; + + if(isInlined) { + curSymbol = symbol; + if(prev) + it = prev; + else { + takeNext = 0; + it = bb->begin(); + } + } else if(bc != callee) + bc->replaceAllUsesWith(callee); + } + } + + return changed; + } - llvm::CallSite call(insn); - llvm::Function* callee = call.getCalledFunction(); + bool proceed() { + bool changed = 0; - if(!callee) - continue; + //fprintf(stderr, "visit function: %s\n", function->getName().data()); - Symbol* symbol = tryInline(&function, callee); - llvm::Function* bc; + while(visitStack.size()) { + llvm::BasicBlock* bb = pop(); - if(symbol && (bc = symbol->llvmFunction()) != &function) { - if(bc != callee) - callee->replaceAllUsesWith(bc); - - //fprintf(stderr, " inlining: %s\n", bc->getName().data()); - //bc->dump(); - llvm::InlineFunctionInfo ifi(0); - bool isInlined = llvm::InlineFunction(call, ifi, false); - changed |= isInlined; - - if(isInlined) { - prof++; - //it = prev ? prev : bb->begin(); - //continue; - //fprintf(stderr, "... restart ....\n"); - goto restart; - } - } else - changed |= ensureLocal(&function, callee); + changed |= visitBB(bb); + + llvm::TerminatorInst* terminator = bb->getTerminator(); + if(terminator) { + for(unsigned i=0; igetNumSuccessors(); i++) + push(curSymbol, terminator->getSuccessor(i)); } } - //#if 0 if(changed) { - //function.dump(); - //abort(); + //function->dump(); } - //#endif return changed; } }; - char FunctionInliner::ID = 0; + class FunctionInlinerPass : public llvm::FunctionPass { + public: + static char ID; + + CompilationUnit* unit; + llvm::InlineCostAnalysis costAnalysis; + unsigned int inlineThreshold; // 225 in llvm + bool onlyAlwaysInline; + + FunctionInlinerPass(CompilationUnit* _unit, unsigned int _inlineThreshold, bool _onlyAlwaysInline) : + FunctionPass(ID) { + unit = _unit; + inlineThreshold = _inlineThreshold; + onlyAlwaysInline = _onlyAlwaysInline; + } + + virtual const char* getPassName() const { return "VMKit inliner"; } + bool ensureLocal(llvm::Function* function, llvm::Function* callee); + Symbol* tryInline(llvm::Function* function, llvm::Function* callee); + bool runOnBB(llvm::BasicBlock* bb); + bool runOnFunction0(llvm::Function& function); + bool runOnFunction(llvm::Function& function) { +#if 0 + return runOnFunction0(function); +#else + FunctionInliner inliner(unit, &function, inlineThreshold, onlyAlwaysInline); + return inliner.proceed(); +#endif + } + }; + + char FunctionInlinerPass::ID = 0; + +#if 0 + llvm::RegisterPass X("FunctionInlinerPass", + "Inlining Pass that inlines evaluator's functions."); +#endif + + //FunctionInlinerPass() : FunctionPass(ID) {} + + bool FunctionInlinerPass::ensureLocal(llvm::Function* function, llvm::Function* callee) { + /* prevent exernal references because some llvm passes don't like that */ + if(callee->getParent() != function->getParent()) { + //fprintf(stderr, " rewrite local\n"); + llvm::Function* local = (llvm::Function*)function->getParent()->getOrInsertFunction(callee->getName().data(), + callee->getFunctionType()); + callee->replaceAllUsesWith(local); + callee = local; + return 1; + } else + return 0; + } + + //llvm::SmallPtrSet NeverInline; + + bool FunctionInlinerPass::runOnBB(llvm::BasicBlock* bb) { + fprintf(stderr, " process basic block %s\n", bb->getName().data()); + + //SmallPtrSet Visited; + + return 0; + } + + bool FunctionInlinerPass::runOnFunction0(llvm::Function& function) { + bool changed = false; + + //fprintf(stderr, "Analyzing: %s\n", function.getName().data()); + + restart: + for (llvm::Function::iterator bit=function.begin(); bit!=function.end(); bit++) { + llvm::BasicBlock* bb = bit; + uint32_t prof = 0; + + for(llvm::BasicBlock::iterator it=bb->begin(), prev=0; it!=bb->end() && prof<42; prev=it++) { + llvm::Instruction *insn = it; + + //fprintf(stderr, " process: "); + //insn->dump(); + +#if 0 + if(insn->getOpcode() == llvm::Instruction::LandingPad) { + llvm::LandingPadInst* lp = (llvm::LandingPadInst*)insn; + ensureLocal(&function, (llvm::Function*)lp->getPersonalityFn()); + continue; + } +#endif + + if (insn->getOpcode() != llvm::Instruction::Call && + insn->getOpcode() != llvm::Instruction::Invoke) { + continue; + } + + llvm::CallSite call(insn); + llvm::Function* callee = call.getCalledFunction(); + + if(!callee) + continue; + + Symbol* symbol = tryInline(&function, callee); + llvm::Function* bc; + + if(symbol && (bc = symbol->llvmFunction()) != &function) { + if(bc != callee) + callee->replaceAllUsesWith(bc); + + //fprintf(stderr, " inlining: %s\n", bc->getName().data()); + //bc->dump(); + llvm::InlineFunctionInfo ifi(0); + bool isInlined = llvm::InlineFunction(call, ifi, false); + changed |= isInlined; + + if(isInlined) { + prof++; + //it = prev ? prev : bb->begin(); + //continue; + //fprintf(stderr, "... restart ....\n"); + goto restart; + } + } else + changed |= ensureLocal(&function, callee); + } + } + + //#if 0 + if(changed) { + //function.dump(); + //abort(); + } + //#endif + + return changed; + } #if 0 - llvm::RegisterPass X("FunctionInliner", + llvm::RegisterPass X("FunctionInlinerPass", "Inlining Pass that inlines evaluator's functions."); #endif llvm::FunctionPass* createFunctionInlinerPass(CompilationUnit* compiler, bool onlyAlwaysInline) { - return new FunctionInliner(compiler, 2000, onlyAlwaysInline); + return new FunctionInlinerPass(compiler, 2000, onlyAlwaysInline); } } From gael.thomas at lip6.fr Sun Jan 26 15:12:07 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Sun, 26 Jan 2014 23:12:07 -0000 Subject: [vmkit-commits] [vmkit] r200163 - If inlining a function fail, marks it as NoInline. Message-ID: <20140126231207.B04F92A6C03D@llvm.org> Author: gthomas Date: Sun Jan 26 17:12:07 2014 New Revision: 200163 URL: http://llvm.org/viewvc/llvm-project?rev=200163&view=rev Log: If inlining a function fail, marks it as NoInline. Modified: vmkit/branches/mcjit/include/vmkit/compiler.h vmkit/branches/mcjit/lib/vmkit/compiler.cc vmkit/branches/mcjit/lib/vmkit/inliner.cc Modified: vmkit/branches/mcjit/include/vmkit/compiler.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/compiler.h?rev=200163&r1=200162&r2=200163&view=diff ============================================================================== --- vmkit/branches/mcjit/include/vmkit/compiler.h (original) +++ vmkit/branches/mcjit/include/vmkit/compiler.h Sun Jan 26 17:12:07 2014 @@ -30,6 +30,7 @@ namespace vmkit { virtual llvm::Function* llvmFunction() { return 0; } virtual uint64_t inlineWeight(); virtual CompilationUnit* unit() { return 0; } + virtual void markAsNeverInline(); }; class NativeSymbol : public Symbol { Modified: vmkit/branches/mcjit/lib/vmkit/compiler.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/compiler.cc?rev=200163&r1=200162&r2=200163&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/compiler.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/compiler.cc Sun Jan 26 17:12:07 2014 @@ -46,6 +46,11 @@ uint64_t Symbol::inlineWeight() { return cachedWeight = weight; } +void Symbol::markAsNeverInline() { + if(llvmFunction()) + llvmFunction()->addFnAttr(llvm::Attribute::NoInline); +} + void* CompilationUnit::operator new(size_t n, BumpAllocator* allocator) { return allocator->allocate(n); } Modified: vmkit/branches/mcjit/lib/vmkit/inliner.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/inliner.cc?rev=200163&r1=200162&r2=200163&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/inliner.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/inliner.cc Sun Jan 26 17:12:07 2014 @@ -161,8 +161,11 @@ namespace vmkit { takeNext = 0; it = bb->begin(); } - } else if(bc != callee) - bc->replaceAllUsesWith(callee); + } else { + symbol->markAsNeverInline(); + if(bc != callee) + bc->replaceAllUsesWith(callee); + } } } From gael.thomas at lip6.fr Tue Jan 28 13:18:09 2014 From: gael.thomas at lip6.fr (Gael Thomas) Date: Tue, 28 Jan 2014 21:18:09 -0000 Subject: [vmkit-commits] [vmkit] r200339 - Continue the debugging of the inlining pass. Message-ID: <20140128211809.34F8E2A6C040@llvm.org> Author: gthomas Date: Tue Jan 28 15:18:08 2014 New Revision: 200339 URL: http://llvm.org/viewvc/llvm-project?rev=200339&view=rev Log: Continue the debugging of the inlining pass. Modified: vmkit/branches/mcjit/include/j3/j3method.h vmkit/branches/mcjit/lib/j3/vm/j3method.cc vmkit/branches/mcjit/lib/vmkit-prepare-code/adapt-linkage.cc vmkit/branches/mcjit/lib/vmkit/inliner.cc Modified: vmkit/branches/mcjit/include/j3/j3method.h URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=200339&r1=200338&r2=200339&view=diff ============================================================================== --- vmkit/branches/mcjit/include/j3/j3method.h (original) +++ vmkit/branches/mcjit/include/j3/j3method.h Tue Jan 28 15:18:08 2014 @@ -45,6 +45,7 @@ namespace j3 { void* volatile _virtualTrampoline; J3ObjectHandle* volatile _javaMethod; + J3Value internalInvoke(J3Value* args); J3Value internalInvoke(J3ObjectHandle* handle, va_list va); J3Value internalInvoke(J3ObjectHandle* handle, J3Value* args); void buildLLVMNames(J3Class* from); 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=200339&r1=200338&r2=200339&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original) +++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Tue Jan 28 15:18:08 2014 @@ -36,7 +36,7 @@ vmkit::CompilationUnit* J3Method::unit() } uint64_t J3Method::inlineWeight() { - if(J3Thread::get()->vm()->options()->enableInlining) + if(0 && J3Thread::get()->vm()->options()->enableInlining) return vmkit::Symbol::inlineWeight(); else return (uint64_t)-1; @@ -116,6 +116,22 @@ J3Method* J3Method::resolve(J3ObjectHand return obj->vt()->type()->asObjectType()->findMethod(0, name(), signature()); } +J3Value J3Method::internalInvoke(J3Value* args) { +#if 1 + return cxxCaller()(fnPtr(), args); +#else + J3Value res; + try { + res = cxxCaller()(fnPtr(), args); + } catch(void* e) { + fprintf(stderr, " catch exception %p during the execution of %s::%s%s\n", + e, cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr()); + throw e; + } + return res; +#endif +} + J3Value J3Method::internalInvoke(J3ObjectHandle* handle, J3Value* inArgs) { cl()->initialise(); ensureCompiled(J3CodeGen::WithMethod | J3CodeGen::WithCaller); /* force the generation of the code and thus of the functionType */ @@ -129,15 +145,7 @@ J3Value J3Method::internalInvoke(J3Objec } else reIn = inArgs; - J3Value res; - try { - res = cxxCaller()(fnPtr(), reIn); - } catch(void* e) { - fprintf(stderr, " catch exception e: %p during the execution of %s::%s%s\n", - e, cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr()); - throw e; - } - return res; + return internalInvoke(reIn); } J3Value J3Method::internalInvoke(J3ObjectHandle* handle, va_list va) { @@ -165,7 +173,7 @@ J3Value J3Method::internalInvoke(J3Objec #undef doIt } - return cxxCaller()(fnPtr(), args); + return internalInvoke(args); } J3Value J3Method::invokeStatic(J3Value* args) { Modified: vmkit/branches/mcjit/lib/vmkit-prepare-code/adapt-linkage.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit-prepare-code/adapt-linkage.cc?rev=200339&r1=200338&r2=200339&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit-prepare-code/adapt-linkage.cc (original) +++ vmkit/branches/mcjit/lib/vmkit-prepare-code/adapt-linkage.cc Tue Jan 28 15:18:08 2014 @@ -57,7 +57,8 @@ namespace vmkit { return 1; } - if(linkage == llvm::GlobalValue::PrivateLinkage) { + + if(linkage == llvm::GlobalValue::PrivateLinkage && !memcmp(gv->getName().data(), ".str", 4)) { size_t len = strlen(gv->getName().data()); if(len > reserved) { reserved = (len << 2); Modified: vmkit/branches/mcjit/lib/vmkit/inliner.cc URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/inliner.cc?rev=200339&r1=200338&r2=200339&view=diff ============================================================================== --- vmkit/branches/mcjit/lib/vmkit/inliner.cc (original) +++ vmkit/branches/mcjit/lib/vmkit/inliner.cc Tue Jan 28 15:18:08 2014 @@ -76,7 +76,7 @@ namespace vmkit { return (!bc->hasFnAttribute(llvm::Attribute::NoInline) && (bc->hasFnAttribute(llvm::Attribute::AlwaysInline) || - (0 && !onlyAlwaysInline && (uint64_t)(symbol->inlineWeight()-1) < inlineThreshold))) ? symbol : 0; + (!onlyAlwaysInline && (uint64_t)(symbol->inlineWeight()-1) < inlineThreshold))) ? symbol : 0; } bool visitBB(llvm::BasicBlock* bb) { @@ -110,7 +110,7 @@ namespace vmkit { function->getParent()->getOrInsertGlobal(gv->getName().data(), gv->getType()->getContainedType(0)); //fprintf(stderr, "<<>>: %s\n", gv->getName().data()); - gv->replaceAllUsesWith(copy); + insn->setOperand(i, copy); } } } @@ -130,23 +130,23 @@ namespace vmkit { if(symbol) { llvm::Function* bc = symbol->llvmFunction(); - - if(bc != callee) - callee->replaceAllUsesWith(bc); - fprintf(stderr, " inlining %s in %s\n", bc->getName().data(), function->getName().data()); + //fprintf(stderr, " inlining %s in %s\n", bc->getName().data(), function->getName().data()); if(llvm::isa(insn)) { llvm::TerminatorInst* terminator = llvm::cast(insn); for(unsigned i=0; igetNumSuccessors(); i++) - push(symbol, terminator->getSuccessor(i)); + push(curSymbol, terminator->getSuccessor(i)); } else { size_t len = strlen(bc->getName().data()); - char buf[len + 16]; + char buf[len + 14]; memcpy(buf, bc->getName().data(), len); memcpy(buf+len, ".after-inline", 14); - push(symbol, bb->splitBasicBlock(insn->getNextNode(), buf)); + push(curSymbol, bb->splitBasicBlock(insn->getNextNode(), buf)); } + + if(bc != callee) + call.setCalledFunction(bc); llvm::InlineFunctionInfo ifi(0); bool isInlined = llvm::InlineFunction(call, ifi, false); @@ -164,7 +164,7 @@ namespace vmkit { } else { symbol->markAsNeverInline(); if(bc != callee) - bc->replaceAllUsesWith(callee); + call.setCalledFunction(callee); } } } @@ -214,17 +214,9 @@ namespace vmkit { } virtual const char* getPassName() const { return "VMKit inliner"; } - bool ensureLocal(llvm::Function* function, llvm::Function* callee); - Symbol* tryInline(llvm::Function* function, llvm::Function* callee); - bool runOnBB(llvm::BasicBlock* bb); - bool runOnFunction0(llvm::Function& function); bool runOnFunction(llvm::Function& function) { -#if 0 - return runOnFunction0(function); -#else FunctionInliner inliner(unit, &function, inlineThreshold, onlyAlwaysInline); return inliner.proceed(); -#endif } }; @@ -232,106 +224,6 @@ namespace vmkit { #if 0 llvm::RegisterPass X("FunctionInlinerPass", - "Inlining Pass that inlines evaluator's functions."); -#endif - - //FunctionInlinerPass() : FunctionPass(ID) {} - - bool FunctionInlinerPass::ensureLocal(llvm::Function* function, llvm::Function* callee) { - /* prevent exernal references because some llvm passes don't like that */ - if(callee->getParent() != function->getParent()) { - //fprintf(stderr, " rewrite local\n"); - llvm::Function* local = (llvm::Function*)function->getParent()->getOrInsertFunction(callee->getName().data(), - callee->getFunctionType()); - callee->replaceAllUsesWith(local); - callee = local; - return 1; - } else - return 0; - } - - //llvm::SmallPtrSet NeverInline; - - bool FunctionInlinerPass::runOnBB(llvm::BasicBlock* bb) { - fprintf(stderr, " process basic block %s\n", bb->getName().data()); - - //SmallPtrSet Visited; - - return 0; - } - - bool FunctionInlinerPass::runOnFunction0(llvm::Function& function) { - bool changed = false; - - //fprintf(stderr, "Analyzing: %s\n", function.getName().data()); - - restart: - for (llvm::Function::iterator bit=function.begin(); bit!=function.end(); bit++) { - llvm::BasicBlock* bb = bit; - uint32_t prof = 0; - - for(llvm::BasicBlock::iterator it=bb->begin(), prev=0; it!=bb->end() && prof<42; prev=it++) { - llvm::Instruction *insn = it; - - //fprintf(stderr, " process: "); - //insn->dump(); - -#if 0 - if(insn->getOpcode() == llvm::Instruction::LandingPad) { - llvm::LandingPadInst* lp = (llvm::LandingPadInst*)insn; - ensureLocal(&function, (llvm::Function*)lp->getPersonalityFn()); - continue; - } -#endif - - if (insn->getOpcode() != llvm::Instruction::Call && - insn->getOpcode() != llvm::Instruction::Invoke) { - continue; - } - - llvm::CallSite call(insn); - llvm::Function* callee = call.getCalledFunction(); - - if(!callee) - continue; - - Symbol* symbol = tryInline(&function, callee); - llvm::Function* bc; - - if(symbol && (bc = symbol->llvmFunction()) != &function) { - if(bc != callee) - callee->replaceAllUsesWith(bc); - - //fprintf(stderr, " inlining: %s\n", bc->getName().data()); - //bc->dump(); - llvm::InlineFunctionInfo ifi(0); - bool isInlined = llvm::InlineFunction(call, ifi, false); - changed |= isInlined; - - if(isInlined) { - prof++; - //it = prev ? prev : bb->begin(); - //continue; - //fprintf(stderr, "... restart ....\n"); - goto restart; - } - } else - changed |= ensureLocal(&function, callee); - } - } - - //#if 0 - if(changed) { - //function.dump(); - //abort(); - } - //#endif - - return changed; - } - -#if 0 - llvm::RegisterPass X("FunctionInlinerPass", "Inlining Pass that inlines evaluator's functions."); #endif