From 12aaed36e3f39b4dadf6bc8f74d254d4d8a3909f Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 25 Jan 2013 17:36:01 +0000 Subject: [PATCH] * 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) : Now const. * dwarf2read.c (read_import_statement): Use obconcat. Don't copy names passed to cp_add_using_directive. --- gdb/ChangeLog | 10 ++++++++++ gdb/cp-namespace.c | 30 ++++++++++++++++++++++-------- gdb/cp-support.h | 9 +++++---- gdb/dwarf2read.c | 16 +++++----------- 4 files changed, 42 insertions(+), 23 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 01765e1f4ae..86878e215d5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2013-01-25 Tom Tromey + + * 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) : Now const. + * dwarf2read.c (read_import_statement): Use obconcat. + Don't copy names passed to cp_add_using_directive. + 2013-01-25 Tom Tromey * c-exp.y (qualified_name): Use TYPE_SAFE_NAME. diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c index 8511bf10033..32f6d34997d 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 c22c1e7ff0a..3734886818e 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 8ac062a6b21..6395eca8a55 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -7713,8 +7713,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) { @@ -7780,14 +7778,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; @@ -7842,6 +7835,7 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu) import_alias, imported_declaration, excludes, + 0, &objfile->objfile_obstack); do_cleanups (cleanups); @@ -12108,7 +12102,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); } } -- 2.30.2