From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17301 invoked by alias); 26 Sep 2005 22:19:35 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 17160 invoked by uid 22791); 26 Sep 2005 22:19:21 -0000 Received: from nat-pool-rdu.redhat.com (HELO devserv.devel.redhat.com) (66.187.233.202) by sourceware.org (qpsmtpd/0.30-dev) with ESMTP; Mon, 26 Sep 2005 22:19:21 +0000 Received: from alligator.red-bean.com.redhat.com (vpn26-14.sfbay.redhat.com [172.16.26.14]) by devserv.devel.redhat.com (8.12.11/8.12.11) with ESMTP id j8QMJHV6000582; Mon, 26 Sep 2005 18:19:18 -0400 To: gdb-patches@sources.redhat.com Cc: ezannoni@redhat.com Subject: Re: RFA: tolerate bogus Dwarf macro info References: From: Jim Blandy Date: Mon, 26 Sep 2005 22:19:00 -0000 In-Reply-To: (Jim Blandy's message of "Mon, 26 Sep 2005 09:18:35 -0700") Message-ID: User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-SW-Source: 2005-09/txt/msg00236.txt.bz2 --=-=-= Content-length: 114 Here's a revised patch (which also checks for file numbers that are too small), and a patch for the test suite. --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=jimb.gdb-dwarf2read-tolerate-bad-macro-file-numbers.patch Content-Description: GDB patch: tolerate bad file numbers in Dwarf macro info Content-length: 2938 2005-09-26 Jim Blandy * 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, "", file); ! ! complaint (&symfile_complaints, ! _("bad file number in macro information (%d)"), ! file); ! ! return xstrdup (fake_name); } } --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=jimb.gdb-dwarf2read-tolerate-bad-macro-file-numbers-test.patch Content-Description: GDB testsuite patch: try bad file numbers in macro info Content-length: 9737 2005-09-26 Jim Blandy * 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 + + * gdb.dwarf2/mac-fileno.exp, gdb.dwarf2/mac-fileno.S: New tests. + 2005-09-26 Paul Brook * 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 \\(\\)" --=-=-=--