]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
PR 11408: Backport using_directives memory leak fix.
authorSami Wagiaalla <swagiaal@redhat.com>
Thu, 8 Apr 2010 17:15:12 +0000 (17:15 +0000)
committerSami Wagiaalla <swagiaal@redhat.com>
Thu, 8 Apr 2010 17:15:12 +0000 (17:15 +0000)
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'.

gdb/ChangeLog
gdb/buildsym.c
gdb/cp-namespace.c
gdb/cp-support.h
gdb/dwarf2read.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.cp/gdb2384-base.cc
gdb/testsuite/gdb.cp/gdb2384-base.h

index 0eeb2290e12f8976b0f685beecb23f668a36d9dd..1a96104f72ff55b35ec42c29514cb7b9cc2e0b70 100644 (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>
 
        * version.in: Set version to 7.1.0.20100318-cvs.
index ff2c9b1a331843d1a679c64487b9501231c10d40..35e4663316f57b95bcfb816d32f0cfed90ef663d 100644 (file)
@@ -387,6 +387,7 @@ finish_block (struct symbol *symbol, struct pending **listhead,
     }
 
   block_set_using (block, using_directives, &objfile->objfile_obstack);
+  using_directives = NULL;
 
   record_pending_block (objfile, block, opblock);
 
index 5e894d4dc3384ea67bb00805667db9dbba56510f..75934755ae8a87275354fa842da248106d450800 100644 (file)
@@ -117,7 +117,8 @@ cp_scan_for_anonymous_namespaces (const struct symbol *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);
+             cp_add_using_directive (dest, src, NULL,
+                                     &SYMBOL_SYMTAB (symbol)->objfile->objfile_obstack);
            }
          /* The "+ 2" is for the "::".  */
          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
-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 *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)
     {
       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;
     }
 
-  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
@@ -198,36 +217,6 @@ cp_is_anonymous (const char *namespace)
          != 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
    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
index a6a9af17b900b5d1e82e7944af00a240fb334ef7..3921a5feda89118779793473ab6a16a479282545 100644 (file)
@@ -90,12 +90,8 @@ extern int cp_is_anonymous (const char *namespace);
 
 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 *alias,
-                                         struct using_direct *next);
+                                    const char *alias,
+                                    struct obstack *obstack);
 
 extern void cp_initialize_namespace (void);
 
index b144dc16d827fce2838c0ea88856c4728c32733d..6345a9cd6653ff9289c79b163af504933bfb138d 100644 (file)
@@ -3470,10 +3470,10 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
       strcpy (canonical_name, imported_name);
     }
 
-  using_directives = cp_add_using (import_prefix,
-                                   canonical_name,
-                                   import_alias,
-                                   using_directives);
+  cp_add_using_directive (import_prefix,
+                          canonical_name,
+                          import_alias,
+                          &cu->objfile->objfile_obstack);
 }
 
 static void
@@ -5632,7 +5632,8 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu)
       if (is_anonymous)
        {
          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);
        }
     }
 
index c7fbf7170bb1dc3e9e115f96444fef0bc20b5586..fa35e2c9dcc47610bb52d81e9ef5d51e25ebc784 100644 (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>
 
        * gdb.mi/gdb680.exp: Revert 2009-06-17 change.
index 09ed04ebace15e46467a4134b162fb9ad4db7cde..b58f30db1f951de26e5fc315393847738df3a24b 100644 (file)
@@ -23,6 +23,8 @@ base::base (int _x)
 {
 }
 
+using namespace B;
+
 int
 base::meth ()
 {
index b09701e5590d77a35ca8bf378b6cf4a9d491d322..981943c369cec22cfa4f616681a131f2fd18c983 100644 (file)
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    */
 
+namespace B{
+  int x;
+}
+
 class base
 {
  public: