* 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>
* 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
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));

View File

@ -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,

View File

@ -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);
}
}