Eric Pouech : dbghelp,winedbg: SYMBOL_INFO fix.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Dec 5 08:54:10 CST 2005
Module: wine
Branch: refs/heads/master
Commit: 34db4856ae0431dd0c6e14ee6e35729271070052
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=34db4856ae0431dd0c6e14ee6e35729271070052
Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date: Mon Dec 5 12:00:54 2005 +0100
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 0dfa606..c47c04c 100644
--- a/dlls/dbghelp/symbol.c
+++ b/dlls/dbghelp/symbol.c
@@ -443,8 +443,9 @@ static void symt_fill_sym_info(const str
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 7617be8..fba6942 100644
--- a/dlls/dbghelp/type.c
+++ b/dlls/dbghelp/type.c
@@ -718,6 +718,7 @@ BOOL symt_get_info(const struct symt* ty
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 848eb91..5eb4d49 100644
--- a/programs/winedbg/expr.c
+++ b/programs/winedbg/expr.c
@@ -461,10 +461,8 @@ struct dbg_lvalue expr_eval(struct expr*
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 61ef3dc..f7dcfce 100644
--- a/programs/winedbg/symbol.c
+++ b/programs/winedbg/symbol.c
@@ -40,6 +40,7 @@ static BOOL symbol_get_debug_start(DWORD
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*
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*
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
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(SYMB
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(SYM
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);
More information about the wine-cvs
mailing list