aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-10-20 12:35:12 +0100
committergingerBill <bill@gingerbill.org>2020-10-20 12:35:12 +0100
commit4e5b8f2c61f09f3f328f1b8dcd4aeaa65a864f33 (patch)
tree8e75a2938b012b3243e1b894a48fe778f856062b /src
parent0be6ddc7e2149a1f6b8fbc08ecf2674926c11785 (diff)
Add `-build-mode:assembly` for `-llvm-api`
Diffstat (limited to 'src')
-rw-r--r--src/build_settings.cpp1
-rw-r--r--src/llvm_backend.cpp36
-rw-r--r--src/main.cpp21
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) {