refactor: LLVM目标初始化解耦 — 抽取 target.h/c

- 新增 src/codegen/target.h/c: target_init/get_default_triple/create_machine/emit_obj
- main.c 移除 inline LLVM Target API 调用,改调 target_* 接口
- codegen.c 专注 AST→IR,不再混入目标平台初始化

基于 Codex 分析报告 4.1 节架构改进建议。
This commit is contained in:
2026-06-05 00:49:08 +08:00
parent 9a53d97274
commit 9ff2990724
3 changed files with 63 additions and 25 deletions
+35
View File
@@ -0,0 +1,35 @@
#include "target.h"
#include <llvm-c/Target.h>
#include <stdio.h>
void target_init(void) {
LLVMInitializeX86TargetInfo();
LLVMInitializeX86Target();
LLVMInitializeX86TargetMC();
LLVMInitializeX86AsmPrinter();
LLVMInitializeX86AsmParser();
}
char* target_get_default_triple(void) {
return LLVMGetDefaultTargetTriple();
}
LLVMTargetMachineRef target_create_machine(const char* triple) {
LLVMTargetRef target;
char* error = NULL;
if (LLVMGetTargetFromTriple(triple, &target, &error)) {
fprintf(stderr, "目标平台错误: %s\n", error);
LLVMDisposeMessage(error);
return NULL;
}
return LLVMCreateTargetMachine(
target, triple, "generic", "",
LLVMCodeGenLevelDefault, LLVMRelocDefault, LLVMCodeModelDefault);
}
int target_emit_obj(LLVMTargetMachineRef tm, LLVMModuleRef module,
const char* filename, char** error_msg) {
return LLVMTargetMachineEmitToFile(tm, module, (char*)filename,
LLVMObjectFile, error_msg);
}
+21
View File
@@ -0,0 +1,21 @@
#ifndef TARGET_H
#define TARGET_H
#include <llvm-c/Core.h>
#include <llvm-c/TargetMachine.h>
// 初始化 X86 目标平台(LLVMInitializeAllTarget* 的替代,LLVM-C.lib 不导出 All 系列)
void target_init(void);
// 获取默认目标三元组
char* target_get_default_triple(void);
// 从三元组获取目标机
LLVMTargetMachineRef target_create_machine(const char* triple);
// 将模块写入目标文件
// 返回 0 成功,非 0 失败(*error_msg 包含错误信息)
int target_emit_obj(LLVMTargetMachineRef tm, LLVMModuleRef module,
const char* filename, char** error_msg);
#endif