/* Symbol table definitions for GDB.
- Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
- 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009, 2010,
- 2011 Free Software Foundation, Inc.
+ Copyright (C) 1986-2013 Free Software Foundation, Inc.
This file is part of GDB.
#define SYMTAB_H 1
#include "vec.h"
+#include "gdb_vecs.h"
+#include "gdbtypes.h"
/* Opaque declarations. */
struct ui_file;
struct agent_expr;
struct program_space;
struct language_defn;
+struct probe;
+struct common_block;
/* Some of the structures in this file are space critical.
The space-critical structures are:
struct cplus_specific
{
- char *demangled_name;
+ const char *demangled_name;
};
/* Define a structure for the information that is common to all symbol types,
the mangled name and demangled name, this is the mangled
name. */
- char *name;
+ const char *name;
/* Value of the symbol. Which member of this union to use, and what
it means, depends on what kind of symbol this is and its
union
{
- /* The fact that this is a long not a LONGEST mainly limits the
- range of a LOC_CONST. Since LOC_CONST_BYTES exists, I'm not
- sure that is a big deal. */
- long ivalue;
+ LONGEST ivalue;
struct block *block;
- gdb_byte *bytes;
+ const gdb_byte *bytes;
CORE_ADDR address;
+ /* A common block. Used with LOC_COMMON_BLOCK. */
+
+ struct common_block *common_block;
+
/* For opaque typedef struct chain. */
struct symbol *chain;
union
{
+ /* A pointer to an obstack that can be used for storage associated
+ with this symbol. This is only used by Ada, and only when the
+ 'ada_mangled' field is zero. */
+ struct obstack *obstack;
+
/* This is used by languages which wish to store a demangled name.
currently used by Ada, Java, and Objective C. */
struct mangled_lang
{
- char *demangled_name;
+ const char *demangled_name;
}
mangled_lang;
ENUM_BITFIELD(language) language : 8;
+ /* This is only used by Ada. If set, then the 'mangled_lang' field
+ of language_specific is valid. Otherwise, the 'obstack' field is
+ valid. */
+ unsigned int ada_mangled : 1;
+
/* Which section is this symbol in? This is an index into
section_offsets for this objfile. Negative means that the symbol
- does not get relocated relative to a section.
- Disclaimer: currently this is just used for xcoff, so don't
- expect all symbol-reading code to set it correctly (the ELF code
- also tries to set it correctly). */
+ does not get relocated relative to a section. */
short section;
-
- /* The section associated with this symbol. It can be NULL. */
-
- struct obj_section *obj_section;
};
-extern void symbol_set_demangled_name (struct general_symbol_info *, char *,
- struct objfile *);
+extern void symbol_set_demangled_name (struct general_symbol_info *,
+ const char *,
+ struct obstack *);
-extern char *symbol_get_demangled_name (const struct general_symbol_info *);
+extern const char *symbol_get_demangled_name
+ (const struct general_symbol_info *);
extern CORE_ADDR symbol_overlayed_address (CORE_ADDR, struct obj_section *);
#define SYMBOL_VALUE(symbol) (symbol)->ginfo.value.ivalue
#define SYMBOL_VALUE_ADDRESS(symbol) (symbol)->ginfo.value.address
#define SYMBOL_VALUE_BYTES(symbol) (symbol)->ginfo.value.bytes
+#define SYMBOL_VALUE_COMMON_BLOCK(symbol) (symbol)->ginfo.value.common_block
#define SYMBOL_BLOCK_VALUE(symbol) (symbol)->ginfo.value.block
#define SYMBOL_VALUE_CHAIN(symbol) (symbol)->ginfo.value.chain
#define SYMBOL_LANGUAGE(symbol) (symbol)->ginfo.language
#define SYMBOL_SECTION(symbol) (symbol)->ginfo.section
-#define SYMBOL_OBJ_SECTION(symbol) (symbol)->ginfo.obj_section
+#define SYMBOL_OBJ_SECTION(objfile, symbol) \
+ (((symbol)->ginfo.section >= 0) \
+ ? (&(((objfile)->sections)[(symbol)->ginfo.section])) \
+ : NULL)
/* Initializes the language dependent portion of a symbol
depending upon the language for the symbol. */
-#define SYMBOL_SET_LANGUAGE(symbol,language) \
- (symbol_set_language (&(symbol)->ginfo, (language)))
+#define SYMBOL_SET_LANGUAGE(symbol,language,obstack) \
+ (symbol_set_language (&(symbol)->ginfo, (language), (obstack)))
extern void symbol_set_language (struct general_symbol_info *symbol,
- enum language language);
+ enum language language,
+ struct obstack *obstack);
/* Set just the linkage name of a symbol; do not try to demangle
it. Used for constructs which do not have a mangled name,
#define SYMBOL_NATURAL_NAME(symbol) \
(symbol_natural_name (&(symbol)->ginfo))
-extern char *symbol_natural_name (const struct general_symbol_info *symbol);
+extern const char *symbol_natural_name
+ (const struct general_symbol_info *symbol);
/* Return SYMBOL's name from the point of view of the linker. In
languages like C++ where symbols may be mangled for ease of
that symbol. If no demangled name exists, return NULL. */
#define SYMBOL_DEMANGLED_NAME(symbol) \
(symbol_demangled_name (&(symbol)->ginfo))
-extern char *symbol_demangled_name (const struct general_symbol_info *symbol);
+extern const char *symbol_demangled_name
+ (const struct general_symbol_info *symbol);
/* Macro that returns a version of the name of a symbol that is
suitable for output. In C++ this is the "demangled" form of the
(demangle ? SYMBOL_NATURAL_NAME (symbol) : SYMBOL_LINKAGE_NAME (symbol))
extern int demangle;
-/* Macro that tests a symbol for a match against a specified name string.
- First test the unencoded name, then looks for and test a C++ encoded
- name if it exists. Note that whitespace is ignored while attempting to
- match a C++ encoded name, so that "foo::bar(int,long)" is the same as
- "foo :: bar (int, long)".
- Evaluates to zero if the match fails, or nonzero if it succeeds. */
-
-/* Macro that tests a symbol for a match against a specified name
- string. It tests against SYMBOL_NATURAL_NAME, and it ignores
- whitespace and trailing parentheses. (See strcmp_iw for details
- about its behavior.) */
-
-#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
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 *);
+extern const char *symbol_search_name (const struct general_symbol_info *);
-/* Analogous to SYMBOL_MATCHES_NATURAL_NAME, but uses the search
- name. */
+/* Return non-zero if NAME matches the "search" name of SYMBOL.
+ Whitespace and trailing parentheses are ignored.
+ See strcmp_iw for details about its behavior. */
#define SYMBOL_MATCHES_SEARCH_NAME(symbol, name) \
(strcmp_iw (SYMBOL_SEARCH_NAME (symbol), (name)) == 0)
ENUM_BITFIELD(minimal_symbol_type) type : 8;
+ /* Non-zero if this symbol was created by gdb.
+ Such symbols do not appear in the output of "info var|fun". */
+ unsigned int created_by_gdb : 1;
+
/* Two flag bits provided for the use of the target. */
unsigned int target_flag_1 : 1;
unsigned int target_flag_2 : 1;
+ /* Nonzero iff the size of the minimal symbol has been set.
+ Symbol size information can sometimes not be determined, because
+ the object file format may not carry that piece of information. */
+ unsigned int has_size : 1;
+
/* Minimal symbols with the same hash key are kept on a linked
list. This is the link. */
#define MSYMBOL_TARGET_FLAG_1(msymbol) (msymbol)->target_flag_1
#define MSYMBOL_TARGET_FLAG_2(msymbol) (msymbol)->target_flag_2
-#define MSYMBOL_SIZE(msymbol) (msymbol)->size
+#define MSYMBOL_SIZE(msymbol) ((msymbol)->size + 0)
+#define SET_MSYMBOL_SIZE(msymbol, sz) \
+ do \
+ { \
+ (msymbol)->size = sz; \
+ (msymbol)->has_size = 1; \
+ } while (0)
+#define MSYMBOL_HAS_SIZE(msymbol) ((msymbol)->has_size + 0)
#define MSYMBOL_TYPE(msymbol) (msymbol)->type
#include "minsyms.h"
/* LABEL_DOMAIN may be used for names of labels (for gotos). */
- LABEL_DOMAIN
+ LABEL_DOMAIN,
+
+ /* Fortran common blocks. Their naming must be separate from VAR_DOMAIN.
+ They also always use LOC_COMMON_BLOCK. */
+ COMMON_BLOCK_DOMAIN
} domain_enum;
/* Searching domains, used for `search_symbols'. Element numbers are
/* The variable's address is computed by a set of location
functions (see "struct symbol_computed_ops" below). */
LOC_COMPUTED,
+
+ /* The variable uses general_symbol_info->value->common_block field.
+ It also always uses COMMON_BLOCK_DOMAIN. */
+ LOC_COMMON_BLOCK,
+
+ /* Not used, just notes the boundary of the enum. */
+ LOC_FINAL_VALUE
};
/* The methods needed to implement LOC_COMPUTED. These methods can
void (*describe_location) (struct symbol * symbol, CORE_ADDR addr,
struct ui_file * stream);
+ /* Non-zero if this symbol's address computation is dependent on PC. */
+ unsigned char location_has_loclist;
+
/* Tracepoint support. Append bytecodes to the tracepoint agent
expression AX that push the address of the object SYMBOL. Set
VALUE appropriately. Note --- for objects in registers, this
struct agent_expr *ax, struct axs_value *value);
};
+/* The methods needed to implement LOC_BLOCK for inferior functions.
+ These methods can use the symbol's .aux_value for additional
+ per-symbol information. */
+
+struct symbol_block_ops
+{
+ /* Fill in *START and *LENGTH with DWARF block data of function
+ FRAMEFUNC valid for inferior context address PC. Set *LENGTH to
+ zero if such location is not valid for PC; *START is left
+ uninitialized in such case. */
+ void (*find_frame_base_location) (struct symbol *framefunc, CORE_ADDR pc,
+ const gdb_byte **start, size_t *length);
+};
+
/* Functions used with LOC_REGISTER and LOC_REGPARM_ADDR. */
struct symbol_register_ops
int (*register_number) (struct symbol *symbol, struct gdbarch *gdbarch);
};
+/* Objects of this type are used to find the address class and the
+ various computed ops vectors of a symbol. */
+
+struct symbol_impl
+{
+ enum address_class aclass;
+
+ /* Used with LOC_COMPUTED. */
+ const struct symbol_computed_ops *ops_computed;
+
+ /* Used with LOC_BLOCK. */
+ const struct symbol_block_ops *ops_block;
+
+ /* Used with LOC_REGISTER and LOC_REGPARM_ADDR. */
+ const struct symbol_register_ops *ops_register;
+};
+
+/* The number of bits we reserve in a symbol for the aclass index.
+ This is a #define so that we can have a assertion elsewhere to
+ verify that we have reserved enough space for synthetic address
+ classes. */
+
+#define SYMBOL_ACLASS_BITS 6
+
/* This structure is space critical. See space comments at the top. */
struct symbol
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). */
+ /* Address class. This holds an index into the 'symbol_impls'
+ table. The actual enum address_class value is stored there,
+ alongside any per-class ops vectors. */
- ENUM_BITFIELD(address_class) aclass : 6;
+ unsigned int aclass_index : SYMBOL_ACLASS_BITS;
/* Whether this is an argument. */
unsigned short line;
- /* Method's for symbol's of this class. */
- /* NOTE: cagney/2003-11-02: See comment above attached to "aclass". */
-
- union
- {
- /* Used with LOC_COMPUTED. */
- const struct symbol_computed_ops *ops_computed;
-
- /* Used with LOC_REGISTER and LOC_REGPARM_ADDR. */
- const struct symbol_register_ops *ops_register;
- } ops;
-
/* An arbitrary data pointer, allowing symbol readers to record
additional information on a per-symbol basis. Note that this data
must be allocated using the same obstack as the symbol itself. */
struct symbol *hash_next;
};
+extern const struct symbol_impl *symbol_impls;
#define SYMBOL_DOMAIN(symbol) (symbol)->domain
-#define SYMBOL_CLASS(symbol) (symbol)->aclass
+#define SYMBOL_IMPL(symbol) (symbol_impls[(symbol)->aclass_index])
+#define SYMBOL_ACLASS_INDEX(symbol) (symbol)->aclass_index
+#define SYMBOL_CLASS(symbol) (SYMBOL_IMPL (symbol).aclass)
#define SYMBOL_IS_ARGUMENT(symbol) (symbol)->is_argument
#define SYMBOL_INLINED(symbol) (symbol)->is_inlined
#define SYMBOL_IS_CPLUS_TEMPLATE_FUNCTION(symbol) \
#define SYMBOL_TYPE(symbol) (symbol)->type
#define SYMBOL_LINE(symbol) (symbol)->line
#define SYMBOL_SYMTAB(symbol) (symbol)->symtab
-#define SYMBOL_COMPUTED_OPS(symbol) (symbol)->ops.ops_computed
-#define SYMBOL_REGISTER_OPS(symbol) (symbol)->ops.ops_register
+#define SYMBOL_COMPUTED_OPS(symbol) (SYMBOL_IMPL (symbol).ops_computed)
+#define SYMBOL_BLOCK_OPS(symbol) (SYMBOL_IMPL (symbol).ops_block)
+#define SYMBOL_REGISTER_OPS(symbol) (SYMBOL_IMPL (symbol).ops_register)
#define SYMBOL_LOCATION_BATON(symbol) (symbol)->aux_value
+#define SYMBOL_OBJFILE(symbol) (SYMBOL_SYMTAB (symbol)->objfile)
+
+extern int register_symbol_computed_impl (enum address_class,
+ const struct symbol_computed_ops *);
+
+extern int register_symbol_block_impl (enum address_class aclass,
+ const struct symbol_block_ops *ops);
+
+extern int register_symbol_register_impl (enum address_class,
+ const struct symbol_register_ops *);
/* An instance of this type is used to represent a C++ template
function. It includes a "struct symbol" as a kind of base class;
all the symtabs in a given compilation unit. */
struct macro_table *macro_table;
- /* Name of this source file. */
+ /* Name of this source file. This pointer is never NULL. */
char *filename;
/* struct call_site entries for this compilation unit or NULL. */
htab_t call_site_htab;
+
+ /* If non-NULL, then this points to a NULL-terminated vector of
+ included symbol tables. When searching the static or global
+ block of this symbol table, the corresponding block of all
+ included symbol tables will also be searched. Note that this
+ list must be flattened -- the symbol reader is responsible for
+ ensuring that this vector contains the transitive closure of all
+ included symbol tables. */
+
+ struct symtab **includes;
+
+ /* If this is an included symbol table, this points to one includer
+ of the table. This user is considered the canonical symbol table
+ containing this one. An included symbol table may itself be
+ included by another. */
+
+ struct symtab *user;
};
#define BLOCKVECTOR(symtab) (symtab)->blockvector
extern struct symtab *lookup_symtab (const char *);
+/* An object of this type is passed as the 'is_a_field_of_this'
+ argument to lookup_symbol and lookup_symbol_in_language. */
+
+struct field_of_this_result
+{
+ /* The type in which the field was found. If this is NULL then the
+ symbol was not found in 'this'. If non-NULL, then one of the
+ other fields will be non-NULL as well. */
+
+ struct type *type;
+
+ /* If the symbol was found as an ordinary field of 'this', then this
+ is non-NULL and points to the particular field. */
+
+ struct field *field;
+
+ /* If the symbol was found as an function field of 'this', then this
+ is non-NULL and points to the particular field. */
+
+ struct fn_fieldlist *fn_field;
+};
+
/* lookup a symbol by name (optional block) in language. */
extern struct symbol *lookup_symbol_in_language (const char *,
const struct block *,
const domain_enum,
enum language,
- int *);
+ struct field_of_this_result *);
/* 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 *);
+ const domain_enum,
+ struct field_of_this_result *);
/* A default version of lookup_symbol_nonlocal for use by languages
that can't think of anything better to do. */
/* lookup a [struct, union, enum] by name, within a specified block. */
-extern struct type *lookup_struct (const char *, struct block *);
+extern struct type *lookup_struct (const char *, const struct block *);
-extern struct type *lookup_union (const char *, struct block *);
+extern struct type *lookup_union (const char *, const struct block *);
-extern struct type *lookup_enum (const char *, struct block *);
+extern struct type *lookup_enum (const char *, const struct block *);
/* from blockframe.c: */
extern struct symbol *find_pc_sect_function (CORE_ADDR, struct obj_section *);
-extern int find_pc_partial_function_gnu_ifunc (CORE_ADDR pc, char **name,
+extern int find_pc_partial_function_gnu_ifunc (CORE_ADDR pc, const char **name,
CORE_ADDR *address,
CORE_ADDR *endaddr,
int *is_gnu_ifunc_p);
/* lookup function from address, return name, start addr and end addr. */
-extern int find_pc_partial_function (CORE_ADDR, char **, CORE_ADDR *,
+extern int find_pc_partial_function (CORE_ADDR, const char **, CORE_ADDR *,
CORE_ADDR *);
extern void clear_pc_function_cache (void);
CORE_ADDR end;
int explicit_pc;
int explicit_line;
+
+ /* The probe associated with this symtab_and_line. */
+ struct probe *probe;
};
extern void init_sal (struct symtab_and_line *sal);
};
\f
-
-/* Some types and macros needed for exception catchpoints.
- Can't put these in target.h because symtab_and_line isn't
- known there. This file will be included by breakpoint.c,
- hppa-tdep.c, etc. */
-
-/* Enums for exception-handling support. */
-enum exception_event_kind
-{
- EX_EVENT_THROW,
- EX_EVENT_CATCH
-};
-
-\f
-
/* Given a pc value, return line number it is in. Second arg nonzero means
if pc is on the boundary use the previous statement's line number. */
extern void resolve_sal_pc (struct symtab_and_line *);
-/* Given a string, return the line specified by it. For commands like "list"
- and "breakpoint". */
-
-extern struct symtabs_and_lines decode_line_spec (char *, int);
-
-extern struct symtabs_and_lines decode_line_spec_1 (char *, int);
-
-/* Symmisc.c */
-
-void maintenance_print_symbols (char *, int);
-
-void maintenance_print_psymbols (char *, int);
-
-void maintenance_print_msymbols (char *, int);
-
-void maintenance_print_objfiles (char *, int);
-
-void maintenance_info_symtabs (char *, int);
-
-void maintenance_info_psymtabs (char *, int);
-
-void maintenance_check_symtabs (char *, int);
-
-/* maint.c */
-
-void maintenance_print_statistics (char *, int);
-
/* Symbol-reading stuff in symfile.c and solib.c. */
extern void clear_solib (void);
extern int identify_source_line (struct symtab *, int, int, CORE_ADDR);
-extern void print_source_lines (struct symtab *, int, int, int);
+/* Flags passed as 4th argument to print_source_lines. */
+
+enum print_source_lines_flags
+ {
+ /* Do not print an error message. */
+ PRINT_SOURCE_LINES_NOERROR = (1 << 0),
+
+ /* Print the filename in front of the source lines. */
+ PRINT_SOURCE_LINES_FILENAME = (1 << 1)
+ };
+
+extern void print_source_lines (struct symtab *, int, int,
+ enum print_source_lines_flags);
extern void forget_cached_source_info_for_objfile (struct objfile *);
extern void forget_cached_source_info (void);
extern void select_source_symtab (struct symtab *);
-extern char **default_make_symbol_completion_list_break_on
- (char *text, char *word, const char *break_on);
-extern char **default_make_symbol_completion_list (char *, char *);
-extern char **make_symbol_completion_list (char *, char *);
-extern char **make_symbol_completion_list_fn (struct cmd_list_element *,
- char *, char *);
-
-extern char **make_file_symbol_completion_list (char *, char *, char *);
-
-extern char **make_source_files_completion_list (char *, char *);
+extern VEC (char_ptr) *default_make_symbol_completion_list_break_on
+ (const char *text, const char *word, const char *break_on,
+ enum type_code code);
+extern VEC (char_ptr) *default_make_symbol_completion_list (const char *,
+ const char *,
+ enum type_code);
+extern VEC (char_ptr) *make_symbol_completion_list (const char *, const char *);
+extern VEC (char_ptr) *make_symbol_completion_type (const char *, const char *,
+ enum type_code);
+extern VEC (char_ptr) *make_symbol_completion_list_fn (struct cmd_list_element *,
+ const char *,
+ const char *);
+
+extern VEC (char_ptr) *make_file_symbol_completion_list (const char *,
+ const char *,
+ const char *);
+
+extern VEC (char_ptr) *make_source_files_completion_list (const char *,
+ const char *);
/* symtab.c */
struct objfile *);
/* Symbol searching */
+/* Note: struct symbol_search, search_symbols, et.al. are declared here,
+ instead of making them local to symtab.c, for gdbtk's sake. */
/* When using search_symbols, a list of the following structs is returned.
Callers must free the search list using free_search_symbols! */
struct objfile *lookup_objfile_from_block (const struct block *block);
+extern int symtab_create_debug;
+
extern int basenames_may_differ;
+int compare_filenames_for_search (const char *filename,
+ const char *search_name);
+
int iterate_over_some_symtabs (const char *name,
- const char *full_path,
const char *real_path,
int (*callback) (struct symtab *symtab,
void *data),
VEC (CORE_ADDR) *find_pcs_for_symtab_line (struct symtab *symtab, int line,
struct linetable_entry **best_entry);
+/* Callback for LA_ITERATE_OVER_SYMBOLS. The callback will be called
+ once per matching symbol SYM, with DATA being the argument of the
+ same name that was passed to LA_ITERATE_OVER_SYMBOLS. The callback
+ should return nonzero to indicate that LA_ITERATE_OVER_SYMBOLS
+ should continue iterating, or zero to indicate that the iteration
+ should end. */
+
+typedef int (symbol_found_callback_ftype) (struct symbol *sym, void *data);
+
void iterate_over_symbols (const struct block *block, const char *name,
const domain_enum domain,
- int (*callback) (struct symbol *, void *),
+ symbol_found_callback_ftype *callback,
void *data);
struct cleanup *demangle_for_lookup (const char *name, enum language lang,
const char **result_name);
+struct symbol *allocate_symbol (struct objfile *);
+
+void initialize_symbol (struct symbol *);
+
+struct template_symbol *allocate_template_symbol (struct objfile *);
+
#endif /* !defined(SYMTAB_H) */