Use a member function to set a symbol's language
[deliverable/binutils-gdb.git] / gdb / language.c
index ea294e670b66df77157291adffd400184b39d7c9..76efc497379bf479aba7abdeeed1137ba3c95189 100644 (file)
@@ -45,6 +45,7 @@
 #include "frame.h"
 #include "c-lang.h"
 #include <algorithm>
+#include "gdbarch.h"
 
 static int unk_lang_parser (struct parser_state *);
 
@@ -111,10 +112,9 @@ static const char *language;
 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.  */
@@ -146,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));
     }
 }
 
@@ -172,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);
@@ -560,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)
     {
@@ -571,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]),
@@ -624,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,
@@ -689,14 +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::unique_xmalloc_ptr<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
@@ -724,6 +717,20 @@ 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 *
 get_symbol_name_matcher (const language_defn *lang,
                         const lookup_name_info &lookup_name)
@@ -870,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,
@@ -878,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"
@@ -921,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,
@@ -929,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
@@ -1041,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->set_language (lang, nullptr);
   symbol->owner.arch = gdbarch;
   SYMBOL_OBJFILE_OWNED (symbol) = 0;
   SYMBOL_TYPE (symbol) = type;
@@ -1155,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,
This page took 0.025695 seconds and 4 git commands to generate.