Eric Pouech : winedbg: Dwarf can emit REGREL symbol information,
so handle it.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Dec 4 07:17:19 CST 2006
Module: wine
Branch: master
Commit: a274689b09f0a74a723680bb9da2a60b094faf78
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a274689b09f0a74a723680bb9da2a60b094faf78
Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date: Sat Dec 2 17:43:34 2006 +0100
winedbg: Dwarf can emit REGREL symbol information, so handle it.
Factorize a bit more some symbol handling code.
---
programs/winedbg/symbol.c | 126 ++++++++++++++++++++------------------------
1 files changed, 57 insertions(+), 69 deletions(-)
diff --git a/programs/winedbg/symbol.c b/programs/winedbg/symbol.c
index 3b144b1..55e35ee 100644
--- a/programs/winedbg/symbol.c
+++ b/programs/winedbg/symbol.c
@@ -65,6 +65,45 @@ static BOOL symbol_get_debug_start(const
return FALSE;
}
+static BOOL fill_sym_lvalue(const SYMBOL_INFO* sym, ULONG base,
+ struct dbg_lvalue* lvalue, char* buffer, size_t sz)
+{
+ if (buffer) buffer[0] = '\0';
+ if (sym->Flags & SYMFLAG_REGISTER)
+ {
+ DWORD* pval;
+
+ if (!memory_get_register(sym->Register, &pval, buffer, sz))
+ return FALSE;
+ lvalue->cookie = DLV_HOST;
+ lvalue->addr.Offset = (DWORD_PTR)pval;
+ }
+ else if (sym->Flags & SYMFLAG_REGREL)
+ {
+ DWORD* pval;
+
+ if (!memory_get_register(sym->Register, &pval, buffer, sz))
+ return FALSE;
+ lvalue->cookie = DLV_TARGET;
+ lvalue->addr.Offset = (ULONG)((ULONG64)*pval + sym->Address);
+ }
+ else if (sym->Flags & SYMFLAG_LOCAL)
+ {
+ lvalue->cookie = DLV_TARGET;
+ lvalue->addr.Offset = base + sym->Address;
+ }
+ else
+ {
+ lvalue->cookie = DLV_TARGET;
+ lvalue->addr.Offset = sym->Address;
+ }
+ lvalue->addr.Mode = AddrModeFlat;
+ lvalue->type.module = sym->ModBase;
+ lvalue->type.id = sym->TypeIndex;
+
+ return TRUE;
+}
+
struct sgv_data
{
#define NUMDBGV 100
@@ -85,34 +124,13 @@ struct sgv_data
static BOOL CALLBACK sgv_cb(SYMBOL_INFO* sym, ULONG size, void* ctx)
{
struct sgv_data* sgv = (struct sgv_data*)ctx;
- ULONG64 addr;
- unsigned cookie = DLV_TARGET, insp;
+ unsigned insp;
+ char tmp[32];
- if (sym->Flags & SYMFLAG_REGISTER)
- {
- char tmp[32];
- DWORD* val;
- if (!memory_get_register(sym->Register, &val, tmp, sizeof(tmp)))
- {
- dbg_printf(" %s (register): %s\n", sym->Name, tmp);
- return TRUE;
- }
- addr = (ULONG64)(DWORD_PTR)val;
- cookie = DLV_HOST;
- }
- else if (sym->Flags & SYMFLAG_LOCAL) /* covers both local & parameters */
- {
- addr = sgv->frame_offset + sym->Address;
- }
- else if (sym->Flags & SYMFLAG_THUNK)
+ if (sym->Flags & SYMFLAG_THUNK)
{
if (!sgv->do_thunks) return TRUE;
sgv->num_thunks++;
- addr = sym->Address;
- }
- else
- {
- addr = sym->Address;
}
if (sgv->num >= NUMDBGV)
@@ -139,11 +157,11 @@ static BOOL CALLBACK sgv_cb(SYMBOL_INFO*
memmove(&sgv->syms[insp + 1], &sgv->syms[insp],
sizeof(sgv->syms[0]) * sgv->num_thunks);
}
- sgv->syms[insp].lvalue.cookie = cookie;
- 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;
+ if (!fill_sym_lvalue(sym, sgv->frame_offset, &sgv->syms[insp].lvalue, tmp, sizeof(tmp)))
+ {
+ dbg_printf("%s: %s\n", sym->Name, tmp);
+ return TRUE;
+ }
sgv->syms[insp].flags = sym->Flags;
sgv->syms[insp].sym_info = sym->info;
sgv->num++;
@@ -545,54 +563,24 @@ void symbol_print_local(const SYMBOL_INF
BOOL detailed)
{
struct dbg_lvalue lvalue;
- BOOL valtodo = FALSE;
char buffer[64];
dbg_printf("%s=", sym->Name);
- if (sym->Flags & SYMFLAG_REGISTER)
- {
- DWORD* pval;
-
- if (memory_get_register(sym->Register, &pval, buffer + 13, sizeof(buffer) - 13))
- {
- lvalue.cookie = DLV_HOST;
- lvalue.addr.Mode = AddrModeFlat;
- lvalue.addr.Offset = (DWORD_PTR)pval;
- valtodo = TRUE;
- memcpy(buffer, " in register ", 13);
- }
- else
- {
- dbg_printf(buffer + 13);
- buffer[0] = '\0';
- }
- }
- else if (sym->Flags & SYMFLAG_LOCAL)
- {
- lvalue.cookie = DLV_TARGET;
- lvalue.addr.Mode = AddrModeFlat;
- lvalue.addr.Offset = base + sym->Address;
- valtodo = TRUE;
- buffer[0] = '\0';
- }
- else
- {
- dbg_printf("<unexpected symbol flags %lx>\n", sym->Flags);
- buffer[0] = '\0';
- }
-
- if (valtodo)
+ if (fill_sym_lvalue(sym, base, &lvalue, buffer, sizeof(buffer)))
{
- lvalue.type.module = sym->ModBase;
- lvalue.type.id = sym->TypeIndex;
print_value(&lvalue, 'x', 1);
+ if (detailed)
+ dbg_printf(" (%s%s)",
+ (sym->Flags & SYMFLAG_PARAMETER) ? "parameter" : "local",
+ buffer);
}
-
- if (detailed)
+ else
{
- dbg_printf(" (%s%s)",
- (sym->Flags & SYMFLAG_PARAMETER) ? "parameter" : "local", buffer);
+ dbg_printf(buffer);
+ if (detailed)
+ dbg_printf(" (%s)",
+ (sym->Flags & SYMFLAG_PARAMETER) ? "parameter" : "local");
}
}
More information about the wine-cvs
mailing list