RFC: remove cp_set_block_scope

Tom Tromey tromey@redhat.com
Mon Jan 14 19:21:00 GMT 2013


Currently, the DWARF reader never sets the linkage name of a symbol to
the mangled name.

This is a bug, but realizing this reveals that cp_set_block_scope is not
well-factored: it has two branches, one of which is only ever taken via
dbxread, and one of which is only ever take via dwarf2read.

This patch removes the function and puts the needed bits directly into
the respective readers.  I think this clarifies the code.

Built and regtested on x86-64 Fedora 16.

Tom

	* cp-namespace.c (cp_set_block_scope): Remove.
	* cp-support.h (cp_set_block_scope): Remove.
	* dbxread.c: Include block.h.
	(cp_set_block_scope): New function.
	(process_one_symbol): Update.
	* dwarf2read.c (read_func_scope): Use block_set_scope.
---
 gdb/cp-namespace.c |   37 -------------------------------------
 gdb/cp-support.h   |    6 ------
 gdb/dbxread.c      |   35 +++++++++++++++++++++++++++++++----
 gdb/dwarf2read.c   |    8 ++++----
 4 files changed, 35 insertions(+), 51 deletions(-)

diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c
index 32f6d34..c137eec 100644
--- a/gdb/cp-namespace.c
+++ b/gdb/cp-namespace.c
@@ -205,43 +205,6 @@ cp_add_using_directive (const char *dest,
   using_directives = new;
 }
 
-/* Record the namespace that the function defined by SYMBOL was
-   defined in, if necessary.  BLOCK is the associated block; use
-   OBSTACK for allocation.  */
-
-void
-cp_set_block_scope (const struct symbol *symbol,
-		    struct block *block,
-		    struct obstack *obstack,
-		    const char *processing_current_prefix,
-		    int processing_has_namespace_info)
-{
-  if (processing_has_namespace_info)
-    {
-      block_set_scope
-	(block, obstack_copy0 (obstack, processing_current_prefix,
-			       strlen (processing_current_prefix)),
-	 obstack);
-    }
-  else if (SYMBOL_DEMANGLED_NAME (symbol) != NULL)
-    {
-      /* Try to figure out the appropriate namespace from the
-	 demangled name.  */
-
-      /* FIXME: carlton/2003-04-15: If the function in question is
-	 a method of a class, the name will actually include the
-	 name of the class as well.  This should be harmless, but
-	 is a little unfortunate.  */
-
-      const char *name = SYMBOL_DEMANGLED_NAME (symbol);
-      unsigned int prefix_len = cp_entire_prefix_len (name);
-
-      block_set_scope (block,
-		       obstack_copy0 (obstack, name, prefix_len),
-		       obstack);
-    }
-}
-
 /* Test whether or not NAMESPACE looks like it mentions an anonymous
    namespace; return nonzero if so.  */
 
diff --git a/gdb/cp-support.h b/gdb/cp-support.h
index 3734886..c7141d5 100644
--- a/gdb/cp-support.h
+++ b/gdb/cp-support.h
@@ -189,12 +189,6 @@ extern void cp_add_using_directive (const char *dest,
 				    int copy_names,
                                     struct obstack *obstack);
 
-extern void cp_set_block_scope (const struct symbol *symbol,
-				struct block *block,
-				struct obstack *obstack,
-				const char *processing_current_prefix,
-				int processing_has_namespace_info);
-
 extern void cp_scan_for_anonymous_namespaces (const struct symbol *symbol,
 					      struct objfile *objfile);
 
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index d42a62d..aa8a8ff 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -55,6 +55,7 @@
 #include "cp-abi.h"
 #include "cp-support.h"
 #include "psympriv.h"
+#include "block.h"
 
 #include "gdb_assert.h"
 #include "gdb_string.h"
@@ -2705,6 +2706,34 @@ read_ofile_symtab (struct objfile *objfile, struct partial_symtab *pst)
 }
 
 
+/* Record the namespace that the function defined by SYMBOL was
+   defined in, if necessary.  BLOCK is the associated block; use
+   OBSTACK for allocation.  */
+
+static void
+cp_set_block_scope (const struct symbol *symbol,
+		    struct block *block,
+		    struct obstack *obstack)
+{
+  if (SYMBOL_DEMANGLED_NAME (symbol) != NULL)
+    {
+      /* Try to figure out the appropriate namespace from the
+	 demangled name.  */
+
+      /* FIXME: carlton/2003-04-15: If the function in question is
+	 a method of a class, the name will actually include the
+	 name of the class as well.  This should be harmless, but
+	 is a little unfortunate.  */
+
+      const char *name = SYMBOL_DEMANGLED_NAME (symbol);
+      unsigned int prefix_len = cp_entire_prefix_len (name);
+
+      block_set_scope (block,
+		       obstack_copy0 (obstack, name, prefix_len),
+		       obstack);
+    }
+}
+
 /* This handles a single symbol from the symbol-file, building symbols
    into a GDB symtab.  It takes these arguments and an implicit argument.
 
@@ -2812,8 +2841,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
 
 	  /* For C++, set the block's scope.  */
 	  if (SYMBOL_LANGUAGE (new->name) == language_cplus)
-	    cp_set_block_scope (new->name, block, &objfile->objfile_obstack,
-				"", 0);
+	    cp_set_block_scope (new->name, block, &objfile->objfile_obstack);
 
 	  /* May be switching to an assembler file which may not be using
 	     block relative stabs, so reset the offset.  */
@@ -3218,8 +3246,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
 		  /* For C++, set the block's scope.  */
 		  if (SYMBOL_LANGUAGE (new->name) == language_cplus)
 		    cp_set_block_scope (new->name, block,
-					&objfile->objfile_obstack,
-					"", 0);
+					&objfile->objfile_obstack);
 		}
 
 	      new = push_context (0, valu);
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 45fc047..9ebd5d3 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -9569,10 +9569,10 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
                         lowpc, highpc, objfile);
 
   /* For C++, set the block's scope.  */
-  if (cu->language == language_cplus || cu->language == language_fortran)
-    cp_set_block_scope (new->name, block, &objfile->objfile_obstack,
-			determine_prefix (die, cu),
-			processing_has_namespace_info);
+  if ((cu->language == language_cplus || cu->language == language_fortran)
+      && processing_has_namespace_info)
+    block_set_scope (block, determine_prefix (die, cu),
+		     &objfile->objfile_obstack);
 
   /* If we have address ranges, record them.  */
   dwarf2_record_block_ranges (die, block, baseaddr, cu);
-- 
1.7.7.6



More information about the Gdb-patches mailing list