Adds return values to linker stages

This commit is contained in:
Platin21
2021-04-05 19:28:19 +02:00
parent f78b2a6090
commit 66fb2a94ee
+63 -42
View File
@@ -121,7 +121,6 @@ i32 system_exec_command_line_app(char const *name, char const *fmt, ...) {
gb_printf_err("%s\n\n", cmd_line); gb_printf_err("%s\n\n", cmd_line);
} }
exit_code = system(cmd_line); exit_code = system(cmd_line);
// pid_t pid = fork(); // pid_t pid = fork();
// int status = 0; // int status = 0;
@@ -147,12 +146,7 @@ i32 system_exec_command_line_app(char const *name, char const *fmt, ...) {
// status = WEXITSTATUS(s); // status = WEXITSTATUS(s);
// } // }
// exit_code = status; // exit_code = status
if (exit_code) {
exit(exit_code);
}
return exit_code; return exit_code;
#endif #endif
} }
@@ -161,8 +155,9 @@ i32 system_exec_command_line_app(char const *name, char const *fmt, ...) {
#if defined(LLVM_BACKEND_SUPPORT) #if defined(LLVM_BACKEND_SUPPORT)
void linker_stage(lbGenerator *gen) { i32 linker_stage(lbGenerator *gen) {
Timings *timings = &global_timings; i32 result = 0;
Timings *timings = &global_timings;
String output_base = gen->output_base; String output_base = gen->output_base;
@@ -176,7 +171,7 @@ void linker_stage(lbGenerator *gen) {
if (build_context.cross_compiling && selected_target_metrics->metrics == &target_essence_amd64) { if (build_context.cross_compiling && selected_target_metrics->metrics == &target_essence_amd64) {
#ifdef GB_SYSTEM_UNIX #ifdef GB_SYSTEM_UNIX
system_exec_command_line_app("linker", "x86_64-essence-gcc \"%.*s.o\" -o \"%.*s\" %.*s %.*s", result = system_exec_command_line_app("linker", "x86_64-essence-gcc \"%.*s.o\" -o \"%.*s\" %.*s %.*s",
LIT(output_base), LIT(output_base), LIT(build_context.link_flags), LIT(build_context.extra_linker_flags)); LIT(output_base), LIT(output_base), LIT(build_context.link_flags), LIT(build_context.extra_linker_flags));
#else #else
gb_printf_err("Linking for cross compilation for this platform is not yet supported (%.*s %.*s)\n", gb_printf_err("Linking for cross compilation for this platform is not yet supported (%.*s %.*s)\n",
@@ -273,28 +268,30 @@ void linker_stage(lbGenerator *gen) {
char const *subsystem_str = build_context.use_subsystem_windows ? "WINDOWS" : "CONSOLE"; char const *subsystem_str = build_context.use_subsystem_windows ? "WINDOWS" : "CONSOLE";
if (!build_context.use_lld) { // msvc if (!build_context.use_lld) { // msvc
if (build_context.has_resource) { if (build_context.has_resource) {
system_exec_command_line_app("msvc-link", result = system_exec_command_line_app("msvc-link",
"\"rc.exe\" /nologo /fo \"%.*s.res\" \"%.*s.rc\"", "\"rc.exe\" /nologo /fo \"%.*s.res\" \"%.*s.rc\"",
LIT(output_base), LIT(output_base),
LIT(build_context.resource_filepath) LIT(build_context.resource_filepath)
); );
system_exec_command_line_app("msvc-link", if(result == 0) {
"\"%.*slink.exe\" %s \"%.*s.res\" -OUT:\"%.*s.%s\" %s " result = system_exec_command_line_app("msvc-link",
"/nologo /incremental:no /opt:ref /subsystem:%s " "\"%.*slink.exe\" %s \"%.*s.res\" -OUT:\"%.*s.%s\" %s "
" %.*s " "/nologo /incremental:no /opt:ref /subsystem:%s "
" %.*s " " %.*s "
" %s " " %.*s "
"", " %s "
LIT(find_result.vs_exe_path), object_files, LIT(output_base), LIT(output_base), output_ext, "",
link_settings, LIT(find_result.vs_exe_path), object_files, LIT(output_base), LIT(output_base), output_ext,
subsystem_str, link_settings,
LIT(build_context.link_flags), subsystem_str,
LIT(build_context.extra_linker_flags), LIT(build_context.link_flags),
lib_str LIT(build_context.extra_linker_flags),
); lib_str
);
}
} else { } else {
system_exec_command_line_app("msvc-link", result = system_exec_command_line_app("msvc-link",
"\"%.*slink.exe\" %s -OUT:\"%.*s.%s\" %s " "\"%.*slink.exe\" %s -OUT:\"%.*s.%s\" %s "
"/nologo /incremental:no /opt:ref /subsystem:%s " "/nologo /incremental:no /opt:ref /subsystem:%s "
" %.*s " " %.*s "
@@ -310,7 +307,7 @@ void linker_stage(lbGenerator *gen) {
); );
} }
} else { // lld } else { // lld
system_exec_command_line_app("msvc-link", result = system_exec_command_line_app("msvc-link",
"\"%.*s\\bin\\lld-link\" %s -OUT:\"%.*s.%s\" %s " "\"%.*s\\bin\\lld-link\" %s -OUT:\"%.*s.%s\" %s "
"/nologo /incremental:no /opt:ref /subsystem:%s " "/nologo /incremental:no /opt:ref /subsystem:%s "
" %.*s " " %.*s "
@@ -428,8 +425,8 @@ void linker_stage(lbGenerator *gen) {
output_ext = substring(build_context.out_filepath, pos, build_context.out_filepath.len); output_ext = substring(build_context.out_filepath, pos, build_context.out_filepath.len);
} }
} }
system_exec_command_line_app("ld-link", result = system_exec_command_line_app("ld-link",
"%s %s -o \"%.*s%.*s\" %s " "%s %s -o \"%.*s%.*s\" %s "
" %s " " %s "
" %.*s " " %.*s "
@@ -470,8 +467,8 @@ void linker_stage(lbGenerator *gen) {
#endif #endif
} }
return; return result;
} }
#endif #endif
@@ -2150,7 +2147,10 @@ int main(int arg_count, char const **arg_ptr) {
switch (build_context.build_mode) { switch (build_context.build_mode) {
case BuildMode_Executable: case BuildMode_Executable:
case BuildMode_DynamicLibrary: case BuildMode_DynamicLibrary:
linker_stage(&gen); i32 result = linker_stage(&gen);
if(result != 0) {
return 1;
}
break; break;
} }
@@ -2344,13 +2344,17 @@ int main(int arg_count, char const **arg_ptr) {
if (!build_context.use_lld) { // msvc if (!build_context.use_lld) { // msvc
if (build_context.has_resource) { if (build_context.has_resource) {
system_exec_command_line_app("msvc-link", i32 result = system_exec_command_line_app("msvc-link",
"\"rc.exe\" /nologo /fo \"%.*s.res\" \"%.*s.rc\"", "\"rc.exe\" /nologo /fo \"%.*s.res\" \"%.*s.rc\"",
LIT(output_base), LIT(output_base),
LIT(build_context.resource_filepath) LIT(build_context.resource_filepath)
); );
system_exec_command_line_app("msvc-link", if(result != 0) {
return 1;
}
result = system_exec_command_line_app("msvc-link",
"\"%.*slink.exe\" \"%.*s.obj\" \"%.*s.res\" -OUT:\"%.*s.%s\" %s " "\"%.*slink.exe\" \"%.*s.obj\" \"%.*s.res\" -OUT:\"%.*s.%s\" %s "
"/nologo /incremental:no /opt:ref /subsystem:%s " "/nologo /incremental:no /opt:ref /subsystem:%s "
" %.*s " " %.*s "
@@ -2364,8 +2368,13 @@ int main(int arg_count, char const **arg_ptr) {
LIT(build_context.extra_linker_flags), LIT(build_context.extra_linker_flags),
lib_str lib_str
); );
if(result != 0) {
return 1;
}
} else { } else {
system_exec_command_line_app("msvc-link", i32 result = system_exec_command_line_app("msvc-link",
"\"%.*slink.exe\" \"%.*s.obj\" -OUT:\"%.*s.%s\" %s " "\"%.*slink.exe\" \"%.*s.obj\" -OUT:\"%.*s.%s\" %s "
"/nologo /incremental:no /opt:ref /subsystem:%s " "/nologo /incremental:no /opt:ref /subsystem:%s "
" %.*s " " %.*s "
@@ -2379,9 +2388,13 @@ int main(int arg_count, char const **arg_ptr) {
LIT(build_context.extra_linker_flags), LIT(build_context.extra_linker_flags),
lib_str lib_str
); );
if(result != 0) {
return 1;
}
} }
} else { // lld } else { // lld
system_exec_command_line_app("msvc-link", i32 result = system_exec_command_line_app("msvc-link",
"\"%.*s\\bin\\lld-link\" \"%.*s.obj\" -OUT:\"%.*s.%s\" %s " "\"%.*s\\bin\\lld-link\" \"%.*s.obj\" -OUT:\"%.*s.%s\" %s "
"/nologo /incremental:no /opt:ref /subsystem:%s " "/nologo /incremental:no /opt:ref /subsystem:%s "
" %.*s " " %.*s "
@@ -2396,6 +2409,10 @@ int main(int arg_count, char const **arg_ptr) {
LIT(build_context.extra_linker_flags), LIT(build_context.extra_linker_flags),
lib_str lib_str
); );
if(result != 0) {
return 1;
}
} }
if (build_context.show_timings) { if (build_context.show_timings) {
@@ -2506,8 +2523,8 @@ int main(int arg_count, char const **arg_ptr) {
} }
} }
gb_printf("Started Linking!");
system_exec_command_line_app("ld-link", i32 result = system_exec_command_line_app("ld-link",
"%s \"%.*s.o\" -o \"%.*s%.*s\" %s " "%s \"%.*s.o\" -o \"%.*s%.*s\" %s "
" %s " " %s "
" %.*s " " %.*s "
@@ -2531,7 +2548,11 @@ int main(int arg_count, char const **arg_ptr) {
LIT(build_context.link_flags), LIT(build_context.link_flags),
LIT(build_context.extra_linker_flags), LIT(build_context.extra_linker_flags),
link_settings); link_settings);
if(result != 0) {
return 1;
}
#if defined(GB_SYSTEM_OSX) #if defined(GB_SYSTEM_OSX)
if (build_context.ODIN_DEBUG) { if (build_context.ODIN_DEBUG) {
// NOTE: macOS links DWARF symbols dynamically. Dsymutil will map the stubs in the exe // NOTE: macOS links DWARF symbols dynamically. Dsymutil will map the stubs in the exe
@@ -2558,6 +2579,6 @@ int main(int arg_count, char const **arg_ptr) {
#endif #endif
} }
} }
return 0; return 0;
} }