XS-libdwarf
view release on metacpan or search on metacpan
libdwarf-code-0.11.1/src/bin/dwarfdump/print_die.c view on Meta::CPAN
/* DW_OP_implicit_ptr */
globaloff = offset;
}
if ((required_offset == NON_ZERO_OFFSET_REQUIRED)
&& !globaloff) {
esb_append_printf_s(string_out,
"ERROR: %s DIE global offset 0, but 0 not allowed ",
op_name);
glflags.gf_count_major_errors++;
return;
}
if (!globaloff) {
return;
}
res = dwarf_offdie_b(dbg,globaloff,is_info,
&other_die,&err);
if (res != DW_DLV_OK) {
esb_append_printf_s(string_out,
"ERROR: %s Cannot access DIE via global offset ",
op_name);
esb_append_printf_u(string_out,
"0x%x ",globaloff);
if (res == DW_DLV_ERROR) {
esb_append(string_out, dwarf_errmsg(err));
esb_append(string_out, " ");
dwarf_dealloc_error(dbg,err);
err = 0;
} else {
esb_append(string_out, "DW_DLV_NO_ENTRY ");
}
if (!within_cu) {
esb_append(string_out,"DW_OP_implicit_ptr offset "
"might apply to another object file ");
}
glflags.gf_count_major_errors++;
return;
}
res = dwarf_tag(other_die,&tag,&err);
if (res != DW_DLV_OK) {
esb_append_printf_s(string_out,
"ERROR: %s Cannot access DIE tag ",
op_name);
esb_append_printf_u(string_out,
"0x%x ",globaloff);
if (res == DW_DLV_ERROR) {
esb_append(string_out, dwarf_errmsg(err));
esb_append(string_out, " ");
dwarf_dealloc_error(dbg,err);
err = 0;
} else {
esb_append(string_out, "DW_DLV_NO_ENTRY ");
}
glflags.gf_count_major_errors++;
dwarf_dealloc_die(other_die);
return;
}
if (required_tag) {
required_tag_name = get_TAG_name(required_tag,FALSE);
}
actual_tag_name = get_TAG_name(tag,FALSE);
if (required_tag && tag != required_tag) {
esb_append_printf_s(string_out,
"ERROR: %s incorrect target die tag ",
op_name);
esb_append_printf_s(string_out,
" Tag required: %s",required_tag_name);
esb_append_printf_s(string_out,
" Tag found: %s",actual_tag_name);
glflags.gf_count_major_errors++;
}
if (!glflags.dense && !glflags.gf_expr_ops_joined) {
char *diename = 0;
/* <0x000854ff GOFF=0x00546047> */
esb_append(string_out,"\n");
append_indent_prefix(string_out,indentprespaces,
die_indent_level,indentpostspaces+2);
esb_append(string_out," Target Die: ");
if (within_cu) {
esb_append_printf_u(string_out,
"<0x%" DW_PR_XZEROS DW_PR_DUx ,offset);
if (glflags.gf_show_global_offsets) {
esb_append_printf_u(string_out,
" GOFF=0x%" DW_PR_XZEROS DW_PR_DUx,
globaloff);
}
esb_append(string_out,"> ");
} else {
esb_append_printf_u(string_out,
"<GOFF=0x%" DW_PR_XZEROS DW_PR_DUx
"> ",globaloff);
}
esb_append(string_out,actual_tag_name);
res = dwarf_diename(other_die,&diename,&err);
if ( res == DW_DLV_OK) {
esb_append_printf_s(string_out,
" name: %s",diename);
} else if (res == DW_DLV_ERROR) {
esb_append_printf_s(string_out,
"ERROR: gets error reading "
"DW_AT_diename: %s ",
dwarf_errmsg(err));
dwarf_dealloc_error(dbg,err);
err = 0;
} else { /* Else no entry */ }
}
dwarf_dealloc_die(other_die);
}
/* The first non-zero sibling offset we can find
is what we want to return. The lowest sibling
offset in the stack. Or 0 if we have none known.
*/
static Dwarf_Off
get_die_stack_sibling(void)
{
int i = die_stack_indent_level;
for ( ; i >=0 ; --i)
{
Dwarf_Off v = die_stack[i].sibling_die_globaloffset_;
if (v) {
( run in 0.566 second using v1.01-cache-2.11-cpan-39bf76dae61 )