From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3754 invoked by alias); 29 Jan 2010 16:27:59 -0000 Received: (qmail 3742 invoked by uid 22791); 29 Jan 2010 16:27:56 -0000 X-SWARE-Spam-Status: No, hits=-2.3 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_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; Fri, 29 Jan 2010 16:27:51 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o0TGRoQE028154 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 29 Jan 2010 11:27:50 -0500 Received: from [10.15.16.55] (toner.yyz.redhat.com [10.15.16.55]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o0TGRnhH002135 for ; Fri, 29 Jan 2010 11:27:49 -0500 Message-ID: <4B630D3F.8010507@redhat.com> Date: Fri, 29 Jan 2010 16:27: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 Thunderbird/3.0.1 MIME-Version: 1.0 To: GDB Patches Subject: [patch] Add namespace aliasing support. Content-Type: multipart/mixed; boundary="------------050404020504090002060602" 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-01/txt/msg00646.txt.bz2 This is a multi-part message in MIME format. --------------050404020504090002060602 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 8731 gdb/7935 This patch adds support for namespace aliasing. Eg. namespace A{ int x; } void foo(){ namespace B=A } ... (gdb) p B::x PR gdb/7935: 2010-01-29 Sami Wagiaalla * cp-support.h: Added char* alias element to using_direct data struct. (cp_add_using): Added char* alias argument. (cp_add_using_directive): Ditto. * cp-namespace.c: Updated with the above changes. (cp_lookup_symbol_imports): Check for aliases. * dwarf2read.c (read_import_statement): Figure out local alias for the import and pass it on to cp_add_using. (read_namespace): Pass alias argument to cp_add_using. 2010-01-29 Sami Wagiaalla * gdb.cp/namespace-using.exp: Removed kfail; bug has been fixed. diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c index 8ca9c20..a6ecb26 100644 --- a/gdb/cp-namespace.c +++ b/gdb/cp-namespace.c @@ -117,7 +117,7 @@ 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); + cp_add_using_directive (dest, src, ""); } /* The "+ 2" is for the "::". */ previous_component = next_component + 2; @@ -132,7 +132,7 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol) has already been added, don't add it twice. */ void -cp_add_using_directive (const char *dest, const char *src) +cp_add_using_directive (const char *dest, const char *src, const char* alias) { struct using_direct *current; struct using_direct *new; @@ -146,7 +146,7 @@ cp_add_using_directive (const char *dest, const char *src) return; } - using_directives = cp_add_using (dest, src, using_directives); + using_directives = cp_add_using (dest, src, alias, using_directives); } @@ -198,8 +198,10 @@ cp_is_anonymous (const char *namespace) != NULL); } -/* Create a new struct using direct which imports the namespace SRC - into the scope DEST. +/* 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 an empty string 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. */ @@ -207,6 +209,7 @@ cp_is_anonymous (const char *namespace) struct using_direct * cp_add_using (const char *dest, const char *src, + const char *alias, struct using_direct *next) { struct using_direct *retval; @@ -214,6 +217,8 @@ cp_add_using (const char *dest, retval = xmalloc (sizeof (struct using_direct)); retval->import_src = savestring (src, strlen(src)); retval->import_dest = savestring (dest, strlen(dest)); + retval->alias = savestring (alias, strlen(alias)); + retval->next = next; retval->searched = 0; @@ -344,13 +349,28 @@ cp_lookup_symbol_imports (const char *scope, current->searched = 1; searched_cleanup = make_cleanup (reset_directive_searched, current); - sym = cp_lookup_symbol_namespace (current->import_src, + if (strcmp (name, current->alias) == 0) + /* If the import is creating an alias and the alias matches the + sought name. Pass current->import_src as the NAME to direct the + search towards the aliased namespace. */ + { + sym = cp_lookup_symbol_in_namespace (scope, + current->import_src, + linkage_name, + block, + domain); + } + else if (strcmp ("", current->alias) == 0) + { + /* If this import statement creates no alias, pass current->inner as + NAMESPACE to direct the search towards the imported namespace. */ + sym = cp_lookup_symbol_imports (current->import_src, name, linkage_name, block, domain, 0); - + } current->searched = 0; discard_cleanups (searched_cleanup); diff --git a/gdb/cp-support.h b/gdb/cp-support.h index 33b1b44..5d28bf9 100644 --- a/gdb/cp-support.h +++ b/gdb/cp-support.h @@ -38,14 +38,20 @@ struct demangle_component; /* This struct is designed to store data from using directives. It says that names from namespace IMPORT_SRC should be visible within - namespace IMPORT_DEST. IMPORT_DEST should always be a strict initial - substring of IMPORT_SRC. These form a linked list; NEXT is the next element - of the list. */ + namespace IMPORT_DEST. These form a linked list; NEXT is the next element + of the list. ALIAS is set to a non empty string if the imported namespace + has been aliased. + Eg: + namespace C=A::B; +*/ struct using_direct { char *import_src; char *import_dest; + + char *alias; + struct using_direct *next; /* Used during import search to temporarily mark this node as searched. */ @@ -82,10 +88,12 @@ extern int cp_validate_operator (const char *input); extern int cp_is_anonymous (const char *namespace); extern void cp_add_using_directive (const char *dest, - const char *src); + 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); extern void cp_initialize_namespace (void); diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 2f671ca..ae089eb 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -3385,6 +3385,8 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu) struct dwarf2_cu *imported_cu; const char *imported_name; const char *imported_name_prefix; + char *import_alias; + const char *import_prefix; char *canonical_name; @@ -3436,7 +3438,12 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu) return; } - /* FIXME: dwarf2_name (die); for the local name after import. */ + /* Figure out the local name after import. */ + import_alias = dwarf2_name (die, cu); + if (import_alias == NULL) + { + import_alias = ""; + } /* Figure out where the statement is being imported to. */ import_prefix = determine_prefix (die, cu); @@ -3447,7 +3454,8 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu) if (strlen (imported_name_prefix) > 0) { - canonical_name = alloca (strlen (imported_name_prefix) + 2 + strlen (imported_name) + 1); + canonical_name = alloca (strlen (imported_name_prefix) + + 2 + strlen (imported_name) + 1); strcpy (canonical_name, imported_name_prefix); strcat (canonical_name, "::"); strcat (canonical_name, imported_name); @@ -3458,7 +3466,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, using_directives); + using_directives = cp_add_using (import_prefix, + canonical_name, + import_alias, + using_directives); } static void @@ -5616,7 +5627,7 @@ 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)); + cp_add_using_directive (previous_prefix, TYPE_NAME (type), ""); } } diff --git a/gdb/testsuite/gdb.cp/nsusing.exp b/gdb/testsuite/gdb.cp/nsusing.exp index bd115c4..72a616e 100644 --- a/gdb/testsuite/gdb.cp/nsusing.exp +++ b/gdb/testsuite/gdb.cp/nsusing.exp @@ -116,14 +116,11 @@ if ![runto marker2] then { continue } -setup_kfail "gdb/7935" "*-*-*" gdb_test "print B::_a" "= 1" -setup_kfail "gdb/7935" "*-*-*" gdb_test "print _a" "No symbol \"_a\" in current context." \ "print _a in namespace alias scope" -setup_kfail "gdb/7935" "*-*-*" gdb_test "print x" "No symbol \"x\" in current context." \ "print x in namespace alias scope" --------------050404020504090002060602 Content-Type: text/plain; name="namespace-alias.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="namespace-alias.patch" Content-length: 7842 diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c index 8ca9c20..a6ecb26 100644 --- a/gdb/cp-namespace.c +++ b/gdb/cp-namespace.c @@ -117,7 +117,7 @@ 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); + cp_add_using_directive (dest, src, ""); } /* The "+ 2" is for the "::". */ previous_component = next_component + 2; @@ -132,7 +132,7 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol) has already been added, don't add it twice. */ void -cp_add_using_directive (const char *dest, const char *src) +cp_add_using_directive (const char *dest, const char *src, const char* alias) { struct using_direct *current; struct using_direct *new; @@ -146,7 +146,7 @@ cp_add_using_directive (const char *dest, const char *src) return; } - using_directives = cp_add_using (dest, src, using_directives); + using_directives = cp_add_using (dest, src, alias, using_directives); } @@ -198,8 +198,10 @@ cp_is_anonymous (const char *namespace) != NULL); } -/* Create a new struct using direct which imports the namespace SRC - into the scope DEST. +/* 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 an empty string 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. */ @@ -207,6 +209,7 @@ cp_is_anonymous (const char *namespace) struct using_direct * cp_add_using (const char *dest, const char *src, + const char *alias, struct using_direct *next) { struct using_direct *retval; @@ -214,6 +217,8 @@ cp_add_using (const char *dest, retval = xmalloc (sizeof (struct using_direct)); retval->import_src = savestring (src, strlen(src)); retval->import_dest = savestring (dest, strlen(dest)); + retval->alias = savestring (alias, strlen(alias)); + retval->next = next; retval->searched = 0; @@ -344,13 +349,28 @@ cp_lookup_symbol_imports (const char *scope, current->searched = 1; searched_cleanup = make_cleanup (reset_directive_searched, current); - sym = cp_lookup_symbol_namespace (current->import_src, + if (strcmp (name, current->alias) == 0) + /* If the import is creating an alias and the alias matches the + sought name. Pass current->import_src as the NAME to direct the + search towards the aliased namespace. */ + { + sym = cp_lookup_symbol_in_namespace (scope, + current->import_src, + linkage_name, + block, + domain); + } + else if (strcmp ("", current->alias) == 0) + { + /* If this import statement creates no alias, pass current->inner as + NAMESPACE to direct the search towards the imported namespace. */ + sym = cp_lookup_symbol_imports (current->import_src, name, linkage_name, block, domain, 0); - + } current->searched = 0; discard_cleanups (searched_cleanup); diff --git a/gdb/cp-support.h b/gdb/cp-support.h index 33b1b44..5d28bf9 100644 --- a/gdb/cp-support.h +++ b/gdb/cp-support.h @@ -38,14 +38,20 @@ struct demangle_component; /* This struct is designed to store data from using directives. It says that names from namespace IMPORT_SRC should be visible within - namespace IMPORT_DEST. IMPORT_DEST should always be a strict initial - substring of IMPORT_SRC. These form a linked list; NEXT is the next element - of the list. */ + namespace IMPORT_DEST. These form a linked list; NEXT is the next element + of the list. ALIAS is set to a non empty string if the imported namespace + has been aliased. + Eg: + namespace C=A::B; +*/ struct using_direct { char *import_src; char *import_dest; + + char *alias; + struct using_direct *next; /* Used during import search to temporarily mark this node as searched. */ @@ -82,10 +88,12 @@ extern int cp_validate_operator (const char *input); extern int cp_is_anonymous (const char *namespace); extern void cp_add_using_directive (const char *dest, - const char *src); + 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); extern void cp_initialize_namespace (void); diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 2f671ca..ae089eb 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -3385,6 +3385,8 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu) struct dwarf2_cu *imported_cu; const char *imported_name; const char *imported_name_prefix; + char *import_alias; + const char *import_prefix; char *canonical_name; @@ -3436,7 +3438,12 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu) return; } - /* FIXME: dwarf2_name (die); for the local name after import. */ + /* Figure out the local name after import. */ + import_alias = dwarf2_name (die, cu); + if (import_alias == NULL) + { + import_alias = ""; + } /* Figure out where the statement is being imported to. */ import_prefix = determine_prefix (die, cu); @@ -3447,7 +3454,8 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu) if (strlen (imported_name_prefix) > 0) { - canonical_name = alloca (strlen (imported_name_prefix) + 2 + strlen (imported_name) + 1); + canonical_name = alloca (strlen (imported_name_prefix) + + 2 + strlen (imported_name) + 1); strcpy (canonical_name, imported_name_prefix); strcat (canonical_name, "::"); strcat (canonical_name, imported_name); @@ -3458,7 +3466,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, using_directives); + using_directives = cp_add_using (import_prefix, + canonical_name, + import_alias, + using_directives); } static void @@ -5616,7 +5627,7 @@ 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)); + cp_add_using_directive (previous_prefix, TYPE_NAME (type), ""); } } diff --git a/gdb/testsuite/gdb.cp/nsusing.exp b/gdb/testsuite/gdb.cp/nsusing.exp index bd115c4..72a616e 100644 --- a/gdb/testsuite/gdb.cp/nsusing.exp +++ b/gdb/testsuite/gdb.cp/nsusing.exp @@ -116,14 +116,11 @@ if ![runto marker2] then { continue } -setup_kfail "gdb/7935" "*-*-*" gdb_test "print B::_a" "= 1" -setup_kfail "gdb/7935" "*-*-*" gdb_test "print _a" "No symbol \"_a\" in current context." \ "print _a in namespace alias scope" -setup_kfail "gdb/7935" "*-*-*" gdb_test "print x" "No symbol \"x\" in current context." \ "print x in namespace alias scope" --------------050404020504090002060602--