* [RFA] varobj: call CHECK_TYPEDEF
@ 2003-04-24 20:47 Keith Seitz
2003-04-24 20:52 ` Daniel Jacobowitz
[not found] ` <3EA84A9B.5020308@redhat.com>
0 siblings, 2 replies; 21+ messages in thread
From: Keith Seitz @ 2003-04-24 20:47 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 495 bytes --]
Hi,
Well, I am not really sure what this does, or why it is necessary
(check_typedef has no comment in gdbtypes.c), but it's what type_print
code does.
Occasionally, some (C++?) files can show no child objects because
nfields will be zero. After calling CHECK_TYPEDEF, nfields is suddenly
non-zero.
This was first reported as insight/219.
Keith
ChangeLog
2003-04-24 Keith Seitz <keiths@redhat.com>
* varobj.c (get_type): Call CHECK_TYPEDEF.
(get_type_deref): Likewise.
[-- Attachment #2: varobj-check_typedef.patch --]
[-- Type: text/x-patch, Size: 651 bytes --]
Index: varobj.c
===================================================================
RCS file: /cvs/src/src/gdb/varobj.c,v
retrieving revision 1.38
diff -u -p -r1.38 varobj.c
--- varobj.c 4 Dec 2002 00:05:54 -0000 1.38
+++ varobj.c 24 Apr 2003 20:12:52 -0000
@@ -1394,6 +1394,7 @@ get_type (struct varobj *var)
while (type != NULL && TYPE_CODE (type) == TYPE_CODE_TYPEDEF)
type = TYPE_TARGET_TYPE (type);
+ CHECK_TYPEDEF (type);
return type;
}
@@ -1409,6 +1410,7 @@ get_type_deref (struct varobj *var)
|| TYPE_CODE (type) == TYPE_CODE_REF))
type = get_target_type (type);
+ CHECK_TYPEDEF (type);
return type;
}
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-04-24 20:47 [RFA] varobj: call CHECK_TYPEDEF Keith Seitz @ 2003-04-24 20:52 ` Daniel Jacobowitz 2003-04-24 21:51 ` Keith Seitz [not found] ` <3EA84A9B.5020308@redhat.com> 1 sibling, 1 reply; 21+ messages in thread From: Daniel Jacobowitz @ 2003-04-24 20:52 UTC (permalink / raw) To: Keith Seitz; +Cc: gdb-patches On Thu, Apr 24, 2003 at 01:16:38PM -0700, Keith Seitz wrote: > Hi, > > Well, I am not really sure what this does, or why it is necessary > (check_typedef has no comment in gdbtypes.c), but it's what type_print > code does. > > Occasionally, some (C++?) files can show no child objects because > nfields will be zero. After calling CHECK_TYPEDEF, nfields is suddenly > non-zero. > > This was first reported as insight/219. CHECK_TYPEDEF does just about what the name suggests - it replaces a TYPE_CODE_TYPEDEF type with the type (TYPE_CODE_STRUCT in this case) that it points to. Feel free to add a comment to that effect. The question is whether the caller of get_type ever wants the typedef; depending on how it's used these calls may belong in particular callers, not in get_type. > > Keith > > ChangeLog > 2003-04-24 Keith Seitz <keiths@redhat.com> > > * varobj.c (get_type): Call CHECK_TYPEDEF. > (get_type_deref): Likewise. > > > Index: varobj.c > =================================================================== > RCS file: /cvs/src/src/gdb/varobj.c,v > retrieving revision 1.38 > diff -u -p -r1.38 varobj.c > --- varobj.c 4 Dec 2002 00:05:54 -0000 1.38 > +++ varobj.c 24 Apr 2003 20:12:52 -0000 > @@ -1394,6 +1394,7 @@ get_type (struct varobj *var) > while (type != NULL && TYPE_CODE (type) == TYPE_CODE_TYPEDEF) > type = TYPE_TARGET_TYPE (type); > > + CHECK_TYPEDEF (type); > return type; > } > > @@ -1409,6 +1410,7 @@ get_type_deref (struct varobj *var) > || TYPE_CODE (type) == TYPE_CODE_REF)) > type = get_target_type (type); > > + CHECK_TYPEDEF (type); > return type; > } > -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-04-24 20:52 ` Daniel Jacobowitz @ 2003-04-24 21:51 ` Keith Seitz 2003-04-24 21:55 ` Daniel Jacobowitz 0 siblings, 1 reply; 21+ messages in thread From: Keith Seitz @ 2003-04-24 21:51 UTC (permalink / raw) To: gdb-patches On Thu, 2003-04-24 at 13:18, Daniel Jacobowitz wrote: > CHECK_TYPEDEF does just about what the name suggests - it replaces a > TYPE_CODE_TYPEDEF type with the type (TYPE_CODE_STRUCT in this case) > that it points to. Feel free to add a comment to that effect. Ah! Duh! :-) > The question is whether the caller of get_type ever wants the typedef; > depending on how it's used these calls may belong in particular > callers, not in get_type. Hmm. Ok, well I would think that varobj would not want the typedef. For example, if we have, "typedef struct foo Bar" and I declare a variable of type Bar, varobj should report the number of children as the number of children of the struct itself, not the typedef. get_type and get_target_type already explicitly bypass TYPE_CODE_TYPEDEF. Now the real ambiguity is: where to put this in varobj's case? Since get_type (and consequently get_target_type and get_type_deref) are used all over the place, so we would want to use CHECK_TYPEDEF there. But how to not call it when not necessary? In the case I'm currently working on, the TYPE_CODE (type) is TYPE_CODE_PTR and TYPE_CODE (TYPE_TARGET_TYPE (type)) is TYPE_CODE_STRUCT. Perhaps there is something else I'm missing? (Of course, this is still how whatis_command does it...) ?? Keith ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-04-24 21:51 ` Keith Seitz @ 2003-04-24 21:55 ` Daniel Jacobowitz 2003-04-24 22:18 ` Keith Seitz 0 siblings, 1 reply; 21+ messages in thread From: Daniel Jacobowitz @ 2003-04-24 21:55 UTC (permalink / raw) To: Keith Seitz; +Cc: gdb-patches On Thu, Apr 24, 2003 at 01:46:55PM -0700, Keith Seitz wrote: > On Thu, 2003-04-24 at 13:18, Daniel Jacobowitz wrote: > > CHECK_TYPEDEF does just about what the name suggests - it replaces a > > TYPE_CODE_TYPEDEF type with the type (TYPE_CODE_STRUCT in this case) > > that it points to. Feel free to add a comment to that effect. > > Ah! Duh! :-) > > > The question is whether the caller of get_type ever wants the typedef; > > depending on how it's used these calls may belong in particular > > callers, not in get_type. > > Hmm. Ok, well I would think that varobj would not want the typedef. For > example, if we have, "typedef struct foo Bar" and I declare a variable > of type Bar, varobj should report the number of children as the number > of children of the struct itself, not the typedef. get_type and > get_target_type already explicitly bypass TYPE_CODE_TYPEDEF. > > Now the real ambiguity is: where to put this in varobj's case? Since > get_type (and consequently get_target_type and get_type_deref) are used > all over the place, so we would want to use CHECK_TYPEDEF there. But how > to not call it when not necessary? In the case I'm currently working on, > the TYPE_CODE (type) is TYPE_CODE_PTR and TYPE_CODE (TYPE_TARGET_TYPE > (type)) is TYPE_CODE_STRUCT. Perhaps there is something else I'm > missing? (Of course, this is still how whatis_command does it...) The important question is whether get_type is ever used to display the object's type; in which case we should say Bar, not "struct foo". I haven't looked at where it's used, so I don't know. -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-04-24 21:55 ` Daniel Jacobowitz @ 2003-04-24 22:18 ` Keith Seitz 0 siblings, 0 replies; 21+ messages in thread From: Keith Seitz @ 2003-04-24 22:18 UTC (permalink / raw) To: gdb-patches On Thu, 2003-04-24 at 13:47, Daniel Jacobowitz wrote: > The important question is whether get_type is ever used to display the > object's type; in which case we should say Bar, not "struct foo". Yes, I think this is already a buglet in varobj. Now that I understand the whole CHECK_TYPEDEF thing, I'll file a bug report for it. Keith ^ permalink raw reply [flat|nested] 21+ messages in thread
[parent not found: <3EA84A9B.5020308@redhat.com>]
* Re: [RFA] varobj: call CHECK_TYPEDEF [not found] ` <3EA84A9B.5020308@redhat.com> @ 2003-04-24 22:27 ` Keith Seitz 2003-04-24 22:31 ` Andrew Cagney 0 siblings, 1 reply; 21+ messages in thread From: Keith Seitz @ 2003-04-24 22:27 UTC (permalink / raw) To: gdb-patches [-- Attachment #1: Type: text/plain, Size: 489 bytes --] On Thu, 2003-04-24 at 13:35, Andrew Cagney wrote: > Don't forget a gdb.mi/insight219 testcase. Doh! How about the attached? (This is the minimal test that I could get to reproduce it. It must use multiple files. That's why it never showed up before, apparently.) Keith testsuite/gdb.mi/ChangeLog 2003-04-24 Keith Seitz <keiths@redhat.com> * insight219.exp: New test. * insight219.cc: New file. * insight219.h: New file. * insight219-b.cc: New file. [-- Attachment #2: insight219-test.patch --] [-- Type: text/x-patch, Size: 2910 bytes --] Index: insight219-b.cc =================================================================== RCS file: insight219-b.cc diff -N insight219-b.cc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ insight219-b.cc 24 Apr 2003 21:54:00 -0000 @@ -0,0 +1,4 @@ +#include "insight219.h" + +B::~B() {} + Index: insight219.cc =================================================================== RCS file: insight219.cc diff -N insight219.cc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ insight219.cc 24 Apr 2003 21:54:00 -0000 @@ -0,0 +1,8 @@ +#include "insight219.h" + +int +main(int argc, char *argv[]) +{ + B *b = new B(); + return 0; +}; Index: insight219.exp =================================================================== RCS file: insight219.exp diff -N insight219.exp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ insight219.exp 24 Apr 2003 21:54:00 -0000 @@ -0,0 +1,61 @@ +# Copyright 2003 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@prep.ai.mit.edu + +# +# test insight/792 +# + +if { [skip_cplus_tests] } { continue } + +load_lib mi-support.exp +set MIFLAGS "-i=mi" + +gdb_exit +if [mi_gdb_start] { + continue +} + +set testfile insight219 +set srcfiles [list insight219.cc insight219-b.cc] +set binfile $objdir/$subdir/$testfile + +if [get_compiler_info ${binfile} "c++"] { + return -1; +} + +set srcs "" +foreach srcfile $srcfiles { + set srcs "$srcs $srcdir/$subdir/$srcfile" +} + +if {[gdb_compile $srcs $binfile executable {debug c++}] != ""} { + gdb_suppress_entire_file "Testcase compile failed, so all test in this file will automatically fail." +} + +# Test that children of classes are properly reported + +# Run to main +mi_run_to_main + +mi_gdb_test "-var-create - * b" \ + "(&\".*\"\r\n)*\\^done,name=\"var1\",numchild=\"1\",type=\"class B \\\*\"" \ + "create var for class B" + +mi_gdb_exit +return 0 Index: insight219.h =================================================================== RCS file: insight219.h diff -N insight219.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ insight219.h 24 Apr 2003 21:54:00 -0000 @@ -0,0 +1,8 @@ +class B +{ +public: + virtual ~B(); + +private: + int b; +}; ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-04-24 22:27 ` Keith Seitz @ 2003-04-24 22:31 ` Andrew Cagney 2003-04-25 0:18 ` Keith Seitz 2003-06-11 20:07 ` Keith Seitz 0 siblings, 2 replies; 21+ messages in thread From: Andrew Cagney @ 2003-04-24 22:31 UTC (permalink / raw) To: Keith Seitz; +Cc: gdb-patches > On Thu, 2003-04-24 at 13:35, Andrew Cagney wrote: > > >> Don't forget a gdb.mi/insight219 testcase. > > > Doh! How about the attached? (This is the minimal test that I could get > to reproduce it. It must use multiple files. That's why it never showed > up before, apparently.) Yes, anything like that. BTW, does ... struct t { int a; int b; }; typedef struct t T; main() { static T v = {...}; } tickle it? > Index: insight219-b.cc > =================================================================== > RCS file: insight219-b.cc > diff -N insight219-b.cc > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ insight219-b.cc 24 Apr 2003 21:54:00 -0000 > @@ -0,0 +1,4 @@ > +#include "insight219.h" > + > +B::~B() {} > + > Index: insight219.cc > =================================================================== > RCS file: insight219.cc > diff -N insight219.cc > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ insight219.cc 24 Apr 2003 21:54:00 -0000 > @@ -0,0 +1,8 @@ > +#include "insight219.h" > + > +int > +main(int argc, char *argv[]) > +{ > + B *b = new B(); > + return 0; > +}; > Index: insight219.h > =================================================================== > RCS file: insight219.h > diff -N insight219.h > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ insight219.h 24 Apr 2003 21:54:00 -0000 > @@ -0,0 +1,8 @@ > +class B > +{ > +public: > + virtual ~B(); > + > +private: > + int b; > +}; ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-04-24 22:31 ` Andrew Cagney @ 2003-04-25 0:18 ` Keith Seitz 2003-04-25 2:15 ` Daniel Jacobowitz 2003-06-11 20:07 ` Keith Seitz 1 sibling, 1 reply; 21+ messages in thread From: Keith Seitz @ 2003-04-25 0:18 UTC (permalink / raw) To: Andrew Cagney; +Cc: gdb-patches On Thu, 2003-04-24 at 15:18, Andrew Cagney wrote: > BTW, does ... > > struct t > { > int a; > int b; > }; > > typedef struct t T; > > main() > { > static T v = {...}; > } > > tickle it? Nope, that works properly (except for it being reported as "struct t" instead of "T"). Keith ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-04-25 0:18 ` Keith Seitz @ 2003-04-25 2:15 ` Daniel Jacobowitz 2003-04-25 3:47 ` Andrew Cagney 0 siblings, 1 reply; 21+ messages in thread From: Daniel Jacobowitz @ 2003-04-25 2:15 UTC (permalink / raw) To: Keith Seitz; +Cc: Andrew Cagney, gdb-patches On Thu, Apr 24, 2003 at 03:29:36PM -0700, Keith Seitz wrote: > On Thu, 2003-04-24 at 15:18, Andrew Cagney wrote: > > BTW, does ... > > > > struct t > > { > > int a; > > int b; > > }; > > > > typedef struct t T; > > > > main() > > { > > static T v = {...}; > > } > > > > tickle it? > > Nope, that works properly (except for it being reported as "struct t" > instead of "T"). [Keith, you had "test for insight/792" in your posted testsuite patch.] There's at least one compiler bug in this area, where DWARF-2 debug info will say struct t instead of T. I fixed it for 3.3 and (I think?) 3.2.3. Just in case you start getting confused :) -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-04-25 2:15 ` Daniel Jacobowitz @ 2003-04-25 3:47 ` Andrew Cagney 2003-04-25 5:32 ` Daniel Jacobowitz 0 siblings, 1 reply; 21+ messages in thread From: Andrew Cagney @ 2003-04-25 3:47 UTC (permalink / raw) To: Daniel Jacobowitz; +Cc: Keith Seitz, gdb-patches > On Thu, Apr 24, 2003 at 03:29:36PM -0700, Keith Seitz wrote: > >> On Thu, 2003-04-24 at 15:18, Andrew Cagney wrote: > >> > BTW, does ... >> > >> > struct t >> > { >> > int a; >> > int b; >> > }; >> > >> > typedef struct t T; >> > >> > main() >> > { >> > static T v = {...}; >> > } >> > >> > tickle it? > >> >> Nope, that works properly (except for it being reported as "struct t" >> instead of "T"). > > > [Keith, you had "test for insight/792" in your posted testsuite patch.] > > There's at least one compiler bug in this area, where DWARF-2 debug info > will say struct t instead of T. I fixed it for 3.3 and (I think?) > 3.2.3. Just in case you start getting confused :) So, rather than `bug', `probable gcc bug'? Andrew ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-04-25 3:47 ` Andrew Cagney @ 2003-04-25 5:32 ` Daniel Jacobowitz 0 siblings, 0 replies; 21+ messages in thread From: Daniel Jacobowitz @ 2003-04-25 5:32 UTC (permalink / raw) To: Andrew Cagney; +Cc: Keith Seitz, gdb-patches On Thu, Apr 24, 2003 at 10:15:06PM -0400, Andrew Cagney wrote: > >On Thu, Apr 24, 2003 at 03:29:36PM -0700, Keith Seitz wrote: > > > >>On Thu, 2003-04-24 at 15:18, Andrew Cagney wrote: > > > >>> BTW, does ... > >>> > >>> struct t > >>> { > >>> int a; > >>> int b; > >>> }; > >>> > >>> typedef struct t T; > >>> > >>> main() > >>> { > >>> static T v = {...}; > >>> } > >>> > >>> tickle it? > > > >> > >>Nope, that works properly (except for it being reported as "struct t" > >>instead of "T"). > > > > > >[Keith, you had "test for insight/792" in your posted testsuite patch.] > > > >There's at least one compiler bug in this area, where DWARF-2 debug info > >will say struct t instead of T. I fixed it for 3.3 and (I think?) > >3.2.3. Just in case you start getting confused :) > > So, rather than `bug', `probable gcc bug'? Depends, I imagine GDB has bugs here too. Someone should try Keith's testcase with a fixed GCC I suppose. (If your compiler has the bug it will show up in the MI testsuite already; don't remember exactly where.) -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-04-24 22:31 ` Andrew Cagney 2003-04-25 0:18 ` Keith Seitz @ 2003-06-11 20:07 ` Keith Seitz 2003-06-11 21:01 ` Andrew Cagney 2003-06-11 23:51 ` David Carlton 1 sibling, 2 replies; 21+ messages in thread From: Keith Seitz @ 2003-06-11 20:07 UTC (permalink / raw) To: Andrew Cagney; +Cc: gdb-patches On Thu, 2003-04-24 at 15:18, Andrew Cagney wrote: So where do we stand with this? Shall I check it in and deal with the fallout? (I need to go through and double-check all the typedef stuff in varobj anyway, but at least this will allow users to use varobj, even if it isn't cosmetically perfect.) Keith > > Index: insight219-b.cc > > =================================================================== > > RCS file: insight219-b.cc > > diff -N insight219-b.cc > > --- /dev/null 1 Jan 1970 00:00:00 -0000 > > +++ insight219-b.cc 24 Apr 2003 21:54:00 -0000 > > @@ -0,0 +1,4 @@ > > +#include "insight219.h" > > + > > +B::~B() {} > > + > > > > Index: insight219.cc > > =================================================================== > > RCS file: insight219.cc > > diff -N insight219.cc > > --- /dev/null 1 Jan 1970 00:00:00 -0000 > > +++ insight219.cc 24 Apr 2003 21:54:00 -0000 > > @@ -0,0 +1,8 @@ > > +#include "insight219.h" > > + > > +int > > +main(int argc, char *argv[]) > > +{ > > + B *b = new B(); > > + return 0; > > +}; > > Index: insight219.h > > =================================================================== > > RCS file: insight219.h > > diff -N insight219.h > > --- /dev/null 1 Jan 1970 00:00:00 -0000 > > +++ insight219.h 24 Apr 2003 21:54:00 -0000 > > @@ -0,0 +1,8 @@ > > +class B > > +{ > > +public: > > + virtual ~B(); > > + > > +private: > > + int b; > > +}; > > ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-06-11 20:07 ` Keith Seitz @ 2003-06-11 21:01 ` Andrew Cagney 2003-06-11 23:51 ` David Carlton 1 sibling, 0 replies; 21+ messages in thread From: Andrew Cagney @ 2003-06-11 21:01 UTC (permalink / raw) To: Keith Seitz; +Cc: gdb-patches [-- Attachment #1: Type: text/plain, Size: 52 bytes --] Er, this is C++, Daniel, David or MichaelC? Andrew [-- Attachment #2: mailbox-message://ac131313@movemail/fsf/gdb/patches#15270852 --] [-- Type: message/rfc822, Size: 3081 bytes --] From: Keith Seitz <keiths@redhat.com> To: Andrew Cagney <ac131313@redhat.com> Cc: "gdb-patches@sources.redhat.com" <gdb-patches@sources.redhat.com> Subject: Re: [RFA] varobj: call CHECK_TYPEDEF Date: 11 Jun 2003 13:15:10 -0700 Message-ID: <1055362509.1571.63.camel@lindt.uglyboxes.com> On Thu, 2003-04-24 at 15:18, Andrew Cagney wrote: So where do we stand with this? Shall I check it in and deal with the fallout? (I need to go through and double-check all the typedef stuff in varobj anyway, but at least this will allow users to use varobj, even if it isn't cosmetically perfect.) Keith > > Index: insight219-b.cc > > =================================================================== > > RCS file: insight219-b.cc > > diff -N insight219-b.cc > > --- /dev/null 1 Jan 1970 00:00:00 -0000 > > +++ insight219-b.cc 24 Apr 2003 21:54:00 -0000 > > @@ -0,0 +1,4 @@ > > +#include "insight219.h" > > + > > +B::~B() {} > > + > > > > Index: insight219.cc > > =================================================================== > > RCS file: insight219.cc > > diff -N insight219.cc > > --- /dev/null 1 Jan 1970 00:00:00 -0000 > > +++ insight219.cc 24 Apr 2003 21:54:00 -0000 > > @@ -0,0 +1,8 @@ > > +#include "insight219.h" > > + > > +int > > +main(int argc, char *argv[]) > > +{ > > + B *b = new B(); > > + return 0; > > +}; > > Index: insight219.h > > =================================================================== > > RCS file: insight219.h > > diff -N insight219.h > > --- /dev/null 1 Jan 1970 00:00:00 -0000 > > +++ insight219.h 24 Apr 2003 21:54:00 -0000 > > @@ -0,0 +1,8 @@ > > +class B > > +{ > > +public: > > + virtual ~B(); > > + > > +private: > > + int b; > > +}; > > ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-06-11 20:07 ` Keith Seitz 2003-06-11 21:01 ` Andrew Cagney @ 2003-06-11 23:51 ` David Carlton 2003-06-12 0:28 ` Keith Seitz 1 sibling, 1 reply; 21+ messages in thread From: David Carlton @ 2003-06-11 23:51 UTC (permalink / raw) To: Keith Seitz; +Cc: Andrew Cagney, gdb-patches, Daniel Jacobowitz On 11 Jun 2003 13:15:10 -0700, Keith Seitz <keiths@redhat.com> said: > So where do we stand with this? I've just gone and looked over the thread and at Keith's patch; I think the idea is sound, but the implementation isn't. The comments at the top of get_type say that it's supposed to skip past typedefs, so calling CHECK_TYPEDEF certainly seems legitimate. But CHECK_TYPEDEF calls check_typedef, which already goes through chains of typedefs, so you can get rid of the loop in get_type. So I would rewrite get_type as follows: static struct type * get_type (struct varobj *var) { struct type *type; type = var->type; if (type != NULL) CHECK_TYPEDEF (type); return type; } And I don't think you should change get_type_deref at all, but you should change get_target_type as follows: static struct type * get_target_type (struct type *type) { if (type != NULL) { type = TYPE_TARGET_TYPE (type); if (type != NULL) CHECK_TYPEDEF (type); } return type; } (I do wonder a bit if all of those "type != NULL" checks are necessary, but that's a separate question.) I'm not qualified to approve these patches, but the idea seems obvious to me. David Carlton carlton@math.stanford.edu ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-06-11 23:51 ` David Carlton @ 2003-06-12 0:28 ` Keith Seitz 2003-06-12 1:28 ` Daniel Jacobowitz 0 siblings, 1 reply; 21+ messages in thread From: Keith Seitz @ 2003-06-12 0:28 UTC (permalink / raw) To: David Carlton; +Cc: Andrew Cagney, gdb-patches, Daniel Jacobowitz On Wed, 2003-06-11 at 16:49, David Carlton wrote: > I've just gone and looked over the thread and at Keith's patch; I > think the idea is sound, but the implementation isn't. The comments > at the top of get_type say that it's supposed to skip past typedefs, > so calling CHECK_TYPEDEF certainly seems legitimate. But > CHECK_TYPEDEF calls check_typedef, which already goes through chains > of typedefs, so you can get rid of the loop in get_type. Yup, I think you are correct. I'm sure that I was just being laz^Whasty. :-) I'll note that there is still one failure in the testsuite. gdb.mi/mi-var-display.exp: create local variable weird (aka insight's c_variable 6.22) fails because the output type is now considered "struct _struct_decl" instead of it's typedef name "weird". I believe it is a bug below varobj, though. In varobj_create, gdb_evaluate_expression is called. It returns the struct value for the expression. It returns a type that looks like: var->value->type->main_type->code = TYPE_CODE_PTR var->value->type->main_type->target_type->main_type->code = TYPE_CODE_STRUCT, tag_name="_struct_decl" I think that this is wrong, and it should be "TYPE_CODE_TYPEDEF" and "weird_struct"... Or am I yet again being laz^Whasty? :-) Keith ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-06-12 0:28 ` Keith Seitz @ 2003-06-12 1:28 ` Daniel Jacobowitz 2003-06-19 19:28 ` Daniel Jacobowitz 0 siblings, 1 reply; 21+ messages in thread From: Daniel Jacobowitz @ 2003-06-12 1:28 UTC (permalink / raw) To: Keith Seitz; +Cc: David Carlton, Andrew Cagney, gdb-patches On Wed, Jun 11, 2003 at 05:36:02PM -0700, Keith Seitz wrote: > On Wed, 2003-06-11 at 16:49, David Carlton wrote: > > I've just gone and looked over the thread and at Keith's patch; I > > think the idea is sound, but the implementation isn't. The comments > > at the top of get_type say that it's supposed to skip past typedefs, > > so calling CHECK_TYPEDEF certainly seems legitimate. But > > CHECK_TYPEDEF calls check_typedef, which already goes through chains > > of typedefs, so you can get rid of the loop in get_type. > > Yup, I think you are correct. I'm sure that I was just being laz^Whasty. > :-) David's analysis sounds right to me. I'll look over the actual code tomorrow, really I will... > I'll note that there is still one failure in the testsuite. > gdb.mi/mi-var-display.exp: create local variable weird (aka insight's > c_variable 6.22) fails because the output type is now considered "struct > _struct_decl" instead of it's typedef name "weird". > > I believe it is a bug below varobj, though. In varobj_create, > gdb_evaluate_expression is called. It returns the struct value for the > expression. It returns a type that looks like: > > var->value->type->main_type->code = TYPE_CODE_PTR > var->value->type->main_type->target_type->main_type->code = > TYPE_CODE_STRUCT, tag_name="_struct_decl" > > I think that this is wrong, and it should be "TYPE_CODE_TYPEDEF" and > "weird_struct"... > > Or am I yet again being laz^Whasty? :-) > Keith I am 99.99% certain that this test is a compiler problem, not a GDB problem, and that I fixed it in GCC a few months ago. My memory's going though :P -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-06-12 1:28 ` Daniel Jacobowitz @ 2003-06-19 19:28 ` Daniel Jacobowitz 2003-06-19 19:53 ` Daniel Jacobowitz 0 siblings, 1 reply; 21+ messages in thread From: Daniel Jacobowitz @ 2003-06-19 19:28 UTC (permalink / raw) To: Keith Seitz, David Carlton, Andrew Cagney, gdb-patches On Wed, Jun 11, 2003 at 09:28:10PM -0400, Daniel Jacobowitz wrote: > On Wed, Jun 11, 2003 at 05:36:02PM -0700, Keith Seitz wrote: > > On Wed, 2003-06-11 at 16:49, David Carlton wrote: > > > I've just gone and looked over the thread and at Keith's patch; I > > > think the idea is sound, but the implementation isn't. The comments > > > at the top of get_type say that it's supposed to skip past typedefs, > > > so calling CHECK_TYPEDEF certainly seems legitimate. But > > > CHECK_TYPEDEF calls check_typedef, which already goes through chains > > > of typedefs, so you can get rid of the loop in get_type. > > > > Yup, I think you are correct. I'm sure that I was just being laz^Whasty. > > :-) > > David's analysis sounds right to me. I'll look over the actual code > tomorrow, really I will... I don't think David's conversions are quite right; close though. However, something here is fishy. Compare: /* This returns the type of the variable. This skips past typedefs and returns the real type of the variable. It also dereferences pointers and references. vs. static struct type * get_type (struct varobj *var) { struct type *type; type = var->type; while (type != NULL && TYPE_CODE (type) == TYPE_CODE_TYPEDEF) type = TYPE_TARGET_TYPE (type); return type; } That doesn't dereference pointers and references! It looks like get_type got inserted between get_type_deref and its comments? Can you confirm that it shouldn't dereference? Assuming get_type is not supposed to dereference pointers, then this would work: /* This returns the type of the variable. It also skips past typedefs to return the real type of the variable. NOTE: TYPE_TARGET_TYPE should NOT be used anywhere in this file except within get_target_type and get_type. */ static struct type * get_type (struct varobj *var) { struct type *type; type = var->type; if (type != NULL) type = check_typedef (type); return type; } /* This returns the target type (or NULL) of TYPE, also skipping past typedefs, just like get_type (). NOTE: TYPE_TARGET_TYPE should NOT be used anywhere in this file except within get_target_type and get_type. */ static struct type * get_target_type (struct type *type) { if (type != NULL) { type = TYPE_TARGET_TYPE (type); type = check_typedef (type); } return type; } Test results for that look OK but I don't have insight built at the moment, so I didn't test it. -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-06-19 19:28 ` Daniel Jacobowitz @ 2003-06-19 19:53 ` Daniel Jacobowitz 2003-06-19 20:33 ` Keith Seitz 0 siblings, 1 reply; 21+ messages in thread From: Daniel Jacobowitz @ 2003-06-19 19:53 UTC (permalink / raw) To: Keith Seitz, gdb-patches On Thu, Jun 19, 2003 at 03:28:45PM -0400, Daniel Jacobowitz wrote: > On Wed, Jun 11, 2003 at 09:28:10PM -0400, Daniel Jacobowitz wrote: > > On Wed, Jun 11, 2003 at 05:36:02PM -0700, Keith Seitz wrote: > > > On Wed, 2003-06-11 at 16:49, David Carlton wrote: > > > > I've just gone and looked over the thread and at Keith's patch; I > > > > think the idea is sound, but the implementation isn't. The comments > > > > at the top of get_type say that it's supposed to skip past typedefs, > > > > so calling CHECK_TYPEDEF certainly seems legitimate. But > > > > CHECK_TYPEDEF calls check_typedef, which already goes through chains > > > > of typedefs, so you can get rid of the loop in get_type. > > > > > > Yup, I think you are correct. I'm sure that I was just being laz^Whasty. > > > :-) > > > > David's analysis sounds right to me. I'll look over the actual code > > tomorrow, really I will... > > I don't think David's conversions are quite right; close though. > However, something here is fishy. > > Compare: > /* This returns the type of the variable. This skips past typedefs > and returns the real type of the variable. It also dereferences > pointers and references. > vs. > static struct type * > get_type (struct varobj *var) > { > struct type *type; > type = var->type; > > while (type != NULL && TYPE_CODE (type) == TYPE_CODE_TYPEDEF) > type = TYPE_TARGET_TYPE (type); > > return type; > } > > That doesn't dereference pointers and references! It looks like > get_type got inserted between get_type_deref and its comments? Can you > confirm that it shouldn't dereference? > > Assuming get_type is not supposed to dereference pointers, then this > would work: > > /* This returns the type of the variable. It also skips past typedefs > to return the real type of the variable. > > NOTE: TYPE_TARGET_TYPE should NOT be used anywhere in this file > except within get_target_type and get_type. */ > static struct type * > get_type (struct varobj *var) > { > struct type *type; > type = var->type; > > if (type != NULL) > type = check_typedef (type); > > return type; > } > > /* This returns the target type (or NULL) of TYPE, also skipping > past typedefs, just like get_type (). > > NOTE: TYPE_TARGET_TYPE should NOT be used anywhere in this file > except within get_target_type and get_type. */ > static struct type * > get_target_type (struct type *type) > { > if (type != NULL) > { > type = TYPE_TARGET_TYPE (type); > type = check_typedef (type); > } > > return type; > } > > Test results for that look OK but I don't have insight built at the > moment, so I didn't test it. I take that back. Test results are abominable; everything crashes because I misunderstood the use of get_target_type. Try this patch. -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer 2003-06-19 Daniel Jacobowitz <drow@mvista.com> * varobj.c (get_type, get_target_type): Use check_typedef. Index: varobj.c =================================================================== RCS file: /cvs/src/src/gdb/varobj.c,v retrieving revision 1.38 diff -u -p -r1.38 varobj.c --- varobj.c 4 Dec 2002 00:05:54 -0000 1.38 +++ varobj.c 19 Jun 2003 19:42:17 -0000 @@ -1379,9 +1379,8 @@ make_cleanup_free_variable (struct varob return make_cleanup (do_free_variable_cleanup, var); } -/* This returns the type of the variable. This skips past typedefs - and returns the real type of the variable. It also dereferences - pointers and references. +/* This returns the type of the variable. It also skips past typedefs + to return the real type of the variable. NOTE: TYPE_TARGET_TYPE should NOT be used anywhere in this file except within get_target_type and get_type. */ @@ -1391,8 +1390,8 @@ get_type (struct varobj *var) struct type *type; type = var->type; - while (type != NULL && TYPE_CODE (type) == TYPE_CODE_TYPEDEF) - type = TYPE_TARGET_TYPE (type); + if (type != NULL) + type = check_typedef (type); return type; } @@ -1423,8 +1422,8 @@ get_target_type (struct type *type) if (type != NULL) { type = TYPE_TARGET_TYPE (type); - while (type != NULL && TYPE_CODE (type) == TYPE_CODE_TYPEDEF) - type = TYPE_TARGET_TYPE (type); + if (type != NULL) + type = check_typedef (type); } return type; ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-06-19 19:53 ` Daniel Jacobowitz @ 2003-06-19 20:33 ` Keith Seitz 2003-06-19 20:43 ` Daniel Jacobowitz 0 siblings, 1 reply; 21+ messages in thread From: Keith Seitz @ 2003-06-19 20:33 UTC (permalink / raw) To: Daniel Jacobowitz; +Cc: gdb-patches On Thu, 2003-06-19 at 12:45, Daniel Jacobowitz wrote: > > That doesn't dereference pointers and references! It looks like > > get_type got inserted between get_type_deref and its comments? Can you > > confirm that it shouldn't dereference? Yes, I believe the comment is wrong. There is another function to do dereferences... > I take that back. Test results are abominable; everything crashes > because I misunderstood the use of get_target_type. Try this patch. Your patch passes all the insight varobj tests (c_variable.exp, cpp_variable.exp, insight219.exp). We still have the one (existing) failure, as expected (aka: gcc bug, as I recall). Anyway, I would like to encourage you to check this patch in (and you could close insight/219, too :-) Keith ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-06-19 20:33 ` Keith Seitz @ 2003-06-19 20:43 ` Daniel Jacobowitz 2003-06-19 21:30 ` Keith Seitz 0 siblings, 1 reply; 21+ messages in thread From: Daniel Jacobowitz @ 2003-06-19 20:43 UTC (permalink / raw) To: gdb-patches On Thu, Jun 19, 2003 at 01:38:16PM -0700, Keith Seitz wrote: > On Thu, 2003-06-19 at 12:45, Daniel Jacobowitz wrote: > > > That doesn't dereference pointers and references! It looks like > > > get_type got inserted between get_type_deref and its comments? Can you > > > confirm that it shouldn't dereference? > > Yes, I believe the comment is wrong. There is another function to do > dereferences... > > > I take that back. Test results are abominable; everything crashes > > because I misunderstood the use of get_target_type. Try this patch. > > Your patch passes all the insight varobj tests (c_variable.exp, > cpp_variable.exp, insight219.exp). We still have the one (existing) > failure, as expected (aka: gcc bug, as I recall). > > Anyway, I would like to encourage you to check this patch in (and you > could close insight/219, too :-) I've checked it in. I can't edit the insight PR database, though. -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [RFA] varobj: call CHECK_TYPEDEF 2003-06-19 20:43 ` Daniel Jacobowitz @ 2003-06-19 21:30 ` Keith Seitz 0 siblings, 0 replies; 21+ messages in thread From: Keith Seitz @ 2003-06-19 21:30 UTC (permalink / raw) To: Daniel Jacobowitz; +Cc: gdb-patches On Thu, 2003-06-19 at 13:41, Daniel Jacobowitz wrote: > I've checked it in. Thanks! > I can't edit the insight PR database, though. I guess I mistakenly thought that all those with access to gdb would have access to insight. I guess not. I'll close it. Thank you (and David) again for looking into this. Keith ^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2003-06-19 21:30 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-04-24 20:47 [RFA] varobj: call CHECK_TYPEDEF Keith Seitz
2003-04-24 20:52 ` Daniel Jacobowitz
2003-04-24 21:51 ` Keith Seitz
2003-04-24 21:55 ` Daniel Jacobowitz
2003-04-24 22:18 ` Keith Seitz
[not found] ` <3EA84A9B.5020308@redhat.com>
2003-04-24 22:27 ` Keith Seitz
2003-04-24 22:31 ` Andrew Cagney
2003-04-25 0:18 ` Keith Seitz
2003-04-25 2:15 ` Daniel Jacobowitz
2003-04-25 3:47 ` Andrew Cagney
2003-04-25 5:32 ` Daniel Jacobowitz
2003-06-11 20:07 ` Keith Seitz
2003-06-11 21:01 ` Andrew Cagney
2003-06-11 23:51 ` David Carlton
2003-06-12 0:28 ` Keith Seitz
2003-06-12 1:28 ` Daniel Jacobowitz
2003-06-19 19:28 ` Daniel Jacobowitz
2003-06-19 19:53 ` Daniel Jacobowitz
2003-06-19 20:33 ` Keith Seitz
2003-06-19 20:43 ` Daniel Jacobowitz
2003-06-19 21:30 ` Keith Seitz
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox