mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-07-01 01:45:51 +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>
|
2009-06-29 Ulrich Weigand <uweigand@de.ibm.com>
|
||||||
|
|
||||||
* value.h (value_subscript, value_subscripted_rvalue,
|
* value.h (value_subscript, value_subscripted_rvalue,
|
||||||
|
@ -103,14 +103,23 @@ cp_scan_for_anonymous_namespaces (const struct symbol *symbol)
|
|||||||
"(anonymous namespace)",
|
"(anonymous namespace)",
|
||||||
ANONYMOUS_NAMESPACE_LEN) == 0)
|
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
|
/* We've found a component of the name that's an
|
||||||
anonymous namespace. So add symbols in it to the
|
anonymous namespace. So add symbols in it to the
|
||||||
namespace given by the previous component if there is
|
namespace given by the previous component if there is
|
||||||
one, or to the global namespace if there isn't. */
|
one, or to the global namespace if there isn't. */
|
||||||
cp_add_using_directive (name,
|
cp_add_using_directive (outer, inner);
|
||||||
previous_component == 0
|
|
||||||
? 0 : previous_component - 2,
|
|
||||||
next_component);
|
|
||||||
}
|
}
|
||||||
/* The "+ 2" is for the "::". */
|
/* The "+ 2" is for the "::". */
|
||||||
previous_component = next_component + 2;
|
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
|
/* Add a using directive to using_list. If the using directive in question
|
||||||
that should contain the namespaces we want to add as initial
|
has already been added, don't add it twice. */
|
||||||
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. */
|
|
||||||
|
|
||||||
void
|
void
|
||||||
cp_add_using_directive (const char *name, unsigned int outer_length,
|
cp_add_using_directive (const char *outer, const char *inner)
|
||||||
unsigned int inner_length)
|
|
||||||
{
|
{
|
||||||
struct using_direct *current;
|
struct using_direct *current;
|
||||||
struct using_direct *new;
|
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)
|
for (current = using_directives; current != NULL; current = current->next)
|
||||||
{
|
{
|
||||||
if ((strncmp (current->inner, name, inner_length) == 0)
|
if (strcmp (current->inner, inner) == 0
|
||||||
&& (strlen (current->inner) == inner_length)
|
&& strcmp (current->outer, outer) == 0)
|
||||||
&& (strlen (current->outer) == outer_length))
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
using_directives = cp_add_using (name, inner_length, outer_length,
|
using_directives = cp_add_using (outer, inner, using_directives);
|
||||||
using_directives);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Record the namespace that the function defined by SYMBOL was
|
/* Record the namespace that the function defined by SYMBOL was
|
||||||
@ -197,26 +200,22 @@ cp_is_anonymous (const char *namespace)
|
|||||||
!= NULL);
|
!= NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create a new struct using direct whose inner namespace is the
|
/* Create a new struct using direct whose inner namespace is INNER
|
||||||
initial substring of NAME of leng INNER_LEN and whose outer
|
and whose outer namespace is OUTER.
|
||||||
namespace is the initial substring of NAME of length OUTER_LENGTH.
|
|
||||||
Set its next member in the linked list to NEXT; allocate all memory
|
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
|
using xmalloc. It copies the strings, so NAME can be a temporary
|
||||||
string. */
|
string. */
|
||||||
|
|
||||||
struct using_direct *
|
struct using_direct *
|
||||||
cp_add_using (const char *name,
|
cp_add_using (const char *outer,
|
||||||
unsigned int inner_len,
|
const char *inner,
|
||||||
unsigned int outer_len,
|
|
||||||
struct using_direct *next)
|
struct using_direct *next)
|
||||||
{
|
{
|
||||||
struct using_direct *retval;
|
struct using_direct *retval;
|
||||||
|
|
||||||
gdb_assert (outer_len < inner_len);
|
|
||||||
|
|
||||||
retval = xmalloc (sizeof (struct using_direct));
|
retval = xmalloc (sizeof (struct using_direct));
|
||||||
retval->inner = savestring (name, inner_len);
|
retval->inner = savestring (inner, strlen(inner));
|
||||||
retval->outer = savestring (name, outer_len);
|
retval->outer = savestring (outer, strlen(outer));
|
||||||
retval->next = next;
|
retval->next = next;
|
||||||
|
|
||||||
return retval;
|
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 int cp_is_anonymous (const char *namespace);
|
||||||
|
|
||||||
extern void cp_add_using_directive (const char *name,
|
extern void cp_add_using_directive (const char *outer,
|
||||||
unsigned int outer_length,
|
const char *inner);
|
||||||
unsigned int inner_length);
|
|
||||||
|
|
||||||
extern struct using_direct *cp_add_using (const char *name,
|
extern struct using_direct *cp_add_using (const char *outer,
|
||||||
unsigned int inner_len,
|
const char *inner,
|
||||||
unsigned int outer_len,
|
|
||||||
struct using_direct *next);
|
struct using_direct *next);
|
||||||
|
|
||||||
extern void cp_initialize_namespace (void);
|
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 attribute *import_attr;
|
||||||
struct die_info *imported_die;
|
struct die_info *imported_die;
|
||||||
const char *imported_name;
|
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);
|
import_attr = dwarf2_attr (die, DW_AT_import, cu);
|
||||||
if (import_attr == NULL)
|
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. */
|
/* FIXME: dwarf2_name (die); for the local name after import. */
|
||||||
|
|
||||||
using_directives = cp_add_using (imported_name, strlen (imported_name), 0,
|
/* Figure out where the statement is being imported to. */
|
||||||
using_directives);
|
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
|
static void
|
||||||
@ -5053,9 +5075,7 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu)
|
|||||||
if (is_anonymous)
|
if (is_anonymous)
|
||||||
{
|
{
|
||||||
const char *previous_prefix = determine_prefix (die, cu);
|
const char *previous_prefix = determine_prefix (die, cu);
|
||||||
cp_add_using_directive (TYPE_NAME (type),
|
cp_add_using_directive (previous_prefix, TYPE_NAME (type));
|
||||||
strlen (previous_prefix),
|
|
||||||
strlen (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>
|
2009-06-27 Daniel Jacobowitz <dan@codesourcery.com>
|
||||||
|
|
||||||
* gdb.base/break.exp: Add an XFAIL for gcc/36748.
|
* 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