dbghelp: Add helper to get global address out of symt, instead of going though symt_get_info.

This commit is contained in:
Eric Pouech 2011-03-08 21:31:38 +01:00 committed by Alexandre Julliard
parent d52e42e985
commit dca2d350ad
6 changed files with 65 additions and 67 deletions

View File

@ -167,7 +167,7 @@ BOOL coff_process_info(const struct msc_debug_info* msc_dbg)
const char* nampnt; const char* nampnt;
int naux; int naux;
BOOL ret = FALSE; BOOL ret = FALSE;
DWORD addr; ULONG64 addr;
TRACE("Processing COFF symbols...\n"); TRACE("Processing COFF symbols...\n");
@ -399,7 +399,6 @@ BOOL coff_process_info(const struct msc_debug_info* msc_dbg)
{ {
if (coff_files.files[j].entries != NULL) if (coff_files.files[j].entries != NULL)
{ {
symt_cmp_addr_module = msc_dbg->module;
qsort(coff_files.files[j].entries, coff_files.files[j].neps, qsort(coff_files.files[j].entries, coff_files.files[j].neps,
sizeof(struct symt*), symt_cmp_addr); sizeof(struct symt*), symt_cmp_addr);
} }
@ -424,7 +423,7 @@ BOOL coff_process_info(const struct msc_debug_info* msc_dbg)
for (;;) for (;;)
{ {
if (l+1 >= coff_files.files[j].neps) break; if (l+1 >= coff_files.files[j].neps) break;
symt_get_info(msc_dbg->module, coff_files.files[j].entries[l+1], TI_GET_ADDRESS, &addr); symt_get_address(coff_files.files[j].entries[l+1], &addr);
if (((msc_dbg->module->module.BaseOfImage + linepnt->Type.VirtualAddress) < addr)) if (((msc_dbg->module->module.BaseOfImage + linepnt->Type.VirtualAddress) < addr))
break; break;
l++; l++;
@ -437,7 +436,7 @@ BOOL coff_process_info(const struct msc_debug_info* msc_dbg)
* start of the function, so we need to subtract that offset * start of the function, so we need to subtract that offset
* first. * first.
*/ */
symt_get_info(msc_dbg->module, coff_files.files[j].entries[l+1], TI_GET_ADDRESS, &addr); symt_get_address(coff_files.files[j].entries[l+1], &addr);
symt_add_func_line(msc_dbg->module, (struct symt_function*)coff_files.files[j].entries[l+1], symt_add_func_line(msc_dbg->module, (struct symt_function*)coff_files.files[j].entries[l+1],
coff_files.files[j].compiland->source, linepnt->Linenumber, coff_files.files[j].compiland->source, linepnt->Linenumber,
msc_dbg->module->module.BaseOfImage + linepnt->Type.VirtualAddress - addr); msc_dbg->module->module.BaseOfImage + linepnt->Type.VirtualAddress - addr);

View File

@ -619,7 +619,7 @@ extern DWORD64 sw_module_base(struct cpu_stack_walk* csw, DWORD64 addr);
/* symbol.c */ /* symbol.c */
extern const char* symt_get_name(const struct symt* sym); extern const char* symt_get_name(const struct symt* sym);
extern struct module* symt_cmp_addr_module; extern BOOL symt_get_address(const struct symt* type, ULONG64* addr);
extern int symt_cmp_addr(const void* p1, const void* p2); extern int symt_cmp_addr(const void* p1, const void* p2);
extern void copy_symbolW(SYMBOL_INFOW* siw, const SYMBOL_INFO* si); extern void copy_symbolW(SYMBOL_INFOW* siw, const SYMBOL_INFO* si);
extern struct symt_ht* extern struct symt_ht*

View File

@ -732,7 +732,7 @@ static int elf_new_wine_thunks(struct module* module, const struct hash_table* h
struct location loc; struct location loc;
symt = symt_find_nearest(module, addr); symt = symt_find_nearest(module, addr);
if (symt && !symt_get_info(module, &symt->symt, TI_GET_ADDRESS, &ref_addr)) if (symt && !symt_get_address(&symt->symt, &ref_addr))
ref_addr = addr; ref_addr = addr;
if (!symt || addr != ref_addr) if (!symt || addr != ref_addr)
{ {
@ -772,7 +772,7 @@ static int elf_new_wine_thunks(struct module* module, const struct hash_table* h
ULONG64 xaddr = 0, xsize = 0; ULONG64 xaddr = 0, xsize = 0;
DWORD kind = -1; DWORD kind = -1;
symt_get_info(module, &symt->symt, TI_GET_ADDRESS, &xaddr); symt_get_address(&symt->symt, &xaddr);
symt_get_info(module, &symt->symt, TI_GET_LENGTH, &xsize); symt_get_info(module, &symt->symt, TI_GET_LENGTH, &xsize);
symt_get_info(module, &symt->symt, TI_GET_DATAKIND, &kind); symt_get_info(module, &symt->symt, TI_GET_DATAKIND, &kind);

View File

@ -778,7 +778,7 @@ static void macho_finish_stabs(struct module* module, struct hash_table* ht_symt
sym = symt_find_nearest(module, ste->addr); sym = symt_find_nearest(module, ste->addr);
if (sym) if (sym)
symt_get_info(module, &sym->symt, TI_GET_ADDRESS, &addr); symt_get_address(&sym->symt, &addr);
if (sym && ste->addr == addr) if (sym && ste->addr == addr)
{ {
ULONG64 size = 0; ULONG64 size = 0;

View File

@ -51,21 +51,18 @@ static inline int cmp_addr(ULONG64 a1, ULONG64 a2)
static inline int cmp_sorttab_addr(struct module* module, int idx, ULONG64 addr) static inline int cmp_sorttab_addr(struct module* module, int idx, ULONG64 addr)
{ {
ULONG64 ref; ULONG64 ref;
symt_get_address(&module->addr_sorttab[idx]->symt, &ref);
symt_get_info(module, &module->addr_sorttab[idx]->symt, TI_GET_ADDRESS, &ref);
return cmp_addr(ref, addr); return cmp_addr(ref, addr);
} }
struct module* symt_cmp_addr_module = NULL;
int symt_cmp_addr(const void* p1, const void* p2) int symt_cmp_addr(const void* p1, const void* p2)
{ {
const struct symt* sym1 = *(const struct symt* const *)p1; const struct symt* sym1 = *(const struct symt* const *)p1;
const struct symt* sym2 = *(const struct symt* const *)p2; const struct symt* sym2 = *(const struct symt* const *)p2;
ULONG64 a1, a2; ULONG64 a1, a2;
symt_get_info(symt_cmp_addr_module, sym1, TI_GET_ADDRESS, &a1); symt_get_address(sym1, &a1);
symt_get_info(symt_cmp_addr_module, sym2, TI_GET_ADDRESS, &a2); symt_get_address(sym2, &a2);
return cmp_addr(a1, a2); return cmp_addr(a1, a2);
} }
@ -131,7 +128,7 @@ static void symt_add_module_ht(struct module* module, struct symt_ht* ht)
/* Don't store in sorttab a symbol without address, they are of /* Don't store in sorttab a symbol without address, they are of
* no use here (e.g. constant values) * no use here (e.g. constant values)
*/ */
if (symt_get_info(module, &ht->symt, TI_GET_ADDRESS, &addr) && if (symt_get_address(&ht->symt, &addr) &&
symt_grow_sorttab(module, module->num_symbols + 1)) symt_grow_sorttab(module, module->num_symbols + 1))
{ {
module->addr_sorttab[module->num_symbols++] = ht; module->addr_sorttab[module->num_symbols++] = ht;
@ -746,7 +743,7 @@ static void symt_fill_sym_info(struct module_pair* pair,
sym_info->Flags |= SYMFLAG_TLSREL; sym_info->Flags |= SYMFLAG_TLSREL;
/* fall through */ /* fall through */
case loc_absolute: case loc_absolute:
symt_get_info(pair->effective, sym, TI_GET_ADDRESS, &sym_info->Address); symt_get_address(sym, &sym_info->Address);
sym_info->Register = 0; sym_info->Register = 0;
break; break;
default: default:
@ -779,18 +776,18 @@ static void symt_fill_sym_info(struct module_pair* pair,
break; break;
case SymTagPublicSymbol: case SymTagPublicSymbol:
sym_info->Flags |= SYMFLAG_EXPORT; sym_info->Flags |= SYMFLAG_EXPORT;
symt_get_info(pair->effective, sym, TI_GET_ADDRESS, &sym_info->Address); symt_get_address(sym, &sym_info->Address);
break; break;
case SymTagFunction: case SymTagFunction:
sym_info->Flags |= SYMFLAG_FUNCTION; sym_info->Flags |= SYMFLAG_FUNCTION;
symt_get_info(pair->effective, sym, TI_GET_ADDRESS, &sym_info->Address); symt_get_address(sym, &sym_info->Address);
break; break;
case SymTagThunk: case SymTagThunk:
sym_info->Flags |= SYMFLAG_THUNK; sym_info->Flags |= SYMFLAG_THUNK;
symt_get_info(pair->effective, sym, TI_GET_ADDRESS, &sym_info->Address); symt_get_address(sym, &sym_info->Address);
break; break;
default: default:
symt_get_info(pair->effective, sym, TI_GET_ADDRESS, &sym_info->Address); symt_get_address(sym, &sym_info->Address);
sym_info->Register = 0; sym_info->Register = 0;
break; break;
} }
@ -861,7 +858,7 @@ static inline unsigned where_to_insert(struct module* module, unsigned high, con
ULONG64 addr; ULONG64 addr;
if (!high) return 0; if (!high) return 0;
symt_get_info(module, &elt->symt, TI_GET_ADDRESS, &addr); symt_get_address(&elt->symt, &addr);
do do
{ {
switch (cmp_sorttab_addr(module, mid, addr)) switch (cmp_sorttab_addr(module, mid, addr))
@ -893,13 +890,12 @@ static BOOL resort_symbols(struct module* module)
delta = module->num_symbols - module->num_sorttab; delta = module->num_symbols - module->num_sorttab;
memcpy(tmp, &module->addr_sorttab[module->num_sorttab], delta * sizeof(struct symt_ht*)); memcpy(tmp, &module->addr_sorttab[module->num_sorttab], delta * sizeof(struct symt_ht*));
symt_cmp_addr_module = module;
qsort(tmp, delta, sizeof(struct symt_ht*), symt_cmp_addr); qsort(tmp, delta, sizeof(struct symt_ht*), symt_cmp_addr);
for (i = delta - 1; i >= 0; i--) for (i = delta - 1; i >= 0; i--)
{ {
prev_ins_idx = ins_idx; prev_ins_idx = ins_idx;
ins_idx = where_to_insert(module, prev_ins_idx = ins_idx, tmp[i]); ins_idx = where_to_insert(module, ins_idx, tmp[i]);
memmove(&module->addr_sorttab[ins_idx + i + 1], memmove(&module->addr_sorttab[ins_idx + i + 1],
&module->addr_sorttab[ins_idx], &module->addr_sorttab[ins_idx],
(prev_ins_idx - ins_idx) * sizeof(struct symt_ht*)); (prev_ins_idx - ins_idx) * sizeof(struct symt_ht*));
@ -908,7 +904,6 @@ static BOOL resort_symbols(struct module* module)
} }
else else
{ {
symt_cmp_addr_module = module;
qsort(module->addr_sorttab, module->num_symbols, sizeof(struct symt_ht*), symt_cmp_addr); qsort(module->addr_sorttab, module->num_symbols, sizeof(struct symt_ht*), symt_cmp_addr);
} }
module->num_sorttab = module->num_symbols; module->num_sorttab = module->num_symbols;
@ -944,11 +939,11 @@ struct symt_ht* symt_find_nearest(struct module* module, DWORD_PTR addr)
low = 0; low = 0;
high = module->num_sorttab; high = module->num_sorttab;
symt_get_info(module, &module->addr_sorttab[0]->symt, TI_GET_ADDRESS, &ref_addr); symt_get_address(&module->addr_sorttab[0]->symt, &ref_addr);
if (addr < ref_addr) return NULL; if (addr < ref_addr) return NULL;
if (high) if (high)
{ {
symt_get_info(module, &module->addr_sorttab[high - 1]->symt, TI_GET_ADDRESS, &ref_addr); symt_get_address(&module->addr_sorttab[high - 1]->symt, &ref_addr);
symt_get_length(module, &module->addr_sorttab[high - 1]->symt, &ref_size); symt_get_length(module, &module->addr_sorttab[high - 1]->symt, &ref_size);
if (addr >= ref_addr + ref_size) return NULL; if (addr >= ref_addr + ref_size) return NULL;
} }
@ -969,8 +964,8 @@ struct symt_ht* symt_find_nearest(struct module* module, DWORD_PTR addr)
* might also have the same address, but would get better information * might also have the same address, but would get better information
*/ */
if (module->addr_sorttab[low]->symt.tag == SymTagPublicSymbol) if (module->addr_sorttab[low]->symt.tag == SymTagPublicSymbol)
{ {
symt_get_info(module, &module->addr_sorttab[low]->symt, TI_GET_ADDRESS, &ref_addr); symt_get_address(&module->addr_sorttab[low]->symt, &ref_addr);
if (low > 0 && if (low > 0 &&
module->addr_sorttab[low - 1]->symt.tag != SymTagPublicSymbol && module->addr_sorttab[low - 1]->symt.tag != SymTagPublicSymbol &&
!cmp_sorttab_addr(module, low - 1, ref_addr)) !cmp_sorttab_addr(module, low - 1, ref_addr))
@ -981,7 +976,7 @@ struct symt_ht* symt_find_nearest(struct module* module, DWORD_PTR addr)
low++; low++;
} }
/* finally check that we fit into the found symbol */ /* finally check that we fit into the found symbol */
symt_get_info(module, &module->addr_sorttab[low]->symt, TI_GET_ADDRESS, &ref_addr); symt_get_address(&module->addr_sorttab[low]->symt, &ref_addr);
if (addr < ref_addr) return NULL; if (addr < ref_addr) return NULL;
symt_get_length(module, &module->addr_sorttab[low]->symt, &ref_size); symt_get_length(module, &module->addr_sorttab[low]->symt, &ref_size);
if (addr >= ref_addr + ref_size) return NULL; if (addr >= ref_addr + ref_size) return NULL;

View File

@ -102,6 +102,47 @@ const char* symt_get_name(const struct symt* sym)
} }
} }
BOOL symt_get_address(const struct symt* type, ULONG64* addr)
{
switch (type->tag)
{
case SymTagData:
switch (((const struct symt_data*)type)->kind)
{
case DataIsGlobal:
case DataIsFileStatic:
*addr = ((const struct symt_data*)type)->u.var.offset;
break;
default: return FALSE;
}
break;
case SymTagFunction:
*addr = ((const struct symt_function*)type)->address;
break;
case SymTagPublicSymbol:
*addr = ((const struct symt_public*)type)->address;
break;
case SymTagFuncDebugStart:
case SymTagFuncDebugEnd:
case SymTagLabel:
if (!((const struct symt_hierarchy_point*)type)->parent ||
!symt_get_address(((const struct symt_hierarchy_point*)type)->parent, addr))
return FALSE;
*addr += ((const struct symt_hierarchy_point*)type)->loc.offset;
break;
case SymTagThunk:
*addr = ((const struct symt_thunk*)type)->address;
break;
case SymTagCompiland:
*addr = ((const struct symt_compiland*)type)->address;
break;
default:
FIXME("Unsupported sym-tag %s for get-address\n", symt_get_tag_str(type->tag));
return FALSE;
}
return TRUE;
}
static struct symt* symt_find_type_by_name(const struct module* module, static struct symt* symt_find_type_by_name(const struct module* module,
enum SymTagEnum sym_tag, enum SymTagEnum sym_tag,
const char* typename) const char* typename)
@ -517,44 +558,7 @@ BOOL symt_get_info(struct module* module, const struct symt* type,
break; break;
case TI_GET_ADDRESS: case TI_GET_ADDRESS:
switch (type->tag) return symt_get_address(type, (ULONG64*)pInfo);
{
case SymTagData:
switch (((const struct symt_data*)type)->kind)
{
case DataIsGlobal:
case DataIsFileStatic:
X(ULONG64) = ((const struct symt_data*)type)->u.var.offset;
break;
default: return FALSE;
}
break;
case SymTagFunction:
X(ULONG64) = ((const struct symt_function*)type)->address;
break;
case SymTagPublicSymbol:
X(ULONG64) = ((const struct symt_public*)type)->address;
break;
case SymTagFuncDebugStart:
case SymTagFuncDebugEnd:
case SymTagLabel:
if (!symt_get_info(module, ((const struct symt_hierarchy_point*)type)->parent,
req, pInfo))
return FALSE;
X(ULONG64) += ((const struct symt_hierarchy_point*)type)->loc.offset;
break;
case SymTagThunk:
X(ULONG64) = ((const struct symt_thunk*)type)->address;
break;
case SymTagCompiland:
X(ULONG64) = ((const struct symt_compiland*)type)->address;
break;
default:
FIXME("Unsupported sym-tag %s for get-address\n",
symt_get_tag_str(type->tag));
return FALSE;
}
break;
case TI_GET_BASETYPE: case TI_GET_BASETYPE:
switch (type->tag) switch (type->tag)