From f98c4d683791e34a077e628bdcac0a0ed32dc065 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 19 Apr 2021 12:31:31 +0100 Subject: Improve the `Allocator` interface to support returning `Allocator_Error` to allow for safer calls Virtually all code (except for user-written custom allocators) should work as normal. Extra features will need to be added to make the current procedures support the `Allocator_Error` return value (akin to #optional_ok) --- src/build_settings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/build_settings.cpp') diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 8df045a82..a2e955178 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -838,7 +838,7 @@ void init_build_context(TargetMetrics *cross_target) { bc->link_flags = str_lit("-arch arm64 "); break; } - if (!bc->use_llvm_api) { + if ((bc->command_kind & Command__does_build) != 0 && !bc->use_llvm_api) { gb_printf_err("The arm64 architecture is only supported with -llvm-api\n");; gb_exit(1); } -- cgit v1.2.3 From 2fb0383e82e34d5bf0dd222f03649ce7abb1288f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 21 Apr 2021 23:25:08 +0100 Subject: Add `-build-mode:llvm-ir` for `-llvm-api` backend --- src/build_settings.cpp | 1 + src/llvm_backend.cpp | 8 +++++++- src/main.cpp | 2 ++ 3 files changed, 10 insertions(+), 1 deletion(-) (limited to 'src/build_settings.cpp') 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 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; -- cgit v1.2.3 From 5b3802b8cafd465185395f2475df98bb171be7af Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 21 Apr 2021 23:39:48 +0100 Subject: Add new `-o:` flag as an alternative to `-opt:` --- src/build_settings.cpp | 2 +- src/main.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) (limited to 'src/build_settings.cpp') diff --git a/src/build_settings.cpp b/src/build_settings.cpp index ba9d9b8e5..92ac5d284 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -114,7 +114,7 @@ enum CommandKind : u32 { Command_query = 1<<4, Command_doc = 1<<5, Command_version = 1<<6, - Command_test = 1<<7, + Command_test = 1<<7, Command__does_check = Command_run|Command_build|Command_check|Command_query|Command_doc|Command_test, Command__does_build = Command_run|Command_build|Command_test, diff --git a/src/main.cpp b/src/main.cpp index 6686af4ef..c08495c18 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -571,6 +571,7 @@ enum BuildFlagKind { BuildFlag_OutFile, BuildFlag_OptimizationLevel, + BuildFlag_OptimizationMode, BuildFlag_ShowTimings, BuildFlag_ShowUnused, BuildFlag_ShowUnusedWithLocation, @@ -687,6 +688,8 @@ bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_Help, str_lit("help"), BuildFlagParam_None, Command_all); add_flag(&build_flags, BuildFlag_OutFile, str_lit("out"), BuildFlagParam_String, Command__does_build &~ Command_test); add_flag(&build_flags, BuildFlag_OptimizationLevel, str_lit("opt"), BuildFlagParam_Integer, Command__does_build); + add_flag(&build_flags, BuildFlag_OptimizationMode, str_lit("o"), BuildFlagParam_String, Command__does_build); + add_flag(&build_flags, BuildFlag_OptimizationMode, str_lit("O"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_ShowTimings, str_lit("show-timings"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_ShowMoreTimings, str_lit("show-more-timings"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_ShowUnused, str_lit("show-unused"), BuildFlagParam_None, Command_check); @@ -885,8 +888,36 @@ bool parse_build_flags(Array args) { } case BuildFlag_OptimizationLevel: GB_ASSERT(value.kind == ExactValue_Integer); + if (set_flags[BuildFlag_OptimizationMode]) { + gb_printf_err("Mixture of -opt and -o is not allowed\n"); + bad_flags = true; + break; + } build_context.optimization_level = cast(i32)big_int_to_i64(&value.value_integer); break; + case BuildFlag_OptimizationMode: + GB_ASSERT(value.kind == ExactValue_String); + if (set_flags[BuildFlag_OptimizationLevel]) { + gb_printf_err("Mixture of -opt and -o is not allowed\n"); + bad_flags = true; + break; + } + + if (value.value_string == "minimal") { + build_context.optimization_level = 0; + } else if (value.value_string == "size") { + build_context.optimization_level = 1; + } else if (value.value_string == "speed") { + build_context.optimization_level = 2; + } else { + gb_printf_err("Invalid optimization mode for -o:, got %.*s\n", LIT(value.value_string)); + gb_printf_err("Valid optimization modes:\n"); + gb_printf_err("\tminimal\n"); + gb_printf_err("\tsize\n"); + gb_printf_err("\tspeed\n"); + bad_flags = true; + } + break; case BuildFlag_ShowTimings: GB_ASSERT(value.kind == ExactValue_Invalid); build_context.show_timings = true; @@ -1113,6 +1144,12 @@ bool parse_build_flags(Array args) { build_context.build_mode = BuildMode_LLVM_IR; } else { gb_printf_err("Unknown build mode '%.*s'\n", LIT(str)); + gb_printf_err("Valid build modes:\n"); + gb_printf_err("\tdll, shared\n"); + gb_printf_err("\tobj, object\n"); + gb_printf_err("\texe\n"); + gb_printf_err("\tasm, assembly, assembler\n"); + gb_printf_err("\tllvm, llvm-ir\n"); bad_flags = true; break; } @@ -1614,6 +1651,10 @@ void print_show_help(String const arg0, String const &command) { print_usage_line(1, "-all-packages"); print_usage_line(2, "Generates documentation for all packages used in the current project"); print_usage_line(0, ""); + + print_usage_line(1, "-doc-format"); + print_usage_line(2, "Generates documentation as the .odin-doc format (useful for external tooling)"); + print_usage_line(0, ""); } if (run_or_build) { @@ -1623,10 +1664,16 @@ void print_show_help(String const arg0, String const &command) { print_usage_line(0, ""); print_usage_line(1, "-opt:"); - print_usage_line(2, "Set the optimization level for complication"); + print_usage_line(2, "Set the optimization level for compliation"); print_usage_line(2, "Accepted values: 0, 1, 2, 3"); print_usage_line(2, "Example: -opt:2"); print_usage_line(0, ""); + + print_usage_line(1, "-o:"); + print_usage_line(2, "Set the optimization mode for compliation"); + print_usage_line(2, "Accepted values: minimal, size, speed"); + print_usage_line(2, "Example: -o:speed"); + print_usage_line(0, ""); } if (check) { -- cgit v1.2.3