#ifndef __SCC_HIR_DEF_H__ #define __SCC_HIR_DEF_H__ #include #include #include #define SCC_HIR_REF_nullptr SCC_CFG_ID_nullptr typedef SCC_VEC(u8) scc_hir_buffer_t; typedef scc_cfg_bblock_t scc_hir_bblock_t; typedef scc_cfg_bblock_id_t scc_hir_bblock_ref_t; typedef SCC_VEC(scc_hir_bblock_ref_t) scc_hir_bblock_ref_vec_t; typedef scc_cfg_func_t scc_hir_func_t; typedef scc_cfg_func_id_t scc_hir_func_ref_t; typedef SCC_VEC(scc_hir_func_ref_t) scc_hir_func_ref_vec_t; typedef struct scc_hir_value scc_hir_value_t; typedef scc_cfg_id_t scc_hir_value_ref_t; typedef SCC_VEC(scc_hir_value_ref_t) scc_hir_value_ref_vec_t; typedef struct scc_hir_type scc_hir_type_t; typedef scc_cfg_id_t scc_hir_type_ref_t; typedef SCC_VEC(scc_hir_type_ref_t) scc_hir_type_ref_vec_t; typedef enum scc_hir_type_tag { SCC_HIR_TYPE_unknown, SCC_HIR_TYPE_void, SCC_HIR_TYPE_i8, SCC_HIR_TYPE_i16, SCC_HIR_TYPE_i32, SCC_HIR_TYPE_i64, SCC_HIR_TYPE_i128, SCC_HIR_TYPE_u8, SCC_HIR_TYPE_u16, SCC_HIR_TYPE_u32, SCC_HIR_TYPE_u64, SCC_HIR_TYPE_u128, SCC_HIR_TYPE_f16, SCC_HIR_TYPE_f32, SCC_HIR_TYPE_f64, SCC_HIR_TYPE_f128, SCC_HIR_TYPE_PTR, SCC_HIR_TYPE_ARRAY, SCC_HIR_TYPE_FUNC, SCC_HIR_TYPE_STRUCT, SCC_HIR_TYPE_UNION, SCC_HIR_TYPE_VECTOR, // TODO SIMD } scc_hir_type_tag_t; struct scc_hir_type { scc_hir_type_tag_t tag; const char *name; // For Debug union { struct { scc_hir_type_ref_t base; usize len; // TODO usize is target dependent } array; struct { scc_hir_type_ref_t base; } pointer; struct { scc_hir_type_ref_vec_t fields; } aggregate; struct { scc_hir_type_ref_vec_t params; scc_hir_type_ref_t ret_type; } function; } data; }; typedef enum scc_hir_value_tag { SCC_HIR_VALUE_TAG_NULLPTR, SCC_HIR_VALUE_TAG_BUILTIN, SCC_HIR_VALUE_TAG_INTEGER, SCC_HIR_VALUE_TAG_DECIMAL, SCC_HIR_VALUE_TAG_ARRAY, SCC_HIR_VALUE_TAG_AGGREGATE, ///< 聚合值 SCC_HIR_VALUE_TAG_CONV, ///< 类型转换 SCC_HIR_VALUE_TAG_FUNC_ARG_REF, ///< 函数参数引用 SCC_HIR_VALUE_TAG_BLOCK_ARG_REF, ///< 基本块参数引用 SCC_HIR_VALUE_TAG_ALLOC, ///< 分配内存 SCC_HIR_VALUE_TAG_GLOBAL_ALLOC, ///< 全局分配 SCC_HIR_VALUE_TAG_LOAD, ///< 加载数据 SCC_HIR_VALUE_TAG_STORE, ///< 存储数据 SCC_HIR_VALUE_TAG_GET_ELEM_PTR, ///< 获取元素指针 SCC_HIR_VALUE_TAG_OP, ///< 二元运算 SCC_HIR_VALUE_TAG_BRANCH, ///< 有条件分支 SCC_HIR_VALUE_TAG_JUMP, ///< 无条件跳转 SCC_HIR_VALUE_TAG_CALL, ///< 调用函数 SCC_HIR_VALUE_TAG_RET, ///< 函数返回 } scc_hir_value_tag_t; typedef enum { /// Empty op for init or nop SCC_HIR_OP_EMPTY, /// Not equal to. SCC_HIR_OP_NEQ, /// Equal to. SCC_HIR_OP_EQ, /// Greater than. SCC_HIR_OP_GT, /// Less than. SCC_HIR_OP_LT, /// Greater than or equal to. SCC_HIR_OP_GE, /// Less than or equal to. SCC_HIR_OP_LE, /// Addition. SCC_HIR_OP_ADD, /// Subtraction. SCC_HIR_OP_SUB, /// Multiplication. SCC_HIR_OP_MUL, /// Division. SCC_HIR_OP_DIV, /// Modulo. SCC_HIR_OP_MOD, /// Bitwise AND. SCC_HIR_OP_AND, /// Bitwise OR. SCC_HIR_OP_OR, /// Bitwise XOR. SCC_HIR_OP_XOR, /// Bitwise NOT. SCC_HIR_OP_NOT, /// Shift left logical. SCC_HIR_OP_SHL, /// Shift right logical. SCC_HIR_OP_SHR, /// Shift right arithmetic. SCC_HIR_OP_SAR, } scc_hir_op_type_t; typedef enum { SCC_HIR_BUILTIN_TAG_MEMCPY, SCC_HIR_BUILTIN_TAG_MEMSET, SCC_HIR_BUILTIN_TAG_VA_START, SCC_HIR_BUILTIN_TAG_VA_ARG, SCC_HIR_BUILTIN_TAG_VA_END, SCC_HIR_BUILTIN_TAG_VA_COPY, } scc_hir_builtin_tag_t; typedef struct { scc_hir_builtin_tag_t tag; union { struct { scc_hir_value_ref_t dest; scc_hir_value_ref_t src; scc_hir_value_ref_t size; } memcpy; struct { scc_hir_value_ref_t dest; scc_hir_value_ref_t value; scc_hir_value_ref_t size; } memset; struct { scc_hir_value_ref_t ap; // va_list 的地址(i8* 或 struct*) scc_hir_value_ref_t last; // 最后一个固定参数的引用(用于 va_start) } va_start; struct { scc_hir_value_ref_t ap; // va_list 的地址 scc_hir_type_ref_t type; // 要提取的参数的类型 } va_arg; struct { scc_hir_value_ref_t ap; // va_list 的地址 } va_end; struct { scc_hir_value_ref_t dest; // 目标 va_list 地址 scc_hir_value_ref_t src; // 源 va_list 地址 } va_copy; } func; } scc_hir_builtin_t; struct scc_hir_value { scc_hir_type_ref_t type; const char *name; scc_hir_value_ref_vec_t used_by; scc_hir_value_tag_t tag; union { scc_hir_builtin_t builtin; scc_ap_t integer; void *decimal; struct { scc_hir_value_ref_t base_type; scc_hir_buffer_t fields; } const_array; struct { scc_hir_value_ref_vec_t fields; } aggregate; struct { usize idx; } arg_ref; struct { scc_hir_value_ref_t value; } global_alloc; struct { scc_hir_value_ref_t operand; scc_hir_type_ref_t target_type; // 目标类型 enum { CONV_SEXT, CONV_ZEXT, CONV_TRUNC } conv_type; } conv; struct { scc_hir_value_ref_t target; } load; struct { scc_hir_value_ref_t target; scc_hir_value_ref_t value; } store; struct { scc_hir_value_ref_t src_addr; scc_hir_value_ref_t index; } get_elem_ptr; struct { scc_hir_op_type_t op; scc_hir_value_ref_t lhs; scc_hir_value_ref_t rhs; } op; struct { scc_hir_value_ref_t cond; scc_hir_bblock_ref_t true_bblock; scc_hir_bblock_ref_t false_bblock; } branch; struct { scc_hir_bblock_ref_t target_bblock; } jump; struct { scc_hir_func_ref_t callee; // TODO function pointer call scc_hir_value_ref_vec_t args; } call; struct { scc_hir_value_ref_t ret_val; } ret; } data; }; typedef struct scc_hir_bblock_meta { // scc_hir_value_ref_vec_t instrs; // ir_arr_t used_by; } scc_hir_bblock_meta_t; typedef struct scc_hir_func_meta { scc_hir_type_ref_t type; scc_hir_value_ref_vec_t params; } scc_hir_func_meta_t; #define SCC_HIR_BBLOCK_VALUES(bblock) \ (*(scc_hir_value_ref_vec_t *)&((bblock).values)) #define SCC_HIR_BBLOCK_META(bblock) \ ((scc_hir_bblock_meta_t *)((bblock).attribute)) #define SCC_HIR_FUNC_META(func) ((scc_hir_func_meta_t *)((func).attribute)) #endif /* __SCC_HIR_DEF_H__ */