From 08abe6f88042d3f734453e47e4a410391fd4e9f9 Mon Sep 17 00:00:00 2001 From: Baitinq Date: Tue, 3 Jun 2025 22:53:03 +0200 Subject: Bootstrap: Codegen: Start implementation --- src/bootstrap/codegen.src | 43 +++++++++++++++++++++++++++++++++++++++++++ src/bootstrap/llvm.src | 14 ++++++++++++++ src/bootstrap/main.src | 6 ++++++ 3 files changed, 63 insertions(+) create mode 100644 src/bootstrap/codegen.src create mode 100644 src/bootstrap/llvm.src diff --git a/src/bootstrap/codegen.src b/src/bootstrap/codegen.src new file mode 100644 index 0000000..e4d3102 --- /dev/null +++ b/src/bootstrap/codegen.src @@ -0,0 +1,43 @@ +import "llvm.src"; + +let codegen = struct { + llvm_module: *void, + llvm_context: *void, + builder: *void, +}; + +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; + + return c; +}; + +let codegen_generate = (c: *codegen) => i64 { + return 0; +}; + +let codegen_compile = (c: *codegen) => i64 { + LLVMDumpModule((*c).llvm_module); + return 0; +}; + +let codegen_deinit = (c: *codegen) => void { + LLVMDisposeModule((*c).llvm_module); + LLVMShutdown(); + LLVMDisposeBuilder((*c).builder); + return; +}; diff --git a/src/bootstrap/llvm.src b/src/bootstrap/llvm.src new file mode 100644 index 0000000..70a5065 --- /dev/null +++ b/src/bootstrap/llvm.src @@ -0,0 +1,14 @@ +extern LLVMInitializeX86TargetInfo = () => void; +extern LLVMInitializeX86TargetMC = () => void; +extern LLVMInitializeX86Target = () => void; +extern LLVMInitializeX86AsmPrinter = () => void; +extern LLVMInitializeX86AsmParser = () => void; + +extern LLVMModuleCreateWithName = (*i8) => *void; +extern LLVMGetGlobalContext = () => *void; +extern LLVMCreateBuilder = () => *void; /* TODO: Create types */ +extern LLVMDisposeModule = (*void) => void; +extern LLVMShutdown = () => void; +extern LLVMDisposeBuilder = (*void) => void; + +extern LLVMDumpModule = (*void) => void; diff --git a/src/bootstrap/main.src b/src/bootstrap/main.src index 3ff89b3..23defd1 100644 --- a/src/bootstrap/main.src +++ b/src/bootstrap/main.src @@ -16,6 +16,7 @@ let slice = struct { import "tokenizer.src"; import "parser.src"; +import "codegen.src"; let read_file = (filename: *i8, alloc: *arena) => slice { let file = fopen(filename, "r"); @@ -57,6 +58,11 @@ let main = (argc: i64, argv: **i8) => i64 { let p = parser_init(cast(*token, ts.data), ts.data_len, alloc); let ns = parse(p); + let c = codegen_init(alloc); + let res = codegen_generate(c); + let res = codegen_compile(c); + codegen_deinit(c); + arena_free(alloc); return 0; -- cgit 1.4.1