From 301e1d2ff3954453213aefa271263cd2644849f1 Mon Sep 17 00:00:00 2001 From: F0x1fy Date: Tue, 10 Nov 2020 09:50:53 -0700 Subject: [PATCH 1/4] Added -no-entry-point flag and relevant check. --- src/build_settings.cpp | 1 + src/checker.cpp | 2 +- src/main.cpp | 7 +++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index ed259f7cd..4f06c2913 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -151,6 +151,7 @@ struct BuildContext { bool no_dynamic_literals; bool no_output_files; bool no_crt; + bool no_entry_point; bool use_lld; bool vet; bool cross_compiling; diff --git a/src/checker.cpp b/src/checker.cpp index 5c93e12b6..ac324fffa 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -4572,7 +4572,7 @@ void check_parsed_files(Checker *c) { TIME_SECTION("check entry point"); - if (build_context.build_mode == BuildMode_Executable) { + if (build_context.build_mode == BuildMode_Executable && !build_context.no_entry_point) { Scope *s = c->info.init_scope; GB_ASSERT(s != nullptr); GB_ASSERT(s->flags&ScopeFlag_Init); diff --git a/src/main.cpp b/src/main.cpp index 1ae0e7d97..68d4a03c6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -581,6 +581,7 @@ enum BuildFlagKind { BuildFlag_NoBoundsCheck, BuildFlag_NoDynamicLiterals, BuildFlag_NoCRT, + BuildFlag_NoEntryPoint, BuildFlag_UseLLD, BuildFlag_Vet, BuildFlag_UseLLVMApi, @@ -591,6 +592,7 @@ enum BuildFlagKind { BuildFlag_DisallowDo, BuildFlag_DefaultToNilAllocator, + BuildFlag_Compact, BuildFlag_GlobalDefinitions, BuildFlag_GoToDefinitions, @@ -680,6 +682,7 @@ bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_DisableAssert, str_lit("disable-assert"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_NoBoundsCheck, str_lit("no-bounds-check"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_NoDynamicLiterals, str_lit("no-dynamic-literals"), BuildFlagParam_None); + add_flag(&build_flags, BuildFlag_NoEntryPoint, str_lit("no-entry-point"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_NoCRT, str_lit("no-crt"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_UseLLD, str_lit("lld"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_Vet, str_lit("vet"), BuildFlagParam_None); @@ -1095,6 +1098,10 @@ bool parse_build_flags(Array args) { build_context.no_crt = true; break; + case BuildFlag_NoEntryPoint: + build_context.no_entry_point = true; + break; + case BuildFlag_UseLLD: build_context.use_lld = true; break; From 3bed5fad77e8dcd42d7eab40d9c7d50ce4cc47c4 Mon Sep 17 00:00:00 2001 From: F0x1fy Date: Tue, 10 Nov 2020 09:55:00 -0700 Subject: [PATCH 2/4] Removed unnecessary newline from previous commit. --- src/main.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 68d4a03c6..5757cdd79 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -592,7 +592,6 @@ enum BuildFlagKind { BuildFlag_DisallowDo, BuildFlag_DefaultToNilAllocator, - BuildFlag_Compact, BuildFlag_GlobalDefinitions, BuildFlag_GoToDefinitions, From 6b6f1a5283c90f187e9ffc7feeda2dad6a3a5c8d Mon Sep 17 00:00:00 2001 From: F0x1fy Date: Tue, 10 Nov 2020 09:56:16 -0700 Subject: [PATCH 3/4] For the sake of consistency, fixed the placement of the -no-entry-point flag check. --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 5757cdd79..3717a4147 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -681,8 +681,8 @@ bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_DisableAssert, str_lit("disable-assert"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_NoBoundsCheck, str_lit("no-bounds-check"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_NoDynamicLiterals, str_lit("no-dynamic-literals"), BuildFlagParam_None); - add_flag(&build_flags, BuildFlag_NoEntryPoint, str_lit("no-entry-point"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_NoCRT, str_lit("no-crt"), BuildFlagParam_None); + add_flag(&build_flags, BuildFlag_NoEntryPoint, str_lit("no-entry-point"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_UseLLD, str_lit("lld"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_Vet, str_lit("vet"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_UseLLVMApi, str_lit("llvm-api"), BuildFlagParam_None); From 0eba4b46b5e554f1df01b63084ac4e78abfe3117 Mon Sep 17 00:00:00 2001 From: F0x1fy Date: Tue, 10 Nov 2020 10:16:22 -0700 Subject: [PATCH 4/4] Made sure the entry point is not generated when -no-entry-point is specified. --- src/ir.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ir.cpp b/src/ir.cpp index 2b3bd35df..dc77906e8 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -12646,7 +12646,7 @@ void ir_gen_tree(irGen *s) { #if defined(GB_SYSTEM_WINDOWS) - if (build_context.build_mode == BuildMode_DynamicLibrary && !has_dll_main) { + if (build_context.build_mode == BuildMode_DynamicLibrary && !has_dll_main && !build_context.no_entry_point) { // DllMain :: proc(inst: rawptr, reason: u32, reserved: rawptr) -> i32 String name = str_lit("DllMain"); Type *proc_params = alloc_type_tuple(); @@ -12717,7 +12717,7 @@ void ir_gen_tree(irGen *s) { ir_emit_return(proc, v_one32); } #endif - if (!(build_context.build_mode == BuildMode_DynamicLibrary && !has_dll_main)) { + if (!(build_context.build_mode == BuildMode_DynamicLibrary && !has_dll_main) && !build_context.no_entry_point) { // main :: proc(argc: i32, argv: ^^u8) -> i32 String name = str_lit("main"); @@ -12796,7 +12796,7 @@ void ir_gen_tree(irGen *s) { } #if defined(GB_SYSTEM_WINDOWS) - if (build_context.build_mode != BuildMode_DynamicLibrary && build_context.no_crt) { + if (build_context.build_mode != BuildMode_DynamicLibrary && build_context.no_crt && !build_context.no_entry_point) { s->print_chkstk = true; {