diff options
| author | gingerBill <bill@gingerbill.org> | 2020-10-20 12:35:12 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2020-10-20 12:35:12 +0100 |
| commit | 4e5b8f2c61f09f3f328f1b8dcd4aeaa65a864f33 (patch) | |
| tree | 8e75a2938b012b3243e1b894a48fe778f856062b /src | |
| parent | 0be6ddc7e2149a1f6b8fbc08ecf2674926c11785 (diff) | |
Add `-build-mode:assembly` for `-llvm-api`
Diffstat (limited to 'src')
| -rw-r--r-- | src/build_settings.cpp | 1 | ||||
| -rw-r--r-- | src/llvm_backend.cpp | 36 | ||||
| -rw-r--r-- | src/main.cpp | 21 |
3 files changed, 40 insertions, 18 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 2f425fe71..ed259f7cd 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -101,6 +101,7 @@ enum BuildModeKind { BuildMode_Executable, BuildMode_DynamicLibrary, BuildMode_Object, + BuildMode_Assembly, }; diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 921f996f6..10d37a08b 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -11872,9 +11872,12 @@ void lb_generate_code(lbGenerator *gen) { } } + // GB_ASSERT_MSG(LLVMTargetHasAsmBackend(target)); + LLVMTargetMachineRef target_machine = LLVMCreateTargetMachine(target, target_triple, llvm_cpu, llvm_features, LLVMCodeGenLevelNone, LLVMRelocDefault, code_mode); defer (LLVMDisposeTargetMachine(target_machine)); + LLVMSetModuleDataLayout(mod, LLVMCreateTargetDataLayout(target_machine)); { // Debug Info @@ -12461,18 +12464,25 @@ void lb_generate_code(lbGenerator *gen) { defer (gb_free(heap_allocator(), filepath_ll.text)); String filepath_obj = {}; - switch (build_context.metrics.os) { - case TargetOs_windows: - filepath_obj = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".obj")); - break; - case TargetOs_darwin: - case TargetOs_linux: - case TargetOs_essence: - filepath_obj = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".o")); - break; - case TargetOs_js: - filepath_obj = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".wasm-obj")); - break; + LLVMCodeGenFileType code_gen_file_type = LLVMObjectFile; + + if (build_context.build_mode == BuildMode_Assembly) { + filepath_obj = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".S")); + code_gen_file_type = LLVMAssemblyFile; + } else { + switch (build_context.metrics.os) { + case TargetOs_windows: + filepath_obj = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".obj")); + break; + case TargetOs_darwin: + case TargetOs_linux: + case TargetOs_essence: + filepath_obj = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".o")); + break; + case TargetOs_js: + filepath_obj = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".wasm-obj")); + break; + } } @@ -12492,8 +12502,6 @@ void lb_generate_code(lbGenerator *gen) { TIME_SECTION("LLVM Object Generation"); - LLVMCodeGenFileType code_gen_file_type = LLVMObjectFile; - if (LLVMTargetMachineEmitToFile(target_machine, mod, cast(char *)filepath_obj.text, code_gen_file_type, &llvm_error)) { gb_printf_err("LLVM Error: %s\n", llvm_error); gb_exit(1); diff --git a/src/main.cpp b/src/main.cpp index 64da5b5b4..149c1522d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1061,6 +1061,8 @@ bool parse_build_flags(Array<String> args) { build_context.build_mode = BuildMode_Object; } else if (str == "exe") { build_context.build_mode = BuildMode_Executable; + } else if (str == "asm" || str == "assembly" || str == "assembler") { + build_context.build_mode = BuildMode_Assembly; } else { gb_printf_err("Unknown build mode '%.*s'\n", LIT(str)); bad_flags = true; @@ -1762,6 +1764,12 @@ int main(int arg_count, char const **arg_ptr) { return 1; } } + if (!build_context.use_llvm_api) { + if (build_context.build_mode == BuildMode_Assembly) { + print_usage_line(0, "-build-mode:assembly is only supported with the -llvm-api backend", LIT(args[0])); + return 1; + } + } init_universal(); // TODO(bill): prevent compiling without a linker @@ -1825,11 +1833,16 @@ int main(int arg_count, char const **arg_ptr) { } lb_generate_code(&gen); - if (build_context.build_mode != BuildMode_Object) { - i32 linker_stage_exit_count = linker_stage(&gen); - if (linker_stage_exit_count != 0) { - return linker_stage_exit_count; + switch (build_context.build_mode) { + case BuildMode_Executable: + case BuildMode_DynamicLibrary: + { + i32 linker_stage_exit_count = linker_stage(&gen); + if (linker_stage_exit_count != 0) { + return linker_stage_exit_count; + } } + break; } if (build_context.show_timings) { |