Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Sami Wagiaalla <swagiaal@redhat.com>
To: Tom Tromey <tromey@redhat.com>
Cc: GDB Patches <gdb-patches@sourceware.org>
Subject: Re: [patch] Fix using_directive memory leak pr 11236
Date: Tue, 09 Mar 2010 18:19:00 -0000	[thread overview]
Message-ID: <4B969035.8020906@redhat.com> (raw)
In-Reply-To: <m3vdd6vgn6.fsf@fleche.redhat.com>

[-- Attachment #1: Type: text/plain, Size: 6507 bytes --]


> 
> Sami>         if (strcmp (current->import_src, src) == 0
> Sami>  -&&  strcmp (current->import_dest, dest) == 0)
> Sami>  +&&  strcmp (current->import_dest, dest) == 0
> Sami>  +&&  ((!alias&&  !current->alias)
> Sami>  +              || strcmp (current->alias, alias) == 0))
> 
> I think this test is still wrong.
> 

Totally missed that :) Here is a corrected patch:


    2010-03-09  Sami Wagiaalla  <swagiaal@redhat.com>
    
    	PR C++/11236:
    	* 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.

diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c
index 5e894d4..7593475 100644
--- a/gdb/cp-namespace.c
+++ b/gdb/cp-namespace.c
@@ -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
diff --git a/gdb/cp-support.h b/gdb/cp-support.h
index a6a9af1..3921a5f 100644
--- a/gdb/cp-support.h
+++ b/gdb/cp-support.h
@@ -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);
 
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index a05c946..447424e 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -3462,10 +3462,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
@@ -5624,7 +5624,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);
 	}
     }
 

[-- Attachment #2: memoryleak.patch --]
[-- Type: text/plain, Size: 6131 bytes --]


    2010-03-09  Sami Wagiaalla  <swagiaal@redhat.com>
    
    	PR C++/11236:
    	* 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.

diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c
index 5e894d4..7593475 100644
--- a/gdb/cp-namespace.c
+++ b/gdb/cp-namespace.c
@@ -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
diff --git a/gdb/cp-support.h b/gdb/cp-support.h
index a6a9af1..3921a5f 100644
--- a/gdb/cp-support.h
+++ b/gdb/cp-support.h
@@ -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);
 
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index a05c946..447424e 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -3462,10 +3462,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
@@ -5624,7 +5624,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);
 	}
     }
 

  reply	other threads:[~2010-03-09 18:19 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-03-03 20:51 Sami Wagiaalla
2010-03-03 21:49 ` Tom Tromey
2010-03-08 16:33   ` Sami Wagiaalla
2010-03-08 17:59     ` Tom Tromey
2010-03-09 18:19       ` Sami Wagiaalla [this message]
2010-03-09 18:26         ` Tom Tromey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4B969035.8020906@redhat.com \
    --to=swagiaal@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=tromey@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox