/* Multiple source language support for GDB.
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000,
- 2001, 2002, 2003 Free Software Foundation, Inc.
+ 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
Contributed by the Department of Computer Science at the State University
of New York at Buffalo.
/* Search the list of languages for a match. */
for (i = 0; i < languages_size; i++)
{
- if (STREQ (languages[i]->la_name, language))
+ if (strcmp (languages[i]->la_name, language) == 0)
{
/* Found it! Go into manual mode, and use this language. */
if (languages[i]->la_language == language_auto)
static void
set_type_command (char *ignore, int from_tty)
{
- if (STREQ (type, "on"))
+ if (strcmp (type, "on") == 0)
{
type_check = type_check_on;
type_mode = type_mode_manual;
}
- else if (STREQ (type, "warn"))
+ else if (strcmp (type, "warn") == 0)
{
type_check = type_check_warn;
type_mode = type_mode_manual;
}
- else if (STREQ (type, "off"))
+ else if (strcmp (type, "off") == 0)
{
type_check = type_check_off;
type_mode = type_mode_manual;
}
- else if (STREQ (type, "auto"))
+ else if (strcmp (type, "auto") == 0)
{
type_mode = type_mode_auto;
set_type_range_case ();
static void
set_range_command (char *ignore, int from_tty)
{
- if (STREQ (range, "on"))
+ if (strcmp (range, "on") == 0)
{
range_check = range_check_on;
range_mode = range_mode_manual;
}
- else if (STREQ (range, "warn"))
+ else if (strcmp (range, "warn") == 0)
{
range_check = range_check_warn;
range_mode = range_mode_manual;
}
- else if (STREQ (range, "off"))
+ else if (strcmp (range, "off") == 0)
{
range_check = range_check_off;
range_mode = range_mode_manual;
}
- else if (STREQ (range, "auto"))
+ else if (strcmp (range, "auto") == 0)
{
range_mode = range_mode_auto;
set_type_range_case ();
static void
set_case_command (char *ignore, int from_tty)
{
- if (STREQ (case_sensitive, "on"))
+ if (DEPRECATED_STREQ (case_sensitive, "on"))
{
case_sensitivity = case_sensitive_on;
case_mode = case_mode_manual;
}
- else if (STREQ (case_sensitive, "off"))
+ else if (DEPRECATED_STREQ (case_sensitive, "off"))
{
case_sensitivity = case_sensitive_off;
case_mode = case_mode_manual;
}
- else if (STREQ (case_sensitive, "auto"))
+ else if (DEPRECATED_STREQ (case_sensitive, "auto"))
{
case_mode = case_mode_auto;
set_type_range_case ();
int i;
for (i = 0; i < languages_size; i++)
- if (STREQ (languages[i]->la_name, str))
+ if (DEPRECATED_STREQ (languages[i]->la_name, str))
return languages[i]->la_language;
return language_unknown;
return NULL;
}
+/* Return class name from physname or NULL. */
+char *
+language_class_name_from_physname (const struct language_defn *current_language,
+ const char *physname)
+{
+ if (current_language != NULL && current_language->la_class_name_from_physname)
+ return current_language->la_class_name_from_physname (physname);
+ return NULL;
+}
+
+/* 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. */
+
+char *
+default_word_break_characters (void)
+{
+ return " \t\n!@#$%^&*()+=|~`}{[]\"';:?/>.<,-";
+}
/* Define the language that is no language. */
return cplus_demangle (mangled, options);
}
-
-static struct type **const (unknown_builtin_types[]) =
+static char *unk_lang_class_name (const char *mangled)
{
- 0
-};
+ return NULL;
+}
+
static const struct op_print unk_op_print_tab[] =
{
{NULL, OP_NULL, PREC_NULL, 0}
};
+static void
+unknown_language_arch_info (struct gdbarch *gdbarch,
+ struct language_arch_info *lai)
+{
+ lai->string_char_type = builtin_type (gdbarch)->builtin_char;
+ lai->primitive_type_vector = GDBARCH_OBSTACK_CALLOC (gdbarch, 1,
+ struct type *);
+}
+
const struct language_defn unknown_language_defn =
{
"unknown",
language_unknown,
- &unknown_builtin_types[0],
+ NULL,
range_check_off,
type_check_off,
case_sensitive_on,
&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_trampoline, /* Language specific skip_trampoline */
value_of_this, /* value_of_this */
basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
+ basic_lookup_transparent_type,/* lookup_transparent_type */
unk_lang_demangle, /* Language specific symbol demangler */
+ unk_lang_class_name, /* Language specific class_name_from_physname */
{"", "", "", ""}, /* Binary format info */
{"0%lo", "0", "o", ""}, /* Octal format info */
{"%ld", "", "d", ""}, /* Decimal format info */
unk_op_print_tab, /* expression operators for printing */
1, /* c-style arrays */
0, /* String lower bound */
- &builtin_type_char, /* Type of string elements */
+ NULL,
+ default_word_break_characters,
+ unknown_language_arch_info, /* la_language_arch_info. */
LANG_MAGIC
};
{
"auto",
language_auto,
- &unknown_builtin_types[0],
+ NULL,
range_check_off,
type_check_off,
case_sensitive_on,
&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_trampoline, /* Language specific skip_trampoline */
value_of_this, /* value_of_this */
basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
+ basic_lookup_transparent_type,/* lookup_transparent_type */
unk_lang_demangle, /* Language specific symbol demangler */
+ unk_lang_class_name, /* Language specific class_name_from_physname */
{"", "", "", ""}, /* Binary format info */
{"0%lo", "0", "o", ""}, /* Octal format info */
{"%ld", "", "d", ""}, /* Decimal format info */
unk_op_print_tab, /* expression operators for printing */
1, /* c-style arrays */
0, /* String lower bound */
- &builtin_type_char, /* Type of string elements */
+ NULL,
+ default_word_break_characters,
+ unknown_language_arch_info, /* la_language_arch_info. */
LANG_MAGIC
};
{
"local",
language_auto,
- &unknown_builtin_types[0],
+ NULL,
range_check_off,
type_check_off,
case_sensitive_on,
&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_trampoline, /* Language specific skip_trampoline */
value_of_this, /* value_of_this */
basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
+ basic_lookup_transparent_type,/* lookup_transparent_type */
unk_lang_demangle, /* Language specific symbol demangler */
+ unk_lang_class_name, /* Language specific class_name_from_physname */
{"", "", "", ""}, /* Binary format info */
{"0%lo", "0", "o", ""}, /* Octal format info */
{"%ld", "", "d", ""}, /* Decimal format info */
unk_op_print_tab, /* expression operators for printing */
1, /* c-style arrays */
0, /* String lower bound */
- &builtin_type_char, /* Type of string elements */
+ NULL,
+ default_word_break_characters,
+ unknown_language_arch_info, /* la_language_arch_info. */
LANG_MAGIC
};
\f
+/* Per-architecture language information. */
+
+static struct gdbarch_data *language_gdbarch_data;
+
+struct language_gdbarch
+{
+ /* A vector of per-language per-architecture info. Indexed by "enum
+ language". */
+ struct language_arch_info arch_info[nr_languages];
+};
+
+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);
+ }
+ return l;
+}
+
+struct type *
+language_string_char_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].string_char_type != NULL)
+ return ld->arch_info[la->la_language].string_char_type;
+ else
+ return (*la->string_char_type);
+}
+
+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);
+ if (ld->arch_info[la->la_language].primitive_type_vector != NULL)
+ {
+ struct type *const *p;
+ for (p = ld->arch_info[la->la_language].primitive_type_vector;
+ (*p) != NULL;
+ p++)
+ {
+ if (strcmp (TYPE_NAME (*p), name) == 0)
+ return (*p);
+ }
+ }
+ else
+ {
+ struct type **const *p;
+ for (p = current_language->la_builtin_type_vector; *p != NULL; p++)
+ {
+ if (strcmp (TYPE_NAME (**p), name) == 0)
+ return (**p);
+ }
+ }
+ return (NULL);
+}
+
/* Initialize the language routines */
void
{
struct cmd_list_element *set, *show;
+ language_gdbarch_data
+ = gdbarch_data_register_post_init (language_gdbarch_post_init);
+
/* GDB commands for language specific stuff */
set = add_set_cmd ("language", class_support, var_string_noescape,
(char *) &language,
"Set the current source language.",
&setlist);
- show = add_show_from_set (set, &showlist);
+ show = deprecated_add_show_from_set (set, &showlist);
set_cmd_cfunc (set, set_language_command);
set_cmd_cfunc (show, show_language_command);
(char *) &type,
"Set type checking. (on/warn/off/auto)",
&setchecklist);
- show = add_show_from_set (set, &showchecklist);
+ show = deprecated_add_show_from_set (set, &showchecklist);
set_cmd_cfunc (set, set_type_command);
set_cmd_cfunc (show, show_type_command);
(char *) &range,
"Set range checking. (on/warn/off/auto)",
&setchecklist);
- show = add_show_from_set (set, &showchecklist);
+ show = deprecated_add_show_from_set (set, &showchecklist);
set_cmd_cfunc (set, set_range_command);
set_cmd_cfunc (show, show_range_command);
"Set case sensitivity in name search. (on/off/auto)\n\
For Fortran the default is off; for other languages the default is on.",
&setlist);
- show = add_show_from_set (set, &showlist);
+ show = deprecated_add_show_from_set (set, &showlist);
set_cmd_cfunc (set, set_case_command);
set_cmd_cfunc (show, show_case_command);