From afd454b41ff83ae125bba4ae5e33a8fd374b25f2 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Sun, 12 Jul 2026 23:13:41 -0700 Subject: [PATCH] fix DBI SC image-section range mapping Log and skip section contributions that fail to map into the linked image. Keep a file-range-to-section-number map so compact file ranges produce the correct DBI section numbers. --- src/linker/lnk_debug_info.c | 130 +++++++++++++++---------------- src/linker/lnk_debug_info.h | 13 ++-- src/linker/pdb_ext/pdb_builder.c | 62 +++++++-------- src/linker/pdb_ext/pdb_builder.h | 50 ++++++------ src/pdb/pdb.h | 24 +++--- src/pdb/pdb_parse.c | 16 ++-- 6 files changed, 145 insertions(+), 150 deletions(-) diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index fe125133..eeb926fa 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -3067,67 +3067,60 @@ THREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task) PDB_DbiModule *mod = task->mod_arr [obj_idx]; LNK_Obj *obj = task->cv->obj_arr[obj_idx]; - PDB_DbiSectionContribNode *sc_arr = push_array_no_zero(arena, PDB_DbiSectionContribNode, obj->header.section_count_no_null); - U64 sc_count = 0; - + PDB_DbiSCNode *sc_arr = push_array_no_zero(arena, PDB_DbiSCNode, obj->header.section_count_no_null); + U64 sc_count = 0; + for EachIndex(sect_idx, obj->header.section_count_no_null) { - LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, sect_idx); - if (*section.flags & COFF_SectionFlag_LnkInfo) { continue; } - if (*section.flags & COFF_SectionFlag_LnkRemove) { continue; } - if (*section.flags & LNK_SECTION_FLAG_DEBUG) { continue; } + // filter by section flags + if (obj->section_flags[sect_idx] & (COFF_SectionFlag_LnkInfo | COFF_SectionFlag_LnkRemove | LNK_SECTION_FLAG_DEBUG)) { continue; } + // skip unwind info for the section contribution String8 section_name = lnk_obj_section_name_from_sect_idx(obj, sect_idx); if (str8_match(section_name, str8_lit(".pdata"), 0)) { continue; } - U64 sect_number; - String8 sect_data; - U32 sect_off; - U32 data_crc; - if (*section.flags & COFF_SectionFlag_CntUninitializedData) { - if (dim_1u64(section.vrange) == 0) { continue; } + // load section and determine its type + LNK_ObjSection section = lnk_obj_section_from_sect_idx(obj, sect_idx); + B32 is_virt = !!(*section.flags & COFF_SectionFlag_CntUninitializedData); - U64 search_result = rng1u64_array_num_from_value__binary_search(&task->image_section_virt_ranges, section.vrange.min); - sect_number = search_result-1; - Assert(sect_number < task->image_section_virt_ranges.count); - - sect_data = str8_zero(); - sect_off = section.vrange.min - task->image_section_virt_ranges.v[sect_number].min; - data_crc = 0; - } else { - if (dim_1u64(section.frange) == 0) { continue; } + // pick section range + Rng1U64 section_range = is_virt ? section.vrange : section.frange; + if (dim_1u64(section_range) == 0) { continue; } - U64 search_result = rng1u64_array_num_from_value__binary_search(&task->image_section_file_ranges, section.frange.min); - sect_number = search_result-1; - Assert(sect_number < task->image_section_file_ranges.count); + // map the SC offset to the image section range that contains it + Rng1U64Array *image_ranges = is_virt ? &task->image_section_virt_ranges : &task->image_section_file_ranges; + U64 search_result = rng1u64_array_num_from_value__binary_search(image_ranges, section_range.min); - sect_data = str8_substr(task->image_data, section.frange); - sect_off = section.frange.min - task->image_section_file_ranges.v[sect_number].min; - data_crc = update_crc32(0, sect_data.str, sect_data.size); + // log & skip SC offsets that failed to map + if (search_result == 0) { + Temp scratch = scratch_begin(0,0); + lnk_log(LNK_Log_Debug, "%S: failed to map section offset 0x%llx into the linked image; skipping this section", lnk_loc_from_obj(scratch.arena, obj), section_range.min); + scratch_end(scratch); + continue; } - // fill out SC - PDB_DbiSectionContribNode *sc = sc_arr + sc_count++; - sc->data.base.sec = (U16)sect_number; - sc->data.base.pad0 = 0; - sc->data.base.sec_off = sect_off; - sc->data.base.size = dim_1u64(section.vrange); - sc->data.base.flags = *section.flags; - sc->data.base.mod = mod->imod; - sc->data.base.pad1 = 0; - sc->data.data_crc = 0; - sc->data.reloc_crc = 0; + // unpack image range index + U64 range_idx = search_result - 1; + // fill out & push section contribution + PDB_DbiSCNode *sc = sc_arr + sc_count++; + sc->data.base.sec = (U16)(is_virt ? range_idx : task->image_section_file_section_numbers[range_idx]); + sc->data.base.pad0 = 0; + sc->data.base.sec_off = section_range.min - image_ranges->v[range_idx].min; + sc->data.base.size = dim_1u64(section_range); + sc->data.base.flags = *section.flags; + sc->data.base.mod = mod->imod; + sc->data.base.pad1 = 0; + sc->data.data_crc = is_virt ? 0 : crc32_from_string(str8_substr(task->image_data, section_range)); + sc->data.reloc_crc = 0; dbi_sec_contrib_list_push_node(&task->sc_list[obj_idx], sc); } - // Mod1::fUpdateSecContrib - if (sc_count > 0) { - for (U64 sc_idx = 0; sc_idx < sc_count; ++sc_idx) { - if (sc_arr[sc_idx].data.base.flags & COFF_SectionFlag_CntCode) { - mod->first_sc = sc_arr[sc_idx].data; - break; - } + // find first code section contribution for the Mod1::fUpdateSecContrib + for EachIndex(i, sc_count) { + if (sc_arr[i].data.base.flags & COFF_SectionFlag_CntCode) { + mod->first_sc = sc_arr[i].data; + break; } } } @@ -3143,17 +3136,18 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config } LNK_BuildPdb task = { - .image_data = image_data, - .symtab = symtab, - .cv = cv, - .pdb = pdb_alloc_(lnk_get_huge_arena(), config->pdb_page_size, config->machine, config->time_stamp, config->age, config->guid), - .mod_arr = push_array(scratch.arena, PDB_DbiModule *, cv->obj_count), - .pe = pe_bin_info_from_data(scratch.arena, image_data), - .image_section_table = coff_section_table_from_data(scratch.arena, image_data, task.pe.section_table_range), - .image_section_table_count = task.pe.section_count+1, - .image_section_virt_ranges.count = task.image_section_table_count, - .image_section_virt_ranges.v = push_array(scratch.arena, Rng1U64, task.image_section_table_count), - .image_section_file_ranges.v = push_array(scratch.arena, Rng1U64, task.image_section_table_count), + .image_data = image_data, + .symtab = symtab, + .cv = cv, + .pdb = pdb_alloc_(lnk_get_huge_arena(), config->pdb_page_size, config->machine, config->time_stamp, config->age, config->guid), + .mod_arr = push_array(scratch.arena, PDB_DbiModule *, cv->obj_count), + .pe = pe_bin_info_from_data(scratch.arena, image_data), + .image_section_table = coff_section_table_from_data(scratch.arena, image_data, task.pe.section_table_range), + .image_section_table_count = task.pe.section_count+1, + .image_section_virt_ranges.count = task.image_section_table_count, + .image_section_virt_ranges.v = push_array(scratch.arena, Rng1U64, task.image_section_table_count), + .image_section_file_ranges.v = push_array(scratch.arena, Rng1U64, task.image_section_table_count), + .image_section_file_section_numbers = push_array(scratch.arena, U64, task.image_section_table_count), }; // set min type indices @@ -3185,17 +3179,13 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config if (builder_flags & LNK_PDB_BuilderFlag_Modules) { ProfScope ("Alloc Modules") - for EachIndex(obj_idx, cv->obj_count) + for EachIndex(obj_idx, cv->obj_count) { task.mod_arr[obj_idx] = dbi_push_module(task.pdb->dbi, cv->obj_arr[obj_idx]->path, lnk_obj_get_lib_path(cv->obj_arr[obj_idx])); + } - ProfScope("Move Global Symbols") - tp_for_parallel(tp, 0, tp->worker_count, lnk_move_global_symbols_to_gsi, &task); - - ProfScope("Build GSI and PSI") - pdb_build_gsi_psi(tp, task.pdb); - - ProfScope("Write Modules") - tp_for_parallel(tp, 0, tp->worker_count, lnk_write_pdb_modules, &task); + ProfScope("Move Global Symbols") tp_for_parallel(tp, 0, tp->worker_count, lnk_move_global_symbols_to_gsi, &task); + ProfScope("Build GSI and PSI") pdb_build_gsi_psi(tp, task.pdb); + ProfScope("Write Modules") tp_for_parallel(tp, 0, tp->worker_count, lnk_write_pdb_modules, &task); } ProfBegin("Add string tables"); @@ -3213,13 +3203,17 @@ lnk_build_pdb(TP_Context *tp, TP_Arena *tp_arena, String8 image_data, LNK_Config for EachIndex(i, task.image_section_table_count) { COFF_SectionHeader *sect_header = task.image_section_table[i]; + if (~sect_header->flags & COFF_SectionFlag_CntUninitializedData) { - task.image_section_file_ranges.v[task.image_section_file_ranges.count++] = rng_1u64(sect_header->foff, sect_header->foff + sect_header->fsize); + U64 section_file_idx = task.image_section_file_ranges.count++; + task.image_section_file_ranges.v[section_file_idx] = r1u64s(sect_header->foff, sect_header->fsize); + task.image_section_file_section_numbers[section_file_idx] = i; } + task.image_section_virt_ranges.v[i] = rng_1u64(sect_header->voff, sect_header->voff + sect_header->vsize); } - task.sc_list = push_array(scratch.arena, PDB_DbiSectionContribList, cv->obj_count); + task.sc_list = push_array(scratch.arena, PDB_DbiSCList, cv->obj_count); tp_for_parallel(tp, tp_arena, cv->obj_count, lnk_push_dbi_sec_contrib_task, &task); dbi_sec_list_concat_arr(&task.pdb->dbi->sec_contrib_list, cv->obj_count, task.sc_list); } diff --git a/src/linker/lnk_debug_info.h b/src/linker/lnk_debug_info.h index dc094e0f..300971b9 100644 --- a/src/linker/lnk_debug_info.h +++ b/src/linker/lnk_debug_info.h @@ -215,12 +215,13 @@ typedef struct U64 symbol_count; // push DBI SC Map - PE_BinInfo pe; - COFF_SectionHeader **image_section_table; - U64 image_section_table_count; - Rng1U64Array image_section_file_ranges; - Rng1U64Array image_section_virt_ranges; - PDB_DbiSectionContribList *sc_list; // [obj_count] + PE_BinInfo pe; + COFF_SectionHeader **image_section_table; + U64 image_section_table_count; + Rng1U64Array image_section_virt_ranges; + Rng1U64Array image_section_file_ranges; + U64 *image_section_file_section_numbers; + PDB_DbiSCList *sc_list; // [obj_count] } LNK_BuildPdb; typedef struct diff --git a/src/linker/pdb_ext/pdb_builder.c b/src/linker/pdb_ext/pdb_builder.c index be696012..c0608b20 100644 --- a/src/linker/pdb_ext/pdb_builder.c +++ b/src/linker/pdb_ext/pdb_builder.c @@ -2263,24 +2263,24 @@ psi_push(PDB_PsiContext *psi, CV_Pub32Flags flags, U32 offset, U16 isect, String //////////////////////////////// internal void -dbi_sec_contrib_list_push_node(PDB_DbiSectionContribList *list, PDB_DbiSectionContribNode *node) +dbi_sec_contrib_list_push_node(PDB_DbiSCList *list, PDB_DbiSCNode *node) { node->next = 0; SLLQueuePush(list->first, list->last, node); list->count += 1; } -internal PDB_DbiSectionContribNode * -dbi_sec_contrib_list_push(Arena *arena, PDB_DbiSectionContribList *list) +internal PDB_DbiSCNode * +dbi_sec_contrib_list_push(Arena *arena, PDB_DbiSCList *list) { - PDB_DbiSectionContribNode *node = push_array_no_zero(arena, PDB_DbiSectionContribNode, 1); + PDB_DbiSCNode *node = push_array_no_zero(arena, PDB_DbiSCNode, 1); node->next = 0; dbi_sec_contrib_list_push_node(list, node); return node; } internal void -dbi_sec_list_concat_arr(PDB_DbiSectionContribList *list, U64 count, PDB_DbiSectionContribList *to_concat) +dbi_sec_list_concat_arr(PDB_DbiSCList *list, U64 count, PDB_DbiSCList *to_concat) { SLLConcatInPlaceArray(list, to_concat, count); } @@ -2405,14 +2405,14 @@ dbi_open_module_info(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_Db return list; } -internal PDB_DbiSectionContribList +internal PDB_DbiSCList dbi_open_sec_contrib(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header) { ProfBeginFunction(); - PDB_DbiSectionContribList sec_contrib = {0}; + PDB_DbiSCList sec_contrib = {0}; - if (dbi_header->sec_con_size > sizeof(PDB_DbiSectionContrib)) { + if (dbi_header->sec_con_size > sizeof(PDB_DbiSC)) { Temp scratch = scratch_begin(&arena, 1); // seek to start of section contrib info @@ -2420,25 +2420,25 @@ dbi_open_sec_contrib(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_Db msf_stream_seek(msf, sn, sec_con_pos); // read header - PDB_DbiSectionContribVersion version = 0; + PDB_DbiSCVersion version = 0; msf_stream_read_struct(msf, sn, &version); // parse contrib items switch (version) { - case PDB_DbiSectionContribVersion_1: { - U64 contrib_count = dbi_header->sec_con_size / sizeof(PDB_DbiSectionContrib); - PDB_DbiSectionContrib *src_contrib_array = push_array(scratch.arena, PDB_DbiSectionContrib, contrib_count); + case PDB_DbiSCVersion_1: { + U64 contrib_count = dbi_header->sec_con_size / sizeof(PDB_DbiSC); + PDB_DbiSC *src_contrib_array = push_array(scratch.arena, PDB_DbiSC, contrib_count); MSF_UInt sec_con_read = msf_stream_read_array(msf, sn, &src_contrib_array[0], contrib_count); Assert(sec_con_read == sizeof(src_contrib_array[0]) * contrib_count); - PDB_DbiSectionContribNode *dst_contrib_array = push_array_no_zero(arena, PDB_DbiSectionContribNode, contrib_count); + PDB_DbiSCNode *dst_contrib_array = push_array_no_zero(arena, PDB_DbiSCNode, contrib_count); for (U64 icontrib = 0; icontrib < contrib_count; icontrib += 1) { dst_contrib_array[icontrib].next = 0; dst_contrib_array[icontrib].data = src_contrib_array[icontrib]; dbi_sec_contrib_list_push_node(&sec_contrib, &dst_contrib_array[icontrib]); } } break; - case PDB_DbiSectionContribVersion_2: { + case PDB_DbiSCVersion_2: { NotImplemented; } break; default: Assert(!"unknown section contrib version"); break; @@ -2595,7 +2595,7 @@ dbi_build_module_info(Arena *arena, PDB_DbiContext *dbi, MSF_Context *msf) #if 0 int -dbi_sc_compar(const PDB_DbiSectionContrib *a, const PDB_DbiSectionContrib *b) +dbi_sc_compar(const PDB_DbiSC *a, const PDB_DbiSC *b) { #if 0 int cmp = 0; @@ -2622,7 +2622,7 @@ dbi_sc_compar(const PDB_DbiSectionContrib *a, const PDB_DbiSectionContrib *b) #endif internal void -lnk_radix_sort_dbi_sc_array(PDB_DbiSectionContrib *arr, U64 sc_count, U64 sect_count) +lnk_radix_sort_dbi_sc_array(PDB_DbiSC *arr, U64 sc_count, U64 sect_count) { ProfBeginFunction(); @@ -2638,9 +2638,9 @@ lnk_radix_sort_dbi_sc_array(PDB_DbiSectionContrib *arr, U64 sc_count, U64 sect_c Temp scratch = scratch_begin(0,0); - PDB_DbiSectionContrib *temp_arr = push_array_no_zero(scratch.arena, PDB_DbiSectionContrib, sc_count); - PDB_DbiSectionContrib *src_arr = arr; - PDB_DbiSectionContrib *dst_arr = temp_arr; + PDB_DbiSC *temp_arr = push_array_no_zero(scratch.arena, PDB_DbiSC, sc_count); + PDB_DbiSC *src_arr = arr; + PDB_DbiSC *dst_arr = temp_arr; ProfBegin("Count Memzero"); U32 count_8lo[256]; MemoryZeroArray(count_8lo); @@ -2651,7 +2651,7 @@ lnk_radix_sort_dbi_sc_array(PDB_DbiSectionContrib *arr, U64 sc_count, U64 sect_c ProfBegin("Histogram"); for (U64 i = 0; i < sc_count; i += 1) { - PDB_DbiSectionContrib *sc = src_arr + i; + PDB_DbiSC *sc = src_arr + i; count_arr[sc->base.sec] += 1; U64 digit_8lo = (sc->base.sec_off >> 0) % ArrayCount(count_8lo); @@ -2693,7 +2693,7 @@ lnk_radix_sort_dbi_sc_array(PDB_DbiSectionContrib *arr, U64 sc_count, U64 sect_c ProfBegin("Order 8 Lo"); for (U64 i = 0; i < sc_count; i += 1) { - PDB_DbiSectionContrib *sc = &src_arr[i]; + PDB_DbiSC *sc = &src_arr[i]; U64 digit = (sc->base.sec_off >> 0) % ArrayCount(count_8lo); dst_arr[count_8lo[digit]++] = *sc; } @@ -2701,7 +2701,7 @@ lnk_radix_sort_dbi_sc_array(PDB_DbiSectionContrib *arr, U64 sc_count, U64 sect_c ProfBegin("Order 8 Hi"); for (U64 i = 0; i < sc_count; i += 1) { - PDB_DbiSectionContrib *sc = &dst_arr[i]; + PDB_DbiSC *sc = &dst_arr[i]; U64 digit = (sc->base.sec_off >> 8) % ArrayCount(count_8hi); src_arr[count_8hi[digit]++] = *sc; } @@ -2709,7 +2709,7 @@ lnk_radix_sort_dbi_sc_array(PDB_DbiSectionContrib *arr, U64 sc_count, U64 sect_c ProfBegin("Order 16"); for (U64 i = 0; i < sc_count; i += 1) { - PDB_DbiSectionContrib *sc = &src_arr[i]; + PDB_DbiSC *sc = &src_arr[i]; U64 digit = (sc->base.sec_off >> 16) % ArrayCount(count_16); dst_arr[count_16[digit]++] = *sc; } @@ -2731,7 +2731,7 @@ lnk_radix_sort_dbi_sc_array(PDB_DbiSectionContrib *arr, U64 sc_count, U64 sect_c count_arr[0] = 0; for (U64 i = 0; i < sc_count; i += 1) { - PDB_DbiSectionContrib *sc = dst_arr + i; + PDB_DbiSC *sc = dst_arr + i; src_arr[count_arr[sc->base.sec]++] = *sc; } @@ -2758,14 +2758,14 @@ dbi_build_sec_con(Arena *arena, PDB_DbiContext *dbi) { ProfBeginFunction(); - PDB_DbiSectionContribVersion *version = push_array(arena, PDB_DbiSectionContribVersion, 1); - *version = PDB_DbiSectionContribVersion_1; + PDB_DbiSCVersion *version = push_array(arena, PDB_DbiSCVersion, 1); + *version = PDB_DbiSCVersion_1; // push section contribs V1 ProfBegin("Push sect contribs [Count %llu]", dbi->sec_contrib_list.count); - PDB_DbiSectionContrib *sc_array = push_array_no_zero(arena, PDB_DbiSectionContrib, dbi->sec_contrib_list.count); - PDB_DbiSectionContrib *dst = &sc_array[0]; - for (PDB_DbiSectionContribNode *src = dbi->sec_contrib_list.first; src != 0; src = src->next, dst += 1) { + PDB_DbiSC *sc_array = push_array_no_zero(arena, PDB_DbiSC, dbi->sec_contrib_list.count); + PDB_DbiSC *dst = &sc_array[0]; + for (PDB_DbiSCNode *src = dbi->sec_contrib_list.first; src != 0; src = src->next, dst += 1) { *dst = src->data; } ProfEnd(); @@ -2956,7 +2956,7 @@ dbi_module_push_section_contrib(PDB_DbiContext *dbi, { ProfBeginFunction(); - PDB_DbiSectionContrib sc; + PDB_DbiSC sc; sc.base.sec = safe_cast_u16(isect_off.isect); sc.base.sec_off = isect_off.off; sc.base.size = size; @@ -2965,7 +2965,7 @@ dbi_module_push_section_contrib(PDB_DbiContext *dbi, sc.data_crc = data_crc; sc.reloc_crc = reloc_crc; - PDB_DbiSectionContribNode *node = push_array_no_zero(dbi->arena, PDB_DbiSectionContribNode, 1); + PDB_DbiSCNode *node = push_array_no_zero(dbi->arena, PDB_DbiSCNode, 1); node->data = sc; dbi_sec_contrib_list_push_node(&dbi->sec_contrib_list, node); diff --git a/src/linker/pdb_ext/pdb_builder.h b/src/linker/pdb_ext/pdb_builder.h index b4d0909e..8abcd2d5 100644 --- a/src/linker/pdb_ext/pdb_builder.h +++ b/src/linker/pdb_ext/pdb_builder.h @@ -238,7 +238,7 @@ typedef struct PDB_DbiModule struct PDB_DbiModule *next; MSF_StreamNumber sn; CV_ModIndex imod; - PDB_DbiSectionContrib first_sc; + PDB_DbiSC first_sc; U64 sym_data_size; U64 c11_data_size; U64 c13_data_size; @@ -255,18 +255,18 @@ typedef struct PDB_DbiModuleList U64 count; } PDB_DbiModuleList; -typedef struct PDB_DbiSectionContribNode +typedef struct PDB_DbiSCNode { - struct PDB_DbiSectionContribNode *next; - PDB_DbiSectionContrib data; -} PDB_DbiSectionContribNode; + struct PDB_DbiSCNode *next; + PDB_DbiSC data; +} PDB_DbiSCNode; -typedef struct PDB_DbiSectionContribList +typedef struct PDB_DbiSCList { - PDB_DbiSectionContribNode *first; - PDB_DbiSectionContribNode *last; + PDB_DbiSCNode *first; + PDB_DbiSCNode *last; U64 count; -} PDB_DbiSectionContribList; +} PDB_DbiSCList; typedef struct PDB_DbiSectionNode { @@ -290,7 +290,7 @@ typedef struct PDB_DbiContext MSF_StreamNumber publics_sn; MSF_StreamNumber symbols_sn; PDB_DbiModuleList module_list; - PDB_DbiSectionContribList sec_contrib_list; + PDB_DbiSCList sec_contrib_list; PDB_DbiSectionList section_list; PDB_StringTable ec_names; MSF_StreamNumber dbg_streams[PDB_DbiStream_COUNT]; @@ -384,21 +384,21 @@ internal CV_SymbolNode * psi_push(PDB_PsiContext *psi, CV_Pub32Flags flags, U32 //////////////////////////////// // DBI -internal PDB_DbiContext * dbi_alloc(COFF_MachineType machine, U32 age); -internal void dbi_build(TP_Context *tp, PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber dbi_sn, CV_StringHashTable string_ht, B32 is_stripped); -internal void dbi_release(PDB_DbiContext *dbi); -internal PDB_DbiModule * dbi_push_module(PDB_DbiContext *dbi, String8 obj_path, String8 lib_path); -internal String8 dbi_module_read_symbol_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod); -internal String8 dbi_module_read_c11_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod); -internal String8 dbi_module_read_c13_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod); -internal void dbi_module_push_section_contrib(PDB_DbiContext *dbi, PDB_DbiModule *mod, ISectOff isect_off, U32 size, U32 data_crc, U32 reloc_crc, COFF_SectionFlags flags); -internal String8List * dbi_open_file_info(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header); -internal PDB_DbiModuleList dbi_open_module_info(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header, String8List *file_info); -internal PDB_DbiSectionContribList dbi_open_sec_contrib(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header); -internal PDB_StringTable dbi_open_ec_names(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header); -internal void dbi_open_dbg_streams(MSF_StreamNumber *dbg_streams, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header); -internal PDB_DbiSectionList dbi_open_section_headers(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn); -internal void dbi_build_section_header_stream(PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber sn); +internal PDB_DbiContext * dbi_alloc(COFF_MachineType machine, U32 age); +internal void dbi_build(TP_Context *tp, PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber dbi_sn, CV_StringHashTable string_ht, B32 is_stripped); +internal void dbi_release(PDB_DbiContext *dbi); +internal PDB_DbiModule * dbi_push_module(PDB_DbiContext *dbi, String8 obj_path, String8 lib_path); +internal String8 dbi_module_read_symbol_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod); +internal String8 dbi_module_read_c11_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod); +internal String8 dbi_module_read_c13_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod); +internal void dbi_module_push_section_contrib(PDB_DbiContext *dbi, PDB_DbiModule *mod, ISectOff isect_off, U32 size, U32 data_crc, U32 reloc_crc, COFF_SectionFlags flags); +internal String8List * dbi_open_file_info(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header); +internal PDB_DbiModuleList dbi_open_module_info(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header, String8List *file_info); +internal PDB_DbiSCList dbi_open_sec_contrib(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header); +internal PDB_StringTable dbi_open_ec_names(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header); +internal void dbi_open_dbg_streams(MSF_StreamNumber *dbg_streams, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header); +internal PDB_DbiSectionList dbi_open_section_headers(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn); +internal void dbi_build_section_header_stream(PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber sn); //////////////////////////////// // Hash Table diff --git a/src/pdb/pdb.h b/src/pdb/pdb.h index a2988b8e..771ddad4 100644 --- a/src/pdb/pdb.h +++ b/src/pdb/pdb.h @@ -223,11 +223,11 @@ typedef struct PDB_DbiHeader // "ModuleInfo" DBI range -typedef U32 PDB_DbiSectionContribVersion; -#define PDB_DbiSectionContribVersion_1 (0xeffe0000u + 19970605u) -#define PDB_DbiSectionContribVersion_2 (0xeffe0000u + 20140516u) +typedef U32 PDB_DbiSCVersion; +#define PDB_DbiSCVersion_1 (0xeffe0000u + 19970605u) +#define PDB_DbiSCVersion_2 (0xeffe0000u + 20140516u) -typedef struct PDB_DbiSectionContrib40 +typedef struct PDB_DbiSC40 { CV_SectionIndex sec; U16 pad0; @@ -236,27 +236,27 @@ typedef struct PDB_DbiSectionContrib40 U32 flags; CV_ModIndex mod; U16 pad1; -} PDB_DbiSectionContrib40; +} PDB_DbiSC40; -typedef struct PDB_DbiSectionContrib +typedef struct PDB_DbiSC { - PDB_DbiSectionContrib40 base; + PDB_DbiSC40 base; U32 data_crc; U32 reloc_crc; -} PDB_DbiSectionContrib; +} PDB_DbiSC; -typedef struct PDB_DbiSectionContrib2 +typedef struct PDB_DbiSC2 { - PDB_DbiSectionContrib40 base; + PDB_DbiSC40 base; U32 data_crc; U32 reloc_crc; U32 sec_coff; -} PDB_DbiSectionContrib2; +} PDB_DbiSC2; typedef struct PDB_DbiCompUnitHeader { U32 unused; - PDB_DbiSectionContrib contribution; + PDB_DbiSC contribution; U16 flags; // unknown MSF_StreamNumber sn; diff --git a/src/pdb/pdb_parse.c b/src/pdb/pdb_parse.c index ac7ca4a9..5b6cf72e 100644 --- a/src/pdb/pdb_parse.c +++ b/src/pdb/pdb_parse.c @@ -700,9 +700,9 @@ pdb_comp_unit_contribution_array_from_data(Arena *arena, String8 data, COFF_Sect { PDB_CompUnitContribution *contributions = 0; U64 count = 0; - if(data.size >= sizeof(PDB_DbiSectionContribVersion)) + if(data.size >= sizeof(PDB_DbiSCVersion)) { - PDB_DbiSectionContribVersion *version = (PDB_DbiSectionContribVersion*)data.str; + PDB_DbiSCVersion *version = (PDB_DbiSCVersion*)data.str; // determine array layout from version U32 item_size = 0; @@ -712,16 +712,16 @@ pdb_comp_unit_contribution_array_from_data(Arena *arena, String8 data, COFF_Sect default: { // TODO(allen): do we have a test case for this? - item_size = sizeof(PDB_DbiSectionContrib40); + item_size = sizeof(PDB_DbiSC40); }break; - case PDB_DbiSectionContribVersion_1: + case PDB_DbiSCVersion_1: { - item_size = sizeof(PDB_DbiSectionContrib); + item_size = sizeof(PDB_DbiSC); array_off = sizeof(*version); }break; - case PDB_DbiSectionContribVersion_2: + case PDB_DbiSCVersion_2: { - item_size = sizeof(PDB_DbiSectionContrib2); + item_size = sizeof(PDB_DbiSC2); array_off = sizeof(*version); }break; } @@ -739,7 +739,7 @@ pdb_comp_unit_contribution_array_from_data(Arena *arena, String8 data, COFF_Sect U64 cursor = array_off; for(; cursor + item_size <= data.size; cursor += item_size) { - PDB_DbiSectionContrib40 *sc = (PDB_DbiSectionContrib40*)(data.str + cursor); + PDB_DbiSC40 *sc = (PDB_DbiSC40*)(data.str + cursor); if(sc->size > 0 && 1 <= sc->sec && sc->sec <= section_count) { U64 voff = section_headers[sc->sec - 1].voff + sc->sec_off;