[gdb/f16] Include gcc -g3 .debug_macro implementation by Tom Tromey.
Jan Kratochvil
jankratochvil at fedoraproject.org
Fri Jul 29 16:59:53 UTC 2011
commit 9a9da3171ccc13955157d2c5d15fd43d766fd7b0
Author: Jan Kratochvil <jan.kratochvil at redhat.com>
Date: Fri Jul 29 18:59:36 2011 +0200
Include gcc -g3 .debug_macro implementation by Tom Tromey.
gdb-upstream.patch | 939 ++++++++++++++++++++++++++++++++++++++++++++++++++++
gdb.spec | 9 +-
2 files changed, 945 insertions(+), 3 deletions(-)
---
diff --git a/gdb-upstream.patch b/gdb-upstream.patch
new file mode 100644
index 0000000..b73d4d2
--- /dev/null
+++ b/gdb-upstream.patch
@@ -0,0 +1,939 @@
+http://sourceware.org/ml/binutils-cvs/2011-07/msg00116.html
+
+### src/include/ChangeLog 2011/07/22 14:37:50 1.546
+### src/include/ChangeLog 2011/07/22 20:37:50 1.547
+## -1,5 +1,8 @@
+ 2011-07-22 Jakub Jelinek <jakub at redhat.com>
+
++ * dwarf2.h (DW_AT_GNU_macros): New.
++ (enum dwarf_macro_record_type): New enum. Add DW_MACRO_GNU_*.
++
+ PR c++/49756
+ * libiberty.h (stack_limit_increase): New prototype.
+
+--- src/include/dwarf2.h 2011/06/22 15:03:19 1.26
++++ src/include/dwarf2.h 2011/07/22 20:37:50 1.27
+@@ -366,6 +366,8 @@
+ DW_AT_GNU_all_tail_call_sites = 0x2116,
+ DW_AT_GNU_all_call_sites = 0x2117,
+ DW_AT_GNU_all_source_call_sites = 0x2118,
++ /* Section offset into .debug_macro section. */
++ DW_AT_GNU_macros = 0x2119,
+ /* VMS extensions. */
+ DW_AT_VMS_rtnbeg_pd_address = 0x2201,
+ /* GNAT extensions. */
+@@ -879,6 +881,20 @@
+ DW_MACINFO_end_file = 4,
+ DW_MACINFO_vendor_ext = 255
+ };
++
++/* Names and codes for new style macro information. */
++enum dwarf_macro_record_type
++ {
++ DW_MACRO_GNU_define = 1,
++ DW_MACRO_GNU_undef = 2,
++ DW_MACRO_GNU_start_file = 3,
++ DW_MACRO_GNU_end_file = 4,
++ DW_MACRO_GNU_define_indirect = 5,
++ DW_MACRO_GNU_undef_indirect = 6,
++ DW_MACRO_GNU_transparent_include = 7,
++ DW_MACRO_GNU_lo_user = 0xe0,
++ DW_MACRO_GNU_hi_user = 0xff
++ };
+
+ /* @@@ For use with GNU frame unwind information. */
+
+
+
+
+FYI: implement new DWARF macro proposal
+http://sourceware.org/ml/gdb-patches/2011-07/msg00732.html
+http://sourceware.org/ml/gdb-cvs/2011-07/msg00212.html
+
+### src/gdb/ChangeLog 2011/07/26 15:24:01 1.13224
+### src/gdb/ChangeLog 2011/07/26 17:04:21 1.13225
+## -1,3 +1,20 @@
++2011-07-26 Tom Tromey <tromey at redhat.com>
++
++ * symfile.h (struct dwarf2_debug_sections) <macro>: New field.
++ * dwarf2read.c (read_indirect_string_at_offset): New function.
++ (read_indirect_string): Use it.
++ (dwarf_decode_macro_bytes): New function, taken from
++ dwarf_decode_macros. Handle DW_MACRO_GNU_*.
++ (dwarf_decode_macros): Use it. handle DW_MACRO_GNU_*.
++ (dwarf_parse_macro_header, skip_form_bytes, skip_unknown_opcode):
++ New functions.
++ (struct dwarf2_per_objfile) <macro>: New field.
++ (dwarf2_elf_names): Add .debug_macro.
++ (dwarf2_macros_too_long_complaint): Add 'section' argument.
++ (dwarf2_locate_sections): Handle new section.
++ (read_file_scope): Handle DW_AT_GNU_macros.
++ (dwarf2_per_objfile_free): Unmap the .debug_macro section.
++
+ 2011-07-26 Paul Pluzhnikov <ppluzhnikov at google.com>
+
+ * NEWS: Mention dcache configuration.
+--- src/gdb/dwarf2read.c 2011/07/20 15:13:49 1.554
++++ src/gdb/dwarf2read.c 2011/07/26 17:04:23 1.555
+@@ -187,6 +187,7 @@
+ struct dwarf2_section_info line;
+ struct dwarf2_section_info loc;
+ struct dwarf2_section_info macinfo;
++ struct dwarf2_section_info macro;
+ struct dwarf2_section_info str;
+ struct dwarf2_section_info ranges;
+ struct dwarf2_section_info frame;
+@@ -264,6 +265,7 @@
+ { ".debug_line", ".zdebug_line" },
+ { ".debug_loc", ".zdebug_loc" },
+ { ".debug_macinfo", ".zdebug_macinfo" },
++ { ".debug_macro", ".zdebug_macro" },
+ { ".debug_str", ".zdebug_str" },
+ { ".debug_ranges", ".zdebug_ranges" },
+ { ".debug_types", ".zdebug_types" },
+@@ -858,10 +860,11 @@
+ }
+
+ static void
+-dwarf2_macros_too_long_complaint (void)
++dwarf2_macros_too_long_complaint (struct dwarf2_section_info *section)
+ {
+ complaint (&symfile_complaints,
+- _("macro info runs off end of `.debug_macinfo' section"));
++ _("macro info runs off end of `%s' section"),
++ section->asection->name);
+ }
+
+ static void
+@@ -1233,7 +1236,9 @@
+ struct dwarf2_cu *);
+
+ static void dwarf_decode_macros (struct line_header *, unsigned int,
+- char *, bfd *, struct dwarf2_cu *);
++ char *, bfd *, struct dwarf2_cu *,
++ struct dwarf2_section_info *,
++ int);
+
+ static int attr_form_is_block (struct attribute *);
+
+@@ -1438,6 +1443,11 @@
+ dwarf2_per_objfile->macinfo.asection = sectp;
+ dwarf2_per_objfile->macinfo.size = bfd_get_section_size (sectp);
+ }
++ else if (section_is_p (sectp->name, &names->macro))
++ {
++ dwarf2_per_objfile->macro.asection = sectp;
++ dwarf2_per_objfile->macro.size = bfd_get_section_size (sectp);
++ }
+ else if (section_is_p (sectp->name, &names->str))
+ {
+ dwarf2_per_objfile->str.asection = sectp;
+@@ -5641,13 +5651,28 @@
+ refers to information in the line number info statement program
+ header, so we can only read it if we've read the header
+ successfully. */
+- attr = dwarf2_attr (die, DW_AT_macro_info, cu);
++ attr = dwarf2_attr (die, DW_AT_GNU_macros, cu);
+ if (attr && cu->line_header)
+ {
+- unsigned int macro_offset = DW_UNSND (attr);
++ if (dwarf2_attr (die, DW_AT_macro_info, cu))
++ complaint (&symfile_complaints,
++ _("CU refers to both DW_AT_GNU_macros and DW_AT_macro_info"));
++
++ dwarf_decode_macros (cu->line_header, DW_UNSND (attr),
++ comp_dir, abfd, cu,
++ &dwarf2_per_objfile->macro, 1);
++ }
++ else
++ {
++ attr = dwarf2_attr (die, DW_AT_macro_info, cu);
++ if (attr && cu->line_header)
++ {
++ unsigned int macro_offset = DW_UNSND (attr);
+
+- dwarf_decode_macros (cu->line_header, macro_offset,
+- comp_dir, abfd, cu);
++ dwarf_decode_macros (cu->line_header, macro_offset,
++ comp_dir, abfd, cu,
++ &dwarf2_per_objfile->macinfo, 0);
++ }
+ }
+ do_cleanups (back_to);
+ }
+@@ -10262,32 +10287,32 @@
+ }
+
+ static char *
+-read_indirect_string (bfd *abfd, gdb_byte *buf,
+- const struct comp_unit_head *cu_header,
+- unsigned int *bytes_read_ptr)
++read_indirect_string_at_offset (bfd *abfd, LONGEST str_offset)
+ {
+- LONGEST str_offset = read_offset (abfd, buf, cu_header, bytes_read_ptr);
+-
+ dwarf2_read_section (dwarf2_per_objfile->objfile, &dwarf2_per_objfile->str);
+ if (dwarf2_per_objfile->str.buffer == NULL)
+- {
+- error (_("DW_FORM_strp used without .debug_str section [in module %s]"),
+- bfd_get_filename (abfd));
+- return NULL;
+- }
++ error (_("DW_FORM_strp used without .debug_str section [in module %s]"),
++ bfd_get_filename (abfd));
+ if (str_offset >= dwarf2_per_objfile->str.size)
+- {
+- error (_("DW_FORM_strp pointing outside of "
+- ".debug_str section [in module %s]"),
+- bfd_get_filename (abfd));
+- return NULL;
+- }
++ error (_("DW_FORM_strp pointing outside of "
++ ".debug_str section [in module %s]"),
++ bfd_get_filename (abfd));
+ gdb_assert (HOST_CHAR_BIT == 8);
+ if (dwarf2_per_objfile->str.buffer[str_offset] == '\0')
+ return NULL;
+ return (char *) (dwarf2_per_objfile->str.buffer + str_offset);
+ }
+
++static char *
++read_indirect_string (bfd *abfd, gdb_byte *buf,
++ const struct comp_unit_head *cu_header,
++ unsigned int *bytes_read_ptr)
++{
++ LONGEST str_offset = read_offset (abfd, buf, cu_header, bytes_read_ptr);
++
++ return read_indirect_string_at_offset (abfd, str_offset);
++}
++
+ static unsigned long
+ read_unsigned_leb128 (bfd *abfd, gdb_byte *buf, unsigned int *bytes_read_ptr)
+ {
+@@ -14669,117 +14694,205 @@
+ dwarf2_macro_malformed_definition_complaint (body);
+ }
+
++/* Skip some bytes from BYTES according to the form given in FORM.
++ Returns the new pointer. */
+
+-static void
+-dwarf_decode_macros (struct line_header *lh, unsigned int offset,
+- char *comp_dir, bfd *abfd,
+- struct dwarf2_cu *cu)
++static gdb_byte *
++skip_form_bytes (bfd *abfd, gdb_byte *bytes,
++ enum dwarf_form form,
++ unsigned int offset_size,
++ struct dwarf2_section_info *section)
+ {
+- gdb_byte *mac_ptr, *mac_end;
+- struct macro_source_file *current_file = 0;
+- enum dwarf_macinfo_record_type macinfo_type;
+- int at_commandline;
++ unsigned int bytes_read;
+
+- dwarf2_read_section (dwarf2_per_objfile->objfile,
+- &dwarf2_per_objfile->macinfo);
+- if (dwarf2_per_objfile->macinfo.buffer == NULL)
++ switch (form)
+ {
+- complaint (&symfile_complaints, _("missing .debug_macinfo section"));
+- return;
++ case DW_FORM_data1:
++ case DW_FORM_flag:
++ ++bytes;
++ break;
++
++ case DW_FORM_data2:
++ bytes += 2;
++ break;
++
++ case DW_FORM_data4:
++ bytes += 4;
++ break;
++
++ case DW_FORM_data8:
++ bytes += 8;
++ break;
++
++ case DW_FORM_string:
++ read_direct_string (abfd, bytes, &bytes_read);
++ bytes += bytes_read;
++ break;
++
++ case DW_FORM_sec_offset:
++ case DW_FORM_strp:
++ bytes += offset_size;
++ break;
++
++ case DW_FORM_block:
++ bytes += read_unsigned_leb128 (abfd, bytes, &bytes_read);
++ bytes += bytes_read;
++ break;
++
++ case DW_FORM_block1:
++ bytes += 1 + read_1_byte (abfd, bytes);
++ break;
++ case DW_FORM_block2:
++ bytes += 2 + read_2_bytes (abfd, bytes);
++ break;
++ case DW_FORM_block4:
++ bytes += 4 + read_4_bytes (abfd, bytes);
++ break;
++
++ case DW_FORM_sdata:
++ case DW_FORM_udata:
++ bytes = skip_leb128 (abfd, bytes);
++ break;
++
++ default:
++ {
++ complain:
++ complaint (&symfile_complaints,
++ _("invalid form 0x%x in `%s'"),
++ form,
++ section->asection->name);
++ return NULL;
++ }
+ }
+
+- /* First pass: Find the name of the base filename.
+- This filename is needed in order to process all macros whose definition
+- (or undefinition) comes from the command line. These macros are defined
+- before the first DW_MACINFO_start_file entry, and yet still need to be
+- associated to the base file.
++ return bytes;
++}
+
+- To determine the base file name, we scan the macro definitions until we
+- reach the first DW_MACINFO_start_file entry. We then initialize
+- CURRENT_FILE accordingly so that any macro definition found before the
+- first DW_MACINFO_start_file can still be associated to the base file. */
++/* A helper for dwarf_decode_macros that handles skipping an unknown
++ opcode. Returns an updated pointer to the macro data buffer; or,
++ on error, issues a complaint and returns NULL. */
+
+- mac_ptr = dwarf2_per_objfile->macinfo.buffer + offset;
+- mac_end = dwarf2_per_objfile->macinfo.buffer
+- + dwarf2_per_objfile->macinfo.size;
++static gdb_byte *
++skip_unknown_opcode (unsigned int opcode,
++ gdb_byte **opcode_definitions,
++ gdb_byte *mac_ptr,
++ bfd *abfd,
++ unsigned int offset_size,
++ struct dwarf2_section_info *section)
++{
++ unsigned int bytes_read, i;
++ unsigned long arg;
++ gdb_byte *defn;
+
+- do
++ if (opcode_definitions[opcode] == NULL)
+ {
+- /* Do we at least have room for a macinfo type byte? */
+- if (mac_ptr >= mac_end)
+- {
+- /* Complaint is printed during the second pass as GDB will probably
+- stop the first pass earlier upon finding
+- DW_MACINFO_start_file. */
+- break;
+- }
++ complaint (&symfile_complaints,
++ _("unrecognized DW_MACFINO opcode 0x%x"),
++ opcode);
++ return NULL;
++ }
+
+- macinfo_type = read_1_byte (abfd, mac_ptr);
+- mac_ptr++;
++ defn = opcode_definitions[opcode];
++ arg = read_unsigned_leb128 (abfd, defn, &bytes_read);
++ defn += bytes_read;
+
+- switch (macinfo_type)
+- {
+- /* A zero macinfo type indicates the end of the macro
+- information. */
+- case 0:
+- break;
++ for (i = 0; i < arg; ++i)
++ {
++ mac_ptr = skip_form_bytes (abfd, mac_ptr, defn[i], offset_size, section);
++ if (mac_ptr == NULL)
++ {
++ /* skip_form_bytes already issued the complaint. */
++ return NULL;
++ }
++ }
+
+- case DW_MACINFO_define:
+- case DW_MACINFO_undef:
+- /* Only skip the data by MAC_PTR. */
+- {
+- unsigned int bytes_read;
++ return mac_ptr;
++}
+
+- read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
+- mac_ptr += bytes_read;
+- read_direct_string (abfd, mac_ptr, &bytes_read);
+- mac_ptr += bytes_read;
+- }
+- break;
++/* A helper function which parses the header of a macro section.
++ If the macro section is the extended (for now called "GNU") type,
++ then this updates *OFFSET_SIZE. Returns a pointer to just after
++ the header, or issues a complaint and returns NULL on error. */
+
+- case DW_MACINFO_start_file:
+- {
+- unsigned int bytes_read;
+- int line, file;
++static gdb_byte *
++dwarf_parse_macro_header (gdb_byte **opcode_definitions,
++ bfd *abfd,
++ gdb_byte *mac_ptr,
++ unsigned int *offset_size,
++ int section_is_gnu)
++{
++ memset (opcode_definitions, 0, 256 * sizeof (gdb_byte *));
+
+- line = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
+- mac_ptr += bytes_read;
+- file = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
+- mac_ptr += bytes_read;
++ if (section_is_gnu)
++ {
++ unsigned int version, flags;
+
+- current_file = macro_start_file (file, line, current_file,
+- comp_dir, lh, cu->objfile);
+- }
+- break;
++ version = read_2_bytes (abfd, mac_ptr);
++ if (version != 4)
++ {
++ complaint (&symfile_complaints,
++ _("unrecognized version `%d' in .debug_macro section"),
++ version);
++ return NULL;
++ }
++ mac_ptr += 2;
+
+- case DW_MACINFO_end_file:
+- /* No data to skip by MAC_PTR. */
+- break;
++ flags = read_1_byte (abfd, mac_ptr);
++ ++mac_ptr;
++ *offset_size = (flags & 1) ? 8 : 4;
+
+- case DW_MACINFO_vendor_ext:
+- /* Only skip the data by MAC_PTR. */
+- {
+- unsigned int bytes_read;
++ if ((flags & 2) != 0)
++ /* We don't need the line table offset. */
++ mac_ptr += *offset_size;
+
+- read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
+- mac_ptr += bytes_read;
+- read_direct_string (abfd, mac_ptr, &bytes_read);
+- mac_ptr += bytes_read;
+- }
+- break;
++ /* Vendor opcode descriptions. */
++ if ((flags & 4) != 0)
++ {
++ unsigned int i, count;
+
+- default:
+- break;
++ count = read_1_byte (abfd, mac_ptr);
++ ++mac_ptr;
++ for (i = 0; i < count; ++i)
++ {
++ unsigned int opcode, bytes_read;
++ unsigned long arg;
++
++ opcode = read_1_byte (abfd, mac_ptr);
++ ++mac_ptr;
++ opcode_definitions[opcode] = mac_ptr;
++ arg = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
++ mac_ptr += bytes_read;
++ mac_ptr += arg;
++ }
+ }
+- } while (macinfo_type != 0 && current_file == NULL);
++ }
+
+- /* Second pass: Process all entries.
++ return mac_ptr;
++}
+
+- Use the AT_COMMAND_LINE flag to determine whether we are still processing
+- command-line macro definitions/undefinitions. This flag is unset when we
+- reach the first DW_MACINFO_start_file entry. */
++/* A helper for dwarf_decode_macros that handles the GNU extensions,
++ including DW_GNU_MACINFO_transparent_include. */
++
++static void
++dwarf_decode_macro_bytes (bfd *abfd, gdb_byte *mac_ptr, gdb_byte *mac_end,
++ struct macro_source_file *current_file,
++ struct line_header *lh, char *comp_dir,
++ struct dwarf2_section_info *section,
++ int section_is_gnu,
++ unsigned int offset_size,
++ struct objfile *objfile)
++{
++ enum dwarf_macro_record_type macinfo_type;
++ int at_commandline;
++ gdb_byte *opcode_definitions[256];
+
+- mac_ptr = dwarf2_per_objfile->macinfo.buffer + offset;
++ mac_ptr = dwarf_parse_macro_header (opcode_definitions, abfd, mac_ptr,
++ &offset_size, section_is_gnu);
++ if (mac_ptr == NULL)
++ {
++ /* We already issued a complaint. */
++ return;
++ }
+
+ /* Determines if GDB is still before first DW_MACINFO_start_file. If true
+ GDB is still reading the definitions from command line. First
+@@ -14795,13 +14908,15 @@
+ /* Do we at least have room for a macinfo type byte? */
+ if (mac_ptr >= mac_end)
+ {
+- dwarf2_macros_too_long_complaint ();
++ dwarf2_macros_too_long_complaint (section);
+ break;
+ }
+
+ macinfo_type = read_1_byte (abfd, mac_ptr);
+ mac_ptr++;
+
++ /* Note that we rely on the fact that the corresponding GNU and
++ DWARF constants are the same. */
+ switch (macinfo_type)
+ {
+ /* A zero macinfo type indicates the end of the macro
+@@ -14809,29 +14924,45 @@
+ case 0:
+ break;
+
+- case DW_MACINFO_define:
+- case DW_MACINFO_undef:
++ case DW_MACRO_GNU_define:
++ case DW_MACRO_GNU_undef:
++ case DW_MACRO_GNU_define_indirect:
++ case DW_MACRO_GNU_undef_indirect:
+ {
+ unsigned int bytes_read;
+ int line;
+ char *body;
++ int is_define;
+
+- line = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
+- mac_ptr += bytes_read;
+- body = read_direct_string (abfd, mac_ptr, &bytes_read);
+- mac_ptr += bytes_read;
++ line = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
++ mac_ptr += bytes_read;
++
++ if (macinfo_type == DW_MACRO_GNU_define
++ || macinfo_type == DW_MACRO_GNU_undef)
++ {
++ body = read_direct_string (abfd, mac_ptr, &bytes_read);
++ mac_ptr += bytes_read;
++ }
++ else
++ {
++ LONGEST str_offset;
++
++ str_offset = read_offset_1 (abfd, mac_ptr, offset_size);
++ mac_ptr += offset_size;
+
++ body = read_indirect_string_at_offset (abfd, str_offset);
++ }
++
++ is_define = (macinfo_type == DW_MACRO_GNU_define
++ || macinfo_type == DW_MACRO_GNU_define_indirect);
+ if (! current_file)
+ {
+ /* DWARF violation as no main source is present. */
+ complaint (&symfile_complaints,
+ _("debug info with no main source gives macro %s "
+ "on line %d: %s"),
+- macinfo_type == DW_MACINFO_define ?
+- _("definition") :
+- macinfo_type == DW_MACINFO_undef ?
+- _("undefinition") :
+- _("something-or-other"), line, body);
++ is_define ? _("definition") : _("undefinition"),
++ line, body);
+ break;
+ }
+ if ((line == 0 && !at_commandline)
+@@ -14839,21 +14970,21 @@
+ complaint (&symfile_complaints,
+ _("debug info gives %s macro %s with %s line %d: %s"),
+ at_commandline ? _("command-line") : _("in-file"),
+- macinfo_type == DW_MACINFO_define ?
+- _("definition") :
+- macinfo_type == DW_MACINFO_undef ?
+- _("undefinition") :
+- _("something-or-other"),
++ is_define ? _("definition") : _("undefinition"),
+ line == 0 ? _("zero") : _("non-zero"), line, body);
+
+- if (macinfo_type == DW_MACINFO_define)
++ if (is_define)
+ parse_macro_definition (current_file, line, body);
+- else if (macinfo_type == DW_MACINFO_undef)
+- macro_undef (current_file, line, body);
++ else
++ {
++ gdb_assert (macinfo_type == DW_MACRO_GNU_undef
++ || macinfo_type == DW_MACRO_GNU_undef_indirect);
++ macro_undef (current_file, line, body);
++ }
+ }
+ break;
+
+- case DW_MACINFO_start_file:
++ case DW_MACRO_GNU_start_file:
+ {
+ unsigned int bytes_read;
+ int line, file;
+@@ -14873,17 +15004,18 @@
+
+ if (at_commandline)
+ {
+- /* This DW_MACINFO_start_file was executed in the pass one. */
++ /* This DW_MACRO_GNU_start_file was executed in the
++ pass one. */
+ at_commandline = 0;
+ }
+ else
+ current_file = macro_start_file (file, line,
+ current_file, comp_dir,
+- lh, cu->objfile);
++ lh, objfile);
+ }
+ break;
+
+- case DW_MACINFO_end_file:
++ case DW_MACRO_GNU_end_file:
+ if (! current_file)
+ complaint (&symfile_complaints,
+ _("macro debug info has an unmatched "
+@@ -14893,7 +15025,7 @@
+ current_file = current_file->included_by;
+ if (! current_file)
+ {
+- enum dwarf_macinfo_record_type next_type;
++ enum dwarf_macro_record_type next_type;
+
+ /* GCC circa March 2002 doesn't produce the zero
+ type byte marking the end of the compilation
+@@ -14903,7 +15035,7 @@
+ /* Do we at least have room for a macinfo type byte? */
+ if (mac_ptr >= mac_end)
+ {
+- dwarf2_macros_too_long_complaint ();
++ dwarf2_macros_too_long_complaint (section);
+ return;
+ }
+
+@@ -14920,23 +15052,199 @@
+ }
+ break;
+
++ case DW_MACRO_GNU_transparent_include:
++ {
++ LONGEST offset;
++
++ offset = read_offset_1 (abfd, mac_ptr, offset_size);
++ mac_ptr += offset_size;
++
++ dwarf_decode_macro_bytes (abfd,
++ section->buffer + offset,
++ mac_end, current_file,
++ lh, comp_dir,
++ section, section_is_gnu,
++ offset_size, objfile);
++ }
++ break;
++
+ case DW_MACINFO_vendor_ext:
+- {
+- unsigned int bytes_read;
+- int constant;
++ if (!section_is_gnu)
++ {
++ unsigned int bytes_read;
++ int constant;
+
+- constant = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
+- mac_ptr += bytes_read;
+- read_direct_string (abfd, mac_ptr, &bytes_read);
+- mac_ptr += bytes_read;
++ constant = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
++ mac_ptr += bytes_read;
++ read_direct_string (abfd, mac_ptr, &bytes_read);
++ mac_ptr += bytes_read;
+
+- /* We don't recognize any vendor extensions. */
+- }
+- break;
++ /* We don't recognize any vendor extensions. */
++ break;
++ }
++ /* FALLTHROUGH */
++
++ default:
++ mac_ptr = skip_unknown_opcode (macinfo_type, opcode_definitions,
++ mac_ptr, abfd, offset_size,
++ section);
++ if (mac_ptr == NULL)
++ return;
++ break;
+ }
+ } while (macinfo_type != 0);
+ }
+
++static void
++dwarf_decode_macros (struct line_header *lh, unsigned int offset,
++ char *comp_dir, bfd *abfd,
++ struct dwarf2_cu *cu,
++ struct dwarf2_section_info *section,
++ int section_is_gnu)
++{
++ gdb_byte *mac_ptr, *mac_end;
++ struct macro_source_file *current_file = 0;
++ enum dwarf_macro_record_type macinfo_type;
++ unsigned int offset_size = cu->header.offset_size;
++ gdb_byte *opcode_definitions[256];
++
++ dwarf2_read_section (dwarf2_per_objfile->objfile, section);
++ if (section->buffer == NULL)
++ {
++ complaint (&symfile_complaints, _("missing %s section"),
++ section->asection->name);
++ return;
++ }
++
++ /* First pass: Find the name of the base filename.
++ This filename is needed in order to process all macros whose definition
++ (or undefinition) comes from the command line. These macros are defined
++ before the first DW_MACINFO_start_file entry, and yet still need to be
++ associated to the base file.
++
++ To determine the base file name, we scan the macro definitions until we
++ reach the first DW_MACINFO_start_file entry. We then initialize
++ CURRENT_FILE accordingly so that any macro definition found before the
++ first DW_MACINFO_start_file can still be associated to the base file. */
++
++ mac_ptr = section->buffer + offset;
++ mac_end = section->buffer + section->size;
++
++ mac_ptr = dwarf_parse_macro_header (opcode_definitions, abfd, mac_ptr,
++ &offset_size, section_is_gnu);
++ if (mac_ptr == NULL)
++ {
++ /* We already issued a complaint. */
++ return;
++ }
++
++ do
++ {
++ /* Do we at least have room for a macinfo type byte? */
++ if (mac_ptr >= mac_end)
++ {
++ /* Complaint is printed during the second pass as GDB will probably
++ stop the first pass earlier upon finding
++ DW_MACINFO_start_file. */
++ break;
++ }
++
++ macinfo_type = read_1_byte (abfd, mac_ptr);
++ mac_ptr++;
++
++ /* Note that we rely on the fact that the corresponding GNU and
++ DWARF constants are the same. */
++ switch (macinfo_type)
++ {
++ /* A zero macinfo type indicates the end of the macro
++ information. */
++ case 0:
++ break;
++
++ case DW_MACRO_GNU_define:
++ case DW_MACRO_GNU_undef:
++ /* Only skip the data by MAC_PTR. */
++ {
++ unsigned int bytes_read;
++
++ read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
++ mac_ptr += bytes_read;
++ read_direct_string (abfd, mac_ptr, &bytes_read);
++ mac_ptr += bytes_read;
++ }
++ break;
++
++ case DW_MACRO_GNU_start_file:
++ {
++ unsigned int bytes_read;
++ int line, file;
++
++ line = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
++ mac_ptr += bytes_read;
++ file = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
++ mac_ptr += bytes_read;
++
++ current_file = macro_start_file (file, line, current_file,
++ comp_dir, lh, cu->objfile);
++ }
++ break;
++
++ case DW_MACRO_GNU_end_file:
++ /* No data to skip by MAC_PTR. */
++ break;
++
++ case DW_MACRO_GNU_define_indirect:
++ case DW_MACRO_GNU_undef_indirect:
++ {
++ unsigned int bytes_read;
++
++ read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
++ mac_ptr += bytes_read;
++ mac_ptr += offset_size;
++ }
++ break;
++
++ case DW_MACRO_GNU_transparent_include:
++ /* Note that, according to the spec, a transparent include
++ chain cannot call DW_MACRO_GNU_start_file. So, we can just
++ skip this opcode. */
++ mac_ptr += offset_size;
++ break;
++
++ case DW_MACINFO_vendor_ext:
++ /* Only skip the data by MAC_PTR. */
++ if (!section_is_gnu)
++ {
++ unsigned int bytes_read;
++
++ read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
++ mac_ptr += bytes_read;
++ read_direct_string (abfd, mac_ptr, &bytes_read);
++ mac_ptr += bytes_read;
++ }
++ /* FALLTHROUGH */
++
++ default:
++ mac_ptr = skip_unknown_opcode (macinfo_type, opcode_definitions,
++ mac_ptr, abfd, offset_size,
++ section);
++ if (mac_ptr == NULL)
++ return;
++ break;
++ }
++ } while (macinfo_type != 0 && current_file == NULL);
++
++ /* Second pass: Process all entries.
++
++ Use the AT_COMMAND_LINE flag to determine whether we are still processing
++ command-line macro definitions/undefinitions. This flag is unset when we
++ reach the first DW_MACINFO_start_file entry. */
++
++ dwarf_decode_macro_bytes (abfd, section->buffer + offset, mac_end,
++ current_file, lh, comp_dir, section, section_is_gnu,
++ offset_size, cu->objfile);
++}
++
+ /* Check if the attribute's form is a DW_FORM_block*
+ if so return true else false. */
+ static int
+@@ -15663,6 +15971,7 @@
+ munmap_section_buffer (&data->line);
+ munmap_section_buffer (&data->loc);
+ munmap_section_buffer (&data->macinfo);
++ munmap_section_buffer (&data->macro);
+ munmap_section_buffer (&data->str);
+ munmap_section_buffer (&data->ranges);
+ munmap_section_buffer (&data->frame);
+--- src/gdb/symfile.h 2011/06/10 21:48:04 1.93
++++ src/gdb/symfile.h 2011/07/26 17:04:23 1.94
+@@ -582,6 +582,7 @@
+ struct dwarf2_section_names line;
+ struct dwarf2_section_names loc;
+ struct dwarf2_section_names macinfo;
++ struct dwarf2_section_names macro;
+ struct dwarf2_section_names str;
+ struct dwarf2_section_names ranges;
+ struct dwarf2_section_names types;
+
+
+
+Re: FYI: implement new DWARF macro proposal
+http://sourceware.org/ml/gdb-patches/2011-07/msg00759.html
+http://sourceware.org/ml/gdb-cvs/2011-07/msg00224.html
+
+### src/gdb/ChangeLog 2011/07/26 21:09:05 1.13229
+### src/gdb/ChangeLog 2011/07/27 14:45:36 1.13230
+## -1,3 +1,10 @@
++2011-07-27 Tom Tromey <tromey at redhat.com>
++
++ * xcoffread.c (dwarf2_xcoff_names): Add 'macro' and 'sentinel'
++ entries.
++ * symfile.h (struct dwarf2_debug_sections) <sentinel>: New field.
++ * dwarf2read.c (dwarf2_elf_names): Add sentinel entry.
++
+ 2011-07-26 Sterling Augustine <saugustine at google.com>
+
+ * cli/cli-dump.c (dump_binary_file): Change parameter type to
+--- src/gdb/dwarf2read.c 2011/07/26 17:04:23 1.555
++++ src/gdb/dwarf2read.c 2011/07/27 14:45:37 1.556
+@@ -271,7 +271,8 @@
+ { ".debug_types", ".zdebug_types" },
+ { ".debug_frame", ".zdebug_frame" },
+ { ".eh_frame", NULL },
+- { ".gdb_index", ".zgdb_index" }
++ { ".gdb_index", ".zgdb_index" },
++ 23
+ };
+
+ /* local data types */
+--- src/gdb/symfile.h 2011/07/26 17:04:23 1.94
++++ src/gdb/symfile.h 2011/07/27 14:45:37 1.95
+@@ -589,6 +589,9 @@
+ struct dwarf2_section_names frame;
+ struct dwarf2_section_names eh_frame;
+ struct dwarf2_section_names gdb_index;
++ /* This field has no meaning, but exists solely to catch changes to
++ this structure which are not reflected in some instance. */
++ int sentinel;
+ };
+
+ extern int dwarf2_has_info (struct objfile *,
+--- src/gdb/xcoffread.c 2011/06/07 12:31:07 1.89
++++ src/gdb/xcoffread.c 2011/07/27 14:45:37 1.90
+@@ -160,12 +160,14 @@
+ { ".dwline", NULL },
+ { ".dwloc", NULL },
+ { NULL, NULL }, /* debug_macinfo */
++ { NULL, NULL }, /* debug_macro */
+ { ".dwstr", NULL },
+ { ".dwrnges", NULL },
+ { NULL, NULL }, /* debug_types */
+ { ".dwframe", NULL },
+ { NULL, NULL }, /* eh_frame */
+- { NULL, NULL } /* gdb_index */
++ { NULL, NULL }, /* gdb_index */
++ 23
+ };
+
+ static void
diff --git a/gdb.spec b/gdb.spec
index f2eef6b..788570b 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -27,7 +27,7 @@ Version: 7.3.50.20110722
# The release always contains a leading reserved number, start it at 1.
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
-Release: 1%{?_with_upstream:.upstream}%{?dist}
+Release: 2%{?_with_upstream:.upstream}%{?dist}
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain
Group: Development/Debuggers
@@ -260,7 +260,7 @@ Patch231: gdb-6.3-bz202689-exec-from-pthread-test.patch
# Backported fixups post the source tarball.
#Xdrop: Just backports.
-#Patch232: gdb-upstream.patch
+Patch232: gdb-upstream.patch
# Testcase for PPC Power6/DFP instructions disassembly (BZ 230000).
#=fedoratest+ppc
@@ -687,7 +687,7 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
%if 0%{!?_with_upstream:1}
-#patch232 -p1
+%patch232 -p1
%patch349 -p1
%patch1 -p1
%patch3 -p1
@@ -1213,6 +1213,9 @@ fi
%{_infodir}/gdb.info*
%changelog
+* Fri Jul 29 2011 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.3.50.20110722-2.fc16
+- Include gcc -g3 .debug_macro implementation by Tom Tromey.
+
* Sat Jul 23 2011 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.3.50.20110722-1.fc16
- Rebase to FSF GDB 7.3.50.20110722.
- Improve gcc-4.6 stdarg false prologue end workaround (GDB PR 12435 + GCC PR 47471).
More information about the scm-commits
mailing list