From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9193 invoked by alias); 23 Mar 2010 16:07:28 -0000 Received: (qmail 9183 invoked by uid 22791); 23 Mar 2010 16:07:25 -0000 X-SWARE-Spam-Status: No, hits=-6.8 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,RCVD_IN_DNSWL_HI,SPF_HELO_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 23 Mar 2010 16:07:20 +0000 Received: from int-mx08.intmail.prod.int.phx2.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o2NG7J8i013412 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 23 Mar 2010 12:07:19 -0400 Received: from [10.15.16.55] (toner.yyz.redhat.com [10.15.16.55]) by int-mx08.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o2NG7Ilu005071 for ; Tue, 23 Mar 2010 12:07:18 -0400 Message-ID: <4BA8E6DC.7020701@redhat.com> Date: Tue, 23 Mar 2010 16:07:00 -0000 From: Sami Wagiaalla User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.7) Gecko/20100120 Fedora/3.0.1-1.fc12 Lightning/1.0b1 Thunderbird/3.0.1 MIME-Version: 1.0 To: GDB Patches Subject: [patch] Backport memory leak fix to 7.1 Content-Type: multipart/mixed; boundary="------------050700070809030501010307" X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-03/txt/msg00789.txt.bz2 This is a multi-part message in MIME format. --------------050700070809030501010307 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 7620 this is a combination of the patches posted here http://sourceware.org/ml/gdb-patches/2010-03/msg00124.html and here http://sourceware.org/ml/gdb-patches/2010-03/msg00475.html and commited to HEAD 2010-03-22 Sami Wagiaalla 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 * gdb.cp/gdb2384-base.h: Created 'namespace B'. * gdb.cp/gdb2384-base.cc: Use 'namespace B'. diff --git a/gdb/buildsym.c b/gdb/buildsym.c index ff2c9b1..35e4663 100644 --- a/gdb/buildsym.c +++ b/gdb/buildsym.c @@ -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); 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 b144dc1..6345a9c 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -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); } } diff --git a/gdb/testsuite/gdb.cp/gdb2384-base.cc b/gdb/testsuite/gdb.cp/gdb2384-base.cc index 09ed04e..b58f30d 100644 --- a/gdb/testsuite/gdb.cp/gdb2384-base.cc +++ b/gdb/testsuite/gdb.cp/gdb2384-base.cc @@ -23,6 +23,8 @@ base::base (int _x) { } +using namespace B; + int base::meth () { diff --git a/gdb/testsuite/gdb.cp/gdb2384-base.h b/gdb/testsuite/gdb.cp/gdb2384-base.h index b09701e..981943c 100644 --- a/gdb/testsuite/gdb.cp/gdb2384-base.h +++ b/gdb/testsuite/gdb.cp/gdb2384-base.h @@ -16,6 +16,10 @@ along with this program. If not, see . */ +namespace B{ + int x; +} + class base { public: --------------050700070809030501010307 Content-Type: text/plain; name="memoryleak.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="memoryleak.patch" Content-length: 7422 2010-03-22 Sami Wagiaalla 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 * gdb.cp/gdb2384-base.h: Created 'namespace B'. * gdb.cp/gdb2384-base.cc: Use 'namespace B'. diff --git a/gdb/buildsym.c b/gdb/buildsym.c index ff2c9b1..35e4663 100644 --- a/gdb/buildsym.c +++ b/gdb/buildsym.c @@ -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); 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 b144dc1..6345a9c 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -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); } } diff --git a/gdb/testsuite/gdb.cp/gdb2384-base.cc b/gdb/testsuite/gdb.cp/gdb2384-base.cc index 09ed04e..b58f30d 100644 --- a/gdb/testsuite/gdb.cp/gdb2384-base.cc +++ b/gdb/testsuite/gdb.cp/gdb2384-base.cc @@ -23,6 +23,8 @@ base::base (int _x) { } +using namespace B; + int base::meth () { diff --git a/gdb/testsuite/gdb.cp/gdb2384-base.h b/gdb/testsuite/gdb.cp/gdb2384-base.h index b09701e..981943c 100644 --- a/gdb/testsuite/gdb.cp/gdb2384-base.h +++ b/gdb/testsuite/gdb.cp/gdb2384-base.h @@ -16,6 +16,10 @@ along with this program. If not, see . */ +namespace B{ + int x; +} + class base { public: --------------050700070809030501010307--