X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Flanguage.c;h=0d8604b8268bca403840a6d8a10f3213d40e5338;hb=618daa933cdce21424d3759ea95a4e2f5c69a1c2;hp=ab767c3aaab1f1cdb65df6743e30b727ef5f0323;hpb=7ff38b1c898be5db053193f26d6a3a1d8a6074e8;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/language.c b/gdb/language.c index ab767c3aaa..0d8604b826 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -1,6 +1,6 @@ /* Multiple source language support for GDB. - Copyright (C) 1991-2015 Free Software Foundation, Inc. + Copyright (C) 1991-2018 Free Software Foundation, Inc. Contributed by the Department of Computer Science at the State University of New York at Buffalo. @@ -39,21 +39,17 @@ #include "varobj.h" #include "target.h" #include "parser-defs.h" -#include "jv-lang.h" #include "demangle.h" #include "symfile.h" #include "cp-support.h" +#include "frame.h" +#include "c-lang.h" +#include -extern void _initialize_language (void); - -static void unk_lang_error (char *); +static void unk_lang_error (const char *); 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, @@ -90,12 +86,26 @@ enum language_mode language_mode = language_mode_auto; const struct language_defn *expected_language; -/* The list of supported languages. The list itself is malloc'd. */ - -static const struct language_defn **languages; -static unsigned languages_size; -static unsigned languages_allocsize; -#define DEFAULT_ALLOCSIZE 4 +/* The list of supported languages. Keep this in the same order as + the 'enum language' values. */ + +static const struct language_defn *languages[] = { + &unknown_language_defn, + &auto_language_defn, + &c_language_defn, + &objc_language_defn, + &cplus_language_defn, + &d_language_defn, + &go_language_defn, + &f_language_defn, + &m2_language_defn, + &asm_language_defn, + &pascal_language_defn, + &opencl_language_defn, + &rust_language_defn, + &minimal_language_defn, + &ada_language_defn, +}; /* The current values of the "set language/type/range" enum commands. */ @@ -145,18 +155,22 @@ show_language_command (struct ui_file *file, int from_tty, /* 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) { - int i; enum language flang = language_unknown; + /* "local" is a synonym of "auto". */ + if (strcmp (language, "local") == 0) + language = "auto"; + /* Search the list of languages for a match. */ - for (i = 0; i < languages_size; i++) + for (const auto &lang : languages) { - if (strcmp (languages[i]->la_name, language) == 0) + if (strcmp (lang->la_name, language) == 0) { /* Found it! Go into manual mode, and use this language. */ - if (languages[i]->la_language == language_auto) + if (lang->la_language == language_auto) { /* Enter auto mode. Set to the current frame's language, if known, or fallback to the initial language. */ @@ -185,7 +199,7 @@ set_language_command (char *ignore, int from_tty, struct cmd_list_element *c) { /* Enter manual mode. Set the specified language. */ language_mode = language_mode_manual; - current_language = languages[i]; + current_language = lang; set_range_case (); expected_language = current_language; return; @@ -206,7 +220,7 @@ show_range_command (struct ui_file *file, int from_tty, { if (range_mode == range_mode_auto) { - char *tmp; + const char *tmp; switch (range_check) { @@ -239,7 +253,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) { @@ -280,7 +295,7 @@ show_case_command (struct ui_file *file, int from_tty, { if (case_mode == case_mode_auto) { - char *tmp = NULL; + const char *tmp = NULL; switch (case_sensitivity) { @@ -313,7 +328,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) { @@ -363,21 +378,11 @@ set_range_case (void) enum language set_language (enum language lang) { - int i; enum language prev_language; prev_language = current_language->la_language; - - for (i = 0; i < languages_size; i++) - { - if (languages[i]->la_language == lang) - { - current_language = languages[i]; - set_range_case (); - break; - } - } - + current_language = languages[lang]; + set_range_case (); return prev_language; } @@ -409,8 +414,7 @@ language_info (int quietly) int pointer_type (struct type *type) { - return TYPE_CODE (type) == TYPE_CODE_PTR || - TYPE_CODE (type) == TYPE_CODE_REF; + return TYPE_CODE (type) == TYPE_CODE_PTR || TYPE_IS_REFERENCE (type); } @@ -472,13 +476,14 @@ 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) { - int i; + for (const auto &lang : languages) + if (strcmp (lang->la_name, str) == 0) + return lang->la_language; - for (i = 0; i < languages_size; i++) - if (strcmp (languages[i]->la_name, str) == 0) - return languages[i]->la_language; + if (strcmp (str, "local") == 0) + return language_auto; return language_unknown; } @@ -488,36 +493,19 @@ language_enum (char *str) const struct language_defn * language_def (enum language lang) { - int i; - - for (i = 0; i < languages_size; i++) - { - if (languages[i]->la_language == lang) - { - return languages[i]; - } - } - return NULL; + return languages[lang]; } /* Return the language as a string. */ + const char * language_str (enum language lang) { - int i; - - for (i = 0; i < languages_size; i++) - { - if (languages[i]->la_language == lang) - { - return languages[i]->la_name; - } - } - return "Unknown"; + return languages[lang]->la_name; } 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"); @@ -525,93 +513,82 @@ 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, ""); } -/* Add a language to the set of known languages. */ - -void -add_language (const struct language_defn *lang) -{ - /* For the "set language" command. */ - static const char **language_names = NULL; - /* For the "help set language" command. */ - char *language_set_doc = NULL; - int i; - struct ui_file *tmp_stream; +/* Build and install the "set language LANG" command. */ - if (lang->la_magic != LANG_MAGIC) - { - fprintf_unfiltered (gdb_stderr, - "Magic number of %s language struct wrong\n", - lang->la_name); - internal_error (__FILE__, __LINE__, - _("failed internal consistency check")); - } +static void +add_set_language_command () +{ + static const char **language_names; - if (!languages) - { - languages_allocsize = DEFAULT_ALLOCSIZE; - languages = (const struct language_defn **) xmalloc - (languages_allocsize * sizeof (*languages)); - } - if (languages_size >= languages_allocsize) + /* Build the language names array, to be used as enumeration in the + "set language" enum command. +1 for "local" and +1 for NULL + termination. */ + language_names = new const char *[ARRAY_SIZE (languages) + 2]; + + /* Display "auto", "local" and "unknown" first, and then the rest, + alpha sorted. */ + const char **language_names_p = language_names; + *language_names_p++ = auto_language_defn.la_name; + *language_names_p++ = "local"; + *language_names_p++ = unknown_language_defn.la_name; + const char **sort_begin = language_names_p; + for (const auto &lang : languages) { - languages_allocsize *= 2; - languages = (const struct language_defn **) xrealloc ((char *) languages, - languages_allocsize * sizeof (*languages)); + /* Already handled above. */ + if (lang->la_language == language_auto + || lang->la_language == language_unknown) + continue; + *language_names_p++ = lang->la_name; } - languages[languages_size++] = lang; - - /* Build the language names array, to be used as enumeration in the - set language" enum command. */ - language_names = xrealloc (language_names, - (languages_size + 1) * sizeof (const char *)); - for (i = 0; i < languages_size; ++i) - language_names[i] = languages[i]->la_name; - language_names[i] = NULL; + *language_names_p = NULL; + std::sort (sort_begin, language_names_p, compare_cstrings); + + /* Add the filename extensions. */ + for (const auto &lang : languages) + if (lang->la_filename_extensions != NULL) + { + for (size_t i = 0; lang->la_filename_extensions[i] != NULL; ++i) + add_filename_language (lang->la_filename_extensions[i], + lang->la_language); + } /* Build the "help set language" docs. */ - tmp_stream = mem_fileopen (); + string_file doc; - fprintf_unfiltered (tmp_stream, - _("Set the current source language.\n" - "The currently understood settings are:\n\nlocal or " - "auto Automatic setting based on source file\n")); + doc.printf (_("Set the current source language.\n" + "The currently understood settings are:\n\nlocal or " + "auto Automatic setting based on source file\n")); - for (i = 0; i < languages_size; ++i) + for (const auto &lang : languages) { /* Already dealt with these above. */ - if (languages[i]->la_language == language_unknown - || languages[i]->la_language == language_auto) + if (lang->la_language == language_unknown + || lang->la_language == language_auto) continue; - /* FIXME: i18n: for now assume that the human-readable name - is just a capitalization of the internal name. */ - fprintf_unfiltered (tmp_stream, "%-16s Use the %c%s language\n", - languages[i]->la_name, - /* Capitalize first letter of language - name. */ - toupper (languages[i]->la_name[0]), - languages[i]->la_name + 1); + /* 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", + lang->la_name, + /* Capitalize first letter of language name. */ + toupper (lang->la_name[0]), + lang->la_name + 1); } - language_set_doc = ui_file_xstrdup (tmp_stream, NULL); - ui_file_delete (tmp_stream); - add_setshow_enum_cmd ("language", class_support, - (const char **) language_names, + language_names, &language, - language_set_doc, + doc.c_str (), _("Show the current source language."), NULL, set_language_command, show_language_command, &setlist, &showlist); - - xfree (language_set_doc); } /* Iterate through all registered languages looking for and calling @@ -621,13 +598,11 @@ add_language (const struct language_defn *lang) CORE_ADDR skip_language_trampoline (struct frame_info *frame, CORE_ADDR pc) { - int i; - - for (i = 0; i < languages_size; i++) + for (const auto &lang : languages) { - if (languages[i]->skip_trampoline) + if (lang->skip_trampoline != NULL) { - CORE_ADDR real_pc = (languages[i]->skip_trampoline) (frame, pc); + CORE_ADDR real_pc = lang->skip_trampoline (frame, pc); if (real_pc) return real_pc; @@ -652,6 +627,23 @@ language_demangle (const struct language_defn *current_language, return NULL; } +/* See langauge.h. */ + +int +language_sniff_from_mangled_name (const struct language_defn *lang, + const char *mangled, char **demangled) +{ + gdb_assert (lang != NULL); + + if (lang->la_sniff_from_mangled_name == NULL) + { + *demangled = NULL; + return 0; + } + + return lang->la_sniff_from_mangled_name (mangled, demangled); +} + /* Return class name from physname or NULL. */ char * language_class_name_from_physname (const struct language_defn *lang, @@ -683,7 +675,7 @@ default_pass_by_reference (struct type *type) delimiting words. This is a reasonable default value that most languages should be able to use. */ -char * +const char * default_word_break_characters (void) { return " \t\n!@#$%^&*()+=|~`}{[]\"';:?/>.<,-"; @@ -707,6 +699,49 @@ default_get_string (struct value *value, gdb_byte **buffer, int *length, error (_("Getting a string is unsupported in this language.")); } +/* 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. */ + +symbol_name_matcher_ftype * +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; +} + /* Define the language that is no language. */ static int @@ -716,7 +751,7 @@ unk_lang_parser (struct parser_state *ps) } static void -unk_lang_error (char *msg) +unk_lang_error (const char *msg) { error (_("Attempted to parse an expression with unknown language")); } @@ -756,10 +791,10 @@ unk_lang_print_type (struct type *type, const char *varstring, } static void -unk_lang_val_print (struct type *type, const gdb_byte *valaddr, +unk_lang_val_print (struct type *type, int embedded_offset, CORE_ADDR address, struct ui_file *stream, int recurse, - const struct value *val, + struct value *val, const struct value_print_options *options) { error (_("internal error - unimplemented " @@ -814,6 +849,7 @@ const struct language_defn unknown_language_defn = case_sensitive_on, array_row_major, macro_expansion_no, + NULL, &exp_descriptor_standard, unk_lang_parser, unk_lang_error, @@ -831,19 +867,22 @@ const struct language_defn unknown_language_defn = basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ unk_lang_demangle, /* Language specific symbol demangler */ + NULL, unk_lang_class_name, /* Language specific class_name_from_physname */ unk_op_print_tab, /* expression operators for printing */ 1, /* c-style arrays */ 0, /* String lower bound */ default_word_break_characters, - default_make_symbol_completion_list, + default_collect_symbol_completion_matches, unknown_language_arch_info, /* la_language_arch_info. */ default_print_array_index, default_pass_by_reference, default_get_string, - NULL, /* la_get_symbol_name_cmp */ + c_watch_location_expression, + NULL, /* la_get_symbol_name_matcher */ iterate_over_symbols, + default_search_name_hash, &default_varobj_ops, NULL, NULL, @@ -861,6 +900,7 @@ const struct language_defn auto_language_defn = case_sensitive_on, array_row_major, macro_expansion_no, + NULL, &exp_descriptor_standard, unk_lang_parser, unk_lang_error, @@ -878,69 +918,28 @@ const struct language_defn auto_language_defn = basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ basic_lookup_transparent_type,/* lookup_transparent_type */ unk_lang_demangle, /* Language specific symbol demangler */ - unk_lang_class_name, /* Language specific - class_name_from_physname */ - unk_op_print_tab, /* expression operators for printing */ - 1, /* c-style arrays */ - 0, /* String lower bound */ - default_word_break_characters, - default_make_symbol_completion_list, - unknown_language_arch_info, /* la_language_arch_info. */ - default_print_array_index, - default_pass_by_reference, - default_get_string, - NULL, /* la_get_symbol_name_cmp */ - iterate_over_symbols, - &default_varobj_ops, NULL, - NULL, - LANG_MAGIC -}; - -const struct language_defn local_language_defn = -{ - "local", - "Local", - language_auto, - range_check_off, - case_sensitive_on, - array_row_major, - macro_expansion_no, - &exp_descriptor_standard, - unk_lang_parser, - unk_lang_error, - null_post_parser, - unk_lang_printchar, /* Print character constant */ - unk_lang_printstr, - unk_lang_emit_char, - unk_lang_print_type, /* Print a type using appropriate syntax */ - default_print_typedef, /* Print a typedef using appropriate syntax */ - unk_lang_val_print, /* Print a value using appropriate syntax */ - unk_lang_value_print, /* Print a top-level value */ - default_read_var_value, /* la_read_var_value */ - unk_lang_trampoline, /* Language specific skip_trampoline */ - "this", /* name_of_this */ - basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ - basic_lookup_transparent_type,/* lookup_transparent_type */ - unk_lang_demangle, /* Language specific symbol demangler */ unk_lang_class_name, /* Language specific class_name_from_physname */ unk_op_print_tab, /* expression operators for printing */ 1, /* c-style arrays */ 0, /* String lower bound */ default_word_break_characters, - default_make_symbol_completion_list, + default_collect_symbol_completion_matches, unknown_language_arch_info, /* la_language_arch_info. */ default_print_array_index, default_pass_by_reference, default_get_string, - NULL, /* la_get_symbol_name_cmp */ + c_watch_location_expression, + NULL, /* la_get_symbol_name_matcher */ iterate_over_symbols, + default_search_name_hash, &default_varobj_ops, NULL, NULL, LANG_MAGIC }; + /* Per-architecture language information. */ @@ -957,16 +956,15 @@ static void * language_gdbarch_post_init (struct gdbarch *gdbarch) { struct language_gdbarch *l; - int i; l = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct language_gdbarch); - for (i = 0; i < languages_size; i++) - { - if (languages[i] != NULL - && languages[i]->la_language_arch_info != NULL) - languages[i]->la_language_arch_info - (gdbarch, l->arch_info + languages[i]->la_language); - } + for (const auto &lang : languages) + if (lang != NULL && lang->la_language_arch_info != NULL) + { + lang->la_language_arch_info (gdbarch, + l->arch_info + lang->la_language); + } + return l; } @@ -974,8 +972,8 @@ struct type * language_string_char_type (const struct language_defn *la, struct gdbarch *gdbarch) { - struct language_gdbarch *ld = gdbarch_data (gdbarch, - language_gdbarch_data); + struct language_gdbarch *ld + = (struct language_gdbarch *) gdbarch_data (gdbarch, language_gdbarch_data); return ld->arch_info[la->la_language].string_char_type; } @@ -984,8 +982,8 @@ struct type * language_bool_type (const struct language_defn *la, struct gdbarch *gdbarch) { - struct language_gdbarch *ld = gdbarch_data (gdbarch, - language_gdbarch_data); + struct language_gdbarch *ld + = (struct language_gdbarch *) gdbarch_data (gdbarch, language_gdbarch_data); if (ld->arch_info[la->la_language].bool_type_symbol) { @@ -1028,8 +1026,8 @@ language_lookup_primitive_type (const struct language_defn *la, struct gdbarch *gdbarch, const char *name) { - struct language_gdbarch *ld = gdbarch_data (gdbarch, - language_gdbarch_data); + struct language_gdbarch *ld = + (struct language_gdbarch *) gdbarch_data (gdbarch, language_gdbarch_data); struct type **typep; typep = language_lookup_primitive_type_1 (&ld->arch_info[la->la_language], @@ -1073,9 +1071,6 @@ language_init_primitive_type_symbols (struct language_arch_info *lai, struct gdbarch *gdbarch) { int n; - struct compunit_symtab *cust; - struct symtab *symtab; - struct block *static_block, *global_block; gdb_assert (lai->primitive_type_vector != NULL); @@ -1105,8 +1100,8 @@ language_lookup_primitive_type_as_symbol (const struct language_defn *la, struct gdbarch *gdbarch, const char *name) { - struct language_gdbarch *ld = gdbarch_data (gdbarch, - language_gdbarch_data); + struct language_gdbarch *ld + = (struct language_gdbarch *) gdbarch_data (gdbarch, language_gdbarch_data); struct language_arch_info *lai = &ld->arch_info[la->la_language]; struct type **typep; struct symbol *sym; @@ -1183,9 +1178,7 @@ For Fortran the default is off; for other languages the default is on."), show_case_command, &setlist, &showlist); - add_language (&auto_language_defn); - add_language (&local_language_defn); - add_language (&unknown_language_defn); + add_set_language_command (); language = xstrdup ("auto"); type = xstrdup ("auto");