Files
scc/libs/ir/hir/include/scc_hir_def.h
zzy cec96333e7 feat(ast2ir): 实现C11类型提升系统并重构HIR基本块管理
- 新增 scc_ast2ir_promote.c 实现整数提升(6.3.1.1)和寻常算术转换(6.3.1.8)
- 重构 HIR Builder: bblock → create_bblock + append_bblock,引入BBList链表管理
- AST2IR 全面集成类型提升:二元运算、赋值、函数调用参数、自增/自减操作符
- 变参函数支持:跳过 ... 假参数,实现默认参数提升(float→double等)
- 简化 HIR Dump 实现
- MIR: Win64 ABI改进、x86指令选择优化
- 新增 printf 测试用例
2026-05-24 15:46:22 +08:00

270 lines
7.5 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_JUMP_INDIRECT, ///< 无条件跳转(地址)
SCC_HIR_VALUE_TAG_CALL, ///< 调用函数
SCC_HIR_VALUE_TAG_CALL_INDIRECT, ///< 调用函数(地址)
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;
typedef enum {
SCC_HIR_CONV_NONE,
SCC_HIR_CONV_SEXT,
SCC_HIR_CONV_ZEXT,
SCC_HIR_CONV_TRUNC,
} scc_hir_conv_type_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; // 目标类型
scc_hir_conv_type_t 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;
union {
scc_hir_value_ref_t target_ptr;
scc_hir_bblock_ref_t target_bblock;
} jump;
struct {
union {
scc_hir_func_ref_t func_ref;
scc_hir_value_ref_t ptr_ref;
} callee;
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;
int defined;
cbool is_variadic;
} 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)->meta))
#define SCC_HIR_FUNC_META(func) ((scc_hir_func_meta_t *)((func)->meta))
#endif /* __SCC_HIR_DEF_H__ */