aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog48
-rw-r--r--gdb/ada-lang.c4
-rw-r--r--gdb/c-lang.c19
-rw-r--r--gdb/completer.c8
-rw-r--r--gdb/d-lang.c4
-rw-r--r--gdb/defs.h3
-rw-r--r--gdb/f-lang.c4
-rw-r--r--gdb/go-lang.c4
-rw-r--r--gdb/language.c248
-rw-r--r--gdb/language.h23
-rw-r--r--gdb/m2-lang.c4
-rw-r--r--gdb/objc-lang.c3
-rw-r--r--gdb/opencl-lang.c3
-rw-r--r--gdb/p-lang.c11
-rw-r--r--gdb/rust-lang.c10
-rw-r--r--gdb/testsuite/ChangeLog4
-rw-r--r--gdb/testsuite/gdb.base/default.exp2
-rw-r--r--gdb/utils.h8
18 files changed, 184 insertions, 226 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a9ae09f8c88..62f3bfb35d8 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,53 @@
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.
(get_var_value): Constify parameters.
(get_int_var_value): Change prototype.
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 1dd30b734b3..280247bc2d7 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -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,
diff --git a/gdb/c-lang.c b/gdb/c-lang.c
index 695b2371d04..f86e26ed5f7 100644
--- a/gdb/c-lang.c
+++ b/gdb/c-lang.c
@@ -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);
-}
diff --git a/gdb/completer.c b/gdb/completer.c
index ba2e8601a52..a029263746a 100644
--- a/gdb/completer.c
+++ b/gdb/completer.c
@@ -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
diff --git a/gdb/d-lang.c b/gdb/d-lang.c
index 74cceaaefb1..941d3ed4c53 100644
--- a/gdb/d-lang.c
+++ b/gdb/d-lang.c
@@ -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);
}
diff --git a/gdb/defs.h b/gdb/defs.h
index 55d16d14b4d..e180523a97c 100644
--- a/gdb/defs.h
+++ b/gdb/defs.h
@@ -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
{
diff --git a/gdb/f-lang.c b/gdb/f-lang.c
index 937ebff31d5..903cfd169e2 100644
--- a/gdb/f-lang.c
+++ b/gdb/f-lang.c
@@ -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);
}
diff --git a/gdb/go-lang.c b/gdb/go-lang.c
index f3b4f5cf1cf..60bb3c55472 100644
--- a/gdb/go-lang.c
+++ b/gdb/go-lang.c
@@ -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);
}
diff --git a/gdb/language.c b/gdb/language.c
index d30f4f0b538..073039e3266 100644
--- a/gdb/language.c
+++ b/gdb/language.c
@@ -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;
}
@@ -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, "");
}
-/* 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
-};
/* 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");
diff --git a/gdb/language.h b/gdb/language.h
index 75b9438881d..f4852c12279 100644
--- a/gdb/language.h
+++ b/gdb/language.h
@@ -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) */
diff --git a/gdb/m2-lang.c b/gdb/m2-lang.c
index 0035a52e20d..b9ab2b3c729 100644
--- a/gdb/m2-lang.c
+++ b/gdb/m2-lang.c
@@ -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);
}
diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c
index af272681dde..6ffe85ea22f 100644
--- a/gdb/objc-lang.c
+++ b/gdb/objc-lang.c
@@ -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. */
diff --git a/gdb/opencl-lang.c b/gdb/opencl-lang.c
index 116d107aca1..9b0f015752a 100644
--- a/gdb/opencl-lang.c
+++ b/gdb/opencl-lang.c
@@ -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);
}
diff --git a/gdb/p-lang.c b/gdb/p-lang.c
index 77913fc2906..439a3772cbf 100644
--- a/gdb/p-lang.c
+++ b/gdb/p-lang.c
@@ -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);
-}
diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c
index ef41f56b4d8..817976ab33a 100644
--- a/gdb/rust-lang.c
+++ b/gdb/rust-lang.c
@@ -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);
-}
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index ac68fba1bfc..eef141d14e2 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,9 @@
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 ...
(test_minsym): ... this, and make static.
(get_pck__foo__bar__minsym): Rename to ...
diff --git a/gdb/testsuite/gdb.base/default.exp b/gdb/testsuite/gdb.base/default.exp
index 8c0b29cb27b..c25069a86e1 100644
--- a/gdb/testsuite/gdb.base/default.exp
+++ b/gdb/testsuite/gdb.base/default.exp
@@ -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
diff --git a/gdb/utils.h b/gdb/utils.h
index 6df752fd00a..48330a16f7f 100644
--- a/gdb/utils.h
+++ b/gdb/utils.h
@@ -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