- 添加 scc_ast2ir_mir_module 内联函数统一访问模块 - 替换所有直接访问 ctx->builder.cprog->module 的地方 - 移除重复的 scc_hir_type_size 函数实现 - 添加 scc_hir_module_type_size 函数到模块接口 - 更新所有类型大小计算调用使用新函数 feat(hir): 增强构建器安全性和全局变量处理 - 为 scc_hir_builder_integer 添加空指针检查断言 - 修复 scc_hir_builder_global_alloca 中全局变量类型设置 - 改进 scc_hir_builder_get_elem_ptr 处理空指针索引情况 - 重构字符串常量生成使用 get_elem_ptr 构建器函数 refactor(lir): 简化地址表达式表示并增强内置函数支持 - 移除复杂地址结构体 scc_lir_addr_t - 简化 scc_lir_instr 结构体中的地址表示 - 移除 STORE_ADDR 操作码 - 添加 memcpy 和 memset 内置函数操作码 - 在符号元数据中使用联合体替代嵌套结构体 feat(hir2lir): 完善 HIR 到 LIR 转换中的内置函数处理 - 添加 ensure_vreg 辅助函数确保虚拟寄存器操作数 - 正确处理全局变量地址符号引用 - 优化 GET_ELEM_PTR 转换使用类型大小计算 - 完整实现所有内置函数(BUILTIN)的 LIR 转换 - 包括 memcpy、memset、va_start、va_arg、va_end、va_copy 等
76 lines
3.3 KiB
C
76 lines
3.3 KiB
C
#ifndef __SCC_X86_ISEL_H__
|
|
#define __SCC_X86_ISEL_H__
|
|
|
|
#include <scc_lir_module.h>
|
|
#include <scc_tree_dump.h>
|
|
|
|
#include "../core_pass/scc_abi_lowering.h"
|
|
#include "scc_x86_mir.h"
|
|
|
|
typedef struct scc_x86_64_isel {
|
|
scc_mir_x86_instr_vec_t instrs;
|
|
scc_mir_func_t *func;
|
|
scc_pos_t pos;
|
|
scc_abi_lowering_t abi_lowering;
|
|
} scc_x86_64_isel_t;
|
|
|
|
void scc_isel_x86_64(scc_mir_module_t *mir_module,
|
|
const scc_lir_module_t *lir_module,
|
|
scc_x86_64_isel_t *isel);
|
|
|
|
// Utils
|
|
void scc_x86_emit_move(scc_x86_64_isel_t *isel, scc_x86_operand_value_t dst_reg,
|
|
scc_x86_operand_value_t src, u8 size);
|
|
void scc_x86_emit_load(scc_x86_64_isel_t *isel, scc_x86_operand_value_t dst,
|
|
scc_x86_operand_value_t src, u8 size);
|
|
void scc_x86_emit_store(scc_x86_64_isel_t *isel, scc_x86_operand_value_t dst,
|
|
scc_x86_operand_value_t src, u8 size);
|
|
scc_x86_operand_value_t scc_x86_lir_val_to_mir_op(scc_x86_64_isel_t *isel,
|
|
const scc_lir_val_t *val);
|
|
static inline void emit_direct_call(scc_x86_64_isel_t *isel,
|
|
const char *callee) {
|
|
scc_mir_x86_instr_t instr = {0};
|
|
scc_x86_operand_value_t op = scc_x86_op_reloc_global_relbr(callee, 0);
|
|
scc_mir_x86_instr_1(&instr, SCC_X86_IFORM_CALL_NEAR_RELBRZ, op,
|
|
scc_pos_create());
|
|
scc_vec_push(isel->instrs, instr);
|
|
}
|
|
|
|
static inline void emit_indirect_call(scc_x86_64_isel_t *isel,
|
|
scc_x86_operand_value_t reg) {
|
|
scc_mir_x86_instr_t instr = {0};
|
|
scc_mir_x86_instr_1(&instr, SCC_X86_IFORM_CALL_NEAR_GPRV, reg,
|
|
scc_pos_create());
|
|
}
|
|
|
|
static inline void emit_ret(scc_x86_64_isel_t *isel) {
|
|
scc_mir_x86_instr_t instr = {0};
|
|
scc_mir_x86_instr_0(&instr, SCC_X86_IFORM_RET_NEAR, scc_pos_create());
|
|
scc_vec_push(isel->instrs, instr);
|
|
}
|
|
|
|
#define add_instr_0(isel, iform) \
|
|
do { \
|
|
scc_mir_x86_instr_t instr; \
|
|
scc_mir_x86_instr_0(&instr, (iform), (isel)->pos); \
|
|
scc_vec_push((isel)->instrs, instr); \
|
|
} while (0)
|
|
|
|
#define add_instr_1(isel, iform, arg1, _size) \
|
|
do { \
|
|
scc_mir_x86_instr_t instr; \
|
|
(arg1).size = (_size); \
|
|
scc_mir_x86_instr_1(&instr, (iform), (arg1), (isel)->pos); \
|
|
scc_vec_push((isel)->instrs, instr); \
|
|
} while (0)
|
|
|
|
#define add_instr_2(isel, iform, arg1, arg2, _size) \
|
|
do { \
|
|
scc_mir_x86_instr_t instr; \
|
|
(arg1).size = (_size); \
|
|
scc_mir_x86_instr_2(&instr, (iform), (arg1), (arg2), (isel)->pos); \
|
|
scc_vec_push((isel)->instrs, instr); \
|
|
} while (0)
|
|
|
|
#endif /* __SCC_X86_ISEL_H__ */
|