#ifndef __SCC_IR_DEF_H__ #define __SCC_IR_DEF_H__ #include typedef unsigned int ir_handle_t; typedef const char *scc_ir_label_t; typedef struct scc_ir_node scc_ir_node_t; typedef ir_handle_t scc_ir_node_ref_t; typedef SCC_VEC(scc_ir_node_ref_t) scc_ir_node_ref_vec_t; typedef struct scc_ir_type scc_ir_type_t; typedef ir_handle_t scc_ir_type_ref_t; typedef SCC_VEC(scc_ir_type_ref_t) scc_ir_type_ref_vec_t; typedef struct scc_ir_bblock scc_ir_bblock_t; typedef ir_handle_t scc_ir_bblock_ref_t; typedef SCC_VEC(scc_ir_bblock_ref_t) scc_ir_bblock_ref_vec_t; typedef struct scc_ir_func scc_ir_func_t; typedef ir_handle_t scc_ir_func_ref_t; typedef SCC_VEC(scc_ir_func_ref_t) scc_ir_func_ref_vec_t; typedef enum scc_ir_type_tag { SCC_IR_TYPE_VOID, SCC_IR_TYPE_I1, SCC_IR_TYPE_I8, SCC_IR_TYPE_I16, SCC_IR_TYPE_I32, SCC_IR_TYPE_I64, SCC_IR_TYPE_I128, SCC_IR_TYPE_F16, SCC_IR_TYPE_F32, SCC_IR_TYPE_F64, SCC_IR_TYPE_F128, SCC_IR_TYPE_PTR, SCC_IR_TYPE_ARRAY, SCC_IR_TYPE_FUNC, SCC_IR_TYPE_STRUCT, SCC_IR_TYPE_VECTOR, } scc_ir_type_tag_t; struct scc_ir_type { scc_ir_type_tag_t tag; // int size; // 字节大小 // int align; // 对齐要求 union { struct { scc_ir_type_ref_t base; usize len; // TODO usize is target dependent } array; struct { scc_ir_type_ref_t base; } pointer; struct { scc_ir_type_ref_vec_t params; scc_ir_type_ref_t ret_type; } function; } data; }; struct scc_ir_bblock { scc_ir_label_t label; scc_ir_node_ref_vec_t instrs; // ir_arr_t used_by; }; // basic block struct scc_ir_func { scc_ir_label_t name; scc_ir_type_ref_t type; scc_ir_node_ref_vec_t params; scc_ir_bblock_ref_vec_t bblocks; }; typedef enum scc_ir_node_tag { SCC_IR_NODE_NULL, SCC_IR_NODE_CONST_INT, SCC_IR_NODE_ALLOC, SCC_IR_NODE_LOAD, SCC_IR_NODE_STORE, SCC_IR_NODE_GET_PTR, SCC_IR_NODE_OP, SCC_IR_NODE_BRANCH, SCC_IR_NODE_JUMP, SCC_IR_NODE_CALL, SCC_IR_NODE_RET, } scc_ir_node_tag_t; typedef enum { /// Empty op for init or nop IR_OP_EMPTY, /// Not equal to. IR_OP_NEQ, /// Equal to. IR_OP_EQ, /// Greater than. IR_OP_GT, /// Less than. IR_OP_LT, /// Greater than or equal to. IR_OP_GE, /// Less than or equal to. IR_OP_LE, /// Addition. IR_OP_ADD, /// Subtraction. IR_OP_SUB, /// Multiplication. IR_OP_MUL, /// Division. IR_OP_DIV, /// Modulo. IR_OP_MOD, /// Bitwise AND. IR_OP_AND, /// Bitwise OR. IR_OP_OR, /// Bitwise XOR. IR_OP_XOR, /// Bitwise NOT. IR_OP_NOT, /// Shift left logical. IR_OP_SHL, /// Shift right logical. IR_OP_SHR, /// Shift right arithmetic. IR_OP_SAR, } scc_ir_op_type_t; struct scc_ir_node { scc_ir_type_ref_t type; scc_ir_label_t name; scc_ir_node_ref_vec_t used_by; scc_ir_node_tag_t tag; union { union { i8 int8; i16 int16; i32 int32; i64 int64; // TODO int128 i8 int_any[16]; } const_int; union { u8 uint8; u16 uint16; u32 uint32; u64 uint64; // TODO uint128; u8 uint_any[16]; } const_uint; // aggregate; // func_arg_ref; // block_arg_ref; // global_alloc; struct { scc_ir_node_ref_t target; } load; struct { scc_ir_node_ref_t target; scc_ir_node_ref_t value; } store; struct { scc_ir_node_ref_t src_addr; scc_ir_node_ref_t index; } get_ptr; struct { scc_ir_node_ref_t src_addr; scc_ir_node_ref_t index; } get_elem_ptr; struct { scc_ir_op_type_t op; scc_ir_node_ref_t lhs; scc_ir_node_ref_t rhs; } op; struct { scc_ir_node_ref_t cond; scc_ir_bblock_ref_t true_bblock; scc_ir_bblock_ref_t false_bblock; } branch; struct { scc_ir_bblock_ref_t target_bblock; } jump; struct { scc_ir_func_ref_t callee; scc_ir_node_ref_vec_t args; } call; struct { scc_ir_node_ref_t ret_val; } ret; } data; }; typedef struct scc_ir_cprog { scc_ir_node_ref_vec_t global_vals; scc_ir_func_ref_vec_t func_defs; scc_ir_node_ref_vec_t func_decls; } scc_ir_cprog_t; #endif /* __SCC_IR_DEF_H__ */