mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-10 09:33:36 +00:00
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:
@@ -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.
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ base::base (int _x)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
using namespace B;
|
||||||
|
|
||||||
int
|
int
|
||||||
base::meth ()
|
base::meth ()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user