From 248372db80ef089cbb5e136067d0a614ef5c8c99 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Tue, 6 Feb 2018 18:15:03 +0000 Subject: [PATCH] Pass resolution function as part of size list. Issue #202 --- src/cgen.c | 19 ++++++++++--------- src/rt/rtkern.c | 13 ++++++++----- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/cgen.c b/src/cgen.c index aeacb254..1b28ed09 100644 --- a/src/cgen.c +++ b/src/cgen.c @@ -192,6 +192,7 @@ static LLVMTypeRef llvm_size_list_type(void) LLVMTypeRef struct_elems[] = { LLVMInt32Type(), LLVMInt32Type(), + llvm_void_ptr() }; return LLVMStructType(struct_elems, ARRAY_LEN(struct_elems), false); } @@ -1741,6 +1742,13 @@ static void cgen_op_set_initial(int op, cgen_ctx_t *ctx) llvm_int32(size_list.count), "size_list"); + LLVMValueRef resolution = NULL; + const vcode_res_fn_t *rdata = vcode_get_resolution(op); + if (rdata != NULL) + resolution = cgen_resolution_wrapper(rdata->element[0].name, rdata->element[0].type); + else + resolution = LLVMConstNull(llvm_void_ptr()); + for (unsigned i = 0; i < size_list.count; i++) { LLVMValueRef offset[] = { llvm_int32(i) }; LLVMValueRef elemptr = LLVMBuildGEP(builder, list_mem, offset, 1, ""); @@ -1749,18 +1757,13 @@ static void cgen_op_set_initial(int op, cgen_ctx_t *ctx) LLVMBuildStructGEP(builder, elemptr, 0, "")); LLVMBuildStore(builder, llvm_int32(size_list.items[i].count), LLVMBuildStructGEP(builder, elemptr, 1, "")); + LLVMBuildStore(builder, resolution, + LLVMBuildStructGEP(builder, elemptr, 2, "")); } // Assuming array nets are sequential netid_t nid = vcode_signal_nets(sig)[0]; - LLVMValueRef resolution = NULL; - const vcode_res_fn_t *rdata = vcode_get_resolution(op); - if (rdata != NULL) - resolution = cgen_resolution_wrapper(rdata->element[0].name, rdata->element[0].type); - else - resolution = LLVMConstNull(llvm_void_ptr()); - const char *sig_name = istr(vcode_signal_name(sig)); const char *global_name LOCAL = xasprintf("%s.name", sig_name); LLVMValueRef name_ll = LLVMGetNamedGlobal(module, global_name); @@ -1780,7 +1783,6 @@ static void cgen_op_set_initial(int op, cgen_ctx_t *ctx) llvm_void_cast(valptr), list_mem, llvm_int32(size_list.count), - resolution, llvm_void_cast(name_ll) }; LLVMBuildCall(builder, llvm_fn("_set_initial"), args, ARRAY_LEN(args), ""); @@ -3487,7 +3489,6 @@ static LLVMValueRef cgen_support_fn(const char *name) llvm_void_ptr(), LLVMPointerType(llvm_size_list_type(), 0), LLVMInt32Type(), - llvm_void_ptr(), LLVMPointerType(LLVMInt8Type(), 0) }; fn = LLVMAddFunction(module, "_set_initial", diff --git a/src/rt/rtkern.c b/src/rt/rtkern.c index bd23c9ed..aba71c2a 100644 --- a/src/rt/rtkern.c +++ b/src/rt/rtkern.c @@ -220,6 +220,7 @@ struct rt_loc { struct size_list { uint32_t size; uint32_t count; + void *resolution; }; typedef enum { @@ -608,7 +609,7 @@ void _needs_last_value(const int32_t *nids, int32_t n) DLLEXPORT void _set_initial(int32_t nid, const uint8_t *values, const size_list_t *size_list, int32_t nparts, - void *resolution, const char *name) + const char *name) { tree_t decl = rt_recall_decl(name); RT_ASSERT(tree_kind(decl) == T_SIGNAL_DECL); @@ -616,10 +617,6 @@ void _set_initial(int32_t nid, const uint8_t *values, TRACE("_set_initial %s values=%s nparts=%d", name, fmt_values(values, size_list[0].count * size_list[1].size), nparts); - res_memo_t *memo = NULL; - if (resolution != NULL) - memo = rt_memo_resolution_fn(tree_type(decl), resolution); - int total_size = 0; for (int i = 0; i < nparts; i++) total_size += size_list[i].size * size_list[i].count; @@ -627,6 +624,8 @@ void _set_initial(int32_t nid, const uint8_t *values, uint8_t *res_mem = xmalloc(total_size * 2); uint8_t *last_mem = res_mem + total_size; + type_t type = tree_type(decl); + const uint8_t *src = values; int offset = 0, part = 0, remain = size_list[0].count; while (part < nparts) { @@ -638,6 +637,10 @@ void _set_initial(int32_t nid, const uint8_t *values, RT_ASSERT(g->sig_decl == NULL); RT_ASSERT(remain >= g->length); + res_memo_t *memo = NULL; + if (size_list[part].resolution != NULL) + memo = rt_memo_resolution_fn(type, size_list[part].resolution); + g->sig_decl = decl; g->resolution = memo; g->size = size; -- 2.39.2