Index: gdb/symtab.h |
diff --git a/gdb/symtab.h b/gdb/symtab.h |
index 76120a37a93ad14a9dc7d90949e73f486b4451b3..3be85cae7397817fef244ddf686788bca919caec 100644 |
--- a/gdb/symtab.h |
+++ b/gdb/symtab.h |
@@ -1,7 +1,6 @@ |
/* Symbol table definitions for GDB. |
- Copyright (C) 1986, 1988-2004, 2007-2012 Free Software Foundation, |
- Inc. |
+ Copyright (C) 1986-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
@@ -23,6 +22,7 @@ |
#include "vec.h" |
#include "gdb_vecs.h" |
+#include "gdbtypes.h" |
/* Opaque declarations. */ |
struct ui_file; |
@@ -37,6 +37,7 @@ 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: |
@@ -115,10 +116,14 @@ struct general_symbol_info |
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; |
@@ -130,6 +135,11 @@ struct general_symbol_info |
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 |
@@ -148,22 +158,21 @@ struct general_symbol_info |
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 const char *symbol_get_demangled_name |
(const struct general_symbol_info *); |
@@ -181,18 +190,23 @@ 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, |
@@ -348,6 +362,11 @@ struct minimal_symbol |
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. */ |
@@ -361,7 +380,14 @@ struct minimal_symbol |
#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" |
@@ -394,9 +420,15 @@ typedef enum domain_enum_tag |
/* 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; |
+extern const char *domain_name (domain_enum); |
+ |
/* Searching domains, used for `search_symbols'. Element numbers are |
hardcoded in GDB, check all enum uses before changing it. */ |
@@ -416,6 +448,8 @@ enum search_domain |
ALL_DOMAIN = 3 |
}; |
+extern const char *search_domain_name (enum search_domain); |
+ |
/* An address-class says where to find the value of a symbol. */ |
enum address_class |
@@ -512,6 +546,13 @@ enum address_class |
/* 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 |
@@ -545,6 +586,9 @@ struct symbol_computed_ops |
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 |
@@ -556,6 +600,20 @@ struct symbol_computed_ops |
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 |
@@ -563,6 +621,30 @@ 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 |
@@ -585,15 +667,11 @@ 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. */ |
@@ -618,18 +696,6 @@ struct symbol |
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. */ |
@@ -648,9 +714,12 @@ struct symbol |
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) \ |
@@ -658,9 +727,20 @@ struct 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; |
@@ -793,13 +873,13 @@ struct symtab |
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; |
+ const char *filename; |
/* Directory in which it was compiled, or NULL if we don't know. */ |
- char *dirname; |
+ const char *dirname; |
/* Total number of lines found in source file. */ |
@@ -860,6 +940,13 @@ struct symtab |
#define BLOCKVECTOR(symtab) (symtab)->blockvector |
#define LINETABLE(symtab) (symtab)->linetable |
#define SYMTAB_PSPACE(symtab) (symtab)->objfile->pspace |
+ |
+/* Call this to set the "primary" field in struct symtab. */ |
+extern void set_symtab_primary (struct symtab *, int primary); |
+ |
+typedef struct symtab *symtab_ptr; |
+DEF_VEC_P (symtab_ptr); |
+ |
/* The virtual function table is now an array of structures which have the |
@@ -897,19 +984,42 @@ int symbol_matches_domain (enum language symbol_language, |
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. */ |
@@ -959,11 +1069,11 @@ extern struct symbol *lookup_block_symbol (const struct block *, const char *, |
/* 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: */ |
@@ -1079,21 +1189,6 @@ struct symtabs_and_lines |
}; |
- |
-/* 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 |
-}; |
- |
- |
- |
/* 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. */ |
@@ -1113,26 +1208,6 @@ extern int find_line_pc_range (struct symtab_and_line, CORE_ADDR *, |
extern void resolve_sal_pc (struct symtab_and_line *); |
-/* 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); |
@@ -1141,7 +1216,19 @@ 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); |
@@ -1149,23 +1236,29 @@ extern void forget_cached_source_info (void); |
extern void select_source_symtab (struct symtab *); |
extern VEC (char_ptr) *default_make_symbol_completion_list_break_on |
- (char *text, char *word, const char *break_on); |
-extern VEC (char_ptr) *default_make_symbol_completion_list (char *, char *); |
-extern VEC (char_ptr) *make_symbol_completion_list (char *, char *); |
+ (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 *, |
- char *, char *); |
+ const char *, |
+ const char *); |
-extern VEC (char_ptr) *make_file_symbol_completion_list (char *, |
- char *, 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 (char *, char *); |
+extern VEC (char_ptr) *make_source_files_completion_list (const char *, |
+ const char *); |
/* symtab.c */ |
int matching_obj_sections (struct obj_section *, struct obj_section *); |
-extern const char *find_main_filename (void); |
- |
extern struct symtab *find_line_symtab (struct symtab *, int, int *, int *); |
extern struct symtab_and_line find_function_start_sal (struct symbol *sym, |
@@ -1191,6 +1284,8 @@ extern struct symbol *fixup_symbol_section (struct symbol *, |
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! */ |
@@ -1202,14 +1297,14 @@ struct symbol_search |
/* Information describing what was found. |
- If symtab abd symbol are NOT NULL, then information was found |
+ If symtab and symbol are NOT NULL, then information was found |
for this match. */ |
struct symtab *symtab; |
struct symbol *symbol; |
/* If msymbol is non-null, then a match was made on something for |
which only minimal_symbols exist. */ |
- struct minimal_symbol *msymbol; |
+ struct bound_minimal_symbol msymbol; |
/* A link to the next match, or NULL for the end. */ |
struct symbol_search *next; |
@@ -1219,7 +1314,7 @@ extern void search_symbols (char *, enum search_domain, int, char **, |
struct symbol_search **); |
extern void free_search_symbols (struct symbol_search *); |
extern struct cleanup *make_cleanup_free_search_symbols (struct symbol_search |
- *); |
+ **); |
/* The name of the ``main'' function. |
FIXME: cagney/2001-03-20: Can't make main_name() const since some |
@@ -1243,16 +1338,14 @@ void fixup_section (struct general_symbol_info *ginfo, |
struct objfile *lookup_objfile_from_block (const struct block *block); |
-extern int symtab_create_debug; |
+extern unsigned int symtab_create_debug; |
extern int basenames_may_differ; |
int compare_filenames_for_search (const char *filename, |
- const char *search_name, |
- int search_len); |
+ 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), |
@@ -1287,4 +1380,10 @@ void iterate_over_symbols (const struct block *block, const char *name, |
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) */ |