[vmkit-commits] [vmkit] r198231 - Compute my own field offsets

Gael Thomas gael.thomas at lip6.fr
Mon Dec 30 10:09:53 PST 2013


Author: gthomas
Date: Mon Dec 30 12:09:53 2013
New Revision: 198231

URL: http://llvm.org/viewvc/llvm-project?rev=198231&view=rev
Log:
Compute my own field offsets

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=198231&r1=198230&r2=198231&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Mon Dec 30 12:09:53 2013
@@ -443,13 +443,14 @@ void J3Class::doResolve(J3Field* hiddenF
 		if(super() == this) {
 			virtualBody[0] = loader()->vm()->typeJ3Object;
 		} else {
-			super()->resolve();
 			virtualBody[0] = super()->llvmType()->getContainedType(0);
 		}
 
 		llvm::cast<llvm::StructType>(llvmType()->getContainedType(0))->setBody(virtualBody);
 
-		_structSize = loader()->vm()->dataLayout()->getTypeAllocSize(llvmType()->getContainedType(0));
+		uint64_t kkk = loader()->vm()->dataLayout()->getTypeAllocSize(llvmType()->getContainedType(0));
+		if(kkk != structSize())
+			J3::internalError(L"should not happen");
 			
 		staticLayout._vt = J3VirtualTable::create(&staticLayout);
 
@@ -588,11 +589,21 @@ void J3Class::readClassBytes(std::vector
 	staticBody.push_back(loader()->vm()->typeJ3Object);
 	virtualBody->push_back(0);
 
+	if(super() == this)
+		_structSize = sizeof(J3Object);
+	else {
+		super()->resolve();
+		_structSize = super()->structSize();
+	}
+
 	fillFields(&staticBody, virtualBody, pFields3, i3);
 	fillFields(&staticBody, virtualBody, pFields2, i2);
 	fillFields(&staticBody, virtualBody, pFields1, i1);
 	fillFields(&staticBody, virtualBody, pFields0, i0);
 
+	_structSize = ((_structSize - 1) & -sizeof(uintptr_t)) + sizeof(uintptr_t);
+	staticLayout._structSize = ((staticLayout._structSize - 1) & -sizeof(uintptr_t)) + sizeof(uintptr_t);
+
 	staticLLVMType()->getContainedType(0);
 
 	llvm::cast<llvm::StructType>(staticLLVMType()->getContainedType(0))->setBody(staticBody);
@@ -654,7 +665,8 @@ void J3Class::fillFields(std::vector<llv
 			virtualBody->push_back(cur->type()->llvmType());
 		}
 		layout->fields[layout->nbFields++] = *fields[i];
-
+		cur->_offset = layout->structSize();
+		layout->_structSize += 1 << fields[i]->type()->logSize();
 	}
 }
 





More information about the vmkit-commits mailing list