aboutsummaryrefslogtreecommitdiff
path: root/gdb/language.c
diff options
context:
space:
mode:
authorAndrew Cagney <cagney@redhat.com>2004-07-28 02:46:24 +0000
committerAndrew Cagney <cagney@redhat.com>2004-07-28 02:46:24 +0000
commitf290d38e06f4f311d4fe339e50afa3fd57fc1b4b (patch)
tree3d25891ebde1dcd7d1ea5416a678c25f6b30eb04 /gdb/language.c
parent000177f0ad8107eeacc1fceaec5ca72ad9725099 (diff)
downloadgdb-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.c101
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,