* [PATCH] Add DW_FORM_strp support (take 2) [not found] ` <15340.12073.438634.175896@krustylu.cygnus.com> @ 2001-11-01 14:59 ` Jakub Jelinek 2001-11-01 15:15 ` Elena Zannoni 0 siblings, 1 reply; 2+ messages in thread From: Jakub Jelinek @ 2001-11-01 14:59 UTC (permalink / raw) To: Elena Zannoni; +Cc: Andrew Cagney, jimb, gdb-patches 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? 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 ^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] Add DW_FORM_strp support (take 2) 2001-11-01 14:59 ` [PATCH] Add DW_FORM_strp support (take 2) Jakub Jelinek @ 2001-11-01 15:15 ` Elena Zannoni 0 siblings, 0 replies; 2+ messages in thread From: Elena Zannoni @ 2001-11-01 15:15 UTC (permalink / raw) To: Jakub Jelinek; +Cc: Elena Zannoni, Andrew Cagney, jimb, gdb-patches 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 ^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2001-11-12 19:34 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[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 ` [PATCH] Add DW_FORM_strp support (take 2) Jakub Jelinek
2001-11-01 15:15 ` Elena Zannoni
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox