From d3247b3f598ba97cad539a2d5e91c182f40e098d Mon Sep 17 00:00:00 2001 From: winesync Date: Fri, 11 Sep 2020 13:14:08 +0200 Subject: [PATCH] [WINESYNC] dbghelp: Recompute location after fixing it. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix a assertion raised by every exception with newer clang versions (>3.7) at least on ARM64: ../../../dlls/dbghelp/dwarf.c:1641: void dwarf2_parse_variable(dwarf2_subprogram_t *, struct symt_block *, dwarf2_debug_info_t *): Assertion `subpgm->func' failed. Signed-off-by: André Hentschel Signed-off-by: Alexandre Julliard wine commit id 3d482d3f9f0a3ffa69540af87594b3c1dc46e07b by André Hentschel --- dll/win32/dbghelp/dwarf.c | 37 +++++++++++++++++----------------- sdk/tools/winesync/dbghelp.cfg | 2 +- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/dll/win32/dbghelp/dwarf.c b/dll/win32/dbghelp/dwarf.c index 04438f74a95..14b4a8594c7 100644 --- a/dll/win32/dbghelp/dwarf.c +++ b/dll/win32/dbghelp/dwarf.c @@ -373,9 +373,9 @@ static unsigned long dwarf2_parse_addr(dwarf2_traverse_context_t* ctx) return ret; } -static const char* dwarf2_debug_traverse_ctx(const dwarf2_traverse_context_t* ctx) +static const char* dwarf2_debug_traverse_ctx(const dwarf2_traverse_context_t* ctx) { - return wine_dbg_sprintf("ctx(%p)", ctx->data); + return wine_dbg_sprintf("ctx(%p)", ctx->data); } static const char* dwarf2_debug_ctx(const dwarf2_parse_context_t* ctx) @@ -398,7 +398,7 @@ dwarf2_abbrev_table_find_entry(const struct sparse_array* abbrev_table, return sparse_array_find(abbrev_table, entry_code); } -static void dwarf2_parse_abbrev_set(dwarf2_traverse_context_t* abbrev_ctx, +static void dwarf2_parse_abbrev_set(dwarf2_traverse_context_t* abbrev_ctx, struct sparse_array* abbrev_table, struct pool* pool) { @@ -412,17 +412,17 @@ static void dwarf2_parse_abbrev_set(dwarf2_traverse_context_t* abbrev_ctx, assert( NULL != abbrev_ctx ); TRACE("%s, end at %p\n", - dwarf2_debug_traverse_ctx(abbrev_ctx), abbrev_ctx->end_data); + dwarf2_debug_traverse_ctx(abbrev_ctx), abbrev_ctx->end_data); sparse_array_init(abbrev_table, sizeof(dwarf2_abbrev_entry_t), 32); while (abbrev_ctx->data < abbrev_ctx->end_data) { - TRACE("now at %s\n", dwarf2_debug_traverse_ctx(abbrev_ctx)); + TRACE("now at %s\n", dwarf2_debug_traverse_ctx(abbrev_ctx)); entry_code = dwarf2_leb128_as_unsigned(abbrev_ctx); TRACE("found entry_code %lu\n", entry_code); if (!entry_code) { - TRACE("NULL entry code at %s\n", dwarf2_debug_traverse_ctx(abbrev_ctx)); + TRACE("NULL entry code at %s\n", dwarf2_debug_traverse_ctx(abbrev_ctx)); break; } abbrev_entry = sparse_array_add(abbrev_table, entry_code, pool); @@ -556,7 +556,7 @@ static void dwarf2_fill_attr(const dwarf2_parse_context_t* ctx, attr->u.uvalue = ctx->ref_offset + dwarf2_get_u4(data); TRACE("ref4<0x%lx>\n", attr->u.uvalue); break; - + case DW_FORM_ref8: FIXME("Unhandled 64-bit support\n"); break; @@ -585,7 +585,7 @@ static void dwarf2_fill_attr(const dwarf2_parse_context_t* ctx, } TRACE("strp<%s>\n", attr->u.string); break; - + case DW_FORM_block: attr->u.block.size = dwarf2_get_leb128_as_unsigned(data, &attr->u.block.ptr); break; @@ -953,6 +953,7 @@ static BOOL dwarf2_compute_location_attr(dwarf2_parse_context_t* ctx, #else loc->offset = (uintptr_t)ptr; #endif + compute_location(&lctx, loc, NULL, frame); } } return TRUE; @@ -1182,7 +1183,7 @@ static struct symt* dwarf2_parse_base_type(dwarf2_parse_context_t* ctx, int cache_idx = -1; if (di->symt) return di->symt; - TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di)); + TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di)); if (!dwarf2_find_attribute(ctx, di, DW_AT_name, &name)) name.u.string = NULL; @@ -1234,7 +1235,7 @@ static struct symt* dwarf2_parse_typedef(dwarf2_parse_context_t* ctx, if (di->symt) return di->symt; - TRACE("%s, for %lu\n", dwarf2_debug_ctx(ctx), di->abbrev->entry_code); + TRACE("%s, for %lu\n", dwarf2_debug_ctx(ctx), di->abbrev->entry_code); if (!dwarf2_find_attribute(ctx, di, DW_AT_name, &name)) name.u.string = NULL; ref_type = dwarf2_lookup_type(ctx, di); @@ -1253,7 +1254,7 @@ static struct symt* dwarf2_parse_pointer_type(dwarf2_parse_context_t* ctx, if (di->symt) return di->symt; - TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di)); + TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di)); if (!dwarf2_find_attribute(ctx, di, DW_AT_byte_size, &size)) size.u.uvalue = sizeof(void *); if (!(ref_type = dwarf2_lookup_type(ctx, di))) @@ -1443,7 +1444,7 @@ static void dwarf2_parse_udt_member(dwarf2_parse_context_t* ctx, bit_offset.u.uvalue = nbytes.u.uvalue * 8 - bit_offset.u.uvalue - bit_size.u.uvalue; } else bit_offset.u.uvalue = 0; - symt_add_udt_element(ctx->module, parent, name.u.string, elt_type, + symt_add_udt_element(ctx->module, parent, name.u.string, elt_type, (loc.offset << 3) + bit_offset.u.uvalue, bit_size.u.uvalue); @@ -1465,7 +1466,7 @@ static struct symt* dwarf2_parse_udt_type(dwarf2_parse_context_t* ctx, if (di->symt) return di->symt; - TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di)); + TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di)); /* quirk... FIXME provide real support for anonymous UDTs */ if (!dwarf2_find_attribute(ctx, di, DW_AT_name, &name)) @@ -1530,7 +1531,7 @@ static void dwarf2_parse_enumerator(dwarf2_parse_context_t* ctx, struct attribute name; struct attribute value; - TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di)); + TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di)); if (!dwarf2_find_attribute(ctx, di, DW_AT_name, &name)) return; if (!dwarf2_find_attribute(ctx, di, DW_AT_const_value, &value)) value.u.svalue = 0; @@ -1551,7 +1552,7 @@ static struct symt* dwarf2_parse_enumeration_type(dwarf2_parse_context_t* ctx, if (di->symt) return di->symt; - TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di)); + TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di)); if (!dwarf2_find_attribute(ctx, di, DW_AT_name, &name)) name.u.string = NULL; if (!dwarf2_find_attribute(ctx, di, DW_AT_byte_size, &size)) size.u.uvalue = 4; @@ -1612,7 +1613,7 @@ static void dwarf2_parse_variable(dwarf2_subprogram_t* subpgm, is_pmt = !block && di->abbrev->tag == DW_TAG_formal_parameter; param_type = dwarf2_lookup_type(subpgm->ctx, di); - + if (!dwarf2_find_attribute(subpgm->ctx, di, DW_AT_name, &name)) { /* cannot do much without the name, the functions below won't like it. */ return; @@ -1649,7 +1650,7 @@ static void dwarf2_parse_variable(dwarf2_subprogram_t* subpgm, * pmt/variable in a register */ assert(subpgm->func); - symt_add_func_local(subpgm->ctx->module, subpgm->func, + symt_add_func_local(subpgm->ctx->module, subpgm->func, is_pmt ? DataIsParam : DataIsLocal, &loc, block, param_type, name.u.string); break; @@ -2171,7 +2172,7 @@ static void dwarf2_load_one_entry(dwarf2_parse_context_t* ctx, break; default: FIXME("Unhandled Tag type 0x%lx at %s, for %lu\n", - di->abbrev->tag, dwarf2_debug_ctx(ctx), di->abbrev->entry_code); + di->abbrev->tag, dwarf2_debug_ctx(ctx), di->abbrev->entry_code); } } diff --git a/sdk/tools/winesync/dbghelp.cfg b/sdk/tools/winesync/dbghelp.cfg index 15ff3dbd075..ee2961be708 100644 --- a/sdk/tools/winesync/dbghelp.cfg +++ b/sdk/tools/winesync/dbghelp.cfg @@ -3,4 +3,4 @@ directories: files: include/dbghelp.h: sdk/include/psdk/dbghelp.h tags: - wine: 86864486be64a277f6edf8e66709cd0f17a4eed9 + wine: 3d482d3f9f0a3ffa69540af87594b3c1dc46e07b