public inbox for bfd@sourceware.org
 help / color / mirror / Atom feed
From: Jason Merrill <jason@cygnus.com>
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	[thread overview]
Message-ID: <199903300805.AAA23988@yorick.cygnus.com> (raw)

This patch fixes some bugs and makes the output more readable.

1999-03-29  Jason Merrill  <jason@yorick.cygnus.com>

	* 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;
  	}
      }
  

             reply	other threads:[~1999-03-30  0:05 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1999-03-30  0:05 Jason Merrill [this message]
1999-03-30  9:27 Nick Clifton

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=199903300805.AAA23988@yorick.cygnus.com \
    --to=jason@cygnus.com \
    --cc=bfd@cygnus.com \
    --cc=nickc@cygnus.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).