* 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.
This commit is contained in:
Tom Tromey
2013-01-25 17:36:01 +00:00
parent 7fc75ca750
commit 12aaed36e3
4 changed files with 42 additions and 23 deletions

View File

@ -1,3 +1,13 @@
2013-01-25 Tom Tromey <tromey@redhat.com>
* 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.
2013-01-25 Tom Tromey <tromey@redhat.com> 2013-01-25 Tom Tromey <tromey@redhat.com>
* c-exp.y (qualified_name): Use TYPE_SAFE_NAME. * c-exp.y (qualified_name): Use TYPE_SAFE_NAME.

View File

@ -96,7 +96,7 @@ cp_scan_for_anonymous_namespaces (const struct symbol *const symbol,
anonymous namespace. So add symbols in it to the anonymous namespace. So add symbols in it to the
namespace given by the previous component if there is namespace given by the previous component if there is
one, or to the global namespace if there isn't. */ 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); &objfile->objfile_obstack);
} }
/* The "+ 2" is for the "::". */ /* 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 in the current scope. If ALIAS is NULL then the namespace is known
by its original name. DECLARATION is the name if the imported by its original name. DECLARATION is the name if the imported
varable if this is a declaration import (Eg. using A::x), otherwise 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 it is NULL. EXCLUDES is a list of names not to import from an
module or NULL. The arguments are copied into newly allocated memory so imported module or NULL. If COPY_NAMES is non-zero, then the
they can be temporaries. For EXCLUDES the VEC pointers are copied but 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. */ pointed to characters are not copied. */
void void
@ -128,6 +129,7 @@ cp_add_using_directive (const char *dest,
const char *alias, const char *alias,
const char *declaration, const char *declaration,
VEC (const_char_ptr) *excludes, VEC (const_char_ptr) *excludes,
int copy_names,
struct obstack *obstack) struct obstack *obstack)
{ {
struct using_direct *current; struct using_direct *current;
@ -173,15 +175,27 @@ cp_add_using_directive (const char *dest,
* sizeof (*new->excludes)))); * sizeof (*new->excludes))));
memset (new, 0, sizeof (*new)); memset (new, 0, sizeof (*new));
if (copy_names)
{
new->import_src = obstack_copy0 (obstack, src, strlen (src)); new->import_src = obstack_copy0 (obstack, src, strlen (src));
new->import_dest = obstack_copy0 (obstack, dest, strlen (dest)); 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)); 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, new->declaration = obstack_copy0 (obstack,
declaration, strlen (declaration)); declaration, strlen (declaration));
else
new->declaration = declaration;
memcpy (new->excludes, VEC_address (const_char_ptr, excludes), memcpy (new->excludes, VEC_address (const_char_ptr, excludes),
VEC_length (const_char_ptr, excludes) * sizeof (*new->excludes)); VEC_length (const_char_ptr, excludes) * sizeof (*new->excludes));

View File

@ -125,11 +125,11 @@ struct demangle_parse_info
struct using_direct struct using_direct
{ {
char *import_src; const char *import_src;
char *import_dest; const char *import_dest;
char *alias; const char *alias;
char *declaration; const char *declaration;
struct using_direct *next; struct using_direct *next;
@ -186,6 +186,7 @@ extern void cp_add_using_directive (const char *dest,
const char *alias, const char *alias,
const char *declaration, const char *declaration,
VEC (const_char_ptr) *excludes, VEC (const_char_ptr) *excludes,
int copy_names,
struct obstack *obstack); struct obstack *obstack);
extern void cp_set_block_scope (const struct symbol *symbol, extern void cp_set_block_scope (const struct symbol *symbol,

View File

@ -7713,8 +7713,6 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
VEC (const_char_ptr) *excludes = NULL; VEC (const_char_ptr) *excludes = NULL;
struct cleanup *cleanups; struct cleanup *cleanups;
char *temp;
import_attr = dwarf2_attr (die, DW_AT_import, cu); import_attr = dwarf2_attr (die, DW_AT_import, cu);
if (import_attr == NULL) if (import_attr == NULL)
{ {
@ -7780,14 +7778,9 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
canonical_name = imported_name_prefix; canonical_name = imported_name_prefix;
} }
else if (strlen (imported_name_prefix) > 0) else if (strlen (imported_name_prefix) > 0)
{ canonical_name = obconcat (&objfile->objfile_obstack,
temp = alloca (strlen (imported_name_prefix) imported_name_prefix, "::", imported_name,
+ 2 + strlen (imported_name) + 1); (char *) NULL);
strcpy (temp, imported_name_prefix);
strcat (temp, "::");
strcat (temp, imported_name);
canonical_name = temp;
}
else else
canonical_name = imported_name; canonical_name = imported_name;
@ -7842,6 +7835,7 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
import_alias, import_alias,
imported_declaration, imported_declaration,
excludes, excludes,
0,
&objfile->objfile_obstack); &objfile->objfile_obstack);
do_cleanups (cleanups); 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); const char *previous_prefix = determine_prefix (die, cu);
cp_add_using_directive (previous_prefix, TYPE_NAME (type), NULL, cp_add_using_directive (previous_prefix, TYPE_NAME (type), NULL,
NULL, NULL, &objfile->objfile_obstack); NULL, NULL, 0, &objfile->objfile_obstack);
} }
} }