feat(ir): 启用LIR模块并重构HIR组件结构
- 在cbuild.toml中启用lir依赖项,取消注释相关配置 - 重构libs/README.md文档,添加详细的库说明和层级结构 - 重命名头文件以统一命名规范:ast_def.h → scc_ast_def.h, ast_dump.h → scc_ast_dump.h, hir相关文件添加scc前缀 - 更新include路径以匹配新的文件命名 - 在cfg模块中添加symbol ID类型和linkage枚举,完善符号表功能 - 实现cfg模块中的符号添加、查找和获取功能 - 修改HIR中meta字段替换原有的attribute字段,更新相关访问宏 - 修复HIR构建器中的函数元数据访问错误 - 为LIR模块创建完整的头文件结构,包括指令定义、转换器等组件
This commit is contained in:
454
libs/ast/include/scc_ast_def.h
Normal file
454
libs/ast/include/scc_ast_def.h
Normal file
@@ -0,0 +1,454 @@
|
||||
#ifndef __SCC_AST_DEF_H__
|
||||
#define __SCC_AST_DEF_H__
|
||||
|
||||
#include <scc_core.h>
|
||||
#include <scc_pos.h>
|
||||
|
||||
/**
|
||||
* @brief AST 节点类型枚举
|
||||
*/
|
||||
typedef enum {
|
||||
SCC_AST_UNKNOWN,
|
||||
// 声明
|
||||
scc_ast_decl_t_BEGIN, // 声明开始 sema 函数作用域开始
|
||||
SCC_AST_DECL_LIST, // 声明列表
|
||||
SCC_AST_DECL_VAR, // 变量声明
|
||||
SCC_AST_DECL_FUNC, // 函数声明
|
||||
SCC_AST_DECL_PARAM, // 参数声明
|
||||
SCC_AST_DECL_STRUCT, // 结构体声明
|
||||
SCC_AST_DECL_UNION, // 联合声明
|
||||
SCC_AST_DECL_ENUM, // 枚举声明
|
||||
SCC_AST_DECL_TYPEDEF, // typedef 声明
|
||||
scc_ast_decl_t_END, // 声明结束 sema 函数作用域结束
|
||||
|
||||
// 语句
|
||||
scc_ast_stmt_t_BEGIN, // 语句开始 sema 作用域开始
|
||||
SCC_AST_STMT_COMPOUND, // 复合语句 { ... }
|
||||
SCC_AST_STMT_EXPR, // 表达式语句
|
||||
SCC_AST_STMT_IF, // if 语句
|
||||
SCC_AST_STMT_WHILE, // while 语句
|
||||
SCC_AST_STMT_DO_WHILE, // do-while 语句
|
||||
SCC_AST_STMT_FOR, // for 语句
|
||||
SCC_AST_STMT_SWITCH, // switch 语句
|
||||
SCC_AST_STMT_CASE, // case 语句
|
||||
SCC_AST_STMT_DEFAULT, // default 语句
|
||||
SCC_AST_STMT_BREAK, // break 语句
|
||||
SCC_AST_STMT_CONTINUE, // continue 语句
|
||||
SCC_AST_STMT_RETURN, // return 语句
|
||||
SCC_AST_STMT_GOTO, // goto 语句
|
||||
SCC_AST_STMT_LABEL, // 标签语句
|
||||
scc_ast_stmt_t_END, // 结束语句 sema 作用域结束
|
||||
|
||||
// 表达式
|
||||
scc_ast_expr_t_BEGIN, // 表达式开始
|
||||
SCC_AST_EXPR_BINARY, // 二元运算
|
||||
SCC_AST_EXPR_UNARY, // 一元运算
|
||||
SCC_AST_EXPR_COND, // 条件表达式 ?:
|
||||
SCC_AST_EXPR_CALL, // 函数调用
|
||||
SCC_AST_EXPR_ARRAY_SUBSCRIPT, // 数组下标
|
||||
SCC_AST_EXPR_MEMBER, // 成员访问 .
|
||||
SCC_AST_EXPR_PTR_MEMBER, // 指针成员访问 ->
|
||||
SCC_AST_EXPR_CAST, // 类型转换
|
||||
SCC_AST_EXPR_SIZE_OF, // sizeof
|
||||
SCC_AST_EXPR_ALIGN_OF, // _Alignof
|
||||
SCC_AST_EXPR_COMPOUND, // 复合字面量
|
||||
SCC_AST_EXPR_LVALUE, // 右值
|
||||
SCC_AST_EXPR_BUILTIN, // 内置表达式
|
||||
// 字面量
|
||||
SCC_AST_EXPR_INT_LITERAL, // 整数字面量
|
||||
SCC_AST_EXPR_FLOAT_LITERAL, // 浮点字面量
|
||||
SCC_AST_EXPR_CHAR_LITERAL, // 字符字面量
|
||||
SCC_AST_EXPR_STRING_LITERAL, // 字符串字面量
|
||||
// 标识符
|
||||
SCC_AST_EXPR_IDENTIFIER, // 标识符
|
||||
scc_ast_expr_t_END, // 表达式结束
|
||||
|
||||
// 类型
|
||||
scc_ast_type_t_BEGIN, // 类型开始
|
||||
SCC_AST_TYPE_BUILTIN, // 内置类型
|
||||
SCC_AST_TYPE_POINTER, // 指针类型
|
||||
SCC_AST_TYPE_ARRAY, // 数组类型
|
||||
SCC_AST_TYPE_FUNCTION, // 函数类型
|
||||
SCC_AST_TYPE_STRUCT, // 结构体类型
|
||||
SCC_AST_TYPE_UNION, // 联合类型
|
||||
SCC_AST_TYPE_ENUM, // 枚举类型
|
||||
SCC_AST_TYPE_TYPEDEF, // typedef 类型
|
||||
scc_ast_type_t_END, // 类型结束
|
||||
|
||||
// 其他
|
||||
scc_ast_translation_unit_t_BEGIN,
|
||||
SCC_AST_TRANSLATION_UNIT, // 翻译单元(根节点)
|
||||
scc_ast_translation_unit_t_END,
|
||||
} scc_ast_node_kind_t;
|
||||
|
||||
typedef struct scc_ast_node {
|
||||
scc_ast_node_kind_t type;
|
||||
scc_pos_t loc;
|
||||
} scc_ast_node_t;
|
||||
|
||||
#define SCC_AST_CAST_TO(kind, expr) \
|
||||
((kind *)(Assert(((scc_ast_node_t *)expr)->type > kind##_BEGIN && \
|
||||
((scc_ast_node_t *)expr)->type < kind##_END), \
|
||||
(expr)))
|
||||
#define SCC_AST_IS_A(kind, expr) \
|
||||
((expr) && (((scc_ast_node_t *)expr)->type > kind##_BEGIN && \
|
||||
((scc_ast_node_t *)expr)->type < kind##_END))
|
||||
|
||||
/**
|
||||
* @brief 内置类型枚举
|
||||
*/
|
||||
typedef enum {
|
||||
SCC_AST_BUILTIN_TYPE_UNKNOWN,
|
||||
SCC_AST_BUILTIN_TYPE_VA_LIST,
|
||||
SCC_AST_BUILTIN_TYPE_VOID,
|
||||
SCC_AST_BUILTIN_TYPE_BOOL,
|
||||
SCC_AST_BUILTIN_TYPE_CHAR,
|
||||
SCC_AST_BUILTIN_TYPE_SHORT,
|
||||
SCC_AST_BUILTIN_TYPE_INT,
|
||||
SCC_AST_BUILTIN_TYPE_LONG,
|
||||
SCC_AST_BUILTIN_TYPE_LONG_LONG,
|
||||
|
||||
SCC_AST_BUILTIN_TYPE_UNSIGNED_CHAR,
|
||||
SCC_AST_BUILTIN_TYPE_UNSIGNED_SHORT,
|
||||
SCC_AST_BUILTIN_TYPE_UNSIGNED_INT,
|
||||
SCC_AST_BUILTIN_TYPE_UNSIGNED_LONG,
|
||||
SCC_AST_BUILTIN_TYPE_UNSIGNED_LONG_LONG,
|
||||
|
||||
SCC_AST_BUILTIN_TYPE_SIGNED_CHAR,
|
||||
SCC_AST_BUILTIN_TYPE_SIGNED_SHORT,
|
||||
SCC_AST_BUILTIN_TYPE_SIGNED_INT,
|
||||
SCC_AST_BUILTIN_TYPE_SIGNED_LONG,
|
||||
SCC_AST_BUILTIN_TYPE_SIGNED_LONG_LONG,
|
||||
|
||||
SCC_AST_BUILTIN_TYPE_FLOAT,
|
||||
SCC_AST_BUILTIN_TYPE_DOUBLE,
|
||||
SCC_AST_BUILTIN_TYPE_LONG_DOUBLE,
|
||||
SCC_AST_BUILTIN_TYPE_COMPLEX_FLOAT,
|
||||
SCC_AST_BUILTIN_TYPE_COMPLEX_DOUBLE,
|
||||
SCC_AST_BUILTIN_TYPE_COMPLEX_LONG_DOUBLE,
|
||||
} scc_ast_builtin_type_t;
|
||||
|
||||
/**
|
||||
* @brief 限定符
|
||||
*/
|
||||
typedef struct {
|
||||
// storage-class-specifier
|
||||
cbool is_typedef;
|
||||
cbool is_extern;
|
||||
cbool is_static;
|
||||
cbool is_auto;
|
||||
cbool is_register;
|
||||
// type-qualifier
|
||||
cbool is_const;
|
||||
cbool is_volatile;
|
||||
cbool is_restrict;
|
||||
cbool is_atomic;
|
||||
// function-specifier
|
||||
cbool is_inline;
|
||||
} scc_ast_decl_specifier_t;
|
||||
|
||||
// 前向声明
|
||||
typedef struct scc_ast_type scc_ast_type_t;
|
||||
typedef struct scc_ast_expr scc_ast_expr_t;
|
||||
typedef struct scc_ast_stmt scc_ast_stmt_t;
|
||||
typedef struct scc_ast_decl scc_ast_decl_t;
|
||||
|
||||
typedef SCC_VEC(scc_ast_type_t *) scc_ast_type_vec_t;
|
||||
typedef SCC_VEC(scc_ast_expr_t *) scc_ast_expr_vec_t;
|
||||
typedef SCC_VEC(scc_ast_stmt_t *) scc_ast_stmt_vec_t;
|
||||
typedef SCC_VEC(scc_ast_decl_t *) scc_ast_decl_vec_t;
|
||||
|
||||
// 通过指针实现泛型 only stmt or decl
|
||||
typedef SCC_VEC(scc_ast_node_t *) scc_ast_block_item_vec_t;
|
||||
|
||||
/**
|
||||
* @brief 类型表示
|
||||
*/
|
||||
struct scc_ast_type {
|
||||
scc_ast_node_t base;
|
||||
scc_ast_decl_specifier_t quals;
|
||||
union {
|
||||
struct {
|
||||
scc_ast_builtin_type_t type;
|
||||
} builtin;
|
||||
struct {
|
||||
scc_ast_type_t *pointee;
|
||||
} pointer;
|
||||
struct {
|
||||
scc_ast_type_t *element;
|
||||
scc_ast_expr_t *size; // 可为 nullptr <=> 不定长数组
|
||||
} array;
|
||||
struct {
|
||||
scc_ast_type_t *return_type;
|
||||
scc_ast_decl_vec_t params; // va_list <=> ...
|
||||
} function;
|
||||
struct {
|
||||
const char *name;
|
||||
scc_ast_decl_t *decl; // can be nullptr
|
||||
} record;
|
||||
struct {
|
||||
const char *name;
|
||||
/// @brief 指向typedef的声明(可以间接找到typedef的指向的类型)
|
||||
scc_ast_decl_t *decl;
|
||||
} typedef_type;
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief AST 操作符枚举
|
||||
* 这个枚举定义了所有在AST中使用的操作符,与词法token分离
|
||||
*/
|
||||
typedef enum scc_ast_expr_op {
|
||||
/* 无操作符 */
|
||||
SCC_AST_OP_NONE = 0,
|
||||
/* 赋值操作符 */
|
||||
SCC_AST_OP_ASSIGN, // =
|
||||
SCC_AST_OP_ASSIGN_ADD, // +=
|
||||
SCC_AST_OP_ASSIGN_SUB, // -=
|
||||
SCC_AST_OP_ASSIGN_MUL, // *=
|
||||
SCC_AST_OP_ASSIGN_DIV, // /=
|
||||
SCC_AST_OP_ASSIGN_MOD, // %=
|
||||
SCC_AST_OP_ASSIGN_AND, // &=
|
||||
SCC_AST_OP_ASSIGN_XOR, // ^=
|
||||
SCC_AST_OP_ASSIGN_OR, // |=
|
||||
SCC_AST_OP_ASSIGN_LSHIFT, // <<=
|
||||
SCC_AST_OP_ASSIGN_RSHIFT, // >>=
|
||||
/* 条件操作符 */
|
||||
SCC_AST_OP_CONDITIONAL, // ?:
|
||||
/* 逗号操作符 */
|
||||
SCC_AST_OP_COMMA, // ,
|
||||
/* 逻辑操作符 */
|
||||
SCC_AST_OP_LOGICAL_OR, // ||
|
||||
SCC_AST_OP_LOGICAL_AND, // &&
|
||||
/* 位操作符 */
|
||||
SCC_AST_OP_BITWISE_OR, // |
|
||||
SCC_AST_OP_BITWISE_XOR, // ^
|
||||
SCC_AST_OP_BITWISE_AND, // &
|
||||
/* 相等性操作符 */
|
||||
SCC_AST_OP_EQUAL, // ==
|
||||
SCC_AST_OP_NOT_EQUAL, // !=
|
||||
/* 关系操作符 */
|
||||
SCC_AST_OP_LESS, // <
|
||||
SCC_AST_OP_GREATER, // >
|
||||
SCC_AST_OP_LESS_EQUAL, // <=
|
||||
SCC_AST_OP_GREATER_EQUAL, // >=
|
||||
/* 移位操作符 */
|
||||
SCC_AST_OP_LEFT_SHIFT, // <<
|
||||
SCC_AST_OP_RIGHT_SHIFT, // >>
|
||||
/* 算术操作符 */
|
||||
SCC_AST_OP_ADD, // +
|
||||
SCC_AST_OP_SUB, // -
|
||||
SCC_AST_OP_MUL, // *
|
||||
SCC_AST_OP_DIV, // /
|
||||
SCC_AST_OP_MOD, // %
|
||||
/* 一元操作符 */
|
||||
SCC_AST_OP_UNARY_PLUS, // + (一元)
|
||||
SCC_AST_OP_UNARY_MINUS, // - (一元)
|
||||
SCC_AST_OP_ADDRESS_OF, // &
|
||||
SCC_AST_OP_INDIRECTION, // *
|
||||
SCC_AST_OP_BITWISE_NOT, // ~
|
||||
SCC_AST_OP_LOGICAL_NOT, // !
|
||||
SCC_AST_OP_PREFIX_INCREMENT, // ++ (前缀)
|
||||
SCC_AST_OP_PREFIX_DECREMENT, // -- (前缀)
|
||||
SCC_AST_OP_POSTFIX_INCREMENT, // ++ (后缀)
|
||||
SCC_AST_OP_POSTFIX_DECREMENT, // -- (后缀)
|
||||
} scc_ast_expr_op_t;
|
||||
|
||||
typedef enum {
|
||||
SCC_AST_EXPR_BUILTIN_VA_START,
|
||||
SCC_AST_EXPR_BUILTIN_VA_END,
|
||||
SCC_AST_EXPR_BUILTIN_VA_COPY,
|
||||
SCC_AST_EXPR_BUILTIN_VA_ARG,
|
||||
} scc_ast_builtin_expr_type_t;
|
||||
|
||||
/**
|
||||
* @brief 表达式节点
|
||||
*/
|
||||
struct scc_ast_expr {
|
||||
scc_ast_node_t base;
|
||||
union {
|
||||
// 二元运算
|
||||
struct {
|
||||
scc_ast_expr_op_t op;
|
||||
scc_ast_expr_t *lhs;
|
||||
scc_ast_expr_t *rhs;
|
||||
} binary;
|
||||
// 一元运算
|
||||
struct {
|
||||
scc_ast_expr_op_t op;
|
||||
scc_ast_expr_t *operand;
|
||||
} unary;
|
||||
// 条件表达式
|
||||
struct {
|
||||
scc_ast_expr_t *cond;
|
||||
scc_ast_expr_t *then_expr;
|
||||
scc_ast_expr_t *else_expr;
|
||||
} cond;
|
||||
// 函数调用
|
||||
struct {
|
||||
scc_ast_expr_t *callee;
|
||||
scc_ast_expr_vec_t args;
|
||||
} call;
|
||||
// 数组下标
|
||||
struct {
|
||||
scc_ast_expr_t *array;
|
||||
scc_ast_expr_t *index;
|
||||
} subscript;
|
||||
// 成员访问 指针成员访问
|
||||
struct {
|
||||
scc_ast_expr_t *base;
|
||||
const char *name;
|
||||
usize _target_idx; ///< fill by sema
|
||||
} member;
|
||||
// cast 类型转换
|
||||
struct {
|
||||
scc_ast_type_t *type;
|
||||
scc_ast_expr_t *expr;
|
||||
} cast;
|
||||
// sizeof / _Alignof / ...
|
||||
union {
|
||||
scc_ast_type_t *type;
|
||||
scc_ast_expr_t *expr;
|
||||
} attr_of;
|
||||
// 复合字面量
|
||||
struct {
|
||||
scc_ast_expr_t *base;
|
||||
/// @brief 赋值语句的左值
|
||||
scc_ast_expr_vec_t lhs_exprs;
|
||||
/// @brief 赋值语句的右值
|
||||
scc_ast_expr_vec_t rhs_exprs;
|
||||
} compound;
|
||||
// 字面量
|
||||
struct {
|
||||
const char *lexme;
|
||||
cbool owned;
|
||||
} literal;
|
||||
// 标识符
|
||||
struct {
|
||||
const char *name;
|
||||
scc_ast_decl_t *_target; ///< fill by sema
|
||||
} identifier;
|
||||
struct {
|
||||
scc_ast_type_t *type;
|
||||
} lvalue;
|
||||
// 内置表达式
|
||||
struct {
|
||||
scc_ast_builtin_expr_type_t type;
|
||||
scc_ast_expr_vec_t args;
|
||||
} builtin;
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief 语句节点
|
||||
*/
|
||||
struct scc_ast_stmt {
|
||||
scc_ast_node_t base;
|
||||
union {
|
||||
// 复合语句
|
||||
struct {
|
||||
scc_ast_block_item_vec_t block_items; // decl or stmt
|
||||
} compound;
|
||||
// 表达式语句
|
||||
struct {
|
||||
scc_ast_expr_t *expr;
|
||||
} expr;
|
||||
// if 语句
|
||||
struct {
|
||||
scc_ast_expr_t *cond;
|
||||
scc_ast_stmt_t *then_stmt;
|
||||
scc_ast_stmt_t *opt_else_stmt; // stmt or nullptr
|
||||
} if_stmt;
|
||||
// while do-while 语句
|
||||
struct {
|
||||
scc_ast_expr_t *cond;
|
||||
scc_ast_stmt_t *body;
|
||||
} while_stmt;
|
||||
// for 语句
|
||||
struct {
|
||||
scc_ast_node_t *init; // expr or decl or nullptr
|
||||
scc_ast_expr_t *cond; // 可为 nullptr
|
||||
scc_ast_expr_t *incr; // 可为 nullptr
|
||||
scc_ast_stmt_t *body;
|
||||
} for_stmt;
|
||||
// switch 语句
|
||||
struct {
|
||||
scc_ast_expr_t *cond;
|
||||
scc_ast_stmt_t *body;
|
||||
} switch_stmt;
|
||||
// case 语句
|
||||
struct {
|
||||
scc_ast_expr_t *expr;
|
||||
scc_ast_stmt_t *stmt;
|
||||
} case_stmt;
|
||||
// default 语句
|
||||
struct {
|
||||
scc_ast_stmt_t *stmt;
|
||||
} default_stmt;
|
||||
// break/continue
|
||||
struct {
|
||||
scc_ast_stmt_t *_target; // fill by sema
|
||||
} jump;
|
||||
// return 语句
|
||||
struct {
|
||||
scc_ast_expr_t *expr; // 可为 nullptr
|
||||
} return_stmt;
|
||||
// goto 语句
|
||||
struct {
|
||||
const char *label;
|
||||
scc_ast_stmt_t *_target; // fill by sema
|
||||
} goto_stmt;
|
||||
// 标签语句
|
||||
struct {
|
||||
const char *label;
|
||||
scc_ast_stmt_t *stmt;
|
||||
} label_stmt;
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief 声明节点
|
||||
*/
|
||||
struct scc_ast_decl {
|
||||
scc_ast_node_t base;
|
||||
const char *name;
|
||||
union {
|
||||
struct {
|
||||
scc_ast_decl_vec_t vars;
|
||||
} list;
|
||||
// 变量声明
|
||||
struct {
|
||||
scc_ast_type_t *type;
|
||||
scc_ast_expr_t *init; // 可为 nullptr
|
||||
} var;
|
||||
// 函数声明
|
||||
struct {
|
||||
scc_ast_type_t *type; // 函数类型
|
||||
scc_ast_stmt_t *body; // 可为 nullptr 表示只有声明
|
||||
} func;
|
||||
// 参数声明
|
||||
struct {
|
||||
scc_ast_type_t *type;
|
||||
int param_idx;
|
||||
} param;
|
||||
// 结构体/联合/枚举声明
|
||||
struct {
|
||||
/// @brief 结构体/联合/枚举的字段
|
||||
scc_ast_decl_vec_t fields;
|
||||
} record;
|
||||
struct {
|
||||
/// @brief 被 typedef 的类型
|
||||
scc_ast_type_t *type;
|
||||
} typedef_decl;
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief 翻译单元节点(根节点)
|
||||
*/
|
||||
typedef struct scc_ast_translation_unit {
|
||||
scc_ast_node_t base;
|
||||
scc_ast_decl_vec_t declarations;
|
||||
} scc_ast_translation_unit_t;
|
||||
|
||||
#endif /* __SCC_AST_DEF_H__ */
|
||||
Reference in New Issue
Block a user