This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: RFA: tolerate bogus Dwarf macro info
- From: Jim Blandy <jimb at redhat dot com>
- To: gdb-patches at sources dot redhat dot com
- Cc: ezannoni at redhat dot com
- Date: Mon, 26 Sep 2005 15:18:02 -0700
- Subject: Re: RFA: tolerate bogus Dwarf macro info
- References: <m3fyrrvm3o.fsf@alligator.red-bean.com>
Here's a revised patch (which also checks for file numbers that are
too small), and a patch for the test suite.
2005-09-26 Jim Blandy <jimb@redhat.com>
* dwarf2read.c (file_full_name): Cope with file numbers that are
out of range for the given line header.
Index: gdb/dwarf2read.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2read.c,v
retrieving revision 1.183
diff -c -p -r1.183 dwarf2read.c
*** gdb/dwarf2read.c 1 Aug 2005 04:06:27 -0000 1.183
--- gdb/dwarf2read.c 26 Sep 2005 22:10:05 -0000
*************** dwarf_alloc_die (void)
*** 8810,8841 ****
static char *
file_full_name (int file, struct line_header *lh, const char *comp_dir)
{
! struct file_entry *fe = &lh->file_names[file - 1];
!
! if (IS_ABSOLUTE_PATH (fe->name))
! return xstrdup (fe->name);
! else
{
! const char *dir;
! int dir_len;
! char *full_name;
!
! if (fe->dir_index)
! dir = lh->include_dirs[fe->dir_index - 1];
else
- dir = comp_dir;
-
- if (dir)
{
! dir_len = strlen (dir);
! full_name = xmalloc (dir_len + 1 + strlen (fe->name) + 1);
! strcpy (full_name, dir);
! full_name[dir_len] = '/';
! strcpy (full_name + dir_len + 1, fe->name);
! return full_name;
}
! else
! return xstrdup (fe->name);
}
}
--- 8810,8860 ----
static char *
file_full_name (int file, struct line_header *lh, const char *comp_dir)
{
! /* Is the file number a valid index into the line header's file name
! table? Remember that file numbers start with one, not zero. */
! if (1 <= file && file <= lh->num_file_names)
{
! struct file_entry *fe = &lh->file_names[file - 1];
!
! if (IS_ABSOLUTE_PATH (fe->name))
! return xstrdup (fe->name);
else
{
! const char *dir;
! int dir_len;
! char *full_name;
!
! if (fe->dir_index)
! dir = lh->include_dirs[fe->dir_index - 1];
! else
! dir = comp_dir;
!
! if (dir)
! {
! dir_len = strlen (dir);
! full_name = xmalloc (dir_len + 1 + strlen (fe->name) + 1);
! strcpy (full_name, dir);
! full_name[dir_len] = '/';
! strcpy (full_name + dir_len + 1, fe->name);
! return full_name;
! }
! else
! return xstrdup (fe->name);
}
! }
! else
! {
! /* The compiler produced a bogus file number. We can at least
! record the macro definitions made in the file, even if we
! won't be able to find the file by name. */
! char fake_name[80];
! sprintf (fake_name, "<bad macro file number %d>", file);
!
! complaint (&symfile_complaints,
! _("bad file number in macro information (%d)"),
! file);
!
! return xstrdup (fake_name);
}
}
2005-09-26 Jim Blandy <jimb@redhat.com>
* gdb.dwarf2/mac-fileno.exp, gdb.dwarf2/mac-fileno.S: New tests.
Index: gdb/testsuite/ChangeLog
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/ChangeLog,v
retrieving revision 1.1149
diff -c -p -r1.1149 ChangeLog
*** gdb/testsuite/ChangeLog 26 Sep 2005 02:17:33 -0000 1.1149
--- gdb/testsuite/ChangeLog 26 Sep 2005 22:15:06 -0000
***************
*** 1,3 ****
--- 1,7 ----
+ 2005-09-26 Jim Blandy <jimb@redhat.com>
+
+ * gdb.dwarf2/mac-fileno.exp, gdb.dwarf2/mac-fileno.S: New tests.
+
2005-09-26 Paul Brook <paul@codesourcery.com>
* long_long.exp: Exclude eabi targets from arm FPA float format test.
Index: gdb/testsuite/gdb.dwarf2/mac-fileno.S
===================================================================
RCS file: gdb/testsuite/gdb.dwarf2/mac-fileno.S
diff -N gdb/testsuite/gdb.dwarf2/mac-fileno.S
*** gdb/testsuite/gdb.dwarf2/mac-fileno.S 1 Jan 1970 00:00:00 -0000
--- gdb/testsuite/gdb.dwarf2/mac-fileno.S 26 Sep 2005 22:15:06 -0000
***************
*** 0 ****
--- 1,215 ----
+ /* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2005 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to:
+ Free Software Foundation, Inc.
+ 51 Franklin St., Fifth Floor
+ Boston, MA 02110-1301
+ USA */
+
+ /* Check that GDB can gracefully handle macro information that has
+ bogus file numbers. */
+
+ /* Dummy function to provide debug information for. */
+
+ .text
+ .Lbegin_text1:
+ .globl func_cu1
+ .type func_cu1, %function
+ func_cu1:
+ .Lbegin_func_cu1:
+ .int 0
+ .Lend_func_cu1:
+ .size func_cu1, .-func_cu1
+ .Lend_text1:
+
+ /* Debug information */
+
+ .section .debug_info
+ .Lcu1_begin:
+ /* CU header */
+ .int .Lcu1_end - .Lcu1_start /* Length of Compilation Unit */
+ .Lcu1_start:
+ .short 2 /* DWARF Version */
+ .int .Labbrev1_begin /* Offset into abbrev section */
+ .byte 4 /* Pointer size */
+
+ /* CU die */
+ .uleb128 1 /* Abbrev: DW_TAG_compile_unit */
+ .int .Lline1_begin /* DW_AT_stmt_list */
+ .int .Ldebug_macinfo0 /* DW_AT_macro_info */
+ .int .Lend_text1 /* DW_AT_high_pc */
+ .int .Lbegin_text1 /* DW_AT_low_pc */
+ .ascii "file1.txt\0" /* DW_AT_name */
+ .ascii "GNU C 4.0.1\0" /* DW_AT_producer */
+ .byte 1 /* DW_AT_language (C) */
+
+ /* func_cu1 */
+ .uleb128 2 /* Abbrev: DW_TAG_subprogram */
+ .byte 1 /* DW_AT_external */
+ .byte 1 /* DW_AT_decl_file */
+ .byte 2 /* DW_AT_decl_line */
+ .ascii "func_cu1\0" /* DW_AT_name */
+ .int .Ltype_int-.Lcu1_begin /* DW_AT_type */
+ .int .Lbegin_func_cu1 /* DW_AT_low_pc */
+ .int .Lend_func_cu1 /* DW_AT_high_pc */
+ .byte 1 /* DW_AT_frame_base: length */
+ .byte 0x55 /* DW_AT_frame_base: DW_OP_reg5 */
+
+ .Ltype_int:
+ .uleb128 3 /* Abbrev: DW_TAG_base_type */
+ .ascii "int\0" /* DW_AT_name */
+ .byte 4 /* DW_AT_byte_size */
+ .byte 5 /* DW_AT_encoding */
+
+ .byte 0 /* End of children of CU */
+
+ .Lcu1_end:
+
+ /* Abbrev table */
+ .section .debug_abbrev
+ .Labbrev1_begin:
+ .uleb128 1 /* Abbrev code */
+ .uleb128 0x11 /* DW_TAG_compile_unit */
+ .byte 1 /* has_children */
+ .uleb128 0x10 /* DW_AT_stmt_list */
+ .uleb128 0x6 /* DW_FORM_data4 */
+ .uleb128 0x43 /* DW_AT_macro_info */
+ .uleb128 0x6 /* DW_FORM_data4 */
+ .uleb128 0x12 /* DW_AT_high_pc */
+ .uleb128 0x1 /* DW_FORM_addr */
+ .uleb128 0x11 /* DW_AT_low_pc */
+ .uleb128 0x1 /* DW_FORM_addr */
+ .uleb128 0x3 /* DW_AT_name */
+ .uleb128 0x8 /* DW_FORM_string */
+ .uleb128 0x25 /* DW_AT_producer */
+ .uleb128 0x8 /* DW_FORM_string */
+ .uleb128 0x13 /* DW_AT_language */
+ .uleb128 0xb /* DW_FORM_data1 */
+ .byte 0x0 /* Terminator */
+ .byte 0x0 /* Terminator */
+
+ .uleb128 2 /* Abbrev code */
+ .uleb128 0x2e /* DW_TAG_subprogram */
+ .byte 0 /* has_children */
+ .uleb128 0x3f /* DW_AT_external */
+ .uleb128 0xc /* DW_FORM_flag */
+ .uleb128 0x3a /* DW_AT_decl_file */
+ .uleb128 0xb /* DW_FORM_data1 */
+ .uleb128 0x3b /* DW_AT_decl_line */
+ .uleb128 0xb /* DW_FORM_data1 */
+ .uleb128 0x3 /* DW_AT_name */
+ .uleb128 0x8 /* DW_FORM_string */
+ .uleb128 0x49 /* DW_AT_type */
+ .uleb128 0x13 /* DW_FORM_ref4 */
+ .uleb128 0x11 /* DW_AT_low_pc */
+ .uleb128 0x1 /* DW_FORM_addr */
+ .uleb128 0x12 /* DW_AT_high_pc */
+ .uleb128 0x1 /* DW_FORM_addr */
+ .uleb128 0x40 /* DW_AT_frame_base */
+ .uleb128 0xa /* DW_FORM_block1 */
+ .byte 0x0 /* Terminator */
+ .byte 0x0 /* Terminator */
+
+ .uleb128 3 /* Abbrev code */
+ .uleb128 0x24 /* DW_TAG_base_type */
+ .byte 0 /* has_children */
+ .uleb128 0x3 /* DW_AT_name */
+ .uleb128 0x8 /* DW_FORM_string */
+ .uleb128 0xb /* DW_AT_byte_size */
+ .uleb128 0xb /* DW_FORM_data1 */
+ .uleb128 0x3e /* DW_AT_encoding */
+ .uleb128 0xb /* DW_FORM_data1 */
+ .byte 0x0 /* Terminator */
+ .byte 0x0 /* Terminator */
+
+ .byte 0x0 /* Terminator */
+ .byte 0x0 /* Terminator */
+
+ /* Line table */
+ .section .debug_line
+ .Lline1_begin:
+ .int .Lline1_end - .Lline1_start /* Initial length */
+ .Lline1_start:
+ .short 2 /* Version */
+ .int .Lline1_lines - .Lline1_hdr /* header_length */
+ .Lline1_hdr:
+ .byte 1 /* Minimum insn length */
+ .byte 1 /* default_is_stmt */
+ .byte 1 /* line_base */
+ .byte 1 /* line_range */
+ .byte 0x10 /* opcode_base */
+
+ /* Standard lengths */
+ .byte 0
+ .byte 1
+ .byte 1
+ .byte 1
+ .byte 1
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 1
+ .byte 0
+ .byte 0
+ .byte 1
+ .byte 0
+ .byte 0
+ .byte 0
+
+ /* Include directories */
+ .byte 0
+
+ /* File names */
+ .ascii "file1.txt\0"
+ .uleb128 0
+ .uleb128 0
+ .uleb128 0
+
+ .byte 0
+
+ .Lline1_lines:
+ .byte 0 /* DW_LNE_set_address */
+ .uleb128 5
+ .byte 2
+ .int .Lbegin_func_cu1
+
+ .byte 3 /* DW_LNS_advance_line */
+ .sleb128 3 /* ... to 4 */
+
+ .byte 1 /* DW_LNS_copy */
+
+ .byte 1 /* DW_LNS_copy (second time as an end-of-prologue marker) */
+
+ .byte 0 /* DW_LNE_set_address */
+ .uleb128 5
+ .byte 2
+ .int .Lend_func_cu1
+
+ .byte 0 /* DW_LNE_end_of_sequence */
+ .uleb128 1
+ .byte 1
+
+ .Lline1_end:
+
+ .section .debug_macinfo,"",@progbits
+ .Ldebug_macinfo0:
+ .byte 0x3 # Start new file
+ .uleb128 0x0 # Included from line number 0
+ .uleb128 0x2 # Filename we just started (bug: number too large)
+ .byte 0x3 # Start new file
+ .uleb128 0x0 # Included from line number 0
+ .uleb128 0x0 # Filename we just started (bug: number too small)
+ .byte 0x0 # end of CU's macro information
Index: gdb/testsuite/gdb.dwarf2/mac-fileno.exp
===================================================================
RCS file: gdb/testsuite/gdb.dwarf2/mac-fileno.exp
diff -N gdb/testsuite/gdb.dwarf2/mac-fileno.exp
*** gdb/testsuite/gdb.dwarf2/mac-fileno.exp 1 Jan 1970 00:00:00 -0000
--- gdb/testsuite/gdb.dwarf2/mac-fileno.exp 26 Sep 2005 22:15:06 -0000
***************
*** 0 ****
--- 1,57 ----
+ # Copyright 2005 Free Software Foundation, Inc.
+
+ # This program is free software; you can redistribute it and/or modify
+ # it under the terms of the GNU General Public License as published by
+ # the Free Software Foundation; either version 2 of the License, or
+ # (at your option) any later version.
+ #
+ # This program is distributed in the hope that it will be useful,
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ # GNU General Public License for more details.
+ #
+ # You should have received a copy of the GNU General Public License
+ # along with this program; if not, write to:
+ # Free Software Foundation, Inc.
+ # 51 Franklin St., Fifth Floor
+ # Boston, MA 02110-1301
+ # USA
+
+ # Check that GDB can gracefully handle macro information that has
+ # bogus file numbers.
+
+ # This test can only be run on targets which support DWARF-2 and use gas.
+ # For now pick a sampling of likely targets.
+ if {![istarget *-*-linux*]
+ && ![istarget *-*-gnu*]
+ && ![istarget *-*-elf*]
+ && ![istarget *-*-openbsd*]
+ && ![istarget arm-*-eabi*]
+ && ![istarget powerpc-*-eabi*]} {
+ return 0
+ }
+
+ set testfile "mac-fileno"
+ set srcfile ${testfile}.S
+ set binfile ${objdir}/${subdir}/${testfile}.x
+
+ if { [gdb_compile "${srcdir}/${subdir}/main.c" "main.o" object {debug}] != "" } {
+ return -1
+ }
+
+ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${testfile}.o" object {nodebug}] != "" } {
+ return -1
+ }
+
+ if { [gdb_compile "${testfile}.o main.o" "${binfile}" executable {debug}] != "" } {
+ return -1
+ }
+
+ gdb_exit
+ gdb_start
+ gdb_reinitialize_dir $srcdir/$subdir
+ gdb_load ${binfile}
+
+ gdb_test "set listsize 1" ""
+ gdb_test "list func_cu1" "4\[ \t\]+File 1 Line 4"
+ gdb_test "ptype func_cu1" "type = int \\(\\)"