2004-07-27 Andrew Cagney <cagney@gnu.org>

* defs.h (enum language): Add nr_languages.
	* language.h (struct language_arch_info): Define.
	(struct language_defn): Add la_language_arch_info.
	(language_lookup_primative_type_by_name): Declare.
	(language_string_char_type): Declare.
	* language.c (_initialize_language, language_gdbarch_post_init)
	(struct language_gdbarch, language_gdbarch_data): Implement
	per-architecture language information.
	(unknown_language_arch_info, language_string_char_type)
	(language_lookup_primative_type_by_name): New functions.
	(unknown_language_defn, auto_language_defn)
	(local_language_defn): Set la_language_arch_info to
	unknown_language_arch_info.
	(unknown_builtin_types): Delete.
	* gdbtypes.c (lookup_primitive_typename): Use
	language_lookup_primative_type_by_name.
	(create_string_type): Use language_string_char_type.
	* values.c (value_from_string): Use language_string_char_type.
	* scm-lang.c (scm_language_defn): Add NULL la_language_arch_info.
	* p-lang.c (pascal_language_defn): Ditto.
	* m2-lang.c (m2_language_defn): Ditto.
	* jv-lang.c (java_language_defn): Ditto.
	* objc-lang.c (objc_language_defn): Ditto.
	* f-lang.c (f_language_defn): Ditto.
	* c-lang.c (c_language_defn, cplus_language_defn)
	(asm_language_defn, minimal_language_defn): Ditto.
This commit is contained in:
Andrew Cagney 2004-07-28 02:46:24 +00:00
parent 000177f0ad
commit f290d38e06
13 changed files with 175 additions and 30 deletions

View file

@ -1273,20 +1273,25 @@ static char *unk_lang_class_name (const char *mangled)
return NULL;
}
static struct type **const (unknown_builtin_types[]) =
{
0
};
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->primative_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,
@ -1314,8 +1319,9 @@ const struct language_defn unknown_language_defn =
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
};
@ -1324,7 +1330,7 @@ const struct language_defn auto_language_defn =
{
"auto",
language_auto,
&unknown_builtin_types[0],
NULL,
range_check_off,
type_check_off,
case_sensitive_on,
@ -1352,8 +1358,9 @@ const struct language_defn auto_language_defn =
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
};
@ -1361,7 +1368,7 @@ const struct language_defn local_language_defn =
{
"local",
language_auto,
&unknown_builtin_types[0],
NULL,
range_check_off,
type_check_off,
case_sensitive_on,
@ -1389,11 +1396,82 @@ const struct language_defn local_language_defn =
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
};
/* 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_primative_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].primative_type_vector != NULL)
{
struct type *const *p;
for (p = ld->arch_info[la->la_language].primative_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
@ -1401,6 +1479,9 @@ _initialize_language (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,