From 6bd22a2f5071da5c32ecb87d3d4e0f8dfe7bcb63 Mon Sep 17 00:00:00 2001 From: Eric Pouech Date: Sat, 11 Sep 2021 10:59:05 +0200 Subject: [PATCH] dbghelp/dwarf: Add support for FORM_loc_offset and FORM_sec_offset. Signed-off-by: Eric Pouech Signed-off-by: Alexandre Julliard --- dlls/dbghelp/dwarf.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c index a29bd53f929..a9a72ee6566 100644 --- a/dlls/dbghelp/dwarf.c +++ b/dlls/dbghelp/dwarf.c @@ -489,7 +489,6 @@ static void dwarf2_swallow_attribute(dwarf2_traverse_context_t* ctx, case DW_FORM_ref2: step = 2; break; case DW_FORM_data4: case DW_FORM_ref4: step = 4; break; - case DW_FORM_strp: step = head->offset_size; break; case DW_FORM_data8: case DW_FORM_ref8: step = 8; break; case DW_FORM_sdata: @@ -500,6 +499,8 @@ static void dwarf2_swallow_attribute(dwarf2_traverse_context_t* ctx, case DW_FORM_block1: step = dwarf2_parse_byte(ctx); break; case DW_FORM_block2: step = dwarf2_parse_u2(ctx); break; case DW_FORM_block4: step = dwarf2_parse_u4(ctx); break; + case DW_FORM_sec_offset: + case DW_FORM_strp: step = head->offset_size; break; default: FIXME("Unhandled attribute form %lx\n", abbrev_attr->form); return; @@ -625,6 +626,11 @@ static void dwarf2_fill_attr(const dwarf2_parse_context_t* ctx, TRACE("block<%p,%u>\n", attr->u.block.ptr, attr->u.block.size); break; + case DW_FORM_sec_offset: + attr->u.lluvalue = dwarf2_get_addr(data, ctx->head.offset_size); + TRACE("sec_offset<%s>\n", wine_dbgstr_longlong(attr->u.lluvalue)); + break; + default: FIXME("Unhandled attribute form %lx\n", abbrev_attr->form); break; @@ -935,11 +941,16 @@ static BOOL dwarf2_compute_location_attr(dwarf2_parse_context_t* ctx, loc->reg = 0; loc->offset = xloc.u.uvalue; return TRUE; - case DW_FORM_data4: case DW_FORM_data8: + case DW_FORM_data4: loc->kind = loc_dwarf2_location_list; loc->reg = Wine_DW_no_register; loc->offset = xloc.u.uvalue; return TRUE; + case DW_FORM_data8: case DW_FORM_sec_offset: + loc->kind = loc_dwarf2_location_list; + loc->reg = Wine_DW_no_register; + loc->offset = xloc.u.lluvalue; + return TRUE; case DW_FORM_block: case DW_FORM_block1: case DW_FORM_block2: @@ -1662,6 +1673,7 @@ static void dwarf2_parse_variable(dwarf2_subprogram_t* subpgm, break; case DW_FORM_data8: + case DW_FORM_sec_offset: v.n1.n2.vt = VT_UI8; v.n1.n2.n3.llVal = value.u.lluvalue; break;