diff --git a/src/build_settings.cpp b/src/build_settings.cpp index a2881f801..0aa9977a5 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -275,6 +275,7 @@ struct BuildContext { bool no_output_files; bool no_crt; bool no_entry_point; + bool no_thread_local; bool use_lld; bool vet; bool vet_extra; diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 7978aa0ef..5c25dd6a3 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -1143,9 +1143,12 @@ gb_internal void check_global_variable_decl(CheckerContext *ctx, Entity *&e, Ast if (is_arch_wasm() && e->Variable.thread_local_model.len != 0) { e->Variable.thread_local_model.len = 0; - // NOTE(bill): ignore this message for the time begin + // NOTE(bill): ignore this message for the time being // error(e->token, "@(thread_local) is not supported for this target platform"); } + if(build_context.no_thread_local) { + e->Variable.thread_local_model.len = 0; + } String context_name = str_lit("variable declaration"); diff --git a/src/main.cpp b/src/main.cpp index 066675b36..9a2a1ebf8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -634,6 +634,7 @@ enum BuildFlagKind { BuildFlag_Microarch, BuildFlag_TargetFeatures, BuildFlag_MinimumOSVersion, + BuildFlag_NoThreadLocal, BuildFlag_RelocMode, BuildFlag_DisableRedZone, @@ -794,6 +795,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_Debug, str_lit("debug"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_DisableAssert, str_lit("disable-assert"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_NoBoundsCheck, str_lit("no-bounds-check"), BuildFlagParam_None, Command__does_check); + add_flag(&build_flags, BuildFlag_NoThreadLocal, str_lit("no-thread-local"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_NoDynamicLiterals, str_lit("no-dynamic-literals"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_NoCRT, str_lit("no-crt"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_NoEntryPoint, str_lit("no-entry-point"), BuildFlagParam_None, Command__does_check &~ Command_test); @@ -1312,6 +1314,9 @@ gb_internal bool parse_build_flags(Array args) { case BuildFlag_NoEntryPoint: build_context.no_entry_point = true; break; + case BuildFlag_NoThreadLocal: + build_context.no_thread_local = true; + break; case BuildFlag_UseLLD: build_context.use_lld = true; break; @@ -2064,6 +2069,10 @@ gb_internal void print_show_help(String const arg0, String const &command) { print_usage_line(2, "Disables automatic linking with the C Run Time"); print_usage_line(0, ""); + print_usage_line(1, "-no-thread-local"); + print_usage_line(2, "Ignore @thread_local attribute, effectively treating the program as if it is single-threaded"); + print_usage_line(0, ""); + print_usage_line(1, "-lld"); print_usage_line(2, "Use the LLD linker rather than the default"); print_usage_line(0, "");