#include void scc_hir_type_init(scc_hir_type_t *in, scc_hir_type_tag_t tag) { Assert(in != nullptr); in->tag = tag; in->name = nullptr; switch (tag) { case SCC_HIR_TYPE_unknown: case SCC_HIR_TYPE_void: case SCC_HIR_TYPE_i8: case SCC_HIR_TYPE_i16: case SCC_HIR_TYPE_i32: case SCC_HIR_TYPE_i64: case SCC_HIR_TYPE_i128: case SCC_HIR_TYPE_u8: case SCC_HIR_TYPE_u16: case SCC_HIR_TYPE_u32: case SCC_HIR_TYPE_u64: case SCC_HIR_TYPE_u128: case SCC_HIR_TYPE_f16: case SCC_HIR_TYPE_f32: case SCC_HIR_TYPE_f64: case SCC_HIR_TYPE_f128: break; case SCC_HIR_TYPE_ARRAY: in->data.array.base = 0; in->data.array.len = 0; break; case SCC_HIR_TYPE_PTR: in->data.pointer.base = 0; break; case SCC_HIR_TYPE_FUNC: scc_vec_init(in->data.function.params); in->data.function.ret_type = 0; break; case SCC_HIR_TYPE_UNION: case SCC_HIR_TYPE_STRUCT: scc_vec_init(in->data.aggregate.fields); break; default: UNREACHABLE(); break; } } void scc_hir_bblock_init(scc_hir_bblock_t *in, const char *label) { Assert(in != nullptr); Assert(label != nullptr); in->name = label; scc_vec_init(in->values); } void scc_hir_func_init(scc_hir_func_t *in, const char *name) { Assert(in != nullptr); Assert(name != nullptr); in->name = name; scc_hir_func_meta_t *meta = SCC_HIR_FUNC_META(in); meta->type = SCC_HIR_REF_nullptr; scc_vec_init(in->bblocks); scc_vec_init(meta->params); } void scc_hir_value_init(scc_hir_value_t *in, const char *name, scc_hir_value_tag_t tag) { Assert(in != nullptr); in->name = name; in->tag = tag; scc_vec_init(in->used_by); in->type = 0; switch (tag) { case SCC_HIR_VALUE_TAG_NULLPTR: break; case SCC_HIR_VALUE_TAG_BUILTIN: break; case SCC_HIR_VALUE_TAG_INTEGER: scc_ap_init(&in->data.integer); break; case SCC_HIR_VALUE_TAG_ALLOC: // TODO(); break; case SCC_HIR_VALUE_TAG_LOAD: in->data.load.target = 0; break; case SCC_HIR_VALUE_TAG_STORE: in->data.store.target = 0; in->data.store.value = 0; break; case SCC_HIR_VALUE_TAG_GET_ELEM_PTR: in->data.get_elem_ptr.src_addr = 0; in->data.get_elem_ptr.index = 0; break; case SCC_HIR_VALUE_TAG_OP: in->data.op.op = SCC_HIR_OP_EMPTY; in->data.op.lhs = 0; in->data.op.rhs = 0; break; case SCC_HIR_VALUE_TAG_BRANCH: in->data.branch.cond = 0; in->data.branch.true_bblock = 0; in->data.branch.false_bblock = 0; break; case SCC_HIR_VALUE_TAG_JUMP: in->data.jump.target_bblock = 0; break; case SCC_HIR_VALUE_TAG_CALL: scc_vec_init(in->data.call.args); in->data.call.callee = 0; break; case SCC_HIR_VALUE_TAG_RET: in->data.ret.ret_val = 0; break; default: UNREACHABLE(); break; } }