import "llvm.src"; let codegen = struct { llvm_module: *void, llvm_context: *void, builder: *void, arena: *arena, }; let codegen_init = (alloc: *arena) => *codegen { LLVMInitializeAllTargetInfos(); LLVMInitializeAllTargetMCs(); LLVMInitializeAllTargets(); LLVMInitializeAllAsmPrinters(); LLVMInitializeAllAsmParsers(); 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; };