aboutsummaryrefslogtreecommitdiff
path: root/gdb/cp-namespace.c
diff options
context:
space:
mode:
authornobody <>2004-02-14 00:00:34 +0000
committernobody <>2004-02-14 00:00:34 +0000
commit2f344a4dcd2a8c4297702027a943e3587e6b60c8 (patch)
tree8614f4d9fc669ec37a90e4b4f70b31f00c489661 /gdb/cp-namespace.c
parenta5dd37ab655106440e987830db5111b43f271ecc (diff)
downloadbinutils-cagney_bfdfile-20040213-branch.zip
binutils-cagney_bfdfile-20040213-branch.tar.gz
binutils-cagney_bfdfile-20040213-branch.tar.bz2
This commit was manufactured by cvs2svn to create branchcagney_bfdfile-20040213-branchpointcagney_bfdfile-20040213-branch
'cagney_bfdfile-20040213-branch'. Sprout from cagney_bigcore-20040122-branch 2004-01-22 00:00:03 UTC nobody 'This commit was manufactured by cvs2svn to create branch' Cherrypick from master 2004-02-14 00:00:33 UTC gdbadmin <gdbadmin@sourceware.org> '*** empty log message ***': COPYING.NEWLIB ChangeLog Makefile.def Makefile.in bfd/ChangeLog bfd/bfd-in.h bfd/bfd-in2.h bfd/bfdio.c bfd/cache.c bfd/coff-h8300.c bfd/config.in bfd/configure bfd/configure.in bfd/elf-bfd.h bfd/elf.c bfd/elf32-arm.h bfd/elf32-frv.c bfd/elf32-h8300.c bfd/elf64-alpha.c bfd/elfxx-ia64.c bfd/elfxx-mips.c bfd/elfxx-mips.h bfd/elfxx-target.h bfd/libbfd-in.h bfd/libbfd.h bfd/version.h binutils/ChangeLog binutils/readelf.c configure configure.in gas/ChangeLog gas/config/tc-arm.c gas/config/tc-ia64.c gas/config/tc-ia64.h gas/config/tc-m68k.c gas/config/tc-m68k.h gas/config/tc-mips.c gas/config/tc-mips.h gas/doc/internals.texi gas/dwarf2dbg.c gas/frags.c gas/frags.h gas/read.c gas/read.h gas/testsuite/ChangeLog gas/testsuite/gas/arm/arm.exp gas/testsuite/gas/arm/undefined.l gas/testsuite/gas/arm/undefined.s gas/testsuite/gas/macros/test2.s gas/testsuite/gas/mips/div.d gas/testsuite/gas/mips/elf-rel-got-n32.d gas/testsuite/gas/mips/elf-rel-got-n64.d gas/testsuite/gas/mips/elf-rel-xgot-n32.d gas/testsuite/gas/mips/elf-rel-xgot-n64.d gas/testsuite/gas/mips/elf-rel19.d gas/testsuite/gas/mips/elf-rel19.s gas/testsuite/gas/mips/la-svr4pic.d gas/testsuite/gas/mips/la-xgot.d gas/testsuite/gas/mips/lca-svr4pic.d gas/testsuite/gas/mips/lca-xgot.d gas/testsuite/gas/mips/macro-warn-1-n32.d gas/testsuite/gas/mips/macro-warn-1-n32.l gas/testsuite/gas/mips/macro-warn-1.d gas/testsuite/gas/mips/macro-warn-1.l gas/testsuite/gas/mips/macro-warn-1.s gas/testsuite/gas/mips/macro-warn-2-n32.d gas/testsuite/gas/mips/macro-warn-2.d gas/testsuite/gas/mips/macro-warn-2.l gas/testsuite/gas/mips/macro-warn-2.s gas/testsuite/gas/mips/macro-warn-3.d gas/testsuite/gas/mips/macro-warn-3.l gas/testsuite/gas/mips/macro-warn-3.s gas/testsuite/gas/mips/macro-warn-4.d gas/testsuite/gas/mips/macro-warn-4.l gas/testsuite/gas/mips/macro-warn-4.s gas/testsuite/gas/mips/mips.exp gas/testsuite/gas/mips/relax-swap1-mips2.d gas/testsuite/gas/mips/relax-swap1.s gas/testsuite/gas/mips/relax-swap2.s gas/testsuite/gas/sh/basic.exp gas/testsuite/gas/sh/err-sh4a-fp.s gas/testsuite/gas/sh/sh4a-fp.d gas/testsuite/gas/sh/sh4a-fp.s gdb/ChangeLog gdb/Makefile.in gdb/NEWS gdb/PROBLEMS gdb/ada-lang.c gdb/alpha-tdep.c gdb/arch-utils.c gdb/arch-utils.h gdb/arm-tdep.c gdb/auxv.c gdb/auxv.h gdb/avr-tdep.c gdb/ax-gdb.c gdb/bcache.c gdb/blockframe.c gdb/breakpoint.c gdb/breakpoint.h gdb/buildsym.c gdb/c-lang.c gdb/cli/cli-cmds.c gdb/cli/cli-decode.c gdb/coffread.c gdb/config/mips/tm-linux.h gdb/config/nm-linux.h gdb/config/sparc/nm-nbsd.h gdb/config/sparc/obsd.mt gdb/config/sparc/obsd64.mt gdb/configure gdb/configure.host gdb/configure.in gdb/configure.tgt gdb/corelow.c gdb/cp-namespace.c gdb/cp-support.c gdb/cp-support.h gdb/cris-tdep.c gdb/d10v-tdep.c gdb/dbxread.c gdb/defs.h gdb/doc/ChangeLog gdb/doc/gdb.texinfo gdb/doc/gdbint.texinfo gdb/doc/stabs.texinfo gdb/dwarf2-frame.c gdb/dwarf2-frame.h gdb/dwarf2loc.c gdb/dwarf2loc.h gdb/dwarf2read.c gdb/dwarfread.c gdb/elfread.c gdb/f-lang.c gdb/findvar.c gdb/frame.c gdb/frame.h gdb/frv-tdep.c gdb/gdb-events.h gdb/gdb-events.sh gdb/gdb_curses.h gdb/gdb_obstack.h gdb/gdbarch.c gdb/gdbarch.h gdb/gdbarch.sh gdb/gdbserver/ChangeLog gdb/gdbserver/linux-low.c gdb/gdbserver/linux-low.h gdb/gdbserver/regcache.c gdb/gdbtypes.c gdb/gdbtypes.h gdb/h8300-tdep.c gdb/hppa-tdep.c gdb/hpread.c gdb/i386-linux-tdep.c gdb/i386-nto-tdep.c gdb/ia64-tdep.c gdb/infcmd.c gdb/infrun.c gdb/inftarg.c gdb/jv-lang.c gdb/language.c gdb/language.h gdb/linespec.c gdb/linux-proc.c gdb/m2-lang.c gdb/m32r-rom.c gdb/m32r-tdep.c gdb/m68hc11-tdep.c gdb/m68k-tdep.c gdb/m68klinux-tdep.c gdb/main.c gdb/mcore-tdep.c gdb/mdebugread.c gdb/mi/mi-cmd-stack.c gdb/mi/mi-cmd-var.c gdb/mi/mi-cmds.h gdb/minsyms.c gdb/mips-linux-nat.c gdb/mips-linux-tdep.c gdb/mips-tdep.c gdb/mn10300-tdep.c gdb/ns32k-tdep.c gdb/objc-lang.c gdb/objfiles.c gdb/objfiles.h gdb/osabi.c gdb/p-lang.c gdb/pa64solib.c gdb/printcmd.c gdb/proc-api.c gdb/procfs.c gdb/regcache.c gdb/remote-fileio.c gdb/remote-rdi.c gdb/remote-sim.c gdb/remote.c gdb/rs6000-tdep.c gdb/s390-tdep.c gdb/scm-lang.c gdb/ser-pipe.c gdb/sh-tdep.c gdb/sh64-tdep.c gdb/sol-thread.c gdb/solib-sunos.c gdb/somread.c gdb/somsolib.c gdb/source.c gdb/sparc-nat.c gdb/sparc-tdep.c gdb/sparc-tdep.h gdb/sparc64-tdep.h gdb/sparc64nbsd-tdep.c gdb/sparc64obsd-tdep.c gdb/sparcnbsd-tdep.c gdb/sparcobsd-tdep.c gdb/stabsread.c gdb/stack.c gdb/symfile.c gdb/symfile.h gdb/symmisc.c gdb/symtab.c gdb/symtab.h gdb/target.h gdb/testsuite/ChangeLog gdb/testsuite/config/sim.exp gdb/testsuite/gdb.arch/gdb1291.c gdb/testsuite/gdb.arch/gdb1431.c gdb/testsuite/gdb.asm/asm-source.exp gdb/testsuite/gdb.asm/ia64.inc gdb/testsuite/gdb.asm/openbsd.inc gdb/testsuite/gdb.base/Makefile.in gdb/testsuite/gdb.base/bang.exp gdb/testsuite/gdb.base/call-ar-st.exp gdb/testsuite/gdb.base/charset.c gdb/testsuite/gdb.base/chng-syms.c gdb/testsuite/gdb.base/chng-syms.exp gdb/testsuite/gdb.base/completion.exp gdb/testsuite/gdb.base/dump.c gdb/testsuite/gdb.base/dump.exp gdb/testsuite/gdb.base/fileio.c gdb/testsuite/gdb.base/finish.exp gdb/testsuite/gdb.base/gcore.exp gdb/testsuite/gdb.base/huge.c gdb/testsuite/gdb.base/huge.exp gdb/testsuite/gdb.base/info-proc.exp gdb/testsuite/gdb.base/langs.exp gdb/testsuite/gdb.base/maint.exp gdb/testsuite/gdb.base/pending.c gdb/testsuite/gdb.base/pending.exp gdb/testsuite/gdb.base/pendshr.c gdb/testsuite/gdb.base/return2.exp gdb/testsuite/gdb.base/shlib-call.exp gdb/testsuite/gdb.cp/ambiguous.exp gdb/testsuite/gdb.cp/annota2.exp gdb/testsuite/gdb.cp/annota3.exp gdb/testsuite/gdb.cp/anon-union.exp gdb/testsuite/gdb.cp/breakpoint.cc gdb/testsuite/gdb.cp/breakpoint.exp gdb/testsuite/gdb.cp/bs15503.cc gdb/testsuite/gdb.cp/casts.exp gdb/testsuite/gdb.cp/class2.cc gdb/testsuite/gdb.cp/classes.exp gdb/testsuite/gdb.cp/cplusfuncs.exp gdb/testsuite/gdb.cp/ctti.exp gdb/testsuite/gdb.cp/cttiadd.cc gdb/testsuite/gdb.cp/cttiadd1.cc gdb/testsuite/gdb.cp/cttiadd2.cc gdb/testsuite/gdb.cp/cttiadd3.cc gdb/testsuite/gdb.cp/demangle.exp gdb/testsuite/gdb.cp/derivation.exp gdb/testsuite/gdb.cp/exception.cc gdb/testsuite/gdb.cp/exception.exp gdb/testsuite/gdb.cp/hang.exp gdb/testsuite/gdb.cp/inherit.exp gdb/testsuite/gdb.cp/local.exp gdb/testsuite/gdb.cp/maint.exp gdb/testsuite/gdb.cp/member-ptr.cc gdb/testsuite/gdb.cp/member-ptr.exp gdb/testsuite/gdb.cp/method.exp gdb/testsuite/gdb.cp/misc.exp gdb/testsuite/gdb.cp/namespace.cc gdb/testsuite/gdb.cp/namespace.exp gdb/testsuite/gdb.cp/namespace1.cc gdb/testsuite/gdb.cp/overload.cc gdb/testsuite/gdb.cp/overload.exp gdb/testsuite/gdb.cp/ovldbreak.exp gdb/testsuite/gdb.cp/psmang.exp gdb/testsuite/gdb.cp/ref-types.exp gdb/testsuite/gdb.cp/rtti.exp gdb/testsuite/gdb.cp/rtti1.cc gdb/testsuite/gdb.cp/templates.exp gdb/testsuite/gdb.cp/userdef.exp gdb/testsuite/gdb.cp/virtfunc.exp gdb/testsuite/gdb.mi/mi-stack.exp gdb/testsuite/gdb.mi/mi-var-child.exp gdb/testsuite/gdb.objc/basicclass.exp gdb/testsuite/gdb.threads/gcore-thread.exp gdb/testsuite/gdb.threads/thread-specific.c gdb/testsuite/gdb.threads/thread-specific.exp gdb/testsuite/lib/compiler.c gdb/testsuite/lib/compiler.cc gdb/testsuite/lib/gdb.exp gdb/tui/tui-command.c gdb/tui/tui-data.c gdb/tui/tui-data.h gdb/tui/tui-disasm.c gdb/tui/tui-file.c gdb/tui/tui-hooks.c gdb/tui/tui-hooks.h gdb/tui/tui-interp.c gdb/tui/tui-io.c gdb/tui/tui-layout.c gdb/tui/tui-layout.h gdb/tui/tui-regs.c gdb/tui/tui-regs.h gdb/tui/tui-source.c gdb/tui/tui-source.h gdb/tui/tui-stack.c gdb/tui/tui-stack.h gdb/tui/tui-win.c gdb/tui/tui-win.h gdb/tui/tui-windata.c gdb/tui/tui-windata.h gdb/tui/tui-wingeneral.c gdb/tui/tui-wingeneral.h gdb/tui/tui-winsource.c gdb/tui/tui-winsource.h gdb/tui/tui.c gdb/tui/tui.h gdb/utils.c gdb/v850-tdep.c gdb/valops.c gdb/values.c gdb/vax-tdep.c gdb/version.in gdb/xcoffread.c gdb/xstormy16-tdep.c include/elf/ChangeLog include/elf/common.h include/opcode/ChangeLog include/opcode/h8300.h ld/ChangeLog ld/emulparams/armelf.sh ld/emulparams/armelf_linux.sh ld/emulparams/elf32bmip.sh ld/emulparams/elf32bmipn32.sh ld/emulparams/elf32btsmipn32.sh ld/emulparams/elf64_ia64.sh ld/emulparams/shlelf_linux.sh ld/emultempl/pe.em ld/genscripts.sh ld/testsuite/ChangeLog ld/testsuite/ld-arm/arm-app-abs32.d ld/testsuite/ld-arm/arm-app-abs32.r ld/testsuite/ld-arm/arm-app-abs32.s ld/testsuite/ld-arm/arm-elf.exp ld/testsuite/ld-h8300/h8300.exp ld/testsuite/ld-h8300/relax-5-coff.d ld/testsuite/ld-h8300/relax-5.d ld/testsuite/ld-h8300/relax-5.s libiberty/ChangeLog libiberty/Makefile.in libiberty/configure libiberty/configure.ac libiberty/getpwd.c libiberty/maint-tool opcodes/ChangeLog opcodes/m32r-dis.c opcodes/sh-opc.h readline/ChangeLog.gdb readline/bind.c readline/mbutil.c readline/readline.c readline/vi_mode.c sim/ChangeLog sim/configure sim/configure.in sim/m32r/ChangeLog sim/m32r/mloop2.in sim/m32r/mloopx.in sim/ppc/ChangeLog sim/ppc/ppc-instructions sim/sh/ChangeLog sim/sh/gencode.c sim/sh/interp.c sim/testsuite/ChangeLog sim/testsuite/lib/sim-defs.exp sim/testsuite/sim/mips/ChangeLog sim/testsuite/sim/mips/basic.exp sim/testsuite/sim/mips/sanity.s sim/testsuite/sim/mips/testutils.inc sim/testsuite/sim/sh/ChangeLog sim/testsuite/sim/sh/allinsn.exp sim/testsuite/sim/sh/and.s sim/testsuite/sim/sh/movi.s sim/testsuite/sim/sh/sett.s sim/testsuite/sim/sh/testutils.inc Delete: gdb/testsuite/gdb.mi/mi1-basics.exp gdb/testsuite/gdb.mi/mi1-break.exp gdb/testsuite/gdb.mi/mi1-console.exp gdb/testsuite/gdb.mi/mi1-disassemble.exp gdb/testsuite/gdb.mi/mi1-eval.exp gdb/testsuite/gdb.mi/mi1-hack-cli.exp gdb/testsuite/gdb.mi/mi1-pthreads.exp gdb/testsuite/gdb.mi/mi1-read-memory.exp gdb/testsuite/gdb.mi/mi1-regs.exp gdb/testsuite/gdb.mi/mi1-return.exp gdb/testsuite/gdb.mi/mi1-simplerun.exp gdb/testsuite/gdb.mi/mi1-stack.exp gdb/testsuite/gdb.mi/mi1-stepi.exp gdb/testsuite/gdb.mi/mi1-symbol.exp gdb/testsuite/gdb.mi/mi1-until.exp gdb/testsuite/gdb.mi/mi1-var-block.exp gdb/testsuite/gdb.mi/mi1-var-child.exp gdb/testsuite/gdb.mi/mi1-var-cmd.exp gdb/testsuite/gdb.mi/mi1-var-display.exp gdb/testsuite/gdb.mi/mi1-watch.exp
Diffstat (limited to 'gdb/cp-namespace.c')
-rw-r--r--gdb/cp-namespace.c109
1 files changed, 92 insertions, 17 deletions
diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c
index fed440e..a731352 100644
--- a/gdb/cp-namespace.c
+++ b/gdb/cp-namespace.c
@@ -31,6 +31,7 @@
#include "gdbtypes.h"
#include "dictionary.h"
#include "command.h"
+#include "frame.h"
/* When set, the file that we're processing is known to have debugging
info for C++ namespaces. */
@@ -85,6 +86,10 @@ static struct symbol *lookup_symbol_file (const char *name,
struct symtab **symtab,
int anonymous_namespace);
+static struct type *cp_lookup_transparent_type_loop (const char *name,
+ const char *scope,
+ int scope_len);
+
static void initialize_namespace_symtab (struct objfile *objfile);
static struct block *get_possible_namespace_block (struct objfile *objfile);
@@ -551,6 +556,74 @@ cp_lookup_nested_type (struct type *parent_type,
}
}
+/* The C++-version of lookup_transparent_type. */
+
+/* FIXME: carlton/2004-01-16: The problem that this is trying to
+ address is that, unfortunately, sometimes NAME is wrong: it may not
+ include the name of namespaces enclosing the type in question.
+ lookup_transparent_type gets called when the the type in question
+ is a declaration, and we're trying to find its definition; but, for
+ declarations, our type name deduction mechanism doesn't work.
+ There's nothing we can do to fix this in general, I think, in the
+ absence of debug information about namespaces (I've filed PR
+ gdb/1511 about this); until such debug information becomes more
+ prevalent, one heuristic which sometimes looks is to search for the
+ definition in namespaces containing the current namespace.
+
+ We should delete this functions once the appropriate debug
+ information becomes more widespread. (GCC 3.4 will be the first
+ released version of GCC with such information.) */
+
+struct type *
+cp_lookup_transparent_type (const char *name)
+{
+ /* First, try the honest way of looking up the definition. */
+ struct type *t = basic_lookup_transparent_type (name);
+ const char *scope;
+
+ if (t != NULL)
+ return t;
+
+ /* If that doesn't work and we're within a namespace, look there
+ instead. */
+ scope = block_scope (get_selected_block (0));
+
+ if (scope[0] == '\0')
+ return NULL;
+
+ return cp_lookup_transparent_type_loop (name, scope, 0);
+}
+
+/* Lookup the the type definition associated to NAME in
+ namespaces/classes containing SCOPE whose name is strictly longer
+ than LENGTH. LENGTH must be the index of the start of a
+ component of SCOPE. */
+
+static struct type *
+cp_lookup_transparent_type_loop (const char *name, const char *scope,
+ int length)
+{
+ int scope_length = cp_find_first_component (scope + length);
+ char *full_name;
+
+ /* If the current scope is followed by "::", look in the next
+ component. */
+ if (scope[scope_length] == ':')
+ {
+ struct type *retval
+ = cp_lookup_transparent_type_loop (name, scope, scope_length + 2);
+ if (retval != NULL)
+ return retval;
+ }
+
+ full_name = alloca (scope_length + 2 + strlen (name) + 1);
+ strncpy (full_name, scope, scope_length);
+ strncpy (full_name + scope_length, "::", 2);
+ strcpy (full_name + scope_length + 2, name);
+
+ return basic_lookup_transparent_type (full_name);
+}
+
/* Now come functions for dealing with symbols associated to
namespaces. (They're used to store the namespaces themselves, not
objects that live in the namespaces.) These symbols come in two
@@ -582,7 +655,7 @@ initialize_namespace_symtab (struct objfile *objfile)
namespace_symtab->free_code = free_nothing;
namespace_symtab->dirname = NULL;
- bv = obstack_alloc (&objfile->symbol_obstack,
+ bv = obstack_alloc (&objfile->objfile_obstack,
sizeof (struct blockvector)
+ FIRST_LOCAL_BLOCK * sizeof (struct block *));
BLOCKVECTOR_NBLOCKS (bv) = FIRST_LOCAL_BLOCK + 1;
@@ -590,12 +663,12 @@ initialize_namespace_symtab (struct objfile *objfile)
/* Allocate empty GLOBAL_BLOCK and STATIC_BLOCK. */
- bl = allocate_block (&objfile->symbol_obstack);
- BLOCK_DICT (bl) = dict_create_linear (&objfile->symbol_obstack,
+ bl = allocate_block (&objfile->objfile_obstack);
+ BLOCK_DICT (bl) = dict_create_linear (&objfile->objfile_obstack,
NULL);
BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK) = bl;
- bl = allocate_block (&objfile->symbol_obstack);
- BLOCK_DICT (bl) = dict_create_linear (&objfile->symbol_obstack,
+ bl = allocate_block (&objfile->objfile_obstack);
+ BLOCK_DICT (bl) = dict_create_linear (&objfile->objfile_obstack,
NULL);
BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK) = bl;
@@ -613,7 +686,7 @@ initialize_namespace_symtab (struct objfile *objfile)
having a symtab/block for this purpose seems like the best
solution for now. */
- bl = allocate_block (&objfile->symbol_obstack);
+ bl = allocate_block (&objfile->objfile_obstack);
BLOCK_DICT (bl) = dict_create_hashed_expandable ();
BLOCKVECTOR_BLOCK (bv, FIRST_LOCAL_BLOCK) = bl;
@@ -710,17 +783,23 @@ check_one_possible_namespace_symbol (const char *name, int len,
struct objfile *objfile)
{
struct block *block = get_possible_namespace_block (objfile);
- char *name_copy = obsavestring (name, len, &objfile->symbol_obstack);
- struct symbol *sym = lookup_block_symbol (block, name_copy, NULL,
- VAR_DOMAIN);
+ char *name_copy = alloca (len + 1);
+ struct symbol *sym;
+
+ memcpy (name_copy, name, len);
+ name_copy[len] = '\0';
+ sym = lookup_block_symbol (block, name_copy, NULL, VAR_DOMAIN);
if (sym == NULL)
{
- struct type *type = init_type (TYPE_CODE_NAMESPACE, 0, 0,
- name_copy, objfile);
+ struct type *type;
+ name_copy = obsavestring (name, len, &objfile->objfile_obstack);
+
+ type = init_type (TYPE_CODE_NAMESPACE, 0, 0, name_copy, objfile);
+
TYPE_TAG_NAME (type) = TYPE_NAME (type);
- sym = obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol));
+ sym = obstack_alloc (&objfile->objfile_obstack, sizeof (struct symbol));
memset (sym, 0, sizeof (struct symbol));
SYMBOL_LANGUAGE (sym) = language_cplus;
SYMBOL_SET_NAMES (sym, name_copy, len, objfile);
@@ -733,11 +812,7 @@ check_one_possible_namespace_symbol (const char *name, int len,
return 0;
}
else
- {
- obstack_free (&objfile->symbol_obstack, name_copy);
-
- return 1;
- }
+ return 1;
}
/* Look for a symbol named NAME in all the possible namespace blocks.