[PATCH 05/11] dbghelp: introducing internal type (symt_module) to match SymTagExe
Eric Pouech
eric.pouech at gmail.com
Mon Aug 30 02:24:29 CDT 2021
Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
---
dlls/dbghelp/dbghelp_private.h | 9 +++++++++
dlls/dbghelp/module.c | 3 +++
dlls/dbghelp/symbol.c | 13 +++++++++++++
dlls/dbghelp/type.c | 9 +++++++++
4 files changed, 34 insertions(+)
diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h
index daf35fd655a..763d04a16a3 100644
--- a/dlls/dbghelp/dbghelp_private.h
+++ b/dlls/dbghelp/dbghelp_private.h
@@ -161,6 +161,12 @@ struct symt_block
struct vector vchildren; /* sub-blocks & local variables */
};
+struct symt_module /* in fact any of .exe, .dll... */
+{
+ struct symt symt; /* module */
+ struct module* module;
+};
+
struct symt_compiland
{
struct symt symt;
@@ -375,6 +381,7 @@ struct module
unsigned sorttab_size;
struct symt_ht** addr_sorttab;
struct hash_table ht_symbols;
+ struct symt_module* top;
/* types */
struct hash_table ht_types;
@@ -708,6 +715,8 @@ extern void copy_symbolW(SYMBOL_INFOW* siw, const SYMBOL_INFO* si) DECLS
extern void symbol_setname(SYMBOL_INFO* si, const char* name) DECLSPEC_HIDDEN;
extern struct symt_ht*
symt_find_nearest(struct module* module, DWORD_PTR addr) DECLSPEC_HIDDEN;
+extern struct symt_module*
+ symt_new_module(struct module* module) DECLSPEC_HIDDEN;
extern struct symt_compiland*
symt_new_compiland(struct module* module, ULONG_PTR address,
unsigned src_idx) DECLSPEC_HIDDEN;
diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c
index 247aadcef0e..b93cbceba79 100644
--- a/dlls/dbghelp/module.c
+++ b/dlls/dbghelp/module.c
@@ -233,6 +233,9 @@ struct module* module_new(struct process* pcs, const WCHAR* name,
module->sources = 0;
wine_rb_init(&module->sources_offsets_tree, source_rb_compare);
+ /* add top level symbol */
+ module->top = symt_new_module(module);
+
return module;
}
diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c
index 8189f6a175e..286dc17310c 100644
--- a/dlls/dbghelp/symbol.c
+++ b/dlls/dbghelp/symbol.c
@@ -183,6 +183,19 @@ static WCHAR* file_regex(const char* srcfile)
return mask;
}
+struct symt_module* symt_new_module(struct module* module)
+{
+ struct symt_module* sym;
+
+ TRACE_(dbghelp_symt)("Adding toplevel exe symbol %s\n", debugstr_w(module->module.ModuleName));
+ if ((sym = pool_alloc(&module->pool, sizeof(*sym))))
+ {
+ sym->symt.tag = SymTagExe;
+ sym->module = module;
+ }
+ return sym;
+}
+
struct symt_compiland* symt_new_compiland(struct module* module,
ULONG_PTR address, unsigned src_idx)
{
diff --git a/dlls/dbghelp/type.c b/dlls/dbghelp/type.c
index 7506d1ab574..10a2ff7a718 100644
--- a/dlls/dbghelp/type.c
+++ b/dlls/dbghelp/type.c
@@ -752,6 +752,15 @@ BOOL symt_get_info(struct module* module, const struct symt* type,
break;
case TI_GET_SYMNAME:
+ if (type->tag == SymTagExe)
+ {
+ DWORD len = (lstrlenW(module->modulename) + 1) * sizeof(WCHAR);
+ WCHAR* wname = HeapAlloc(GetProcessHeap(), 0, len);
+ if (!wname) return FALSE;
+ memcpy(wname, module->modulename, len);
+ X(WCHAR*) = wname;
+ }
+ else
{
const char* name = symt_get_name(type);
if (!name) return FALSE;
More information about the wine-devel
mailing list