From a1dd909bc416de49524618913b72edc9f9f7456f Mon Sep 17 00:00:00 2001 From: whitequark Date: Thu, 25 Feb 2016 01:44:05 +0000 Subject: [PATCH] Take alignment into account during attribute writeback (fixes #293). --- artiq/compiler/transforms/llvm_ir_generator.py | 8 ++++++-- artiq/runtime/ksupport.c | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/artiq/compiler/transforms/llvm_ir_generator.py b/artiq/compiler/transforms/llvm_ir_generator.py index 37ad5add4..6f8e0633a 100644 --- a/artiq/compiler/transforms/llvm_ir_generator.py +++ b/artiq/compiler/transforms/llvm_ir_generator.py @@ -443,7 +443,7 @@ class LLVMIRGenerator: lldatalayout = llvm.create_target_data(self.llmodule.data_layout) llrpcattrty = self.llcontext.get_identified_type("attr_desc") - llrpcattrty.elements = [lli32, llptr, llptr] + llrpcattrty.elements = [lli32, lli32, llptr, llptr] lldescty = self.llcontext.get_identified_type("type_desc") lldescty.elements = [llrpcattrty.as_pointer().as_pointer(), llptr.as_pointer()] @@ -459,7 +459,10 @@ class LLVMIRGenerator: type_name = "instance.{}".format(typ.name) def llrpcattr_of_attr(name, typ): - size = self.llty_of_type(typ).get_abi_size(lldatalayout, context=self.llcontext) + size = self.llty_of_type(typ). \ + get_abi_size(lldatalayout, context=self.llcontext) + alignment = self.llty_of_type(typ). \ + get_abi_alignment(lldatalayout, context=self.llcontext) def rpc_tag_error(typ): print(typ) @@ -476,6 +479,7 @@ class LLVMIRGenerator: name="attr.{}.{}".format(type_name, name)) llrpcattr.initializer = ll.Constant(llrpcattrty, [ ll.Constant(lli32, size), + ll.Constant(lli32, alignment), llrpctag, self.llstr_of_str(name) ]) diff --git a/artiq/runtime/ksupport.c b/artiq/runtime/ksupport.c index c8a0f24db..d5825f746 100644 --- a/artiq/runtime/ksupport.c +++ b/artiq/runtime/ksupport.c @@ -407,6 +407,7 @@ int recv_rpc(void *slot) { struct attr_desc { uint32_t size; + uint32_t alignment; const char *tag; const char *name; }; @@ -434,6 +435,9 @@ void attribute_writeback(void *utypes) { while(*attrs) { struct attr_desc *attr = *attrs++; + if(offset % attr->alignment != 0) + offset += attr->alignment - (offset % attr->alignment); + if(attr->tag) { uintptr_t value = (uintptr_t)object + offset; send_rpc(0, attr->tag, &object, &attr->name, value);