#include void scc_ir_type_init(scc_ir_type_t *in, scc_ir_type_tag_t tag) { Assert(in != nullptr); in->tag = tag; in->name = nullptr; switch (tag) { case SCC_IR_TYPE_unknown: case SCC_IR_TYPE_void: case SCC_IR_TYPE_i8: case SCC_IR_TYPE_i16: case SCC_IR_TYPE_i32: case SCC_IR_TYPE_i64: case SCC_IR_TYPE_i128: case SCC_IR_TYPE_u8: case SCC_IR_TYPE_u16: case SCC_IR_TYPE_u32: case SCC_IR_TYPE_u64: case SCC_IR_TYPE_u128: case SCC_IR_TYPE_f16: case SCC_IR_TYPE_f32: case SCC_IR_TYPE_f64: case SCC_IR_TYPE_f128: break; case SCC_IR_TYPE_ARRAY: in->data.array.base = 0; in->data.array.len = 0; break; case SCC_IR_TYPE_PTR: in->data.pointer.base = 0; break; case SCC_IR_TYPE_FUNC: scc_vec_init(in->data.function.params); in->data.function.ret_type = 0; break; case SCC_IR_TYPE_UNION: case SCC_IR_TYPE_STRUCT: scc_vec_init(in->data.aggregate.fields); break; default: UNREACHABLE(); break; } } void scc_ir_bblock_init(scc_ir_bblock_t *in, const char *label) { Assert(in != nullptr); Assert(label != nullptr); in->label = label; scc_vec_init(in->instrs); } void scc_ir_func_init(scc_ir_func_t *in, const char *name) { Assert(in != nullptr); Assert(name != nullptr); in->name = name; in->type = 0; scc_vec_init(in->bblocks); scc_vec_init(in->params); } void scc_ir_value_init(scc_ir_value_t *in, const char *name, scc_ir_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_IR_VALUE_TAG_NULLPTR: break; case SCC_IR_VALUE_TAG_BUILTIN: break; case SCC_IR_VALUE_TAG_CONST_INT: // TODO in->data.const_int.int64 = 0; break; case SCC_IR_VALUE_TAG_ALLOC: // TODO(); break; case SCC_IR_VALUE_TAG_LOAD: in->data.load.target = 0; break; case SCC_IR_VALUE_TAG_STORE: in->data.store.target = 0; in->data.store.value = 0; break; case SCC_IR_VALUE_TAG_GET_ELEM_PTR: in->data.get_elem_ptr.src_addr = 0; in->data.get_elem_ptr.index = 0; break; case SCC_IR_VALUE_TAG_OP: in->data.op.op = SCC_IR_OP_EMPTY; in->data.op.lhs = 0; in->data.op.rhs = 0; break; case SCC_IR_VALUE_TAG_BRANCH: in->data.branch.cond = 0; in->data.branch.true_bblock = 0; in->data.branch.false_bblock = 0; break; case SCC_IR_VALUE_TAG_JUMP: in->data.jump.target_bblock = 0; break; case SCC_IR_VALUE_TAG_CALL: scc_vec_init(in->data.call.args); in->data.call.callee = 0; break; case SCC_IR_VALUE_TAG_RET: in->data.ret.ret_val = 0; break; default: UNREACHABLE(); break; } }