From 131e8d41870b091ebb9c506caa97415d5d8a6da9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 8 Oct 2024 11:57:54 +0100 Subject: Disable exe path test --- src/build_settings.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'src/build_settings.cpp') diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 7aff8e650..e365d0324 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -2049,19 +2049,19 @@ gb_internal bool init_build_paths(String init_filename) { return false; } - gbFile output_file_test; - const char* output_file_name = (const char*)output_file.text; - gbFileError output_test_err = gb_file_open_mode(&output_file_test, gbFileMode_Append | gbFileMode_Rw, output_file_name); - - if (output_test_err == 0) { - gb_file_close(&output_file_test); - gb_file_remove(output_file_name); - } else { - String output_file = path_to_string(ha, bc->build_paths[BuildPath_Output]); - defer (gb_free(ha, output_file.text)); - gb_printf_err("No write permissions for output path: %.*s\n", LIT(output_file)); - return false; - } + // gbFile output_file_test; + // const char* output_file_name = (const char*)output_file.text; + // gbFileError output_test_err = gb_file_open_mode(&output_file_test, gbFileMode_Append | gbFileMode_Rw, output_file_name); + + // if (output_test_err == 0) { + // gb_file_close(&output_file_test); + // gb_file_remove(output_file_name); + // } else { + // String output_file = path_to_string(ha, bc->build_paths[BuildPath_Output]); + // defer (gb_free(ha, output_file.text)); + // gb_printf_err("No write permissions for output path: %.*s\n", LIT(output_file)); + // return false; + // } if (build_context.sanitizer_flags & SanitizerFlag_Address) { switch (build_context.metrics.os) { -- cgit v1.2.3 From 35f1b0f11ebb97910f3b4c82abd4a87dd52985f9 Mon Sep 17 00:00:00 2001 From: 0dminnimda <0dminnimda@gmail.com> Date: Mon, 4 Nov 2024 02:17:21 +0300 Subject: Add support for linking as pie --- src/build_settings.cpp | 9 ++++++++- src/linker.cpp | 24 ++++++++++++++++++++++-- src/main.cpp | 21 +++++++++++++++++++++ 3 files changed, 51 insertions(+), 3 deletions(-) (limited to 'src/build_settings.cpp') diff --git a/src/build_settings.cpp b/src/build_settings.cpp index e365d0324..c37f24f12 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -257,6 +257,12 @@ enum RelocMode : u8 { RelocMode_DynamicNoPIC, }; +enum LinkPIE : u8 { + LinkPIE_Default, + LinkPIE_No, + LinkPIE_Yes, +}; + enum BuildPath : u8 { BuildPath_Main_Package, // Input Path to the package directory (or file) we're building. BuildPath_RC, // Input Path for .rc file, can be set with `-resource:`. @@ -453,7 +459,7 @@ struct BuildContext { bool no_threaded_checker; bool show_debug_messages; - + bool copy_file_contents; bool no_rtti; @@ -467,6 +473,7 @@ struct BuildContext { bool print_linker_flags; RelocMode reloc_mode; + LinkPIE link_pie; bool disable_red_zone; isize max_error_count; diff --git a/src/linker.cpp b/src/linker.cpp index 2ed0987ac..6b16c6489 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -605,9 +605,29 @@ gb_internal i32 linker_stage(LinkerData *gen) { link_settings = gb_string_appendc(link_settings, "-Wl,-fini,'_odin_exit_point' "); } - } else if (build_context.metrics.os != TargetOs_openbsd && build_context.metrics.os != TargetOs_haiku && build_context.metrics.arch != TargetArch_riscv64) { - // OpenBSD and Haiku default to PIE executable. do not pass -no-pie for it. + } + + switch (build_context.link_pie) { + case (LinkPIE_Default): + if (build_context.build_mode != BuildMode_DynamicLibrary) { + if (build_context.metrics.os != TargetOs_openbsd + && build_context.metrics.os != TargetOs_haiku + && build_context.metrics.arch != TargetArch_riscv64 + ) { + // OpenBSD and Haiku default to PIE executable. do not pass -no-pie for it. + link_settings = gb_string_appendc(link_settings, "-no-pie "); + } + } + break; + case (LinkPIE_Yes): + if (build_context.build_mode != BuildMode_Executable) { + compiler_error("linking NON-EXECUTABLE as pie (position independent EXECUTABLE)"); + } + link_settings = gb_string_appendc(link_settings, "-pie "); + break; + case (LinkPIE_No): link_settings = gb_string_appendc(link_settings, "-no-pie "); + break; } gbString platform_lib_str = gb_string_make(heap_allocator(), ""); diff --git a/src/main.cpp b/src/main.cpp index 1574ac544..5d017d51a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -360,6 +360,7 @@ enum BuildFlagKind { BuildFlag_NoThreadLocal, BuildFlag_RelocMode, + BuildFlag_LinkPIE, BuildFlag_DisableRedZone, BuildFlag_DisallowDo, @@ -570,6 +571,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_MinimumOSVersion, str_lit("minimum-os-version"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_RelocMode, str_lit("reloc-mode"), BuildFlagParam_String, Command__does_build); + add_flag(&build_flags, BuildFlag_LinkPIE, str_lit("link-pie"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_DisableRedZone, str_lit("disable-red-zone"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_DisallowDo, str_lit("disallow-do"), BuildFlagParam_None, Command__does_check); @@ -1332,6 +1334,25 @@ gb_internal bool parse_build_flags(Array args) { break; } + case BuildFlag_LinkPIE: { + GB_ASSERT(value.kind == ExactValue_String); + String v = value.value_string; + if (v == "default") { + build_context.link_pie = LinkPIE_Default; + } else if (v == "yes" || v == "true") { + build_context.link_pie = LinkPIE_Yes; + } else if (v == "no" || v == "false") { + build_context.link_pie = LinkPIE_No; + } else { + gb_printf_err("-link-pie flag expected one of the following\n"); + gb_printf_err("\tdefault\n"); + gb_printf_err("\tyes, true\n"); + gb_printf_err("\tno, false\n"); + bad_flags = true; + } + + break; + } case BuildFlag_DisableRedZone: build_context.disable_red_zone = true; break; -- cgit v1.2.3 From c26e7e17a18bac7f188535749240c6cc2709a633 Mon Sep 17 00:00:00 2001 From: 0dminnimda <0dminnimda@gmail.com> Date: Mon, 4 Nov 2024 15:39:06 +0300 Subject: Simplify use of pie --- src/build_settings.cpp | 7 ------- src/linker.cpp | 29 +++++++++-------------------- src/main.cpp | 21 --------------------- 3 files changed, 9 insertions(+), 48 deletions(-) (limited to 'src/build_settings.cpp') diff --git a/src/build_settings.cpp b/src/build_settings.cpp index c37f24f12..e4413b1fe 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -257,12 +257,6 @@ enum RelocMode : u8 { RelocMode_DynamicNoPIC, }; -enum LinkPIE : u8 { - LinkPIE_Default, - LinkPIE_No, - LinkPIE_Yes, -}; - enum BuildPath : u8 { BuildPath_Main_Package, // Input Path to the package directory (or file) we're building. BuildPath_RC, // Input Path for .rc file, can be set with `-resource:`. @@ -473,7 +467,6 @@ struct BuildContext { bool print_linker_flags; RelocMode reloc_mode; - LinkPIE link_pie; bool disable_red_zone; isize max_error_count; diff --git a/src/linker.cpp b/src/linker.cpp index 6b16c6489..1ffec3bf7 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -607,27 +607,16 @@ gb_internal i32 linker_stage(LinkerData *gen) { } - switch (build_context.link_pie) { - case (LinkPIE_Default): - if (build_context.build_mode != BuildMode_DynamicLibrary) { - if (build_context.metrics.os != TargetOs_openbsd - && build_context.metrics.os != TargetOs_haiku - && build_context.metrics.arch != TargetArch_riscv64 - ) { - // OpenBSD and Haiku default to PIE executable. do not pass -no-pie for it. - link_settings = gb_string_appendc(link_settings, "-no-pie "); - } - } - break; - case (LinkPIE_Yes): - if (build_context.build_mode != BuildMode_Executable) { - compiler_error("linking NON-EXECUTABLE as pie (position independent EXECUTABLE)"); + if (build_context.build_mode == BuildMode_Executable && build_context.reloc_mode == RelocMode_PIC) { + // Do not disable PIE, let the linker choose. (most likely you want it enabled) + } else if (build_context.build_mode != BuildMode_DynamicLibrary) { + if (build_context.metrics.os != TargetOs_openbsd + && build_context.metrics.os != TargetOs_haiku + && build_context.metrics.arch != TargetArch_riscv64 + ) { + // OpenBSD and Haiku default to PIE executable. do not pass -no-pie for it. + link_settings = gb_string_appendc(link_settings, "-no-pie "); } - link_settings = gb_string_appendc(link_settings, "-pie "); - break; - case (LinkPIE_No): - link_settings = gb_string_appendc(link_settings, "-no-pie "); - break; } gbString platform_lib_str = gb_string_make(heap_allocator(), ""); diff --git a/src/main.cpp b/src/main.cpp index 5d017d51a..1574ac544 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -360,7 +360,6 @@ enum BuildFlagKind { BuildFlag_NoThreadLocal, BuildFlag_RelocMode, - BuildFlag_LinkPIE, BuildFlag_DisableRedZone, BuildFlag_DisallowDo, @@ -571,7 +570,6 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_MinimumOSVersion, str_lit("minimum-os-version"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_RelocMode, str_lit("reloc-mode"), BuildFlagParam_String, Command__does_build); - add_flag(&build_flags, BuildFlag_LinkPIE, str_lit("link-pie"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_DisableRedZone, str_lit("disable-red-zone"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_DisallowDo, str_lit("disallow-do"), BuildFlagParam_None, Command__does_check); @@ -1334,25 +1332,6 @@ gb_internal bool parse_build_flags(Array args) { break; } - case BuildFlag_LinkPIE: { - GB_ASSERT(value.kind == ExactValue_String); - String v = value.value_string; - if (v == "default") { - build_context.link_pie = LinkPIE_Default; - } else if (v == "yes" || v == "true") { - build_context.link_pie = LinkPIE_Yes; - } else if (v == "no" || v == "false") { - build_context.link_pie = LinkPIE_No; - } else { - gb_printf_err("-link-pie flag expected one of the following\n"); - gb_printf_err("\tdefault\n"); - gb_printf_err("\tyes, true\n"); - gb_printf_err("\tno, false\n"); - bad_flags = true; - } - - break; - } case BuildFlag_DisableRedZone: build_context.disable_red_zone = true; break; -- cgit v1.2.3 From 925d8749e030c9dec49a5e27080000a4f950d625 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 7 Nov 2024 12:56:49 +0100 Subject: Suggest `-microarch:native` if `popcnt` instruction is missing. Fixes #4453. --- src/bug_report.cpp | 21 --------------------- src/build_cpuid.cpp | 35 +++++++++++++++++++++++++++++++++++ src/build_settings.cpp | 1 + src/main.cpp | 13 +++++++++++++ 4 files changed, 49 insertions(+), 21 deletions(-) create mode 100644 src/build_cpuid.cpp (limited to 'src/build_settings.cpp') diff --git a/src/bug_report.cpp b/src/bug_report.cpp index c5a8adea3..3f58ebd24 100644 --- a/src/bug_report.cpp +++ b/src/bug_report.cpp @@ -2,12 +2,6 @@ Gather and print platform and version info to help with reporting Odin bugs. */ -#if !defined(GB_COMPILER_MSVC) - #if defined(GB_CPU_X86) - #include - #endif -#endif - #if defined(GB_SYSTEM_LINUX) #include #include @@ -154,21 +148,6 @@ gb_internal void report_windows_product_type(DWORD ProductType) { } #endif -gb_internal void odin_cpuid(int leaf, int result[]) { - #if defined(GB_CPU_ARM) || defined(GB_CPU_RISCV) - return; - - #elif defined(GB_CPU_X86) - - #if defined(GB_COMPILER_MSVC) - __cpuid(result, leaf); - #else - __get_cpuid(leaf, (unsigned int*)&result[0], (unsigned int*)&result[1], (unsigned int*)&result[2], (unsigned int*)&result[3]); - #endif - - #endif -} - gb_internal void report_cpu_info() { gb_printf("\tCPU: "); diff --git a/src/build_cpuid.cpp b/src/build_cpuid.cpp new file mode 100644 index 000000000..a4e44e7f1 --- /dev/null +++ b/src/build_cpuid.cpp @@ -0,0 +1,35 @@ +#if !defined(GB_COMPILER_MSVC) + #if defined(GB_CPU_X86) + #include + #endif +#endif + +gb_internal void odin_cpuid(int leaf, int result[]) { + #if defined(GB_CPU_ARM) || defined(GB_CPU_RISCV) + return; + + #elif defined(GB_CPU_X86) + + #if defined(GB_COMPILER_MSVC) + __cpuid(result, leaf); + #else + __get_cpuid(leaf, (unsigned int*)&result[0], (unsigned int*)&result[1], (unsigned int*)&result[2], (unsigned int*)&result[3]); + #endif + + #endif +} + +gb_internal bool should_use_march_native() { + #if !defined(GB_CPU_X86) + return false; + + #else + + int cpu[4]; + odin_cpuid(0x1, &cpu[0]); // Get feature information in ECX + EDX + + bool have_popcnt = cpu[2] && (1 << 23); // bit 23 in ECX = popcnt + return !have_popcnt; + + #endif +} \ No newline at end of file diff --git a/src/build_settings.cpp b/src/build_settings.cpp index e4413b1fe..142076a70 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -2,6 +2,7 @@ #include #include #endif +#include "build_cpuid.cpp" // #if defined(GB_SYSTEM_WINDOWS) // #define DEFAULT_TO_THREADED_CHECKER diff --git a/src/main.cpp b/src/main.cpp index b04ee90f1..e65f866a1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3321,6 +3321,19 @@ int main(int arg_count, char const **arg_ptr) { } } + #if defined(GB_CPU_X86) + // We've detected that the CPU doesn't support popcnt, or another reason to use `-microarch:native`, + // and that no custom microarch was chosen. + if (should_use_march_native() && march == get_default_microarchitecture()) { + if (command == "run" || command == "test") { + gb_printf_err("Error: Try using '-microarch:native' as Odin defaults to %.*s (close to Nehalem) by default and your CPU seems to be a much older CPU.\n", LIT(march)); + gb_exit(1); + } else if (command == "build") { + gb_printf("Suggestion: Try using '-microarch:native' as Odin defaults to %.*s (close to Nehalem) by default and your CPU seems to be a much older CPU.\n", LIT(march)); + } + } + #endif + if (build_context.target_features_string.len != 0) { String_Iterator target_it = {build_context.target_features_string, 0}; for (;;) { -- cgit v1.2.3 From 21a25bddde9781a1e4c678e1c680435075d6080a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 14 Nov 2024 16:32:26 +0000 Subject: Add `-radlink` --- src/build_settings.cpp | 3 ++- src/linker.cpp | 61 +++++++++++++++++++++++++++++++++----------------- src/main.cpp | 9 ++++++++ 3 files changed, 52 insertions(+), 21 deletions(-) (limited to 'src/build_settings.cpp') diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 142076a70..d62d6598c 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -420,6 +420,7 @@ struct BuildContext { bool no_entry_point; bool no_thread_local; bool use_lld; + bool use_radlink; bool cross_compiling; bool different_os; bool keep_object_files; @@ -1871,7 +1872,7 @@ gb_internal bool init_build_paths(String init_filename) { return false; } - if (!build_context.use_lld && find_result.vs_exe_path.len == 0) { + if (!build_context.use_lld && !build_context.use_radlink && find_result.vs_exe_path.len == 0) { gb_printf_err("link.exe not found.\n"); return false; } diff --git a/src/linker.cpp b/src/linker.cpp index 1ffec3bf7..200bd9429 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -169,6 +169,8 @@ gb_internal i32 linker_stage(LinkerData *gen) { String section_name = str_lit("msvc-link"); if (build_context.use_lld) { section_name = str_lit("lld-link"); + } else if (build_context.use_radlink) { + section_name = str_lit("rad-link"); } timings_start_section(timings, section_name); @@ -304,7 +306,45 @@ gb_internal i32 linker_stage(LinkerData *gen) { String windows_sdk_bin_path = path_to_string(heap_allocator(), build_context.build_paths[BuildPath_Win_SDK_Bin_Path]); defer (gb_free(heap_allocator(), windows_sdk_bin_path.text)); - if (!build_context.use_lld) { // msvc + if (build_context.use_lld) { // lld + result = system_exec_command_line_app("msvc-lld-link", + "\"%.*s\\bin\\lld-link\" %s -OUT:\"%.*s\" %s " + "/nologo /incremental:no /opt:ref /subsystem:%.*s " + "%.*s " + "%.*s " + "%s " + "", + LIT(build_context.ODIN_ROOT), object_files, LIT(output_filename), + link_settings, + LIT(build_context.ODIN_WINDOWS_SUBSYSTEM), + LIT(build_context.link_flags), + LIT(build_context.extra_linker_flags), + lib_str + ); + + if (result) { + return result; + } + } else if (build_context.use_radlink) { + result = system_exec_command_line_app("msvc-rad-link", + "\"%.*s\\bin\\radlink\" %s -OUT:\"%.*s\" %s " + "/nologo /incremental:no /opt:ref /subsystem:%.*s " + "%.*s " + "%.*s " + "%s " + "", + LIT(build_context.ODIN_ROOT), object_files, LIT(output_filename), + link_settings, + LIT(build_context.ODIN_WINDOWS_SUBSYSTEM), + LIT(build_context.link_flags), + LIT(build_context.extra_linker_flags), + lib_str + ); + + if (result) { + return result; + } + } else { // msvc String res_path = quote_path(heap_allocator(), build_context.build_paths[BuildPath_RES]); String rc_path = quote_path(heap_allocator(), build_context.build_paths[BuildPath_RC]); defer (gb_free(heap_allocator(), res_path.text)); @@ -362,25 +402,6 @@ gb_internal i32 linker_stage(LinkerData *gen) { LIT(build_context.extra_linker_flags), lib_str ); - if (result) { - return result; - } - } else { // lld - result = system_exec_command_line_app("msvc-lld-link", - "\"%.*s\\bin\\lld-link\" %s -OUT:\"%.*s\" %s " - "/nologo /incremental:no /opt:ref /subsystem:%.*s " - "%.*s " - "%.*s " - "%s " - "", - LIT(build_context.ODIN_ROOT), object_files, LIT(output_filename), - link_settings, - LIT(build_context.ODIN_WINDOWS_SUBSYSTEM), - LIT(build_context.link_flags), - LIT(build_context.extra_linker_flags), - lib_str - ); - if (result) { return result; } diff --git a/src/main.cpp b/src/main.cpp index 450049bd8..1b342b2ff 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -328,6 +328,7 @@ enum BuildFlagKind { BuildFlag_NoRPath, BuildFlag_NoEntryPoint, BuildFlag_UseLLD, + BuildFlag_UseRADLink, BuildFlag_UseSeparateModules, BuildFlag_NoThreadedChecker, BuildFlag_ShowDebugMessages, @@ -539,6 +540,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_NoRPath, str_lit("no-rpath"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_NoEntryPoint, str_lit("no-entry-point"), BuildFlagParam_None, Command__does_check &~ Command_test); add_flag(&build_flags, BuildFlag_UseLLD, str_lit("lld"), BuildFlagParam_None, Command__does_build); + add_flag(&build_flags, BuildFlag_UseRADLink, str_lit("radlink"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_UseSeparateModules, str_lit("use-separate-modules"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_NoThreadedChecker, str_lit("no-threaded-checker"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_ShowDebugMessages, str_lit("show-debug-messages"), BuildFlagParam_None, Command_all); @@ -1203,6 +1205,9 @@ gb_internal bool parse_build_flags(Array args) { case BuildFlag_UseLLD: build_context.use_lld = true; break; + case BuildFlag_UseRADLink: + build_context.use_radlink = true; + break; case BuildFlag_UseSeparateModules: build_context.use_separate_modules = true; break; @@ -2508,6 +2513,10 @@ gb_internal void print_show_help(String const arg0, String const &command) { } if (run_or_build) { + print_usage_line(1, "-radlink"); + print_usage_line(2, "Uses the RAD linker rather than the default."); + print_usage_line(0, ""); + print_usage_line(1, "-reloc-mode:"); print_usage_line(2, "Specifies the reloc mode."); print_usage_line(2, "Available options:"); -- cgit v1.2.3 From b9886dfcc79fd40c077feab2f81aa3b4d8ebbc6f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 14 Nov 2024 17:04:45 +0000 Subject: Add `-linker:` to replace `-lld` and `-radlink` --- src/build_settings.cpp | 22 +++++++++++++++++++--- src/linker.cpp | 21 +++++++++++++-------- src/main.cpp | 47 ++++++++++++++++++++++++++++++++++++++--------- 3 files changed, 70 insertions(+), 20 deletions(-) (limited to 'src/build_settings.cpp') diff --git a/src/build_settings.cpp b/src/build_settings.cpp index d62d6598c..4177cc2fa 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -344,6 +344,22 @@ struct BuildCacheData { bool copy_already_done; }; + +enum LinkerChoice : i32 { + Linker_Invalid = -1, + Linker_Default = 0, + Linker_lld, + Linker_radlink, + + Linker_COUNT, +}; + +String linker_choices[Linker_COUNT] = { + str_lit("default"), + str_lit("lld"), + str_lit("radlink"), +}; + // This stores the information for the specify architecture of this build struct BuildContext { // Constants @@ -419,13 +435,13 @@ struct BuildContext { bool no_rpath; bool no_entry_point; bool no_thread_local; - bool use_lld; - bool use_radlink; bool cross_compiling; bool different_os; bool keep_object_files; bool disallow_do; + LinkerChoice linker_choice; + StringSet custom_attributes; bool strict_style; @@ -1872,7 +1888,7 @@ gb_internal bool init_build_paths(String init_filename) { return false; } - if (!build_context.use_lld && !build_context.use_radlink && find_result.vs_exe_path.len == 0) { + if (build_context.linker_choice != Linker_Default && find_result.vs_exe_path.len == 0) { gb_printf_err("link.exe not found.\n"); return false; } diff --git a/src/linker.cpp b/src/linker.cpp index 200bd9429..261d6e7a4 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -167,10 +167,10 @@ gb_internal i32 linker_stage(LinkerData *gen) { if (is_windows) { String section_name = str_lit("msvc-link"); - if (build_context.use_lld) { - section_name = str_lit("lld-link"); - } else if (build_context.use_radlink) { - section_name = str_lit("rad-link"); + switch (build_context.linker_choice) { + case Linker_Default: break; + case Linker_lld: section_name = str_lit("lld-link"); break; + case Linker_radlink: section_name = str_lit("rad-link"); break; } timings_start_section(timings, section_name); @@ -306,7 +306,8 @@ gb_internal i32 linker_stage(LinkerData *gen) { String windows_sdk_bin_path = path_to_string(heap_allocator(), build_context.build_paths[BuildPath_Win_SDK_Bin_Path]); defer (gb_free(heap_allocator(), windows_sdk_bin_path.text)); - if (build_context.use_lld) { // lld + switch (build_context.linker_choice) { + case Linker_lld: result = system_exec_command_line_app("msvc-lld-link", "\"%.*s\\bin\\lld-link\" %s -OUT:\"%.*s\" %s " "/nologo /incremental:no /opt:ref /subsystem:%.*s " @@ -325,7 +326,8 @@ gb_internal i32 linker_stage(LinkerData *gen) { if (result) { return result; } - } else if (build_context.use_radlink) { + break; + case Linker_radlink: result = system_exec_command_line_app("msvc-rad-link", "\"%.*s\\bin\\radlink\" %s -OUT:\"%.*s\" %s " "/nologo /incremental:no /opt:ref /subsystem:%.*s " @@ -344,7 +346,8 @@ gb_internal i32 linker_stage(LinkerData *gen) { if (result) { return result; } - } else { // msvc + break; + default: { // msvc String res_path = quote_path(heap_allocator(), build_context.build_paths[BuildPath_RES]); String rc_path = quote_path(heap_allocator(), build_context.build_paths[BuildPath_RC]); defer (gb_free(heap_allocator(), res_path.text)); @@ -405,6 +408,8 @@ gb_internal i32 linker_stage(LinkerData *gen) { if (result) { return result; } + break; + } } } else { timings_start_section(timings, str_lit("ld-link")); @@ -700,7 +705,7 @@ gb_internal i32 linker_stage(LinkerData *gen) { link_command_line = gb_string_append_fmt(link_command_line, " %.*s ", LIT(build_context.extra_linker_flags)); link_command_line = gb_string_append_fmt(link_command_line, " %s ", link_settings); - if (build_context.use_lld) { + if (build_context.linker_choice == Linker_lld) { link_command_line = gb_string_append_fmt(link_command_line, " -fuse-ld=lld"); result = system_exec_command_line_app("lld-link", link_command_line); } else { diff --git a/src/main.cpp b/src/main.cpp index 20acccd14..e58e30183 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -329,6 +329,7 @@ enum BuildFlagKind { BuildFlag_NoEntryPoint, BuildFlag_UseLLD, BuildFlag_UseRADLink, + BuildFlag_Linker, BuildFlag_UseSeparateModules, BuildFlag_NoThreadedChecker, BuildFlag_ShowDebugMessages, @@ -541,6 +542,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_NoEntryPoint, str_lit("no-entry-point"), BuildFlagParam_None, Command__does_check &~ Command_test); add_flag(&build_flags, BuildFlag_UseLLD, str_lit("lld"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_UseRADLink, str_lit("radlink"), BuildFlagParam_None, Command__does_build); + add_flag(&build_flags, BuildFlag_Linker, str_lit("Linker"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_UseSeparateModules, str_lit("use-separate-modules"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_NoThreadedChecker, str_lit("no-threaded-checker"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_ShowDebugMessages, str_lit("show-debug-messages"), BuildFlagParam_None, Command_all); @@ -1203,19 +1205,38 @@ gb_internal bool parse_build_flags(Array args) { build_context.no_thread_local = true; break; case BuildFlag_UseLLD: - if (build_context.use_radlink) { - gb_printf_err("-lld cannot be used along side -radlink\n"); - bad_flags = true; - } - build_context.use_lld = true; + gb_printf_err("Warning: Use of -lld has been deprecated in favour of -linker:lld\n"); + build_context.linker_choice = Linker_lld; break; case BuildFlag_UseRADLink: - if (build_context.use_lld) { - gb_printf_err("-radlink cannot be used along side -lld\n"); - bad_flags = true; + gb_printf_err("Warning: Use of -lld has been deprecated in favour of -linker:radlink\n"); + build_context.linker_choice = Linker_radlink; + break; + case BuildFlag_Linker: + { + GB_ASSERT(value.kind == ExactValue_String); + LinkerChoice linker_choice = Linker_Invalid; + + for (i32 i = 0; i < Linker_COUNT; i++) { + if (linker_choices[i] == value.value_string) { + linker_choice = cast(LinkerChoice)i; + break; + } + } + + if (linker_choice == Linker_Invalid) { + gb_printf_err("Invalid option for -linker:. Expected one of the following\n"); + for (i32 i = 0; i < Linker_COUNT; i++) { + gb_printf_err("\t%.*s\n", LIT(linker_choices[i])); + } + bad_flags = true; + } else { + build_context.linker_choice = linker_choice; + } } - build_context.use_radlink = true; break; + + case BuildFlag_UseSeparateModules: build_context.use_separate_modules = true; break; @@ -2400,6 +2421,14 @@ gb_internal void print_show_help(String const arg0, String const &command) { } if (run_or_build) { + print_usage_line(1, "-linker:"); + print_usage_line(2, "Specify the linker to use."); + print_usage_line(2, "Choices:"); + for (i32 i = 0; i < Linker_COUNT; i++) { + print_usage_line(3, "%.*s", LIT(linker_choices[i])); + } + print_usage_line(0, ""); + print_usage_line(1, "-lld"); print_usage_line(2, "Uses the LLD linker rather than the default."); print_usage_line(0, ""); -- cgit v1.2.3 From 7adb4c91d48faa1182aa5a94acc97a20c1366cdc Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 14 Nov 2024 17:05:34 +0000 Subject: Fix typo --- 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 4177cc2fa..50fae93b8 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1888,7 +1888,7 @@ gb_internal bool init_build_paths(String init_filename) { return false; } - if (build_context.linker_choice != Linker_Default && find_result.vs_exe_path.len == 0) { + if (build_context.linker_choice == Linker_Default && find_result.vs_exe_path.len == 0) { gb_printf_err("link.exe not found.\n"); return false; } -- cgit v1.2.3