Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Elena Zannoni <ezannoni@cygnus.com>
To: Jakub Jelinek <jakub@redhat.com>
Cc: Elena Zannoni <ezannoni@cygnus.com>,
	Andrew Cagney <ac131313@cygnus.com>,
	jimb@cygnus.com, gdb-patches@sources.redhat.com
Subject: Re: [PATCH] Add DW_FORM_strp support (take 2)
Date: Thu, 01 Nov 2001 15:15:00 -0000	[thread overview]
Message-ID: <15344.9055.438555.530478@krustylu.cygnus.com> (raw)
In-Reply-To: <20011112184126.H11220@sunsite.ms.mff.cuni.cz>

Jakub Jelinek writes:
 > On Fri, Nov 09, 2001 at 02:31:53PM -0500, Elena Zannoni wrote:
 > > I think the test was correct at the time.  Can you address Andrew's
 > > concern by changing the test into an assert (and getting rid of the
 > > #else part) and repost the patch?
 > > (We should clean the other two tests similarly in a second pass).
 > > 
 > > Otherwise the patch looks fine to me.
 > > JimB, any comments?
 > 
 > Is this better then?


Yes, thanks.

Elena


 > 
 > 2001-11-12  Jakub Jelinek  <jakub@redhat.com>
 > 
 > 	* dwarf2read.c (dwarf_str_buffer): New.
 > 	(struct dwarf2_pinfo): Add dwarf_str_buffer and dwarf_str_size.
 > 	(DWARF_STR_BUFFER, DWARF_STR_SIZE): Define.
 > 	(dwarf2_has_info): Clear dwarf_str_offset.
 > 	(dwarf2_build_psymtabs): Read .debug_str section if present.
 > 	(dwarf2_build_psymtabs_hard): Save DWARF_STR_BUFFER and
 > 	DWARF_STR_SIZE.
 > 	(psymtab_to_symtab_1): Restore DWARF_STR_BUFFER and DWARF_STR_SIZE.
 > 	(read_attribute): Handle DW_FORM_strp.
 > 	(read_n_bytes, read_string): Remove HOST_CHAR_BIT != 8
 > 	handling code.
 > 	(read_indirect_string): New.
 > 	(dump_die): Handle DW_FORM_strp.
 > 
 > --- gdb/dwarf2read.c.jj	Wed Nov  7 00:38:14 2001
 > +++ gdb/dwarf2read.c	Mon Nov 12 18:47:17 2001
 > @@ -43,6 +43,7 @@
 >  #include "bcache.h"
 >  #include <fcntl.h>
 >  #include "gdb_string.h"
 > +#include "gdb_assert.h"
 >  #include <sys/types.h>
 >  
 >  #ifndef DWARF2_REG_TO_REGNUM
 > @@ -302,6 +303,7 @@ static const struct language_defn *cu_la
 >  static char *dwarf_info_buffer;
 >  static char *dwarf_abbrev_buffer;
 >  static char *dwarf_line_buffer;
 > +static char *dwarf_str_buffer;
 >  
 >  /* A zeroed version of a partial die for initialization purposes.  */
 >  static struct partial_die_info zeroed_partial_die;
 > @@ -383,6 +385,14 @@ struct dwarf2_pinfo
 >      /* Pointer to start of dwarf line buffer for the objfile.  */
 >  
 >      char *dwarf_line_buffer;
 > +
 > +    /* Pointer to start of dwarf string buffer for the objfile.  */
 > +
 > +    char *dwarf_str_buffer;
 > +
 > +    /* Size of dwarf string section for the objfile.  */
 > +
 > +    unsigned int dwarf_str_size;
 >    };
 >  
 >  #define PST_PRIVATE(p) ((struct dwarf2_pinfo *)(p)->read_symtab_private)
 > @@ -391,6 +401,8 @@ struct dwarf2_pinfo
 >  #define DWARF_ABBREV_BUFFER(p) (PST_PRIVATE(p)->dwarf_abbrev_buffer)
 >  #define DWARF_ABBREV_SIZE(p) (PST_PRIVATE(p)->dwarf_abbrev_size)
 >  #define DWARF_LINE_BUFFER(p) (PST_PRIVATE(p)->dwarf_line_buffer)
 > +#define DWARF_STR_BUFFER(p)  (PST_PRIVATE(p)->dwarf_str_buffer)
 > +#define DWARF_STR_SIZE(p)    (PST_PRIVATE(p)->dwarf_str_size)
 >  
 >  /* Maintain an array of referenced fundamental types for the current
 >     compilation unit being read.  For DWARF version 1, we have to construct
 > @@ -616,6 +628,9 @@ static char *read_n_bytes (bfd *, char *
 >  
 >  static char *read_string (bfd *, char *, unsigned int *);
 >  
 > +static char *read_indirect_string (bfd *, char *, const struct comp_unit_head *,
 > +				   unsigned int *);
 > +
 >  static unsigned long read_unsigned_leb128 (bfd *, char *, unsigned int *);
 >  
 >  static long read_signed_leb128 (bfd *, char *, unsigned int *);
 > @@ -788,6 +803,7 @@ int
 >  dwarf2_has_info (bfd *abfd)
 >  {
 >    dwarf_info_offset = dwarf_abbrev_offset = dwarf_line_offset = 0;
 > +  dwarf_str_offset = 0;
 >    bfd_map_over_sections (abfd, dwarf2_locate_sections, NULL);
 >    if (dwarf_info_offset && dwarf_abbrev_offset)
 >      {
 > @@ -866,6 +882,13 @@ dwarf2_build_psymtabs (struct objfile *o
 >  					   dwarf_line_offset,
 >  					   dwarf_line_size);
 >  
 > +  if (dwarf_str_offset)
 > +    dwarf_str_buffer = dwarf2_read_section (objfile,
 > +					    dwarf_str_offset,
 > +					    dwarf_str_size);
 > +  else
 > +    dwarf_str_buffer = NULL;
 > +
 >    if (mainline
 >        || (objfile->global_psymbols.size == 0
 >  	  && objfile->static_psymbols.size == 0))
 > @@ -1071,6 +1094,8 @@ dwarf2_build_psymtabs_hard (struct objfi
 >        DWARF_ABBREV_BUFFER (pst) = dwarf_abbrev_buffer;
 >        DWARF_ABBREV_SIZE (pst) = dwarf_abbrev_size;
 >        DWARF_LINE_BUFFER (pst) = dwarf_line_buffer;
 > +      DWARF_STR_BUFFER (pst) = dwarf_str_buffer;
 > +      DWARF_STR_SIZE (pst) = dwarf_str_size;
 >        baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
 >  
 >        /* Store the function that reads in the rest of the symbol table */
 > @@ -1370,6 +1395,8 @@ psymtab_to_symtab_1 (struct partial_symt
 >    dwarf_abbrev_buffer = DWARF_ABBREV_BUFFER (pst);
 >    dwarf_abbrev_size = DWARF_ABBREV_SIZE (pst);
 >    dwarf_line_buffer = DWARF_LINE_BUFFER (pst);
 > +  dwarf_str_buffer = DWARF_STR_BUFFER (pst);
 > +  dwarf_str_size = DWARF_STR_SIZE (pst);
 >    baseaddr = ANOFFSET (pst->section_offsets, SECT_OFF_TEXT (objfile));
 >    cu_header_offset = offset;
 >    info_ptr = dwarf_info_buffer + offset;
 > @@ -3384,6 +3411,11 @@ read_attribute (struct attribute *attr, 
 >        DW_STRING (attr) = read_string (abfd, info_ptr, &bytes_read);
 >        info_ptr += bytes_read;
 >        break;
 > +    case DW_FORM_strp:
 > +      DW_STRING (attr) = read_indirect_string (abfd, info_ptr, cu_header,
 > +					       &bytes_read);
 > +      info_ptr += bytes_read;
 > +      break;
 >      case DW_FORM_block:
 >        blk = dwarf_alloc_block ();
 >        blk->size = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
 > @@ -3436,7 +3468,6 @@ read_attribute (struct attribute *attr, 
 >        DW_UNSND (attr) = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
 >        info_ptr += bytes_read;
 >        break;
 > -    case DW_FORM_strp:
 >      case DW_FORM_indirect:
 >      default:
 >        error ("Dwarf Error: Cannot handle %s in DWARF reader.",
 > @@ -3626,20 +3657,8 @@ read_n_bytes (bfd *abfd, char *buf, unsi
 >    /* If the size of a host char is 8 bits, we can return a pointer
 >       to the buffer, otherwise we have to copy the data to a buffer
 >       allocated on the temporary obstack.  */
 > -#if HOST_CHAR_BIT == 8
 > +  gdb_assert (HOST_CHAR_BIT == 8);
 >    return buf;
 > -#else
 > -  char *ret;
 > -  unsigned int i;
 > -
 > -  ret = obstack_alloc (&dwarf2_tmp_obstack, size);
 > -  for (i = 0; i < size; ++i)
 > -    {
 > -      ret[i] = bfd_get_8 (abfd, (bfd_byte *) buf);
 > -      buf++;
 > -    }
 > -  return ret;
 > -#endif
 >  }
 >  
 >  static char *
 > @@ -3648,7 +3667,7 @@ read_string (bfd *abfd, char *buf, unsig
 >    /* If the size of a host char is 8 bits, we can return a pointer
 >       to the string, otherwise we have to copy the string to a buffer
 >       allocated on the temporary obstack.  */
 > -#if HOST_CHAR_BIT == 8
 > +  gdb_assert (HOST_CHAR_BIT == 8);
 >    if (*buf == '\0')
 >      {
 >        *bytes_read_ptr = 1;
 > @@ -3656,25 +3675,30 @@ read_string (bfd *abfd, char *buf, unsig
 >      }
 >    *bytes_read_ptr = strlen (buf) + 1;
 >    return buf;
 > -#else
 > -  int byte;
 > -  unsigned int i = 0;
 > +}
 > +
 > +static char *
 > +read_indirect_string (bfd *abfd, char *buf,
 > +		      const struct comp_unit_head *cu_header,
 > +		      unsigned int *bytes_read_ptr)
 > +{
 > +  LONGEST str_offset = read_offset (abfd, buf, cu_header,
 > +				    (int *) bytes_read_ptr);
 >  
 > -  while ((byte = bfd_get_8 (abfd, (bfd_byte *) buf)) != 0)
 > +  if (dwarf_str_buffer == NULL)
 >      {
 > -      obstack_1grow (&dwarf2_tmp_obstack, byte);
 > -      i++;
 > -      buf++;
 > +      error ("DW_FORM_strp used without .debug_str section");
 > +      return NULL;
 >      }
 > -  if (i == 0)
 > +  if (str_offset >= dwarf_str_size)
 >      {
 > -      *bytes_read_ptr = 1;
 > +      error ("DW_FORM_strp pointing outside of .debug_str section");
 >        return NULL;
 >      }
 > -  obstack_1grow (&dwarf2_tmp_obstack, '\0');
 > -  *bytes_read_ptr = i + 1;
 > -  return obstack_finish (&dwarf2_tmp_obstack);
 > -#endif
 > +  gdb_assert (HOST_CHAR_BIT == 8);
 > +  if (dwarf_str_buffer[str_offset] == '\0')
 > +    return NULL;
 > +  return dwarf_str_buffer + str_offset;
 >  }
 >  
 >  static unsigned long
 > @@ -5578,6 +5602,7 @@ dump_die (struct die_info *die)
 >  	  fprintf (stderr, "constant: %ld", DW_UNSND (&die->attrs[i]));
 >  	  break;
 >  	case DW_FORM_string:
 > +	case DW_FORM_strp:
 >  	  fprintf (stderr, "string: \"%s\"",
 >  		   DW_STRING (&die->attrs[i])
 >  		   ? DW_STRING (&die->attrs[i]) : "");
 > @@ -5588,8 +5613,6 @@ dump_die (struct die_info *die)
 >  	  else
 >  	    fprintf (stderr, "flag: FALSE");
 >  	  break;
 > -	case DW_FORM_strp:	/* we do not support separate string
 > -				   section yet */
 >  	case DW_FORM_indirect:	/* we do not handle indirect yet */
 >  	default:
 >  	  fprintf (stderr, "unsupported attribute form: %d.",
 > 
 > 
 > 	Jakub


      reply	other threads:[~2001-11-12 19:34 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20011107140356.T739@sunsite.ms.mff.cuni.cz>
     [not found] ` <3BEB4CE5.8070407@cygnus.com>
     [not found]   ` <20011109042928.W4087@devserv.devel.redhat.com>
     [not found]     ` <15340.12073.438634.175896@krustylu.cygnus.com>
2001-11-01 14:59       ` Jakub Jelinek
2001-11-01 15:15         ` Elena Zannoni [this message]

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=15344.9055.438555.530478@krustylu.cygnus.com \
    --to=ezannoni@cygnus.com \
    --cc=ac131313@cygnus.com \
    --cc=gdb-patches@sources.redhat.com \
    --cc=jakub@redhat.com \
    --cc=jimb@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