[vmkit-commits] [vmkit] r198234 - don't use llvm structures to find the field offsets
Gael Thomas
gael.thomas at lip6.fr
Mon Dec 30 10:34:44 PST 2013
Author: gthomas
Date: Mon Dec 30 12:34:44 2013
New Revision: 198234
URL: http://llvm.org/viewvc/llvm-project?rev=198234&view=rev
Log:
don't use llvm structures to find the field offsets
Modified:
vmkit/branches/mcjit/include/j3/j3class.h
vmkit/branches/mcjit/include/j3/j3codegen.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=198234&r1=198233&r2=198234&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Mon Dec 30 12:34:44 2013
@@ -138,8 +138,7 @@ namespace j3 {
const vmkit::Name* _name;
J3Type* _type;
J3Attributes* _attributes;
- uint32_t _num;
- uint32_t _offset;
+ uintptr_t _offset;
public:
J3Field() {}
@@ -151,7 +150,7 @@ namespace j3 {
const vmkit::Name* name() { return _name; }
J3Type* type() { return _type; }
- uint32_t num() { return _num; }
+ uintptr_t offset() { return _offset; }
void dump();
};
@@ -197,13 +196,13 @@ namespace j3 {
size_t _nbMethods;
J3Method** _methods;
- size_t _structSize;
+ uintptr_t _structSize;
public:
J3Layout(J3ClassLoader* loader, const vmkit::Name* name);
virtual bool isLayout() { return 1; }
- size_t structSize();
+ uintptr_t structSize();
size_t nbMethods() { return _nbMethods; }
J3Method** methods() { return _methods; }
Modified: vmkit/branches/mcjit/include/j3/j3codegen.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=198234&r1=198233&r2=198234&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3codegen.h (original)
+++ vmkit/branches/mcjit/include/j3/j3codegen.h Mon Dec 30 12:34:44 2013
@@ -112,6 +112,8 @@ namespace j3 {
void compareFP(bool isL);
void compareLong();
+ llvm::Value* fieldOffset(llvm::Value* obj, J3Field* f);
+
void get(llvm::Value* obj, J3Field* field);
void getField(uint32_t idx);
void getStatic(uint32_t idx);
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=198234&r1=198233&r2=198234&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Mon Dec 30 12:34:44 2013
@@ -246,7 +246,7 @@ J3StaticLayout::J3StaticLayout(J3ClassLo
J3Layout::J3Layout(J3ClassLoader* loader, const vmkit::Name* name) : J3ObjectType(loader, name) {
}
-size_t J3Layout::structSize() {
+uintptr_t J3Layout::structSize() {
return _structSize;
}
@@ -651,17 +651,15 @@ void J3Class::fillFields(std::vector<llv
if(J3Cst::isStatic(fields[i]->access())) {
//fprintf(stderr, " adding static field: %ls %ls::%ls\n", cur->type()->name()->cStr(), name()->cStr(), cur->name()->cStr());
- cur->_num = staticBody->size();
layout = &staticLayout;
staticBody->push_back(cur->type()->llvmType());
} else {
- cur->_num = virtualBody->size();
layout = this;
virtualBody->push_back(cur->type()->llvmType());
}
- layout->fields[layout->nbFields++] = *fields[i];
cur->_offset = layout->structSize();
layout->_structSize += 1 << fields[i]->type()->logSize();
+ layout->fields[layout->nbFields++] = *fields[i];
}
}
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=198234&r1=198233&r2=198234&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Mon Dec 30 12:34:44 2013
@@ -401,9 +401,15 @@ void J3CodeGen::invokeSpecial(uint32_t i
invoke(target, target->unsafe_llvmFunction(1, module(), cl));
}
+llvm::Value* J3CodeGen::fieldOffset(llvm::Value* obj, J3Field* f) {
+ llvm::Type* uintPtrTy = builder->getIntPtrTy(vm->dataLayout());
+ 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* gep[2] = { builder->getInt32(0), builder->getInt32(f->num()) };
- llvm::Value* res = flatten(builder->CreateLoad(builder->CreateGEP(src, gep)), f->type());
+ llvm::Value* res = flatten(builder->CreateLoad(fieldOffset(src, f)), f->type());
stack.push(res);
}
@@ -419,8 +425,7 @@ void J3CodeGen::getStatic(uint32_t idx)
}
void J3CodeGen::put(llvm::Value* dest, llvm::Value* val, J3Field* f) {
- llvm::Value* gep[2] = { builder->getInt32(0), builder->getInt32(f->num()) };
- builder->CreateStore(unflatten(val, f->type()), builder->CreateGEP(dest, gep));
+ builder->CreateStore(unflatten(val, f->type()), fieldOffset(dest, f));
}
void J3CodeGen::putStatic(uint32_t idx) {
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=198234&r1=198233&r2=198234&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Mon Dec 30 12:34:44 2013
@@ -416,19 +416,11 @@ J3ObjectHandle* J3ObjectHandle::doNewArr
} \
\
void J3ObjectHandle::set##name(J3Field* field, ctype value) { \
- const llvm::StructLayout* layout = \
- obj()->vt()->type()->loader()->vm()->dataLayout()-> \
- getStructLayout((llvm::StructType*)(field->layout()->llvmType()->getContainedType(0))); \
- uint32_t offset = layout->getElementOffset(field->num()); \
- rawSet##name(offset, value); \
+ rawSet##name(field->offset(), value); \
} \
\
ctype J3ObjectHandle::get##name(J3Field* field) { \
- const llvm::StructLayout* layout = \
- obj()->vt()->type()->loader()->vm()->dataLayout()-> \
- getStructLayout((llvm::StructType*)(field->layout()->llvmType()->getContainedType(0))); \
- uint32_t offset = layout->getElementOffset(field->num()); \
- return rawGet##name(offset); \
+ return rawGet##name(field->offset()); \
} \
\
void J3ObjectHandle::set##name##At(uint32_t idx, ctype value) { \
@@ -475,18 +467,11 @@ J3ObjectHandle* J3ObjectHandle::rawGetOb
}
void J3ObjectHandle::setObject(J3Field* field, J3ObjectHandle* value) {
- const llvm::StructLayout* layout =
- obj()->vt()->type()->loader()->vm()->dataLayout()->
- getStructLayout((llvm::StructType*)(field->layout()->llvmType()->getContainedType(0)));
- uint32_t offset = layout->getElementOffset(field->num());
- rawSetObject(offset, value);
+ rawSetObject(field->offset(), value);
}
J3ObjectHandle* J3ObjectHandle::getObject(J3Field* field) {
- const llvm::StructLayout* layout =
- obj()->vt()->type()->loader()->vm()->dataLayout()->
- getStructLayout((llvm::StructType*)(field->layout()->llvmType()->getContainedType(0)));
- return rawGetObject(layout->getElementOffset(field->num()));
+ return rawGetObject(field->offset());
}
void J3ObjectHandle::setObjectAt(uint32_t idx, J3ObjectHandle* value) {
More information about the vmkit-commits
mailing list