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]

constify using_direct


I started this patch by noticing that cp_add_using_directive always
copies its arguments -- but at least in the DWARF case this is generally
wasting memory, as the arguments already have the proper lifetime.

I fixed this by adding a 'copy_names' argument to cp_add_using_directive.
Then I noticed that struct using_direct ought to have const members as
well.

Built and regtested on x86-64 Fedora 16.

Tom

	* cp-namespace.c (cp_scan_for_anonymous_namespaces): Update.
	(cp_add_using_directive): Add 'copy_names' argument.
	* cp-support.h (cp_add_using_directive): Update.
	(struct using_direct) <import_src, import_dest, alias,
	declaration>: Now const.
	* dwarf2read.c (read_import_statement): Use obconcat.
	Don't copy names passed to cp_add_using_directive.
---
 gdb/cp-namespace.c |   30 ++++++++++++++++++++++--------
 gdb/cp-support.h   |    9 +++++----
 gdb/dwarf2read.c   |   16 +++++-----------
 3 files changed, 32 insertions(+), 23 deletions(-)

diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c
index 8511bf1..32f6d34 100644
--- a/gdb/cp-namespace.c
+++ b/gdb/cp-namespace.c
@@ -96,7 +96,7 @@ cp_scan_for_anonymous_namespaces (const struct symbol *const symbol,
 		 anonymous namespace.  So add symbols in it to the
 		 namespace given by the previous component if there is
 		 one, or to the global namespace if there isn't.  */
-	      cp_add_using_directive (dest, src, NULL, NULL, NULL,
+	      cp_add_using_directive (dest, src, NULL, NULL, NULL, 1,
 	                              &objfile->objfile_obstack);
 	    }
 	  /* The "+ 2" is for the "::".  */
@@ -117,9 +117,10 @@ cp_scan_for_anonymous_namespaces (const struct symbol *const symbol,
    in the current scope.  If ALIAS is NULL then the namespace is known
    by its original name.  DECLARATION is the name if the imported
    varable if this is a declaration import (Eg. using A::x), otherwise
-   it is NULL.  EXCLUDES is a list of names not to import from an imported
-   module or NULL.  The arguments are copied into newly allocated memory so
-   they can be temporaries.  For EXCLUDES the VEC pointers are copied but the
+   it is NULL.  EXCLUDES is a list of names not to import from an
+   imported module or NULL.  If COPY_NAMES is non-zero, then the
+   arguments are copied into newly allocated memory so they can be
+   temporaries.  For EXCLUDES the VEC pointers are copied but the
    pointed to characters are not copied.  */
 
 void
@@ -128,6 +129,7 @@ cp_add_using_directive (const char *dest,
 			const char *alias,
 			const char *declaration,
 			VEC (const_char_ptr) *excludes,
+			int copy_names,
                         struct obstack *obstack)
 {
   struct using_direct *current;
@@ -173,15 +175,27 @@ cp_add_using_directive (const char *dest,
 				    * sizeof (*new->excludes))));
   memset (new, 0, sizeof (*new));
 
-  new->import_src = obstack_copy0 (obstack, src, strlen (src));
-  new->import_dest = obstack_copy0 (obstack, dest, strlen (dest));
+  if (copy_names)
+    {
+      new->import_src = obstack_copy0 (obstack, src, strlen (src));
+      new->import_dest = obstack_copy0 (obstack, dest, strlen (dest));
+    }
+  else
+    {
+      new->import_src = src;
+      new->import_dest = dest;
+    }
 
-  if (alias != NULL)
+  if (alias != NULL && copy_names)
     new->alias = obstack_copy0 (obstack, alias, strlen (alias));
+  else
+    new->alias = alias;
 
-  if (declaration != NULL)
+  if (declaration != NULL && copy_names)
     new->declaration = obstack_copy0 (obstack,
 				      declaration, strlen (declaration));
+  else
+    new->declaration = declaration;
 
   memcpy (new->excludes, VEC_address (const_char_ptr, excludes),
 	  VEC_length (const_char_ptr, excludes) * sizeof (*new->excludes));
diff --git a/gdb/cp-support.h b/gdb/cp-support.h
index c22c1e7..3734886 100644
--- a/gdb/cp-support.h
+++ b/gdb/cp-support.h
@@ -125,11 +125,11 @@ struct demangle_parse_info
 
 struct using_direct
 {
-  char *import_src;
-  char *import_dest;
+  const char *import_src;
+  const char *import_dest;
 
-  char *alias;
-  char *declaration;
+  const char *alias;
+  const char *declaration;
 
   struct using_direct *next;
 
@@ -186,6 +186,7 @@ extern void cp_add_using_directive (const char *dest,
                                     const char *alias,
 				    const char *declaration,
 				    VEC (const_char_ptr) *excludes,
+				    int copy_names,
                                     struct obstack *obstack);
 
 extern void cp_set_block_scope (const struct symbol *symbol,
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 59822cd..45fc047 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -7718,8 +7718,6 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
   VEC (const_char_ptr) *excludes = NULL;
   struct cleanup *cleanups;
 
-  char *temp;
-
   import_attr = dwarf2_attr (die, DW_AT_import, cu);
   if (import_attr == NULL)
     {
@@ -7785,14 +7783,9 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
       canonical_name = imported_name_prefix;
     }
   else if (strlen (imported_name_prefix) > 0)
-    {
-      temp = alloca (strlen (imported_name_prefix)
-                     + 2 + strlen (imported_name) + 1);
-      strcpy (temp, imported_name_prefix);
-      strcat (temp, "::");
-      strcat (temp, imported_name);
-      canonical_name = temp;
-    }
+    canonical_name = obconcat (&objfile->objfile_obstack,
+			       imported_name_prefix, "::", imported_name,
+			       (char *) NULL);
   else
     canonical_name = imported_name;
 
@@ -7847,6 +7840,7 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
                           import_alias,
                           imported_declaration,
 			  excludes,
+			  0,
                           &objfile->objfile_obstack);
 
   do_cleanups (cleanups);
@@ -12113,7 +12107,7 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu)
 	  const char *previous_prefix = determine_prefix (die, cu);
 
 	  cp_add_using_directive (previous_prefix, TYPE_NAME (type), NULL,
-				  NULL, NULL, &objfile->objfile_obstack);
+				  NULL, NULL, 0, &objfile->objfile_obstack);
 	}
     }
 
-- 
1.7.7.6


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