aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-04-21 23:25:08 +0100
committergingerBill <bill@gingerbill.org>2021-04-21 23:25:08 +0100
commit2fb0383e82e34d5bf0dd222f03649ce7abb1288f (patch)
tree6ce0214339bba863c7ef2645cf4a603ffa8a197f /src
parent8077d5f5657e93625a5c04ce8b36832790d84196 (diff)
Add `-build-mode:llvm-ir` for `-llvm-api` backend
Diffstat (limited to 'src')
-rw-r--r--src/build_settings.cpp1
-rw-r--r--src/llvm_backend.cpp8
-rw-r--r--src/main.cpp2
3 files changed, 10 insertions, 1 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp
index a2e955178..ba9d9b8e5 100644
--- a/src/build_settings.cpp
+++ b/src/build_settings.cpp
@@ -104,6 +104,7 @@ enum BuildModeKind {
BuildMode_DynamicLibrary,
BuildMode_Object,
BuildMode_Assembly,
+ BuildMode_LLVM_IR,
};
enum CommandKind : u32 {
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 62d5a58a6..1a4e5db55 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -9692,6 +9692,7 @@ bool lb_is_const_nil(lbValue value) {
String lb_get_const_string(lbModule *m, lbValue value) {
GB_ASSERT(lb_is_const(value));
+ GB_ASSERT(LLVMIsConstant(value.value));
Type *t = base_type(value.type);
GB_ASSERT(are_types_identical(t, t_string));
@@ -14220,13 +14221,18 @@ void lb_generate_code(lbGenerator *gen) {
return;
}
llvm_error = nullptr;
- if (build_context.keep_temp_files) {
+ if (build_context.keep_temp_files ||
+ build_context.build_mode == BuildMode_LLVM_IR) {
TIME_SECTION("LLVM Print Module to File");
if (LLVMPrintModuleToFile(mod, cast(char const *)filepath_ll.text, &llvm_error)) {
gb_printf_err("LLVM Error: %s\n", llvm_error);
gb_exit(1);
return;
}
+ if (build_context.build_mode == BuildMode_LLVM_IR) {
+ gb_exit(0);
+ return;
+ }
}
TIME_SECTION("LLVM Object Generation");
diff --git a/src/main.cpp b/src/main.cpp
index 20190a187..6686af4ef 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1109,6 +1109,8 @@ bool parse_build_flags(Array<String> args) {
build_context.build_mode = BuildMode_Executable;
} else if (str == "asm" || str == "assembly" || str == "assembler") {
build_context.build_mode = BuildMode_Assembly;
+ } else if (str == "llvm" || str == "llvm-ir") {
+ build_context.build_mode = BuildMode_LLVM_IR;
} else {
gb_printf_err("Unknown build mode '%.*s'\n", LIT(str));
bad_flags = true;