Files
scc/libs/ir/hir/include/hir_def.h
zzy 0fbfb36262 feat(cbuild): 更新项目配置以支持HIR中间表示
- 统一包名格式化,添加空格对齐
- 将依赖项从ir和lir重命名为hir,移除lir注释
- 为ast2ir模块添加正确的包名称"scc_ast2ir"
- 更新依赖引用路径指向新的HIR库结构
- 移除注释掉的ir2mcode和sccf2target依赖项

refactor(ast2ir): 迁移到HIR中间表示替换IR表示

- 更新头文件包含,使用hir_builder.h替代ir_builder.h
- 修改上下文结构体,将scc_ir_builder_t替换为scc_hir_builder_t
- 更新函数签名,将参数类型从scc_ir_*转换为scc_hir_*
- 调整返回值类型,将scc_ir_value_ref_t和scc_ir_type_ref_t
  分别替换为scc_hir_value_ref_t和scc_hir_type_ref_t
- 重新排列头文件包含顺序以满足依赖关系
2026-04-21 14:05:21 +08:00

256 lines
7.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef __SCC_HIR_DEF_H__
#define __SCC_HIR_DEF_H__
#include <scc_ap.h>
#include <scc_cfg.h>
#include <scc_core.h>
#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__ */