Add -lld flag for using "bin\lld-link.exe" on Windows

This commit is contained in:
gingerBill
2018-08-28 19:28:34 +01:00
parent 6181c4edb3
commit adbb3bb75f
2 changed files with 48 additions and 28 deletions
+1
View File
@@ -86,6 +86,7 @@ struct BuildContext {
bool no_bounds_check; bool no_bounds_check;
bool no_output_files; bool no_output_files;
bool no_crt; bool no_crt;
bool use_lld;
gbAffinity affinity; gbAffinity affinity;
isize thread_count; isize thread_count;
+47 -28
View File
@@ -213,6 +213,7 @@ enum BuildFlagKind {
BuildFlag_CrossLibDir, BuildFlag_CrossLibDir,
BuildFlag_NoBoundsCheck, BuildFlag_NoBoundsCheck,
BuildFlag_NoCRT, BuildFlag_NoCRT,
BuildFlag_UseLLD,
BuildFlag_COUNT, BuildFlag_COUNT,
}; };
@@ -253,7 +254,8 @@ bool parse_build_flags(Array<String> args) {
add_flag(&build_flags, BuildFlag_CrossCompile, str_lit("cross-compile"), BuildFlagParam_String); add_flag(&build_flags, BuildFlag_CrossCompile, str_lit("cross-compile"), BuildFlagParam_String);
add_flag(&build_flags, BuildFlag_CrossLibDir, str_lit("cross-lib-dir"), BuildFlagParam_String); add_flag(&build_flags, BuildFlag_CrossLibDir, str_lit("cross-lib-dir"), BuildFlagParam_String);
add_flag(&build_flags, BuildFlag_NoBoundsCheck, str_lit("no-bounds-check"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_NoBoundsCheck, str_lit("no-bounds-check"), BuildFlagParam_None);
add_flag(&build_flags, BuildFlag_NoCRT, str_lit("no-crt"), 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);
GB_ASSERT(args.count >= 3); GB_ASSERT(args.count >= 3);
Array<String> flag_args = array_slice(args, 3, args.count); Array<String> flag_args = array_slice(args, 3, args.count);
@@ -557,6 +559,10 @@ bool parse_build_flags(Array<String> args) {
case BuildFlag_NoCRT: case BuildFlag_NoCRT:
build_context.no_crt = true; build_context.no_crt = true;
break; break;
case BuildFlag_UseLLD:
build_context.use_lld = true;
break;
} }
} }
@@ -684,7 +690,7 @@ i32 exec_llvm_llc(String output_base) {
#if defined(GB_SYSTEM_WINDOWS) #if defined(GB_SYSTEM_WINDOWS)
// For more arguments: http://llvm.org/docs/CommandGuide/llc.html // For more arguments: http://llvm.org/docs/CommandGuide/llc.html
return system_exec_command_line_app("llvm-llc", false, return system_exec_command_line_app("llvm-llc", false,
"\"%.*sbin/llc\" \"%.*s.bc\" -filetype=obj -O%d " "\"%.*sbin\\llc\" \"%.*s.bc\" -filetype=obj -O%d "
"-o \"%.*s.obj\" " "-o \"%.*s.obj\" "
"%.*s " "%.*s "
"", "",
@@ -899,45 +905,58 @@ int main(int arg_count, char **arg_ptr) {
link_settings = gb_string_append_fmt(link_settings, "/DLL"); link_settings = gb_string_append_fmt(link_settings, "/DLL");
} else { } else {
link_settings = gb_string_append_fmt(link_settings, "/ENTRY:mainCRTStartup"); link_settings = gb_string_append_fmt(link_settings, "/ENTRY:mainCRTStartup");
if (build_context.no_crt) { }
link_settings = gb_string_append_fmt(link_settings, " /nodefaultlib"); if (build_context.no_crt) {
} link_settings = gb_string_append_fmt(link_settings, " /nodefaultlib");
} else {
link_settings = gb_string_append_fmt(link_settings, " /defaultlib:libcmt");
} }
if (ir_gen.module.generate_debug_info) { if (ir_gen.module.generate_debug_info) {
link_settings = gb_string_append_fmt(link_settings, " /DEBUG"); link_settings = gb_string_append_fmt(link_settings, " /DEBUG");
} }
if (!build_context.use_lld) { // msvc
if (build_context.has_resource) {
exit_code = system_exec_command_line_app("msvc-link", true,
"rc /nologo /fo \"%.*s.res\" \"%.*s.rc\"",
LIT(output_base),
LIT(build_context.resource_filepath)
);
if(build_context.has_resource) { if (exit_code != 0) {
exit_code = system_exec_command_line_app("msvc-link", true, return exit_code;
"rc /nologo /fo \"%.*s.res\" \"%.*s.rc\"", }
LIT(output_base),
LIT(build_context.resource_filepath)
);
if (exit_code != 0) { exit_code = system_exec_command_line_app("msvc-link", true,
return exit_code; "link \"%.*s.obj\" \"%.*s.res\" -OUT:\"%.*s.%s\" %s "
"/nologo /incremental:no /opt:ref /subsystem:CONSOLE "
" %.*s "
" %s "
"",
LIT(output_base), LIT(output_base), LIT(output_base), output_ext,
lib_str, LIT(build_context.link_flags),
link_settings
);
} else {
exit_code = system_exec_command_line_app("msvc-link", true,
"link \"%.*s.obj\" -OUT:\"%.*s.%s\" %s "
"/nologo /incremental:no /opt:ref /subsystem:CONSOLE "
" %.*s "
" %s "
"",
LIT(output_base), LIT(output_base), output_ext,
lib_str, LIT(build_context.link_flags),
link_settings
);
} }
} else { // lld
exit_code = system_exec_command_line_app("msvc-link", true, exit_code = system_exec_command_line_app("msvc-link", true,
"link \"%.*s.obj\" \"%.*s.res\" -OUT:\"%.*s.%s\" %s " "\"%.*s\\bin\\lld-link\" \"%.*s.obj\" -OUT:\"%.*s.%s\" %s "
"/defaultlib:libcmt "
"/nologo /incremental:no /opt:ref /subsystem:CONSOLE "
" %.*s "
" %s "
"",
LIT(output_base), LIT(output_base), LIT(output_base), output_ext,
lib_str, LIT(build_context.link_flags),
link_settings
);
} else {
exit_code = system_exec_command_line_app("msvc-link", true,
"link \"%.*s.obj\" -OUT:\"%.*s.%s\" %s "
"/defaultlib:libcmt "
"/nologo /incremental:no /opt:ref /subsystem:CONSOLE " "/nologo /incremental:no /opt:ref /subsystem:CONSOLE "
" %.*s " " %.*s "
" %s " " %s "
"", "",
LIT(build_context.ODIN_ROOT),
LIT(output_base), LIT(output_base), output_ext, LIT(output_base), LIT(output_base), output_ext,
lib_str, LIT(build_context.link_flags), lib_str, LIT(build_context.link_flags),
link_settings link_settings