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:
parent
517f614bc8
commit
61af17e6cf
|
@ -711,8 +711,7 @@ static BOOL dwarf2_fill_attr(const dwarf2_parse_context_t* ctx,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL dwarf2_find_attribute(const dwarf2_parse_context_t* ctx,
|
static BOOL dwarf2_find_attribute(const dwarf2_debug_info_t* di,
|
||||||
const dwarf2_debug_info_t* di,
|
|
||||||
unsigned at, struct attribute* attr)
|
unsigned at, struct attribute* attr)
|
||||||
{
|
{
|
||||||
unsigned i, refidx = 0;
|
unsigned i, refidx = 0;
|
||||||
|
@ -727,7 +726,7 @@ static BOOL dwarf2_find_attribute(const dwarf2_parse_context_t* ctx,
|
||||||
{
|
{
|
||||||
if (abbrev_attr->attribute == at)
|
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 ||
|
if ((abbrev_attr->attribute == DW_AT_abstract_origin ||
|
||||||
abbrev_attr->attribute == DW_AT_specification) &&
|
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 ? */
|
/* 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;
|
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");
|
FIXME("Should have found the debug info entry\n");
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -1004,7 +1003,7 @@ static BOOL dwarf2_compute_location_attr(dwarf2_parse_context_t* ctx,
|
||||||
{
|
{
|
||||||
struct attribute xloc;
|
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)
|
switch (xloc.form)
|
||||||
{
|
{
|
||||||
|
@ -1067,7 +1066,7 @@ static struct symt* dwarf2_lookup_type(const dwarf2_debug_info_t* di)
|
||||||
struct attribute attr;
|
struct attribute attr;
|
||||||
dwarf2_debug_info_t* type;
|
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++ */
|
/* this is only valid if current language of CU is C or C++ */
|
||||||
return di->unit_ctx->module_ctx->symt_cache[sc_void];
|
return di->unit_ctx->module_ctx->symt_cache[sc_void];
|
||||||
if (!(type = sparse_array_find(&di->unit_ctx->debug_info_table, attr.u.uvalue)))
|
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
|
/* if the di is a definition, but has also a (previous) declaration, then scope must
|
||||||
* be gotten from declaration not definition
|
* 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);
|
di = sparse_array_find(&ctx->debug_info_table, spec.u.uvalue);
|
||||||
if (!di)
|
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_class_type:
|
||||||
case DW_TAG_interface_type:
|
case DW_TAG_interface_type:
|
||||||
case DW_TAG_union_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);
|
size_t len = strlen(diname.u.string);
|
||||||
last -= 2 + len;
|
last -= 2 + len;
|
||||||
|
@ -1168,7 +1167,7 @@ static BOOL dwarf2_read_range(dwarf2_parse_context_t* ctx, const dwarf2_debug_in
|
||||||
{
|
{
|
||||||
struct attribute range;
|
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;
|
dwarf2_traverse_context_t traverse;
|
||||||
ULONG_PTR low, high;
|
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 low_pc;
|
||||||
struct attribute high_pc;
|
struct attribute high_pc;
|
||||||
|
|
||||||
if (!dwarf2_find_attribute(ctx, di, DW_AT_low_pc, &low_pc) ||
|
if (!dwarf2_find_attribute(di, DW_AT_low_pc, &low_pc) ||
|
||||||
!dwarf2_find_attribute(ctx, di, DW_AT_high_pc, &high_pc))
|
!dwarf2_find_attribute(di, DW_AT_high_pc, &high_pc))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
*plow = low_pc.u.uvalue;
|
*plow = low_pc.u.uvalue;
|
||||||
*phigh = high_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;
|
*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)
|
traverse->data != ctx->module_ctx->sections[ctx->section].address + sibling.u.uvalue)
|
||||||
{
|
{
|
||||||
if (sibling.u.uvalue >= ctx->module_ctx->sections[ctx->section].size)
|
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)
|
if (di->abbrev->have_child)
|
||||||
return &di->children;
|
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)))
|
if (!(di = sparse_array_find(&di->unit_ctx->debug_info_table, spec.u.uvalue)))
|
||||||
FIXME("Should have found the debug info entry\n");
|
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));
|
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;
|
name.u.string = NULL;
|
||||||
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;
|
||||||
if (!dwarf2_find_attribute(ctx, di, DW_AT_encoding, &encoding)) encoding.u.uvalue = DW_ATE_void;
|
if (!dwarf2_find_attribute(di, DW_AT_encoding, &encoding)) encoding.u.uvalue = DW_ATE_void;
|
||||||
|
|
||||||
switch (encoding.u.uvalue)
|
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);
|
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);
|
ref_type = dwarf2_lookup_type(di);
|
||||||
|
|
||||||
if (name.u.string)
|
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));
|
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);
|
ref_type = dwarf2_lookup_type(di);
|
||||||
di->symt = &symt_new_pointer(ctx->module_ctx->module, ref_type, size.u.uvalue)->symt;
|
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");
|
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:
|
case DW_TAG_subrange_type:
|
||||||
idx_type = dwarf2_lookup_type(child);
|
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;
|
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;
|
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;
|
cnt.u.uvalue = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1465,7 +1464,7 @@ static struct symt* dwarf2_parse_unspecified_type(dwarf2_parse_context_t* ctx,
|
||||||
|
|
||||||
if (di->symt) return di->symt;
|
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";
|
name.u.string = "void";
|
||||||
size.u.uvalue = sizeof(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));
|
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);
|
elt_type = dwarf2_lookup_type(di);
|
||||||
if (dwarf2_compute_location_attr(ctx, di, DW_AT_data_member_location, &loc, NULL))
|
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
|
else
|
||||||
loc.offset = 0;
|
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;
|
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
|
/* FIXME: we should only do this when implementation is LSB (which is
|
||||||
* the case on i386 processors)
|
* the case on i386 processors)
|
||||||
*/
|
*/
|
||||||
struct attribute nbytes;
|
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;
|
DWORD64 size;
|
||||||
nbytes.u.uvalue = symt_get_info(ctx->module_ctx->module, elt_type, TI_GET_LENGTH, &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));
|
TRACE("%s, for %s\n", dwarf2_debug_ctx(ctx), dwarf2_debug_di(di));
|
||||||
|
|
||||||
/* quirk... FIXME provide real support for anonymous UDTs */
|
/* 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";
|
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),
|
di->symt = &symt_new_udt(ctx->module_ctx->module, dwarf2_get_cpp_name(ctx, di, name.u.string),
|
||||||
size.u.uvalue, udt)->symt;
|
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));
|
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(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_const_value, &value)) value.u.svalue = 0;
|
||||||
symt_add_enum_element(ctx->module_ctx->module, parent, name.u.string, value.u.svalue);
|
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");
|
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));
|
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;
|
||||||
if (!dwarf2_find_attribute(ctx, di, DW_AT_byte_size, &size)) size.u.uvalue = 4;
|
if (!dwarf2_find_attribute(di, DW_AT_byte_size, &size)) size.u.uvalue = 4;
|
||||||
|
|
||||||
switch (size.u.uvalue) /* FIXME: that's wrong */
|
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;
|
is_pmt = !block && di->abbrev->tag == DW_TAG_formal_parameter;
|
||||||
param_type = dwarf2_lookup_type(di);
|
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. */
|
/* cannot do much without the name, the functions below won't like it. */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1732,7 +1731,7 @@ static void dwarf2_parse_variable(dwarf2_subprogram_t* subpgm,
|
||||||
case loc_absolute:
|
case loc_absolute:
|
||||||
/* it's a global variable */
|
/* it's a global variable */
|
||||||
/* FIXME: we don't handle its scope yet */
|
/* 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;
|
ext.u.uvalue = 0;
|
||||||
loc.offset += subpgm->ctx->module_ctx->load_offset;
|
loc.offset += subpgm->ctx->module_ctx->load_offset;
|
||||||
symt_new_global_variable(subpgm->ctx->module_ctx->module, subpgm->ctx->compiland,
|
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;
|
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;
|
VARIANT v;
|
||||||
if (subpgm->func) WARN("Unsupported constant %s in function\n", debugstr_a(name.u.string));
|
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));
|
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(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_name, &name))
|
||||||
name.u.string = NULL;
|
name.u.string = NULL;
|
||||||
|
|
||||||
loc.kind = loc_absolute;
|
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));
|
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");
|
WARN("No name for function... dropping function\n");
|
||||||
return NULL;
|
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
|
/* if it's an abstract representation of an inline function, there should be
|
||||||
* a concrete object that we'll handle
|
* 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)
|
inline_flags.u.uvalue != DW_INL_not_inlined)
|
||||||
{
|
{
|
||||||
TRACE("Function %s declared as inlined (%ld)... skipping\n",
|
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;
|
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)
|
is_decl.u.uvalue && is_decl.gotten_from == attr_direct)
|
||||||
{
|
{
|
||||||
/* it's a real declaration, skip it */
|
/* 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 stmt_list, low_pc;
|
||||||
struct attribute comp_dir;
|
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;
|
name.u.string = NULL;
|
||||||
|
|
||||||
/* get working directory of current compilation unit */
|
/* 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;
|
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;
|
low_pc.u.uvalue = 0;
|
||||||
ctx->compiland = symt_new_compiland(ctx->module_ctx->module, ctx->module_ctx->load_offset + low_pc.u.uvalue,
|
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));
|
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);
|
child = *(dwarf2_debug_info_t**)vector_at(children, i);
|
||||||
dwarf2_load_one_entry(ctx, child);
|
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))
|
if (dwarf2_parse_line_numbers(ctx, comp_dir.u.string, stmt_list.u.uvalue))
|
||||||
ctx->module_ctx->module->module.LineNumbers = TRUE;
|
ctx->module_ctx->module->module.LineNumbers = TRUE;
|
||||||
|
|
Loading…
Reference in New Issue