From bb3d01ffe68c177e2714455ed7cbf24a6c1cd469 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Wed, 2 Apr 2025 14:37:36 -0700 Subject: [PATCH] output lib index and chunk debug comments --- src/linker/lnk.c | 47 +++++++++++++++++++++++++++++++++++------- src/linker/lnk_chunk.h | 14 ++++++------- 2 files changed, 46 insertions(+), 15 deletions(-) diff --git a/src/linker/lnk.c b/src/linker/lnk.c index 6c2bc7ec..463802f0 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -3202,15 +3202,17 @@ lnk_chunk_off_pair_array_bsearch(LNK_ChunkOffPair *arr, U64 count, U64 value) } internal String8List -lnk_build_rad_chunk_map(Arena *arena, String8 image_data, U64 thread_count, LNK_ObjList objs, LNK_SectionTable *st, LNK_SymbolTable *symtab) +lnk_build_rad_chunk_map(Arena *arena, String8 image_data, U64 thread_count, LNK_ObjList objs, LNK_LibList lib_index[LNK_InputSource_Count], LNK_SectionTable *st, LNK_SymbolTable *symtab) { + ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); + String8List map = {0}; + LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, st); - String8List map = {0}; - - str8_list_pushf(arena, &map, "# CHUNKS\n"); + ProfBegin("SECTIONS"); + str8_list_pushf(arena, &map, "# SECTIONS\n"); for (LNK_SectionNode *sect_n = st->list.first; sect_n != 0; sect_n = sect_n->next) { LNK_Section *sect = §_n->data; if (sect->has_layout) { @@ -3244,7 +3246,7 @@ lnk_build_rad_chunk_map(Arena *arena, String8 image_data, U64 thread_count, LNK_ String8 file_size_str = push_str8f(temp.arena, "%08x", file_size); String8 chunk_hash_str = push_str8f(temp.arena, "%08x%08x", chunk_hash.u64[0], chunk_hash.u64[1]); String8 chunk_ref_str = push_str8f(temp.arena, "{%llx,%llx}", chunk->ref.sect_id, chunk->ref.chunk_id); - String8 source_str = str8_lit("\?\?\?"); + String8 source_str = {0}; if (chunk->obj) { if (chunk->obj->lib_path.size) { String8 lib_name = chunk->obj->lib_path; @@ -3259,6 +3261,18 @@ lnk_build_rad_chunk_map(Arena *arena, String8 image_data, U64 thread_count, LNK_ source_str = push_str8f(temp.arena, "%S", chunk->obj->path); } } +#if LNK_DEBUG_CHUNKS + if (chunk->debug.size) { + if (source_str.size) { + source_str = push_str8f(temp.arena, "%S (%S)", source_str, chunk->debug); + } else if (chunk->debug.size) { + source_str = push_str8f(temp.arena, "%S", chunk->debug); + } + } +#endif + if (source_str.size == 0) { + source_str = str8_lit("\?\?\?"); + } str8_list_pushf(arena, &map, "%-16S %-8S %-8S %-16S %-8S %S\n", address_str, virt_size_str, file_size_str, chunk_hash_str, chunk_ref_str, source_str); @@ -3268,7 +3282,10 @@ lnk_build_rad_chunk_map(Arena *arena, String8 image_data, U64 thread_count, LNK_ str8_list_pushf(arena, &map, "\n"); } } + ProfEnd(); + + ProfBegin("SYMBOLS"); str8_list_pushf(arena, &map, "# SYMBOLS\n"); str8_list_pushf(arena, &map, "%-8s %s\n", "ChunkRef", "Symbol"); for (LNK_ObjNode *obj_n = objs.first; obj_n != 0; obj_n = obj_n->next) { @@ -3295,10 +3312,24 @@ lnk_build_rad_chunk_map(Arena *arena, String8 image_data, U64 thread_count, LNK_ } } } - - //str8_list_pushf(arena, &map, "%16s %30s %23s %10s\n\n", "Address", "Publics by Value", "Rva+Base", "Lib:Object"); + str8_list_pushf(arena, &map, "\n"); + ProfEnd(); + + ProfBegin("LIBS"); + for (U64 input_source = 0; input_source < LNK_InputSource_Count; ++input_source) { + if (lib_index[input_source].count) { + str8_list_pushf(arena, &map, "# LIBS (%S)\n", lnk_string_from_input_source(input_source)); + for (LNK_LibNode *lib_n = lib_index[input_source].first; lib_n != 0; lib_n = lib_n->next) { + str8_list_pushf(arena, &map, "%S\n", lib_n->data.path); + } + } + } + ProfEnd(); + + scratch_end(scratch); + ProfEnd(); return map; } @@ -4288,7 +4319,7 @@ lnk_run(int argc, char **argv) } break; case State_BuildRadChunkMap: { ProfBegin("RAD Chunk Map"); - String8List map = lnk_build_rad_chunk_map(scratch.arena, image_data, config->worker_count, obj_list, st, symtab); + String8List map = lnk_build_rad_chunk_map(scratch.arena, image_data, config->worker_count, obj_list, lib_index, st, symtab); lnk_write_data_list_to_file_path(config->rad_chunk_map_name, config->temp_rad_chunk_map_name, map); ProfEnd(); } break; diff --git a/src/linker/lnk_chunk.h b/src/linker/lnk_chunk.h index e2c54174..cb68e56d 100644 --- a/src/linker/lnk_chunk.h +++ b/src/linker/lnk_chunk.h @@ -5,7 +5,13 @@ //////////////////////////////// -#define LNK_DEBUG_CHUNKS 0 +#define LNK_DEBUG_CHUNKS 1 + +#if LNK_DEBUG_CHUNKS +# define lnk_chunk_set_debugf(a, c, f, ...) do { (c)->debug = push_str8f((a), f, __VA_ARGS__); } while(0) +#else +# define lnk_chunk_set_debugf(a, c, f, ...) (void)(c) +#endif //////////////////////////////// @@ -200,9 +206,3 @@ internal LNK_ChunkNode * lnk_chunk_ptr_list_reserve(Arena *arena, LNK_ChunkList internal String8Array lnk_data_arr_from_chunk_ptr_list(Arena *arena, LNK_ChunkList list); internal String8Array * lnk_data_arr_from_chunk_ptr_list_arr(Arena *arena, LNK_ChunkList *list_arr, U64 count); -#if LNK_DEBUG_CHUNKS -#define lnk_chunk_set_debugf(a, c, f, ...) do { (c)->debug = push_str8f((a), f, __VA_ARGS__); } while(0) -#else -#define lnk_chunk_set_debugf(a, c, f, ...) (void)(c) -#endif -