[PATCH 0/6] MR8052: PDB rewrite #14.
Main goal of this serie is to load compilands on demand. It mainly adds methods to ensure that relevant compiland is loaded when needed, then fallbacks to using loaded symt. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/8052
From: Eric Pouech <epouech(a)codeweavers.com> Signed-off-by: Eric Pouech <epouech(a)codeweavers.com> --- dlls/dbghelp/pdb.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/dlls/dbghelp/pdb.c b/dlls/dbghelp/pdb.c index 96ee2858502..188e6791fc9 100644 --- a/dlls/dbghelp/pdb.c +++ b/dlls/dbghelp/pdb.c @@ -2703,12 +2703,10 @@ static enum method_result pdb_reader_request_symref_t(struct pdb_reader *pdb, sy static enum method_result pdb_reader_request_cv_typeid(struct pdb_reader *pdb, cv_typ_t cv_typeid, IMAGEHLP_SYMBOL_TYPE_INFO req, void *data) { - enum pdb_result result; struct symref_code code; symref_t target_symref; - if ((result = pdb_reader_encode_symref(pdb, symref_code_init_from_cv_typeid(&code, cv_typeid), &target_symref)) != R_PDB_SUCCESS) - return pdb_method_result(result); + if (pdb_reader_encode_symref(pdb, symref_code_init_from_cv_typeid(&code, cv_typeid), &target_symref)) return MR_FAILURE; return pdb_reader_request_symref_t(pdb, target_symref, req, data); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/8052
From: Eric Pouech <epouech(a)codeweavers.com> Signed-off-by: Eric Pouech <epouech(a)codeweavers.com> --- dlls/dbghelp/pdb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/dbghelp/pdb.c b/dlls/dbghelp/pdb.c index 188e6791fc9..7b8ce182c7e 100644 --- a/dlls/dbghelp/pdb.c +++ b/dlls/dbghelp/pdb.c @@ -1806,9 +1806,9 @@ static enum pdb_result pdb_reader_init_DBI(struct pdb_reader *pdb) for (i = 0; i < pdb->num_compilands; i++) { pdb->compilands[i].stream_offset = compiland_iter.dbi_walker.offset; - pdb->compilands[i].are_symbols_loaded = FALSE; pdb->compilands[i].compiland = NULL; pdb->compilands[i].stream_id = compiland_iter.dbi_cu_header.stream; + pdb->compilands[i].are_symbols_loaded = pdb->compilands[i].stream_id == 0xffff; result = pdb_reader_compiland_iterator_next(pdb, &compiland_iter); if ((result == R_PDB_SUCCESS) != (i + 1 < pdb->num_compilands)) return result ? result : R_PDB_INVALID_PDB_FILE; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/8052
From: Eric Pouech <epouech(a)codeweavers.com> Implement it for PDB backend. Note that we'll merely use this method to ensure that containing compiland is fully loaded, and still return a symt ptr. Signed-off-by: Eric Pouech <epouech(a)codeweavers.com> --- dlls/dbghelp/dbghelp_private.h | 1 + dlls/dbghelp/dwarf.c | 1 + dlls/dbghelp/msc.c | 1 + dlls/dbghelp/pdb.c | 35 ++++++++++++++++++++++++++++++++++ dlls/dbghelp/symbol.c | 29 +++++++++++++++++++++++++++- 5 files changed, 66 insertions(+), 1 deletion(-) diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h index 106d84cdde7..3ccd249b97c 100644 --- a/dlls/dbghelp/dbghelp_private.h +++ b/dlls/dbghelp/dbghelp_private.h @@ -440,6 +440,7 @@ struct module_format_vtable /* index management */ enum method_result (*request_symref_t)(struct module_format *modfmt, symref_t ref, IMAGEHLP_SYMBOL_TYPE_INFO req, void *data); + enum method_result (*lookup_by_address)(struct module_format *modfmt, DWORD_PTR address, symref_t *symref); /* types management */ enum method_result (*find_type)(struct module_format *modfmt, const char *name, symref_t *ref); diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c index 31ef65f158d..eb4abd9d5e8 100644 --- a/dlls/dbghelp/dwarf.c +++ b/dlls/dbghelp/dwarf.c @@ -4302,6 +4302,7 @@ static const struct module_format_vtable dwarf2_module_format_vtable = NULL, NULL, NULL, + NULL, dwarf2_location_compute, }; diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c index b5ccddadb67..10b1277bac2 100644 --- a/dlls/dbghelp/msc.c +++ b/dlls/dbghelp/msc.c @@ -4019,6 +4019,7 @@ static const struct module_format_vtable old_pdb_module_format_vtable = NULL, NULL, NULL, + NULL, pdb_location_compute, }; diff --git a/dlls/dbghelp/pdb.c b/dlls/dbghelp/pdb.c index 7b8ce182c7e..457a7e63ab7 100644 --- a/dlls/dbghelp/pdb.c +++ b/dlls/dbghelp/pdb.c @@ -4545,10 +4545,45 @@ static enum pdb_result pdb_reader_ensure_symbols_loaded_from_compiland(struct pd return R_PDB_SUCCESS; } +static enum pdb_result pdb_reader_lookup_top_symbol_by_segment_offset(struct pdb_reader *pdb, unsigned segment, unsigned offset, symref_t *symref) +{ + enum pdb_result result; + unsigned compiland_index; + DWORD64 in_address; + struct symt_ht *symbol; + + if ((result = pdb_reader_get_segment_address(pdb, segment, offset, &in_address))) return result; + result = pdb_reader_lookup_compiland_by_segment_offset(pdb, segment, offset, &compiland_index); + if (result == R_PDB_SUCCESS) + { + if ((result = pdb_reader_ensure_symbols_loaded_from_compiland(pdb, compiland_index))) + return result; + } + /* don't fail if not found as some symbols are only present in DBI, but not in compiland */ + else if (result != R_PDB_NOT_FOUND) return result; + /* fallback to ptr symbols lookup (as ptr should be loaded by now) */ + symbol = symt_find_symbol_at(pdb->module, in_address); + if (!symbol) return R_PDB_NOT_FOUND; + *symref = symt_ptr_to_symref(&symbol->symt); + return R_PDB_SUCCESS; +} + +static enum method_result pdb_method_lookup_symbol_by_address(struct module_format *modfmt, DWORD_PTR address, symref_t *symref) +{ + enum pdb_result result; + struct pdb_reader *pdb; + unsigned segment, offset; + + if (!pdb_hack_get_main_info(modfmt, &pdb, NULL)) return MR_FAILURE; + if ((result = pdb_reader_get_segment_offset_from_address(pdb, address, &segment, &offset))) return MR_FAILURE; + return pdb_method_result(pdb_reader_lookup_top_symbol_by_segment_offset(pdb, segment, offset, symref)); +} + static struct module_format_vtable pdb_module_format_vtable = { NULL,/*pdb_module_remove*/ pdb_method_request_symref_t, + pdb_method_lookup_symbol_by_address, pdb_method_find_type, pdb_method_enumerate_types, pdb_method_location_compute, diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c index 9f8049e3330..85eb76af15e 100644 --- a/dlls/dbghelp/symbol.c +++ b/dlls/dbghelp/symbol.c @@ -1034,7 +1034,7 @@ static int symt_get_best_at(struct module* module, int idx_sorttab) } /* assume addr is in module */ -struct symt_ht* symt_find_nearest(struct module* module, DWORD_PTR addr) +static struct symt_ht* symt_find_nearest_internal(struct module* module, DWORD_PTR addr) { int mid, high, low; ULONG64 ref_addr, ref_size; @@ -1080,6 +1080,33 @@ struct symt_ht* symt_find_nearest(struct module* module, DWORD_PTR addr) return module->addr_sorttab[low]; } +struct symt_ht *symt_find_nearest(struct module *module, DWORD_PTR addr) +{ + static int recursive; + struct module_format_vtable_iterator iter = {}; + + /* prevent recursive lookup inside backend */ + if (!recursive++) + { + while ((module_format_vtable_iterator_next(module, &iter, + MODULE_FORMAT_VTABLE_INDEX(lookup_by_address)))) + { + symref_t symref; + enum method_result result = iter.modfmt->vtable->lookup_by_address(iter.modfmt, addr, &symref); + if (result == MR_SUCCESS) + { + recursive--; + if (symt_is_symref_ptr(symref)) return (struct symt_ht*)SYMT_SYMREF_TO_PTR(symref); + FIXME("No support for this case yet\n"); + return NULL; + } + /* fall back in all the other cases */ + } + } + recursive--; + return symt_find_nearest_internal(module, addr); +} + struct symt_ht* symt_find_symbol_at(struct module* module, DWORD_PTR addr) { struct symt_ht* nearest = symt_find_nearest(module, addr); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/8052
From: Eric Pouech <epouech(a)codeweavers.com> Implement it for PDB. It uses DBI hash for lookup, but still returns a symt ptr. It however forces the full containing compiland load. Signed-off-by: Eric Pouech <epouech(a)codeweavers.com> --- dlls/dbghelp/dbghelp_private.h | 1 + dlls/dbghelp/dwarf.c | 1 + dlls/dbghelp/msc.c | 1 + dlls/dbghelp/pdb.c | 82 +++++++++++++++++++++++++++++++++- dlls/dbghelp/symbol.c | 19 ++++++++ 5 files changed, 103 insertions(+), 1 deletion(-) diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h index 3ccd249b97c..cecd7f62607 100644 --- a/dlls/dbghelp/dbghelp_private.h +++ b/dlls/dbghelp/dbghelp_private.h @@ -441,6 +441,7 @@ struct module_format_vtable /* index management */ enum method_result (*request_symref_t)(struct module_format *modfmt, symref_t ref, IMAGEHLP_SYMBOL_TYPE_INFO req, void *data); enum method_result (*lookup_by_address)(struct module_format *modfmt, DWORD_PTR address, symref_t *symref); + enum method_result (*lookup_by_name)(struct module_format *modfmt, const char *name, symref_t *symref); /* types management */ enum method_result (*find_type)(struct module_format *modfmt, const char *name, symref_t *ref); diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c index eb4abd9d5e8..634d8332184 100644 --- a/dlls/dbghelp/dwarf.c +++ b/dlls/dbghelp/dwarf.c @@ -4303,6 +4303,7 @@ static const struct module_format_vtable dwarf2_module_format_vtable = NULL, NULL, NULL, + NULL, dwarf2_location_compute, }; diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c index 10b1277bac2..2b1ed69ecb5 100644 --- a/dlls/dbghelp/msc.c +++ b/dlls/dbghelp/msc.c @@ -4020,6 +4020,7 @@ static const struct module_format_vtable old_pdb_module_format_vtable = NULL, NULL, NULL, + NULL, pdb_location_compute, }; diff --git a/dlls/dbghelp/pdb.c b/dlls/dbghelp/pdb.c index 457a7e63ab7..eb6da132c37 100644 --- a/dlls/dbghelp/pdb.c +++ b/dlls/dbghelp/pdb.c @@ -3570,7 +3570,7 @@ static enum pdb_result pdb_reader_init_IPI(struct pdb_reader *pdb) goto invalid_file; if (pdb->ipi_header.hash_value_size > sizeof(unsigned)) { - FIXME("Unexpected hash value size %u\n", pdb->ipi_header.hash_value_size); + PDB_REPORT_UNEXPECTED("IPI hash value size", pdb->ipi_header.hash_value_size); goto invalid_file; } pdb->ipi_walker.offset = pdb->ipi_header.type_offset; @@ -4579,11 +4579,91 @@ static enum method_result pdb_method_lookup_symbol_by_address(struct module_form return pdb_method_result(pdb_reader_lookup_top_symbol_by_segment_offset(pdb, segment, offset, symref)); } +static enum pdb_result pdb_reader_dereference_procedure(struct pdb_reader *pdb, unsigned compiland_id, pdbsize_t stream_offset, + unsigned *segment, unsigned *offset) +{ + enum pdb_result result; + struct pdb_reader_walker walker; + union codeview_symbol cv_symbol; + unsigned stream_id; + + if (!compiland_id || compiland_id > pdb->num_compilands) return R_PDB_INVALID_ARGUMENT; + compiland_id--; + stream_id = pdb->compilands[compiland_id].stream_id; + + if ((result = pdb_reader_walker_init(pdb, stream_id, &walker))) return result; + walker.offset = stream_offset; + if ((result = pdb_reader_read_partial_codeview_symbol(pdb, &walker, &cv_symbol))) return result; + switch (cv_symbol.generic.id) + { + case S_GPROC32: + case S_LPROC32: + *segment = cv_symbol.proc_v3.segment; + *offset = cv_symbol.proc_v3.offset; + break; + + default: + PDB_REPORT_UNEXPECTED("codeview symbol-id", cv_symbol.generic.id); + /* fall through */ + case S_OBJNAME: + case S_COMPILE: + case S_COMPILE2: + case S_COMPILE3: + case S_BUILDINFO: + case S_UDT: + case S_UNAMESPACE: + case S_GMANPROC: + case S_LMANPROC: + return R_PDB_NOT_FOUND; + } + + return result; +} + +static enum method_result pdb_method_lookup_symbol_by_name(struct module_format *modfmt, const char *name, symref_t *symref) +{ + enum pdb_result result; + struct pdb_reader *pdb; + union codeview_symbol cv_symbol; + pdbsize_t globals_offset; + unsigned segment; + unsigned offset; + + if (!pdb_hack_get_main_info(modfmt, &pdb, NULL)) return MR_FAILURE; + + if ((result = pdb_reader_read_DBI_codeview_symbol_by_name(pdb, name, &globals_offset, &cv_symbol))) + return pdb_method_result(result); + + switch (cv_symbol.generic.id) + { + case S_GDATA32: + case S_LDATA32: + segment = cv_symbol.data_v3.segment; + offset = cv_symbol.data_v3.offset; + break; + case S_PROCREF: + case S_LPROCREF: + if ((result = pdb_reader_dereference_procedure(pdb, cv_symbol.refsym2_v3.imod, cv_symbol.refsym2_v3.ibSym, + &segment, &offset))) + { + return MR_FAILURE; + } + break; + default: + return MR_FAILURE; + } + result = pdb_reader_lookup_top_symbol_by_segment_offset(pdb, segment, offset, symref); + if (result == R_PDB_SUCCESS) return MR_SUCCESS; + TRACE("No symbol %s found...\n", name); + return MR_NOT_FOUND; +} + static struct module_format_vtable pdb_module_format_vtable = { NULL,/*pdb_module_remove*/ pdb_method_request_symref_t, pdb_method_lookup_symbol_by_address, + pdb_method_lookup_symbol_by_name, pdb_method_find_type, pdb_method_enumerate_types, pdb_method_location_compute, diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c index 85eb76af15e..9c900344bd7 100644 --- a/dlls/dbghelp/symbol.c +++ b/dlls/dbghelp/symbol.c @@ -1610,6 +1610,7 @@ BOOL WINAPI SymGetSymFromAddr64(HANDLE hProcess, DWORD64 Address, static BOOL find_name(struct process* pcs, struct module* module, const char* name, SYMBOL_INFO* symbol) { + struct module_format_vtable_iterator iter = {}; struct hash_table_iter hti; void* ptr; struct symt_ht* sym = NULL; @@ -1619,6 +1620,24 @@ static BOOL find_name(struct process* pcs, struct module* module, const char* na if (!(pair.requested = module)) return FALSE; if (!module_get_debug(&pair)) return FALSE; + while ((module_format_vtable_iterator_next(pair.effective, &iter, + MODULE_FORMAT_VTABLE_INDEX(lookup_by_name)))) + { + symref_t symref; + enum method_result result = iter.modfmt->vtable->lookup_by_name(iter.modfmt, name, &symref); + if (result == MR_SUCCESS) + { + if (symt_is_symref_ptr(symref)) + { + symt_fill_sym_info(&pair, NULL, SYMT_SYMREF_TO_PTR(symref), symbol); + return TRUE; + } + FIXME("Not expected case\n"); + return FALSE; + } + if (result != MR_NOT_FOUND) return FALSE; + } + hash_table_iter_init(&pair.effective->ht_symbols, &hti, name); while ((ptr = hash_table_iter_up(&hti))) { -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/8052
From: Eric Pouech <epouech(a)codeweavers.com> Implement it for PDB backend. It ensures containing compiland of every matched symbol is actually loaded. Signed-off-by: Eric Pouech <epouech(a)codeweavers.com> --- dlls/dbghelp/dbghelp_private.h | 1 + dlls/dbghelp/dwarf.c | 1 + dlls/dbghelp/msc.c | 1 + dlls/dbghelp/pdb.c | 68 ++++++++++++++++++++++++++++++++++ dlls/dbghelp/symbol.c | 33 +++++++++++++++++ 5 files changed, 104 insertions(+) diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h index cecd7f62607..21a0112ea89 100644 --- a/dlls/dbghelp/dbghelp_private.h +++ b/dlls/dbghelp/dbghelp_private.h @@ -442,6 +442,7 @@ struct module_format_vtable enum method_result (*request_symref_t)(struct module_format *modfmt, symref_t ref, IMAGEHLP_SYMBOL_TYPE_INFO req, void *data); enum method_result (*lookup_by_address)(struct module_format *modfmt, DWORD_PTR address, symref_t *symref); enum method_result (*lookup_by_name)(struct module_format *modfmt, const char *name, symref_t *symref); + enum method_result (*enumerate_symbols)(struct module_format *modfmt, const WCHAR *match, BOOL (*cb)(symref_t, const char *, void *), void *user); /* types management */ enum method_result (*find_type)(struct module_format *modfmt, const char *name, symref_t *ref); diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c index 634d8332184..163167b596f 100644 --- a/dlls/dbghelp/dwarf.c +++ b/dlls/dbghelp/dwarf.c @@ -4304,6 +4304,7 @@ static const struct module_format_vtable dwarf2_module_format_vtable = NULL, NULL, NULL, + NULL, dwarf2_location_compute, }; diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c index 2b1ed69ecb5..c5721720537 100644 --- a/dlls/dbghelp/msc.c +++ b/dlls/dbghelp/msc.c @@ -4021,6 +4021,7 @@ static const struct module_format_vtable old_pdb_module_format_vtable = NULL, NULL, NULL, + NULL, pdb_location_compute, }; diff --git a/dlls/dbghelp/pdb.c b/dlls/dbghelp/pdb.c index eb6da132c37..eb4e3202541 100644 --- a/dlls/dbghelp/pdb.c +++ b/dlls/dbghelp/pdb.c @@ -4658,12 +4658,80 @@ static enum method_result pdb_method_lookup_symbol_by_name(struct module_format return MR_NOT_FOUND; } +static enum method_result pdb_method_enumerate_symbols(struct module_format *modfmt, const WCHAR *match, BOOL (*cb)(symref_t, const char *, void *), void *user) +{ + enum pdb_result result; + struct pdb_reader *pdb; + struct pdb_reader_walker walker, symbol_walker; + union codeview_symbol cv_symbol; + unsigned segment; + unsigned offset; + char *symbol_name; + + if (!pdb_hack_get_main_info(modfmt, &pdb, NULL)) return MR_FAILURE; + + /* FIXME could be optimized if match doesn't contain wild cards */ + /* this is currently ugly, but basically we just ensure that all the compilands which contain matching symbols + * are actually loaded, and fall back to generic mode... + */ + if ((result = pdb_reader_walker_init(pdb, pdb->dbi_header.gsym_stream, &walker))) return pdb_method_result(result); + while (pdb_reader_read_partial_codeview_symbol(pdb, &walker, &cv_symbol) == R_PDB_SUCCESS) + { + symbol_name = NULL; + symbol_walker = walker; + symbol_walker.offset -= sizeof(cv_symbol.generic.len); + switch (cv_symbol.generic.id) + { + case S_GDATA32: + case S_LDATA32: + segment = cv_symbol.data_v3.segment; + offset = cv_symbol.data_v3.offset; + symbol_walker.offset += offsetof(union codeview_symbol, data_v3.name); + if ((result = pdb_reader_alloc_and_fetch_string(pdb, &symbol_walker, &symbol_name))) return pdb_method_result(result); + break; + case S_PROCREF: + case S_LPROCREF: + if ((result = pdb_reader_dereference_procedure(pdb, cv_symbol.refsym2_v3.imod, cv_symbol.refsym2_v3.ibSym, + &segment, &offset))) + { + return pdb_method_result(result); + } + symbol_walker.offset += offsetof(union codeview_symbol, refsym2_v3.name); + if ((result = pdb_reader_alloc_and_fetch_string(pdb, &symbol_walker, &symbol_name))) return pdb_method_result(result); + break; + case S_UDT: + case S_CONSTANT: + case S_PUB32: + break; + default: + PDB_REPORT_UNEXPECTED("codeview symbol-id", cv_symbol.generic.id); + break; + } + if (symbol_name) + { + BOOL do_continue = TRUE; + symref_t symref; + + if (symt_match_stringAW(symbol_name, match, TRUE) && + pdb_reader_lookup_top_symbol_by_segment_offset(pdb, segment, offset, &symref) == R_PDB_SUCCESS) + { + do_continue = cb(symref, symbol_name, user); + } + pdb_reader_free(pdb, symbol_name); + if (!do_continue) return MR_SUCCESS; + } + walker.offset += cv_symbol.generic.len; + } + return MR_FAILURE; +} + static struct module_format_vtable pdb_module_format_vtable = { NULL,/*pdb_module_remove*/ pdb_method_request_symref_t, pdb_method_lookup_symbol_by_address, pdb_method_lookup_symbol_by_name, + pdb_method_enumerate_symbols, pdb_method_find_type, pdb_method_enumerate_types, pdb_method_location_compute, diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c index 9c900344bd7..7ab11e2f4eb 100644 --- a/dlls/dbghelp/symbol.c +++ b/dlls/dbghelp/symbol.c @@ -892,15 +892,48 @@ static BOOL send_symbol(const struct sym_enum* se, struct module_pair* pair, return !se->cb(se->sym_info, se->sym_info->Size, se->user); } +struct symbol_enum_method +{ + struct module_pair *pair; + const struct sym_enum *se; +}; + +static BOOL symbol_enum_method_cb(symref_t symref, const char *name, void *user) +{ + struct symbol_enum_method *sem = user; + + sem->se->sym_info->SizeOfStruct = sizeof(SYMBOL_INFO); + sem->se->sym_info->MaxNameLen = sizeof(sem->se->buffer) - sizeof(SYMBOL_INFO); + + if (symt_is_symref_ptr(symref)) + { + if (send_symbol(sem->se, sem->pair, NULL, (struct symt*)symref)) return TRUE; + } + else FIXME("No support for this case yet %Ix\n", symref); + return TRUE; +} + static BOOL symt_enum_module(struct module_pair* pair, const WCHAR* match, const struct sym_enum* se) { + struct module_format_vtable_iterator iter = {}; void* ptr; struct symt_ht* sym = NULL; struct hash_table_iter hti; WCHAR* nameW; BOOL ret; + while ((module_format_vtable_iterator_next(pair->effective, &iter, + MODULE_FORMAT_VTABLE_INDEX(enumerate_symbols)))) + { + struct symbol_enum_method sem = {pair, se}; + enum method_result result = iter.modfmt->vtable->enumerate_symbols(iter.modfmt, match, symbol_enum_method_cb, &sem); + + if (result == MR_SUCCESS) return TRUE; + if (result == MR_FAILURE) return FALSE; + /* fall back in all the other cases */ + } + hash_table_iter_init(&pair->effective->ht_symbols, &hti, NULL); while ((ptr = hash_table_iter_up(&hti))) { -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/8052
From: Eric Pouech <epouech(a)codeweavers.com> (instead of fully loading all compilands at startup). Signed-off-by: Eric Pouech <epouech(a)codeweavers.com> --- dlls/dbghelp/pdb.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/dlls/dbghelp/pdb.c b/dlls/dbghelp/pdb.c index eb4e3202541..c0dd06e411c 100644 --- a/dlls/dbghelp/pdb.c +++ b/dlls/dbghelp/pdb.c @@ -1779,9 +1779,6 @@ static enum pdb_result pdb_reader_read_DBI_codeview_symbol_by_name(struct pdb_re return R_PDB_NOT_FOUND; } -/* FIXME temp forward */ -static enum pdb_result pdb_reader_ensure_symbols_loaded_from_compiland(struct pdb_reader *pdb, unsigned compiland_index); - static enum pdb_result pdb_reader_init_DBI(struct pdb_reader *pdb) { enum pdb_result result; @@ -1812,11 +1809,6 @@ static enum pdb_result pdb_reader_init_DBI(struct pdb_reader *pdb) result = pdb_reader_compiland_iterator_next(pdb, &compiland_iter); if ((result == R_PDB_SUCCESS) != (i + 1 < pdb->num_compilands)) return result ? result : R_PDB_INVALID_PDB_FILE; } - /* TEMP force loading of all compilands */ - for (i = 0; i < pdb->num_compilands; i++) - { - if ((result = pdb_reader_ensure_symbols_loaded_from_compiland(pdb, i))) return result; - } if ((result = pdb_reader_load_DBI_hash_table(pdb))) return result; /* register the globals entries not bound to a compiland */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/8052
participants (2)
-
Eric Pouech -
eric pouech (@epo)