From: Eric Pouech <epouech@codeweavers.com> Native dbghelp for a variable with thread storage: - fails on ADDRESS and OFFSET requests, - doesn't set the Address field in SYMBOL_INFO, - but succeeds on ADDRESSOFSET request. Let dbghelp and winedbg use the correct requests. Signed-off-by: Eric Pouech <epouech@codeweavers.com> --- dlls/dbghelp/symbol.c | 2 +- dlls/dbghelp/type.c | 35 ++++++++++++++++++++++++++++++++--- programs/winedbg/symbol.c | 7 ++++++- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c index 29a32ad7dcf..a3f323ebea6 100644 --- a/dlls/dbghelp/symbol.c +++ b/dlls/dbghelp/symbol.c @@ -789,7 +789,7 @@ static BOOL symt_fill_sym_info(struct module_pair* pair, { case loc_tlsrel: sym_info->Flags |= SYMFLAG_TLSREL; - /* fall through */ + break; case loc_absolute: symt_get_address(sym, &sym_info->Address); break; diff --git a/dlls/dbghelp/type.c b/dlls/dbghelp/type.c index a0529ec37fb..e347f02b8f9 100644 --- a/dlls/dbghelp/type.c +++ b/dlls/dbghelp/type.c @@ -141,9 +141,14 @@ BOOL symt_get_address(const struct symt* type, ULONG64* addr) case DataIsGlobal: case DataIsFileStatic: case DataIsStaticLocal: - *addr = ((const struct symt_data*)type)->u.var.offset; - break; - default: return FALSE; + if (((const struct symt_data*)type)->u.var.kind == loc_absolute) + { + *addr = ((const struct symt_data*)type)->u.var.offset; + break; + } + /* fall through */ + default: + return FALSE; } break; case SymTagBlock: @@ -1123,6 +1128,30 @@ BOOL symt_get_info(struct module* module, const struct symt* type, X(DWORD) = symt_ptr_to_index(module, type); break; + case TI_GET_ADDRESSOFFSET: + switch (type->tag) + { + case SymTagData: + switch (((const struct symt_data*)type)->kind) + { + case DataIsGlobal: + case DataIsFileStatic: + case DataIsStaticLocal: + if (((const struct symt_data*)type)->u.var.kind == loc_tlsrel) + { + X(DWORD) = ((const struct symt_data*)type)->u.var.offset; + break; + } + /* fall through */ + default: + return FALSE; + } + break; + default: + return FALSE; + } + break; + /* FIXME: we don't support properly C++ for now */ case TI_GET_VIRTUALBASECLASS: case TI_GET_VIRTUALTABLESHAPEID: diff --git a/programs/winedbg/symbol.c b/programs/winedbg/symbol.c index 96df020fba5..432b82f36a6 100644 --- a/programs/winedbg/symbol.c +++ b/programs/winedbg/symbol.c @@ -68,6 +68,8 @@ static BOOL fetch_tls_lvalue(const SYMBOL_INFO* sym, struct dbg_lvalue* lvalue) struct dbg_lvalue lv_teb_tls, lv_index_addr, lv_module_tls; dbg_lgint_t teb_tls_addr, index_addr, tls_module_addr; char* teb_tls_storage; + struct dbg_type sym_type; + DWORD tls_offset; if (!mod || !mod->tls_index_offset || !dbg_curr_thread) return FALSE; @@ -94,7 +96,10 @@ static BOOL fetch_tls_lvalue(const SYMBOL_INFO* sym, struct dbg_lvalue* lvalue) init_lvalue(&lv_module_tls, TRUE, (void*)(DWORD_PTR)(teb_tls_addr + tlsindex * ADDRSIZE)); if (!memory_fetch_integer(&lv_module_tls, ADDRSIZE, FALSE, &tls_module_addr)) return FALSE; - init_lvalue(lvalue, TRUE, (void*)(DWORD_PTR)(tls_module_addr + sym->Address)); + sym_type.module = sym->ModBase; + sym_type.id = sym->Index; + if (!types_get_info(&sym_type, TI_GET_ADDRESSOFFSET, &tls_offset)) return FALSE; + init_lvalue(lvalue, TRUE, (void*)(DWORD_PTR)(tls_module_addr + tls_offset)); return TRUE; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9957