diff options
author | Andrew Cagney <cagney@redhat.com> | 2004-07-28 02:46:24 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 2004-07-28 02:46:24 +0000 |
commit | f290d38e06f4f311d4fe339e50afa3fd57fc1b4b (patch) | |
tree | 3d25891ebde1dcd7d1ea5416a678c25f6b30eb04 /gdb/language.c | |
parent | 000177f0ad8107eeacc1fceaec5ca72ad9725099 (diff) | |
download | gdb-f290d38e06f4f311d4fe339e50afa3fd57fc1b4b.zip gdb-f290d38e06f4f311d4fe339e50afa3fd57fc1b4b.tar.gz gdb-f290d38e06f4f311d4fe339e50afa3fd57fc1b4b.tar.bz2 |
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.
Diffstat (limited to 'gdb/language.c')
-rw-r--r-- | gdb/language.c | 101 |
1 files changed, 91 insertions, 10 deletions
diff --git a/gdb/language.c b/gdb/language.c index ec03a47..b8ef8c9 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -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, |