From: Andrew Cagney Date: Wed, 28 Jul 2004 02:46:24 +0000 (+0000) Subject: 2004-07-27 Andrew Cagney X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f290d38e06f4f311d4fe339e50afa3fd57fc1b4b;p=binutils-gdb.git 2004-07-27 Andrew Cagney * 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b64f3a513cd..4e81d906a99 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,32 @@ +2004-07-27 Andrew Cagney + + * 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. + 2004-07-27 Andrew Cagney * gdbtypes.h (struct builtin_type): Declare. diff --git a/gdb/c-lang.c b/gdb/c-lang.c index 19c08dc4415..a9b3ab0e4ac 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -569,6 +569,7 @@ const struct language_defn c_language_defn = 0, /* String lower bound */ &builtin_type_char, /* Type of string elements */ default_word_break_characters, + NULL, /* FIXME: la_language_arch_info. */ LANG_MAGIC }; @@ -629,6 +630,7 @@ const struct language_defn cplus_language_defn = 0, /* String lower bound */ &builtin_type_char, /* Type of string elements */ default_word_break_characters, + NULL, /* FIXME: la_language_arch_info. */ LANG_MAGIC }; @@ -666,6 +668,7 @@ const struct language_defn asm_language_defn = 0, /* String lower bound */ &builtin_type_char, /* Type of string elements */ default_word_break_characters, + NULL, /* FIXME: la_language_arch_info. */ LANG_MAGIC }; @@ -708,6 +711,7 @@ const struct language_defn minimal_language_defn = 0, /* String lower bound */ &builtin_type_char, /* Type of string elements */ default_word_break_characters, + NULL, /* FIXME: la_language_arch_info. */ LANG_MAGIC }; diff --git a/gdb/defs.h b/gdb/defs.h index deee6bfd4dc..95b7e818959 100644 --- a/gdb/defs.h +++ b/gdb/defs.h @@ -220,7 +220,8 @@ enum language language_asm, /* Assembly language */ language_scm, /* Scheme / Guile */ language_pascal, /* Pascal */ - language_minimal /* All other languages, minimal support only */ + language_minimal, /* All other languages, minimal support only */ + nr_languages }; enum precision_type diff --git a/gdb/f-lang.c b/gdb/f-lang.c index 4219d4539e4..e354cad00e5 100644 --- a/gdb/f-lang.c +++ b/gdb/f-lang.c @@ -488,6 +488,7 @@ const struct language_defn f_language_defn = 1, /* String lower bound */ &builtin_type_f_character, /* Type of string elements */ default_word_break_characters, + NULL, /* FIXME: la_language_arch_info. */ LANG_MAGIC }; diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 3a28a299fca..c626e9bd636 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -774,8 +774,12 @@ create_array_type (struct type *result_type, struct type *element_type, struct type * create_string_type (struct type *result_type, struct type *range_type) { + struct type *string_char_type; + + string_char_type = language_string_char_type (current_language, + current_gdbarch); result_type = create_array_type (result_type, - *current_language->string_char_type, + string_char_type, range_type); TYPE_CODE (result_type) = TYPE_CODE_STRING; return (result_type); @@ -1032,16 +1036,9 @@ type_name_no_tag (const struct type *type) struct type * lookup_primitive_typename (char *name) { - 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); + return language_lookup_primative_type_by_name (current_language, + current_gdbarch, + name); } /* Lookup a typedef or primitive type named NAME, diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c index 1fb8cd2d2ba..3f68ec4051f 100644 --- a/gdb/jv-lang.c +++ b/gdb/jv-lang.c @@ -1114,6 +1114,7 @@ const struct language_defn java_language_defn = 0, /* String lower bound */ &builtin_type_char, /* Type of string elements */ default_word_break_characters, + NULL, /* FIXME: la_language_arch_info. */ LANG_MAGIC }; diff --git a/gdb/language.c b/gdb/language.c index ec03a47879c..b8ef8c9cb14 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, diff --git a/gdb/language.h b/gdb/language.h index bbb45f6c7b8..511c1cbe0ea 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -137,6 +137,26 @@ struct language_format_info char *la_format_suffix; /* Suffix for custom format string */ }; +/* Per architecture (OS/ABI) language information. */ + +struct language_arch_info +{ + /* Its primative types. This is a vector ended by a NULL pointer. + These types can be specified by name in parsing types in + expressions, regardless of whether the program being debugged + actually defines such a type. */ + struct type **primative_type_vector; + /* Type of elements of strings. */ + struct type *string_char_type; +}; + +struct type *language_string_char_type (const struct language_defn *l, + struct gdbarch *gdbarch); + +struct type *language_lookup_primative_type_by_name (const struct language_defn *l, + struct gdbarch *gdbarch, + const char *name); + /* Structure tying together assorted information about a language. */ struct language_defn @@ -284,6 +304,10 @@ struct language_defn /* The list of characters forming word boundaries. */ char *(*la_word_break_characters) (void); + /* The per-architecture (OS/ABI) language information. */ + void (*la_language_arch_info) (struct gdbarch *, + struct language_arch_info *); + /* Add fields above this point, so the magic number is always last. */ /* Magic number for compat checking */ diff --git a/gdb/m2-lang.c b/gdb/m2-lang.c index 1ab5d3b7a4e..722805e2faf 100644 --- a/gdb/m2-lang.c +++ b/gdb/m2-lang.c @@ -441,6 +441,7 @@ const struct language_defn m2_language_defn = 0, /* String lower bound */ &builtin_type_m2_char, /* Type of string elements */ default_word_break_characters, + NULL, /* FIXME: la_language_arch_info. */ LANG_MAGIC }; diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c index bcd487378bc..b9e48971533 100644 --- a/gdb/objc-lang.c +++ b/gdb/objc-lang.c @@ -685,6 +685,7 @@ const struct language_defn objc_language_defn = { 0, /* String lower bound */ &builtin_type_char, /* Type of string elements */ default_word_break_characters, + NULL, /* FIXME: la_language_arch_info. */ LANG_MAGIC }; diff --git a/gdb/p-lang.c b/gdb/p-lang.c index 3866e2cd660..115bfe106fa 100644 --- a/gdb/p-lang.c +++ b/gdb/p-lang.c @@ -477,6 +477,7 @@ const struct language_defn pascal_language_defn = 0, /* String lower bound */ &builtin_type_char, /* Type of string elements */ default_word_break_characters, + NULL, /* FIXME: la_language_arch_info. */ LANG_MAGIC }; diff --git a/gdb/scm-lang.c b/gdb/scm-lang.c index 665ac1b96bf..809f7030430 100644 --- a/gdb/scm-lang.c +++ b/gdb/scm-lang.c @@ -276,6 +276,7 @@ const struct language_defn scm_language_defn = 0, /* String lower bound */ &builtin_type_char, /* Type of string elements */ default_word_break_characters, + NULL, /* FIXME: la_language_arch_info. */ LANG_MAGIC }; diff --git a/gdb/values.c b/gdb/values.c index a42e53a298b..eaf3765c31a 100644 --- a/gdb/values.c +++ b/gdb/values.c @@ -1170,15 +1170,18 @@ value_from_string (char *ptr) struct value *val; int len = strlen (ptr); int lowbound = current_language->string_lower_bound; - struct type *rangetype = - create_range_type ((struct type *) NULL, - builtin_type_int, - lowbound, len + lowbound - 1); - struct type *stringtype = - create_array_type ((struct type *) NULL, - *current_language->string_char_type, - rangetype); - + struct type *string_char_type; + struct type *rangetype; + struct type *stringtype; + + rangetype = create_range_type ((struct type *) NULL, + builtin_type_int, + lowbound, len + lowbound - 1); + string_char_type = language_string_char_type (current_language, + current_gdbarch); + stringtype = create_array_type ((struct type *) NULL, + string_char_type, + rangetype); val = allocate_value (stringtype); memcpy (VALUE_CONTENTS_RAW (val), ptr, len); return val;