mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-08 06:48:41 +00:00
sort import library member refs by input index
This commit is contained in:
committed by
Ryan Fleury
parent
ad20900fc0
commit
765b61152d
+28
-3
@@ -168,6 +168,7 @@ lnk_make_default_cmd_line(Arena *arena, LNK_CmdLine user_cmd_line)
|
|||||||
"/RAD_MAP_LINES_FOR_UNRESOLVED_SYMBOLS",
|
"/RAD_MAP_LINES_FOR_UNRESOLVED_SYMBOLS",
|
||||||
"/RAD_UNRESOLVED_SYMBOL_LIMIT:1000",
|
"/RAD_UNRESOLVED_SYMBOL_LIMIT:1000",
|
||||||
"/RAD_UNRESOLVED_SYMBOL_REF_LIMIT:10",
|
"/RAD_UNRESOLVED_SYMBOL_REF_LIMIT:10",
|
||||||
|
"/RAD_SORT_IMPORTS",
|
||||||
(char*)str8f(scratch.arena, "/RAD_MT_PATH:%s", LNK_MANIFEST_MERGE_TOOL_NAME).str,
|
(char*)str8f(scratch.arena, "/RAD_MT_PATH:%s", LNK_MANIFEST_MERGE_TOOL_NAME).str,
|
||||||
(char*)str8f(scratch.arena, "/RAD_DATA_DIR_COUNT:%u", PE_DataDirectoryIndex_COUNT).str,
|
(char*)str8f(scratch.arena, "/RAD_DATA_DIR_COUNT:%u", PE_DataDirectoryIndex_COUNT).str,
|
||||||
};
|
};
|
||||||
@@ -1247,11 +1248,27 @@ lnk_lib_member_ref_list_concat_in_place_array(LNK_LibMemberRefList *list, LNK_Li
|
|||||||
|
|
||||||
static LNK_LibMemberInfo *g_sort_lib_member_context;
|
static LNK_LibMemberInfo *g_sort_lib_member_context;
|
||||||
|
|
||||||
internal int
|
force_inline int
|
||||||
lnk_lib_member_ref_is_before(void *raw_a, void *raw_b)
|
lnk_lib_member_ref_is_before(void *raw_a, void *raw_b)
|
||||||
{
|
{
|
||||||
LNK_LibMemberRef **a = raw_a, **b = raw_b;
|
LNK_LibMemberRef **a = raw_a, **b = raw_b;
|
||||||
return lnk_symbol_is_before(g_sort_lib_member_context[(*a)->member_idx].link, g_sort_lib_member_context[(*b)->member_idx].link);
|
return lnk_symbol_is_before(g_sort_lib_member_context[(*a)->member_idx].link,
|
||||||
|
g_sort_lib_member_context[(*b)->member_idx].link);
|
||||||
|
}
|
||||||
|
|
||||||
|
force_inline int
|
||||||
|
lnk_import_ref_is_before(void *raw_a, void *raw_b)
|
||||||
|
{
|
||||||
|
LNK_LibMemberRef **a_ptr = raw_a, **b_ptr = raw_b;
|
||||||
|
LNK_LibMemberRef *a = *a_ptr, *b = *b_ptr;
|
||||||
|
int cmp = u64_compar(&a->lib->input_idx, &b->lib->input_idx);
|
||||||
|
if (cmp == 0) {
|
||||||
|
cmp = u32_compar(&a->member_idx, &b->member_idx);
|
||||||
|
}
|
||||||
|
#if LNK_PARANOID
|
||||||
|
if (a != b) Assert(cmp != 0);
|
||||||
|
#endif
|
||||||
|
return cmp < 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal LNK_LibMemberRef **
|
internal LNK_LibMemberRef **
|
||||||
@@ -2007,7 +2024,15 @@ lnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer
|
|||||||
String8List delayed_dll_names = {0};
|
String8List delayed_dll_names = {0};
|
||||||
String8List static_dll_names = {0};
|
String8List static_dll_names = {0};
|
||||||
|
|
||||||
for EachNode(member_ref, LNK_LibMemberRef, link->imports.first) {
|
LNK_LibMemberRef **import_member_refs = lnk_array_from_lib_member_list(scratch.arena, link->imports);
|
||||||
|
|
||||||
|
// optionally sort import library member refs by input index
|
||||||
|
if (config->sort_imports == LNK_SwitchState_Yes) {
|
||||||
|
radsort(import_member_refs, link->imports.count, lnk_import_ref_is_before);
|
||||||
|
}
|
||||||
|
|
||||||
|
for EachIndex(import_member_idx, link->imports.count) {
|
||||||
|
LNK_LibMemberRef *member_ref = import_member_refs[import_member_idx];
|
||||||
LNK_Lib *lib = member_ref->lib;
|
LNK_Lib *lib = member_ref->lib;
|
||||||
U64 member_idx = member_ref->member_idx;
|
U64 member_idx = member_ref->member_idx;
|
||||||
LNK_LibMemberInfo *member_infos = hash_map_search_raw_raw(&link->lib_member_infos_hm, lib);
|
LNK_LibMemberInfo *member_infos = hash_map_search_raw_raw(&link->lib_member_infos_hm, lib);
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ global read_only LNK_CmdSwitch g_cmd_switch_map[] =
|
|||||||
{ LNK_CmdSwitch_Rad_RemoveSection, 0, "RAD_REMOVE_SECTION", ":NAME", "Removes a section from the image." },
|
{ LNK_CmdSwitch_Rad_RemoveSection, 0, "RAD_REMOVE_SECTION", ":NAME", "Removes a section from the image." },
|
||||||
{ LNK_CmdSwitch_Rad_SharedThreadPool, 0, "RAD_SHARED_THREAD_POOL", "[:STRING]", "Default value \"" LNK_DEFAULT_THREAD_POOL_NAME "\"" },
|
{ LNK_CmdSwitch_Rad_SharedThreadPool, 0, "RAD_SHARED_THREAD_POOL", "[:STRING]", "Default value \"" LNK_DEFAULT_THREAD_POOL_NAME "\"" },
|
||||||
{ LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers, 0, "RAD_SHARED_THREAD_POOL_MAX_WORKERS", ":#", "Set maximum number of workers in a thread pool." },
|
{ LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers, 0, "RAD_SHARED_THREAD_POOL_MAX_WORKERS", ":#", "Set maximum number of workers in a thread pool." },
|
||||||
|
{ LNK_CmdSwitch_Rad_SortImports, 0, "RAD_SORT_IMPORTS", "[:NO]", "Sort static and delayed import tables by their order of appearance in libs, without assuming link order." },
|
||||||
{ LNK_CmdSwitch_Rad_Ignore, 0, "RAD_IGNORE", ":#", "Ignore the specified RAD linker warning." },
|
{ LNK_CmdSwitch_Rad_Ignore, 0, "RAD_IGNORE", ":#", "Ignore the specified RAD linker warning." },
|
||||||
{ LNK_CmdSwitch_Rad_ImageAltPath, 0, "RAD_IMAGEALTPATH", ":FILENAME", "Alternative name for the image" },
|
{ LNK_CmdSwitch_Rad_ImageAltPath, 0, "RAD_IMAGEALTPATH", ":FILENAME", "Alternative name for the image" },
|
||||||
{ LNK_CmdSwitch_Rad_WriteTempFiles, 0, "RAD_WRITE_TEMP_FILES", "[:NO]", "When speicifed linker writes image and debug info to temporary files and renames after link is done." },
|
{ LNK_CmdSwitch_Rad_WriteTempFiles, 0, "RAD_WRITE_TEMP_FILES", "[:NO]", "When speicifed linker writes image and debug info to temporary files and renames after link is done." },
|
||||||
@@ -2081,6 +2082,10 @@ lnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List
|
|||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
case LNK_CmdSwitch_Rad_SortImports: {
|
||||||
|
lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &config->sort_imports);
|
||||||
|
} break;
|
||||||
|
|
||||||
case LNK_CmdSwitch_Rad_Ignore: {
|
case LNK_CmdSwitch_Rad_Ignore: {
|
||||||
S64List error_code_list = {0};
|
S64List error_code_list = {0};
|
||||||
if ( ! lnk_cmd_switch_parse_s64_list(scratch.arena, obj, cmd_switch, value_strings, &error_code_list, 0)) {
|
if ( ! lnk_cmd_switch_parse_s64_list(scratch.arena, obj, cmd_switch, value_strings, &error_code_list, 0)) {
|
||||||
|
|||||||
@@ -96,14 +96,14 @@ typedef enum
|
|||||||
LNK_CmdSwitch_WholeArchive,
|
LNK_CmdSwitch_WholeArchive,
|
||||||
|
|
||||||
LNK_CmdSwitch_Rad_Age,
|
LNK_CmdSwitch_Rad_Age,
|
||||||
|
LNK_CmdSwitch_Rad_BootMode,
|
||||||
LNK_CmdSwitch_Rad_BuildExp,
|
LNK_CmdSwitch_Rad_BuildExp,
|
||||||
LNK_CmdSwitch_Rad_BuildInfo,
|
|
||||||
LNK_CmdSwitch_Rad_BuildImpLib,
|
LNK_CmdSwitch_Rad_BuildImpLib,
|
||||||
|
LNK_CmdSwitch_Rad_BuildInfo,
|
||||||
LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll,
|
LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll,
|
||||||
LNK_CmdSwitch_Rad_DataDirCount,
|
LNK_CmdSwitch_Rad_DataDirCount,
|
||||||
LNK_CmdSwitch_Rad_Debug,
|
LNK_CmdSwitch_Rad_Debug,
|
||||||
LNK_CmdSwitch_Rad_DebugAltPath,
|
LNK_CmdSwitch_Rad_DebugAltPath,
|
||||||
LNK_CmdSwitch_Rad_BootMode,
|
|
||||||
LNK_CmdSwitch_Rad_DebugName,
|
LNK_CmdSwitch_Rad_DebugName,
|
||||||
LNK_CmdSwitch_Rad_DelayBind,
|
LNK_CmdSwitch_Rad_DelayBind,
|
||||||
LNK_CmdSwitch_Rad_DoMerge,
|
LNK_CmdSwitch_Rad_DoMerge,
|
||||||
@@ -130,13 +130,14 @@ typedef enum
|
|||||||
LNK_CmdSwitch_Rad_RemoveSection,
|
LNK_CmdSwitch_Rad_RemoveSection,
|
||||||
LNK_CmdSwitch_Rad_SharedThreadPool,
|
LNK_CmdSwitch_Rad_SharedThreadPool,
|
||||||
LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers,
|
LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers,
|
||||||
|
LNK_CmdSwitch_Rad_SortImports,
|
||||||
LNK_CmdSwitch_Rad_TimeStamp,
|
LNK_CmdSwitch_Rad_TimeStamp,
|
||||||
LNK_CmdSwitch_Rad_TypeHashAlg,
|
LNK_CmdSwitch_Rad_TypeHashAlg,
|
||||||
LNK_CmdSwitch_Rad_UnresolvedSymbolLimit,
|
LNK_CmdSwitch_Rad_UnresolvedSymbolLimit,
|
||||||
LNK_CmdSwitch_Rad_UnresolvedSymbolRefLimit,
|
LNK_CmdSwitch_Rad_UnresolvedSymbolRefLimit,
|
||||||
LNK_CmdSwitch_Rad_Version,
|
LNK_CmdSwitch_Rad_Version,
|
||||||
LNK_CmdSwitch_Rad_Workers,
|
|
||||||
LNK_CmdSwitch_Rad_WorkDir,
|
LNK_CmdSwitch_Rad_WorkDir,
|
||||||
|
LNK_CmdSwitch_Rad_Workers,
|
||||||
LNK_CmdSwitch_Rad_WriteTempFiles,
|
LNK_CmdSwitch_Rad_WriteTempFiles,
|
||||||
|
|
||||||
LNK_CmdSwitch_RadTypeServer,
|
LNK_CmdSwitch_RadTypeServer,
|
||||||
@@ -385,6 +386,7 @@ typedef struct LNK_Config
|
|||||||
LLVM_GHashAlg type_hash_alg;
|
LLVM_GHashAlg type_hash_alg;
|
||||||
String8 type_server_name;
|
String8 type_server_name;
|
||||||
LNK_SwitchState type_server;
|
LNK_SwitchState type_server;
|
||||||
|
LNK_SwitchState sort_imports;
|
||||||
} LNK_Config;
|
} LNK_Config;
|
||||||
|
|
||||||
// --- MSVC Error Codes --------------------------------------------------------
|
// --- MSVC Error Codes --------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user