This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
constify using_direct
- From: Tom Tromey <tromey at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Mon, 14 Jan 2013 12:19:20 -0700
- Subject: 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