This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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 {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]