PR 11408: Backport using_directives memory leak fix.

2010-04-08  Sami Wagiaalla  <swagiaal@redhat.com>

	PR Breakpoints/11408:
	* cp-namespace.c (cp_add_using): Deleted.
	(cp_add_using_directive): Use obstack allocations.
	Merged the function cp_add_using into this one.
	Added 'struct obstack *' argument.
	(cp_scan_for_anonymous_namespaces): Updated.
	* cp-support.h: Updated.
	* dwarf2read.c (read_import_statement): Updated.
	(read_namespace): Updated.
	* buildsym.c (finish_block): Reset using_directives pointer
	after block initialization.


2010-03-22  Sami Wagiaalla  <swagiaal@redhat.com>

	* gdb.cp/gdb2384-base.h: Created 'namespace B'.
	* gdb.cp/gdb2384-base.cc: Use 'namespace B'.
This commit is contained in:
Sami Wagiaalla
2010-04-08 17:15:12 +00:00
parent a5f8b6f631
commit bae949ba0a
8 changed files with 59 additions and 47 deletions

View File

@@ -1,3 +1,17 @@
2010-04-08 Sami Wagiaalla <swagiaal@redhat.com>
PR Breakpoints/11408:
* cp-namespace.c (cp_add_using): Deleted.
(cp_add_using_directive): Use obstack allocations.
Merged the function cp_add_using into this one.
Added 'struct obstack *' argument.
(cp_scan_for_anonymous_namespaces): Updated.
* cp-support.h: Updated.
* dwarf2read.c (read_import_statement): Updated.
(read_namespace): Updated.
* buildsym.c (finish_block): Reset using_directives pointer
after block initialization.
2010-03-18 Joel Brobecker <brobecker@adacore.com> 2010-03-18 Joel Brobecker <brobecker@adacore.com>
* version.in: Set version to 7.1.0.20100318-cvs. * version.in: Set version to 7.1.0.20100318-cvs.

View File

@@ -387,6 +387,7 @@ finish_block (struct symbol *symbol, struct pending **listhead,
} }
block_set_using (block, using_directives, &objfile->objfile_obstack); block_set_using (block, using_directives, &objfile->objfile_obstack);
using_directives = NULL;
record_pending_block (objfile, block, opblock); record_pending_block (objfile, block, opblock);

View File

@@ -117,7 +117,8 @@ cp_scan_for_anonymous_namespaces (const struct symbol *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); cp_add_using_directive (dest, src, NULL,
&SYMBOL_SYMTAB (symbol)->objfile->objfile_obstack);
} }
/* The "+ 2" is for the "::". */ /* The "+ 2" is for the "::". */
previous_component = next_component + 2; previous_component = next_component + 2;
@@ -128,11 +129,18 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol)
} }
} }
/* Add a using directive to using_list. If the using directive in question
has already been added, don't add it twice. */ /* Add a using directive to using_directives. If the using directive in
question has already been added, don't add it twice.
Create a new struct using_direct which imports the namespace SRC into the
scope DEST. ALIAS is the name of the imported namespace in the current
scope. If ALIAS is NULL then the namespace is known by its original name.
The arguments are copied into newly allocated memory so they can be
temporaries. */
void void
cp_add_using_directive (const char *dest, const char *src, const char *alias) cp_add_using_directive (const char *dest, const char *src, const char *alias,
struct obstack *obstack)
{ {
struct using_direct *current; struct using_direct *current;
struct using_direct *new; struct using_direct *new;
@@ -142,12 +150,23 @@ cp_add_using_directive (const char *dest, const char *src, const char *alias)
for (current = using_directives; current != NULL; current = current->next) for (current = using_directives; current != NULL; current = current->next)
{ {
if (strcmp (current->import_src, src) == 0 if (strcmp (current->import_src, src) == 0
&& strcmp (current->import_dest, dest) == 0) && strcmp (current->import_dest, dest) == 0
&& ((alias == NULL && current->alias == NULL)
|| (alias != NULL && current->alias != NULL
&& strcmp (alias, current->alias) == 0)))
return; return;
} }
using_directives = cp_add_using (dest, src, alias, using_directives); new = OBSTACK_ZALLOC (obstack, struct using_direct);
new->import_src = obsavestring (src, strlen (src), obstack);
new->import_dest = obsavestring (dest, strlen (dest), obstack);
if (alias != NULL)
new->alias = obsavestring (alias, strlen (alias), obstack);
new->next = using_directives;
using_directives = new;
} }
/* Record the namespace that the function defined by SYMBOL was /* Record the namespace that the function defined by SYMBOL was
@@ -198,36 +217,6 @@ cp_is_anonymous (const char *namespace)
!= NULL); != NULL);
} }
/* Create a new struct using direct which imports the namespace SRC into the
scope DEST. ALIAS is the name of the imported namespace in the current
scope. If ALIAS is NULL then the namespace is known by its original name.
Set its next member in the linked list to NEXT; allocate all memory
using xmalloc. It copies the strings, so NAME can be a temporary
string. */
struct using_direct *
cp_add_using (const char *dest,
const char *src,
const char *alias,
struct using_direct *next)
{
struct using_direct *retval;
retval = xmalloc (sizeof (struct using_direct));
retval->import_src = savestring (src, strlen(src));
retval->import_dest = savestring (dest, strlen(dest));
if (alias != NULL)
retval->alias = savestring (alias, strlen (alias));
else
retval->alias = NULL;
retval->next = next;
retval->searched = 0;
return retval;
}
/* The C++-specific version of name lookup for static and global /* The C++-specific version of name lookup for static and global
names. This makes sure that names get looked for in all namespaces names. This makes sure that names get looked for in all namespaces
that are in scope. NAME is the natural name of the symbol that that are in scope. NAME is the natural name of the symbol that

View File

@@ -89,13 +89,9 @@ extern int cp_validate_operator (const char *input);
extern int cp_is_anonymous (const char *namespace); extern int cp_is_anonymous (const char *namespace);
extern void cp_add_using_directive (const char *dest, extern void cp_add_using_directive (const char *dest,
const char *src,
const char *alias);
extern struct using_direct *cp_add_using (const char *dest,
const char *src, const char *src,
const char *alias, const char *alias,
struct using_direct *next); struct obstack *obstack);
extern void cp_initialize_namespace (void); extern void cp_initialize_namespace (void);

View File

@@ -3470,10 +3470,10 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
strcpy (canonical_name, imported_name); strcpy (canonical_name, imported_name);
} }
using_directives = cp_add_using (import_prefix, cp_add_using_directive (import_prefix,
canonical_name, canonical_name,
import_alias, import_alias,
using_directives); &cu->objfile->objfile_obstack);
} }
static void static void
@@ -5632,7 +5632,8 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu)
if (is_anonymous) if (is_anonymous)
{ {
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,
&objfile->objfile_obstack);
} }
} }

View File

@@ -1,3 +1,8 @@
2010-04-08 Sami Wagiaalla <swagiaal@redhat.com>
* gdb.cp/gdb2384-base.h: Created 'namespace B'.
* gdb.cp/gdb2384-base.cc: Use 'namespace B'.
2010-03-18 Ulrich Weigand <Ulrich.Weigand@de.ibm.com> 2010-03-18 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
* gdb.mi/gdb680.exp: Revert 2009-06-17 change. * gdb.mi/gdb680.exp: Revert 2009-06-17 change.

View File

@@ -23,6 +23,8 @@ base::base (int _x)
{ {
} }
using namespace B;
int int
base::meth () base::meth ()
{ {

View File

@@ -16,6 +16,10 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
namespace B{
int x;
}
class base class base
{ {
public: public: