gdb: Convert la_name and la_natural_name to methods

Convert the two language_data member variables la_name and
la_natural_name to virtual methods in language_defn struct called name
and natural_name respectively.

The virtual methods in the language_defn base class are pure virtual,
as every language must implement these, and as every language has a
unique name there's no sensible default here.

Given that every language must implement these methods I did wonder
about making this data passed into the base class constructor, but in
the end I went with the virtual method approach.  I'm open to changing
this approach if people prefer the constructor approach.

During updating the calls to language_defn::name I found in
add_set_language_command a place where we took la_name and then
capitalised the first letter to create a language name that could be
used in the documentation string.  I replaced this with a use of
natural_name instead as this seemed a better choice, in most cases
this will make no difference, as for most languages the natural_name
is just the name with the first character in upper case, but for some
languages, for example 'Open-CL' and 'Objective-C' this is not the
case.

In the case of asm_language the name is 'asm', while the natural_name
was previously 'assembly'.  I changed the natural name to 'Assembly',
this makes the documentation string case above cleaner, however, this
will change the MI output for -var-info-expression, where the 'lang'
field will change from 'assembly' to 'Assembly'.  It is possible this
could be a breaking change if a front-end is relying on the existing
name.

gdb/ChangeLog:

	* ada-lang.c (ada_language_data): Remove la_name and
	la_natural_name initializers.
	(ada_language::name): New member function.
	(ada_language::natural_name): New member function.
	* c-lang.c (c_language_data): Remove la_name and
	la_natural_name initializers.
	(c_language::name): New member function.
	(c_language::natural_name): New member function.
	(cplus_language_data): Remove la_name and
	la_natural_name initializers.
	(cplus_language::name): New member function.
	(cplus_language::natural_name): New member function.
	(asm_language_data): Remove la_name and
	la_natural_name initializers.
	(asm_language::name): New member function.
	(asm_language::natural_name): New member function.
	(minimal_language_data): Remove la_name and
	la_natural_name initializers.
	(minimal_language::name): New member function.
	(minimal_language::natural_name): New member function.
	* compile/compile.c (compile_to_object): Update call to
	lanugage_defn::name.
	* d-lang.c (d_language_data): Remove la_name and
	la_natural_name initializers.
	(d_language::name): New member function.
	(d_language::natural_name): New member function.
	* expprint.c (print_subexp_standard): Update call to
	language_defn::name.
	(dump_raw_expression): Likewise
	(dump_prefix_expression): Likewise.
	* f-lang.c (f_language_data): Remove la_name and
	la_natural_name initializers.
	(f_language::name): New member function.
	(f_language::natural_name): New member function.
	* go-lang.c (go_language_data): Remove la_name and
	la_natural_name initializers.
	(go_language::name): New member function.
	(go_language::natural_name): New member function.
	* language.c (show_language_command): Update call to
	language_defn::name.
	(set_language_command): Likewise.
	(language_enum): Likewise.
	(language_str): Likewise.
	(add_set_language_command): Likewise, use
	language_defn::natural_name in the doc string.
	(unknown_language_data): Remove la_name and
	la_natural_name initializers.
	(unknown_language::name): New member function.
	(unknown_language::natural_name): New member function.
	(auto_language_data): Remove la_name and
	la_natural_name initializers.
	(auto_language::name): New member function.
	(auto_language::natural_name): New member function.
	(language_lookup_primitive_type_as_symbol): Update call to
	language_defn::name.
	* language.h (language_data): Remove la_name and la_natural_name
	member variables.
	(language_defn::name): New member function.
	(language_defn::natural_name): New member function.
	* m2-lang.c (m2_language_data): Remove la_name and
	la_natural_name initializers.
	(m2_language::name): New member function.
	(m2_language::natural_name): New member function.
	* mi/mi-cmd-var.c (mi_cmd_var_info_expression): Update call to
	language_defn::natural_name.
	* objc-lang.c (objc_language_data): Remove la_name and
	la_natural_name initializers.
	(objc_language::name): New member function.
	(objc_language::natural_name): New member function.
	* opencl-lang.c (opencl_language_data): Remove la_name and
	la_natural_name initializers.
	(opencl_language::name): New member function.
	(opencl_language::natural_name): New member function.
	* p-lang.c (pascal_language_data): Remove la_name and
	la_natural_name initializers.
	(pascal_language::name): New member function.
	(pascal_language::natural_name): New member function.
	* rust-lang.c (rust_language_data): Remove la_name and
	la_natural_name initializers.
	(rust_language::name): New member function.
	(rust_language::natural_name): New member function.
	* symtab.c (lookup_language_this): Update call to
	language_defn::name.
This commit is contained in:
Andrew Burgess 2020-06-23 20:07:09 +01:00
parent 5bae7c4e04
commit 6f7664a9c3
17 changed files with 263 additions and 60 deletions

View file

@ -98,11 +98,11 @@ show_language_command (struct ui_file *file, int from_tty,
fprintf_filtered (gdb_stdout,
_("The current source language is "
"\"auto; currently %s\".\n"),
current_language->la_name);
current_language->name ());
else
fprintf_filtered (gdb_stdout,
_("The current source language is \"%s\".\n"),
current_language->la_name);
current_language->name ());
if (has_stack_frames ())
{
@ -131,7 +131,7 @@ set_language_command (const char *ignore,
/* Search the list of languages for a match. */
for (const auto &lang : language_defn::languages)
{
if (strcmp (lang->la_name, language) == 0)
if (strcmp (lang->name (), language) == 0)
{
/* Found it! Go into manual mode, and use this language. */
if (lang->la_language == language_auto)
@ -442,7 +442,7 @@ enum language
language_enum (const char *str)
{
for (const auto &lang : language_defn::languages)
if (strcmp (lang->la_name, str) == 0)
if (strcmp (lang->name (), str) == 0)
return lang->la_language;
if (strcmp (str, "local") == 0)
@ -466,7 +466,7 @@ language_def (enum language lang)
const char *
language_str (enum language lang)
{
return language_def (lang)->la_name;
return language_def (lang)->name ();
}
@ -486,9 +486,9 @@ add_set_language_command ()
/* Display "auto", "local" and "unknown" first, and then the rest,
alpha sorted. */
const char **language_names_p = language_names;
*language_names_p++ = language_def (language_auto)->la_name;
*language_names_p++ = language_def (language_auto)->name ();
*language_names_p++ = "local";
*language_names_p++ = language_def (language_unknown)->la_name;
*language_names_p++ = language_def (language_unknown)->name ();
const char **sort_begin = language_names_p;
for (const auto &lang : language_defn::languages)
{
@ -496,7 +496,7 @@ add_set_language_command ()
if (lang->la_language == language_auto
|| lang->la_language == language_unknown)
continue;
*language_names_p++ = lang->la_name;
*language_names_p++ = lang->name ();
}
*language_names_p = NULL;
std::sort (sort_begin, language_names_p, compare_cstrings);
@ -524,15 +524,11 @@ add_set_language_command ()
|| lang->la_language == language_auto)
continue;
/* FIXME: i18n: for now assume that the human-readable name is
just a capitalization of the internal name. */
/* Note that we add the newline at the front, so we don't wind
up with a trailing newline. */
doc.printf ("\n%-16s Use the %c%s language",
lang->la_name,
/* Capitalize first letter of language name. */
toupper (lang->la_name[0]),
lang->la_name + 1);
doc.printf ("\n%-16s Use the %s language",
lang->name (),
lang->natural_name ());
}
add_setshow_enum_cmd ("language", class_support,
@ -783,8 +779,6 @@ unknown_language_arch_info (struct gdbarch *gdbarch,
extern const struct language_data unknown_language_data =
{
"unknown",
"Unknown",
language_unknown,
range_check_off,
case_sensitive_on,
@ -808,6 +802,16 @@ public:
: language_defn (language_unknown, unknown_language_data)
{ /* Nothing. */ }
/* See language.h. */
const char *name () const override
{ return "unknown"; }
/* See language.h. */
const char *natural_name () const override
{ return "Unknown"; }
/* See language.h. */
void language_arch_info (struct gdbarch *gdbarch,
struct language_arch_info *lai) const override
@ -912,8 +916,6 @@ static unknown_language unknown_language_defn;
extern const struct language_data auto_language_data =
{
"auto",
"Auto",
language_auto,
range_check_off,
case_sensitive_on,
@ -937,6 +939,16 @@ public:
: language_defn (language_auto, auto_language_data)
{ /* Nothing. */ }
/* See language.h. */
const char *name () const override
{ return "auto"; }
/* See language.h. */
const char *natural_name () const override
{ return "Auto"; }
/* See language.h. */
void language_arch_info (struct gdbarch *gdbarch,
struct language_arch_info *lai) const override
@ -1209,7 +1221,7 @@ language_lookup_primitive_type_as_symbol (const struct language_defn *la,
fprintf_unfiltered (gdb_stdlog,
"language_lookup_primitive_type_as_symbol"
" (%s, %s, %s)",
la->la_name, host_address_to_string (gdbarch), name);
la->name (), host_address_to_string (gdbarch), name);
}
typep = language_lookup_primitive_type_1 (lai, name);