Handle multiple target events before commit resume
[deliverable/binutils-gdb.git] / gdb / language.c
index cacaf3f7d1dc79a26131fc01a52d8d2755de454b..a34418f63abd8a34e0be5c6d131c6f7b0204cd92 100644 (file)
@@ -1,6 +1,6 @@
 /* Multiple source language support for GDB.
 
-   Copyright (C) 1991-2018 Free Software Foundation, Inc.
+   Copyright (C) 1991-2020 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 <algorithm>
-
-static void unk_lang_error (const char *);
+#include "gdbarch.h"
 
 static int unk_lang_parser (struct parser_state *);
 
@@ -107,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.");
 \f
 /* This page contains the functions corresponding to GDB commands
    and their helpers.  */
@@ -149,7 +146,7 @@ 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));
     }
 }
 
@@ -175,18 +172,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 +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)
     {
@@ -574,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]),
@@ -627,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,
@@ -692,13 +690,6 @@ 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)
-{
-  error (_("Getting a string is unsupported in this language."));
-}
-
 /* See language.h.  */
 
 bool
@@ -726,10 +717,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 +755,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)
@@ -845,7 +851,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,
@@ -857,6 +862,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 */
@@ -871,7 +877,6 @@ 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_matcher */
   iterate_over_symbols,
@@ -879,7 +884,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"
@@ -896,7 +902,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,
@@ -908,6 +913,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 */
@@ -922,7 +928,6 @@ 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_matcher */
   iterate_over_symbols,
@@ -930,7 +935,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 */
 };
 
 \f
@@ -1042,10 +1048,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->name = TYPE_NAME (type);
+  symbol->language = lang;
   symbol->owner.arch = gdbarch;
   SYMBOL_OBJFILE_OWNED (symbol) = 0;
   SYMBOL_TYPE (symbol) = type;
@@ -1156,16 +1162,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,
@@ -1173,10 +1179,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);
This page took 0.027102 seconds and 4 git commands to generate.