* stabsread, struct wipeout, missing type
@ 2004-04-01 14:23 Felix Lee
2004-04-01 20:22 ` Jim Blandy
0 siblings, 1 reply; 3+ messages in thread
From: Felix Lee @ 2004-04-01 14:23 UTC (permalink / raw)
To: gdb-patches
sometimes "ptype foo" will print "struct <unknown>" when it
should be "char *".
consider a program that has these files
ace.h:
typedef struct ace ace_t;
ace2.h:
#include "ace.h"
struct ace { const char * a_name; };
bit.c:
typedef const char * bit_t;
#include "ace2.h"
cap.c:
#include "ace2.h"
typedef const char * cap_t;
after linking, the stabs look like this:
23 BINCL 0 0 000008ab 1 bit.c
24 LSYM 0 0 00000000 767 bit_t:t(1,1)=(1,2)=*(0,2)
25 BINCL 0 0 000007f7 793 ace2.h
26 BINCL 0 0 000006cf 800 ace.h
27 LSYM 0 0 00000000 806 ace_t:t(3,1)=(3,2)=xsace:
28 EINCL 0 0 00000000 0
29 LSYM 0 0 00000000 832 ace:T(3,2)=s4a_name:(1,2),0,32;;
30 EINCL 0 0 00000000 0
56 BINCL 0 0 0000077e 878 cap.c
57 BINCL 0 0 0000090c 793 ace2.h
58 EXCL 0 0 000006cf 800 ace.h
59 LSYM 0 0 00000000 884 ace:T(3,2)=s4a_name:(2,1)=*(0,2),0,32;;
60 EINCL 0 0 00000000 0
61 LSYM 0 0 00000000 924 cap_t:t(1,1)=(2,1)
note that ace.h got EXCL'd, but ace2.h didn't,
because the stabs for ace2.h are different,
because they depend on who mentions "const char *" first.
when gdb sees the second occurrence of struct ace,
it looks up the type number (3,2),
which refers to ace.h,
which is the same as the earlier ace.h,
so gdb reuses the previously-defined ace type.
then gdb complains about struct wipeout and ignores the second definition,
which means it misses the type definition (2,1)=*(0,2),
which means cap_t uses an undefined type,
so "ptype cap_t" prints "struct <unknown>" instead of "char *".
2004-04-01 Felix Lee <felix+log1@specifixinc.com>
* stabsread.c (read_struct_type): Always read struct types,
so we don't miss any type definitions.
--- stabsread.c.~1.76.~ 2004-03-29 09:48:14.000000000 -0800
+++ stabsread.c 2004-03-30 08:56:05.000000000 -0800
@@ -3334,14 +3334,18 @@ read_struct_type (char **pp, struct type
Obviously, GDB can't fix this by itself, but it can at least avoid
scribbling on existing structure type objects when new definitions
- appear. */
+ appear.
+
+ GDB has to read the struct type in any case, since it may contain
+ definitions of other types that will be needed elsewhere. Creating a
+ new type is not really the right thing to do, but it's better than
+ nothing. */
+
if (! (TYPE_CODE (type) == TYPE_CODE_UNDEF
|| TYPE_STUB (type)))
{
complain_about_struct_wipeout (type);
-
- /* It's probably best to return the type unchanged. */
- return type;
+ type = alloc_type (TYPE_OBJFILE (type));
}
back_to = make_cleanup (null_cleanup, 0);
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: stabsread, struct wipeout, missing type
2004-04-01 14:23 stabsread, struct wipeout, missing type Felix Lee
@ 2004-04-01 20:22 ` Jim Blandy
2004-04-02 22:17 ` Jim Blandy
0 siblings, 1 reply; 3+ messages in thread
From: Jim Blandy @ 2004-04-01 20:22 UTC (permalink / raw)
To: Felix Lee; +Cc: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 2140 bytes --]
Felix Lee <felix@specifixinc.com> writes:
> when gdb sees the second occurrence of struct ace,
> it looks up the type number (3,2),
> which refers to ace.h,
> which is the same as the earlier ace.h,
> so gdb reuses the previously-defined ace type.
>
> then gdb complains about struct wipeout and ignores the second definition,
> which means it misses the type definition (2,1)=*(0,2),
> which means cap_t uses an undefined type,
> so "ptype cap_t" prints "struct <unknown>" instead of "char *".
Wow, great find.
I don't think the patch is the whole story, though. Consider this
case:
$ cat h1.h
typedef struct a a_t;
$ cat c1.c
#include "h1.h"
struct a
{
int x, y;
};
a_t v2;
int
main ()
{
}
$ cat c2.c
#include "h1.h"
struct a
{
double c, d;
};
a_t v1;
$ gcc33 gcc c1.c c2.c -o c -gstabs+
$ gdb c
GNU gdb 2004-02-17-cvs
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) ptype v1
During symbol reading, struct/union type gets multiply defined: struct a.
type = struct a {
int x;
int y;
}
(gdb) ptype v2
type = struct a {
int x;
int y;
}
(gdb)
I think it's just wrong for GDB to be re-using incomplete types from
EXCL'd header files. Because C has no global names rule like C++ (I
forget what it's really called), there's no guarantee that the type
is actually the same.
As far as I can see, GDB has always done this. I can't believe it's
never been noticed before.
I've attached a test case for both the problem you reported, and the
problem I describe above. It's got a kfail for my problem, but I
don't have a PR number yet for yours (I filed it as as separate PR,
since the fix will be separate).
I think your fix looks good. We don't have a copyright assignment on
file for you; I'll get that started off-list.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Test case for bug in this and prev message --]
[-- Type: text/x-patch, Size: 3903 bytes --]
2004-04-01 Jim Blandy <jimb@redhat.com>
* gdb.stabs/exclfwd.exp, gdb.stabs/exclfwd1.c,
gdb.stabs/exclfwd2.c, gdb.stabs/exclfwd.h: New test.
Index: gdb/testsuite/gdb.stabs/exclfwd.exp
===================================================================
RCS file: gdb/testsuite/gdb.stabs/exclfwd.exp
diff -N gdb/testsuite/gdb.stabs/exclfwd.exp
*** gdb/testsuite/gdb.stabs/exclfwd.exp 1 Jan 1970 00:00:00 -0000
--- gdb/testsuite/gdb.stabs/exclfwd.exp 1 Apr 2004 20:13:05 -0000
***************
*** 0 ****
--- 1,68 ----
+ # Copyright 2004 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 the Free Software
+ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ # Please email any bugs, comments, and/or additions to this file to:
+ # bug-gdb@gnu.org
+
+ if $tracelevel {
+ strace $tracelevel
+ }
+
+ #
+ # test running programs
+ #
+ set prms_id 0
+ set bug_id 0
+
+ set testfile exclfwd
+ set binfile ${objdir}/${subdir}/${testfile}
+
+ foreach file {exclfwd1 exclfwd2} {
+ if {[gdb_compile "${srcdir}/${subdir}/${file}.c" "${file}.o" object {debug}] != ""} {
+ gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+ }
+ }
+
+ if {[gdb_compile "exclfwd1.o exclfwd2.o" ${binfile} executable {debug}] != "" } {
+ gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+ }
+
+ gdb_exit
+ gdb_start
+ gdb_reinitialize_dir $srcdir/$subdir
+ gdb_load ${binfile}
+
+ if ![runto_main] then {
+ perror "couldn't run to breakpoint"
+ continue
+ }
+
+ get_debug_format
+
+ set eol "\[ \t\]*\[\n\r\]+"
+
+ gdb_test "ptype v1" "type = struct a {$eol
+ int x;$eol
+ int y;$eol
+ }$eol"
+
+ if { [test_debug_format "stabs"] } then {
+ setup_kfail "gdb/1602" *-*-*
+ }
+ gdb_test "ptype v2" "type = struct a {$eol
+ const char .c;$eol
+ }$eol"
+ gdb_test "ptype v3" "type = const char ."
Index: gdb/testsuite/gdb.stabs/exclfwd.h
===================================================================
RCS file: gdb/testsuite/gdb.stabs/exclfwd.h
diff -N gdb/testsuite/gdb.stabs/exclfwd.h
*** gdb/testsuite/gdb.stabs/exclfwd.h 1 Jan 1970 00:00:00 -0000
--- gdb/testsuite/gdb.stabs/exclfwd.h 1 Apr 2004 20:13:05 -0000
***************
*** 0 ****
--- 1 ----
+ typedef struct a a_t;
Index: gdb/testsuite/gdb.stabs/exclfwd1.c
===================================================================
RCS file: gdb/testsuite/gdb.stabs/exclfwd1.c
diff -N gdb/testsuite/gdb.stabs/exclfwd1.c
*** gdb/testsuite/gdb.stabs/exclfwd1.c 1 Jan 1970 00:00:00 -0000
--- gdb/testsuite/gdb.stabs/exclfwd1.c 1 Apr 2004 20:13:05 -0000
***************
*** 0 ****
--- 1,14 ----
+ #include "exclfwd.h"
+
+ struct a
+ {
+ int x, y;
+ };
+
+ a_t v1;
+
+ int
+ main ()
+ {
+ }
+
Index: gdb/testsuite/gdb.stabs/exclfwd2.c
===================================================================
RCS file: gdb/testsuite/gdb.stabs/exclfwd2.c
diff -N gdb/testsuite/gdb.stabs/exclfwd2.c
*** gdb/testsuite/gdb.stabs/exclfwd2.c 1 Jan 1970 00:00:00 -0000
--- gdb/testsuite/gdb.stabs/exclfwd2.c 1 Apr 2004 20:13:05 -0000
***************
*** 0 ****
--- 1,9 ----
+ #include "exclfwd.h"
+
+ struct a
+ {
+ const char *c;
+ };
+
+ a_t v2;
+ const char *v3;
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: stabsread, struct wipeout, missing type
2004-04-01 20:22 ` Jim Blandy
@ 2004-04-02 22:17 ` Jim Blandy
0 siblings, 0 replies; 3+ messages in thread
From: Jim Blandy @ 2004-04-02 22:17 UTC (permalink / raw)
To: Felix Lee; +Cc: gdb-patches
Jim Blandy <jimb@redhat.com> writes:
> I think your fix looks good. We don't have a copyright assignment on
> file for you; I'll get that started off-list.
Actually, we do have a copyright assignment on file for you. Please
add yourself to the Write After Approval list in gdb/MAINTAINERS and
then, as a separate commit, commit your patch.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2004-04-02 22:17 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-04-01 14:23 stabsread, struct wipeout, missing type Felix Lee
2004-04-01 20:22 ` Jim Blandy
2004-04-02 22:17 ` Jim Blandy
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox