Make language_def O(1)
authorPedro Alves <palves@redhat.com>
Thu, 20 Jul 2017 17:28:01 +0000 (18:28 +0100)
committerPedro Alves <palves@redhat.com>
Thu, 20 Jul 2017 17:28:01 +0000 (18:28 +0100)
Profiling GDB with the rest of series applied, I saw calls to
language_def showing up high in some runs.  The problem is that
language_def is O(N) currently, since walk the languages vector each
time to find the matching language_defn.

IMO, the add_language mechanism is pointless, because "enum language"
implies the core of GDB needs to know about all languages anyway.  So
simply make the languages vector array be an array where each
element's index is the corresponding enum language enumerator.  Note
that "local_language_defn" is gone along the way.  It's just a copy of
"auto", so the new code simply maps one to the other.  One fewer place
to update when we need to change the language vector...

Also, a while ago the output of "set language" was made out of order
as side effect of some other change.  While I was at it, I made them
sorted again.

gdb/ChangeLog:
2017-07-20  Pedro Alves  <palves@redhat.com>

* ada-lang.c (ada_language_defn): Make extern.
(_initialize_ada_language): Remove add_language call.
* c-lang.c (c_language_defn, cplus_language_defn)
(asm_language_defn, minimal_language_defn): Make extern.
(_initialize_c_language): Delete.
* completer.c (compare_cstrings): Delete, moved to utils.h.
* d-lang.c (d_language_defn): Make extern.
(_initialize_d_language): Remove add_language calls.
* defs.h (enum language): Add comment.
* f-lang.c (f_language_defn): Make extern.
(_initialize_f_language): Remove add_language call.
* go-lang.c (go_language_defn): Make extern.
(_initialize_go_language): Remove add_language call.
* language.c: Include <algorithm>.
(languages): Redefine as const array.
(languages_size, languages_allocsize, DEFAULT_ALLOCSIZE): Delete.
(set_language_command): Handle "local".  Use for-range loop.
(set_language): Remove loop.
(language_enum): Rewrite.
(language_def, language_str): Remove loops.
(add_language): Delete.
(add_set_language_command): New, based on add_languages.
(skip_language_trampoline): Adjust.
(local_language_defn): Delete.
(language_gdbarch_post_init): Adjust.
(_initialize_language): Remove add_language calls.  Call
add_set_language_command.
* language.h (add_language): Delete.
(auto_language_defn)
(unknown_language_defn, minimal_language_defn, ada_language_defn)
(asm_language_defn, c_language_defn, cplus_language_defn)
(d_language_defn, f_language_defn, go_language_defn)
(m2_language_defn, objc_language_defn, opencl_language_defn)
(pascal_language_defn, rust_language_defn): Declare.
* m2-lang.c (m2_language_defn): Make extern.
(_initialize_m2_language): Remove add_language call.
* objc-lang.c (objc_language_defn): Make extern.
(_initialize_objc_language): Remove add_language call.
* opencl-lang.c (opencl_language_defn): Make extern.
(_initialize_opencl_language): Remove add_language call.
* p-lang.c (pascal_language_defn): Make extern.
(_initialize_pascal_language): Delete.
* rust-lang.c (rust_language_defn): Make extern.
(_initialize_rust_language): Delete.
* utils.h (compare_cstrings): New static inline function.

gdb/testsuite/ChangeLog:
2017-07-20  Pedro Alves  <palves@redhat.com>

* gdb.base/default.exp (set language): Adjust expected output.

18 files changed:
gdb/ChangeLog
gdb/ada-lang.c
gdb/c-lang.c
gdb/completer.c
gdb/d-lang.c
gdb/defs.h
gdb/f-lang.c
gdb/go-lang.c
gdb/language.c
gdb/language.h
gdb/m2-lang.c
gdb/objc-lang.c
gdb/opencl-lang.c
gdb/p-lang.c
gdb/rust-lang.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/default.exp
gdb/utils.h

index a9ae09f8c88f30a992192a6b29db71de377c9d58..62f3bfb35d804bf7d394e242cacc55ef894ddaeb 100644 (file)
@@ -1,3 +1,51 @@
+2017-07-20  Pedro Alves  <palves@redhat.com>
+
+       * ada-lang.c (ada_language_defn): Make extern.
+       (_initialize_ada_language): Remove add_language call.
+       * c-lang.c (c_language_defn, cplus_language_defn)
+       (asm_language_defn, minimal_language_defn): Make extern.
+       (_initialize_c_language): Delete.
+       * completer.c (compare_cstrings): Delete, moved to utils.h.
+       * d-lang.c (d_language_defn): Make extern.
+       (_initialize_d_language): Remove add_language calls.
+       * defs.h (enum language): Add comment.
+       * f-lang.c (f_language_defn): Make extern.
+       (_initialize_f_language): Remove add_language call.
+       * go-lang.c (go_language_defn): Make extern.
+       (_initialize_go_language): Remove add_language call.
+       * language.c: Include <algorithm>.
+       (languages): Redefine as const array.
+       (languages_size, languages_allocsize, DEFAULT_ALLOCSIZE): Delete.
+       (set_language_command): Handle "local".  Use for-range loop.
+       (set_language): Remove loop.
+       (language_enum): Rewrite.
+       (language_def, language_str): Remove loops.
+       (add_language): Delete.
+       (add_set_language_command): New, based on add_languages.
+       (skip_language_trampoline): Adjust.
+       (local_language_defn): Delete.
+       (language_gdbarch_post_init): Adjust.
+       (_initialize_language): Remove add_language calls.  Call
+       add_set_language_command.
+       * language.h (add_language): Delete.
+       (auto_language_defn)
+       (unknown_language_defn, minimal_language_defn, ada_language_defn)
+       (asm_language_defn, c_language_defn, cplus_language_defn)
+       (d_language_defn, f_language_defn, go_language_defn)
+       (m2_language_defn, objc_language_defn, opencl_language_defn)
+       (pascal_language_defn, rust_language_defn): Declare.
+       * m2-lang.c (m2_language_defn): Make extern.
+       (_initialize_m2_language): Remove add_language call.
+       * objc-lang.c (objc_language_defn): Make extern.
+       (_initialize_objc_language): Remove add_language call.
+       * opencl-lang.c (opencl_language_defn): Make extern.
+       (_initialize_opencl_language): Remove add_language call.
+       * p-lang.c (pascal_language_defn): Make extern.
+       (_initialize_pascal_language): Delete.
+       * rust-lang.c (rust_language_defn): Make extern.
+       (_initialize_rust_language): Delete.
+       * utils.h (compare_cstrings): New static inline function.
+
 2017-07-20  Pedro Alves  <palves@redhat.com>
 
        * ada-lang.c (ada_to_fixed_type_1): Adjust.
index 1dd30b734b3b3a720c4dfbdf2daca4c3ee8ae537..280247bc2d78d4424c0316d2b9f171ab765bd95b 100644 (file)
@@ -13960,7 +13960,7 @@ static const char *ada_extensions[] =
   ".adb", ".ads", ".a", ".ada", ".dg", NULL
 };
 
-const struct language_defn ada_language_defn = {
+extern const struct language_defn ada_language_defn = {
   "ada",                        /* Language name */
   "Ada",
   language_ada,
@@ -14090,8 +14090,6 @@ ada_free_objfile_observer (struct objfile *objfile)
 void
 _initialize_ada_language (void)
 {
-  add_language (&ada_language_defn);
-
   initialize_ada_catchpoint_ops ();
 
   add_prefix_cmd ("ada", no_class, set_ada_command,
index 695b2371d046178b3e207700d8ddd92b1002c0ff..f86e26ed5f7eae1b43bf81ba3de84c3e231cf5e1 100644 (file)
@@ -35,8 +35,6 @@
 #include <ctype.h>
 #include "gdbcore.h"
 
-extern void _initialize_c_language (void);
-
 /* Given a C string type, STR_TYPE, return the corresponding target
    character set name.  */
 
@@ -831,7 +829,7 @@ static const char *c_extensions[] =
   ".c", NULL
 };
 
-const struct language_defn c_language_defn =
+extern const struct language_defn c_language_defn =
 {
   "c",                         /* Language name */
   "C",
@@ -975,7 +973,7 @@ static const char *cplus_extensions[] =
   ".C", ".cc", ".cp", ".cpp", ".cxx", ".c++", NULL
 };
 
-const struct language_defn cplus_language_defn =
+extern const struct language_defn cplus_language_defn =
 {
   "c++",                       /* Language name */
   "C++",
@@ -1028,7 +1026,7 @@ static const char *asm_extensions[] =
   ".s", ".sx", ".S", NULL
 };
 
-const struct language_defn asm_language_defn =
+extern const struct language_defn asm_language_defn =
 {
   "asm",                       /* Language name */
   "assembly",
@@ -1081,7 +1079,7 @@ const struct language_defn asm_language_defn =
    to do some simple operations when debugging applications that use
    a language currently not supported by GDB.  */
 
-const struct language_defn minimal_language_defn =
+extern const struct language_defn minimal_language_defn =
 {
   "minimal",                   /* Language name */
   "Minimal",
@@ -1128,12 +1126,3 @@ const struct language_defn minimal_language_defn =
   NULL,
   LANG_MAGIC
 };
-
-void
-_initialize_c_language (void)
-{
-  add_language (&c_language_defn);
-  add_language (&cplus_language_defn);
-  add_language (&asm_language_defn);
-  add_language (&minimal_language_defn);
-}
index ba2e8601a527f5a434639870ccae9530dd33629d..a029263746a6fda490b3f29ff3f6b61d0984e62e 100644 (file)
@@ -2026,14 +2026,6 @@ completion_result::release_match_list ()
   return ret;
 }
 
-/* Compare C strings for std::sort.  */
-
-static bool
-compare_cstrings (const char *str1, const char *str2)
-{
-  return strcmp (str1, str2) < 0;
-}
-
 /* See completer.h  */
 
 void
index 74cceaaefb1ee92431ddbaa065c35e4c6c438693..941d3ed4c539808b34bb250486c1705959d2159b 100644 (file)
@@ -204,7 +204,7 @@ static const char *d_extensions[] =
   ".d", NULL
 };
 
-static const struct language_defn d_language_defn =
+extern const struct language_defn d_language_defn =
 {
   "d",
   "D",
@@ -349,6 +349,4 @@ void
 _initialize_d_language (void)
 {
   d_type_data = gdbarch_data_register_post_init (build_d_types);
-
-  add_language (&d_language_defn);
 }
index 55d16d14b4da8e8b719bc18136a31e8b46f43e72..e180523a97cba8548624a3eff6a4304dba16ab29 100644 (file)
@@ -203,7 +203,8 @@ extern void quit_serial_event_clear (void);
    several languages.  For that reason, the constants here are sorted
    in the order we'll attempt demangling them.  For example: Rust uses
    C++ mangling, so must come after C++; Ada must come last (see
-   ada_sniff_from_mangled_name).  */
+   ada_sniff_from_mangled_name).  (Keep this order in sync with the
+   'languages' array in language.c.)  */
 
 enum language
   {
index 937ebff31d5d968425ac0a0224b212ceedcad76f..903cfd169e23d9fe684d70a60806d08254b04a7f 100644 (file)
@@ -245,7 +245,7 @@ static const char *f_extensions[] =
   NULL
 };
 
-const struct language_defn f_language_defn =
+extern const struct language_defn f_language_defn =
 {
   "fortran",
   "Fortran",
@@ -369,6 +369,4 @@ void
 _initialize_f_language (void)
 {
   f_type_data = gdbarch_data_register_post_init (build_fortran_types);
-
-  add_language (&f_language_defn);
 }
index f3b4f5cf1cf3c36e40b088b718eaa8da6a20d40d..60bb3c55472804f3349b551c60f364b9dc63c0d1 100644 (file)
@@ -565,7 +565,7 @@ go_language_arch_info (struct gdbarch *gdbarch,
   lai->bool_type_default = builtin->builtin_bool;
 }
 
-static const struct language_defn go_language_defn =
+extern const struct language_defn go_language_defn =
 {
   "go",
   "Go",
@@ -676,6 +676,4 @@ void
 _initialize_go_language (void)
 {
   go_type_data = gdbarch_data_register_post_init (build_go_types);
-
-  add_language (&go_language_defn);
 }
index d30f4f0b53872f2eedc9314545c40f78d22a96a4..073039e32666803587ad16895105bed1b59a27f3 100644 (file)
@@ -44,6 +44,7 @@
 #include "cp-support.h"
 #include "frame.h"
 #include "c-lang.h"
+#include <algorithm>
 
 extern void _initialize_language (void);
 
@@ -91,12 +92,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.  */
@@ -148,16 +163,19 @@ show_language_command (struct ui_file *file, int from_tty,
 static void
 set_language_command (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.  */
@@ -186,7 +204,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;
@@ -364,21 +382,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;
 }
 \f
@@ -474,11 +482,12 @@ range_error (const char *string,...)
 enum language
 language_enum (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,32 +497,15 @@ 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
@@ -530,55 +522,45 @@ show_check (char *ignore, int from_tty)
   cmd_show_list (showchecklist, from_tty, "");
 }
 \f
-/* 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.  */
+/* 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 = XNEWVEC (const struct language_defn *, languages_allocsize);
-    }
-  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 = XRESIZEVEC (const char *, language_names,
-                              languages_size + 1);
-
-  for (int i = 0; i < languages_size; ++i)
-    language_names[i] = languages[i]->la_name;
-  language_names[languages_size] = NULL;
+  *language_names_p = NULL;
+  std::sort (sort_begin, language_names_p, compare_cstrings);
 
   /* Add the filename extensions.  */
-  if (lang->la_filename_extensions != NULL)
-    {
-      int i;
-
-      for (i = 0; lang->la_filename_extensions[i] != NULL; ++i)
-       add_filename_language (lang->la_filename_extensions[i],
-                              lang->la_language);
-    }
+  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.  */
   string_file doc;
@@ -587,24 +569,24 @@ add_language (const struct language_defn *lang)
                "The currently understood settings are:\n\nlocal or "
                "auto    Automatic setting based on source file\n"));
 
-  for (int 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.  */
       doc.printf ("%-16s Use the %c%s language\n",
-                 languages[i]->la_name,
+                 lang->la_name,
                  /* Capitalize first letter of language name.  */
-                 toupper (languages[i]->la_name[0]),
-                 languages[i]->la_name + 1);
+                 toupper (lang->la_name[0]),
+                 lang->la_name + 1);
     }
 
   add_setshow_enum_cmd ("language", class_support,
-                       (const char **) language_names,
+                       language_names,
                        &language,
                        doc.c_str (),
                        _("Show the current source language."),
@@ -620,13 +602,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;
@@ -919,53 +899,6 @@ const struct language_defn auto_language_defn =
   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,
-  NULL,
-  &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 */
-  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_collect_symbol_completion_matches,
-  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_cmp */
-  iterate_over_symbols,
-  &default_varobj_ops,
-  NULL,
-  NULL,
-  LANG_MAGIC
-};
 \f
 /* Per-architecture language information.  */
 
@@ -982,16 +915,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;
 }
 
@@ -1205,9 +1137,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");
index 75b9438881de35c9e42a7013ef6b642df21af7da..f4852c1227986df40cd398e1bc3e264fb4624db9 100644 (file)
@@ -568,10 +568,6 @@ extern const struct language_defn *language_def (enum language);
 
 extern const char *language_str (enum language);
 
-/* Add a language to the set known by GDB (at initialization time).  */
-
-extern void add_language (const struct language_defn *);
-
 /* Check for a language-specific trampoline.  */
 
 extern CORE_ADDR skip_language_trampoline (struct frame_info *, CORE_ADDR pc);
@@ -618,4 +614,23 @@ void default_get_string (struct value *value, gdb_byte **buffer, int *length,
 void c_get_string (struct value *value, gdb_byte **buffer, int *length,
                   struct type **char_type, const char **charset);
 
+/* The languages supported by GDB.  */
+
+extern const struct language_defn auto_language_defn;
+extern const struct language_defn unknown_language_defn;
+extern const struct language_defn minimal_language_defn;
+
+extern const struct language_defn ada_language_defn;
+extern const struct language_defn asm_language_defn;
+extern const struct language_defn c_language_defn;
+extern const struct language_defn cplus_language_defn;
+extern const struct language_defn d_language_defn;
+extern const struct language_defn f_language_defn;
+extern const struct language_defn go_language_defn;
+extern const struct language_defn m2_language_defn;
+extern const struct language_defn objc_language_defn;
+extern const struct language_defn opencl_language_defn;
+extern const struct language_defn pascal_language_defn;
+extern const struct language_defn rust_language_defn;
+
 #endif /* defined (LANGUAGE_H) */
index 0035a52e20d4c25cbf821f95e9066f0a1b2c2107..b9ab2b3c729724e7b4bbd896945f3b78018cd21f 100644 (file)
@@ -354,7 +354,7 @@ const struct exp_descriptor exp_descriptor_modula2 =
   evaluate_subexp_modula2
 };
 
-const struct language_defn m2_language_defn =
+extern const struct language_defn m2_language_defn =
 {
   "modula-2",
   "Modula-2",
@@ -439,6 +439,4 @@ void
 _initialize_m2_language (void)
 {
   m2_type_data = gdbarch_data_register_post_init (build_m2_types);
-
-  add_language (&m2_language_defn);
 }
index af272681dde59b02a115c4a902a0c0a6083b56bd..6ffe85ea22f3d4e0f0cc93700b3144161fd517c9 100644 (file)
@@ -364,7 +364,7 @@ static const char *objc_extensions[] =
   ".m", NULL
 };
 
-const struct language_defn objc_language_defn = {
+extern const struct language_defn objc_language_defn = {
   "objective-c",               /* Language name */
   "Objective-C",
   language_objc,
@@ -1377,7 +1377,6 @@ extern initialize_file_ftype _initialize_objc_language;
 void
 _initialize_objc_language (void)
 {
-  add_language (&objc_language_defn);
   add_info ("selectors", selectors_info,    /* INFO SELECTORS command.  */
            _("All Objective-C selectors, or those matching REGEXP."));
   add_info ("classes", classes_info,       /* INFO CLASSES   command.  */
index 116d107aca158bd338b8dfadb37f7bd14ef0f823..9b0f015752a4af9e4065a56e01cc43699a367e52 100644 (file)
@@ -1043,7 +1043,7 @@ const struct exp_descriptor exp_descriptor_opencl =
   evaluate_subexp_opencl
 };
 
-const struct language_defn opencl_language_defn =
+extern const struct language_defn opencl_language_defn =
 {
   "opencl",                    /* Language name */
   "OpenCL C",
@@ -1185,5 +1185,4 @@ void
 _initialize_opencl_language (void)
 {
   opencl_type_data = gdbarch_data_register_post_init (build_opencl_types);
-  add_language (&opencl_language_defn);
 }
index 77913fc290614f2970c01ecff124eef8e01bb371..439a3772cbff6553c8a04831c3b0636e35ce056e 100644 (file)
@@ -32,9 +32,6 @@
 #include <ctype.h>
 #include "c-lang.h"
 
-extern void _initialize_pascal_language (void);
-
-
 /* All GPC versions until now (2007-09-27) also define a symbol called
    '_p_initialize'.  Check for the presence of this symbol first.  */
 static const char GPC_P_INITIALIZE[] = "_p_initialize";
@@ -418,7 +415,7 @@ static const char *p_extensions[] =
   ".pas", ".p", ".pp", NULL
 };
 
-const struct language_defn pascal_language_defn =
+extern const struct language_defn pascal_language_defn =
 {
   "pascal",                    /* Language name */
   "Pascal",
@@ -464,9 +461,3 @@ const struct language_defn pascal_language_defn =
   NULL,
   LANG_MAGIC
 };
-
-void
-_initialize_pascal_language (void)
-{
-  add_language (&pascal_language_defn);
-}
index ef41f56b4d8ddee78c7cec3c06b07abd2e4d74ee..817976ab33a7a40dd445bef24a26b105de8f637b 100644 (file)
@@ -35,8 +35,6 @@
 #include <string>
 #include <vector>
 
-extern initialize_file_ftype _initialize_rust_language;
-
 /* Returns the last segment of a Rust path like foo::bar::baz.  Will
    not handle cases where the last segment contains generics.  This
    will return NULL if the last segment cannot be found.  */
@@ -2150,7 +2148,7 @@ static const char *rust_extensions[] =
   ".rs", NULL
 };
 
-static const struct language_defn rust_language_defn =
+extern const struct language_defn rust_language_defn =
 {
   "rust",
   "Rust",
@@ -2197,9 +2195,3 @@ static const struct language_defn rust_language_defn =
   NULL,
   LANG_MAGIC
 };
-
-void
-_initialize_rust_language (void)
-{
-  add_language (&rust_language_defn);
-}
index ac68fba1bfc999506199532c63636c2183630339..eef141d14e2e9b1a0c01c0e1234003cf4de6db1d 100644 (file)
@@ -1,3 +1,7 @@
+2017-07-20  Pedro Alves  <palves@redhat.com>
+
+       * gdb.base/default.exp (set language): Adjust expected output.
+
 2017-07-20  Pedro Alves  <palves@redhat.com>
 
        * gdb.base/dmsym.c (pck__foo__bar__minsym): Rename to ...
index 8c0b29cb27b64956caf650ec978a568565344189..c25069a86e16179a836173c5882cfe9285f7074a 100644 (file)
@@ -511,7 +511,7 @@ gdb_test "set history size" "Argument required .integer to set it to.*" "set his
 #test set history
 gdb_test "set history" "\"set history\" must be followed by the name of a history subcommand.(\[^\r\n\]*\[\r\n\])+List of set history subcommands:(\[^\r\n\]*\[\r\n\])+set history expansion -- Set history expansion on command input(\[^\r\n\]*\[\r\n\])+set history filename -- Set the filename in which to record the command history(\[^\r\n\]*\[\r\n\])+set history save -- Set saving of the history record on exit(\[^\r\n\]*\[\r\n\])+set history size -- Set the size of the command history(\[^\r\n\]*\[\r\n\])+Type \"help set history\" followed by set history subcommand name for full documentation.(\[^\r\n\]*\[\r\n\])+Command name abbreviations are allowed if unambiguous." "set history"
 #test set language
-gdb_test "set language" "Requires an argument. Valid arguments are ada, c, c.., asm, minimal, d, fortran, go, auto, local, unknown, modula-2, objective-c, opencl, pascal, rust." "set language"
+gdb_test "set language" "Requires an argument. Valid arguments are auto, local, unknown, ada, asm, c, c.., d, fortran, go, minimal, modula-2, objective-c, opencl, pascal, rust." "set language"
 #test set listsize
 gdb_test "set listsize" "Argument required .integer to set it to.*" "set listsize"
 #test set print "p" abbreviation
index 6df752fd00a3f37e6b3dd97659e5076b986ead39..48330a16f7fb3456950328573d3a433cc72088d9 100644 (file)
@@ -59,6 +59,14 @@ extern int subset_compare (const char *, const char *);
 int compare_positive_ints (const void *ap, const void *bp);
 int compare_strings (const void *ap, const void *bp);
 
+/* Compare C strings for std::sort.  */
+
+static inline bool
+compare_cstrings (const char *str1, const char *str2)
+{
+  return strcmp (str1, str2) < 0;
+}
+
 /* A wrapper for bfd_errmsg to produce a more helpful error message
    in the case of bfd_error_file_ambiguously recognized.
    MATCHING, if non-NULL, is the corresponding argument to
This page took 0.046178 seconds and 4 git commands to generate.