[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