Module: wine Branch: master Commit: a523361b109bf99353c3d0d462a27407bd6e2f3e URL: https://gitlab.winehq.org/wine/wine/-/commit/a523361b109bf99353c3d0d462a2740...
Author: Eric Pouech eric.pouech@gmail.com Date: Wed Sep 28 12:13:55 2022 +0200
dbghelp: Add support for static variables at function scope (PDB).
These should be stored in function's children vector.
Signed-off-by: Eric Pouech eric.pouech@gmail.com
---
dlls/dbghelp/msc.c | 33 +++++++++++++++++++++------------ dlls/dbghelp/symbol.c | 4 +++- 2 files changed, 24 insertions(+), 13 deletions(-)
diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c index 8714e756462..c1cfc4f4ca1 100644 --- a/dlls/dbghelp/msc.c +++ b/dlls/dbghelp/msc.c @@ -1764,6 +1764,8 @@ static const union codeview_symbol* get_next_sym(const union codeview_symbol* sy
static inline void codeview_add_variable(const struct msc_debug_info* msc_dbg, struct symt_compiland* compiland, + struct symt_function* func, + struct symt_block* block, const char* name, unsigned segment, unsigned offset, unsigned symtype, BOOL is_local, BOOL in_tls, BOOL force) @@ -1775,6 +1777,13 @@ static inline void codeview_add_variable(const struct msc_debug_info* msc_dbg, loc.kind = in_tls ? loc_tlsrel : loc_absolute; loc.reg = 0; loc.offset = in_tls ? offset : codeview_get_address(msc_dbg, segment, offset); + if (func) + { + if (!is_local || in_tls) WARN("Unsupported construct\n"); + symt_add_func_local(msc_dbg->module, func, DataIsStaticLocal, &loc, block, + codeview_get_type(symtype, FALSE), name); + return; + } if (force || in_tls || !symt_find_symbol_at(msc_dbg->module, loc.offset)) { symt_new_global_variable(msc_dbg->module, compiland, @@ -2232,21 +2241,21 @@ static BOOL codeview_snarf(const struct msc_debug_info* msc_dbg, case S_GDATA32_16t: case S_LDATA32_16t: if (do_globals) - codeview_add_variable(msc_dbg, compiland, terminate_string(&sym->data_v1.p_name), + codeview_add_variable(msc_dbg, compiland, curr_func, block, terminate_string(&sym->data_v1.p_name), sym->data_v1.segment, sym->data_v1.offset, sym->data_v1.symtype, sym->generic.id == S_LDATA32_16t, FALSE, TRUE); break; case S_GDATA32_ST: case S_LDATA32_ST: if (do_globals) - codeview_add_variable(msc_dbg, compiland, terminate_string(&sym->data_v2.p_name), + codeview_add_variable(msc_dbg, compiland, curr_func, block, terminate_string(&sym->data_v2.p_name), sym->data_v2.segment, sym->data_v2.offset, sym->data_v2.symtype, sym->generic.id == S_LDATA32_ST, FALSE, TRUE); break; case S_GDATA32: case S_LDATA32: if (do_globals) - codeview_add_variable(msc_dbg, compiland, sym->data_v3.name, + codeview_add_variable(msc_dbg, compiland, curr_func, block, sym->data_v3.name, sym->data_v3.segment, sym->data_v3.offset, sym->data_v3.symtype, sym->generic.id == S_LDATA32, FALSE, TRUE); break; @@ -2255,21 +2264,21 @@ static BOOL codeview_snarf(const struct msc_debug_info* msc_dbg, case S_GTHREAD32_16t: case S_LTHREAD32_16t: if (do_globals) - codeview_add_variable(msc_dbg, compiland, terminate_string(&sym->thread_v1.p_name), + codeview_add_variable(msc_dbg, compiland, curr_func, block, terminate_string(&sym->thread_v1.p_name), sym->thread_v1.segment, sym->thread_v1.offset, sym->thread_v1.symtype, sym->generic.id == S_LTHREAD32_16t, TRUE, TRUE); break; case S_GTHREAD32_ST: case S_LTHREAD32_ST: if (do_globals) - codeview_add_variable(msc_dbg, compiland, terminate_string(&sym->thread_v2.p_name), + codeview_add_variable(msc_dbg, compiland, curr_func, block, terminate_string(&sym->thread_v2.p_name), sym->thread_v2.segment, sym->thread_v2.offset, sym->thread_v2.symtype, sym->generic.id == S_LTHREAD32_ST, TRUE, TRUE); break; case S_GTHREAD32: case S_LTHREAD32: if (do_globals) - codeview_add_variable(msc_dbg, compiland, sym->thread_v3.name, + codeview_add_variable(msc_dbg, compiland, curr_func, block, sym->thread_v3.name, sym->thread_v3.segment, sym->thread_v3.offset, sym->thread_v3.symtype, sym->generic.id == S_LTHREAD32, TRUE, TRUE); break; @@ -2881,19 +2890,19 @@ static BOOL codeview_snarf_public(const struct msc_debug_info* msc_dbg, const BY */ case S_GDATA32_16t: case S_LDATA32_16t: - codeview_add_variable(msc_dbg, compiland, terminate_string(&sym->data_v1.p_name), + codeview_add_variable(msc_dbg, compiland, NULL, NULL, terminate_string(&sym->data_v1.p_name), sym->data_v1.segment, sym->data_v1.offset, sym->data_v1.symtype, sym->generic.id == S_LDATA32_16t, FALSE, FALSE); break; case S_GDATA32_ST: case S_LDATA32_ST: - codeview_add_variable(msc_dbg, compiland, terminate_string(&sym->data_v2.p_name), + codeview_add_variable(msc_dbg, compiland, NULL, NULL, terminate_string(&sym->data_v2.p_name), sym->data_v2.segment, sym->data_v2.offset, sym->data_v2.symtype, sym->generic.id == S_LDATA32_ST, FALSE, FALSE); break; case S_GDATA32: case S_LDATA32: - codeview_add_variable(msc_dbg, compiland, sym->data_v3.name, + codeview_add_variable(msc_dbg, compiland, NULL, NULL, sym->data_v3.name, sym->data_v3.segment, sym->data_v3.offset, sym->data_v3.symtype, sym->generic.id == S_LDATA32, FALSE, FALSE); break; @@ -2901,19 +2910,19 @@ static BOOL codeview_snarf_public(const struct msc_debug_info* msc_dbg, const BY /* variables with thread storage */ case S_GTHREAD32_16t: case S_LTHREAD32_16t: - codeview_add_variable(msc_dbg, compiland, terminate_string(&sym->thread_v1.p_name), + codeview_add_variable(msc_dbg, compiland, NULL, NULL, terminate_string(&sym->thread_v1.p_name), sym->thread_v1.segment, sym->thread_v1.offset, sym->thread_v1.symtype, sym->generic.id == S_LTHREAD32_16t, TRUE, FALSE); break; case S_GTHREAD32_ST: case S_LTHREAD32_ST: - codeview_add_variable(msc_dbg, compiland, terminate_string(&sym->thread_v2.p_name), + codeview_add_variable(msc_dbg, compiland, NULL, NULL, terminate_string(&sym->thread_v2.p_name), sym->thread_v2.segment, sym->thread_v2.offset, sym->thread_v2.symtype, sym->generic.id == S_LTHREAD32_ST, TRUE, FALSE); break; case S_GTHREAD32: case S_LTHREAD32: - codeview_add_variable(msc_dbg, compiland, sym->thread_v3.name, + codeview_add_variable(msc_dbg, compiland, NULL, NULL, sym->thread_v3.name, sym->thread_v3.segment, sym->thread_v3.offset, sym->thread_v3.symtype, sym->generic.id == S_LTHREAD32, TRUE, FALSE); break; diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c index 7b0324f5013..4a5a971082e 100644 --- a/dlls/dbghelp/symbol.c +++ b/dlls/dbghelp/symbol.c @@ -449,6 +449,7 @@ void symt_add_func_line(struct module* module, struct symt_function* func, * * Adds a new local/parameter to a given function: * In any cases, dt tells whether it's a local variable or a parameter + * or a static variable inside the function. * If regno it's not 0: * - then variable is stored in a register * - otherwise, value is referenced by register + offset @@ -470,7 +471,7 @@ struct symt_data* symt_add_func_local(struct module* module, name, type);
assert(symt_check_tag(&func->symt, SymTagFunction) || symt_check_tag(&func->symt, SymTagInlineSite)); - assert(dt == DataIsParam || dt == DataIsLocal); + assert(dt == DataIsParam || dt == DataIsLocal || dt == DataIsStaticLocal);
locsym = pool_alloc(&module->pool, sizeof(*locsym)); locsym->symt.tag = SymTagData; @@ -804,6 +805,7 @@ static void symt_fill_sym_info(struct module_pair* pair, break; case DataIsGlobal: case DataIsFileStatic: + case DataIsStaticLocal: switch (data->u.var.kind) { case loc_tlsrel: