/* Multiple source language support for GDB.
- Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000,
- 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+ 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
+ Free Software Foundation, Inc.
Contributed by the Department of Computer Science at the State University
of New York at Buffalo.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* This file contains functions that return things that are specific
to languages. Each function should examine current_language if necessary,
#include "parser-defs.h"
#include "jv-lang.h"
#include "demangle.h"
+#include "symfile.h"
extern void _initialize_language (void);
-static void set_case_str (void);
-
-static void set_range_str (void);
-
-static void set_type_str (void);
-
-static void set_lang_str (void);
-
static void unk_lang_error (char *);
static int unk_lang_parser (void);
static void set_type_range_case (void);
-static void unk_lang_emit_char (int c, struct ui_file *stream, int quoter);
+static void unk_lang_emit_char (int c, struct type *type,
+ struct ui_file *stream, int quoter);
-static void unk_lang_printchar (int c, struct ui_file *stream);
-
-static struct type *unk_lang_create_fundamental_type (struct objfile *, int);
+static void unk_lang_printchar (int c, struct type *type,
+ struct ui_file *stream);
static void unk_lang_print_type (struct type *, char *, struct ui_file *,
int, int);
-static int unk_lang_value_print (struct value *, struct ui_file *, int, enum val_prettyprint);
+static int unk_lang_value_print (struct value *, struct ui_file *,
+ const struct value_print_options *);
-static CORE_ADDR unk_lang_trampoline (CORE_ADDR pc);
+static CORE_ADDR unk_lang_trampoline (struct frame_info *, CORE_ADDR pc);
/* Forward declaration */
extern const struct language_defn unknown_language_defn;
static unsigned languages_allocsize;
#define DEFAULT_ALLOCSIZE 4
-/* The "set language/type/range" commands all put stuff in these
- buffers. This is to make them work as set/show commands. The
- user's string is copied here, then the set_* commands look at
- them and update them to something that looks nice when it is
- printed out. */
-
-static char *language;
-static char *type;
-static char *range;
-static char *case_sensitive;
+/* The current values of the "set language/type/range" enum
+ commands. */
+static const char *language;
+static const char *type;
+static const char *range;
+static const char *case_sensitive;
/* Warning issued when current_language and the language of the current
frame do not match. */
{
enum language flang; /* The language of the current frame */
- deprecated_show_value_hack (file, from_tty, c, value);
+ if (language_mode == language_mode_auto)
+ fprintf_filtered (gdb_stdout,
+ _("The current source language is "
+ "\"auto; currently %s\".\n"),
+ current_language->la_name);
+ else
+ fprintf_filtered (gdb_stdout, _("The current source language is \"%s\".\n"),
+ current_language->la_name);
+
flang = get_frame_language ();
if (flang != language_unknown &&
language_mode == language_mode_manual &&
{
int i;
enum language flang;
- char *err_lang;
-
- if (!language || !language[0])
- {
- printf_unfiltered (_("\
-The currently understood settings are:\n\n\
-local or auto Automatic setting based on source file\n"));
-
- for (i = 0; i < languages_size; ++i)
- {
- /* Already dealt with these above. */
- if (languages[i]->la_language == language_unknown
- || languages[i]->la_language == language_auto)
- continue;
-
- /* FIXME: i18n: for now assume that the human-readable name
- is just a capitalization of the internal name. */
- printf_unfiltered ("%-16s Use the %c%s language\n",
- languages[i]->la_name,
- /* Capitalize first letter of language
- name. */
- toupper (languages[i]->la_name[0]),
- languages[i]->la_name + 1);
- }
- /* Restore the silly string. */
- set_language (current_language->la_language);
- return;
- }
/* Search the list of languages for a match. */
for (i = 0; i < languages_size; i++)
/* Found it! Go into manual mode, and use this language. */
if (languages[i]->la_language == language_auto)
{
- /* Enter auto mode. Set to the current frame's language, if known. */
+ /* Enter auto mode. Set to the current frame's language, if
+ known, or fallback to the initial language. */
language_mode = language_mode_auto;
flang = get_frame_language ();
if (flang != language_unknown)
set_language (flang);
+ else
+ set_initial_language ();
expected_language = current_language;
return;
}
language_mode = language_mode_manual;
current_language = languages[i];
set_type_range_case ();
- set_lang_str ();
expected_language = current_language;
return;
}
}
}
- /* Reset the language (esp. the global string "language") to the
- correct values. */
- err_lang = savestring (language, strlen (language));
- make_cleanup (xfree, err_lang); /* Free it after error */
- set_language (current_language->la_language);
- error (_("Unknown language `%s'."), err_lang);
+ internal_error (__FILE__, __LINE__,
+ "Couldn't find language `%s' in known languages list.",
+ language);
}
/* Show command. Display a warning if the type setting does
show_type_command (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- deprecated_show_value_hack (file, from_tty, c, value);
- if (type_check != current_language->la_type_check)
- printf_unfiltered (
- "Warning: the current type check setting does not match the language.\n");
+ if (type_mode == type_mode_auto)
+ {
+ char *tmp = NULL;
+
+ switch (type_check)
+ {
+ case type_check_on:
+ tmp = "on";
+ break;
+ case type_check_off:
+ tmp = "off";
+ break;
+ case type_check_warn:
+ tmp = "warn";
+ break;
+ default:
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized type check setting.");
+ }
+
+ fprintf_filtered (gdb_stdout,
+ _("Type checking is \"auto; currently %s\".\n"),
+ tmp);
+ }
+ else
+ fprintf_filtered (gdb_stdout, _("Type checking is \"%s\".\n"),
+ value);
+
+ if (type_check != current_language->la_type_check)
+ warning (_("the current type check setting"
+ " does not match the language.\n"));
}
/* Set command. Change the setting for type checking. */
{
type_mode = type_mode_auto;
set_type_range_case ();
- /* Avoid hitting the set_type_str call below. We
- did it in set_type_range_case. */
return;
}
else
- {
- warning (_("Unrecognized type check setting: \"%s\""), type);
- }
- set_type_str ();
- show_type_command (NULL, from_tty, NULL, NULL);
+ internal_error (__FILE__, __LINE__,
+ _("Unrecognized type check setting: \"%s\""), type);
+
+ if (type_check != current_language->la_type_check)
+ warning (_("the current type check setting"
+ " does not match the language.\n"));
}
/* Show command. Display a warning if the range setting does
show_range_command (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- deprecated_show_value_hack (file, from_tty, c, value);
+ if (range_mode == range_mode_auto)
+ {
+ char *tmp;
+
+ switch (range_check)
+ {
+ case range_check_on:
+ tmp = "on";
+ break;
+ case range_check_off:
+ tmp = "off";
+ break;
+ case range_check_warn:
+ tmp = "warn";
+ break;
+ default:
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized range check setting.");
+ }
+
+ fprintf_filtered (gdb_stdout,
+ _("Range checking is \"auto; currently %s\".\n"),
+ tmp);
+ }
+ else
+ fprintf_filtered (gdb_stdout, _("Range checking is \"%s\".\n"),
+ value);
+
if (range_check != current_language->la_range_check)
- printf_unfiltered (
- "Warning: the current range check setting does not match the language.\n");
+ warning (_("the current range check setting "
+ "does not match the language.\n"));
}
/* Set command. Change the setting for range checking. */
{
range_mode = range_mode_auto;
set_type_range_case ();
- /* Avoid hitting the set_range_str call below. We
- did it in set_type_range_case. */
return;
}
else
{
- warning (_("Unrecognized range check setting: \"%s\""), range);
+ internal_error (__FILE__, __LINE__,
+ _("Unrecognized range check setting: \"%s\""), range);
}
- set_range_str ();
- show_range_command (NULL, from_tty, NULL, NULL);
+ if (range_check != current_language->la_range_check)
+ warning (_("the current range check setting "
+ "does not match the language.\n"));
}
/* Show command. Display a warning if the case sensitivity setting does
show_case_command (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- deprecated_show_value_hack (file, from_tty, c, value);
+ if (case_mode == case_mode_auto)
+ {
+ char *tmp = NULL;
+
+ switch (case_sensitivity)
+ {
+ case case_sensitive_on:
+ tmp = "on";
+ break;
+ case case_sensitive_off:
+ tmp = "off";
+ break;
+ default:
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized case-sensitive setting.");
+ }
+
+ fprintf_filtered (gdb_stdout,
+ _("Case sensitivity in "
+ "name search is \"auto; currently %s\".\n"),
+ tmp);
+ }
+ else
+ fprintf_filtered (gdb_stdout, _("Case sensitivity in name search is \"%s\".\n"),
+ value);
+
if (case_sensitivity != current_language->la_case_sensitivity)
- printf_unfiltered(
-"Warning: the current case sensitivity setting does not match the language.\n");
+ warning (_("the current case sensitivity setting does not match "
+ "the language.\n"));
}
/* Set command. Change the setting for case sensitivity. */
{
case_mode = case_mode_auto;
set_type_range_case ();
- /* Avoid hitting the set_case_str call below. We did it in
- set_type_range_case. */
return;
}
else
{
- warning (_("Unrecognized case-sensitive setting: \"%s\""),
- case_sensitive);
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized case-sensitive setting: \"%s\"",
+ case_sensitive);
}
- set_case_str();
- show_case_command (NULL, from_tty, NULL, NULL);
+
+ if (case_sensitivity != current_language->la_case_sensitivity)
+ warning (_("the current case sensitivity setting does not match "
+ "the language.\n"));
}
/* Set the status of range and type checking and case sensitivity based on
static void
set_type_range_case (void)
{
-
if (range_mode == range_mode_auto)
range_check = current_language->la_range_check;
if (case_mode == case_mode_auto)
case_sensitivity = current_language->la_case_sensitivity;
-
- set_type_str ();
- set_range_str ();
- set_case_str ();
}
/* Set current language to (enum language) LANG. Returns previous language. */
{
current_language = languages[i];
set_type_range_case ();
- set_lang_str ();
break;
}
}
return prev_language;
}
\f
-/* This page contains functions that update the global vars
- language, type and range. */
-static void
-set_lang_str (void)
-{
- char *prefix = "";
-
- if (language)
- xfree (language);
- if (language_mode == language_mode_auto)
- prefix = "auto; currently ";
-
- language = concat (prefix, current_language->la_name, (char *)NULL);
-}
-
-static void
-set_type_str (void)
-{
- char *tmp = NULL, *prefix = "";
-
- if (type)
- xfree (type);
- if (type_mode == type_mode_auto)
- prefix = "auto; currently ";
-
- switch (type_check)
- {
- case type_check_on:
- tmp = "on";
- break;
- case type_check_off:
- tmp = "off";
- break;
- case type_check_warn:
- tmp = "warn";
- break;
- default:
- error (_("Unrecognized type check setting."));
- }
-
- type = concat (prefix, tmp, (char *)NULL);
-}
-
-static void
-set_range_str (void)
-{
- char *tmp, *pref = "";
-
- if (range_mode == range_mode_auto)
- pref = "auto; currently ";
-
- switch (range_check)
- {
- case range_check_on:
- tmp = "on";
- break;
- case range_check_off:
- tmp = "off";
- break;
- case range_check_warn:
- tmp = "warn";
- break;
- default:
- error (_("Unrecognized range check setting."));
- }
-
- if (range)
- xfree (range);
- range = concat (pref, tmp, (char *)NULL);
-}
-
-static void
-set_case_str (void)
-{
- char *tmp = NULL, *prefix = "";
-
- if (case_mode==case_mode_auto)
- prefix = "auto; currently ";
-
- switch (case_sensitivity)
- {
- case case_sensitive_on:
- tmp = "on";
- break;
- case case_sensitive_off:
- tmp = "off";
- break;
- default:
- error (_("Unrecognized case-sensitive setting."));
- }
-
- xfree (case_sensitive);
- case_sensitive = concat (prefix, tmp, (char *)NULL);
-}
/* Print out the current language settings: language, range and
type checking. If QUIETLY, print only what has changed. */
CHECK_TYPEDEF (type);
return TYPE_CODE (type) == TYPE_CODE_FLT;
}
+#endif
/* Returns non-zero if the value is a pointer type */
int
TYPE_CODE (type) == TYPE_CODE_REF;
}
+#if 0
/* Returns non-zero if the value is a structured type */
int
structured_type (struct type *type)
}
#endif
\f
-struct type *
-lang_bool_type (void)
-{
- struct symbol *sym;
- struct type *type;
- switch (current_language->la_language)
- {
- case language_fortran:
- sym = lookup_symbol ("logical", NULL, VAR_DOMAIN, NULL, NULL);
- if (sym)
- {
- type = SYMBOL_TYPE (sym);
- if (type && TYPE_CODE (type) == TYPE_CODE_BOOL)
- return type;
- }
- return builtin_type_f_logical_s2;
- case language_cplus:
- case language_pascal:
- if (current_language->la_language==language_cplus)
- {sym = lookup_symbol ("bool", NULL, VAR_DOMAIN, NULL, NULL);}
- else
- {sym = lookup_symbol ("boolean", NULL, VAR_DOMAIN, NULL, NULL);}
- if (sym)
- {
- type = SYMBOL_TYPE (sym);
- if (type && TYPE_CODE (type) == TYPE_CODE_BOOL)
- return type;
- }
- return builtin_type_bool;
- case language_java:
- sym = lookup_symbol ("boolean", NULL, VAR_DOMAIN, NULL, NULL);
- if (sym)
- {
- type = SYMBOL_TYPE (sym);
- if (type && TYPE_CODE (type) == TYPE_CODE_BOOL)
- return type;
- }
- return java_boolean_type;
- default:
- return builtin_type_int;
- }
-}
-\f
/* This page contains functions that return info about
(struct value) values used in GDB. */
void
add_language (const struct language_defn *lang)
{
+ /* For the "set language" command. */
+ static char **language_names = NULL;
+ /* For the "help set language" command. */
+ char *language_set_doc = NULL;
+
+ int i;
+ struct ui_file *tmp_stream;
+
if (lang->la_magic != LANG_MAGIC)
{
fprintf_unfiltered (gdb_stderr, "Magic number of %s language struct wrong\n",
languages_allocsize * sizeof (*languages));
}
languages[languages_size++] = lang;
+
+ /* Build the language names array, to be used as enumeration in the
+ set language" enum command. */
+ language_names = xrealloc (language_names,
+ (languages_size + 1) * sizeof (const char *));
+ for (i = 0; i < languages_size; ++i)
+ language_names[i] = languages[i]->la_name;
+ language_names[i] = NULL;
+
+ /* Build the "help set language" docs. */
+ tmp_stream = mem_fileopen ();
+
+ fprintf_unfiltered (tmp_stream, _("\
+Set the current source language.\n\
+The currently understood settings are:\n\n\
+local or auto Automatic setting based on source file\n"));
+
+ for (i = 0; i < languages_size; ++i)
+ {
+ /* Already dealt with these above. */
+ if (languages[i]->la_language == language_unknown
+ || languages[i]->la_language == language_auto)
+ continue;
+
+ /* FIXME: i18n: for now assume that the human-readable name
+ is just a capitalization of the internal name. */
+ fprintf_unfiltered (tmp_stream, "%-16s Use the %c%s language\n",
+ languages[i]->la_name,
+ /* Capitalize first letter of language
+ name. */
+ toupper (languages[i]->la_name[0]),
+ languages[i]->la_name + 1);
+ }
+
+ language_set_doc = ui_file_xstrdup (tmp_stream, NULL);
+ ui_file_delete (tmp_stream);
+
+ add_setshow_enum_cmd ("language", class_support,
+ (const char **) language_names,
+ &language,
+ language_set_doc, _("\
+Show the current source language."), NULL,
+ set_language_command,
+ show_language_command,
+ &setlist, &showlist);
+
+ xfree (language_set_doc);
}
/* Iterate through all registered languages looking for and calling
Return the result from the first that returns non-zero, or 0 if all
`fail'. */
CORE_ADDR
-skip_language_trampoline (CORE_ADDR pc)
+skip_language_trampoline (struct frame_info *frame, CORE_ADDR pc)
{
int i;
{
if (languages[i]->skip_trampoline)
{
- CORE_ADDR real_pc = (languages[i]->skip_trampoline) (pc);
+ CORE_ADDR real_pc = (languages[i]->skip_trampoline) (frame, pc);
if (real_pc)
return real_pc;
}
return NULL;
}
+/* Return non-zero if TYPE should be passed (and returned) by
+ reference at the language level. */
+int
+language_pass_by_reference (struct type *type)
+{
+ return current_language->la_pass_by_reference (type);
+}
+
+/* Return zero; by default, types are passed by value at the language
+ level. The target ABI may pass or return some structs by reference
+ independent of this. */
+int
+default_pass_by_reference (struct type *type)
+{
+ return 0;
+}
+
/* Return the default string containing the list of characters
delimiting words. This is a reasonable default value that
most languages should be able to use. */
void
default_print_array_index (struct value *index_value, struct ui_file *stream,
- int format, enum val_prettyprint pretty)
+ const struct value_print_options *options)
{
fprintf_filtered (stream, "[");
- LA_VALUE_PRINT (index_value, stream, format, pretty);
+ LA_VALUE_PRINT (index_value, stream, options);
fprintf_filtered (stream, "] = ");
}
+void
+default_get_string (struct value *value, gdb_byte **buffer, int *length,
+ struct type **char_type, const char **charset)
+{
+ error (_("Getting a string is unsupported in this language."));
+}
+
/* Define the language that is no language. */
static int
}
static void
-unk_lang_emit_char (int c, struct ui_file *stream, int quoter)
+unk_lang_emit_char (int c, struct type *type, struct ui_file *stream,
+ int quoter)
{
error (_("internal error - unimplemented function unk_lang_emit_char called."));
}
static void
-unk_lang_printchar (int c, struct ui_file *stream)
+unk_lang_printchar (int c, struct type *type, struct ui_file *stream)
{
error (_("internal error - unimplemented function unk_lang_printchar called."));
}
static void
-unk_lang_printstr (struct ui_file *stream, const gdb_byte *string,
- unsigned int length, int width, int force_ellipses)
+unk_lang_printstr (struct ui_file *stream, struct type *type,
+ const gdb_byte *string, unsigned int length,
+ int force_ellipses,
+ const struct value_print_options *options)
{
error (_("internal error - unimplemented function unk_lang_printstr called."));
}
-static struct type *
-unk_lang_create_fundamental_type (struct objfile *objfile, int typeid)
-{
- error (_("internal error - unimplemented function unk_lang_create_fundamental_type called."));
-}
-
static void
unk_lang_print_type (struct type *type, char *varstring, struct ui_file *stream,
int show, int level)
static int
unk_lang_val_print (struct type *type, const gdb_byte *valaddr,
int embedded_offset, CORE_ADDR address,
- struct ui_file *stream, int format,
- int deref_ref, int recurse, enum val_prettyprint pretty)
+ struct ui_file *stream, int recurse,
+ const struct value_print_options *options)
{
error (_("internal error - unimplemented function unk_lang_val_print called."));
}
static int
-unk_lang_value_print (struct value *val, struct ui_file *stream, int format,
- enum val_prettyprint pretty)
+unk_lang_value_print (struct value *val, struct ui_file *stream,
+ const struct value_print_options *options)
{
error (_("internal error - unimplemented function unk_lang_value_print called."));
}
-static CORE_ADDR unk_lang_trampoline (CORE_ADDR pc)
+static CORE_ADDR unk_lang_trampoline (struct frame_info *frame, CORE_ADDR pc)
{
return 0;
}
struct language_arch_info *lai)
{
lai->string_char_type = builtin_type (gdbarch)->builtin_char;
+ lai->bool_type_default = builtin_type (gdbarch)->builtin_int;
lai->primitive_type_vector = GDBARCH_OBSTACK_CALLOC (gdbarch, 1,
struct type *);
}
{
"unknown",
language_unknown,
- NULL,
range_check_off,
type_check_off,
- array_row_major,
case_sensitive_on,
+ array_row_major,
+ macro_expansion_no,
&exp_descriptor_standard,
unk_lang_parser,
unk_lang_error,
unk_lang_printchar, /* Print character constant */
unk_lang_printstr,
unk_lang_emit_char,
- unk_lang_create_fundamental_type,
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 */
unk_lang_trampoline, /* Language specific skip_trampoline */
- value_of_this, /* value_of_this */
+ "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 */
unk_op_print_tab, /* expression operators for printing */
1, /* c-style arrays */
0, /* String lower bound */
- NULL,
default_word_break_characters,
+ default_make_symbol_completion_list,
unknown_language_arch_info, /* la_language_arch_info. */
default_print_array_index,
+ default_pass_by_reference,
+ default_get_string,
LANG_MAGIC
};
{
"auto",
language_auto,
- NULL,
range_check_off,
type_check_off,
- array_row_major,
case_sensitive_on,
+ array_row_major,
+ macro_expansion_no,
&exp_descriptor_standard,
unk_lang_parser,
unk_lang_error,
unk_lang_printchar, /* Print character constant */
unk_lang_printstr,
unk_lang_emit_char,
- unk_lang_create_fundamental_type,
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 */
unk_lang_trampoline, /* Language specific skip_trampoline */
- value_of_this, /* value_of_this */
+ "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 */
unk_op_print_tab, /* expression operators for printing */
1, /* c-style arrays */
0, /* String lower bound */
- NULL,
default_word_break_characters,
+ default_make_symbol_completion_list,
unknown_language_arch_info, /* la_language_arch_info. */
default_print_array_index,
+ default_pass_by_reference,
+ default_get_string,
LANG_MAGIC
};
{
"local",
language_auto,
- NULL,
range_check_off,
type_check_off,
case_sensitive_on,
array_row_major,
+ macro_expansion_no,
&exp_descriptor_standard,
unk_lang_parser,
unk_lang_error,
unk_lang_printchar, /* Print character constant */
unk_lang_printstr,
unk_lang_emit_char,
- unk_lang_create_fundamental_type,
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 */
unk_lang_trampoline, /* Language specific skip_trampoline */
- value_of_this, /* value_of_this */
+ "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 */
unk_op_print_tab, /* expression operators for printing */
1, /* c-style arrays */
0, /* String lower bound */
- NULL,
default_word_break_characters,
+ default_make_symbol_completion_list,
unknown_language_arch_info, /* la_language_arch_info. */
default_print_array_index,
+ default_pass_by_reference,
+ default_get_string,
LANG_MAGIC
};
\f
{
struct language_gdbarch *ld = gdbarch_data (gdbarch,
language_gdbarch_data);
- if (ld->arch_info[la->la_language].string_char_type != NULL)
- return ld->arch_info[la->la_language].string_char_type;
- else
- return (*la->string_char_type);
+ return ld->arch_info[la->la_language].string_char_type;
}
struct type *
-language_lookup_primitive_type_by_name (const struct language_defn *la,
- struct gdbarch *gdbarch,
- const char *name)
+language_bool_type (const struct language_defn *la,
+ struct gdbarch *gdbarch)
{
struct language_gdbarch *ld = gdbarch_data (gdbarch,
language_gdbarch_data);
- if (ld->arch_info[la->la_language].primitive_type_vector != NULL)
+
+ if (ld->arch_info[la->la_language].bool_type_symbol)
{
- struct type *const *p;
- for (p = ld->arch_info[la->la_language].primitive_type_vector;
- (*p) != NULL;
- p++)
+ struct symbol *sym;
+ sym = lookup_symbol (ld->arch_info[la->la_language].bool_type_symbol,
+ NULL, VAR_DOMAIN, NULL);
+ if (sym)
{
- if (strcmp (TYPE_NAME (*p), name) == 0)
- return (*p);
+ struct type *type = SYMBOL_TYPE (sym);
+ if (type && TYPE_CODE (type) == TYPE_CODE_BOOL)
+ return type;
}
}
- else
+
+ return ld->arch_info[la->la_language].bool_type_default;
+}
+
+struct type *
+language_lookup_primitive_type_by_name (const struct language_defn *la,
+ struct gdbarch *gdbarch,
+ const char *name)
+{
+ struct language_gdbarch *ld = gdbarch_data (gdbarch,
+ language_gdbarch_data);
+ struct type *const *p;
+ for (p = ld->arch_info[la->la_language].primitive_type_vector;
+ (*p) != NULL;
+ p++)
{
- struct type **const *p;
- for (p = current_language->la_builtin_type_vector; *p != NULL; p++)
- {
- if (strcmp (TYPE_NAME (**p), name) == 0)
- return (**p);
- }
+ if (strcmp (TYPE_NAME (*p), name) == 0)
+ return (*p);
}
return (NULL);
}
void
_initialize_language (void)
{
- struct cmd_list_element *set, *show;
+ static const char *type_or_range_names[]
+ = { "on", "off", "warn", "auto", NULL };
+
+ static const char *case_sensitive_names[]
+ = { "on", "off", "auto", NULL };
language_gdbarch_data
= gdbarch_data_register_post_init (language_gdbarch_post_init);
/* GDB commands for language specific stuff */
- /* FIXME: cagney/2005-02-20: This should be implemented using an
- enum. */
- add_setshow_string_noescape_cmd ("language", class_support, &language, _("\
-Set the current source language."), _("\
-Show the current source language."), NULL,
- set_language_command,
- show_language_command,
- &setlist, &showlist);
-
add_prefix_cmd ("check", no_class, set_check,
_("Set the status of the type/range checker."),
&setchecklist, "set check ", 0, &setlist);
add_alias_cmd ("c", "check", no_class, 1, &showlist);
add_alias_cmd ("ch", "check", no_class, 1, &showlist);
- /* FIXME: cagney/2005-02-20: This should be implemented using an
- enum. */
- add_setshow_string_noescape_cmd ("type", class_support, &type, _("\
+ add_setshow_enum_cmd ("type", class_support, type_or_range_names, &type, _("\
Set type checking. (on/warn/off/auto)"), _("\
Show type checking. (on/warn/off/auto)"), NULL,
- set_type_command,
- show_type_command,
- &setchecklist, &showchecklist);
+ set_type_command,
+ show_type_command,
+ &setchecklist, &showchecklist);
- /* FIXME: cagney/2005-02-20: This should be implemented using an
- enum. */
- add_setshow_string_noescape_cmd ("range", class_support, &range, _("\
+ add_setshow_enum_cmd ("range", class_support, type_or_range_names,
+ &range, _("\
Set range checking. (on/warn/off/auto)"), _("\
Show range checking. (on/warn/off/auto)"), NULL,
- set_range_command,
- show_range_command,
- &setchecklist, &showchecklist);
-
- /* FIXME: cagney/2005-02-20: This should be implemented using an
- enum. */
- add_setshow_string_noescape_cmd ("case-sensitive", class_support,
- &case_sensitive, _("\
+ set_range_command,
+ show_range_command,
+ &setchecklist, &showchecklist);
+
+ add_setshow_enum_cmd ("case-sensitive", class_support, case_sensitive_names,
+ &case_sensitive, _("\
Set case sensitivity in name search. (on/off/auto)"), _("\
Show case sensitivity in name search. (on/off/auto)"), _("\
For Fortran the default is off; for other languages the default is on."),
- set_case_command,
- show_case_command,
- &setlist, &showlist);
+ set_case_command,
+ show_case_command,
+ &setlist, &showlist);
- add_language (&unknown_language_defn);
- add_language (&local_language_defn);
add_language (&auto_language_defn);
+ add_language (&local_language_defn);
+ add_language (&unknown_language_defn);
- language = savestring ("auto", strlen ("auto"));
- type = savestring ("auto", strlen ("auto"));
- range = savestring ("auto", strlen ("auto"));
- case_sensitive = savestring ("auto",strlen ("auto"));
+ language = xstrdup ("auto");
+ type = xstrdup ("auto");
+ range = xstrdup ("auto");
+ case_sensitive = xstrdup ("auto");
/* Have the above take effect */
set_language (language_auto);