diff options
Diffstat (limited to 'src/llvm_backend.cpp')
| -rw-r--r-- | src/llvm_backend.cpp | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 554323b54..2b6604f44 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -9384,6 +9384,8 @@ bool lb_init_generator(lbGenerator *gen, Checker *c) { } } gbAllocator ha = heap_allocator(); + array_init(&gen->output_object_paths, ha); + gen->output_base = path_to_full_path(ha, gen->output_base); gbString output_file_path = gb_string_make_length(ha, gen->output_base.text, gen->output_base.len); @@ -9394,6 +9396,7 @@ bool lb_init_generator(lbGenerator *gen, Checker *c) { lb_init_module(&gen->module, c); + return true; } @@ -10362,6 +10365,7 @@ void lb_generate_code(lbGenerator *gen) { LLVMAddPromoteMemoryToRegisterPass(function_pass_manager); LLVMAddMergedLoadStoreMotionPass(function_pass_manager); + LLVMAddDeadStoreEliminationPass(function_pass_manager); LLVMAddAggressiveInstCombinerPass(function_pass_manager); LLVMAddConstantPropagationPass(function_pass_manager); LLVMAddAggressiveDCEPass(function_pass_manager); @@ -10376,6 +10380,7 @@ void lb_generate_code(lbGenerator *gen) { } } + TIME_SECTION("LLVM Runtime Creation"); lbProcedure *startup_runtime = nullptr; { // Startup Runtime @@ -10502,12 +10507,15 @@ void lb_generate_code(lbGenerator *gen) { defer (LLVMDisposeMessage(llvm_error)); String filepath_ll = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".ll")); - String filepath_obj = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".obj")); defer (gb_free(heap_allocator(), filepath_ll.text)); - defer (gb_free(heap_allocator(), filepath_obj.text)); + + String filepath_obj = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".obj")); - LLVMBool failure = LLVMPrintModuleToFile(mod, cast(char const *)filepath_ll.text, &llvm_error); + if (build_context.keep_temp_files) { + TIME_SECTION("LLVM Print Module to File"); + LLVMPrintModuleToFile(mod, cast(char const *)filepath_ll.text, &llvm_error); + } LLVMDIBuilderFinalize(m->debug_builder); LLVMVerifyModule(mod, LLVMAbortProcessAction, &llvm_error); llvm_error = nullptr; @@ -10522,7 +10530,6 @@ void lb_generate_code(lbGenerator *gen) { LLVMInitializeAllDisassemblers(); LLVMInitializeNativeTarget(); - timings_start_section(&global_timings, str_lit("LLVM Object Generation")); char const *target_triple = "x86_64-pc-windows-msvc"; char const *target_data_layout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"; @@ -10532,9 +10539,13 @@ void lb_generate_code(lbGenerator *gen) { LLVMGetTargetFromTriple(target_triple, &target, &llvm_error); GB_ASSERT(target != nullptr); + TIME_SECTION("LLVM Create Target Machine"); + LLVMTargetMachineRef target_machine = LLVMCreateTargetMachine(target, target_triple, "generic", "", LLVMCodeGenLevelNone, LLVMRelocDefault, LLVMCodeModelDefault); defer (LLVMDisposeTargetMachine(target_machine)); + TIME_SECTION("LLVM Object Generation"); + LLVMBool ok = LLVMTargetMachineEmitToFile(target_machine, mod, cast(char *)filepath_obj.text, LLVMObjectFile, &llvm_error); if (ok) { gb_printf_err("LLVM Error: %s\n", llvm_error); @@ -10542,5 +10553,7 @@ void lb_generate_code(lbGenerator *gen) { return; } + array_add(&gen->output_object_paths, filepath_obj); + #undef TIME_SECTION } |