mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-30 09:09:16 +08:00
2009-06-29 Sami Wagiaalla <swagiaal@redhat.com>
* dwarf2read.c (read_import_statement): Properly set import location and destination. * cp-support.h (cp_add_using, cp_add_using_directive): Now take char* inner, char* outer arguments. Updated callers. 2009-06-29 Sami Wagiaalla <swagiaal@redhat.com> * gdb.cp/namespace-nested-import.cc: New test. * gdb.cp/namespace-nested-import.exp: New test.
This commit is contained in:
@ -1,3 +1,10 @@
|
||||
2009-06-29 Sami Wagiaalla <swagiaal@redhat.com>
|
||||
|
||||
* dwarf2read.c (read_import_statement): Properly set import location
|
||||
and destination.
|
||||
* cp-support.h (cp_add_using, cp_add_using_directive): Now take char*
|
||||
inner, char* outer arguments. Updated callers.
|
||||
|
||||
2009-06-29 Ulrich Weigand <uweigand@de.ibm.com>
|
||||
|
||||
* value.h (value_subscript, value_subscripted_rvalue,
|
||||
|
@ -103,14 +103,23 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol)
|
||||
"(anonymous namespace)",
|
||||
ANONYMOUS_NAMESPACE_LEN) == 0)
|
||||
{
|
||||
int outer_len = (previous_component == 0 ? 0 : previous_component - 2);
|
||||
int inner_len = next_component;
|
||||
|
||||
char *outer = alloca (outer_len + 1);
|
||||
char *inner = alloca (inner_len + 1);
|
||||
|
||||
memcpy (outer, name, outer_len);
|
||||
memcpy (inner, name, inner_len);
|
||||
|
||||
outer[outer_len] = '\0';
|
||||
inner[inner_len] = '\0';
|
||||
|
||||
/* We've found a component of the name that's an
|
||||
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 (name,
|
||||
previous_component == 0
|
||||
? 0 : previous_component - 2,
|
||||
next_component);
|
||||
cp_add_using_directive (outer, inner);
|
||||
}
|
||||
/* The "+ 2" is for the "::". */
|
||||
previous_component = next_component + 2;
|
||||
@ -121,16 +130,11 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol)
|
||||
}
|
||||
}
|
||||
|
||||
/* Add a using directive to using_list. NAME is the start of a string
|
||||
that should contain the namespaces we want to add as initial
|
||||
substrings, OUTER_LENGTH is the end of the outer namespace, and
|
||||
INNER_LENGTH is the end of the inner namespace. If the using
|
||||
directive in question has already been added, don't add it
|
||||
twice. */
|
||||
/* Add a using directive to using_list. If the using directive in question
|
||||
has already been added, don't add it twice. */
|
||||
|
||||
void
|
||||
cp_add_using_directive (const char *name, unsigned int outer_length,
|
||||
unsigned int inner_length)
|
||||
cp_add_using_directive (const char *outer, const char *inner)
|
||||
{
|
||||
struct using_direct *current;
|
||||
struct using_direct *new;
|
||||
@ -139,14 +143,13 @@ cp_add_using_directive (const char *name, unsigned int outer_length,
|
||||
|
||||
for (current = using_directives; current != NULL; current = current->next)
|
||||
{
|
||||
if ((strncmp (current->inner, name, inner_length) == 0)
|
||||
&& (strlen (current->inner) == inner_length)
|
||||
&& (strlen (current->outer) == outer_length))
|
||||
if (strcmp (current->inner, inner) == 0
|
||||
&& strcmp (current->outer, outer) == 0)
|
||||
return;
|
||||
}
|
||||
|
||||
using_directives = cp_add_using (name, inner_length, outer_length,
|
||||
using_directives);
|
||||
using_directives = cp_add_using (outer, inner, using_directives);
|
||||
|
||||
}
|
||||
|
||||
/* Record the namespace that the function defined by SYMBOL was
|
||||
@ -197,26 +200,22 @@ cp_is_anonymous (const char *namespace)
|
||||
!= NULL);
|
||||
}
|
||||
|
||||
/* Create a new struct using direct whose inner namespace is the
|
||||
initial substring of NAME of leng INNER_LEN and whose outer
|
||||
namespace is the initial substring of NAME of length OUTER_LENGTH.
|
||||
/* Create a new struct using direct whose inner namespace is INNER
|
||||
and whose outer namespace is OUTER.
|
||||
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 *name,
|
||||
unsigned int inner_len,
|
||||
unsigned int outer_len,
|
||||
cp_add_using (const char *outer,
|
||||
const char *inner,
|
||||
struct using_direct *next)
|
||||
{
|
||||
struct using_direct *retval;
|
||||
|
||||
gdb_assert (outer_len < inner_len);
|
||||
|
||||
retval = xmalloc (sizeof (struct using_direct));
|
||||
retval->inner = savestring (name, inner_len);
|
||||
retval->outer = savestring (name, outer_len);
|
||||
retval->inner = savestring (inner, strlen(inner));
|
||||
retval->outer = savestring (outer, strlen(outer));
|
||||
retval->next = next;
|
||||
|
||||
return retval;
|
||||
|
@ -76,13 +76,11 @@ extern struct type *cp_lookup_rtti_type (const char *name,
|
||||
|
||||
extern int cp_is_anonymous (const char *namespace);
|
||||
|
||||
extern void cp_add_using_directive (const char *name,
|
||||
unsigned int outer_length,
|
||||
unsigned int inner_length);
|
||||
extern void cp_add_using_directive (const char *outer,
|
||||
const char *inner);
|
||||
|
||||
extern struct using_direct *cp_add_using (const char *name,
|
||||
unsigned int inner_len,
|
||||
unsigned int outer_len,
|
||||
extern struct using_direct *cp_add_using (const char *outer,
|
||||
const char *inner,
|
||||
struct using_direct *next);
|
||||
|
||||
extern void cp_initialize_namespace (void);
|
||||
|
@ -3043,6 +3043,9 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
|
||||
struct attribute *import_attr;
|
||||
struct die_info *imported_die;
|
||||
const char *imported_name;
|
||||
const char *imported_name_prefix;
|
||||
const char *import_prefix;
|
||||
char *canonical_name;
|
||||
|
||||
import_attr = dwarf2_attr (die, DW_AT_import, cu);
|
||||
if (import_attr == NULL)
|
||||
@ -3093,8 +3096,27 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
|
||||
|
||||
/* FIXME: dwarf2_name (die); for the local name after import. */
|
||||
|
||||
using_directives = cp_add_using (imported_name, strlen (imported_name), 0,
|
||||
using_directives);
|
||||
/* Figure out where the statement is being imported to. */
|
||||
import_prefix = determine_prefix (die, cu);
|
||||
|
||||
/* Figure out what the scope of the imported die is and prepend it
|
||||
to the name of the imported die. */
|
||||
imported_name_prefix = determine_prefix (imported_die, cu);
|
||||
|
||||
if (strlen (imported_name_prefix) > 0)
|
||||
{
|
||||
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);
|
||||
}
|
||||
else
|
||||
{
|
||||
canonical_name = alloca (strlen (imported_name) + 1);
|
||||
strcpy (canonical_name, imported_name);
|
||||
}
|
||||
|
||||
using_directives = cp_add_using (import_prefix,canonical_name, using_directives);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -5053,9 +5075,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 (TYPE_NAME (type),
|
||||
strlen (previous_prefix),
|
||||
strlen (TYPE_NAME (type)));
|
||||
cp_add_using_directive (previous_prefix, TYPE_NAME (type));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,8 @@
|
||||
2009-06-29 Sami Wagiaalla <swagiaal@redhat.com>
|
||||
|
||||
* gdb.cp/namespace-nested-import.cc: New test.
|
||||
* gdb.cp/namespace-nested-import.exp: New test.
|
||||
|
||||
2009-06-27 Daniel Jacobowitz <dan@codesourcery.com>
|
||||
|
||||
* gdb.base/break.exp: Add an XFAIL for gcc/36748.
|
||||
|
12
gdb/testsuite/gdb.cp/namespace-nested-import.cc
Normal file
12
gdb/testsuite/gdb.cp/namespace-nested-import.cc
Normal file
@ -0,0 +1,12 @@
|
||||
namespace A{
|
||||
namespace B{
|
||||
namespace C{
|
||||
int x = 5;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(){
|
||||
using namespace A::B;
|
||||
return C::x;
|
||||
}
|
48
gdb/testsuite/gdb.cp/namespace-nested-import.exp
Normal file
48
gdb/testsuite/gdb.cp/namespace-nested-import.exp
Normal file
@ -0,0 +1,48 @@
|
||||
# Copyright 2008 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
if $tracelevel then {
|
||||
strace $tracelevel
|
||||
}
|
||||
|
||||
set prms_id 0
|
||||
set bug_id 0
|
||||
|
||||
set testfile namespace-nested-import
|
||||
set srcfile ${testfile}.cc
|
||||
set binfile ${objdir}/${subdir}/${testfile}
|
||||
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
|
||||
untested "Couldn't compile test program"
|
||||
return -1
|
||||
}
|
||||
|
||||
# Get things started.
|
||||
|
||||
gdb_exit
|
||||
gdb_start
|
||||
gdb_reinitialize_dir $srcdir/$subdir
|
||||
gdb_load ${binfile}
|
||||
|
||||
############################################
|
||||
# Test printing of a variable from a nested
|
||||
# in a namespace inner to the one which has
|
||||
# been imported.
|
||||
|
||||
if ![runto_main] then {
|
||||
perror "couldn't run to breakpoint main"
|
||||
continue
|
||||
}
|
||||
|
||||
gdb_test "print C::x" "= 5"
|
Reference in New Issue
Block a user