dbghelp: Properly manage in dbghelp interfaces local variables and parameters that are constant.
This commit is contained in:
parent
99a5488a18
commit
083eca072d
|
@ -347,6 +347,7 @@ struct module_format
|
||||||
|
|
||||||
struct module
|
struct module
|
||||||
{
|
{
|
||||||
|
struct process* process;
|
||||||
IMAGEHLP_MODULEW64 module;
|
IMAGEHLP_MODULEW64 module;
|
||||||
/* ANSI copy of module.ModuleName for efficiency */
|
/* ANSI copy of module.ModuleName for efficiency */
|
||||||
char module_name[MAX_PATH];
|
char module_name[MAX_PATH];
|
||||||
|
|
|
@ -142,6 +142,7 @@ struct module* module_new(struct process* pcs, const WCHAR* name,
|
||||||
|
|
||||||
pool_init(&module->pool, 65536);
|
pool_init(&module->pool, 65536);
|
||||||
|
|
||||||
|
module->process = pcs;
|
||||||
module->module.SizeOfStruct = sizeof(module->module);
|
module->module.SizeOfStruct = sizeof(module->module);
|
||||||
module->module.BaseOfImage = mod_addr;
|
module->module.BaseOfImage = mod_addr;
|
||||||
module->module.ImageSize = size;
|
module->module.ImageSize = size;
|
||||||
|
|
|
@ -803,9 +803,35 @@ BOOL symt_get_info(struct module* module, const struct symt* type,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TI_GET_VALUE:
|
case TI_GET_VALUE:
|
||||||
if (type->tag != SymTagData || ((const struct symt_data*)type)->kind != DataIsConstant)
|
if (type->tag != SymTagData) return FALSE;
|
||||||
return FALSE;
|
switch (((const struct symt_data*)type)->kind)
|
||||||
X(VARIANT) = ((const struct symt_data*)type)->u.value;
|
{
|
||||||
|
case DataIsConstant: X(VARIANT) = ((const struct symt_data*)type)->u.value; break;
|
||||||
|
case DataIsLocal:
|
||||||
|
case DataIsParam:
|
||||||
|
{
|
||||||
|
struct location loc = ((const struct symt_data*)type)->u.var;
|
||||||
|
unsigned i;
|
||||||
|
struct module_format* modfmt;
|
||||||
|
|
||||||
|
if (loc.kind < loc_user) return FALSE;
|
||||||
|
for (i = 0; i < DFI_LAST; i++)
|
||||||
|
{
|
||||||
|
modfmt = module->format_info[i];
|
||||||
|
if (modfmt && modfmt->loc_compute)
|
||||||
|
{
|
||||||
|
modfmt->loc_compute(module->process, modfmt,
|
||||||
|
(const struct symt_function*)((const struct symt_data*)type)->container, &loc);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (loc.kind != loc_absolute) return FALSE;
|
||||||
|
X(VARIANT).n1.n2.vt = VT_UI4; /* FIXME */
|
||||||
|
X(VARIANT).n1.n2.n3.uiVal = loc.offset;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default: return FALSE;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TI_GET_CALLING_CONVENTION:
|
case TI_GET_CALLING_CONVENTION:
|
||||||
|
|
Loading…
Reference in New Issue