Fix paste-o in examine-backward.exp.
[external/binutils.git] / gdb / language.c
index c05b703..e95084f 100644 (file)
@@ -1,6 +1,6 @@
 /* Multiple source language support for GDB.
 
 /* 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.
 
    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 <algorithm>
 #include "frame.h"
 #include "c-lang.h"
 #include <algorithm>
-
-static void unk_lang_error (const char *);
+#include "gdbarch.h"
 
 static int unk_lang_parser (struct parser_state *);
 
 
 static int unk_lang_parser (struct parser_state *);
 
@@ -107,10 +106,9 @@ static const struct language_defn *languages[] = {
   &ada_language_defn,
 };
 
   &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;
    commands.  */
 static const char *language;
-static const char *type;
 static const char *range;
 static const char *case_sensitive;
 
 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;
              /* 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);
                }
                {
                  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;
                }
                {
                  flang = language_unknown;
                }
-             END_CATCH
 
              if (flang != language_unknown)
                set_language (flang);
 
              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 "
 
   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)
     {
 
   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.  */
 
       /* 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]),
                  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;
 }
 
   return NULL;
 }
 
-/* See langauge.h.  */
+/* See language.h.  */
 
 int
 language_sniff_from_mangled_name (const struct language_defn *lang,
 
 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
 }
 
 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<gdb_byte> *buffer,
+                   int *length, struct type **char_type, const char **charset)
 {
   error (_("Getting a string is unsupported in this language."));
 }
 {
   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_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 (),
   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);
     {
       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.  */
 
 
 /* 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 *
 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;
   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
 }
 
 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)
 {
 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,
   NULL,
   &exp_descriptor_standard,
   unk_lang_parser,
-  unk_lang_error,
   null_post_parser,
   unk_lang_printchar,          /* Print character constant */
   unk_lang_printstr,
   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 */
   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 */
   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,
   &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"
 };
 
 /* 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,
   NULL,
   &exp_descriptor_standard,
   unk_lang_parser,
-  unk_lang_error,
   null_post_parser,
   unk_lang_printchar,          /* Print character constant */
   unk_lang_printstr,
   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 */
   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 */
   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,
   &default_varobj_ops,
   NULL,
   NULL,
-  LANG_MAGIC
+  default_is_string_type_p,
+  "{...}"                      /* la_struct_too_deep_ellipsis */
 };
 
 \f
 };
 
 \f
@@ -1155,16 +1173,16 @@ _initialize_language (void)
 
   add_setshow_enum_cmd ("range", class_support, type_or_range_names,
                        &range,
 
   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, _("\
                        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,
 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 ();
 
 
   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);
 
   /* Have the above take effect.  */
   set_language (language_auto);