]> git.pld-linux.org Git - packages/gdb.git/blame - gdb-gcc46-typedef.patch
- added devel deps for gdb-lib
[packages/gdb.git] / gdb-gcc46-typedef.patch
CommitLineData
6ed6bacf
AM
1http://sourceware.org/ml/gdb-patches/2011-04/msg00154.html
2Subject: [patch] Workaround buggy GCC PR 47510 produced code
3
4Hi,
5
6GCC PR debug/47510 is already fixed and GDB has the proper support for it:
7 RFC: update for GCC PR 47510
8 http://sourceware.org/ml/gdb-patches/2011-03/msg00916.html
9
10Still FSF GDB HEAD will crash on a binary produced by older/buggy GCC:
11 Reading symbols from .../gcc46.o...dwarf2read.c:9329: internal-error: could not find partial DIE 0x9a in cache [from module .../gcc46.o]
12
13Which may not give much clue to the user.
14
15The proposed patch could make false warnings if any code out there has
16DW_TAG_typedef with children, it does not check for specific GCC versions.
17Still such DWARF is invalid, although in such case complaint() would be more
18appropriate than warning(). Does it make sense to differentiate it?
19
20No regressions on {x86_64,x86_64-m32,i686}-fedora15-linux-gnu.
21
22
23Thanks,
24Jan
25
26
27gdb/
282011-04-11 Jan Kratochvil <jan.kratochvil@redhat.com>
29
30 * dwarf2read.c (struct dwarf2_per_objfile): New field
31 typedef_children_warning_printed.
32 (load_partial_dies): Read in any children of DW_TAG_typedef with
33 a warning in such case.
34
35gdb/testsuite/
362011-04-11 Jan Kratochvil <jan.kratochvil@redhat.com>
37
38 * gdb.dwarf2/dw2-typedef-children.S: New file.
39 * gdb.dwarf2/dw2-typedef-children.exp: New file.
40
41--- a/gdb/dwarf2read.c
42+++ b/gdb/dwarf2read.c
43@@ -209,6 +209,9 @@ struct dwarf2_per_objfile
44 or we are faking it for OBJF_READNOW's sake. */
45 unsigned char using_index;
46
47+ /* Print the GCC PR debug/47510 warning only once per objfile. */
48+ unsigned typedef_children_warning_printed : 1;
49+
50 /* The mapped index, or NULL if .gdb_index is missing or not being used. */
51 struct mapped_index *index_table;
52
53@@ -8951,7 +8954,7 @@ load_partial_dies (bfd *abfd, gdb_byte *buffer, gdb_byte *info_ptr,
54 if (parent_die == NULL
55 && part_die->has_specification == 0
56 && part_die->is_declaration == 0
57- && (part_die->tag == DW_TAG_typedef
58+ && ((part_die->tag == DW_TAG_typedef && !part_die->has_children)
59 || part_die->tag == DW_TAG_base_type
60 || part_die->tag == DW_TAG_subrange_type))
61 {
62@@ -8964,6 +8967,20 @@ load_partial_dies (bfd *abfd, gdb_byte *buffer, gdb_byte *info_ptr,
63 continue;
64 }
65
66+ /* The exception for DW_TAG_typedef with has_children above is
67+ a workaround of GCC PR debug/47510. GDB crashed on broken GCC output
68+ as it skipped children of DW_TAG_typedef by the shortcut above and
69+ then it could not find the child DIEs referenced later. */
70+
71+ if (!dwarf2_per_objfile->typedef_children_warning_printed
72+ && part_die->tag == DW_TAG_typedef && part_die->has_children)
73+ {
74+ warning (_("DW_TAG_typedef has childen - GCC PR debug/47510 bug "
75+ "- DIE at 0x%x [in module %s]"),
76+ part_die->offset, cu->objfile->name);
77+ dwarf2_per_objfile->typedef_children_warning_printed = 1;
78+ }
79+
80 /* If we're at the second level, and we're an enumerator, and
81 our parent has no specification (meaning possibly lives in a
82 namespace elsewhere), then we can add the partial symbol now
83--- /dev/null
84+++ b/gdb/testsuite/gdb.dwarf2/dw2-typedef-children.S
85@@ -0,0 +1,92 @@
86+/* This testcase is part of GDB, the GNU debugger.
87+
88+ Copyright 2011 Free Software Foundation, Inc.
89+
90+ This program is free software; you can redistribute it and/or modify
91+ it under the terms of the GNU General Public License as published by
92+ the Free Software Foundation; either version 3 of the License, or
93+ (at your option) any later version.
94+
95+ This program is distributed in the hope that it will be useful,
96+ but WITHOUT ANY WARRANTY; without even the implied warranty of
97+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
98+ GNU General Public License for more details.
99+
100+ You should have received a copy of the GNU General Public License
101+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
102+
103+/* Debug information */
104+
105+ .section .debug_info
106+.Lcu1_begin:
107+ /* CU header */
108+ .4byte .Lcu1_end - .Lcu1_start /* Length of Compilation Unit */
109+.Lcu1_start:
110+ .2byte 2 /* DWARF Version */
111+ .4byte .Labbrev1_begin /* Offset into abbrev section */
112+ .byte 4 /* Pointer size */
113+
114+ /* CU die */
115+ .uleb128 1 /* Abbrev: DW_TAG_compile_unit */
116+ .ascii "file1.txt\0" /* DW_AT_name */
117+ .ascii "GNU C 3.3.3\0" /* DW_AT_producer */
118+ .byte 1 /* DW_AT_language (C) */
119+
120+.Ltype_int:
121+ .uleb128 2 /* Abbrev: DW_TAG_base_type */
122+ .ascii "int\0" /* DW_AT_name */
123+ .byte 4 /* DW_AT_byte_size */
124+ .byte 5 /* DW_AT_encoding */
125+
126+ .uleb128 0x3 /* (DIE (0x38) DW_TAG_typedef) */
127+ .ascii "new\0" /* DW_AT_name */
128+ .long .Ltype_int - .Lcu1_begin /* DW_AT_type */
129+
130+ .uleb128 2 /* Abbrev: DW_TAG_base_type */
131+ .ascii "int\0" /* DW_AT_name */
132+ .byte 4 /* DW_AT_byte_size */
133+ .byte 5 /* DW_AT_encoding */
134+
135+ .uleb128 0 /* End of DW_TAG_typedef */
136+ .uleb128 0 /* End of DW_TAG_compile_unit */
137+.Lcu1_end:
138+
139+/* Abbrev table */
140+ .section .debug_abbrev
141+.Labbrev1_begin:
142+ .uleb128 1 /* Abbrev code */
143+ .uleb128 0x11 /* DW_TAG_compile_unit */
144+ .byte 1 /* has_children */
145+ .uleb128 0x3 /* DW_AT_name */
146+ .uleb128 0x8 /* DW_FORM_string */
147+ .uleb128 0x25 /* DW_AT_producer */
148+ .uleb128 0x8 /* DW_FORM_string */
149+ .uleb128 0x13 /* DW_AT_language */
150+ .uleb128 0xb /* DW_FORM_data1 */
151+ .byte 0x0 /* Terminator */
152+ .byte 0x0 /* Terminator */
153+
154+ .uleb128 2 /* Abbrev code */
155+ .uleb128 0x24 /* DW_TAG_base_type */
156+ .byte 0 /* has_children */
157+ .uleb128 0x3 /* DW_AT_name */
158+ .uleb128 0x8 /* DW_FORM_string */
159+ .uleb128 0xb /* DW_AT_byte_size */
160+ .uleb128 0xb /* DW_FORM_data1 */
161+ .uleb128 0x3e /* DW_AT_encoding */
162+ .uleb128 0xb /* DW_FORM_data1 */
163+ .byte 0x0 /* Terminator */
164+ .byte 0x0 /* Terminator */
165+
166+ .uleb128 0x3 /* (abbrev code) */
167+ .uleb128 0x16 /* (TAG: DW_TAG_typedef) */
168+ .byte 0x1 /* DW_children_yes */
169+ .uleb128 0x3 /* (DW_AT_name) */
170+ .uleb128 0x8 /* (DW_FORM_string) */
171+ .uleb128 0x49 /* (DW_AT_type) */
172+ .uleb128 0x13 /* (DW_FORM_ref4) */
173+ .byte 0x0
174+ .byte 0x0
175+
176+ .byte 0x0 /* Terminator */
177+ .byte 0x0 /* Terminator */
178--- /dev/null
179+++ b/gdb/testsuite/gdb.dwarf2/dw2-typedef-children.exp
180@@ -0,0 +1,37 @@
181+# Copyright 2011 Free Software Foundation, Inc.
182+
183+# This program is free software; you can redistribute it and/or modify
184+# it under the terms of the GNU General Public License as published by
185+# the Free Software Foundation; either version 3 of the License, or
186+# (at your option) any later version.
187+#
188+# This program is distributed in the hope that it will be useful,
189+# but WITHOUT ANY WARRANTY; without even the implied warranty of
190+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
191+# GNU General Public License for more details.
192+#
193+# You should have received a copy of the GNU General Public License
194+# along with this program. If not, see <http://www.gnu.org/licenses/>.
195+load_lib dwarf.exp
196+
197+# Note: Inspired from dw2-basic.exp.
198+
199+# This test can only be run on targets which support DWARF-2 and use gas.
200+if {![dwarf2_support]} {
201+ return 0
202+}
203+
204+set testfile "dw2-typedef-children"
205+set srcfile ${testfile}.S
206+set binfile ${objdir}/${subdir}/${testfile}.x
207+
208+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" object {nodebug}] != "" } {
209+ return -1
210+}
211+
212+gdb_exit
213+gdb_start
214+
215+gdb_test "file $binfile" \
216+ "warning: DW_TAG_typedef has childen - GCC PR debug/47510 bug - DIE at .*" \
217+ "warning message"
218
This page took 0.39462 seconds and 4 git commands to generate.