[vmkit-commits] [vmkit] r84082 - in /vmkit/trunk/lib/N3/VMCore: CLIJit.cpp N3Initialise.cpp VMClass.cpp VMClass.h VMObject.cpp VMObject.h
Gael Thomas
gael.thomas at lip6.fr
Wed Oct 14 02:46:12 PDT 2009
Author: gthomas
Date: Wed Oct 14 04:46:11 2009
New Revision: 84082
URL: http://llvm.org/viewvc/llvm-project?rev=84082&view=rev
Log:
Define a new N3VirtualTable. Compute the real size of vt to dispatch virtual call with vt.
It will not be used for the moment.
Modified:
vmkit/trunk/lib/N3/VMCore/CLIJit.cpp
vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp
vmkit/trunk/lib/N3/VMCore/VMClass.cpp
vmkit/trunk/lib/N3/VMCore/VMClass.h
vmkit/trunk/lib/N3/VMCore/VMObject.cpp
vmkit/trunk/lib/N3/VMCore/VMObject.h
Modified: vmkit/trunk/lib/N3/VMCore/CLIJit.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIJit.cpp?rev=84082&r1=84081&r2=84082&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/CLIJit.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/CLIJit.cpp Wed Oct 14 04:46:11 2009
@@ -142,8 +142,9 @@
N3VirtualTable* CLIJit::makeArrayVT(VMClassArray* cl) {
- N3VirtualTable * res = (N3VirtualTable*)malloc(VT_SIZE);
- memcpy(res, VMObject::VT, VT_SIZE);
+ VMClass *super = (VMClass*)cl->super;
+ N3VirtualTable * res = new(super->vtSize) N3VirtualTable(super->virtualInstance->getN3VirtualTable(), super->vtSize);
+
#ifdef WITH_TRACER
Function* func = Function::Create(markAndTraceLLVMType,
GlobalValue::ExternalLinkage,
@@ -250,8 +251,13 @@
}
N3VirtualTable* CLIJit::makeVT(VMClass* cl, bool stat) {
- N3VirtualTable * res = (N3VirtualTable*)malloc(VT_SIZE);
- memcpy(res, VMObject::VT, VT_SIZE);
+ int n = N3VirtualTable::baseVtSize();
+ N3VirtualTable * res =
+ stat || !cl->super ?
+ new(n) N3VirtualTable(VMObject::VT, n) :
+ new(cl->vtSize) N3VirtualTable(((VMClass *)cl->super)->virtualInstance->getN3VirtualTable(), n, cl->vtSize);
+
+
#ifdef WITH_TRACER
const Type* type = stat ? cl->staticType : cl->virtualType;
std::vector<VMField*> &fields = stat ? cl->staticFields : cl->virtualFields;
Modified: vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp?rev=84082&r1=84081&r2=84082&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp Wed Oct 14 04:46:11 2009
@@ -263,6 +263,7 @@
N3::testInfinity = vm->asciizToUTF8("TestInfinity");
MSCorlib::pArray->resolveType(1, 0, 0);
+ MSCorlib::pArray->resolveVT();
MSCorlib::initialise(vm);
}
Modified: vmkit/trunk/lib/N3/VMCore/VMClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.cpp?rev=84082&r1=84081&r2=84082&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMClass.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VMClass.cpp Wed Oct 14 04:46:11 2009
@@ -453,31 +453,40 @@
void VMCommonClass::resolveVT() {
VMCommonClass* cl = this;
- if (cl->isArray) {
- VMClassArray* arrayCl = (VMClassArray*)cl;
- arrayCl->baseClass->resolveVT();
- arrayCl->arrayVT = CLIJit::makeArrayVT(arrayCl);
- } else if (cl->isPointer) {
- } else {
- VMClass* cl = (VMClass*)this;
- if (super) super->resolveVT();
-
- // We check for virtual instance because the string class has a
- // bigger size than the class declares.
- if (super != MSCorlib::pEnum && !cl->virtualInstance) {
- N3VirtualTable* VT = CLIJit::makeVT(cl, false);
-
- uint64 size = mvm::MvmModule::getTypeSize(cl->virtualType->getContainedType(0));
- cl->virtualInstance = (VMObject*)gc::operator new(size, VT);
- cl->virtualInstance->initialise(cl);
+ if (cl->isArray) {
+ VMClassArray* arrayCl = (VMClassArray*)cl;
+ arrayCl->baseClass->resolveVT();
+ // printf("Making vt of %s\n", mvm::PrintBuffer(this).cString());
+ arrayCl->arrayVT = CLIJit::makeArrayVT(arrayCl);
+ } else if (cl->isPointer) {
+ } else {
+ VMClass* cl = (VMClass*)this;
+ if (super)
+ super->resolveVT();
+
+ // We check for virtual instance because the string class has a
+ // bigger size than the class declares.
+ if (super != MSCorlib::pEnum && !cl->virtualInstance) {
+ cl->vtSize = super ? ((VMClass*)super)->vtSize : sizeof(N3VirtualTable) / sizeof(uintptr_t);
+ for (std::vector<VMMethod*>::iterator i = virtualMethods.begin(),
+ e = virtualMethods.end(); i!= e; ++i) {
+ (*i)->offsetInVt = cl->vtSize++;
+ }
- for (std::vector<VMField*>::iterator i = cl->virtualFields.begin(),
- e = cl->virtualFields.end(); i!= e; ++i) {
-
- (*i)->initField(cl->virtualInstance);
- }
- }
- }
+ // printf("Making vt of %s with %d elements\n", mvm::PrintBuffer(this).cString(), cl->vtSize);
+ N3VirtualTable* VT = CLIJit::makeVT(cl, false);
+
+ uint64 size = mvm::MvmModule::getTypeSize(cl->virtualType->getContainedType(0));
+ cl->virtualInstance = (VMObject*)gc::operator new(size, VT);
+ cl->virtualInstance->initialise(cl);
+
+ for (std::vector<VMField*>::iterator i = cl->virtualFields.begin(),
+ e = cl->virtualFields.end(); i!= e; ++i) {
+
+ (*i)->initField(cl->virtualInstance);
+ }
+ }
+ }
}
void VMCommonClass::resolveType(bool stat, bool clinit, VMGenericMethod* genMethod) {
Modified: vmkit/trunk/lib/N3/VMCore/VMClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.h?rev=84082&r1=84081&r2=84082&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMClass.h (original)
+++ vmkit/trunk/lib/N3/VMCore/VMClass.h Wed Oct 14 04:46:11 2009
@@ -147,6 +147,7 @@
std::vector<VMClass*> innerClasses;
VMClass* outerClass;
std::vector<VMMethod*> genericMethods;
+ uint32 vtSize; // in number of methods
VMObject* operator()();
VMObject* doNew();
@@ -201,7 +202,8 @@
public:
virtual void print(mvm::PrintBuffer* buf) const;
virtual void TRACER;
-
+
+ uint32 offsetInVt;
uint32 flags;
uint32 offsetInTextSection;
uint32 implFlags;
Modified: vmkit/trunk/lib/N3/VMCore/VMObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMObject.cpp?rev=84082&r1=84081&r2=84082&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMObject.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VMObject.cpp Wed Oct 14 04:46:11 2009
@@ -18,6 +18,27 @@
using namespace n3;
+void *N3VirtualTable::operator new(size_t size, size_t totalVtSize) {
+ //printf("Allocate N3VirtualTable with %d elements\n", totalVtSize);
+ return malloc(totalVtSize * sizeof(uintptr_t));
+}
+
+N3VirtualTable::N3VirtualTable() {
+}
+
+N3VirtualTable::N3VirtualTable(N3VirtualTable *baseVt, uint32 baseVtSize, uint32 totalSize) {
+ memcpy(this, baseVt, baseVtSize * sizeof(uintptr_t));
+}
+
+N3VirtualTable::N3VirtualTable(uintptr_t d, uintptr_t o, uintptr_t t, uintptr_t p, uintptr_t h) : VirtualTable(d, o, t) {
+ print = p;
+ hashcode = h;
+}
+
+uint32 N3VirtualTable::baseVtSize() {
+ return sizeof(N3VirtualTable) / sizeof(uintptr_t);
+}
+
void VMObject::initialise(VMCommonClass* cl) {
this->classOf = cl;
this->lockObj = 0;
Modified: vmkit/trunk/lib/N3/VMCore/VMObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMObject.h?rev=84082&r1=84081&r2=84082&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMObject.h (original)
+++ vmkit/trunk/lib/N3/VMCore/VMObject.h Wed Oct 14 04:46:11 2009
@@ -34,10 +34,13 @@
uintptr_t print;
uintptr_t hashcode;
- N3VirtualTable(uintptr_t d, uintptr_t o, uintptr_t t, uintptr_t p, uintptr_t h) : VirtualTable(d, o, t) {
- print = p;
- hashcode = h;
- }
+ void *operator new(size_t size, size_t totalVtSize);
+
+ N3VirtualTable();
+ N3VirtualTable(N3VirtualTable *vmobjVt, uint32 baseVtSize, uint32 totalVtSize=-1);
+ N3VirtualTable(uintptr_t d, uintptr_t o, uintptr_t t, uintptr_t p, uintptr_t h);
+
+ static uint32 baseVtSize();
};
class LockObj : public mvm::Object {
@@ -90,6 +93,8 @@
bool instanceOf(VMCommonClass* cl);
+ N3VirtualTable *getN3VirtualTable() { return (N3VirtualTable*)getVirtualTable(); }
+
#ifdef SIGSEGV_THROW_NULL
#define verifyNull(obj) {}
#else
More information about the vmkit-commits
mailing list