1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
import "llvm.src";
let codegen = struct {
llvm_module: *void,
llvm_context: *void,
builder: *void,
arena: *arena,
};
let codegen_init = (alloc: *arena) => *codegen {
LLVMInitializeX86TargetInfo();
LLVMInitializeX86TargetMC();
LLVMInitializeX86Target();
LLVMInitializeX86AsmPrinter();
LLVMInitializeX86AsmParser();
let module = LLVMModuleCreateWithName("module");
let context = LLVMGetGlobalContext();
let builder = LLVMCreateBuilder();
let c = cast(*codegen, arena_alloc(alloc, sizeof(codegen)));
(*c).llvm_module = module;
(*c).llvm_context = context;
(*c).builder = builder;
(*c).arena = alloc;
return c;
};
let codegen_generate = (c: *codegen) => i64 {
return 0;
};
let codegen_compile = (c: *codegen) => i64 {
/* Dump module */
LLVMDumpModule((*c).llvm_module);
/* Generate code */
let triple = LLVMGetDefaultTargetTriple();
let target_ref = cast(**void, arena_alloc((*c).arena, sizeof(**void)));
let message = cast(**i8, null);
let result = LLVMGetTargetFromTriple(triple, target_ref, message);
if result != 0 {
println("Target output: %s", *message);
LLVMDisposeMessage(*message);
};
let target_machine = LLVMCreateTargetMachine(
*target_ref,
triple,
"",
"",
LLVMCodeGenLevelDefault,
LLVMRelocDefault,
LLVMCodeModelDefault,
);
LLVMDisposeMessage(triple);
result = LLVMVerifyModule((*c).llvm_module, LLVMAbortProcessAction, message);
if result != 0 {
println("Verification output: %s", *message);
LLVMDisposeMessage(*message);
};
/* Generate the object file */
let filename = "bootstrap_output.o";
LLVMTargetMachineEmitToFile(
target_machine,
(*c).llvm_module,
filename,
LLVMObjectFile,
cast(**i8, null),
);
LLVMDisposeTargetMachine(target_machine);
println("Object file generated: %s", filename);
return 0;
};
let codegen_deinit = (c: *codegen) => void {
LLVMDisposeModule((*c).llvm_module);
LLVMShutdown();
LLVMDisposeBuilder((*c).builder);
return;
};
|