Make language_def O(1)
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.
This commit is contained in:
parent
edb0c9cb22
commit
47e77640be
18 changed files with 183 additions and 225 deletions
|
@ -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>
|
2017-07-20 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
* ada-lang.c (ada_to_fixed_type_1): Adjust.
|
* ada-lang.c (ada_to_fixed_type_1): Adjust.
|
||||||
|
|
|
@ -13960,7 +13960,7 @@ static const char *ada_extensions[] =
|
||||||
".adb", ".ads", ".a", ".ada", ".dg", NULL
|
".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 name */
|
||||||
"Ada",
|
"Ada",
|
||||||
language_ada,
|
language_ada,
|
||||||
|
@ -14090,8 +14090,6 @@ ada_free_objfile_observer (struct objfile *objfile)
|
||||||
void
|
void
|
||||||
_initialize_ada_language (void)
|
_initialize_ada_language (void)
|
||||||
{
|
{
|
||||||
add_language (&ada_language_defn);
|
|
||||||
|
|
||||||
initialize_ada_catchpoint_ops ();
|
initialize_ada_catchpoint_ops ();
|
||||||
|
|
||||||
add_prefix_cmd ("ada", no_class, set_ada_command,
|
add_prefix_cmd ("ada", no_class, set_ada_command,
|
||||||
|
|
19
gdb/c-lang.c
19
gdb/c-lang.c
|
@ -35,8 +35,6 @@
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include "gdbcore.h"
|
#include "gdbcore.h"
|
||||||
|
|
||||||
extern void _initialize_c_language (void);
|
|
||||||
|
|
||||||
/* Given a C string type, STR_TYPE, return the corresponding target
|
/* Given a C string type, STR_TYPE, return the corresponding target
|
||||||
character set name. */
|
character set name. */
|
||||||
|
|
||||||
|
@ -831,7 +829,7 @@ static const char *c_extensions[] =
|
||||||
".c", NULL
|
".c", NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct language_defn c_language_defn =
|
extern const struct language_defn c_language_defn =
|
||||||
{
|
{
|
||||||
"c", /* Language name */
|
"c", /* Language name */
|
||||||
"C",
|
"C",
|
||||||
|
@ -975,7 +973,7 @@ static const char *cplus_extensions[] =
|
||||||
".C", ".cc", ".cp", ".cpp", ".cxx", ".c++", NULL
|
".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++", /* Language name */
|
||||||
"C++",
|
"C++",
|
||||||
|
@ -1028,7 +1026,7 @@ static const char *asm_extensions[] =
|
||||||
".s", ".sx", ".S", NULL
|
".s", ".sx", ".S", NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct language_defn asm_language_defn =
|
extern const struct language_defn asm_language_defn =
|
||||||
{
|
{
|
||||||
"asm", /* Language name */
|
"asm", /* Language name */
|
||||||
"assembly",
|
"assembly",
|
||||||
|
@ -1081,7 +1079,7 @@ const struct language_defn asm_language_defn =
|
||||||
to do some simple operations when debugging applications that use
|
to do some simple operations when debugging applications that use
|
||||||
a language currently not supported by GDB. */
|
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", /* Language name */
|
||||||
"Minimal",
|
"Minimal",
|
||||||
|
@ -1128,12 +1126,3 @@ const struct language_defn minimal_language_defn =
|
||||||
NULL,
|
NULL,
|
||||||
LANG_MAGIC
|
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);
|
|
||||||
}
|
|
||||||
|
|
|
@ -2026,14 +2026,6 @@ completion_result::release_match_list ()
|
||||||
return ret;
|
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 */
|
/* See completer.h */
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -204,7 +204,7 @@ static const char *d_extensions[] =
|
||||||
".d", NULL
|
".d", NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct language_defn d_language_defn =
|
extern const struct language_defn d_language_defn =
|
||||||
{
|
{
|
||||||
"d",
|
"d",
|
||||||
"D",
|
"D",
|
||||||
|
@ -349,6 +349,4 @@ void
|
||||||
_initialize_d_language (void)
|
_initialize_d_language (void)
|
||||||
{
|
{
|
||||||
d_type_data = gdbarch_data_register_post_init (build_d_types);
|
d_type_data = gdbarch_data_register_post_init (build_d_types);
|
||||||
|
|
||||||
add_language (&d_language_defn);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -203,7 +203,8 @@ extern void quit_serial_event_clear (void);
|
||||||
several languages. For that reason, the constants here are sorted
|
several languages. For that reason, the constants here are sorted
|
||||||
in the order we'll attempt demangling them. For example: Rust uses
|
in the order we'll attempt demangling them. For example: Rust uses
|
||||||
C++ mangling, so must come after C++; Ada must come last (see
|
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
|
enum language
|
||||||
{
|
{
|
||||||
|
|
|
@ -245,7 +245,7 @@ static const char *f_extensions[] =
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct language_defn f_language_defn =
|
extern const struct language_defn f_language_defn =
|
||||||
{
|
{
|
||||||
"fortran",
|
"fortran",
|
||||||
"Fortran",
|
"Fortran",
|
||||||
|
@ -369,6 +369,4 @@ void
|
||||||
_initialize_f_language (void)
|
_initialize_f_language (void)
|
||||||
{
|
{
|
||||||
f_type_data = gdbarch_data_register_post_init (build_fortran_types);
|
f_type_data = gdbarch_data_register_post_init (build_fortran_types);
|
||||||
|
|
||||||
add_language (&f_language_defn);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -565,7 +565,7 @@ go_language_arch_info (struct gdbarch *gdbarch,
|
||||||
lai->bool_type_default = builtin->builtin_bool;
|
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",
|
||||||
"Go",
|
"Go",
|
||||||
|
@ -676,6 +676,4 @@ void
|
||||||
_initialize_go_language (void)
|
_initialize_go_language (void)
|
||||||
{
|
{
|
||||||
go_type_data = gdbarch_data_register_post_init (build_go_types);
|
go_type_data = gdbarch_data_register_post_init (build_go_types);
|
||||||
|
|
||||||
add_language (&go_language_defn);
|
|
||||||
}
|
}
|
||||||
|
|
230
gdb/language.c
230
gdb/language.c
|
@ -44,6 +44,7 @@
|
||||||
#include "cp-support.h"
|
#include "cp-support.h"
|
||||||
#include "frame.h"
|
#include "frame.h"
|
||||||
#include "c-lang.h"
|
#include "c-lang.h"
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
extern void _initialize_language (void);
|
extern void _initialize_language (void);
|
||||||
|
|
||||||
|
@ -91,12 +92,26 @@ enum language_mode language_mode = language_mode_auto;
|
||||||
|
|
||||||
const struct language_defn *expected_language;
|
const struct language_defn *expected_language;
|
||||||
|
|
||||||
/* The list of supported languages. The list itself is malloc'd. */
|
/* The list of supported languages. Keep this in the same order as
|
||||||
|
the 'enum language' values. */
|
||||||
|
|
||||||
static const struct language_defn **languages;
|
static const struct language_defn *languages[] = {
|
||||||
static unsigned languages_size;
|
&unknown_language_defn,
|
||||||
static unsigned languages_allocsize;
|
&auto_language_defn,
|
||||||
#define DEFAULT_ALLOCSIZE 4
|
&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
|
/* The current values of the "set language/type/range" enum
|
||||||
commands. */
|
commands. */
|
||||||
|
@ -148,16 +163,19 @@ show_language_command (struct ui_file *file, int from_tty,
|
||||||
static void
|
static void
|
||||||
set_language_command (char *ignore, int from_tty, struct cmd_list_element *c)
|
set_language_command (char *ignore, int from_tty, struct cmd_list_element *c)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
enum language flang = language_unknown;
|
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. */
|
/* 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. */
|
/* 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
|
/* Enter auto mode. Set to the current frame's language, if
|
||||||
known, or fallback to the initial language. */
|
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. */
|
/* Enter manual mode. Set the specified language. */
|
||||||
language_mode = language_mode_manual;
|
language_mode = language_mode_manual;
|
||||||
current_language = languages[i];
|
current_language = lang;
|
||||||
set_range_case ();
|
set_range_case ();
|
||||||
expected_language = current_language;
|
expected_language = current_language;
|
||||||
return;
|
return;
|
||||||
|
@ -364,21 +382,11 @@ set_range_case (void)
|
||||||
enum language
|
enum language
|
||||||
set_language (enum language lang)
|
set_language (enum language lang)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
enum language prev_language;
|
enum language prev_language;
|
||||||
|
|
||||||
prev_language = current_language->la_language;
|
prev_language = current_language->la_language;
|
||||||
|
current_language = languages[lang];
|
||||||
for (i = 0; i < languages_size; i++)
|
|
||||||
{
|
|
||||||
if (languages[i]->la_language == lang)
|
|
||||||
{
|
|
||||||
current_language = languages[i];
|
|
||||||
set_range_case ();
|
set_range_case ();
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return prev_language;
|
return prev_language;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -474,11 +482,12 @@ range_error (const char *string,...)
|
||||||
enum language
|
enum language
|
||||||
language_enum (char *str)
|
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 (str, "local") == 0)
|
||||||
if (strcmp (languages[i]->la_name, str) == 0)
|
return language_auto;
|
||||||
return languages[i]->la_language;
|
|
||||||
|
|
||||||
return language_unknown;
|
return language_unknown;
|
||||||
}
|
}
|
||||||
|
@ -488,32 +497,15 @@ language_enum (char *str)
|
||||||
const struct language_defn *
|
const struct language_defn *
|
||||||
language_def (enum language lang)
|
language_def (enum language lang)
|
||||||
{
|
{
|
||||||
int i;
|
return languages[lang];
|
||||||
|
|
||||||
for (i = 0; i < languages_size; i++)
|
|
||||||
{
|
|
||||||
if (languages[i]->la_language == lang)
|
|
||||||
{
|
|
||||||
return languages[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the language as a string. */
|
/* Return the language as a string. */
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
language_str (enum language lang)
|
language_str (enum language lang)
|
||||||
{
|
{
|
||||||
int i;
|
return languages[lang]->la_name;
|
||||||
|
|
||||||
for (i = 0; i < languages_size; i++)
|
|
||||||
{
|
|
||||||
if (languages[i]->la_language == lang)
|
|
||||||
{
|
|
||||||
return languages[i]->la_name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "Unknown";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -530,52 +522,42 @@ show_check (char *ignore, int from_tty)
|
||||||
cmd_show_list (showchecklist, from_tty, "");
|
cmd_show_list (showchecklist, from_tty, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add a language to the set of known languages. */
|
|
||||||
|
|
||||||
void
|
/* Build and install the "set language LANG" command. */
|
||||||
add_language (const struct language_defn *lang)
|
|
||||||
|
static void
|
||||||
|
add_set_language_command ()
|
||||||
{
|
{
|
||||||
/* For the "set language" command. */
|
static const char **language_names;
|
||||||
static const char **language_names = NULL;
|
|
||||||
/* For the "help set language" 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"));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!languages)
|
|
||||||
{
|
|
||||||
languages_allocsize = DEFAULT_ALLOCSIZE;
|
|
||||||
languages = XNEWVEC (const struct language_defn *, languages_allocsize);
|
|
||||||
}
|
|
||||||
if (languages_size >= languages_allocsize)
|
|
||||||
{
|
|
||||||
languages_allocsize *= 2;
|
|
||||||
languages = (const struct language_defn **) xrealloc ((char *) languages,
|
|
||||||
languages_allocsize * sizeof (*languages));
|
|
||||||
}
|
|
||||||
languages[languages_size++] = lang;
|
|
||||||
|
|
||||||
/* Build the language names array, to be used as enumeration in the
|
/* Build the language names array, to be used as enumeration in the
|
||||||
set language" enum command. */
|
"set language" enum command. +1 for "local" and +1 for NULL
|
||||||
language_names = XRESIZEVEC (const char *, language_names,
|
termination. */
|
||||||
languages_size + 1);
|
language_names = new const char *[ARRAY_SIZE (languages) + 2];
|
||||||
|
|
||||||
for (int i = 0; i < languages_size; ++i)
|
/* Display "auto", "local" and "unknown" first, and then the rest,
|
||||||
language_names[i] = languages[i]->la_name;
|
alpha sorted. */
|
||||||
language_names[languages_size] = NULL;
|
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)
|
||||||
|
{
|
||||||
|
/* Already handled above. */
|
||||||
|
if (lang->la_language == language_auto
|
||||||
|
|| lang->la_language == language_unknown)
|
||||||
|
continue;
|
||||||
|
*language_names_p++ = lang->la_name;
|
||||||
|
}
|
||||||
|
*language_names_p = NULL;
|
||||||
|
std::sort (sort_begin, language_names_p, compare_cstrings);
|
||||||
|
|
||||||
/* Add the filename extensions. */
|
/* Add the filename extensions. */
|
||||||
|
for (const auto &lang : languages)
|
||||||
if (lang->la_filename_extensions != NULL)
|
if (lang->la_filename_extensions != NULL)
|
||||||
{
|
{
|
||||||
int i;
|
for (size_t i = 0; lang->la_filename_extensions[i] != NULL; ++i)
|
||||||
|
|
||||||
for (i = 0; lang->la_filename_extensions[i] != NULL; ++i)
|
|
||||||
add_filename_language (lang->la_filename_extensions[i],
|
add_filename_language (lang->la_filename_extensions[i],
|
||||||
lang->la_language);
|
lang->la_language);
|
||||||
}
|
}
|
||||||
|
@ -587,24 +569,24 @@ add_language (const struct language_defn *lang)
|
||||||
"The currently understood settings are:\n\nlocal or "
|
"The currently understood settings are:\n\nlocal or "
|
||||||
"auto Automatic setting based on source file\n"));
|
"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. */
|
/* Already dealt with these above. */
|
||||||
if (languages[i]->la_language == language_unknown
|
if (lang->la_language == language_unknown
|
||||||
|| languages[i]->la_language == language_auto)
|
|| lang->la_language == language_auto)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* FIXME: i18n: for now assume that the human-readable name is
|
/* FIXME: i18n: for now assume that the human-readable name is
|
||||||
just a capitalization of the internal name. */
|
just a capitalization of the internal name. */
|
||||||
doc.printf ("%-16s Use the %c%s language\n",
|
doc.printf ("%-16s Use the %c%s language\n",
|
||||||
languages[i]->la_name,
|
lang->la_name,
|
||||||
/* Capitalize first letter of language name. */
|
/* Capitalize first letter of language name. */
|
||||||
toupper (languages[i]->la_name[0]),
|
toupper (lang->la_name[0]),
|
||||||
languages[i]->la_name + 1);
|
lang->la_name + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
add_setshow_enum_cmd ("language", class_support,
|
add_setshow_enum_cmd ("language", class_support,
|
||||||
(const char **) language_names,
|
language_names,
|
||||||
&language,
|
&language,
|
||||||
doc.c_str (),
|
doc.c_str (),
|
||||||
_("Show the current source language."),
|
_("Show the current source language."),
|
||||||
|
@ -620,13 +602,11 @@ add_language (const struct language_defn *lang)
|
||||||
CORE_ADDR
|
CORE_ADDR
|
||||||
skip_language_trampoline (struct frame_info *frame, CORE_ADDR pc)
|
skip_language_trampoline (struct frame_info *frame, CORE_ADDR pc)
|
||||||
{
|
{
|
||||||
int i;
|
for (const auto &lang : languages)
|
||||||
|
|
||||||
for (i = 0; i < languages_size; i++)
|
|
||||||
{
|
{
|
||||||
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)
|
if (real_pc)
|
||||||
return real_pc;
|
return real_pc;
|
||||||
|
@ -919,53 +899,6 @@ const struct language_defn auto_language_defn =
|
||||||
LANG_MAGIC
|
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. */
|
/* Per-architecture language information. */
|
||||||
|
|
||||||
|
@ -982,16 +915,15 @@ static void *
|
||||||
language_gdbarch_post_init (struct gdbarch *gdbarch)
|
language_gdbarch_post_init (struct gdbarch *gdbarch)
|
||||||
{
|
{
|
||||||
struct language_gdbarch *l;
|
struct language_gdbarch *l;
|
||||||
int i;
|
|
||||||
|
|
||||||
l = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct language_gdbarch);
|
l = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct language_gdbarch);
|
||||||
for (i = 0; i < languages_size; i++)
|
for (const auto &lang : languages)
|
||||||
|
if (lang != NULL && lang->la_language_arch_info != NULL)
|
||||||
{
|
{
|
||||||
if (languages[i] != NULL
|
lang->la_language_arch_info (gdbarch,
|
||||||
&& languages[i]->la_language_arch_info != NULL)
|
l->arch_info + lang->la_language);
|
||||||
languages[i]->la_language_arch_info
|
|
||||||
(gdbarch, l->arch_info + languages[i]->la_language);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1205,9 +1137,7 @@ For Fortran the default is off; for other languages the default is on."),
|
||||||
show_case_command,
|
show_case_command,
|
||||||
&setlist, &showlist);
|
&setlist, &showlist);
|
||||||
|
|
||||||
add_language (&auto_language_defn);
|
add_set_language_command ();
|
||||||
add_language (&local_language_defn);
|
|
||||||
add_language (&unknown_language_defn);
|
|
||||||
|
|
||||||
language = xstrdup ("auto");
|
language = xstrdup ("auto");
|
||||||
type = xstrdup ("auto");
|
type = xstrdup ("auto");
|
||||||
|
|
|
@ -568,10 +568,6 @@ extern const struct language_defn *language_def (enum language);
|
||||||
|
|
||||||
extern const char *language_str (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. */
|
/* Check for a language-specific trampoline. */
|
||||||
|
|
||||||
extern CORE_ADDR skip_language_trampoline (struct frame_info *, CORE_ADDR pc);
|
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,
|
void c_get_string (struct value *value, gdb_byte **buffer, int *length,
|
||||||
struct type **char_type, const char **charset);
|
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) */
|
#endif /* defined (LANGUAGE_H) */
|
||||||
|
|
|
@ -354,7 +354,7 @@ const struct exp_descriptor exp_descriptor_modula2 =
|
||||||
evaluate_subexp_modula2
|
evaluate_subexp_modula2
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct language_defn m2_language_defn =
|
extern const struct language_defn m2_language_defn =
|
||||||
{
|
{
|
||||||
"modula-2",
|
"modula-2",
|
||||||
"Modula-2",
|
"Modula-2",
|
||||||
|
@ -439,6 +439,4 @@ void
|
||||||
_initialize_m2_language (void)
|
_initialize_m2_language (void)
|
||||||
{
|
{
|
||||||
m2_type_data = gdbarch_data_register_post_init (build_m2_types);
|
m2_type_data = gdbarch_data_register_post_init (build_m2_types);
|
||||||
|
|
||||||
add_language (&m2_language_defn);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -364,7 +364,7 @@ static const char *objc_extensions[] =
|
||||||
".m", NULL
|
".m", NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct language_defn objc_language_defn = {
|
extern const struct language_defn objc_language_defn = {
|
||||||
"objective-c", /* Language name */
|
"objective-c", /* Language name */
|
||||||
"Objective-C",
|
"Objective-C",
|
||||||
language_objc,
|
language_objc,
|
||||||
|
@ -1377,7 +1377,6 @@ extern initialize_file_ftype _initialize_objc_language;
|
||||||
void
|
void
|
||||||
_initialize_objc_language (void)
|
_initialize_objc_language (void)
|
||||||
{
|
{
|
||||||
add_language (&objc_language_defn);
|
|
||||||
add_info ("selectors", selectors_info, /* INFO SELECTORS command. */
|
add_info ("selectors", selectors_info, /* INFO SELECTORS command. */
|
||||||
_("All Objective-C selectors, or those matching REGEXP."));
|
_("All Objective-C selectors, or those matching REGEXP."));
|
||||||
add_info ("classes", classes_info, /* INFO CLASSES command. */
|
add_info ("classes", classes_info, /* INFO CLASSES command. */
|
||||||
|
|
|
@ -1043,7 +1043,7 @@ const struct exp_descriptor exp_descriptor_opencl =
|
||||||
evaluate_subexp_opencl
|
evaluate_subexp_opencl
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct language_defn opencl_language_defn =
|
extern const struct language_defn opencl_language_defn =
|
||||||
{
|
{
|
||||||
"opencl", /* Language name */
|
"opencl", /* Language name */
|
||||||
"OpenCL C",
|
"OpenCL C",
|
||||||
|
@ -1185,5 +1185,4 @@ void
|
||||||
_initialize_opencl_language (void)
|
_initialize_opencl_language (void)
|
||||||
{
|
{
|
||||||
opencl_type_data = gdbarch_data_register_post_init (build_opencl_types);
|
opencl_type_data = gdbarch_data_register_post_init (build_opencl_types);
|
||||||
add_language (&opencl_language_defn);
|
|
||||||
}
|
}
|
||||||
|
|
11
gdb/p-lang.c
11
gdb/p-lang.c
|
@ -32,9 +32,6 @@
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include "c-lang.h"
|
#include "c-lang.h"
|
||||||
|
|
||||||
extern void _initialize_pascal_language (void);
|
|
||||||
|
|
||||||
|
|
||||||
/* All GPC versions until now (2007-09-27) also define a symbol called
|
/* All GPC versions until now (2007-09-27) also define a symbol called
|
||||||
'_p_initialize'. Check for the presence of this symbol first. */
|
'_p_initialize'. Check for the presence of this symbol first. */
|
||||||
static const char GPC_P_INITIALIZE[] = "_p_initialize";
|
static const char GPC_P_INITIALIZE[] = "_p_initialize";
|
||||||
|
@ -418,7 +415,7 @@ static const char *p_extensions[] =
|
||||||
".pas", ".p", ".pp", NULL
|
".pas", ".p", ".pp", NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct language_defn pascal_language_defn =
|
extern const struct language_defn pascal_language_defn =
|
||||||
{
|
{
|
||||||
"pascal", /* Language name */
|
"pascal", /* Language name */
|
||||||
"Pascal",
|
"Pascal",
|
||||||
|
@ -464,9 +461,3 @@ const struct language_defn pascal_language_defn =
|
||||||
NULL,
|
NULL,
|
||||||
LANG_MAGIC
|
LANG_MAGIC
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
|
||||||
_initialize_pascal_language (void)
|
|
||||||
{
|
|
||||||
add_language (&pascal_language_defn);
|
|
||||||
}
|
|
||||||
|
|
|
@ -35,8 +35,6 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
extern initialize_file_ftype _initialize_rust_language;
|
|
||||||
|
|
||||||
/* Returns the last segment of a Rust path like foo::bar::baz. Will
|
/* Returns the last segment of a Rust path like foo::bar::baz. Will
|
||||||
not handle cases where the last segment contains generics. This
|
not handle cases where the last segment contains generics. This
|
||||||
will return NULL if the last segment cannot be found. */
|
will return NULL if the last segment cannot be found. */
|
||||||
|
@ -2150,7 +2148,7 @@ static const char *rust_extensions[] =
|
||||||
".rs", NULL
|
".rs", NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct language_defn rust_language_defn =
|
extern const struct language_defn rust_language_defn =
|
||||||
{
|
{
|
||||||
"rust",
|
"rust",
|
||||||
"Rust",
|
"Rust",
|
||||||
|
@ -2197,9 +2195,3 @@ static const struct language_defn rust_language_defn =
|
||||||
NULL,
|
NULL,
|
||||||
LANG_MAGIC
|
LANG_MAGIC
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
|
||||||
_initialize_rust_language (void)
|
|
||||||
{
|
|
||||||
add_language (&rust_language_defn);
|
|
||||||
}
|
|
||||||
|
|
|
@ -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>
|
2017-07-20 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
* gdb.base/dmsym.c (pck__foo__bar__minsym): Rename to ...
|
* gdb.base/dmsym.c (pck__foo__bar__minsym): Rename to ...
|
||||||
|
|
|
@ -511,7 +511,7 @@ gdb_test "set history size" "Argument required .integer to set it to.*" "set his
|
||||||
#test set history
|
#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"
|
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
|
#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
|
#test set listsize
|
||||||
gdb_test "set listsize" "Argument required .integer to set it to.*" "set listsize"
|
gdb_test "set listsize" "Argument required .integer to set it to.*" "set listsize"
|
||||||
#test set print "p" abbreviation
|
#test set print "p" abbreviation
|
||||||
|
|
|
@ -59,6 +59,14 @@ extern int subset_compare (const char *, const char *);
|
||||||
int compare_positive_ints (const void *ap, const void *bp);
|
int compare_positive_ints (const void *ap, const void *bp);
|
||||||
int compare_strings (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
|
/* A wrapper for bfd_errmsg to produce a more helpful error message
|
||||||
in the case of bfd_error_file_ambiguously recognized.
|
in the case of bfd_error_file_ambiguously recognized.
|
||||||
MATCHING, if non-NULL, is the corresponding argument to
|
MATCHING, if non-NULL, is the corresponding argument to
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue