X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gdb%2Flanguage.c;h=e95084f1154ef11eafe927c44b8e883fcf630c61;hb=d8f9e51c361dfb53de3eca8d84f8938380af60ff;hp=c05b703207ff10acfa0a9aa2a3a95493b1b4db4e;hpb=a207cff2da9f154e4f581b19dcde215593bfccf9;p=external%2Fbinutils.git diff --git a/gdb/language.c b/gdb/language.c index c05b703..e95084f 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,8 +45,7 @@ #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 *); @@ -107,10 +106,9 @@ 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; @@ -175,18 +173,17 @@ set_language_command (const char *ignore, /* 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); @@ -563,7 +560,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) { @@ -574,7 +571,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]), @@ -627,7 +626,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, @@ -693,8 +692,9 @@ default_print_array_index (struct value *index_value, struct ui_file *stream, } void -default_get_string (struct value *value, gdb_byte **buffer, int *length, - struct type **char_type, const char **charset) +default_get_string (struct value *value, + gdb::unique_xmalloc_ptr *buffer, + int *length, struct type **char_type, const char **charset) { error (_("Getting a string is unsupported in this language.")); } @@ -707,13 +707,14 @@ default_symbol_name_matcher (const char *symbol_search_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) == 0) + mode, language_minimal, match_for_lcd) == 0) { if (comp_match_res != NULL) comp_match_res->set_match (symbol_search_name); @@ -725,10 +726,31 @@ default_symbol_name_matcher (const char *symbol_search_name, /* 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 * -language_get_symbol_name_matcher (const language_defn *lang, - const lookup_name_info &lookup_name) +get_symbol_name_matcher (const language_defn *lang, + const lookup_name_info &lookup_name) { + /* 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; @@ -743,12 +765,6 @@ unk_lang_parser (struct parser_state *ps) } 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) { @@ -844,7 +860,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, @@ -856,6 +871,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 */ @@ -878,7 +894,8 @@ const struct language_defn unknown_language_defn = &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" @@ -895,7 +912,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, @@ -907,6 +923,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 */ @@ -929,7 +946,8 @@ const struct language_defn auto_language_defn = &default_varobj_ops, NULL, NULL, - LANG_MAGIC + default_is_string_type_p, + "{...}" /* la_struct_too_deep_ellipsis */ }; @@ -1155,16 +1173,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, @@ -1172,10 +1190,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);