From 8073a38b8bfaad203eaa63f27dc4e55e0d31a3f5 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sat, 10 Jul 2021 14:35:29 +0800 Subject: [PATCH] Fix bug in link signal eval --- src/elab.c | 2 ++ src/eval.c | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/elab.c b/src/elab.c index ea59f5e2..a72d2bae 100644 --- a/src/elab.c +++ b/src/elab.c @@ -2764,6 +2764,7 @@ static void drv_extract(e_node_t proc, elab_ctx_t *ctx) case VCODE_OP_COND: case VCODE_OP_STORE: case VCODE_OP_STORE_INDIRECT: + case VCODE_OP_COPY: break; case VCODE_OP_RESOLVED: @@ -2779,6 +2780,7 @@ static void drv_extract(e_node_t proc, elab_ctx_t *ctx) case VCODE_OP_LOAD: case VCODE_OP_MOD: case VCODE_OP_ALLOCA: + case VCODE_OP_INDEX: { vcode_reg_t result = vcode_get_result(op); assert(result != VCODE_INVALID_REG); diff --git a/src/eval.c b/src/eval.c index 56b01b51..7cc6f612 100644 --- a/src/eval.c +++ b/src/eval.c @@ -475,8 +475,7 @@ void eval_cleanup_state(eval_state_t *state) eval_alloc_t *next, *current; eval_free_context(state->context); - for (current = state->allocations; current != NULL; current = next) - { + for (current = state->allocations; current != NULL; current = next) { next = current->next; free(current); } @@ -485,11 +484,13 @@ void eval_cleanup_state(eval_state_t *state) static value_t *eval_get_reg(vcode_reg_t reg, eval_state_t *state) { + assert(reg != VCODE_INVALID_REG); return &(state->context->regs[reg]); } static value_t *eval_get_var(vcode_var_t var, context_t *context) { + assert(var != VCODE_INVALID_VAR); value_t *value = &(context->vars[var]); if (value->kind == VALUE_HEAP_PROXY) return value->pointer; @@ -965,11 +966,11 @@ static void eval_ensure_parent_context(context_t *where, eval_state_t *state) where->parent = new_context; eval_state_t new_state = { - .context = new_context, - .result = -1, - .fcall = state->fcall, - .failed = false, - .flags = state->flags | EVAL_BOUNDS, + .context = new_context, + .result = -1, + .fcall = state->fcall, + .failed = false, + .flags = state->flags | EVAL_BOUNDS, .allocations = state->allocations, .generic_fn = state->generic_fn }; @@ -1872,8 +1873,8 @@ static void eval_op_debug_out(int op, eval_state_t *state) static void eval_op_link_signal(int op, eval_state_t *state) { - value_t *result = eval_get_reg(vcode_get_result(op), state); - result->kind = VALUE_INVALID; + value_t *var = eval_get_var(vcode_get_address(op), state->context); + var->kind = VALUE_INVALID; } static void eval_vcode(eval_state_t *state) -- 2.39.2