X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Flanguage.c;h=bf990da8a9753fac3420f6c0b0eb0ed12d8a46d7;hb=4d4eaa30055138112bd17ed6933f2da39760d9e6;hp=7f870d83522d945abd91b248f42d123c73d547b5;hpb=481695ed5f6e0a8a9c9c50bfac1cdd2b3151e6c9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/language.c b/gdb/language.c index 7f870d8352..bf990da8a9 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -1,6 +1,6 @@ /* Multiple source language support 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. @@ -45,15 +45,10 @@ #include "frame.h" #include "c-lang.h" #include - -static void unk_lang_error (const char *); +#include "gdbarch.h" static int unk_lang_parser (struct parser_state *); -static void show_check (char *, int); - -static void set_check (char *, int); - static void set_range_case (void); static void unk_lang_emit_char (int c, struct type *type, @@ -111,17 +106,15 @@ static const struct language_defn *languages[] = { &ada_language_defn, }; -/* The current values of the "set language/type/range" enum +/* The current values of the "set language/range/case-sensitive" enum commands. */ static const char *language; -static const char *type; static const char *range; static const char *case_sensitive; -/* Warning issued when current_language and the language of the current - frame do not match. */ -char lang_frame_mismatch_warn[] = -"Warning: the current language does not match this frame."; +/* See language.h. */ +const char lang_frame_mismatch_warn[] = +N_("Warning: the current language does not match this frame."); /* This page contains the functions corresponding to GDB commands and their helpers. */ @@ -153,13 +146,14 @@ show_language_command (struct ui_file *file, int from_tty, if (flang != language_unknown && language_mode == language_mode_manual && current_language->la_language != flang) - printf_filtered ("%s\n", lang_frame_mismatch_warn); + printf_filtered ("%s\n", _(lang_frame_mismatch_warn)); } } /* Set command. Change the current working language. */ static void -set_language_command (char *ignore, int from_tty, struct cmd_list_element *c) +set_language_command (const char *ignore, + int from_tty, struct cmd_list_element *c) { enum language flang = language_unknown; @@ -178,18 +172,17 @@ set_language_command (char *ignore, int from_tty, struct cmd_list_element *c) /* Enter auto mode. Set to the current frame's language, if known, or fallback to the initial language. */ language_mode = language_mode_auto; - TRY + try { struct frame_info *frame; frame = get_selected_frame (NULL); flang = get_frame_language (frame); } - CATCH (ex, RETURN_MASK_ERROR) + catch (const gdb_exception_error &ex) { flang = language_unknown; } - END_CATCH if (flang != language_unknown) set_language (flang); @@ -256,7 +249,8 @@ show_range_command (struct ui_file *file, int from_tty, /* Set command. Change the setting for range checking. */ static void -set_range_command (char *ignore, int from_tty, struct cmd_list_element *c) +set_range_command (const char *ignore, + int from_tty, struct cmd_list_element *c) { if (strcmp (range, "on") == 0) { @@ -330,7 +324,7 @@ show_case_command (struct ui_file *file, int from_tty, /* Set command. Change the setting for case sensitivity. */ static void -set_case_command (char *ignore, int from_tty, struct cmd_list_element *c) +set_case_command (const char *ignore, int from_tty, struct cmd_list_element *c) { if (strcmp (case_sensitive, "on") == 0) { @@ -478,7 +472,7 @@ range_error (const char *string,...) /* Return the language enum for a given language string. */ enum language -language_enum (char *str) +language_enum (const char *str) { for (const auto &lang : languages) if (strcmp (lang->la_name, str) == 0) @@ -507,7 +501,7 @@ language_str (enum language lang) } static void -set_check (char *ignore, int from_tty) +set_check (const char *ignore, int from_tty) { printf_unfiltered ( "\"set check\" must be followed by the name of a check subcommand.\n"); @@ -515,7 +509,7 @@ set_check (char *ignore, int from_tty) } static void -show_check (char *ignore, int from_tty) +show_check (const char *ignore, int from_tty) { cmd_show_list (showchecklist, from_tty, ""); } @@ -565,7 +559,7 @@ add_set_language_command () doc.printf (_("Set the current source language.\n" "The currently understood settings are:\n\nlocal or " - "auto Automatic setting based on source file\n")); + "auto Automatic setting based on source file")); for (const auto &lang : languages) { @@ -576,7 +570,9 @@ add_set_language_command () /* FIXME: i18n: for now assume that the human-readable name is just a capitalization of the internal name. */ - doc.printf ("%-16s Use the %c%s language\n", + /* Note that we add the newline at the front, so we don't wind + up with a trailing newline. */ + doc.printf ("\n%-16s Use the %c%s language", lang->la_name, /* Capitalize first letter of language name. */ toupper (lang->la_name[0]), @@ -629,7 +625,7 @@ language_demangle (const struct language_defn *current_language, return NULL; } -/* See langauge.h. */ +/* See language.h. */ int language_sniff_from_mangled_name (const struct language_defn *lang, @@ -656,21 +652,23 @@ language_class_name_from_physname (const struct language_defn *lang, return NULL; } -/* Return non-zero if TYPE should be passed (and returned) by - reference at the language level. */ -int +/* Return information about whether TYPE should be passed + (and returned) by reference at the language level. */ + +struct language_pass_by_ref_info language_pass_by_reference (struct type *type) { return current_language->la_pass_by_reference (type); } -/* Return zero; by default, types are passed by value at the language - level. The target ABI may pass or return some structs by reference - independent of this. */ -int +/* Return a default struct that provides pass-by-reference information + about the given TYPE. Languages should update the default values + as appropriate. */ + +struct language_pass_by_ref_info default_pass_by_reference (struct type *type) { - return 0; + return {}; } /* Return the default string containing the list of characters @@ -694,11 +692,61 @@ default_print_array_index (struct value *index_value, struct ui_file *stream, fprintf_filtered (stream, "] = "); } -void -default_get_string (struct value *value, gdb_byte **buffer, int *length, - struct type **char_type, const char **charset) +/* See language.h. */ + +bool +default_symbol_name_matcher (const char *symbol_search_name, + const lookup_name_info &lookup_name, + completion_match_result *comp_match_res) +{ + const std::string &name = lookup_name.name (); + completion_match_for_lcd *match_for_lcd + = (comp_match_res != NULL ? &comp_match_res->match_for_lcd : NULL); + strncmp_iw_mode mode = (lookup_name.completion_mode () + ? strncmp_iw_mode::NORMAL + : strncmp_iw_mode::MATCH_PARAMS); + + if (strncmp_iw_with_mode (symbol_search_name, name.c_str (), name.size (), + mode, language_minimal, match_for_lcd) == 0) + { + if (comp_match_res != NULL) + comp_match_res->set_match (symbol_search_name); + return true; + } + else + return false; +} + +/* See language.h. */ + +bool +default_is_string_type_p (struct type *type) +{ + type = check_typedef (type); + while (TYPE_CODE (type) == TYPE_CODE_REF) + { + type = TYPE_TARGET_TYPE (type); + type = check_typedef (type); + } + return (TYPE_CODE (type) == TYPE_CODE_STRING); +} + +/* See language.h. */ + +symbol_name_matcher_ftype * +get_symbol_name_matcher (const language_defn *lang, + const lookup_name_info &lookup_name) { - error (_("Getting a string is unsupported in this language.")); + /* If currently in Ada mode, and the lookup name is wrapped in + '<...>', hijack all symbol name comparisons using the Ada + matcher, which handles the verbatim matching. */ + if (current_language->la_language == language_ada + && lookup_name.ada ().verbatim_p ()) + return current_language->la_get_symbol_name_matcher (lookup_name); + + if (lang->la_get_symbol_name_matcher != nullptr) + return lang->la_get_symbol_name_matcher (lookup_name); + return default_symbol_name_matcher; } /* Define the language that is no language. */ @@ -709,12 +757,6 @@ unk_lang_parser (struct parser_state *ps) return 1; } -static void -unk_lang_error (const char *msg) -{ - error (_("Attempted to parse an expression with unknown language")); -} - static void unk_lang_emit_char (int c, struct type *type, struct ui_file *stream, int quoter) @@ -811,7 +853,6 @@ const struct language_defn unknown_language_defn = NULL, &exp_descriptor_standard, unk_lang_parser, - unk_lang_error, null_post_parser, unk_lang_printchar, /* Print character constant */ unk_lang_printstr, @@ -823,6 +864,7 @@ const struct language_defn unknown_language_defn = default_read_var_value, /* la_read_var_value */ unk_lang_trampoline, /* Language specific skip_trampoline */ "this", /* name_of_this */ + true, /* store_sym_names_in_linkage_form_p */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ unk_lang_demangle, /* Language specific symbol demangler */ @@ -837,14 +879,15 @@ const struct language_defn unknown_language_defn = unknown_language_arch_info, /* la_language_arch_info. */ default_print_array_index, default_pass_by_reference, - default_get_string, c_watch_location_expression, - NULL, /* la_get_symbol_name_cmp */ + NULL, /* la_get_symbol_name_matcher */ iterate_over_symbols, + default_search_name_hash, &default_varobj_ops, NULL, NULL, - LANG_MAGIC + default_is_string_type_p, + "{...}" /* la_struct_too_deep_ellipsis */ }; /* These two structs define fake entries for the "local" and "auto" @@ -861,7 +904,6 @@ const struct language_defn auto_language_defn = NULL, &exp_descriptor_standard, unk_lang_parser, - unk_lang_error, null_post_parser, unk_lang_printchar, /* Print character constant */ unk_lang_printstr, @@ -873,6 +915,7 @@ const struct language_defn auto_language_defn = default_read_var_value, /* la_read_var_value */ unk_lang_trampoline, /* Language specific skip_trampoline */ "this", /* name_of_this */ + false, /* store_sym_names_in_linkage_form_p */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ unk_lang_demangle, /* Language specific symbol demangler */ @@ -887,14 +930,15 @@ const struct language_defn auto_language_defn = unknown_language_arch_info, /* la_language_arch_info. */ default_print_array_index, default_pass_by_reference, - default_get_string, c_watch_location_expression, - NULL, /* la_get_symbol_name_cmp */ + NULL, /* la_get_symbol_name_matcher */ iterate_over_symbols, + default_search_name_hash, &default_varobj_ops, NULL, NULL, - LANG_MAGIC + default_is_string_type_p, + "{...}" /* la_struct_too_deep_ellipsis */ }; @@ -1006,10 +1050,10 @@ language_alloc_type_symbol (enum language lang, struct type *type) gdb_assert (!TYPE_OBJFILE_OWNED (type)); gdbarch = TYPE_OWNER (type).gdbarch; - symbol = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct symbol); + symbol = new (gdbarch_obstack (gdbarch)) struct symbol (); - symbol->ginfo.name = TYPE_NAME (type); - symbol->ginfo.language = lang; + symbol->m_name = TYPE_NAME (type); + symbol->set_language (lang, nullptr); symbol->owner.arch = gdbarch; SYMBOL_OBJFILE_OWNED (symbol) = 0; SYMBOL_TYPE (symbol) = type; @@ -1120,16 +1164,16 @@ _initialize_language (void) add_setshow_enum_cmd ("range", class_support, type_or_range_names, &range, - _("Set range checking. (on/warn/off/auto)"), - _("Show range checking. (on/warn/off/auto)"), + _("Set range checking (on/warn/off/auto)."), + _("Show range checking (on/warn/off/auto)."), NULL, set_range_command, show_range_command, &setchecklist, &showchecklist); add_setshow_enum_cmd ("case-sensitive", class_support, case_sensitive_names, &case_sensitive, _("\ -Set case sensitivity in name search. (on/off/auto)"), _("\ -Show case sensitivity in name search. (on/off/auto)"), _("\ +Set case sensitivity in name search (on/off/auto)."), _("\ +Show case sensitivity in name search (on/off/auto)."), _("\ For Fortran the default is off; for other languages the default is on."), set_case_command, show_case_command, @@ -1137,10 +1181,9 @@ For Fortran the default is off; for other languages the default is on."), add_set_language_command (); - language = xstrdup ("auto"); - type = xstrdup ("auto"); - range = xstrdup ("auto"); - case_sensitive = xstrdup ("auto"); + language = "auto"; + range = "auto"; + case_sensitive = "auto"; /* Have the above take effect. */ set_language (language_auto);