dbghelp/dwarf: No longer pass a parse context to dwarf2_find_attribute.

Use debug_info's unit context instead.

Signed-off-by: Eric Pouech <eric.pouech@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Eric Pouech 2021-09-16 11:10:16 +02:00 committed by Alexandre Julliard
parent 517f614bc8
commit 61af17e6cf
1 changed files with 44 additions and 45 deletions

View File

@ -711,8 +711,7 @@ static BOOL dwarf2_fill_attr(const dwarf2_parse_context_t* ctx,
return TRUE;
}
static BOOL dwarf2_find_attribute(const dwarf2_parse_context_t* ctx,
const dwarf2_debug_info_t* di,
static BOOL dwarf2_find_attribute(const dwarf2_debug_info_t* di,
unsigned at, struct attribute* attr)
{
unsigned i, refidx = 0;
@ -727,7 +726,7 @@ static BOOL dwarf2_find_attribute(const dwarf2_parse_context_t* ctx,
{
if (abbrev_attr->attribute == at)
{
return dwarf2_fill_attr(ctx, abbrev_attr, di->data[i], attr);
return dwarf2_fill_attr(di->unit_ctx, abbrev_attr, di->data[i], attr);
}
if ((abbrev_attr->attribute == DW_AT_abstract_origin ||
abbrev_attr->attribute == DW_AT_specification) &&
@ -742,9 +741,9 @@ static BOOL dwarf2_find_attribute(const dwarf2_parse_context_t* ctx,
}
}
/* do we have either an abstract origin or a specification debug entry to look into ? */
if (!ref_abbrev_attr || !dwarf2_fill_attr(ctx, ref_abbrev_attr, di->data[refidx], attr))
if (!ref_abbrev_attr || !dwarf2_fill_attr(di->unit_ctx, ref_abbrev_attr, di->data[refidx], attr))
break;
if (!(di = sparse_array_find(&ctx->debug_info_table, attr->u.uvalue)))
if (!(di = sparse_array_find(&di->unit_ctx->debug_info_table, attr->u.uvalue)))
FIXME("Should have found the debug info entry\n");
}
return FALSE;
@ -1004,7 +1003,7 @@ static BOOL dwarf2_compute_location_attr(dwarf2_parse_context_t* ctx,
{
struct attribute xloc;
if (!dwarf2_find_attribute(ctx, di, dw, &xloc)) return FALSE;
if (!dwarf2_find_attribute(di, dw, &xloc)) return FALSE;
switch (xloc.form)
{
@ -1067,7 +1066,7 @@ static struct symt* dwarf2_lookup_type(const dwarf2_debug_info_t* di)
struct attribute attr;
dwarf2_debug_info_t* type;
if (!dwarf2_find_attribute(di->unit_ctx, di, DW_AT_type, &attr))
if (!dwarf2_find_attribute(di, DW_AT_type, &attr))
/* this is only valid if current language of CU is C or C++ */
return di->unit_ctx->module_ctx->symt_cache[sc_void];
if (!(type = sparse_array_find(&di->unit_ctx->debug_info_table, attr.u.uvalue)))
@ -1121,7 +1120,7 @@ static const char* dwarf2_get_cpp_name(dwarf2_parse_context_t* ctx, dwarf2_debug
/* if the di is a definition, but has also a (previous) declaration, then scope must
* be gotten from declaration not definition
*/
if (dwarf2_find_attribute(ctx, di, DW_AT_specification, &spec) && spec.gotten_from == attr_direct)
if (dwarf2_find_attribute(di, DW_AT_specification, &spec) && spec.gotten_from == attr_direct)
{
di = sparse_array_find(&ctx->debug_info_table, spec.u.uvalue);
if (!di)
@ -1140,7 +1139,7 @@ static const char* dwarf2_get_cpp_name(dwarf2_parse_context_t* ctx, dwarf2_debug
case DW_TAG_class_type:
case DW_TAG_interface_type:
case DW_TAG_union_type:
if (dwarf2_find_attribute(ctx, di, DW_AT_name, &diname))
if (dwarf2_find_attribute(di, DW_AT_name, &diname))
{
size_t len = strlen(diname.u.string);
last -= 2 + len;
@ -1168,7 +1167,7 @@ static BOOL dwarf2_read_range(dwarf2_parse_context_t* ctx, const dwarf2_debug_in
{
struct attribute range;
if (dwarf2_find_attribute(ctx, di, DW_AT_ranges, &range))
if (dwarf2_find_attribute(di, DW_AT_ranges, &range))
{
dwarf2_traverse_context_t traverse;
ULONG_PTR low, high;
@ -1198,8 +1197,8 @@ static BOOL dwarf2_read_range(dwarf2_parse_context_t* ctx, const dwarf2_debug_in
struct attribute low_pc;
struct attribute high_pc;
if (!dwarf2_find_attribute(ctx, di, DW_AT_low_pc, &low_pc) ||
!dwarf2_find_attribute(ctx, di, DW_AT_high_pc, &high_pc))
if (!dwarf2_find_attribute(di, DW_AT_low_pc, &low_pc) ||
!dwarf2_find_attribute(di, DW_AT_high_pc, &high_pc))
return FALSE;
*plow = low_pc.u.uvalue;
*phigh = high_pc.u.uvalue;
@ -1270,7 +1269,7 @@ static BOOL dwarf2_read_one_debug_info(dwarf2_parse_context_t* ctx,
*where = child;
}
}
if (dwarf2_find_attribute(ctx, di, DW_AT_sibling, &sibling) &&
if (dwarf2_find_attribute(di, DW_AT_sibling, &sibling) &&
traverse->data != ctx->module_ctx->sections[ctx->section].address + sibling.u.uvalue)
{
if (sibling.u.uvalue >= ctx->module_ctx->sections[ctx->section].size)
@ -1295,7 +1294,7 @@ static struct vector* dwarf2_get_di_children(dwarf2_debug_info_t* di)
{
if (di->abbrev->have_child)
return &di->children;
if (!dwarf2_find_attribute(di->unit_ctx, di, DW_AT_specification, &spec)) break;
if (!dwarf2_find_attribute(di, DW_AT_specification, &spec)) break;
if (!(di = sparse_array_find(&di->unit_ctx->debug_info_table, spec.u.uvalue)))
FIXME("Should have found the debug info entry\n");
}
@ -1313,10 +1312,10 @@ static struct symt* dwarf2_parse_base_type(dwarf2_parse_context_t* ctx,
TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di));
if (!dwarf2_find_attribute(ctx, di, DW_AT_name, &name))
if (!dwarf2_find_attribute(di, DW_AT_name, &name))
name.u.string = NULL;
if (!dwarf2_find_attribute(ctx, di, DW_AT_byte_size, &size)) size.u.uvalue = 0;
if (!dwarf2_find_attribute(ctx, di, DW_AT_encoding, &encoding)) encoding.u.uvalue = DW_ATE_void;
if (!dwarf2_find_attribute(di, DW_AT_byte_size, &size)) size.u.uvalue = 0;
if (!dwarf2_find_attribute(di, DW_AT_encoding, &encoding)) encoding.u.uvalue = DW_ATE_void;
switch (encoding.u.uvalue)
{
@ -1347,7 +1346,7 @@ static struct symt* dwarf2_parse_typedef(dwarf2_parse_context_t* ctx,
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;
if (!dwarf2_find_attribute(di, DW_AT_name, &name)) name.u.string = NULL;
ref_type = dwarf2_lookup_type(di);
if (name.u.string)
@ -1366,7 +1365,7 @@ static struct symt* dwarf2_parse_pointer_type(dwarf2_parse_context_t* ctx,
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 (!dwarf2_find_attribute(di, DW_AT_byte_size, &size)) size.u.uvalue = sizeof(void *);
ref_type = dwarf2_lookup_type(di);
di->symt = &symt_new_pointer(ctx->module_ctx->module, ref_type, size.u.uvalue)->symt;
if (dwarf2_get_di_children(di)) FIXME("Unsupported children\n");
@ -1405,11 +1404,11 @@ static struct symt* dwarf2_parse_array_type(dwarf2_parse_context_t* ctx,
{
case DW_TAG_subrange_type:
idx_type = dwarf2_lookup_type(child);
if (!dwarf2_find_attribute(ctx, child, DW_AT_lower_bound, &min))
if (!dwarf2_find_attribute(child, DW_AT_lower_bound, &min))
min.u.uvalue = 0;
if (dwarf2_find_attribute(ctx, child, DW_AT_upper_bound, &max))
if (dwarf2_find_attribute(child, DW_AT_upper_bound, &max))
cnt.u.uvalue = max.u.uvalue + 1 - min.u.uvalue;
else if (!dwarf2_find_attribute(ctx, child, DW_AT_count, &cnt))
else if (!dwarf2_find_attribute(child, DW_AT_count, &cnt))
cnt.u.uvalue = 0;
break;
default:
@ -1465,7 +1464,7 @@ static struct symt* dwarf2_parse_unspecified_type(dwarf2_parse_context_t* ctx,
if (di->symt) return di->symt;
if (!dwarf2_find_attribute(ctx, di, DW_AT_name, &name))
if (!dwarf2_find_attribute(di, DW_AT_name, &name))
name.u.string = "void";
size.u.uvalue = sizeof(void *);
@ -1508,7 +1507,7 @@ static void dwarf2_parse_udt_member(dwarf2_parse_context_t* ctx,
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(di, DW_AT_name, &name)) name.u.string = NULL;
elt_type = dwarf2_lookup_type(di);
if (dwarf2_compute_location_attr(ctx, di, DW_AT_data_member_location, &loc, NULL))
{
@ -1523,15 +1522,15 @@ static void dwarf2_parse_udt_member(dwarf2_parse_context_t* ctx,
}
else
loc.offset = 0;
if (!dwarf2_find_attribute(ctx, di, DW_AT_bit_size, &bit_size))
if (!dwarf2_find_attribute(di, DW_AT_bit_size, &bit_size))
bit_size.u.uvalue = 0;
if (dwarf2_find_attribute(ctx, di, DW_AT_bit_offset, &bit_offset))
if (dwarf2_find_attribute(di, DW_AT_bit_offset, &bit_offset))
{
/* FIXME: we should only do this when implementation is LSB (which is
* the case on i386 processors)
*/
struct attribute nbytes;
if (!dwarf2_find_attribute(ctx, di, DW_AT_byte_size, &nbytes))
if (!dwarf2_find_attribute(di, DW_AT_byte_size, &nbytes))
{
DWORD64 size;
nbytes.u.uvalue = symt_get_info(ctx->module_ctx->module, elt_type, TI_GET_LENGTH, &size) ?
@ -1565,9 +1564,9 @@ static struct symt* dwarf2_parse_udt_type(dwarf2_parse_context_t* ctx,
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))
if (!dwarf2_find_attribute(di, DW_AT_name, &name))
name.u.string = "zz_anon_zz";
if (!dwarf2_find_attribute(ctx, di, DW_AT_byte_size, &size)) size.u.uvalue = 0;
if (!dwarf2_find_attribute(di, DW_AT_byte_size, &size)) size.u.uvalue = 0;
di->symt = &symt_new_udt(ctx->module_ctx->module, dwarf2_get_cpp_name(ctx, di, name.u.string),
size.u.uvalue, udt)->symt;
@ -1630,8 +1629,8 @@ static void dwarf2_parse_enumerator(dwarf2_parse_context_t* ctx,
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;
if (!dwarf2_find_attribute(di, DW_AT_name, &name)) return;
if (!dwarf2_find_attribute(di, DW_AT_const_value, &value)) value.u.svalue = 0;
symt_add_enum_element(ctx->module_ctx->module, parent, name.u.string, value.u.svalue);
if (dwarf2_get_di_children(di)) FIXME("Unsupported children\n");
@ -1651,8 +1650,8 @@ static struct symt* dwarf2_parse_enumeration_type(dwarf2_parse_context_t* ctx,
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;
if (!dwarf2_find_attribute(di, DW_AT_name, &name)) name.u.string = NULL;
if (!dwarf2_find_attribute(di, DW_AT_byte_size, &size)) size.u.uvalue = 4;
switch (size.u.uvalue) /* FIXME: that's wrong */
{
@ -1712,7 +1711,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(di);
if (!dwarf2_find_attribute(subpgm->ctx, di, DW_AT_name, &name)) {
if (!dwarf2_find_attribute(di, DW_AT_name, &name)) {
/* cannot do much without the name, the functions below won't like it. */
return;
}
@ -1732,7 +1731,7 @@ static void dwarf2_parse_variable(dwarf2_subprogram_t* subpgm,
case loc_absolute:
/* it's a global variable */
/* FIXME: we don't handle its scope yet */
if (!dwarf2_find_attribute(subpgm->ctx, di, DW_AT_external, &ext))
if (!dwarf2_find_attribute(di, DW_AT_external, &ext))
ext.u.uvalue = 0;
loc.offset += subpgm->ctx->module_ctx->load_offset;
symt_new_global_variable(subpgm->ctx->module_ctx->module, subpgm->ctx->compiland,
@ -1754,7 +1753,7 @@ static void dwarf2_parse_variable(dwarf2_subprogram_t* subpgm,
break;
}
}
else if (dwarf2_find_attribute(subpgm->ctx, di, DW_AT_const_value, &value))
else if (dwarf2_find_attribute(di, DW_AT_const_value, &value))
{
VARIANT v;
if (subpgm->func) WARN("Unsupported constant %s in function\n", debugstr_a(name.u.string));
@ -1849,8 +1848,8 @@ static void dwarf2_parse_subprogram_label(dwarf2_subprogram_t* subpgm,
TRACE("%s, for %s\n", dwarf2_debug_ctx(subpgm->ctx), dwarf2_debug_di(di));
if (!dwarf2_find_attribute(subpgm->ctx, di, DW_AT_low_pc, &low_pc)) low_pc.u.uvalue = 0;
if (!dwarf2_find_attribute(subpgm->ctx, di, DW_AT_name, &name))
if (!dwarf2_find_attribute(di, DW_AT_low_pc, &low_pc)) low_pc.u.uvalue = 0;
if (!dwarf2_find_attribute(di, DW_AT_name, &name))
name.u.string = NULL;
loc.kind = loc_absolute;
@ -2020,7 +2019,7 @@ static struct symt* dwarf2_parse_subprogram(dwarf2_parse_context_t* ctx,
TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di));
if (!dwarf2_find_attribute(ctx, di, DW_AT_name, &name))
if (!dwarf2_find_attribute(di, DW_AT_name, &name))
{
WARN("No name for function... dropping function\n");
return NULL;
@ -2028,7 +2027,7 @@ static struct symt* dwarf2_parse_subprogram(dwarf2_parse_context_t* ctx,
/* if it's an abstract representation of an inline function, there should be
* a concrete object that we'll handle
*/
if (dwarf2_find_attribute(ctx, di, DW_AT_inline, &inline_flags) &&
if (dwarf2_find_attribute(di, DW_AT_inline, &inline_flags) &&
inline_flags.u.uvalue != DW_INL_not_inlined)
{
TRACE("Function %s declared as inlined (%ld)... skipping\n",
@ -2036,7 +2035,7 @@ static struct symt* dwarf2_parse_subprogram(dwarf2_parse_context_t* ctx,
return NULL;
}
if (dwarf2_find_attribute(ctx, di, DW_AT_declaration, &is_decl) &&
if (dwarf2_find_attribute(di, DW_AT_declaration, &is_decl) &&
is_decl.u.uvalue && is_decl.gotten_from == attr_direct)
{
/* it's a real declaration, skip it */
@ -2609,14 +2608,14 @@ static BOOL dwarf2_parse_compilation_unit(dwarf2_parse_context_t* ctx)
struct attribute stmt_list, low_pc;
struct attribute comp_dir;
if (!dwarf2_find_attribute(ctx, di, DW_AT_name, &name))
if (!dwarf2_find_attribute(di, DW_AT_name, &name))
name.u.string = NULL;
/* get working directory of current compilation unit */
if (!dwarf2_find_attribute(ctx, di, DW_AT_comp_dir, &comp_dir))
if (!dwarf2_find_attribute(di, DW_AT_comp_dir, &comp_dir))
comp_dir.u.string = NULL;
if (!dwarf2_find_attribute(ctx, di, DW_AT_low_pc, &low_pc))
if (!dwarf2_find_attribute(di, DW_AT_low_pc, &low_pc))
low_pc.u.uvalue = 0;
ctx->compiland = symt_new_compiland(ctx->module_ctx->module, ctx->module_ctx->load_offset + low_pc.u.uvalue,
source_new(ctx->module_ctx->module, comp_dir.u.string, name.u.string));
@ -2628,7 +2627,7 @@ static BOOL dwarf2_parse_compilation_unit(dwarf2_parse_context_t* ctx)
child = *(dwarf2_debug_info_t**)vector_at(children, i);
dwarf2_load_one_entry(ctx, child);
}
if (dwarf2_find_attribute(ctx, di, DW_AT_stmt_list, &stmt_list))
if (dwarf2_find_attribute(di, DW_AT_stmt_list, &stmt_list))
{
if (dwarf2_parse_line_numbers(ctx, comp_dir.u.string, stmt_list.u.uvalue))
ctx->module_ctx->module->module.LineNumbers = TRUE;