[vmkit-commits] [vmkit] r54726 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaClass.h JavaConstantPool.cpp JavaConstantPool.h JavaIsolate.cpp JavaTypes.cpp JavaTypes.h Jnjvm.cpp Jnjvm.h JnjvmModule.cpp JnjvmModule.h JnjvmModuleProvider.cpp LockedMap.h ServiceDomain.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Wed Aug 13 02:17:59 PDT 2008
Author: geoffray
Date: Wed Aug 13 04:17:42 2008
New Revision: 54726
URL: http://llvm.org/viewvc/llvm-project?rev=54726&view=rev
Log:
Typedef and Signdef are now separately hashed.
Also, JIT informations for JavaField, JavaMethod, Class and Signdef
are stored in the object, not in a table.
Modified:
vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h
vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp
vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h
vmkit/trunk/lib/JnJVM/VMCore/ServiceDomain.cpp
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=54726&r1=54725&r2=54726&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Wed Aug 13 04:17:42 2008
@@ -91,8 +91,6 @@
CommonClass::~CommonClass() {
free(display);
free(virtualVT);
- if (isolate)
- isolate->TheModule->removeClass(this);
delete lockVar;
delete condVar;
}
@@ -103,6 +101,7 @@
lockVar = 0;
condVar = 0;
virtualVT = 0;
+ JInfo = 0;
}
Class::Class() {
@@ -610,6 +609,7 @@
method->access = access;
method->canBeInlined = false;
method->offset = 0;
+ method->JInfo = 0;
map.insert(std::make_pair(CC, method));
return method;
} else {
@@ -631,6 +631,7 @@
field->_signature = 0;
field->ptrOffset = 0;
field->access = access;
+ field->JInfo = 0;
map.insert(std::make_pair(CC, field));
return field;
} else {
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=54726&r1=54725&r2=54726&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Wed Aug 13 04:17:42 2008
@@ -15,6 +15,7 @@
#include "types.h"
+#include "mvm/JIT.h"
#include "mvm/Method.h"
#include "mvm/Object.h"
#include "mvm/PrintBuffer.h"
@@ -436,6 +437,18 @@
/// CommonClass - Default constructor.
///
CommonClass();
+
+ mvm::JITInfo* JInfo;
+ template<typename Ty>
+ Ty *getInfo() {
+ if (!JInfo) {
+ JInfo = new Ty(this);
+ }
+
+ assert((void*)dynamic_cast<Ty*>(JInfo) == (void*)JInfo &&
+ "Invalid concrete type or multiple inheritence for getInfo");
+ return static_cast<Ty*>(JInfo);
+ }
};
@@ -691,7 +704,7 @@
///
Signdef* getSignature() {
if(!_signature)
- _signature = (Signdef*) classDef->isolate->constructType(type);
+ _signature = classDef->isolate->constructSign(type);
return _signature;
}
@@ -763,6 +776,18 @@
sint64 invokeLongStatic(Jnjvm* vm, ...);
JavaObject* invokeJavaObjectStatic(Jnjvm* vm, ...);
+ mvm::JITInfo* JInfo;
+ template<typename Ty>
+ Ty *getInfo() {
+ if (!JInfo) {
+ JInfo = new Ty(this);
+ }
+
+ assert((void*)dynamic_cast<Ty*>(JInfo) == (void*)JInfo &&
+ "Invalid concrete type or multiple inheritence for getInfo");
+ return static_cast<Ty*>(JInfo);
+ }
+
};
/// JavaField - This class represents a Java field.
@@ -880,6 +905,18 @@
MK_ASSESSORS(uint16, Int16);
MK_ASSESSORS(uint32, Int32);
MK_ASSESSORS(sint64, Long);
+
+ mvm::JITInfo* JInfo;
+ template<typename Ty>
+ Ty *getInfo() {
+ if (!JInfo) {
+ JInfo = new Ty(this);
+ }
+
+ assert((void*)dynamic_cast<Ty*>(JInfo) == (void*)JInfo &&
+ "Invalid concrete type or multiple inheritence for getInfo");
+ return static_cast<Ty*>(JInfo);
+ }
};
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=54726&r1=54725&r2=54726&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Wed Aug 13 04:17:42 2008
@@ -335,6 +335,22 @@
return (Typedef*)res;
}
+Signdef* JavaCtpInfo::resolveNameAndSign(uint32 index) {
+ void* res = ctpRes[index];
+ if (!res) {
+ if (typeAt(index) != ConstantNameAndType) {
+ JavaThread::get()->isolate->error(Jnjvm::ClassFormatError,
+ "bad constant pool number for name/type at entry %d", index);
+ }
+ sint32 entry = ctpDef[index];
+ const UTF8* type = UTF8At(entry & 0xFFFF);
+ Signdef* sign = classDef->isolate->constructSign(type);
+ ctpRes[index] = sign;
+ return sign;
+ }
+ return (Signdef*)res;
+}
+
Typedef* JavaCtpInfo::infoOfField(uint32 index) {
if (typeAt(index) != ConstantFieldref)
JavaThread::get()->isolate->error(Jnjvm::ClassFormatError,
@@ -349,7 +365,7 @@
JavaThread::get()->isolate->error(Jnjvm::ClassFormatError,
"bad constant pool number for method at entry %d", index);
- Signdef* sign = (Signdef*)resolveNameAndType(ctpDef[index] & 0xFFFF);
+ Signdef* sign = resolveNameAndSign(ctpDef[index] & 0xFFFF);
sint32 entry = ctpDef[index];
sint32 ntIndex = entry & 0xFFFF;
const UTF8* utf8 = UTF8At(ctpDef[ntIndex] >> 16);
@@ -376,7 +392,7 @@
JavaThread::get()->isolate->error(Jnjvm::ClassFormatError,
"bad constant pool number for method at entry %d", index);
- sign = (Signdef*)resolveNameAndType(ctpDef[index] & 0xFFFF);
+ sign = resolveNameAndSign(ctpDef[index] & 0xFFFF);
sint32 entry = ctpDef[index];
sint32 ntIndex = entry & 0xFFFF;
name = UTF8At(ctpDef[ntIndex] >> 16);
@@ -392,7 +408,7 @@
JavaThread::get()->isolate->error(Jnjvm::ClassFormatError,
"bad constant pool number for method at entry %d", index);
- sign = (Signdef*)resolveNameAndType(ctpDef[index] & 0xFFFF);
+ sign = resolveNameAndSign(ctpDef[index] & 0xFFFF);
sint32 entry = ctpDef[index];
sint32 ntIndex = entry & 0xFFFF;
const UTF8* utf8 = UTF8At(ctpDef[ntIndex] >> 16);
@@ -431,7 +447,7 @@
JavaThread::get()->isolate->error(Jnjvm::ClassFormatError,
"bad constant pool number for method at entry %d", index);
- Signdef* sign = (Signdef*)resolveNameAndType(ctpDef[index] & 0xFFFF);
+ Signdef* sign = resolveNameAndSign(ctpDef[index] & 0xFFFF);
return sign;
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h?rev=54726&r1=54725&r2=54726&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h Wed Aug 13 04:17:42 2008
@@ -108,6 +108,7 @@
CommonClass* loadClass(uint32 index);
void checkInfoOfClass(uint32 index);
Typedef* resolveNameAndType(uint32 index);
+ Signdef* resolveNameAndSign(uint32 index);
Typedef* infoOfField(uint32 index);
Signdef* infoOfInterfaceOrVirtualMethod(uint32 index);
void* infoOfStaticOrSpecialMethod(uint32 index,
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp?rev=54726&r1=54725&r2=54726&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp Wed Aug 13 04:17:42 2008
@@ -476,6 +476,7 @@
isolate->hashStr = new StringMap();
isolate->bootstrapClasses = callingVM->bootstrapClasses;
isolate->javaTypes = new TypeMap();
+ isolate->javaSignatures = new SignMap();
isolate->globalRefsLock = mvm::Lock::allocNormal();
#ifdef MULTIPLE_VM
isolate->statics = vm_new(isolate, StaticInstanceMap)();
@@ -531,6 +532,7 @@
isolate->javavmEnv = &JNI_JavaVMTable;
isolate->globalRefsLock = mvm::Lock::allocNormal();
isolate->javaTypes = new TypeMap();
+ isolate->javaSignatures = new SignMap();
#ifdef MULTIPLE_VM
isolate->statics = vm_new(isolate, StaticInstanceMap)();
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp?rev=54726&r1=54725&r2=54726&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.cpp Wed Aug 13 04:17:42 2008
@@ -446,7 +446,7 @@
CommonClass::printClassName(cl->name, buf);
buf->write("::");
name->print(buf);
- humanPrintArgs(&args, buf);
+ Typedef::humanPrintArgs(&args, buf);
}
Signdef* Signdef::signDup(const UTF8* name, Jnjvm *vm) {
@@ -480,12 +480,11 @@
res->ret = vm->constructType(name->extract(vm, pos, pred));
res->isolate = vm;
res->keyName = name;
- res->pseudoAssocClassName = name;
- res->funcs = 0;
res->_virtualCallBuf = 0;
res->_staticCallBuf = 0;
res->_virtualCallAP = 0;
res->_staticCallAP = 0;
+ res->JInfo = 0;
return res;
}
@@ -495,20 +494,18 @@
uint32 next;
AssessorDesc::analyseIntern(name, 0, 0, funcs, next);
- if (funcs == AssessorDesc::dParg) {
- return Signdef::signDup(name, vm);
- } else {
- Typedef* res = new Typedef();
- res->isolate = vm;
- res->keyName = name;
- res->funcs = funcs;
- if (funcs == AssessorDesc::dRef) {
- res->pseudoAssocClassName = name->extract(vm, 1, next - 1);
- } else if (funcs == AssessorDesc::dTab) {
- res->pseudoAssocClassName = name;
- }
- return res;
+ assert(funcs != AssessorDesc::dParg &&
+ "Error: resolving a signature for a field");
+ Typedef* res = new Typedef();
+ res->isolate = vm;
+ res->keyName = name;
+ res->funcs = funcs;
+ if (funcs == AssessorDesc::dRef) {
+ res->pseudoAssocClassName = name->extract(vm, 1, next - 1);
+ } else if (funcs == AssessorDesc::dTab) {
+ res->pseudoAssocClassName = name;
}
+ return res;
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h?rev=54726&r1=54725&r2=54726&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaTypes.h Wed Aug 13 04:17:42 2008
@@ -10,13 +10,10 @@
#ifndef JNJVM_JAVA_TYPES_H
#define JNJVM_JAVA_TYPES_H
-#include "mvm/Object.h"
-
#include "types.h"
-namespace mvm {
- class Code;
-}
+#include "mvm/JIT.h"
+#include "mvm/Object.h"
namespace jnjvm {
@@ -133,13 +130,14 @@
CommonClass* assocClass(JavaObject* loader);
void typePrint(mvm::PrintBuffer* buf);
- static void humanPrintArgs(const std::vector<Typedef*>*, mvm::PrintBuffer* buf);
+ static void humanPrintArgs(const std::vector<Typedef*>*,
+ mvm::PrintBuffer* buf);
static Typedef* typeDup(const UTF8* name, Jnjvm* vm);
void tPrintBuf(mvm::PrintBuffer* buf) const;
};
-class Signdef : public Typedef {
+class Signdef {
private:
intptr_t _staticCallBuf;
intptr_t _virtualCallBuf;
@@ -154,6 +152,8 @@
public:
std::vector<Typedef*> args;
Typedef* ret;
+ Jnjvm* isolate;
+ const UTF8* keyName;
const char* printString() const;
@@ -196,8 +196,20 @@
void setVirtualCallAP(intptr_t code) {
_virtualCallAP = code;
}
-
-
+
+
+ mvm::JITInfo* JInfo;
+ template<typename Ty>
+ Ty *getInfo() {
+ if (!JInfo) {
+ JInfo = new Ty(this);
+ }
+
+ assert((void*)dynamic_cast<Ty*>(JInfo) == (void*)JInfo &&
+ "Invalid concrete type or multiple inheritence for getInfo");
+ return static_cast<Ty*>(JInfo);
+ }
+
};
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=54726&r1=54725&r2=54726&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Wed Aug 13 04:17:42 2008
@@ -759,6 +759,19 @@
return res;
}
+Signdef* Jnjvm::constructSign(const UTF8* name) {
+ Signdef* res = javaSignatures->lookup(name);
+ if (res == 0) {
+ res = Signdef::signDup(name, this);
+ javaSignatures->lock->lock();
+ Signdef* tmp = javaSignatures->lookup(name);
+ if (tmp == 0) javaSignatures->hash(name, res);
+ else res = tmp;
+ javaSignatures->lock->unlock();
+ }
+ return res;
+}
+
CommonClass* Jnjvm::loadInClassLoader(const UTF8* name, JavaObject* loader) {
JavaString* str = this->UTF8ToStr(name);
JavaObject* obj = (JavaObject*)
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=54726&r1=54725&r2=54726&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Wed Aug 13 04:17:42 2008
@@ -47,6 +47,8 @@
class DelegateeMap;
class FieldMap;
class MethodMap;
+class Signdef;
+class SignMap;
class StaticInstanceMap;
class StringMap;
class TypeMap;
@@ -211,6 +213,7 @@
JavaString* asciizToStr(const char* asciiz);
JavaString* UTF8ToStr(const UTF8* utf8);
Typedef* constructType(const UTF8 * name);
+ Signdef* constructSign(const UTF8 * name);
JavaObject* getClassDelegatee(CommonClass*);
@@ -248,6 +251,7 @@
StringMap * hashStr;
ClassMap* bootstrapClasses;
TypeMap* javaTypes;
+ SignMap* javaSignatures;
#ifdef MULTIPLE_VM
StaticInstanceMap* statics;
DelegateeMap* delegatees;
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=54726&r1=54725&r2=54726&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Aug 13 04:17:42 2008
@@ -355,7 +355,7 @@
if (classDef->super) {
LLVMClassInfo* CLI =
- (LLVMClassInfo*)module->getClassInfo(classDef->super);
+ (LLVMClassInfo*)JnjvmModule::getClassInfo(classDef->super);
fields.push_back(CLI->getVirtualType()->getContainedType(0));
} else {
fields.push_back(JnjvmModule::JavaObjectType->getContainedType(0));
@@ -385,7 +385,7 @@
field->ptrOffset = sl->getElementOffset(field->num + 1);
}
- VirtualTable* VT = module->makeVT((Class*)classDef, false);
+ VirtualTable* VT = JnjvmModule::makeVT((Class*)classDef, false);
uint64 size = mvm::jit::getTypeSize(structType);
classDef->virtualSize = (uint32)size;
@@ -431,7 +431,7 @@
}
- VirtualTable* VT = module->makeVT((Class*)classDef, true);
+ VirtualTable* VT = JnjvmModule::makeVT((Class*)classDef, true);
uint64 size = mvm::jit::getTypeSize(structType);
cl->staticSize = size;
@@ -532,7 +532,7 @@
const FunctionType* LLVMMethodInfo::getFunctionType() {
if (!functionType) {
- LLVMSignatureInfo* LSI = module->getSignatureInfo(methodDef->getSignature());
+ LLVMSignatureInfo* LSI = JnjvmModule::getSignatureInfo(methodDef->getSignature());
assert(LSI);
if (isStatic(methodDef->access)) {
functionType = LSI->getStaticType();
@@ -545,7 +545,7 @@
ConstantInt* LLVMMethodInfo::getOffset() {
if (!offsetConstant) {
- module->resolveVirtualClass(methodDef->classDef);
+ JnjvmModule::resolveVirtualClass(methodDef->classDef);
offsetConstant = ConstantInt::get(Type::Int32Ty, methodDef->offset);
}
return offsetConstant;
@@ -554,9 +554,9 @@
ConstantInt* LLVMFieldInfo::getOffset() {
if (!offsetConstant) {
if (isStatic(fieldDef->access)) {
- module->resolveStaticClass(fieldDef->classDef);
+ JnjvmModule::resolveStaticClass(fieldDef->classDef);
} else {
- module->resolveVirtualClass(fieldDef->classDef);
+ JnjvmModule::resolveVirtualClass(fieldDef->classDef);
}
// Increment by one because zero is JavaObject
offsetConstant = ConstantInt::get(Type::Int32Ty, fieldDef->num + 1);
@@ -855,100 +855,7 @@
LCI->getStaticType();
}
-void JnjvmModule::removeClass(CommonClass* cl) {
- // Lock here because we may be called by a finalizer
- // (even if currently single threaded).
- llvm::MutexGuard locked(mvm::jit::executionEngine->lock);
- classMap.erase(cl);
-
- for (CommonClass::field_iterator i = cl->virtualFields.begin(),
- e = cl->virtualFields.end(); i!= e; ++i) {
- JavaField* field = i->second;
- fieldMap.erase(field);
- }
-
- for (CommonClass::field_iterator i = cl->staticFields.begin(),
- e = cl->staticFields.end(); i!= e; ++i) {
- JavaField* field = i->second;
- fieldMap.erase(field);
- }
-
- for (CommonClass::method_iterator i = cl->virtualMethods.begin(),
- e = cl->virtualMethods.end(); i!= e; ++i) {
- JavaMethod* meth = i->second;
- methodMap.erase(meth);
- }
-
- for (CommonClass::method_iterator i = cl->staticMethods.begin(),
- e = cl->staticMethods.end(); i!= e; ++i) {
- JavaMethod* meth = i->second;
- methodMap.erase(meth);
- }
-
-}
-
-LLVMCommonClassInfo* JnjvmModule::getClassInfo(CommonClass* cl) {
- class_iterator CI = classMap.find(cl);
- if (CI != classMap.end()) {
- return CI->second;
- } else {
- if (cl->isArray) {
- LLVMCommonClassInfo* LCI = new LLVMCommonClassInfo(cl, this);
- classMap.insert(std::make_pair(cl, LCI));
- return LCI;
- } else {
- LLVMClassInfo* LCI = new LLVMClassInfo((Class*)cl, this);
- classMap.insert(std::make_pair(cl, LCI));
- return LCI;
- }
- }
-}
-
-LLVMMethodInfo* JnjvmModule::getMethodInfo(JavaMethod* meth) {
- method_iterator MI = methodMap.find(meth);
- if (MI != methodMap.end()) {
- return MI->second;
- } else {
- LLVMMethodInfo* LMI = new LLVMMethodInfo(meth, this);
- methodMap.insert(std::make_pair(meth, LMI));
- return LMI;
- }
-}
-
-LLVMFieldInfo* JnjvmModule::getFieldInfo(JavaField* field) {
- field_iterator FI = fieldMap.find(field);
- if (FI != fieldMap.end()) {
- return FI->second;
- } else {
- LLVMFieldInfo* LFI = new LLVMFieldInfo(field, this);
- fieldMap.insert(std::make_pair(field, LFI));
- return LFI;
- }
-}
-
-LLVMSignatureInfo* JnjvmModule::getSignatureInfo(Signdef* sign) {
- signature_iterator SI = signatureMap.find(sign);
- if (SI != signatureMap.end()) {
- return SI->second;
- } else {
- LLVMSignatureInfo* LSI = new LLVMSignatureInfo(sign);
- signatureMap.insert(std::make_pair(sign, LSI));
- return LSI;
- }
-}
-
#ifdef SERVICE_VM
-LLVMServiceInfo* JnjvmModule::getServiceInfo(ServiceDomain* S) {
- service_iterator SI = serviceMap.find(S);
- if (SI != serviceMap.end()) {
- return SI->second;
- } else {
- LLVMServiceInfo* LSI = new LLVMServiceInfo(sign);
- serviceMap.insert(std::make_pair(S, LSI));
- return LSI;
- }
-}
-
Value* LLVMServiceInfo::getDelegatee(JavaJIT* jit) {
if (!delegateeGV) {
Constant* cons =
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=54726&r1=54725&r2=54726&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Wed Aug 13 04:17:42 2008
@@ -20,7 +20,10 @@
#include "llvm/Type.h"
#include "llvm/Value.h"
+#include "mvm/JIT.h"
+
#include "JavaClass.h"
+#include "JavaTypes.h"
namespace jnjvm {
@@ -46,13 +49,12 @@
};
-class LLVMCommonClassInfo {
+class LLVMCommonClassInfo : public mvm::JITInfo {
friend class JnjvmModule;
protected:
CommonClass* classDef;
- JnjvmModule* module;
private:
/// varGV - The LLVM global variable representing this class.
@@ -70,9 +72,8 @@
llvm::Value* getVar(JavaJIT* jit);
llvm::Value* getDelegatee(JavaJIT* jit);
- LLVMCommonClassInfo(CommonClass* cl, JnjvmModule* M) :
+ LLVMCommonClassInfo(CommonClass* cl) :
classDef(cl),
- module(M),
varGV(0)
#ifndef MULTIPLE_VM
,delegateeGV(0)
@@ -107,8 +108,8 @@
const llvm::Type* getVirtualType();
const llvm::Type* getStaticType();
- LLVMClassInfo(Class* cl, JnjvmModule* M) :
- LLVMCommonClassInfo((CommonClass*)cl, M),
+ LLVMClassInfo(CommonClass* cl) :
+ LLVMCommonClassInfo(cl),
virtualSizeConstant(0),
staticVarGV(0),
virtualTableGV(0),
@@ -118,10 +119,9 @@
staticType(0) {}
};
-class LLVMMethodInfo {
+class LLVMMethodInfo : public mvm::JITInfo {
private:
JavaMethod* methodDef;
- JnjvmModule* module;
llvm::Function* methodFunction;
llvm::ConstantInt* offsetConstant;
@@ -132,31 +132,28 @@
llvm::ConstantInt* getOffset();
const llvm::FunctionType* getFunctionType();
- LLVMMethodInfo(JavaMethod* M, JnjvmModule* Mo) :
+ LLVMMethodInfo(JavaMethod* M) :
methodDef(M),
- module(Mo),
methodFunction(0),
offsetConstant(0),
functionType(0) {}
};
-class LLVMFieldInfo {
+class LLVMFieldInfo : public mvm::JITInfo {
private:
JavaField* fieldDef;
- JnjvmModule* module;
llvm::ConstantInt* offsetConstant;
public:
llvm::ConstantInt* getOffset();
- LLVMFieldInfo(JavaField* F, JnjvmModule* M) :
+ LLVMFieldInfo(JavaField* F) :
fieldDef(F),
- module(M),
offsetConstant(0) {}
};
-class LLVMSignatureInfo {
+class LLVMSignatureInfo : public mvm::JITInfo {
private:
const llvm::FunctionType* staticType;
const llvm::FunctionType* virtualType;
@@ -216,7 +213,7 @@
};
#ifdef SERVICE_VM
-class LLVMServiceInfo {
+class LLVMServiceInfo : public mvm::JITInfo {
private:
ServiceDomain* vm;
llvm::GlobalVariable* delegateeGV;
@@ -229,31 +226,9 @@
class JnjvmModule : public llvm::Module {
friend class LLVMClassInfo;
private:
- std::map<const CommonClass*, LLVMCommonClassInfo*> classMap;
- std::map<const Signdef*, LLVMSignatureInfo*> signatureMap;
- std::map<const JavaField*, LLVMFieldInfo*> fieldMap;
- std::map<const JavaMethod*, LLVMMethodInfo*> methodMap;
-
-#ifdef SERVICE_VM
- std::map<const ServiceDomain*, LLVMServiceInfo*> serviceMap;
- typedef std::map<const ServiceDomain*, LLVMServiceInfo*>::iterator
- class_iterator;
-#endif
-
- typedef std::map<const CommonClass*, LLVMCommonClassInfo*>::iterator
- class_iterator;
- typedef std::map<const Signdef*, LLVMSignatureInfo*>::iterator
- signature_iterator;
-
- typedef std::map<const JavaMethod*, LLVMMethodInfo*>::iterator
- method_iterator;
-
- typedef std::map<const JavaField*, LLVMFieldInfo*>::iterator
- field_iterator;
-
- VirtualTable* makeVT(Class* cl, bool stat);
- VirtualTable* allocateVT(Class* cl, CommonClass::method_iterator meths);
+ static VirtualTable* makeVT(Class* cl, bool stat);
+ static VirtualTable* allocateVT(Class* cl, CommonClass::method_iterator meths);
public:
@@ -367,21 +342,37 @@
static void InitField(JavaField* field, JavaObject* obj, float val);
- void resolveVirtualClass(Class* cl);
- void resolveStaticClass(Class* cl);
- void setMethod(JavaMethod* meth, const char* name);
- void* getMethod(JavaMethod* meth);
-
- LLVMSignatureInfo* getSignatureInfo(Signdef*);
- LLVMCommonClassInfo* getClassInfo(CommonClass*);
- LLVMFieldInfo* getFieldInfo(JavaField*);
- LLVMMethodInfo* getMethodInfo(JavaMethod*);
+ static void resolveVirtualClass(Class* cl);
+ static void resolveStaticClass(Class* cl);
+ static void setMethod(JavaMethod* meth, const char* name);
+ static void* getMethod(JavaMethod* meth);
+
+ static LLVMSignatureInfo* getSignatureInfo(Signdef* sign) {
+ return sign->getInfo<LLVMSignatureInfo>();
+ }
+
+ static LLVMCommonClassInfo* getClassInfo(CommonClass* cl) {
+ if (cl->isArray || cl->isPrimitive) {
+ return cl->getInfo<LLVMCommonClassInfo>();
+ } else {
+ return cl->getInfo<LLVMClassInfo>();
+ }
+ }
+
+ static LLVMFieldInfo* getFieldInfo(JavaField* field) {
+ return field->getInfo<LLVMFieldInfo>();
+ }
+
+ static LLVMMethodInfo* getMethodInfo(JavaMethod* method) {
+ return method->getInfo<LLVMMethodInfo>();
+ }
+
#ifdef SERVICE_VM
- LLVMServiceInfo* getServiceInfo(ServiceDomain*);
+ static LLVMServiceInfo* getServiceInfo(ServiceDomain* service) {
+ return service->getInfo<LLVMServiceInfo>();
+ }
#endif
- void removeClass(CommonClass*);
-
explicit JnjvmModule(const std::string &ModuleID);
void initialise();
};
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=54726&r1=54725&r2=54726&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Wed Aug 13 04:17:42 2008
@@ -209,7 +209,7 @@
addPass(PM, createTailCallEliminationPass()); // Eliminate tail calls
addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs
- addPass(PM, createPredicateSimplifierPass());
+ //addPass(PM, createPredicateSimplifierPass());
addPass(PM, createReassociatePass()); // Reassociate expressions
addPass(PM, createLoopRotatePass());
addPass(PM, createLICMPass()); // Hoist loop invariants
Modified: vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h?rev=54726&r1=54725&r2=54726&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h Wed Aug 13 04:17:42 2008
@@ -209,6 +209,40 @@
};
+class SignMap {
+public:
+ mvm::Lock* lock;
+
+ std::map<const UTF8*, Signdef*, ltutf8> map;
+ typedef std::map<const UTF8*, Signdef*, ltutf8>::iterator iterator;
+
+ inline Signdef* lookup(const UTF8* V) {
+ lock->lock();
+ iterator End = map.end();
+ iterator I = map.find(V);
+ lock->unlock();
+ return I != End ? I->second : 0;
+ }
+
+ inline void hash(const UTF8* k, Signdef* c) {
+ lock->lock();
+ map.insert(std::make_pair(k, c));
+ lock->unlock();
+ }
+
+ SignMap() {
+ lock = mvm::Lock::allocRecursive();
+ }
+
+ ~SignMap() {
+ for (iterator i = map.begin(), e = map.end(); i!= e; ++i) {
+ delete i->second;
+ }
+ delete lock;
+ }
+
+};
+
class StaticInstanceMap :
public LockedMap<Class*, std::pair<JavaState, JavaObject*>*, std::less<Class*> > {
public:
Modified: vmkit/trunk/lib/JnJVM/VMCore/ServiceDomain.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/ServiceDomain.cpp?rev=54726&r1=54725&r2=54726&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/ServiceDomain.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/ServiceDomain.cpp Wed Aug 13 04:17:42 2008
@@ -82,6 +82,7 @@
service->loadedMethods = vm_new(service, MethodMap)();
service->loadedFields = vm_new(service, FieldMap)();
service->javaTypes = vm_new(service, TypeMap)();
+ service->javaSignatures = vm_new(service, SignMap)();
service->globalRefsLock = mvm::Lock::allocNormal();
#ifdef MULTIPLE_VM
service->statics = vm_new(service, StaticInstanceMap)();
More information about the vmkit-commits
mailing list