* [RFA] Typedef support for linespecs
@ 2009-11-11 22:49 Keith Seitz
2009-11-11 23:02 ` Daniel Jacobowitz
0 siblings, 1 reply; 3+ messages in thread
From: Keith Seitz @ 2009-11-11 22:49 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 1030 bytes --]
Hi,
CVS HEAD currently fails if a user does something like:
class foo
{
public:
void a_function (void) { }
};
typedef MyFoo foo;
MyFoo instance;
(gdb) list MyFoo::a_function
This happens because when we lookup "MyFoo", lookup_prefix_sym will only
search STRUCT_DOMAIN, and it won't find "MyFoo", since typedefs live in
VAR_DOMAIN.
The attached patch attempts to address this issue by searching
VAR_DOMAIN if the search through STRUCT_DOMAIN fails.
[In case I am not always explicit: This patch introduces no regressions
or failures/errors of any kind with the test suite on x86 linux.]
Comments/Questions/Concerns?
Keith
ChangeLog
2009-11-11 Keith Seitz <keiths@redhat.com>
* linespec.c (lookup_prefix_sym): Lookup the symbol
in both STRUCT_DOMAIN and VAR_DOMAIN.
testsuite/ChangeLog
2009-11-11 Keith Seitz <keiths@redhat.com>
* gdb.cp/classes.cc (ByAnyOtherName): Add typedef and
use it instead of "Foo".
* gdb.cp/classes.exp (do_tests): Add a test to access
a method through a typedef'd class name.
[-- Attachment #2: linespec-typedef.patch --]
[-- Type: text/plain, Size: 2689 bytes --]
Index: linespec.c
===================================================================
RCS file: /cvs/src/src/gdb/linespec.c,v
retrieving revision 1.92
diff -u -p -r1.92 linespec.c
--- linespec.c 19 Oct 2009 09:51:41 -0000 1.92
+++ linespec.c 11 Nov 2009 22:37:47 -0000
@@ -1428,6 +1428,7 @@ lookup_prefix_sym (char **argptr, char *
{
char *p1;
char *copy;
+ struct symbol *sym;
/* Extract the class name. */
p1 = p;
@@ -1446,7 +1447,26 @@ lookup_prefix_sym (char **argptr, char *
/* At this point p1->"::inA::fun", p->"inA::fun" copy->"AAA",
argptr->"inA::fun" */
- return lookup_symbol (copy, 0, STRUCT_DOMAIN, 0);
+ sym = lookup_symbol (copy, 0, STRUCT_DOMAIN, 0);
+ if (sym == NULL)
+ {
+ /* Typedefs are in VAR_DOMAIN so the above symbol lookup will
+ fail when the user attempts to lookup a method of a class
+ via a typedef'd name (NOT via the class's name, which is already
+ handled in symbol_matches_domain). So try the lookup again
+ using VAR_DOMAIN (where typedefs live) and double-check that we
+ found a struct/class type. */
+ struct symbol *s = lookup_symbol (copy, 0, VAR_DOMAIN, 0);
+ if (s != NULL)
+ {
+ struct type *t = SYMBOL_TYPE (s);
+ CHECK_TYPEDEF (t);
+ if (TYPE_CODE (t) == TYPE_CODE_STRUCT)
+ return s;
+ }
+ }
+
+ return sym;
}
/* This finds the method COPY in the class whose type is T and whose
Index: testsuite/gdb.cp/classes.cc
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.cp/classes.cc,v
retrieving revision 1.7
diff -u -p -r1.7 classes.cc
--- testsuite/gdb.cp/classes.cc 21 Sep 2009 19:23:22 -0000 1.7
+++ testsuite/gdb.cp/classes.cc 11 Nov 2009 22:37:48 -0000
@@ -417,6 +417,8 @@ class Foo
int times (int y);
};
+typedef Foo ByAnyOtherName;
+
class Bar : public Base1, public Foo {
public:
int z;
@@ -431,7 +433,7 @@ int Foo::st = 100;
Foo::operator int() { return x; }
-Foo foo(10, 11);
+ByAnyOtherName foo(10, 11);
Bar bar(20, 21, 22);
class ClassWithEnum {
Index: testsuite/gdb.cp/classes.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.cp/classes.exp,v
retrieving revision 1.22
diff -u -p -r1.22 classes.exp
--- testsuite/gdb.cp/classes.exp 21 Sep 2009 19:23:22 -0000 1.22
+++ testsuite/gdb.cp/classes.exp 11 Nov 2009 22:37:48 -0000
@@ -636,6 +636,8 @@ proc do_tests {} {
gdb_test "print base1::Base1" "<.*Base1.*>" "print ctor of typedef class"
gdb_test "print base1::~Base1" "<.*~Base1(\\(\\))?>" \
"print dtor of typedef class"
+
+ gdb_test "list ByAnyOtherName::times" ".*int Foo::times.*"
}
do_tests
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [RFA] Typedef support for linespecs
2009-11-11 22:49 [RFA] Typedef support for linespecs Keith Seitz
@ 2009-11-11 23:02 ` Daniel Jacobowitz
2009-11-11 23:35 ` Keith Seitz
0 siblings, 1 reply; 3+ messages in thread
From: Daniel Jacobowitz @ 2009-11-11 23:02 UTC (permalink / raw)
To: Keith Seitz; +Cc: gdb-patches
On Wed, Nov 11, 2009 at 02:49:13PM -0800, Keith Seitz wrote:
> ChangeLog
> 2009-11-11 Keith Seitz <keiths@redhat.com>
>
> * linespec.c (lookup_prefix_sym): Lookup the symbol
> in both STRUCT_DOMAIN and VAR_DOMAIN.
>
> testsuite/ChangeLog
> 2009-11-11 Keith Seitz <keiths@redhat.com>
>
> * gdb.cp/classes.cc (ByAnyOtherName): Add typedef and
> use it instead of "Foo".
> * gdb.cp/classes.exp (do_tests): Add a test to access
> a method through a typedef'd class name.
OK. I still hate linespecs, though.
(Seriously... if we figure out that it isn't a file:line, we should
use the normal expression parser for an expression portion of
it... yes, I do realize just how difficult this would be, but the
inconsistencies drive folks mad.)
--
Daniel Jacobowitz
CodeSourcery
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [RFA] Typedef support for linespecs
2009-11-11 23:02 ` Daniel Jacobowitz
@ 2009-11-11 23:35 ` Keith Seitz
0 siblings, 0 replies; 3+ messages in thread
From: Keith Seitz @ 2009-11-11 23:35 UTC (permalink / raw)
To: gdb-patches
On 11/11/2009 03:01 PM, Daniel Jacobowitz wrote:
> OK. I still hate linespecs, though.
Committed. Thank you for your review.
> (Seriously... if we figure out that it isn't a file:line, we should
> use the normal expression parser for an expression portion of
> it... yes, I do realize just how difficult this would be, but the
> inconsistencies drive folks mad.)
Yeah, I rather agree with you. Something like this may yet get onto an
Archer agenda in the future, but for now, there are, unfortunately,
"bigger fish to fry" -- at least for me.
Thanks,
Keith
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2009-11-11 23:35 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-11-11 22:49 [RFA] Typedef support for linespecs Keith Seitz
2009-11-11 23:02 ` Daniel Jacobowitz
2009-11-11 23:35 ` Keith Seitz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox