X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fsymtab.h;h=8cd3496c53062fc0760817c73aa8b49cadae7c41;hb=c62446b12b32ce57d2b40cdb0c1baa7fc1677d82;hp=57ed9fc36e57f1c2225162f6a2f09cf5229fe533;hpb=f606139ae8aa873f6294aaf3bf599d18c3025023;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/symtab.h b/gdb/symtab.h index 57ed9fc36e..8cd3496c53 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -1,6 +1,6 @@ /* Symbol table definitions for GDB. - Copyright (C) 1986-2014 Free Software Foundation, Inc. + Copyright (C) 1986-2017 Free Software Foundation, Inc. This file is part of GDB. @@ -20,9 +20,14 @@ #if !defined (SYMTAB_H) #define SYMTAB_H 1 -#include "vec.h" +#include +#include #include "gdb_vecs.h" #include "gdbtypes.h" +#include "common/enum-flags.h" +#include "common/function-view.h" +#include "common/gdb_optional.h" +#include "completer.h" /* Opaque declarations. */ struct ui_file; @@ -38,6 +43,266 @@ struct program_space; struct language_defn; struct probe; struct common_block; +struct obj_section; +struct cmd_list_element; +struct lookup_name_info; + +/* How to match a lookup name against a symbol search name. */ +enum class symbol_name_match_type +{ + /* Wild matching. Matches unqualified symbol names in all + namespace/module/packages, etc. */ + WILD, + + /* Full matching. The lookup name indicates a fully-qualified name, + and only matches symbol search names in the specified + namespace/module/package. */ + FULL, + + /* Expression matching. The same as FULL matching in most + languages. The same as WILD matching in Ada. */ + EXPRESSION, +}; + +/* Hash the given symbol search name according to LANGUAGE's + rules. */ +extern unsigned int search_name_hash (enum language language, + const char *search_name); + +/* Ada-specific bits of a lookup_name_info object. This is lazily + constructed on demand. */ + +class ada_lookup_name_info final +{ + public: + /* Construct. */ + explicit ada_lookup_name_info (const lookup_name_info &lookup_name); + + /* Compare SYMBOL_SEARCH_NAME with our lookup name, using MATCH_TYPE + as name match type. Returns true if there's a match, false + otherwise. If non-NULL, store the matching results in MATCH. */ + bool matches (const char *symbol_search_name, + symbol_name_match_type match_type, + completion_match *match) const; + + /* The Ada-encoded lookup name. */ + const std::string &lookup_name () const + { return m_encoded_name; } + + /* Return true if we're supposed to be doing a wild match look + up. */ + bool wild_match_p () const + { return m_wild_match_p; } + + /* Return true if we're looking up a name inside package + Standard. */ + bool standard_p () const + { return m_standard_p; } + + private: + /* The Ada-encoded lookup name. */ + std::string m_encoded_name; + + /* Whether the user-provided lookup name was Ada encoded. If so, + then return encoded names in the 'matches' method's 'completion + match result' output. */ + bool m_encoded_p : 1; + + /* True if really doing wild matching. Even if the user requests + wild matching, some cases require full matching. */ + bool m_wild_match_p : 1; + + /* True if doing a verbatim match. This is true if the decoded + version of the symbol name is wrapped in '<'/'>'. This is an + escape hatch users can use to look up symbols the Ada encoding + does not understand. */ + bool m_verbatim_p : 1; + + /* True if the user specified a symbol name that is inside package + Standard. Symbol names inside package Standard are handled + specially. We always do a non-wild match of the symbol name + without the "standard__" prefix, and only search static and + global symbols. This was primarily introduced in order to allow + the user to specifically access the standard exceptions using, + for instance, Standard.Constraint_Error when Constraint_Error is + ambiguous (due to the user defining its own Constraint_Error + entity inside its program). */ + bool m_standard_p : 1; +}; + +/* Language-specific bits of a lookup_name_info object, for languages + that do name searching using demangled names (C++/D/Go). This is + lazily constructed on demand. */ + +struct demangle_for_lookup_info final +{ +public: + demangle_for_lookup_info (const lookup_name_info &lookup_name, + language lang); + + /* The demangled lookup name. */ + const std::string &lookup_name () const + { return m_demangled_name; } + +private: + /* The demangled lookup name. */ + std::string m_demangled_name; +}; + +/* Object that aggregates all information related to a symbol lookup + name. I.e., the name that is matched against the symbol's search + name. Caches per-language information so that it doesn't require + recomputing it for every symbol comparison, like for example the + Ada encoded name and the symbol's name hash for a given language. + The object is conceptually immutable once constructed, and thus has + no setters. This is to prevent some code path from tweaking some + property of the lookup name for some local reason and accidentally + altering the results of any continuing search(es). + lookup_name_info objects are generally passed around as a const + reference to reinforce that. (They're not passed around by value + because they're not small.) */ +class lookup_name_info final +{ + public: + /* Create a new object. */ + lookup_name_info (std::string name, + symbol_name_match_type match_type, + bool completion_mode = false, + bool ignore_parameters = false) + : m_match_type (match_type), + m_completion_mode (completion_mode), + m_ignore_parameters (ignore_parameters), + m_name (std::move (name)) + {} + + /* Getters. See description of each corresponding field. */ + symbol_name_match_type match_type () const { return m_match_type; } + bool completion_mode () const { return m_completion_mode; } + const std::string &name () const { return m_name; } + const bool ignore_parameters () const { return m_ignore_parameters; } + + /* Return a version of this lookup name that is usable with + comparisons against symbols have no parameter info, such as + psymbols and GDB index symbols. */ + lookup_name_info make_ignore_params () const + { + return lookup_name_info (m_name, m_match_type, m_completion_mode, + true /* ignore params */); + } + + /* Get the search name hash for searches in language LANG. */ + unsigned int search_name_hash (language lang) const + { + /* Only compute each language's hash once. */ + if (!m_demangled_hashes_p[lang]) + { + m_demangled_hashes[lang] + = ::search_name_hash (lang, language_lookup_name (lang).c_str ()); + m_demangled_hashes_p[lang] = true; + } + return m_demangled_hashes[lang]; + } + + /* Get the search name for searches in language LANG. */ + const std::string &language_lookup_name (language lang) const + { + switch (lang) + { + case language_ada: + return ada ().lookup_name (); + case language_cplus: + return cplus ().lookup_name (); + case language_d: + return d ().lookup_name (); + case language_go: + return go ().lookup_name (); + default: + return m_name; + } + } + + /* Get the Ada-specific lookup info. */ + const ada_lookup_name_info &ada () const + { + maybe_init (m_ada); + return *m_ada; + } + + /* Get the C++-specific lookup info. */ + const demangle_for_lookup_info &cplus () const + { + maybe_init (m_cplus, language_cplus); + return *m_cplus; + } + + /* Get the D-specific lookup info. */ + const demangle_for_lookup_info &d () const + { + maybe_init (m_d, language_d); + return *m_d; + } + + /* Get the Go-specific lookup info. */ + const demangle_for_lookup_info &go () const + { + maybe_init (m_go, language_go); + return *m_go; + } + + /* Get a reference to a lookup_name_info object that matches any + symbol name. */ + static const lookup_name_info &match_any (); + +private: + /* Initialize FIELD, if not initialized yet. */ + template + void maybe_init (Field &field, Args&&... args) const + { + if (!field) + field.emplace (*this, std::forward (args)...); + } + + /* The lookup info as passed to the ctor. */ + symbol_name_match_type m_match_type; + bool m_completion_mode; + bool m_ignore_parameters; + std::string m_name; + + /* Language-specific info. These fields are filled lazily the first + time a lookup is done in the corresponding language. They're + mutable because lookup_name_info objects are typically passed + around by const reference (see intro), and they're conceptually + "cache" that can always be reconstructed from the non-mutable + fields. */ + mutable gdb::optional m_ada; + mutable gdb::optional m_cplus; + mutable gdb::optional m_d; + mutable gdb::optional m_go; + + /* The demangled hashes. Stored in an array with one entry for each + possible language. The second array records whether we've + already computed the each language's hash. (These are separate + arrays instead of a single array of optional to avoid + alignment padding). */ + mutable std::array m_demangled_hashes; + mutable std::array m_demangled_hashes_p {}; +}; + +/* Comparison function for completion symbol lookup. + + Returns true if the symbol name matches against LOOKUP_NAME. + + SYMBOL_SEARCH_NAME should be a symbol's "search" name. + + On success and if non-NULL, MATCH is set to point to the symbol + name as should be presented to the user as a completion match list + element. In most languages, this is the same as the symbol's + search name, but in some, like Ada, the display name is dynamically + computed within the comparison routine. */ +typedef bool (symbol_name_matcher_ftype) + (const char *symbol_search_name, + const lookup_name_info &lookup_name, + completion_match *match); /* Some of the structures in this file are space critical. The space-critical structures are: @@ -134,12 +399,8 @@ struct general_symbol_info struct obstack *obstack; /* This is used by languages which wish to store a demangled name. - currently used by Ada, C++, Java, and Objective C. */ - struct mangled_lang - { - const char *demangled_name; - } - mangled_lang; + currently used by Ada, C++, and Objective C. */ + const char *demangled_name; } language_specific; @@ -147,9 +408,9 @@ struct general_symbol_info This is used to select one of the fields from the language specific union above. */ - ENUM_BITFIELD(language) language : 8; + ENUM_BITFIELD(language) language : LANGUAGE_BITS; - /* This is only used by Ada. If set, then the 'mangled_lang' field + /* This is only used by Ada. If set, then the 'demangled_name' field of language_specific is valid. Otherwise, the 'obstack' field is valid. */ unsigned int ada_mangled : 1; @@ -262,19 +523,29 @@ extern const char *symbol_demangled_name extern int demangle; /* Macro that returns the name to be used when sorting and searching symbols. - In C++ and Java, we search for the demangled form of a name, + In C++, 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 const char *symbol_search_name (const struct general_symbol_info *); +extern const char *symbol_search_name (const struct general_symbol_info *ginfo); -/* 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) +/* Return true if NAME matches the "search" name of SYMBOL, according + to the symbol's language. */ +#define SYMBOL_MATCHES_SEARCH_NAME(symbol, name) \ + symbol_matches_search_name (&(symbol)->ginfo, (name)) + +/* Helper for SYMBOL_MATCHES_SEARCH_NAME that works with both symbols + and psymbols. */ +extern bool symbol_matches_search_name + (const struct general_symbol_info *gsymbol, + const lookup_name_info &name); + +/* Compute the hash of the given symbol search name of a symbol of + language LANGUAGE. */ +extern unsigned int search_name_hash (enum language language, + const char *search_name); /* Classification types for a minimal symbol. These should be taken as "advisory only", since if gdb can't easily figure out a @@ -307,9 +578,15 @@ enum minimal_symbol_type within a given .o file. */ mst_file_text, /* Static version of mst_text */ mst_file_data, /* Static version of mst_data */ - mst_file_bss /* Static version of mst_bss */ + mst_file_bss, /* Static version of mst_bss */ + nr_minsym_types }; +/* The number of enum minimal_symbol_type values, with some padding for + reasonable growth. */ +#define MINSYM_TYPE_BITS 4 +gdb_static_assert (nr_minsym_types <= (1 << MINSYM_TYPE_BITS)); + /* Define a simple structure used to hold some very basic information about all defined global symbols (text, data, bss, abs, etc). The only required information is the general_symbol_info. @@ -332,7 +609,7 @@ struct minimal_symbol struct general_symbol_info mginfo; - /* Size of this symbol. end_psymtab in dbxread.c uses this + /* Size of this symbol. dbx_end_psymtab in dbxread.c uses this information to calculate the end of the partial symtab based on the address of the last symbol plus the size of the last symbol. */ @@ -343,7 +620,7 @@ struct minimal_symbol /* Classification type for this minimal symbol. */ - ENUM_BITFIELD(minimal_symbol_type) type : 8; + ENUM_BITFIELD(minimal_symbol_type) type : MINSYM_TYPE_BITS; /* Non-zero if this symbol was created by gdb. Such symbols do not appear in the output of "info var|fun". */ @@ -415,8 +692,6 @@ struct minimal_symbol (symbol_set_language (&(symbol)->mginfo, (language), (obstack))) #define MSYMBOL_SEARCH_NAME(symbol) \ (symbol_search_name (&(symbol)->mginfo)) -#define MSYMBOL_MATCHES_SEARCH_NAME(symbol, name) \ - (strcmp_iw (MSYMBOL_SEARCH_NAME (symbol), (name)) == 0) #define MSYMBOL_SET_NAMES(symbol,linkage_name,len,copy_name,objfile) \ symbol_set_names (&(symbol)->mginfo, linkage_name, len, copy_name, objfile) @@ -458,9 +733,17 @@ typedef enum domain_enum_tag /* Fortran common blocks. Their naming must be separate from VAR_DOMAIN. They also always use LOC_COMMON_BLOCK. */ - COMMON_BLOCK_DOMAIN + COMMON_BLOCK_DOMAIN, + + /* This must remain last. */ + NR_DOMAINS } domain_enum; +/* The number of bits in a symbol used to represent the domain. */ + +#define SYMBOL_DOMAIN_BITS 3 +gdb_static_assert (NR_DOMAINS <= (1 << SYMBOL_DOMAIN_BITS)); + extern const char *domain_name (domain_enum); /* Searching domains, used for `search_symbols'. Element numbers are @@ -568,7 +851,13 @@ enum address_class not find it in the full symbol table. But a reference to an external symbol in a local block shadowing other definition requires full symbol without possibly having its address available for LOC_STATIC. Testcase - is provided as `gdb.dwarf2/dw2-unresolved.exp'. */ + is provided as `gdb.dwarf2/dw2-unresolved.exp'. + + This is also used for thread local storage (TLS) variables. In this case, + the address of the TLS variable must be determined when the variable is + referenced, from the MSYMBOL_VALUE_RAW_ADDRESS, which is the offset + of the TLS variable in the thread local storage of the shared + library/object. */ LOC_UNRESOLVED, @@ -589,6 +878,15 @@ enum address_class LOC_FINAL_VALUE }; +/* The number of bits needed for values in enum address_class, with some + padding for reasonable growth, and room for run-time registered address + classes. See symtab.c:MAX_SYMBOL_IMPLS. + 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 5 +gdb_static_assert (LOC_FINAL_VALUE <= (1 << SYMBOL_ACLASS_BITS)); + /* The methods needed to implement LOC_COMPUTED. These methods can use the symbol's .aux_value for additional per-symbol information. @@ -601,7 +899,8 @@ struct symbol_computed_ops frame FRAME. If the variable has been optimized out, return zero. - Iff `read_needs_frame (SYMBOL)' is zero, then FRAME may be zero. */ + Iff `read_needs_frame (SYMBOL)' is not SYMBOL_NEEDS_FRAME, then + FRAME may be zero. */ struct value *(*read_variable) (struct symbol * symbol, struct frame_info * frame); @@ -612,8 +911,11 @@ struct symbol_computed_ops struct value *(*read_variable_at_entry) (struct symbol *symbol, struct frame_info *frame); - /* Return non-zero if we need a frame to find the value of the SYMBOL. */ - int (*read_needs_frame) (struct symbol * symbol); + /* Find the "symbol_needs_kind" value for the given symbol. This + value determines whether reading the symbol needs memory (e.g., a + global variable), just registers (a thread-local), or a frame (a + local variable). */ + enum symbol_needs_kind (*get_symbol_read_needs) (struct symbol * symbol); /* Write to STREAM a natural-language description of the location of SYMBOL, in the context of ADDR. */ @@ -630,8 +932,8 @@ struct symbol_computed_ops the caller will generate the right code in the process of treating this as an lvalue or rvalue. */ - void (*tracepoint_var_ref) (struct symbol *symbol, struct gdbarch *gdbarch, - struct agent_expr *ax, struct axs_value *value); + void (*tracepoint_var_ref) (struct symbol *symbol, struct agent_expr *ax, + struct axs_value *value); /* Generate C code to compute the location of SYMBOL. The C code is emitted to STREAM. GDBARCH is the current architecture and PC is @@ -642,7 +944,7 @@ struct symbol_computed_ops The generated C code must assign the location to a local variable; this variable's name is RESULT_NAME. */ - void (*generate_c_location) (struct symbol *symbol, struct ui_file *stream, + void (*generate_c_location) (struct symbol *symbol, string_file &stream, struct gdbarch *gdbarch, unsigned char *registers_used, CORE_ADDR pc, const char *result_name); @@ -661,6 +963,25 @@ struct symbol_block_ops uninitialized in such case. */ void (*find_frame_base_location) (struct symbol *framefunc, CORE_ADDR pc, const gdb_byte **start, size_t *length); + + /* Return the frame base address. FRAME is the frame for which we want to + compute the base address while FRAMEFUNC is the symbol for the + corresponding function. Return 0 on failure (FRAMEFUNC may not hold the + information we need). + + This method is designed to work with static links (nested functions + handling). Static links are function properties whose evaluation returns + the frame base address for the enclosing frame. However, there are + multiple definitions for "frame base": the content of the frame base + register, the CFA as defined by DWARF unwinding information, ... + + So this specific method is supposed to compute the frame base address such + as for nested fuctions, the static link computes the same address. For + instance, considering DWARF debugging information, the static link is + computed with DW_AT_static_link and this method must be used to compute + the corresponding DW_AT_frame_base attribute. */ + CORE_ADDR (*get_frame_base) (struct symbol *framefunc, + struct frame_info *frame); }; /* Functions used with LOC_REGISTER and LOC_REGPARM_ADDR. */ @@ -687,13 +1008,6 @@ struct symbol_impl 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 @@ -707,14 +1021,23 @@ struct symbol struct type *type; - /* The symbol table containing this symbol. This is the file - associated with LINE. It can be NULL during symbols read-in but it is - never NULL during normal operation. */ - struct symtab *symtab; + /* The owner of this symbol. + Which one to use is defined by symbol.is_objfile_owned. */ + + union + { + /* The symbol table containing this symbol. This is the file associated + with LINE. It can be NULL during symbols read-in but it is never NULL + during normal operation. */ + struct symtab *symtab; + + /* For types defined by the architecture. */ + struct gdbarch *arch; + } owner; /* Domain code. */ - ENUM_BITFIELD(domain_enum_tag) domain : 6; + ENUM_BITFIELD(domain_enum_tag) domain : SYMBOL_DOMAIN_BITS; /* Address class. This holds an index into the 'symbol_impls' table. The actual enum address_class value is stored there, @@ -722,6 +1045,11 @@ struct symbol unsigned int aclass_index : SYMBOL_ACLASS_BITS; + /* If non-zero then symbol is objfile-owned, use owner.symtab. + Otherwise symbol is arch-owned, use owner.arch. */ + + unsigned int is_objfile_owned : 1; + /* Whether this is an argument. */ unsigned is_argument : 1; @@ -738,6 +1066,7 @@ struct symbol SYMBOL_INLINED set) this is the line number of the function's call site. Inlined function symbols are not definitions, and they are never found by symbol table lookup. + If this symbol is arch-owned, LINE shall be zero. FIXME: Should we really make the assumption that nobody will try to debug files longer than 64K lines? What about machine @@ -748,11 +1077,10 @@ struct symbol /* 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. */ - /* So far it is only used by LOC_COMPUTED to - find the 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 + /* So far it is only used by: + LOC_COMPUTED: to find the location information + LOC_BLOCK (DWARF2 function): 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, @@ -763,12 +1091,33 @@ struct symbol struct symbol *hash_next; }; +/* Several lookup functions return both a symbol and the block in which the + symbol is found. This structure is used in these cases. */ + +struct block_symbol +{ + /* The symbol that was found, or NULL if no symbol was found. */ + struct symbol *symbol; + + /* If SYMBOL is not NULL, then this is the block in which the symbol is + defined. */ + const struct block *block; +}; + extern const struct symbol_impl *symbol_impls; +/* For convenience. All fields are NULL. This means "there is no + symbol". */ +extern const struct block_symbol null_block_symbol; + +/* Note: There is no accessor macro for symbol.owner because it is + "private". */ + #define SYMBOL_DOMAIN(symbol) (symbol)->domain #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_OBJFILE_OWNED(symbol) ((symbol)->is_objfile_owned) #define SYMBOL_IS_ARGUMENT(symbol) (symbol)->is_argument #define SYMBOL_INLINED(symbol) (symbol)->is_inlined #define SYMBOL_IS_CPLUS_TEMPLATE_FUNCTION(symbol) \ @@ -901,7 +1250,8 @@ struct section_offsets struct symtab { - /* Unordered chain of all existing symtabs of this objfile. */ + /* Unordered chain of all filetabs in the compunit, with the exception + that the "main" source file is the first entry in the list. */ struct symtab *next; @@ -1117,10 +1467,6 @@ DEF_VEC_P (compunit_symtab_ptr); extern int currently_reading_symtab; -/* The block in which the most recently looked up symbol was found. */ - -extern const struct block *block_found; - /* symtab.c lookup functions */ extern const char multiple_symbols_ask[]; @@ -1166,27 +1512,27 @@ struct field_of_this_result C++: if IS_A_FIELD_OF_THIS is non-NULL on entry, check to see if NAME is a field of the current implied argument `this'. If so fill in the fields of IS_A_FIELD_OF_THIS, otherwise the fields are set to NULL. - BLOCK_FOUND is set to the block in which NAME is found (in the case of - a field of `this', value_of_this sets BLOCK_FOUND to the proper value). The symbol's section is fixed up if necessary. */ -extern struct symbol *lookup_symbol_in_language (const char *, - const struct block *, - const domain_enum, - enum language, - struct field_of_this_result *); +extern struct block_symbol + lookup_symbol_in_language (const char *, + const struct block *, + const domain_enum, + enum language, + struct field_of_this_result *); /* Same as lookup_symbol_in_language, but using the current language. */ -extern struct symbol *lookup_symbol (const char *, const struct block *, - const domain_enum, - struct field_of_this_result *); +extern struct block_symbol lookup_symbol (const char *, + const struct block *, + 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. This implements the C lookup rules. */ -extern struct symbol * +extern struct block_symbol basic_lookup_symbol_nonlocal (const struct language_defn *langdef, const char *, const struct block *, @@ -1197,19 +1543,18 @@ extern struct symbol * /* Lookup a symbol in the static block associated to BLOCK, if there is one; do nothing if BLOCK is NULL or a global block. - Upon success sets BLOCK_FOUND and fixes up the symbol's section - if necessary. */ + Upon success fixes up the symbol's section if necessary. */ -extern struct symbol *lookup_symbol_in_static_block (const char *name, - const struct block *block, - const domain_enum domain); +extern struct block_symbol + lookup_symbol_in_static_block (const char *name, + const struct block *block, + const domain_enum domain); /* Search all static file-level symbols for NAME from DOMAIN. - Upon success sets BLOCK_FOUND and fixes up the symbol's section - if necessary. */ + Upon success fixes up the symbol's section if necessary. */ -extern struct symbol *lookup_static_symbol (const char *name, - const domain_enum domain); +extern struct block_symbol lookup_static_symbol (const char *name, + const domain_enum domain); /* Lookup a symbol in all files' global blocks. @@ -1220,26 +1565,27 @@ extern struct symbol *lookup_static_symbol (const char *name, if the target requires it. See gdbarch_iterate_over_objfiles_in_search_order. - Upon success sets BLOCK_FOUND and fixes up the symbol's section - if necessary. */ + Upon success fixes up the symbol's section if necessary. */ -extern struct symbol *lookup_global_symbol (const char *name, - const struct block *block, - const domain_enum domain); +extern struct block_symbol + lookup_global_symbol (const char *name, + const struct block *block, + const domain_enum domain); /* Lookup a symbol in block BLOCK. - Upon success sets BLOCK_FOUND and fixes up the symbol's section - if necessary. */ + Upon success fixes up the symbol's section if necessary. */ -extern struct symbol *lookup_symbol_in_block (const char *name, - const struct block *block, - const domain_enum domain); +extern struct symbol * + lookup_symbol_in_block (const char *name, + const struct block *block, + const domain_enum domain); /* Look up the `this' symbol for LANG in BLOCK. Return the symbol if found, or NULL if not found. */ -extern struct symbol *lookup_language_this (const struct language_defn *lang, - const struct block *block); +extern struct block_symbol + lookup_language_this (const struct language_defn *lang, + const struct block *block); /* Lookup a [struct, union, enum] by name, within a specified block. */ @@ -1340,34 +1686,28 @@ extern CORE_ADDR find_solib_trampoline_target (struct frame_info *, CORE_ADDR); struct symtab_and_line { /* The program space of this sal. */ - struct program_space *pspace; + struct program_space *pspace = NULL; - struct symtab *symtab; - struct obj_section *section; + struct symtab *symtab = NULL; + struct symbol *symbol = NULL; + struct obj_section *section = NULL; /* Line number. Line numbers start at 1 and proceed through symtab->nlines. 0 is never a valid line number; it is used to indicate that line number information is not available. */ - int line; + int line = 0; - CORE_ADDR pc; - CORE_ADDR end; - int explicit_pc; - int explicit_line; + CORE_ADDR pc = 0; + CORE_ADDR end = 0; + bool explicit_pc = false; + bool explicit_line = false; /* The probe associated with this symtab_and_line. */ - struct probe *probe; + struct probe *probe = NULL; /* If PROBE is not NULL, then this is the objfile in which the probe originated. */ - struct objfile *objfile; + struct objfile *objfile = NULL; }; -extern void init_sal (struct symtab_and_line *sal); - -struct symtabs_and_lines -{ - struct symtab_and_line *sals; - int nelts; -}; /* Given a pc value, return line number it is in. Second arg nonzero means @@ -1393,7 +1733,7 @@ extern int find_line_pc_range (struct symtab_and_line, CORE_ADDR *, extern void resolve_sal_pc (struct symtab_and_line *); -/* Symbol-reading stuff in symfile.c and solib.c. */ +/* solib.c */ extern void clear_solib (void); @@ -1403,7 +1743,7 @@ extern int identify_source_line (struct symtab *, int, int, CORE_ADDR); /* Flags passed as 4th argument to print_source_lines. */ -enum print_source_lines_flags +enum print_source_lines_flag { /* Do not print an error message. */ PRINT_SOURCE_LINES_NOERROR = (1 << 0), @@ -1411,34 +1751,57 @@ enum print_source_lines_flags /* Print the filename in front of the source lines. */ PRINT_SOURCE_LINES_FILENAME = (1 << 1) }; +DEF_ENUM_FLAGS_TYPE (enum print_source_lines_flag, print_source_lines_flags); extern void print_source_lines (struct symtab *, int, int, - enum print_source_lines_flags); + 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 VEC (char_ptr) *default_make_symbol_completion_list_break_on - (const char *text, const char *word, const char *break_on, +/* The reason we're calling into a completion match list collector + function. */ +enum class complete_symbol_mode + { + /* Completing an expression. */ + EXPRESSION, + + /* Completing a linespec. */ + LINESPEC, + }; + +extern void default_collect_symbol_completion_matches_break_on + (completion_tracker &tracker, + complete_symbol_mode mode, + symbol_name_match_type name_match_type, + 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 *, +extern void default_collect_symbol_completion_matches + (completion_tracker &tracker, + complete_symbol_mode, + symbol_name_match_type name_match_type, + const char *, + const char *, + enum type_code); +extern void collect_symbol_completion_matches + (completion_tracker &tracker, + complete_symbol_mode mode, + symbol_name_match_type name_match_type, + const char *, const char *); +extern void collect_symbol_completion_matches_type (completion_tracker &tracker, + 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 void collect_file_symbol_completion_matches + (completion_tracker &tracker, + complete_symbol_mode, + symbol_name_match_type name_match_type, + const char *, const char *, const char *); -extern VEC (char_ptr) *make_source_files_completion_list (const char *, - const char *); +extern completion_list + make_source_files_completion_list (const char *, const char *); /* symtab.c */ @@ -1451,12 +1814,6 @@ extern struct symtab_and_line find_function_start_sal (struct symbol *sym, extern void skip_prologue_sal (struct symtab_and_line *); -/* symfile.c */ - -extern void clear_symtab_users (int add_flags); - -extern enum language deduce_language_from_filename (const char *); - /* symtab.c */ extern CORE_ADDR skip_prologue_using_sal (struct gdbarch *gdbarch, @@ -1465,14 +1822,48 @@ extern CORE_ADDR skip_prologue_using_sal (struct gdbarch *gdbarch, extern struct symbol *fixup_symbol_section (struct symbol *, struct objfile *); +/* If MSYMBOL is an text symbol, look for a function debug symbol with + the same address. Returns NULL if not found. This is necessary in + case a function is an alias to some other function, because debug + information is only emitted for the alias target function's + definition, not for the alias. */ +extern symbol *find_function_alias_target (bound_minimal_symbol msymbol); + /* 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! */ +/* When using search_symbols, a vector of the following structs is + returned. */ struct symbol_search { + symbol_search (int block_, struct symbol *symbol_) + : block (block_), + symbol (symbol_) + { + msymbol.minsym = nullptr; + msymbol.objfile = nullptr; + } + + symbol_search (int block_, struct minimal_symbol *minsym, + struct objfile *objfile) + : block (block_), + symbol (nullptr) + { + msymbol.minsym = minsym; + msymbol.objfile = objfile; + } + + bool operator< (const symbol_search &other) const + { + return compare_search_syms (*this, other) < 0; + } + + bool operator== (const symbol_search &other) const + { + return compare_search_syms (*this, other) == 0; + } + /* The block in which the match was found. Could be, for example, STATIC_BLOCK or GLOBAL_BLOCK. */ int block; @@ -1486,15 +1877,15 @@ struct symbol_search which only minimal_symbols exist. */ struct bound_minimal_symbol msymbol; - /* A link to the next match, or NULL for the end. */ - struct symbol_search *next; +private: + + static int compare_search_syms (const symbol_search &sym_a, + const symbol_search &sym_b); }; -extern void search_symbols (const char *, enum search_domain, int, - const char **, struct symbol_search **); -extern void free_search_symbols (struct symbol_search *); -extern struct cleanup *make_cleanup_free_search_symbols (struct symbol_search - **); +extern std::vector search_symbols (const char *, + enum search_domain, int, + const char **); /* The name of the ``main'' function. FIXME: cagney/2001-03-20: Can't make main_name() const since some @@ -1506,10 +1897,9 @@ extern enum language main_language (void); /* Lookup symbol NAME from DOMAIN in MAIN_OBJFILE's global blocks. This searches MAIN_OBJFILE as well as any associated separate debug info objfiles of MAIN_OBJFILE. - Upon success sets BLOCK_FOUND and fixes up the symbol's section - if necessary. */ + Upon success fixes up the symbol's section if necessary. */ -extern struct symbol * +extern struct block_symbol lookup_global_symbol_from_objfile (struct objfile *main_objfile, const char *name, const domain_enum domain); @@ -1534,45 +1924,87 @@ 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 *real_path, - int (*callback) (struct symtab *symtab, - void *data), - void *data, - struct compunit_symtab *first, - struct compunit_symtab *after_last); +int compare_glob_filenames_for_search (const char *filename, + const char *search_name); + +bool iterate_over_some_symtabs (const char *name, + const char *real_path, + struct compunit_symtab *first, + struct compunit_symtab *after_last, + gdb::function_view callback); void iterate_over_symtabs (const char *name, - int (*callback) (struct symtab *symtab, - void *data), - void *data); + gdb::function_view callback); -DEF_VEC_I (CORE_ADDR); -VEC (CORE_ADDR) *find_pcs_for_symtab_line (struct symtab *symtab, int line, - struct linetable_entry **best_entry); +std::vector 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. */ +/* Prototype for callbacks for LA_ITERATE_OVER_SYMBOLS. The callback + is called once per matching symbol SYM. The callback should return + true to indicate that LA_ITERATE_OVER_SYMBOLS should continue + iterating, or false to indicate that the iteration should end. */ -typedef int (symbol_found_callback_ftype) (struct symbol *sym, void *data); +typedef bool (symbol_found_callback_ftype) (symbol *sym); -void iterate_over_symbols (const struct block *block, const char *name, +void iterate_over_symbols (const struct block *block, + const lookup_name_info &name, const domain_enum domain, - symbol_found_callback_ftype *callback, - void *data); + gdb::function_view callback); + +/* Storage type used by demangle_for_lookup. demangle_for_lookup + either returns a const char * pointer that points to either of the + fields of this type, or a pointer to the input NAME. This is done + this way because the underlying functions that demangle_for_lookup + calls either return a std::string (e.g., cp_canonicalize_string) or + a malloc'ed buffer (libiberty's demangled), and we want to avoid + unnecessary reallocation/string copying. */ +class demangle_result_storage +{ +public: -struct cleanup *demangle_for_lookup (const char *name, enum language lang, - const char **result_name); + /* Swap the std::string storage with STR, and return a pointer to + the beginning of the new string. */ + const char *swap_string (std::string &str) + { + std::swap (m_string, str); + return m_string.c_str (); + } + + /* Set the malloc storage to now point at PTR. Any previous malloc + storage is released. */ + const char *set_malloc_ptr (char *ptr) + { + m_malloc.reset (ptr); + return ptr; + } + +private: + + /* The storage. */ + std::string m_string; + gdb::unique_xmalloc_ptr m_malloc; +}; + +const char * + demangle_for_lookup (const char *name, enum language lang, + demangle_result_storage &storage); struct symbol *allocate_symbol (struct objfile *); -void initialize_symbol (struct symbol *); +void initialize_objfile_symbol (struct symbol *); struct template_symbol *allocate_template_symbol (struct objfile *); +/* Test to see if the symbol of language SYMBOL_LANGUAGE specified by + SYMNAME (which is already demangled for C++ symbols) matches + SYM_TEXT in the first SYM_TEXT_LEN characters. If so, add it to + the current completion list. */ +void completion_list_add_name (completion_tracker &tracker, + language symbol_language, + const char *symname, + const lookup_name_info &lookup_name, + const char *sym_text, int sym_text_len, + const char *text, const char *word); + #endif /* !defined(SYMTAB_H) */