From 8a1203ed35c94cf126cf74e3c2047e849dd3aec9 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 18 Mar 2026 16:50:06 -0700 Subject: [PATCH] add mutex around fprintf to linearize log --- src/linker/lnk.c | 13 ++- src/linker/lnk_config.c | 26 +++--- src/linker/lnk_error.c | 147 --------------------------------- src/linker/lnk_error.h | 140 ------------------------------- src/linker/lnk_log.c | 163 ++++++++++++++++++++++++++++++++++++- src/linker/lnk_log.h | 136 +++++++++++++++++++++++++++++++ src/torture/torture_main.c | 2 +- 7 files changed, 317 insertions(+), 310 deletions(-) delete mode 100644 src/linker/lnk_error.c delete mode 100644 src/linker/lnk_error.h diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 122db98a..ac84657d 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -88,7 +88,6 @@ // --- Linker ------------------------------------------------------------------ -#include "lnk_error.h" #include "lnk_log.h" #include "lnk_timer.h" #include "lnk_io.h" @@ -102,7 +101,6 @@ #include "lnk_debug_info.h" #include "lnk.h" -#include "lnk_error.c" #include "lnk_log.c" #include "lnk_timer.c" #include "lnk_io.c" @@ -5069,10 +5067,10 @@ lnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config) if (lnk_get_log_status(LNK_Log_Debug)) { String8 full_cmd_line = str8_list_join(scratch.arena, &config->raw_cmd_line, &(StringJoin){ .sep = str8_lit_comp(" ") }); - fprintf(stderr, "--------------------------------------------------------------------------------\n"); - fprintf(stderr, "Command Line: %.*s\n", str8_varg(full_cmd_line)); - fprintf(stderr, "Work Dir : %.*s\n", str8_varg(config->work_dir)); - fprintf(stderr, "--------------------------------------------------------------------------------\n"); + lnk_fprintf(stderr, "--------------------------------------------------------------------------------\n"); + lnk_fprintf(stderr, "Command Line: %.*s\n", str8_varg(full_cmd_line)); + lnk_fprintf(stderr, "Work Dir : %.*s\n", str8_varg(config->work_dir)); + lnk_fprintf(stderr, "--------------------------------------------------------------------------------\n"); } // @@ -5231,11 +5229,12 @@ internal void entry_point(CmdLine *cmdline) { Temp scratch = scratch_begin(0,0); - lnk_init_error_handler(); + lnk_log_begin(); LNK_Config *config = lnk_config_from_argcv(scratch.arena, cmdline->argc, cmdline->argv); TP_Context *tp = tp_alloc(scratch.arena, config->worker_count, config->max_worker_count, config->shared_thread_pool_name); TP_Arena *tp_arena = tp_arena_alloc(tp); lnk_run(tp, tp_arena, config); + lnk_log_end(); scratch_end(scratch); } diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 1088368f..7e72e2f1 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -976,10 +976,10 @@ lnk_include_symbol(LNK_Config *config, String8 name, LNK_Obj *obj) internal void lnk_print_build_info() { - fprintf(stdout, " Compiler: %s\n", COMPILER_STRING); - fprintf(stdout, " Mode : %s\n", BUILD_MODE_STRING); - fprintf(stdout, " Date : %s %s\n", __TIME__, __DATE__); - fprintf(stdout, " Version : %s\n", BUILD_VERSION_STRING_LITERAL); + lnk_fprintf(stdout, " Compiler: %s\n", COMPILER_STRING); + lnk_fprintf(stdout, " Mode : %s\n", BUILD_MODE_STRING); + lnk_fprintf(stdout, " Date : %s %s\n", __TIME__, __DATE__); + lnk_fprintf(stdout, " Version : %s\n", BUILD_VERSION_STRING_LITERAL); } internal void @@ -997,13 +997,13 @@ lnk_print_help(void) desc_max_size = Max(desc_max_size, strlen(g_cmd_switch_map[i].desc)); } - fprintf(stdout, "--- Help -------------------------------------------------------------------------------------------------------------------\n"); - fprintf(stdout, " %s\n", BUILD_TITLE_STRING_LITERAL); - fprintf(stdout, "\n"); - fprintf(stdout, " Usage: radlink.exe [Options] [Files] [@rsp]\n"); - fprintf(stdout, "\n"); + lnk_fprintf(stdout, "--- Help -------------------------------------------------------------------------------------------------------------------\n"); + lnk_fprintf(stdout, " %s\n", BUILD_TITLE_STRING_LITERAL); + lnk_fprintf(stdout, "\n"); + lnk_fprintf(stdout, " Usage: radlink.exe [Options] [Files] [@rsp]\n"); + lnk_fprintf(stdout, "\n"); - fprintf(stdout, " Options:\n"); + lnk_fprintf(stdout, " Options:\n"); U64 option_indent_size = 4; U64 option_name_max_size = 60; for EachElement(i, g_cmd_switch_map) { @@ -1047,12 +1047,12 @@ lnk_print_help(void) } String8 line = str8_list_join(temp.arena, &fmt, 0); - fprintf(stdout, "%.*s", str8_varg(line)); + lnk_fprintf(stdout, "%.*s", str8_varg(line)); temp_end(temp); } - fprintf(stdout, "\n"); + lnk_fprintf(stdout, "\n"); scratch_end(scratch); } @@ -2040,7 +2040,7 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List } break; case LNK_CmdSwitch_Rad_Version: { - fprintf(stdout, "%s\n", BUILD_TITLE_STRING_LITERAL); + lnk_fprintf(stdout, "%s\n", BUILD_TITLE_STRING_LITERAL); os_abort(0); } break; diff --git a/src/linker/lnk_error.c b/src/linker/lnk_error.c deleted file mode 100644 index 6a1272ef..00000000 --- a/src/linker/lnk_error.c +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -static LNK_ErrorMode g_error_mode_arr [LNK_Error_Count]; -static LNK_ErrorCodeStatus g_error_code_status_arr[LNK_Error_Count]; -static B32 g_log_status [LNK_Log_Count]; - -internal void -lnk_exit(int code) -{ - exit(code); -} - -internal void -lnk_init_error_handler(void) -{ - for (int i = LNK_Error_StopFirst; i < LNK_Error_StopLast; ++i) { - g_error_mode_arr[i] = LNK_ErrorMode_Stop; - } - for (int i = LNK_Error_First; i < LNK_Error_Last; ++i) { - g_error_mode_arr[i] = LNK_ErrorMode_Continue; - } - for (int i = LNK_Warning_First; i < LNK_Warning_Last; ++i) { - g_error_mode_arr[i] = LNK_ErrorMode_Warn; - } -} - -internal String8 -lnk_string_from_error_mode(LNK_ErrorMode mode) -{ - switch (mode) { - case LNK_ErrorMode_Ignore: return str8_lit("Ignore"); - case LNK_ErrorMode_Continue: return str8_lit("Error"); - case LNK_ErrorMode_Stop: return str8_lit("Error"); - case LNK_ErrorMode_Warn: return str8_lit("Warning"); - } - return str8_zero(); -} - -internal void -lnk_errorfv(LNK_ErrorCode code, char *fmt, va_list args) -{ - if (lnk_is_error_code_ignored(code)) { return; } - - Temp scratch = scratch_begin(0,0); - String8 message = push_str8fv(scratch.arena, fmt, args); - String8 string = push_str8f(scratch.arena, "%S(%03d): %S\n", lnk_string_from_error_mode(g_error_mode_arr[code]), code, message); - fprintf(stderr, "%.*s", str8_varg(string)); - scratch_end(scratch); - - if (g_error_mode_arr[code] == LNK_ErrorMode_Stop) { - lnk_exit(code); - } -} - -internal void -lnk_error(LNK_ErrorCode code, char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - lnk_errorfv(code, fmt, args); - va_end(args); -} - -internal void -lnk_error_with_loc_fv(LNK_ErrorCode code, String8 obj_path, String8 lib_path, char *fmt, va_list args) -{ - Temp scratch = scratch_begin(0, 0); - String8 text = push_str8fv(scratch.arena, fmt, args); - if (obj_path.size) { - if (lib_path.size) { - lnk_error(code, "%S(%S): %S", lib_path, str8_skip_last_slash(obj_path), text); - } else { - lnk_error(code, "%S: %S", obj_path, text); - } - } else { - lnk_error(code, "RADLINK: %S", text); - } - scratch_end(scratch); -} - -internal void -lnk_error_with_loc(LNK_ErrorCode code, String8 obj_path, String8 lib_path, char *fmt, ...) -{ - va_list args; va_start(args, fmt); - lnk_error_with_loc_fv(code, obj_path, lib_path, fmt, args); - va_end(args); -} - -internal void -lnk_supplement_error(char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - - Temp scratch = scratch_begin(0,0); - String8 string = push_str8fv(scratch.arena, fmt, args); - - fprintf(stderr, "\t"); - fprintf(stderr, "%.*s", str8_varg(string)); - fprintf(stderr, "\n"); - - va_end(args); - scratch_end(scratch); -} - -internal void -lnk_supplement_error_list(String8List list) -{ - for (String8Node *node = list.first; node != 0; node = node->next) { - lnk_supplement_error("%.*s", str8_varg(node->string)); - } -} - -internal void -lnk_ignore_error(LNK_ErrorCode code) -{ - g_error_code_status_arr[code] = LNK_ErrorCodeStatus_Ignore; -} - -internal void -lnk_activate_error(LNK_ErrorCode code) -{ - g_error_code_status_arr[code] = LNK_ErrorCodeStatus_Active; -} - -internal LNK_ErrorCodeStatus -lnk_get_error_code_status(LNK_ErrorCode code) -{ - return g_error_code_status_arr[code]; -} - -internal void -lnk_internal_error(LNK_InternalError code, char *file, int line, char *fmt, ...) -{ - Temp scratch = scratch_begin(0,0); - va_list args; - va_start(args, fmt); - - String8 issue = push_str8fv(scratch.arena, fmt, args); - fprintf(stderr, "internal error #%03d in %s:%u\n", code, file, line); - fprintf(stderr, "\t%.*s\n", str8_varg(issue)); - - va_end(args); - scratch_end(scratch); -} - diff --git a/src/linker/lnk_error.h b/src/linker/lnk_error.h deleted file mode 100644 index d7a58531..00000000 --- a/src/linker/lnk_error.h +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (c) Epic Games Tools -// Licensed under the MIT license (https://opensource.org/license/mit/) - -#pragma once - -typedef enum -{ - LNK_Error_Null, - - LNK_Error_StopFirst, - LNK_Error_Cmdl, - LNK_Error_EndprecompNotFound, - LNK_Error_EntryPoint, - LNK_Error_ExternalTypeServerConflict, - LNK_Error_FileNotFound, - LNK_Error_IllData, - LNK_Error_IllExport, - LNK_Error_IncomatibleCmdOptions, - LNK_Error_IncompatibleMachine, - LNK_Error_InvalidPrecompLeafCount, - LNK_Error_InvalidStartIndex, - LNK_Error_NoAccess, - LNK_Error_NoSubsystem, - LNK_Error_OutOfExportOrdinals, - LNK_Error_PrecompObjNotFound, - LNK_Error_PrecompSigMismatch, - LNK_Error_Telemetry, - LNK_Error_UnsupportedMachine, - LNK_Error_Mt, - LNK_Error_UnableToSerializeMsf, - LNK_Error_LoadRes, - LNK_Error_IO, - LNK_Error_LargeAddrAwareRequired, - LNK_Error_InvalidPath, - LNK_Error_MultiplyDefinedSymbol, - LNK_Error_SectRefsDiscardedMemory, - LNK_Error_IllegalSectionMerge, - LNK_Error_IllegalRelocation, - LNK_Error_CircularMerge, - LNK_Error_AssociativeLoop, - LNK_Error_AlternateNameConflict, - LNK_Error_RelocationAgainstRemovedSection, - LNK_Error_FailIfMismatch, - LNK_Error_StopLast, - - LNK_Error_First, - LNK_Error_AlreadyDefinedSymbol, - LNK_Error_CvPrecomp, - LNK_Error_Natvis, - LNK_Error_TooManyFiles, - LNK_Error_UnableToOpenTypeServer, - LNK_Error_UnexpectedCodePath, - LNK_Error_CvIllSymbolData, - LNK_Error_InvalidTypeIndex, - LNK_Error_UndefinedIsWeak, - LNK_Error_WeakCycle, - LNK_Error_InvalidLib, - LNK_Error_UnresolvedSymbol, - LNK_Error_Last, - - LNK_Warning_First, - LNK_Warning_InvalidMergeDirectiveFormat, - LNK_Warning_AmbiguousMerge, - LNK_Warning_AtypicalStartIndex, - LNK_Warning_Cmdl, - LNK_Warning_Directive, - LNK_Warning_DuplicateObjPath, - LNK_Warning_ExternalTypeServerAgeMismatch, - LNK_Warning_FileNotFound, - LNK_Warning_IllData, - LNK_Warning_IllExport, - LNK_Warning_InvalidNatvisFileExt, - LNK_Warning_LargePages, - LNK_Warning_LargePagesNotEnabled, - LNK_Warning_MismatchedTypeServerSignature, - LNK_Warning_MissingExternalTypeServer, - LNK_Warning_MultipleDebugTAndDebugP, - LNK_Warning_MultipleExternalTypeServers, - LNK_Warning_MultipleLibMatch, - LNK_Warning_MultiplyDefinedImport, - LNK_Warning_Natvis, - LNK_Warning_PrecompObjSymbolsNotFound, - LNK_Warning_SectionFlagsConflict, - LNK_Warning_Subsystem, - LNK_Warning_UnknownDirective, - LNK_Warning_IllegalDirective, - LNK_Warning_UnresolvedComdat, - LNK_Warning_UnusedDelayLoadDll, - LNK_Warning_LongSectionName, - LNK_Warning_UnknownSwitch, - LNK_Warning_TLSAlign, - LNK_Warning_DirectiveSectionWithRelocs, - LNK_Warning_NoLargeAddressAwarenessForDll, - LNK_Warning_TryingToExportEntryPoint, - LNK_Warning_Last, - - LNK_Error_Count -} LNK_ErrorCode; - -typedef enum -{ - LNK_ErrorMode_Ignore, - LNK_ErrorMode_Stop, - LNK_ErrorMode_Continue, - LNK_ErrorMode_Warn, -} LNK_ErrorMode; - -typedef enum -{ - LNK_InternalError_Null, - LNK_InternalError_NotImplemented, - LNK_InternalError_InvalidPath, - LNK_InternalError_IncompleteSwitch, - LNK_InternalError_OutOfMemory -} LNK_InternalError; - -typedef enum -{ - LNK_ErrorCodeStatus_Active, - LNK_ErrorCodeStatus_Ignore, -} LNK_ErrorCodeStatus; - -internal void lnk_init_error_handler(void); -internal void lnk_errorfv(LNK_ErrorCode code, char *fmt, va_list args); -internal void lnk_error(LNK_ErrorCode code, char *fmt, ...); -internal void lnk_error_with_loc(LNK_ErrorCode code, String8 obj_path, String8 lib_path, char *fmt, ...); -internal void lnk_supplement_error(char *fmt, ...); -internal void lnk_supplement_error_list(String8List list); -internal void lnk_ignore_error(LNK_ErrorCode code); -internal void lnk_activate_error(LNK_ErrorCode code); - -#define lnk_is_error_code_active(code) (lnk_get_error_code_status(code) == LNK_ErrorCodeStatus_Active) -#define lnk_is_error_code_ignored(code) (lnk_get_error_code_status(code) == LNK_ErrorCodeStatus_Ignore) -internal LNK_ErrorCodeStatus lnk_get_error_code_status(LNK_ErrorCode code); - -internal void lnk_internal_error(LNK_InternalError code, char *file, int line, char *fmt, ...); -#define lnk_invalid_path(...) lnk_internal_error(LNK_InternalError_InvalidPath, __FILE__, __LINE__, __VA_ARGS__) -#define lnk_not_implemented(...) lnk_internal_error(LNK_InternalError_NotImplemented, __FILE__, __LINE__, __VA_ARGS__) -#define lnk_incomplete_switch(...) lnk_internal_error(LNK_InternalError_IncompleteSwitch, __FILE__, __LINE__, __VA_ARGS__) - diff --git a/src/linker/lnk_log.c b/src/linker/lnk_log.c index 1904996c..17777ec0 100644 --- a/src/linker/lnk_log.c +++ b/src/linker/lnk_log.c @@ -1,6 +1,165 @@ // Copyright (c) Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +static Mutex g_log_mutex; +static B32 g_log_status [LNK_Log_Count]; +static LNK_ErrorMode g_error_mode_arr [LNK_Error_Count]; +static LNK_ErrorCodeStatus g_error_code_status_arr[LNK_Error_Count]; + +internal void +lnk_fprintf(FILE *f, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + mutex_take(g_log_mutex); + fprintf(f, "%.*s", str8_varg(string)); + mutex_drop(g_log_mutex); + va_end(args); + scratch_end(scratch); +} + +internal void +lnk_exit(int code) +{ + mutex_take(g_log_mutex); + fflush(stdout); + fflush(stderr); + _exit(code); + InvalidPath; +} + +internal void +lnk_log_begin(void) +{ + for (int i = LNK_Error_StopFirst; i < LNK_Error_StopLast; ++i) { g_error_mode_arr[i] = LNK_ErrorMode_Stop; } + for (int i = LNK_Error_ContinueFirst; i < LNK_Error_ContinueLast; ++i) { g_error_mode_arr[i] = LNK_ErrorMode_Continue; } + for (int i = LNK_Warning_First; i < LNK_Warning_Last; ++i) { g_error_mode_arr[i] = LNK_ErrorMode_Warn; } + g_log_mutex = mutex_alloc(); +} + +internal void +lnk_log_end(void) +{ + mutex_release(g_log_mutex); +} + +internal String8 +lnk_string_from_error_mode(LNK_ErrorMode mode) +{ + switch (mode) { + case LNK_ErrorMode_Ignore: return str8_lit("Ignore"); + case LNK_ErrorMode_Continue: return str8_lit("Error"); + case LNK_ErrorMode_Stop: return str8_lit("Error"); + case LNK_ErrorMode_Warn: return str8_lit("Warning"); + } + return str8_zero(); +} + +internal void +lnk_errorfv(LNK_ErrorCode code, char *fmt, va_list args) +{ + if (lnk_is_error_code_ignored(code)) { return; } + Temp scratch = scratch_begin(0,0); + String8 message = push_str8fv(scratch.arena, fmt, args); + lnk_fprintf(stderr, "%S(%03d): %S\n", lnk_string_from_error_mode(g_error_mode_arr[code]), code, message); + scratch_end(scratch); + if (g_error_mode_arr[code] == LNK_ErrorMode_Stop) { lnk_exit(code); } +} + +internal void +lnk_error(LNK_ErrorCode code, char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + lnk_errorfv(code, fmt, args); + va_end(args); +} + +internal void +lnk_error_with_loc_fv(LNK_ErrorCode code, String8 obj_path, String8 lib_path, char *fmt, va_list args) +{ + Temp scratch = scratch_begin(0, 0); + String8 text = push_str8fv(scratch.arena, fmt, args); + if (obj_path.size) { + if (lib_path.size) { + lnk_error(code, "%S(%S): %S", lib_path, str8_skip_last_slash(obj_path), text); + } else { + lnk_error(code, "%S: %S", obj_path, text); + } + } else { + lnk_error(code, "RADLINK: %S", text); + } + scratch_end(scratch); +} + +internal void +lnk_error_with_loc(LNK_ErrorCode code, String8 obj_path, String8 lib_path, char *fmt, ...) +{ + va_list args; va_start(args, fmt); + lnk_error_with_loc_fv(code, obj_path, lib_path, fmt, args); + va_end(args); +} + +internal void +lnk_supplement_error(char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + + Temp scratch = scratch_begin(0,0); + String8 string = push_str8fv(scratch.arena, fmt, args); + + lnk_fprintf(stderr, "\t"); + lnk_fprintf(stderr, "%.*s", str8_varg(string)); + lnk_fprintf(stderr, "\n"); + + va_end(args); + scratch_end(scratch); +} + +internal void +lnk_supplement_error_list(String8List list) +{ + for (String8Node *node = list.first; node != 0; node = node->next) { + lnk_supplement_error("%.*s", str8_varg(node->string)); + } +} + +internal void +lnk_ignore_error(LNK_ErrorCode code) +{ + g_error_code_status_arr[code] = LNK_ErrorCodeStatus_Ignore; +} + +internal void +lnk_activate_error(LNK_ErrorCode code) +{ + g_error_code_status_arr[code] = LNK_ErrorCodeStatus_Active; +} + +internal LNK_ErrorCodeStatus +lnk_get_error_code_status(LNK_ErrorCode code) +{ + return g_error_code_status_arr[code]; +} + +internal void +lnk_internal_error(LNK_InternalError code, char *file, int line, char *fmt, ...) +{ + Temp scratch = scratch_begin(0,0); + va_list args; + va_start(args, fmt); + + String8 issue = push_str8fv(scratch.arena, fmt, args); + lnk_fprintf(stderr, "internal error #%03d in %s:%u\n", code, file, line); + lnk_fprintf(stderr, "\t%.*s\n", str8_varg(issue)); + + va_end(args); + scratch_end(scratch); +} + internal void lnk_set_log_status(LNK_LogType type, B32 is_enabled) { @@ -23,7 +182,7 @@ lnk_log(LNK_LogType type, char *fmt, ...) va_list args; va_start(args, fmt); String8 string = push_str8fv(scratch.arena, fmt, args); - fprintf(stdout, "%.*s\n", str8_varg(string)); + lnk_fprintf(stdout, "%.*s\n", str8_varg(string)); va_end(args); scratch_end(scratch); } @@ -49,7 +208,7 @@ lnk_log_type_from_string(String8 string) }; Assert(ArrayCount(map) == LNK_Log_Count); - for (U64 i = 0; i < ArrayCount(map); ++i) { + for EachElement(i, map) { if (str8_match(str8_cstring(map[i].name), string, StringMatchFlag_CaseInsensitive)) { return map[i].type; } diff --git a/src/linker/lnk_log.h b/src/linker/lnk_log.h index a1e24157..c92b0e52 100644 --- a/src/linker/lnk_log.h +++ b/src/linker/lnk_log.h @@ -18,9 +18,145 @@ typedef enum LNK_Log_Count } LNK_LogType; +typedef enum +{ + LNK_Error_Null, + + LNK_Error_StopFirst, + LNK_Error_Cmdl, + LNK_Error_EndprecompNotFound, + LNK_Error_EntryPoint, + LNK_Error_ExternalTypeServerConflict, + LNK_Error_FileNotFound, + LNK_Error_IllData, + LNK_Error_IllExport, + LNK_Error_IncomatibleCmdOptions, + LNK_Error_IncompatibleMachine, + LNK_Error_InvalidPrecompLeafCount, + LNK_Error_InvalidStartIndex, + LNK_Error_NoAccess, + LNK_Error_NoSubsystem, + LNK_Error_OutOfExportOrdinals, + LNK_Error_PrecompObjNotFound, + LNK_Error_Telemetry, + LNK_Error_UnsupportedMachine, + LNK_Error_Mt, + LNK_Error_UnableToSerializeMsf, + LNK_Error_LoadRes, + LNK_Error_IO, + LNK_Error_LargeAddrAwareRequired, + LNK_Error_InvalidPath, + LNK_Error_MultiplyDefinedSymbol, + LNK_Error_SectRefsDiscardedMemory, + LNK_Error_IllegalSectionMerge, + LNK_Error_IllegalRelocation, + LNK_Error_CircularMerge, + LNK_Error_AssociativeLoop, + LNK_Error_AlternateNameConflict, + LNK_Error_RelocationAgainstRemovedSection, + LNK_Error_FailIfMismatch, + LNK_Error_StopLast, + + LNK_Error_ContinueFirst, + LNK_Error_AlreadyDefinedSymbol, + LNK_Error_CvPrecomp, + LNK_Error_Natvis, + LNK_Error_TooManyFiles, + LNK_Error_UnableToOpenTypeServer, + LNK_Error_UnexpectedCodePath, + LNK_Error_CvIllSymbolData, + LNK_Error_InvalidTypeIndex, + LNK_Error_UndefinedIsWeak, + LNK_Error_WeakCycle, + LNK_Error_InvalidLib, + LNK_Error_UnresolvedSymbol, + LNK_Error_PrecompSigMismatch, + LNK_Error_ContinueLast, + + LNK_Warning_First, + LNK_Warning_InvalidMergeDirectiveFormat, + LNK_Warning_AmbiguousMerge, + LNK_Warning_AtypicalStartIndex, + LNK_Warning_Cmdl, + LNK_Warning_Directive, + LNK_Warning_DuplicateObjPath, + LNK_Warning_ExternalTypeServerAgeMismatch, + LNK_Warning_FileNotFound, + LNK_Warning_IllData, + LNK_Warning_IllExport, + LNK_Warning_InvalidNatvisFileExt, + LNK_Warning_LargePages, + LNK_Warning_LargePagesNotEnabled, + LNK_Warning_MismatchedTypeServerSignature, + LNK_Warning_MissingExternalTypeServer, + LNK_Warning_MultipleDebugTAndDebugP, + LNK_Warning_MultipleExternalTypeServers, + LNK_Warning_MultipleLibMatch, + LNK_Warning_MultiplyDefinedImport, + LNK_Warning_Natvis, + LNK_Warning_PrecompObjSymbolsNotFound, + LNK_Warning_SectionFlagsConflict, + LNK_Warning_Subsystem, + LNK_Warning_UnknownDirective, + LNK_Warning_IllegalDirective, + LNK_Warning_UnresolvedComdat, + LNK_Warning_UnusedDelayLoadDll, + LNK_Warning_LongSectionName, + LNK_Warning_UnknownSwitch, + LNK_Warning_TLSAlign, + LNK_Warning_DirectiveSectionWithRelocs, + LNK_Warning_NoLargeAddressAwarenessForDll, + LNK_Warning_TryingToExportEntryPoint, + LNK_Warning_Last, + + LNK_Error_Count +} LNK_ErrorCode; + +typedef enum +{ + LNK_ErrorMode_Ignore, + LNK_ErrorMode_Stop, + LNK_ErrorMode_Continue, + LNK_ErrorMode_Warn, +} LNK_ErrorMode; + +typedef enum +{ + LNK_InternalError_Null, + LNK_InternalError_NotImplemented, + LNK_InternalError_InvalidPath, + LNK_InternalError_IncompleteSwitch, + LNK_InternalError_OutOfMemory +} LNK_InternalError; + +typedef enum +{ + LNK_ErrorCodeStatus_Active, + LNK_ErrorCodeStatus_Ignore, +} LNK_ErrorCodeStatus; + +internal void lnk_log_begin(void); +internal void lnk_log_end(void); internal void set_log_level(LNK_LogType type, B32 is_enabled); internal B32 lnk_get_log_status(LNK_LogType type); internal void lnk_log(LNK_LogType type, char *fmt, ...); +internal void lnk_errorfv(LNK_ErrorCode code, char *fmt, va_list args); +internal void lnk_error(LNK_ErrorCode code, char *fmt, ...); +internal void lnk_error_with_loc(LNK_ErrorCode code, String8 obj_path, String8 lib_path, char *fmt, ...); +internal void lnk_supplement_error(char *fmt, ...); +internal void lnk_supplement_error_list(String8List list); +internal void lnk_ignore_error(LNK_ErrorCode code); +internal void lnk_activate_error(LNK_ErrorCode code); + internal LNK_LogType lnk_log_type_from_string(String8 string); +#define lnk_is_error_code_active(code) (lnk_get_error_code_status(code) == LNK_ErrorCodeStatus_Active) +#define lnk_is_error_code_ignored(code) (lnk_get_error_code_status(code) == LNK_ErrorCodeStatus_Ignore) +internal LNK_ErrorCodeStatus lnk_get_error_code_status(LNK_ErrorCode code); + +internal void lnk_internal_error(LNK_InternalError code, char *file, int line, char *fmt, ...); +#define lnk_invalid_path(...) lnk_internal_error(LNK_InternalError_InvalidPath, __FILE__, __LINE__, __VA_ARGS__) +#define lnk_not_implemented(...) lnk_internal_error(LNK_InternalError_NotImplemented, __FILE__, __LINE__, __VA_ARGS__) +#define lnk_incomplete_switch(...) lnk_internal_error(LNK_InternalError_IncompleteSwitch, __FILE__, __LINE__, __VA_ARGS__) + diff --git a/src/torture/torture_main.c b/src/torture/torture_main.c index b817b229..fec9f504 100644 --- a/src/torture/torture_main.c +++ b/src/torture/torture_main.c @@ -40,7 +40,7 @@ #include "linker/codeview_ext/codeview.h" #include "linker/lnk_cmd_line.h" #include "linker/lnk_cmd_line.c" -#include "linker/lnk_error.h" +#include "linker/lnk_log.h" #include "torture.h" #include "torture_radlink.h"