From 7e39fd651c2dbbdd7271605b20deefb30ad2d203 Mon Sep 17 00:00:00 2001 From: Baitinq Date: Wed, 4 Jun 2025 00:18:53 +0200 Subject: Boostrap: Codegen: Generate object file --- src/bootstrap/codegen.src | 39 +++++++++++++++++++++++++++++++++++++++ src/bootstrap/llvm.src | 16 ++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/src/bootstrap/codegen.src b/src/bootstrap/codegen.src index e4d3102..43b83e1 100644 --- a/src/bootstrap/codegen.src +++ b/src/bootstrap/codegen.src @@ -4,6 +4,7 @@ let codegen = struct { llvm_module: *void, llvm_context: *void, builder: *void, + arena: *arena, }; let codegen_init = (alloc: *arena) => *codegen { @@ -22,6 +23,7 @@ let codegen_init = (alloc: *arena) => *codegen { (*c).llvm_module = module; (*c).llvm_context = context; (*c).builder = builder; + (*c).arena = alloc; return c; }; @@ -31,7 +33,44 @@ let codegen_generate = (c: *codegen) => i64 { }; 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, + ); + 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), + ); + println("Object file generated: %s", filename); + return 0; }; diff --git a/src/bootstrap/llvm.src b/src/bootstrap/llvm.src index 70a5065..4a9c349 100644 --- a/src/bootstrap/llvm.src +++ b/src/bootstrap/llvm.src @@ -12,3 +12,19 @@ extern LLVMShutdown = () => void; extern LLVMDisposeBuilder = (*void) => void; extern LLVMDumpModule = (*void) => void; +extern LLVMGetDefaultTargetTriple = () => *i8; +extern LLVMGetTargetFromTriple = (*i8, **void, **i8) => i64; +extern LLVMDisposeMessage = (*i8) => void; +extern LLVMCreateTargetMachine = (*void, *i8, *i8, *i8, i64, i64, i64) => *void; + +let LLVMCodeGenLevelDefault = 2; +let LLVMRelocDefault = 0; +let LLVMCodeModelDefault = 0; + +extern LLVMVerifyModule = (*void, i64, **i8) => i64; + +let LLVMAbortProcessAction = 0; + +extern LLVMTargetMachineEmitToFile = (*void, *void, *i8, i64, **i8) => i64; + +let LLVMObjectFile = 1; -- cgit 1.4.1