/* Symbol table definitions for GDB.
- Copyright 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
- 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
- Foundation, Inc.
+ Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
+ 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007
+ Free Software Foundation, Inc.
This file is part of GDB.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA. */
#if !defined (SYMTAB_H)
#define SYMTAB_H 1
struct blockvector;
struct axs_value;
struct agent_expr;
+enum language;
/* Some of the structures in this file are space critical.
The space-critical structures are:
struct symbol
struct partial_symbol
- These structures are layed out to encourage good packing.
+ These structures are laid out to encourage good packing.
They use ENUM_BITFIELD and short int fields, and they order the
structure members so that fields less than a word are next
to each other so they can be packed together. */
struct general_symbol_info
{
/* Name of the symbol. This is a required field. Storage for the
- name is allocated on the psymbol_obstack or symbol_obstack for
- the associated objfile. For languages like C++ that make a
- distinction between the mangled name and demangled name, this is
- the mangled name. */
+ name is allocated on the objfile_obstack for the associated
+ objfile. For languages like C++ that make a distinction between
+ the mangled name and demangled name, this is the mangled
+ name. */
char *name;
struct block *block;
- char *bytes;
+ gdb_byte *bytes;
CORE_ADDR address;
#define SYMBOL_MATCHES_NATURAL_NAME(symbol, name) \
(strcmp_iw (SYMBOL_NATURAL_NAME (symbol), (name)) == 0)
+/* Macro that returns the name to be used when sorting and searching symbols.
+ In C++, Chill, and Java, we search for the demangled form of a name,
+ and so sort symbols accordingly. In Ada, however, we search by mangled
+ name. If there is no distinct demangled name, then SYMBOL_SEARCH_NAME
+ returns the same value (same pointer) as SYMBOL_LINKAGE_NAME. */
+#define SYMBOL_SEARCH_NAME(symbol) \
+ (symbol_search_name (&(symbol)->ginfo))
+extern char *symbol_search_name (const struct general_symbol_info *);
+
+/* Analogous to SYMBOL_MATCHES_NATURAL_NAME, but uses the search
+ name. */
+#define SYMBOL_MATCHES_SEARCH_NAME(symbol, name) \
+ (strcmp_iw (SYMBOL_SEARCH_NAME (symbol), (name)) == 0)
+
/* Classification types for a minimal symbol. These should be taken as
"advisory only", since if gdb can't easily figure out a
classification it simply selects mst_unknown. It may also have to
struct general_symbol_info ginfo;
- /* The info field is available for caching machine-specific information
- so it doesn't have to rederive the info constantly (over a serial line).
- It is initialized to zero and stays that way until target-dependent code
- sets it. Storage for any data pointed to by this field should be allo-
- cated on the symbol_obstack for the associated objfile.
- The type would be "void *" except for reasons of compatibility with older
+ /* The info field is available for caching machine-specific
+ information so it doesn't have to rederive the info constantly
+ (over a serial line). It is initialized to zero and stays that
+ way until target-dependent code sets it. Storage for any data
+ pointed to by this field should be allocated on the
+ objfile_obstack for the associated objfile. The type would be
+ "void *" except for reasons of compatibility with older
compilers. This field is optional.
Currently, the AMD 29000 tdep.c uses it to remember things it has decoded
LOC_INDIRECT,
/* The variable's address is computed by a set of location
- functions (see "struct location_funcs" below). */
+ functions (see "struct symbol_ops" below). */
LOC_COMPUTED,
/* Same as LOC_COMPUTED, but for function arguments. */
LOC_COMPUTED_ARG
};
-/* A structure of function pointers describing the location of a
- variable, structure member, or structure base class.
-
- These functions' BATON arguments are generic data pointers, holding
- whatever data the functions need --- the code which provides this
- structure also provides the actual contents of the baton, and
- decides its form. However, there may be other rules about where
- the baton data must be allocated; whoever is pointing to this
- `struct location_funcs' object will know the rules. For example,
- when a symbol S's location is LOC_COMPUTED, then
- SYMBOL_LOCATION_FUNCS(S) is pointing to a location_funcs structure,
- and SYMBOL_LOCATION_BATON(S) is the baton, which must be allocated
- on the same obstack as the symbol itself. */
-
-struct location_funcs
+/* The methods needed to implement a symbol class. These methods can
+ use the symbol's .aux_value for additional per-symbol information.
+
+ At present this is only used to implement location expressions. */
+
+struct symbol_ops
{
/* Return the value of the variable SYMBOL, relative to the stack
struct type *type;
+ /* The symbol table containing this symbol. This is the file
+ associated with LINE. */
+ struct symtab *symtab;
+
/* Domain code. */
ENUM_BITFIELD(domain_enum_tag) domain : 6;
/* Address class */
+ /* NOTE: cagney/2003-11-02: The fields "aclass" and "ops" contain
+ overlapping information. By creating a per-aclass ops vector, or
+ using the aclass as an index into an ops table, the aclass and
+ ops fields can be merged. The latter, for instance, would shave
+ 32-bits from each symbol (relative to a symbol lookup, any table
+ index overhead would be in the noise). */
ENUM_BITFIELD(address_class) aclass : 6;
unsigned short line;
- /* Some symbols require an additional value to be recorded on a per-
- symbol basis. Stash those values here. */
+ /* Method's for symbol's of this class. */
+ /* NOTE: cagney/2003-11-02: See comment above attached to "aclass". */
+
+ const struct symbol_ops *ops;
+
+ /* Some symbols require additional information to be recorded on a
+ per- symbol basis. Stash those values here. */
union
{
/* Used by LOC_BASEREG and LOC_BASEREG_ARG. */
short basereg;
-
- /* For a LOC_COMPUTED or LOC_COMPUTED_ARG symbol, this is the
- baton and location_funcs structure to find its location. For a
- LOC_BLOCK symbol for a function in a compilation unit compiled
- with DWARF 2 information, this is information used internally
- by the DWARF 2 code --- specifically, the location expression
- for the frame base for this function. */
+ /* An arbitrary data pointer. Note that this data must be
+ allocated using the same obstack as the symbol itself. */
+ /* So far it is only used by LOC_COMPUTED and LOC_COMPUTED_ARG to
+ find the location location information. For a LOC_BLOCK symbol
+ for a function in a compilation unit compiled with DWARF 2
+ information, this is information used internally by the DWARF 2
+ code --- specifically, the location expression for the frame
+ base for this function. */
/* FIXME drow/2003-02-21: For the LOC_BLOCK case, it might be better
to add a magic symbol to the block containing this information,
or to have a generic debug info annotation slot for symbols. */
- struct
- {
- void *baton;
- struct location_funcs *funcs;
- } loc;
+ void *ptr;
}
aux_value;
#define SYMBOL_CLASS(symbol) (symbol)->aclass
#define SYMBOL_TYPE(symbol) (symbol)->type
#define SYMBOL_LINE(symbol) (symbol)->line
+#define SYMBOL_SYMTAB(symbol) (symbol)->symtab
#define SYMBOL_BASEREG(symbol) (symbol)->aux_value.basereg
#define SYMBOL_OBJFILE(symbol) (symbol)->aux_value.objfile
-#define SYMBOL_LOCATION_BATON(symbol) (symbol)->aux_value.loc.baton
-#define SYMBOL_LOCATION_FUNCS(symbol) (symbol)->aux_value.loc.funcs
+#define SYMBOL_OPS(symbol) (symbol)->ops
+#define SYMBOL_LOCATION_BATON(symbol) (symbol)->aux_value.ptr
\f
/* A partial_symbol records the name, domain, and address class of
symbols whose types we have not parsed yet. For functions, it also
#define ANOFFSET(secoff, whichone) \
((whichone == -1) \
- ? (internal_error (__FILE__, __LINE__, "Section index is uninitialized"), -1) \
+ ? (internal_error (__FILE__, __LINE__, _("Section index is uninitialized")), -1) \
: secoff->offsets[whichone])
/* The size of a section_offsets table for N sections. */
char *debugformat;
- /* String of version information. May be zero. */
+ /* String of producer version information. May be zero. */
- char *version;
+ char *producer;
/* Full name of file as found by searching the source path.
NULL if not yet known. */
Even after the source file has been read into a symtab, the
partial_symtab remains around. They are allocated on an obstack,
- psymbol_obstack. FIXME, this is bad for dynamic linking or VxWorks-
+ objfile_obstack. FIXME, this is bad for dynamic linking or VxWorks-
style execution of a bunch of .o's. */
struct partial_symtab
char *fullname;
+ /* Directory in which it was compiled, or NULL if we don't know. */
+
+ char *dirname;
+
/* Information about the object file from which symbols should be read. */
struct objfile *objfile;
extern struct symtab *lookup_symtab (const char *);
-/* lookup a symbol by name (optional block, optional symtab) */
+/* lookup a symbol by name (optional block, optional symtab) in language */
+
+extern struct symbol *lookup_symbol_in_language (const char *,
+ const struct block *,
+ const domain_enum,
+ enum language,
+ int *,
+ struct symtab **);
+
+/* lookup a symbol by name (optional block, optional symtab)
+ in the current language */
extern struct symbol *lookup_symbol (const char *, const struct block *,
const domain_enum, int *,
extern void clear_pc_function_cache (void);
-extern int find_pc_sect_partial_function (CORE_ADDR, asection *,
- char **, CORE_ADDR *, CORE_ADDR *);
-
/* from symtab.c: */
/* lookup partial symbol table by filename */
/* symtab.c */
+int matching_bfd_sections (asection *, asection *);
+
extern struct partial_symtab *find_main_psymtab (void);
extern struct symtab *find_line_symtab (struct symtab *, int, int *, int *);
extern int in_prologue (CORE_ADDR pc, CORE_ADDR func_start);
+extern CORE_ADDR skip_prologue_using_sal (CORE_ADDR func_addr);
+
extern struct symbol *fixup_symbol_section (struct symbol *,
struct objfile *);