This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [patch 1/2] Search typedefs in namespaces also in other files
- From: Jan Kratochvil <jan dot kratochvil at redhat dot com>
- To: Tom Tromey <tromey at redhat dot com>
- Cc: gdb-patches at sourceware dot org, Sami Wagiaalla <swagiaal at redhat dot com>
- Date: Mon, 28 Jun 2010 22:41:30 +0200
- Subject: Re: [patch 1/2] Search typedefs in namespaces also in other files
On Mon, 28 Jun 2010 19:52:43 +0200, Tom Tromey wrote:
> >>>>> "Jan" == Jan Kratochvil <jan.kratochvil@redhat.com> writes:
>
> I don't totally follow, but I suppose the ideal is for a comment to
> describe what the function does and also relevant info about its
> arguments and returns; and not describe exactly how the function may do
> its job.
Yes, I agree, sorry for my wording.
On Mon, 28 Jun 2010 19:53:02 +0200, Tom Tromey wrote:
> >>>>> "Jan" == Jan Kratochvil <jan.kratochvil@redhat.com> writes:
>
> Jan> 2010-06-25 Jan Kratochvil <jan.kratochvil@redhat.com>
> Jan> * cp-namespace.c (cp_lookup_nested_type): New variable
> Jan> concatenated_name. Turn the current return condition into a reverse
> Jan> one. Call also lookup_static_symbol_aux on the constructed qualified
> Jan> name.
> Jan> * symtab.c (lookup_symbol_aux): Move variable objfile and searching in
> Jan> other files into a called ...
> Jan> (lookup_static_symbol_aux): ... new function here.
> Jan> * symtab.h (lookup_static_symbol_aux): New prototype.
> Jan> * valops.c (value_maybe_namespace_elt): Call also
> Jan> lookup_static_symbol_aux if we failed otherwise.
>
> Jan> 2010-06-26 Jan Kratochvil <jan.kratochvil@redhat.com>
> Jan> * gdb.cp/namespace.exp (whatis C::cOtherFileType)
> Jan> (whatis ::C::cOtherFileType, whatis C::cOtherFileVar)
> Jan> (whatis ::C::cOtherFileVar, print C::cOtherFileVar)
> Jan> (print ::C::cOtherFileVar)
> Jan> (whatis C::OtherFileClass::cOtherFileClassType)
> Jan> (whatis ::C::OtherFileClass::cOtherFileClassType)
> Jan> (print C::OtherFileClass::cOtherFileClassVar)
> Jan> (print ::cOtherFileClassVar)
> Jan> (print ::C::OtherFileClass::cOtherFileClassVar): New tests.
> Jan> (ptype OtherFileClass, ptype ::C::OtherFileClass): Permit arbitrary
> Jan> trailing content.
> Jan> * gdb.cp/namespace1.cc (C::OtherFileClass::cOtherFileClassType)
> Jan> (C::OtherFileClass::cOtherFileClassVar)
> Jan> (C::OtherFileClass::cOtherFileClassVar_use, C::cOtherFileType)
> Jan> (C::cOtherFileVar, C::cOtherFileVar_use): New.
>
> This is ok. Thanks.
Checked-in. Removed KFAILs for already fixed PR c++/11703.
Thanks,
Jan
http://sourceware.org/ml/gdb-cvs/2010-06/msg00198.html
--- src/gdb/ChangeLog 2010/06/28 20:18:26 1.11943
+++ src/gdb/ChangeLog 2010/06/28 20:35:51 1.11944
@@ -1,5 +1,18 @@
2010-06-28 Jan Kratochvil <jan.kratochvil@redhat.com>
+ * cp-namespace.c (cp_lookup_nested_type): New variable
+ concatenated_name. Turn the current return condition into a reverse
+ one. Call also lookup_static_symbol_aux on the constructed qualified
+ name.
+ * symtab.c (lookup_symbol_aux): Move variable objfile and searching in
+ other files into a called ...
+ (lookup_static_symbol_aux): ... new function here.
+ * symtab.h (lookup_static_symbol_aux): New prototype.
+ * valops.c (value_maybe_namespace_elt): Call also
+ lookup_static_symbol_aux if we failed otherwise.
+
+2010-06-28 Jan Kratochvil <jan.kratochvil@redhat.com>
+
Fix PR c++/11703 and PR gdb/1448.
* c-exp.y (yylex) <last_was_coloncolon && first_was_coloncolon>: Add
FIRST_ITER check.
--- src/gdb/cp-namespace.c 2010/05/13 23:53:32 1.42
+++ src/gdb/cp-namespace.c 2010/06/28 20:35:52 1.43
@@ -578,11 +578,24 @@
nested_name,
block,
VAR_DOMAIN);
+ char *concatenated_name;
- if (sym == NULL || SYMBOL_CLASS (sym) != LOC_TYPEDEF)
- return NULL;
- else
+ if (sym != NULL && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
return SYMBOL_TYPE (sym);
+
+ /* Now search all static file-level symbols. Not strictly correct,
+ but more useful than an error. We do not try to guess any imported
+ namespace as even the fully specified namespace seach is is already
+ not C++ compliant and more assumptions could make it too magic. */
+
+ concatenated_name = alloca (strlen (parent_name) + 2
+ + strlen (nested_name) + 1);
+ sprintf (concatenated_name, "%s::%s", parent_name, nested_name);
+ sym = lookup_static_symbol_aux (concatenated_name, VAR_DOMAIN);
+ if (sym != NULL && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
+ return SYMBOL_TYPE (sym);
+
+ return NULL;
}
default:
internal_error (__FILE__, __LINE__,
--- src/gdb/symtab.c 2010/06/02 22:41:55 1.238
+++ src/gdb/symtab.c 2010/06/28 20:35:52 1.239
@@ -1054,7 +1054,6 @@
{
struct symbol *sym;
const struct language_defn *langdef;
- struct objfile *objfile;
/* Make sure we do something sensible with is_a_field_of_this, since
the callers that set this parameter to some non-null value will
@@ -1122,10 +1121,21 @@
return sym;
/* Now search all static file-level symbols. Not strictly correct,
- but more useful than an error. Do the symtabs first, then check
- the psymtabs. If a psymtab indicates the existence of the
- desired name as a file-level static, then do psymtab-to-symtab
- conversion on the fly and return the found symbol. */
+ but more useful than an error. */
+
+ return lookup_static_symbol_aux (name, domain);
+}
+
+/* Search all static file-level symbols for NAME from DOMAIN. Do the symtabs
+ first, then check the psymtabs. If a psymtab indicates the existence of the
+ desired name as a file-level static, then do psymtab-to-symtab conversion on
+ the fly and return the found symbol. */
+
+struct symbol *
+lookup_static_symbol_aux (const char *name, const domain_enum domain)
+{
+ struct objfile *objfile;
+ struct symbol *sym;
sym = lookup_symbol_aux_symtabs (STATIC_BLOCK, name, domain);
if (sym != NULL)
--- src/gdb/symtab.h 2010/06/02 22:41:55 1.153
+++ src/gdb/symtab.h 2010/06/28 20:35:52 1.154
@@ -886,6 +886,12 @@
const struct block *block,
const domain_enum domain);
+/* Lookup a symbol only in the file static scope of all the objfiles. */
+
+struct symbol *lookup_static_symbol_aux (const char *name,
+ const domain_enum domain);
+
+
/* lookup a symbol by name, within a specified block */
extern struct symbol *lookup_block_symbol (const struct block *, const char *,
--- src/gdb/valops.c 2010/06/27 16:26:41 1.247
+++ src/gdb/valops.c 2010/06/28 20:35:52 1.248
@@ -3284,8 +3284,16 @@
struct value *result;
sym = cp_lookup_symbol_namespace (namespace_name, name,
- get_selected_block (0),
- VAR_DOMAIN);
+ get_selected_block (0), VAR_DOMAIN);
+
+ if (sym == NULL)
+ {
+ char *concatenated_name = alloca (strlen (namespace_name) + 2
+ + strlen (name) + 1);
+
+ sprintf (concatenated_name, "%s::%s", namespace_name, name);
+ sym = lookup_static_symbol_aux (concatenated_name, VAR_DOMAIN);
+ }
if (sym == NULL)
return NULL;
--- src/gdb/testsuite/ChangeLog 2010/06/28 20:18:26 1.2360
+++ src/gdb/testsuite/ChangeLog 2010/06/28 20:35:52 1.2361
@@ -1,5 +1,23 @@
2010-06-28 Jan Kratochvil <jan.kratochvil@redhat.com>
+ * gdb.cp/namespace.exp (whatis C::cOtherFileType)
+ (whatis ::C::cOtherFileType, whatis C::cOtherFileVar)
+ (whatis ::C::cOtherFileVar, print C::cOtherFileVar)
+ (print ::C::cOtherFileVar)
+ (whatis C::OtherFileClass::cOtherFileClassType)
+ (whatis ::C::OtherFileClass::cOtherFileClassType)
+ (print C::OtherFileClass::cOtherFileClassVar)
+ (print ::cOtherFileClassVar)
+ (print ::C::OtherFileClass::cOtherFileClassVar): New tests.
+ (ptype OtherFileClass, ptype ::C::OtherFileClass): Permit arbitrary
+ trailing content.
+ * gdb.cp/namespace1.cc (C::OtherFileClass::cOtherFileClassType)
+ (C::OtherFileClass::cOtherFileClassVar)
+ (C::OtherFileClass::cOtherFileClassVar_use, C::cOtherFileType)
+ (C::cOtherFileVar, C::cOtherFileVar_use): New.
+
+2010-06-28 Jan Kratochvil <jan.kratochvil@redhat.com>
+
Test PR c++/11703 and PR gdb/1448.
* gdb.cp/namespace.exp (ptype ::C::NestedClass): Remove KFAIL for
gdb/1448.
--- src/gdb/testsuite/gdb.cp/namespace.exp 2010/06/28 20:18:27 1.20
+++ src/gdb/testsuite/gdb.cp/namespace.exp 2010/06/28 20:35:52 1.21
@@ -165,6 +165,70 @@
gdb_test "break BBB::Class::xyzq" \
"Breakpoint.*at $hex: file.*namespace.cc, line 68\\."
+# Tests accessing static elements in namespace of other file.
+
+gdb_test "whatis C::cOtherFileType" "type = short"
+gdb_test "whatis ::C::cOtherFileType" "type = short"
+gdb_test "whatis C::cOtherFileVar" "type = const C::cOtherFileType"
+gdb_test "whatis ::C::cOtherFileVar" "type = const C::cOtherFileType"
+gdb_test "print C::cOtherFileVar" "\\$\[0-9\].* = 319"
+gdb_test "print ::C::cOtherFileVar" "\\$\[0-9\].* = 319"
+
+if {[test_compiler_info {gcc-[0-3]-*}]
+ || [test_compiler_info {gcc-4-[0-4]-*}]} {
+ # The type in class is missing in older GCCs.
+ setup_xfail *-*-*
+}
+gdb_test "whatis C::OtherFileClass::cOtherFileClassType" "type = short"
+if {[test_compiler_info {gcc-[0-3]-*}]
+ || [test_compiler_info {gcc-4-[0-4]-*}]} {
+ # The type in class is missing in older GCCs.
+ setup_xfail *-*-*
+}
+gdb_test "whatis ::C::OtherFileClass::cOtherFileClassType" "type = short"
+
+set test "print C::OtherFileClass::cOtherFileClassVar"
+gdb_test_multiple $test $test {
+ -re "\\$\[0-9\].* = 318\r\n$gdb_prompt $" {
+ pass $test
+ }
+ -re "static field cOtherFileClassVar has been optimized out\r\n$gdb_prompt $" {
+ setup_kfail "c++/11702" "*-*-*"
+ fail $test
+ }
+}
+
+# FSF GCC <=4.4 creates unqualified DIE "cOtherFileClassVar" ignoring the
+# namespace the same way older GDB did.
+set test "print ::cOtherFileClassVar"
+set test2 "print ::C::OtherFileClass::cOtherFileClassVar"
+gdb_test_multiple $test $test {
+ -re "No symbol \"cOtherFileClassVar\" in current context\\.\r\n$gdb_prompt $" {
+ pass $test
+
+ gdb_test_multiple $test2 $test2 {
+ -re "\\$\[0-9\].* = 318\r\n$gdb_prompt $" {
+ pass $test2
+ }
+ -re "static field cOtherFileClassVar has been optimized out\r\n$gdb_prompt $" {
+ setup_kfail "c++/11702" "*-*-*"
+ fail $test2
+ }
+ }
+
+ }
+ -re "\\$\[0-9\].* = 318\r\n$gdb_prompt $" {
+ if {[test_compiler_info {gcc-[0-3]-*}]
+ || [test_compiler_info {gcc-4-[0-4]-*}]} {
+ # Do not permit to XFAIL on recent GCCs.
+ setup_xfail *-*-*
+ }
+ fail $test
+
+ unresolved $test2
+ }
+}
+
# Test to see if the appropriate namespaces are in scope when trying
# to print out stuff from within a function defined within a
# namespace.
@@ -200,8 +264,8 @@
# Tests involving multiple files
gdb_test "print cOtherFile" "\\$\[0-9\].* = 316"
-gdb_test "ptype OtherFileClass" "type = (class C::OtherFileClass \{\r\n public:|struct C::OtherFileClass \{)\r\n int z;\r\n\}"
-gdb_test "ptype ::C::OtherFileClass" "type = class C::OtherFileClass \{\r\n public:\r\n int z;\r\n\}"
+gdb_test "ptype OtherFileClass" "type = (class C::OtherFileClass \{\r\n public:|struct C::OtherFileClass \{)\r\n int z;\r\n.*\}"
+gdb_test "ptype ::C::OtherFileClass" "type = class C::OtherFileClass \{\r\n public:\r\n int z;\r\n.*\}"
gdb_test "ptype C::OtherFileClass" "No symbol \"OtherFileClass\" in namespace \"C::C\"."
# Some anonymous namespace tests.
--- src/gdb/testsuite/gdb.cp/namespace1.cc 2010/01/01 07:32:01 1.10
+++ src/gdb/testsuite/gdb.cp/namespace1.cc 2010/06/28 20:35:52 1.11
@@ -21,7 +21,15 @@
class OtherFileClass {
public:
int z;
+
+ typedef short cOtherFileClassType;
+ static const cOtherFileClassType cOtherFileClassVar = 318;
+ cOtherFileClassType cOtherFileClassVar_use ();
};
+ OtherFileClass::cOtherFileClassType OtherFileClass::cOtherFileClassVar_use ()
+ {
+ return cOtherFileClassVar;
+ }
namespace {
int cXOtherFile = 29;
@@ -35,6 +43,13 @@
static OtherFileClass *c = new OtherFileClass();
c->z = cOtherFile + cXOtherFile;
}
+
+ typedef short cOtherFileType;
+ static const cOtherFileType cOtherFileVar = 319;
+ cOtherFileType cOtherFileVar_use ()
+ {
+ return cOtherFileVar;
+ }
}
namespace {