From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jason Merrill To: nickc@cygnus.com Cc: bfd@cygnus.com, jason@cygnus.com Subject: Patch to readelf dwarf2 handling Date: Tue, 30 Mar 1999 00:05:00 -0000 Message-id: <199903300805.AAA23988@yorick.cygnus.com> X-SW-Source: 1999/msg00046.html This patch fixes some bugs and makes the output more readable. 1999-03-29 Jason Merrill * readelf.c (process_extended_line_op): end_sequence also resets the line number. (display_debug_lines): advance_line takes a signed operand. (read_and_display_attr): Print refs as <%x>, addresses as %#x, others as %d. Handle other location expression attributes. (display_debug_info): Handle nesting. Always print the offset. Index: readelf.c =================================================================== RCS file: /cvs/cvsfiles/devo/binutils/readelf.c,v retrieving revision 1.54 diff -c -p -r1.54 readelf.c *** readelf.c 1999/03/11 02:29:35 1.54 --- readelf.c 1999/03/30 07:57:39 *************** static int display_debug_ *** 156,162 **** static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *)); static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *)); static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int)); ! static int process_extended_line_op PARAMS ((unsigned char *, long *)); static char * get_TAG_name PARAMS ((unsigned long)); static char * get_AT_name PARAMS ((unsigned long)); static char * get_FORM_name PARAMS ((unsigned long)); --- 156,162 ---- static int display_debug_aranges PARAMS ((Elf32_Internal_Shdr *, unsigned char *, FILE *)); static unsigned char * process_abbrev_section PARAMS ((unsigned char *, unsigned char *)); static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int)); ! static int process_extended_line_op PARAMS ((unsigned char *, unsigned long *, unsigned *)); static char * get_TAG_name PARAMS ((unsigned long)); static char * get_AT_name PARAMS ((unsigned long)); static char * get_FORM_name PARAMS ((unsigned long)); *************** read_leb128 (data, length_return, sign) *** 3512,3520 **** static int ! process_extended_line_op (data, address) unsigned char * data; ! long * address; { unsigned char op_code; int bytes_read; --- 3512,3521 ---- static int ! process_extended_line_op (data, address, line) unsigned char * data; ! unsigned long * address; ! unsigned int * line; { unsigned char op_code; int bytes_read; *************** process_extended_line_op (data, address) *** 3531,3536 **** --- 3532,3539 ---- { case DW_LNE_end_sequence: printf (_(" End Sequence\n\n")); + * address = 0; + * line = 1; break; case DW_LNE_set_address: *************** display_debug_lines (section, start, fil *** 3693,3699 **** switch (op_code) { case DW_LNS_extended_op: ! data += process_extended_line_op (data, & address); break; case DW_LNS_copy: --- 3696,3702 ---- switch (op_code) { case DW_LNS_extended_op: ! data += process_extended_line_op (data, & address, & line); break; case DW_LNS_copy: *************** display_debug_lines (section, start, fil *** 3708,3714 **** break; case DW_LNS_advance_line: ! adv = read_leb128 (data, & bytes_read, 0); data += bytes_read; line += adv; printf (_(" Advance Line by %d to %d\n"), adv, line); --- 3711,3717 ---- break; case DW_LNS_advance_line: ! adv = read_leb128 (data, & bytes_read, 1); data += bytes_read; line += adv; printf (_(" Advance Line by %d to %d\n"), adv, line); *************** display_debug_lines (section, start, fil *** 3754,3760 **** address += (op_code / info.li_line_range) * info.li_min_insn_length, line += (op_code % info.li_line_range) + info.li_line_base; printf ! (_(" Increase by %d, setting address to %lx and line to %d:\n"), op_code, address, line); break; } --- 3757,3763 ---- address += (op_code / info.li_line_range) * info.li_min_insn_length, line += (op_code % info.li_line_range) + info.li_line_base; printf ! (_(" Special opcode %d: set address to %lx and line to %d\n"), op_code, address, line); break; } *************** read_and_display_attr (attribute, form, *** 4420,4434 **** unsigned long uvalue; unsigned char * block_start; int bytes_read; printf (" %-18s:", get_AT_name (attribute)); switch (form) { case DW_FORM_ref_addr: case DW_FORM_addr: uvalue = byte_get (data, pointer_size); ! printf (" %x", uvalue); data += pointer_size; break; --- 4423,4449 ---- unsigned long uvalue; unsigned char * block_start; int bytes_read; + int is_ref = 0; printf (" %-18s:", get_AT_name (attribute)); switch (form) { case DW_FORM_ref_addr: + case DW_FORM_ref1: + case DW_FORM_ref2: + case DW_FORM_ref4: + case DW_FORM_ref8: + case DW_FORM_ref_udata: + is_ref = 1; + } + + switch (form) + { + case DW_FORM_ref_addr: case DW_FORM_addr: uvalue = byte_get (data, pointer_size); ! printf (is_ref ? " <%x>" : " %#x", uvalue); data += pointer_size; break; *************** read_and_display_attr (attribute, form, *** 4436,4456 **** case DW_FORM_flag: case DW_FORM_data1: uvalue = byte_get (data ++, 1); ! printf (" %x", uvalue); break; case DW_FORM_ref2: case DW_FORM_data2: uvalue = byte_get (data, 2); data += 2; ! printf (" %x", uvalue); break; case DW_FORM_ref4: case DW_FORM_data4: uvalue = byte_get (data, 4); data += 4; ! printf (" %x", uvalue); break; case DW_FORM_ref8: --- 4451,4471 ---- case DW_FORM_flag: case DW_FORM_data1: uvalue = byte_get (data ++, 1); ! printf (is_ref ? " <%x>" : " %d", uvalue); break; case DW_FORM_ref2: case DW_FORM_data2: uvalue = byte_get (data, 2); data += 2; ! printf (is_ref ? " <%x>" : " %d", uvalue); break; case DW_FORM_ref4: case DW_FORM_data4: uvalue = byte_get (data, 4); data += 4; ! printf (is_ref ? " <%x>" : " %d", uvalue); break; case DW_FORM_ref8: *************** read_and_display_attr (attribute, form, *** 4476,4482 **** case DW_FORM_udata: uvalue = read_leb128 (data, & bytes_read, 0); data += bytes_read; ! printf (" %lx", uvalue); break; case DW_FORM_block: --- 4491,4497 ---- case DW_FORM_udata: uvalue = read_leb128 (data, & bytes_read, 0); data += bytes_read; ! printf (is_ref ? " <%lx>" : " %ld", uvalue); break; case DW_FORM_block: *************** read_and_display_attr (attribute, form, *** 4529,4535 **** case DW_INL_not_inlined: printf (_("(not inlined)")); break; case DW_INL_inlined: printf (_("(inlined)")); break; case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break; ! case DW_INL_declared_inlined: printf (_("(declared as inline and implemented)")); break; defailt: printf (_(" (Unknown inline attribute value: %x)"), uvalue); break; } break; --- 4544,4550 ---- case DW_INL_not_inlined: printf (_("(not inlined)")); break; case DW_INL_inlined: printf (_("(inlined)")); break; case DW_INL_declared_not_inlined: printf (_("(declared as inline but ignored)")); break; ! case DW_INL_declared_inlined: printf (_("(declared as inline and inlined)")); break; defailt: printf (_(" (Unknown inline attribute value: %x)"), uvalue); break; } break; *************** read_and_display_attr (attribute, form, *** 4636,4641 **** --- 4651,4658 ---- break; case DW_AT_location: + case DW_AT_data_member_location: + case DW_AT_vtable_elem_location: printf ("("); decode_location_expression (block_start, pointer_size); printf (")"); *************** display_debug_info (section, start, file *** 4666,4672 **** DWARF2_Internal_CompUnit compunit; unsigned char * tags; int i; ! int extra = 0; external = (DWARF2_External_CompUnit *) start; --- 4683,4689 ---- DWARF2_Internal_CompUnit compunit; unsigned char * tags; int i; ! int level; external = (DWARF2_External_CompUnit *) start; *************** display_debug_info (section, start, file *** 4721,4726 **** --- 4738,4744 ---- free (begin); } + level = 0; while (tags < start) { int bytes_read; *************** display_debug_info (section, start, file *** 4731,4744 **** abbrev_number = read_leb128 (tags, & bytes_read, 0); tags += bytes_read; if (abbrev_number == 0) { ! if (tags < start && ! extra) ! { ! printf (_("\n Extra data at end of comp unit:\n")); ! extra = 1; ! } ! continue; } --- 4749,4758 ---- abbrev_number = read_leb128 (tags, & bytes_read, 0); tags += bytes_read; + /* A null DIE marks the end of a list of children. */ if (abbrev_number == 0) { ! --level; continue; } *************** display_debug_info (section, start, file *** 4756,4777 **** return 0; } ! if (extra) ! printf (_(" %x: Abbrev Number: %d (%s)\n"), ! tags - section_begin - bytes_read, ! abbrev_number, ! get_TAG_name (entry->tag)); ! else ! printf (_(" Abbrev Number: %d (%s)\n"), ! abbrev_number, ! get_TAG_name (entry->tag)); - for (attr = entry->first_attr; attr; attr = attr->next) tags = read_and_display_attr (attr->attribute, attr->form, tags, compunit.cu_pointer_size); } } --- 4770,4788 ---- return 0; } ! printf (_(" <%d><%x>: Abbrev Number: %d (%s)\n"), ! level, tags - section_begin - bytes_read, ! abbrev_number, ! get_TAG_name (entry->tag)); for (attr = entry->first_attr; attr; attr = attr->next) tags = read_and_display_attr (attr->attribute, attr->form, tags, compunit.cu_pointer_size); + + if (entry->children) + ++level; } }