X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Flanguage.h;h=14d6fac30371313efc70c5c7316c751ff838b52a;hb=b61121178ec07f9da1242e439fe1a23a314ad30e;hp=d4ca900834dcb7a4519ada07ccc537fe8b68b42f;hpb=2039bd9f0ce667f3f0ee99c18e25de1ea18a2288;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/language.h b/gdb/language.h index d4ca900834..14d6fac303 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -1,6 +1,6 @@ /* Source-language-related definitions for GDB. - Copyright (C) 1991-2017 Free Software Foundation, Inc. + Copyright (C) 1991-2019 Free Software Foundation, Inc. Contributed by the Department of Computer Science at the State University of New York at Buffalo. @@ -24,19 +24,21 @@ #define LANGUAGE_H 1 #include "symtab.h" -#include "common/function-view.h" +#include "gdbsupport/function-view.h" +#include "expression.h" /* Forward decls for prototypes. */ struct value; struct objfile; struct frame_info; -struct expression; struct ui_file; struct value_print_options; struct type_print_options; struct lang_varobj_ops; struct parser_state; -struct compile_instance; +class compile_instance; +struct completion_match_for_lcd; +class innermost_block_tracker; #define MAX_FORTRAN_DIMS 7 /* Maximum number of F77 array dims. */ @@ -126,16 +128,6 @@ struct language_arch_info struct type *bool_type_default; }; -/* A pointer to a function expected to return nonzero if - SYMBOL_SEARCH_NAME matches the given LOOKUP_NAME. - - SYMBOL_SEARCH_NAME should be a symbol's "search" name. - LOOKUP_NAME should be the name of an entity after it has been - transformed for lookup. */ - -typedef int (*symbol_name_cmp_ftype) (const char *symbol_search_name, - const char *lookup_name); - /* Structure tying together assorted information about a language. */ struct language_defn @@ -181,17 +173,16 @@ struct language_defn int (*la_parser) (struct parser_state *); - /* Parser error function. */ - - void (*la_error) (const char *); - /* Given an expression *EXPP created by prefixifying the result of la_parser, perform any remaining processing necessary to complete its translation. *EXPP may change; la_post_parser is responsible for releasing its previous contents, if necessary. If - VOID_CONTEXT_P, then no value is expected from the expression. */ + VOID_CONTEXT_P, then no value is expected from the expression. + If COMPLETING is non-zero, then the expression has been parsed + for completion, not evaluation. */ - void (*la_post_parser) (struct expression ** expp, int void_context_p); + void (*la_post_parser) (expression_up *expp, int void_context_p, + int completing, innermost_block_tracker *tracker); void (*la_printchar) (int ch, struct type *chtype, struct ui_file * stream); @@ -273,6 +264,26 @@ struct language_defn const char *la_name_of_this; + /* True if the symbols names should be stored in GDB's data structures + for minimal/partial/full symbols using their linkage (aka mangled) + form; false if the symbol names should be demangled first. + + Most languages implement symbol lookup by comparing the demangled + names, in which case it is advantageous to store that information + already demangled, and so would set this field to false. + + On the other hand, some languages have opted for doing symbol + lookups by comparing mangled names instead, for reasons usually + specific to the language. Those languages should set this field + to true. + + And finally, other languages such as C or Asm do not have + the concept of mangled vs demangled name, so those languages + should set this field to true as well, to prevent any accidental + demangling through an unrelated language's demangler. */ + + const bool la_store_sym_names_in_linkage_form_p; + /* This is a function that lookup_symbol will call when it gets to the part of symbol lookup where C looks up static and global variables. */ @@ -331,6 +342,7 @@ struct language_defn void (*la_collect_symbol_completion_matches) (completion_tracker &tracker, complete_symbol_mode mode, + symbol_name_match_type match_type, const char *text, const char *word, enum type_code code); @@ -348,32 +360,24 @@ struct language_defn reference at the language level. */ int (*la_pass_by_reference) (struct type *type); - /* Obtain a string from the inferior, storing it in a newly allocated - buffer in BUFFER, which should be freed by the caller. If the - in- and out-parameter *LENGTH is specified at -1, the string is - read until a null character of the appropriate width is found - - otherwise the string is read to the length of characters specified. - On completion, *LENGTH will hold the size of the string in characters. - If a *LENGTH of -1 was specified it will count only actual - characters, excluding any eventual terminating null character. - Otherwise *LENGTH will include all characters - including any nulls. - CHARSET will hold the encoding used in the string. */ - void (*la_get_string) (struct value *value, gdb_byte **buffer, int *length, - struct type **chartype, const char **charset); - /* Return an expression that can be used for a location watchpoint. TYPE is a pointer type that points to the memory to watch, and ADDR is the address of the watched memory. */ gdb::unique_xmalloc_ptr (*la_watch_location_expression) (struct type *type, CORE_ADDR addr); - /* Return a pointer to the function that should be used to match - a symbol name against LOOKUP_NAME. This is mostly for languages - such as Ada where the matching algorithm depends on LOOKUP_NAME. + /* Return a pointer to the function that should be used to match a + symbol name against LOOKUP_NAME, according to this language's + rules. The matching algorithm depends on LOOKUP_NAME. For + example, on Ada, the matching algorithm depends on the symbol + name (wild/full/verbatim matching), and on whether we're doing + a normal lookup or a completion match lookup. - This field may be NULL, in which case strcmp_iw will be used - to perform the matching. */ - symbol_name_cmp_ftype (*la_get_symbol_name_cmp) (const char *lookup_name); + This field may be NULL, in which case + default_symbol_name_matcher is used to perform the + matching. */ + symbol_name_matcher_ftype *(*la_get_symbol_name_matcher) + (const lookup_name_info &); /* Find all symbols in the current program space matching NAME in DOMAIN, according to this language's rules. @@ -388,10 +392,16 @@ struct language_defn This field may not be NULL. If the language does not need any special processing here, 'iterate_over_symbols' should be used as the definition. */ - void (*la_iterate_over_symbols) - (const struct block *block, const char *name, domain_enum domain, + bool (*la_iterate_over_symbols) + (const struct block *block, const lookup_name_info &name, + domain_enum domain, gdb::function_view callback); + /* Hash the given symbol search name. Use + default_search_name_hash if no special treatment is + required. */ + unsigned int (*la_search_name_hash) (const char *name); + /* Various operations on varobj. */ const struct lang_varobj_ops *la_varobj_ops; @@ -403,7 +413,7 @@ struct language_defn instance is owned by its caller and must be deallocated by calling its 'destroy' method. */ - struct compile_instance *(*la_get_compile_instance) (void); + compile_instance *(*la_get_compile_instance) (void); /* This method must be defined if 'la_get_gcc_context' is defined. If 'la_get_gcc_context' is not defined, then this method is @@ -419,21 +429,22 @@ struct language_defn parsed. EXPR_PC is the PC at which the expression is being parsed. */ - std::string (*la_compute_program) (struct compile_instance *inst, + std::string (*la_compute_program) (compile_instance *inst, const char *input, struct gdbarch *gdbarch, const struct block *expr_block, CORE_ADDR expr_pc); - /* Add fields above this point, so the magic number is always last. */ - /* Magic number for compat checking. */ + /* Return true if TYPE is a string type. */ + bool (*la_is_string_type_p) (struct type *type); - long la_magic; + /* This string is used by the 'set print max-depth' setting. When GDB + replaces a struct or union (during value printing) that is "too + deep" this string is displayed instead. */ + const char *la_struct_too_deep_ellipsis; }; -#define LANG_MAGIC 910823L - /* Pointer to the language_defn for our current language. This pointer always points to *some* valid struct; it can be used without checking it for validity. @@ -457,6 +468,11 @@ extern const struct language_defn *current_language; extern const struct language_defn *expected_language; +/* Warning issued when current_language and the language of the current + frame do not match. */ + +extern const char lang_frame_mismatch_warn[]; + /* language_mode == language_mode_auto: current_language automatically set upon selection of scope (e.g. stack frame) @@ -528,8 +544,6 @@ extern enum language set_language (enum language); encoding, force_ellipses,options)) #define LA_EMIT_CHAR(ch, type, stream, quoter) \ (current_language->la_emitchar(ch, type, stream, quoter)) -#define LA_GET_STRING(value, buffer, length, chartype, encoding) \ - (current_language->la_get_string(value, buffer, length, chartype, encoding)) #define LA_PRINT_ARRAY_INDEX(index_value, stream, options) \ (current_language->la_print_array_index(index_value, stream, options)) @@ -552,6 +566,10 @@ extern enum language set_language (enum language); extern int pointer_type (struct type *); +/* Return true if TYPE is a string type, otherwise return false. This + default implementation only detects TYPE_CODE_STRING. */ +extern bool default_is_string_type_p (struct type *type); + /* Error messages */ extern void range_error (const char *, ...) ATTRIBUTE_PRINTF (1, 2); @@ -608,11 +626,33 @@ int default_pass_by_reference (struct type *type); void default_print_typedef (struct type *type, struct symbol *new_symbol, struct ui_file *stream); -void default_get_string (struct value *value, gdb_byte **buffer, int *length, - struct type **char_type, const char **charset); - -void c_get_string (struct value *value, gdb_byte **buffer, int *length, - struct type **char_type, const char **charset); +/* Default name hashing function. */ + +/* Produce an unsigned hash value from SEARCH_NAME that is consistent + with strcmp_iw, strcmp, and, at least on Ada symbols, wild_match. + That is, two identifiers equivalent according to any of those three + comparison operators hash to the same value. */ +extern unsigned int default_search_name_hash (const char *search_name); + +void c_get_string (struct value *value, + gdb::unique_xmalloc_ptr *buffer, + int *length, struct type **char_type, + const char **charset); + +/* The default implementation of la_symbol_name_matcher. Matches with + strncmp_iw. */ +extern bool default_symbol_name_matcher + (const char *symbol_search_name, + const lookup_name_info &lookup_name, + completion_match_result *comp_match_res); + +/* Get LANG's symbol_name_matcher method for LOOKUP_NAME. Returns + default_symbol_name_matcher if not set. LANG is used as a hint; + the function may ignore it depending on the current language and + LOOKUP_NAME. Specifically, if the current language is Ada, this + may return an Ada matcher regardless of LANG. */ +symbol_name_matcher_ftype *get_symbol_name_matcher + (const language_defn *lang, const lookup_name_info &lookup_name); /* The languages supported by GDB. */ @@ -659,4 +699,44 @@ private: enum language m_lang; }; +/* If language_mode is language_mode_auto, + then switch current language to the language of SYM + and restore current language upon destruction. + + Else do nothing. */ + +class scoped_switch_to_sym_language_if_auto +{ +public: + + explicit scoped_switch_to_sym_language_if_auto (const struct symbol *sym) + { + if (language_mode == language_mode_auto) + { + m_lang = current_language->la_language; + m_switched = true; + set_language (sym->language ()); + } + else + { + m_switched = false; + /* Assign to m_lang to silence a GCC warning. See + https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80635. */ + m_lang = language_unknown; + } + } + + ~scoped_switch_to_sym_language_if_auto () + { + if (m_switched) + set_language (m_lang); + } + + DISABLE_COPY_AND_ASSIGN (scoped_switch_to_sym_language_if_auto); + +private: + bool m_switched; + enum language m_lang; +}; + #endif /* defined (LANGUAGE_H) */