From 34db4856ae0431dd0c6e14ee6e35729271070052 Mon Sep 17 00:00:00 2001 From: Eric Pouech Date: Mon, 5 Dec 2005 12:00:54 +0100 Subject: [PATCH] dbghelp,winedbg: SYMBOL_INFO fix. - native dbghelp returns in SYMBOL_INFO.TypeIndex the index of the type of the symbol (we were returning the symbol index instead) - fixed winedbg accordingly --- dlls/dbghelp/symbol.c | 5 +++-- dlls/dbghelp/type.c | 1 + programs/winedbg/expr.c | 6 ++---- programs/winedbg/symbol.c | 13 +++++-------- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c index 0dfa606a94c..c47c04ca17e 100644 --- a/dlls/dbghelp/symbol.c +++ b/dlls/dbghelp/symbol.c @@ -443,8 +443,9 @@ static void symt_fill_sym_info(const struct module* module, const char* name; DWORD64 size; - sym_info->TypeIndex = (DWORD)sym; - sym_info->info = 0; /* TBD */ + if (!symt_get_info(sym, TI_GET_TYPE, &sym_info->TypeIndex)) + sym_info->TypeIndex = 0; + sym_info->info = (DWORD)sym; symt_get_info(sym, TI_GET_LENGTH, &size); sym_info->Size = (DWORD)size; sym_info->ModBase = module->module.BaseOfImage; diff --git a/dlls/dbghelp/type.c b/dlls/dbghelp/type.c index 7617be8839b..fba6942816a 100644 --- a/dlls/dbghelp/type.c +++ b/dlls/dbghelp/type.c @@ -718,6 +718,7 @@ BOOL symt_get_info(const struct symt* type, IMAGEHLP_SYMBOL_TYPE_INFO req, default: FIXME("Unsupported sym-tag %s for get-type\n", symt_get_tag_str(type->tag)); + case SymTagPublicSymbol: case SymTagThunk: return FALSE; } diff --git a/programs/winedbg/expr.c b/programs/winedbg/expr.c index 848eb917fc4..5eb4d495bc5 100644 --- a/programs/winedbg/expr.c +++ b/programs/winedbg/expr.c @@ -461,10 +461,8 @@ struct dbg_lvalue expr_eval(struct expr* exp) exp->un.call.result = 0; #endif rtn.cookie = DLV_HOST; - /* get function signature type */ - types_get_info(&rtn.type, TI_GET_TYPE, &rtn.type); - /* and now, return type */ - types_get_info(&rtn.type, TI_GET_TYPE, &rtn.type); + /* get return type from function signature tupe */ + types_get_info(&rtn.type, TI_GET_TYPE, &rtn.type.id); rtn.addr.Offset = (unsigned int)&exp->un.call.result; break; case EXPR_TYPE_INTVAR: diff --git a/programs/winedbg/symbol.c b/programs/winedbg/symbol.c index 61ef3dcdba1..f7dcfce539c 100644 --- a/programs/winedbg/symbol.c +++ b/programs/winedbg/symbol.c @@ -40,6 +40,7 @@ static BOOL symbol_get_debug_start(DWORD mod_base, DWORD typeid, ULONG64* start) int i; struct dbg_type type; + if (!typeid) return FALSE; /* native dbghelp not always fills the info field */ type.module = mod_base; type.id = typeid; @@ -134,7 +135,7 @@ static BOOL CALLBACK sgv_cb(SYMBOL_INFO* sym, ULONG size, void* ctx) if (sgv->lineno == -1) { if (!sgv->bp_disp || - !symbol_get_debug_start(sym->ModBase, sym->TypeIndex, &addr)) + !symbol_get_debug_start(sym->ModBase, sym->info, &addr)) addr = sym->Address; } else @@ -185,9 +186,7 @@ static BOOL CALLBACK sgv_cb(SYMBOL_INFO* sym, ULONG size, void* ctx) sgv->syms[insp].lvalue.addr.Mode = AddrModeFlat; sgv->syms[insp].lvalue.addr.Offset = addr; sgv->syms[insp].lvalue.type.module = sym->ModBase; - sgv->syms[insp].lvalue.type.id = sym->TypeIndex; - types_get_info(&sgv->syms[insp].lvalue.type, TI_GET_TYPE, - &sgv->syms[insp].lvalue.type.id); + sgv->syms[insp].lvalue.type.id = sym->TypeIndex; sgv->syms[insp].flags = sym->Flags; sgv->num++; @@ -463,7 +462,7 @@ enum dbg_line_status symbol_get_function_line_status(const ADDRESS* addr) if (!SymGetLineFromAddr(dbg_curr_process->handle, lin, &disp, &il)) return dbg_no_line_info; - if (symbol_get_debug_start(sym->ModBase, sym->TypeIndex, &start) && lin < start) + if (symbol_get_debug_start(sym->ModBase, sym->info, &start) && lin < start) return dbg_not_on_a_line_number; if (!sym->Size) sym->Size = 0x100000; if (il.FileName && il.FileName[0] && disp < sym->Size) @@ -545,7 +544,6 @@ static BOOL CALLBACK info_locals_cb(SYMBOL_INFO* sym, ULONG size, void* ctx) dbg_printf("\t"); type.module = sym->ModBase; type.id = sym->TypeIndex; - types_get_info(&type, TI_GET_TYPE, &type.id); types_print_type(&type, FALSE); if (sym->Flags & SYMFLAG_PARAMETER) explain = "parameter"; @@ -624,8 +622,7 @@ static BOOL CALLBACK symbols_info_cb(SYMBOL_INFO* sym, ULONG size, void* ctx) type.id = sym->TypeIndex; type.module = sym->ModBase; - if (sym->TypeIndex != dbg_itype_none && sym->TypeIndex != 0 && - types_get_info(&type, TI_GET_TYPE, &type.id)) + if (sym->TypeIndex != dbg_itype_none && sym->TypeIndex != 0) { dbg_printf(" "); types_print_type(&type, FALSE);