- 将 MIR 中的 SCC_MIR_OP_MEM 替换为更精确的 SCC_MIR_OP_STACK_SLOT 和 SCC_MIR_OP_STACK_OFFSET 类型 - 在 x86_64 指令选择中更新相应的内存操作数处理逻辑 - 修改寄存器分配器中的栈槽操作数类型检查 - 更新 IR 转机器码过程中的内存操作数转换 refactor(hir): 使用 tree_dump_node 输出函数节点 - 将 hir_dump 中的函数名输出从 append 改为 node 类型 refactor(frame-layout): 重构栈帧布局传递实现结构 - 引入函数指针实现方式替代直接函数实现 - 将栈帧分配功能集成到 MIR 传递流程中 - 移除独立的 frame_layout 实现文件 refactor(prolog-epilog): 添加函数序言/尾声传递框架 - 为 Windows x64 平台初始化序言/尾声生成器 - 在 MIR 传递阶段添加序言/尾声处理步骤 refactor(win64): 更新 Windows x64 目标平台接口 - 重命名寄存器分配填充函数为 scc_win_pc_x64_reg_alloc_fill - 添加栈帧分配和序言/尾声初始化函数 - 修正参数传递中的栈槽操作数类型 refactor(dump): 改进 MIR 输出格式 - 将基本块显示改为分支节点类型 - 更新操作数类型的显示处理 chore: 添加 x86 编码相关数据结构定义 - 新增 scc_x86_encode.h 头文件包含内存操作数和指令编码接口定义
97 lines
3.1 KiB
C
97 lines
3.1 KiB
C
#ifndef SCC_TREE_DUMP_H
|
||
#define SCC_TREE_DUMP_H
|
||
|
||
#include "scc_core_str.h"
|
||
#include "scc_core_vec.h"
|
||
|
||
typedef struct scc_tree_dump {
|
||
scc_str_t buf; // 字符串缓冲区
|
||
SCC_VEC(cbool) stack; // 缩进栈:每个元素表示该层是否为最后一个子节点
|
||
cbool use_color; // 是否启用颜色
|
||
cbool line_start; // 当前是否在行首(需要输出缩进)
|
||
|
||
// 可配置的缩进字符串
|
||
const char *vertical; // "| "
|
||
const char *branch; // "|-"
|
||
const char *last_branch; // "`-"
|
||
const char *space; // " "
|
||
|
||
// 颜色字符串(当 use_color 为 false 时为空字符串)
|
||
const char *node_color; // 节点名称颜色
|
||
const char *value_color; // 值颜色
|
||
const char *branch_color; // 分支符号颜色
|
||
const char *reset_color; // 重置颜色
|
||
} scc_tree_dump_t;
|
||
|
||
/**
|
||
* @brief 初始化树形输出器
|
||
* @param td 输出器指针
|
||
* @param use_color 是否使用 ANSI 颜色
|
||
*/
|
||
void scc_tree_dump_init(scc_tree_dump_t *td, cbool use_color);
|
||
|
||
/**
|
||
* @brief 释放输出器占用的资源
|
||
*/
|
||
void scc_tree_dump_drop(scc_tree_dump_t *td);
|
||
|
||
/**
|
||
* @brief 清空当前缓冲区,但保留已分配内存
|
||
*/
|
||
void scc_tree_dump_clear(scc_tree_dump_t *td);
|
||
|
||
/**
|
||
* @brief 获取当前构建的字符串(以 '\0' 结尾)
|
||
* @return 内部缓冲区指针,不可 free
|
||
*/
|
||
const char *scc_tree_dump_cstr(scc_tree_dump_t *td);
|
||
|
||
/**
|
||
* @brief 将缓冲区内容通过回调输出,并清空缓冲区
|
||
* @param output 输出回调函数,接收字符串指针、长度、用户数据
|
||
* @param user 用户数据
|
||
*/
|
||
void scc_tree_dump_flush(scc_tree_dump_t *td,
|
||
void (*output)(const char *str, usize len, void *user),
|
||
void *user);
|
||
|
||
/**
|
||
* @brief 开始一个新行(自动输出缩进)
|
||
* @note 通常不需要手动调用,因为 append 系列函数会自动处理
|
||
*/
|
||
void scc_tree_dump_begin_line(scc_tree_dump_t *td);
|
||
|
||
/**
|
||
* @brief 追加普通字符串(自动处理行首缩进)
|
||
*/
|
||
void scc_tree_dump_append(scc_tree_dump_t *td, const char *s);
|
||
|
||
/**
|
||
* @brief 格式化追加(printf 风格)
|
||
*/
|
||
void scc_tree_dump_append_fmt(scc_tree_dump_t *td, const char *fmt, ...);
|
||
|
||
#define scc_tree_dump_node(td, fmt, ...) \
|
||
scc_tree_dump_append_fmt(td, "%s" fmt "%s", (td)->node_color, \
|
||
##__VA_ARGS__, (td)->reset_color)
|
||
|
||
#define scc_tree_dump_value(td, fmt, ...) \
|
||
scc_tree_dump_append_fmt(td, "%s" fmt "%s", (td)->value_color, \
|
||
##__VA_ARGS__, (td)->reset_color)
|
||
|
||
#define scc_tree_dump_branch(td, fmt, ...) \
|
||
scc_tree_dump_append_fmt(td, "%s" fmt "%s", (td)->branch_color, \
|
||
##__VA_ARGS__, (td)->reset_color)
|
||
/**
|
||
* @brief 推入新层级
|
||
* @param is_last 该层级是否是父节点的最后一个子节点
|
||
*/
|
||
void scc_tree_dump_push(scc_tree_dump_t *td, cbool is_last);
|
||
|
||
/**
|
||
* @brief 弹出当前层级
|
||
*/
|
||
void scc_tree_dump_pop(scc_tree_dump_t *td);
|
||
|
||
#endif // SCC_TREE_DUMP_H
|