feat(lir): 修改HIR到LIR转换以支持可变参数函数
- 移除SCC_LIR_LEA指令类型,改用SCC_LIR_LOAD_ADDR - 在scc_lir_func_meta_t中添加is_va_arg字段用于标识可变参数函数 - 修改scc_hir2lir函数参数类型,移除const限定符 - 更新比较操作的指令映射逻辑,将条件信息存储在metadata中 - 调整代码结构,在各个switch case分支中统一使用"} break"格式 fix(x86-isel): 修复x86指令选择中的立即数和重定位处理 - 修改emit_direct_call函数以正确处理全局符号重定位 - 更新立即数字段访问从imm到imm0 - 添加新的重定位操作数类型SCC_X86_OPR_RELOC - 实现重定位目标类型的完整处理逻辑,包括基本块和符号 refactor(x86-mir): 重构x86操作数结构以支持重定位机制 - 将内存操作数的disp字段改为结构体形式包含displacement信息 - 移除不再使用的常用操作数构造器函数 - 保留并完善slot操作数构造器 - 更新内存操作数的调试输出格式 feat(ir2mcode): 添加重定位表支持以处理符号引用 - 定义新的重定位结构体scc_reloc_t用于记录重定位信息 - 修改scc_ir2mcode_emit_instr函数签名以传递重定位表 - 实现重定位补丁应用功能scc_ir2mcode_patch - 更新机器码生成流程以收集和处理重定位信息 refactor(ir2sccf): 重构SCEF文件生成以支持重定位处理 - 提取独立的emit_mir_module函数处理MIR模块的机器码生成 - 实现基本块间重定位的地址解析和补丁应用 - 改进符号重定位的处理机制 - 简化机器码段数据的最终处理流程
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#include <scc_pe_idata.h>
|
||||
#include <sccf2pe.h>
|
||||
#include <sccf_utils.h>
|
||||
#include <x86/scc_x86_patch.h>
|
||||
|
||||
typedef struct {
|
||||
scc_hashtable_t str2libsym;
|
||||
@@ -199,6 +200,10 @@ void sccf2pe(scc_pe_builder_t *builder, const sccf_t *sccf) {
|
||||
.size_of_heap_commit = 0x1000,
|
||||
};
|
||||
|
||||
scc_mcode_t mcode;
|
||||
scc_mcode_init(&mcode, SCC_MCODE_ARCH_X86_64);
|
||||
// FIXME hack
|
||||
mcode.code = *(scc_mcode_buff_t *)code_data;
|
||||
scc_vec_foreach(relocs, i) {
|
||||
sccf_reloc_t *reloc = &scc_vec_at(relocs, i);
|
||||
if (reloc->reloc_type == SCCF_RELOC_TYPE_EMPTY) {
|
||||
@@ -220,14 +225,16 @@ void sccf2pe(scc_pe_builder_t *builder, const sccf_t *sccf) {
|
||||
}
|
||||
|
||||
Assert(rva != 0);
|
||||
if (reloc->reloc_type == SCCF_RELOC_TYPE_ABS) {
|
||||
TODO();
|
||||
}
|
||||
rva -= code_range.virual_address + reloc->offset + reloc->addend;
|
||||
Assert(code_data != nullptr);
|
||||
// FIXME 需要确保宿主机与目标机器大小端一致
|
||||
*(u32 *)(scc_vec_unsafe_get_data(*code_data) + reloc->offset) = rva;
|
||||
// FIXME patch type
|
||||
// if (reloc->reloc_type == SCCF_RELOC_TYPE_ABS) {
|
||||
// TODO();
|
||||
// }
|
||||
scc_x86_patch(&mcode, SCC_X86_PATCH_PC32,
|
||||
code_range.virual_address + reloc->offset + reloc->addend,
|
||||
rva);
|
||||
}
|
||||
*(scc_mcode_buff_t *)code_data = mcode.code;
|
||||
|
||||
scc_pe_write_header(builder, &config);
|
||||
if (code_data != nullptr) {
|
||||
|
||||
Reference in New Issue
Block a user