Module: wine Branch: master Commit: 4806320b4829c7007fce3d796fbe6cef9682d2a8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4806320b4829c7007fce3d796f...
Author: Eric Pouech eric.pouech@wanadoo.fr Date: Tue Dec 5 22:13:23 2006 +0100
dbghelp: In find_nearest, now return the symbol instead of its index in module->sorttable.
---
dlls/dbghelp/dbghelp_private.h | 3 ++- dlls/dbghelp/dwarf.c | 8 ++++---- dlls/dbghelp/elf_module.c | 21 ++++++++++----------- dlls/dbghelp/symbol.c | 34 ++++++++++++++-------------------- 4 files changed, 30 insertions(+), 36 deletions(-)
diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h index 19864db..f575bcf 100644 --- a/dlls/dbghelp/dbghelp_private.h +++ b/dlls/dbghelp/dbghelp_private.h @@ -485,7 +485,8 @@ extern BOOL dwarf2_parse(struct /* symbol.c */ extern const char* symt_get_name(const struct symt* sym); extern int symt_cmp_addr(const void* p1, const void* p2); -extern int symt_find_nearest(struct module* module, DWORD addr); +extern struct symt_ht* + symt_find_nearest(struct module* module, DWORD addr); extern struct symt_compiland* symt_new_compiland(struct module* module, unsigned long address, unsigned src_idx); diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c index aaab3fb..a3af469 100644 --- a/dlls/dbghelp/dwarf.c +++ b/dlls/dbghelp/dwarf.c @@ -1700,15 +1700,15 @@ static void dwarf2_set_line_number(struc struct vector* v, unsigned file, unsigned line) { struct symt_function* func; - int idx; + struct symt_ht* symt; unsigned* psrc;
if (!file || !(psrc = vector_at(v, file - 1))) return;
TRACE("%s %lx %s %u\n", module->module.ModuleName, address, source_get(module, *psrc), line); - if ((idx = symt_find_nearest(module, address)) == -1 || - module->addr_sorttab[idx]->symt.tag != SymTagFunction) return; - func = (struct symt_function*)module->addr_sorttab[idx]; + if (!(symt = symt_find_nearest(module, address)) || + symt->symt.tag != SymTagFunction) return; + func = (struct symt_function*)symt; symt_add_func_line(module, func, *psrc, line, address - func->address); }
diff --git a/dlls/dbghelp/elf_module.c b/dlls/dbghelp/elf_module.c index 78a8962..9a90d43 100644 --- a/dlls/dbghelp/elf_module.c +++ b/dlls/dbghelp/elf_module.c @@ -543,7 +543,7 @@ static int elf_new_wine_thunks(struct mo struct hash_table_iter hti; struct symtab_elt* ste; DWORD addr; - int idx; + struct symt_ht* symt;
hash_table_iter_init(ht_symtab, &hti, NULL); while ((ste = hash_table_iter_up(&hti))) @@ -562,11 +562,10 @@ static int elf_new_wine_thunks(struct mo { ULONG64 ref_addr;
- idx = symt_find_nearest(module, addr); - if (idx != -1) - symt_get_info(&module->addr_sorttab[idx]->symt, - TI_GET_ADDRESS, &ref_addr); - if (idx == -1 || addr != ref_addr) + symt = symt_find_nearest(module, addr); + if (symt) + symt_get_info(&symt->symt, TI_GET_ADDRESS, &ref_addr); + if (!symt || addr != ref_addr) { /* creating public symbols for all the ELF symbols which haven't been * used yet (ie we have no debug information on them) @@ -596,14 +595,14 @@ static int elf_new_wine_thunks(struct mo */ module->sortlist_valid = TRUE; } - else if (strcmp(ste->ht_elt.name, module->addr_sorttab[idx]->hash_elt.name)) + else if (strcmp(ste->ht_elt.name, symt->hash_elt.name)) { ULONG64 xaddr = 0, xsize = 0; DWORD kind = -1;
- symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_ADDRESS, &xaddr); - symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_LENGTH, &xsize); - symt_get_info(&module->addr_sorttab[idx]->symt, TI_GET_DATAKIND, &kind); + symt_get_info(&symt->symt, TI_GET_ADDRESS, &xaddr); + symt_get_info(&symt->symt, TI_GET_LENGTH, &xsize); + symt_get_info(&symt->symt, TI_GET_DATAKIND, &kind);
/* If none of symbols has a correct size, we consider they are both markers * Hence, we can silence this warning @@ -615,7 +614,7 @@ static int elf_new_wine_thunks(struct mo FIXME("Duplicate in %s: %s<%08x-%08x> %s<%s-%s>\n", module->module.ModuleName, ste->ht_elt.name, addr, ste->symp->st_size, - module->addr_sorttab[idx]->hash_elt.name, + symt->hash_elt.name, wine_dbgstr_longlong(xaddr), wine_dbgstr_longlong(xsize)); } } diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c index b318bb7..f4b0612 100644 --- a/dlls/dbghelp/symbol.c +++ b/dlls/dbghelp/symbol.c @@ -154,7 +154,7 @@ struct symt_public* symt_new_public(stru TRACE_(dbghelp_symt)("Adding public symbol %s:%s @%lx\n", module->module.ModuleName, name, address); if ((dbghelp_options & SYMOPT_AUTO_PUBLICS) && - symt_find_nearest(module, address) != -1) + symt_find_nearest(module, address) != NULL) return NULL; if ((sym = pool_alloc(&module->pool, sizeof(*sym)))) { @@ -648,14 +648,14 @@ static BOOL resort_symbols(struct module }
/* assume addr is in module */ -int symt_find_nearest(struct module* module, DWORD addr) +struct symt_ht* symt_find_nearest(struct module* module, DWORD addr) { int mid, high, low; ULONG64 ref_addr, ref_size;
if (!module->sortlist_valid || !module->addr_sorttab) { - if (!resort_symbols(module)) return -1; + if (!resort_symbols(module)) return NULL; }
/* @@ -665,13 +665,13 @@ int symt_find_nearest(struct module* mod high = module->module.NumSyms;
symt_get_info(&module->addr_sorttab[0]->symt, TI_GET_ADDRESS, &ref_addr); - if (addr < ref_addr) return -1; + if (addr < ref_addr) return NULL; if (high) { symt_get_info(&module->addr_sorttab[high - 1]->symt, TI_GET_ADDRESS, &ref_addr); if (!symt_get_info(&module->addr_sorttab[high - 1]->symt, TI_GET_LENGTH, &ref_size) || !ref_size) ref_size = 0x1000; /* arbitrary value */ - if (addr >= ref_addr + ref_size) return -1; + if (addr >= ref_addr + ref_size) return NULL; }
while (high > low + 1) @@ -703,12 +703,12 @@ int symt_find_nearest(struct module* mod } /* finally check that we fit into the found symbol */ symt_get_info(&module->addr_sorttab[low]->symt, TI_GET_ADDRESS, &ref_addr); - if (addr < ref_addr) return -1; + if (addr < ref_addr) return NULL; if (!symt_get_info(&module->addr_sorttab[high - 1]->symt, TI_GET_LENGTH, &ref_size) || !ref_size) ref_size = 0x1000; /* arbitrary value */ - if (addr >= ref_addr + ref_size) return -1; + if (addr >= ref_addr + ref_size) return NULL;
- return low; + return module->addr_sorttab[low]; }
static BOOL symt_enum_locals_helper(struct module_pair* pair, @@ -758,7 +758,6 @@ static BOOL symt_enum_locals(struct proc struct module_pair pair; struct symt_ht* sym; DWORD pc = pcs->ctx_frame.InstructionOffset; - int idx;
se->sym_info->SizeOfStruct = sizeof(*se->sym_info); se->sym_info->MaxNameLen = sizeof(se->buffer) - sizeof(SYMBOL_INFO); @@ -766,9 +765,8 @@ static BOOL symt_enum_locals(struct proc pair.pcs = pcs; pair.requested = module_find_by_addr(pair.pcs, pc, DMT_UNKNOWN); if (!module_get_debug(&pair)) return FALSE; - if ((idx = symt_find_nearest(pair.effective, pc)) == -1) return FALSE; + if ((sym = symt_find_nearest(pair.effective, pc)) == NULL) return FALSE;
- sym = pair.effective->addr_sorttab[idx]; if (sym->symt.tag == SymTagFunction) { BOOL ret; @@ -998,15 +996,12 @@ BOOL WINAPI SymFromAddr(HANDLE hProcess, { struct module_pair pair; struct symt_ht* sym; - int idx;
pair.pcs = process_find_by_handle(hProcess); if (!pair.pcs) return FALSE; pair.requested = module_find_by_addr(pair.pcs, Address, DMT_UNKNOWN); if (!module_get_debug(&pair)) return FALSE; - if ((idx = symt_find_nearest(pair.effective, Address)) == -1) return FALSE; - - sym = pair.effective->addr_sorttab[idx]; + if ((sym = symt_find_nearest(pair.effective, Address)) == NULL) return FALSE;
symt_fill_sym_info(&pair, NULL, &sym->symt, Symbol); *Displacement = Address - Symbol->Address; @@ -1252,7 +1247,7 @@ BOOL WINAPI SymGetLineFromAddr(HANDLE hP PDWORD pdwDisplacement, PIMAGEHLP_LINE Line) { struct module_pair pair; - int idx; + struct symt_ht* symt;
TRACE("%p %08x %p %p\n", hProcess, dwAddr, pdwDisplacement, Line);
@@ -1262,11 +1257,10 @@ BOOL WINAPI SymGetLineFromAddr(HANDLE hP if (!pair.pcs) return FALSE; pair.requested = module_find_by_addr(pair.pcs, dwAddr, DMT_UNKNOWN); if (!module_get_debug(&pair)) return FALSE; - if ((idx = symt_find_nearest(pair.effective, dwAddr)) == -1) return FALSE; + if ((symt = symt_find_nearest(pair.effective, dwAddr)) == NULL) return FALSE;
- if (pair.effective->addr_sorttab[idx]->symt.tag != SymTagFunction) return FALSE; - if (!symt_fill_func_line_info(pair.effective, - (struct symt_function*)pair.effective->addr_sorttab[idx], + if (symt->symt.tag != SymTagFunction) return FALSE; + if (!symt_fill_func_line_info(pair.effective, (struct symt_function*)symt, dwAddr, Line)) return FALSE; *pdwDisplacement = dwAddr - Line->Address; return TRUE;