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:
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user