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:
parent
000177f0ad
commit
f290d38e06
@ -1,3 +1,32 @@
|
|||||||
|
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.
|
||||||
|
|
||||||
2004-07-27 Andrew Cagney <cagney@gnu.org>
|
2004-07-27 Andrew Cagney <cagney@gnu.org>
|
||||||
|
|
||||||
* gdbtypes.h (struct builtin_type): Declare.
|
* gdbtypes.h (struct builtin_type): Declare.
|
||||||
|
@ -569,6 +569,7 @@ const struct language_defn c_language_defn =
|
|||||||
0, /* String lower bound */
|
0, /* String lower bound */
|
||||||
&builtin_type_char, /* Type of string elements */
|
&builtin_type_char, /* Type of string elements */
|
||||||
default_word_break_characters,
|
default_word_break_characters,
|
||||||
|
NULL, /* FIXME: la_language_arch_info. */
|
||||||
LANG_MAGIC
|
LANG_MAGIC
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -629,6 +630,7 @@ const struct language_defn cplus_language_defn =
|
|||||||
0, /* String lower bound */
|
0, /* String lower bound */
|
||||||
&builtin_type_char, /* Type of string elements */
|
&builtin_type_char, /* Type of string elements */
|
||||||
default_word_break_characters,
|
default_word_break_characters,
|
||||||
|
NULL, /* FIXME: la_language_arch_info. */
|
||||||
LANG_MAGIC
|
LANG_MAGIC
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -666,6 +668,7 @@ const struct language_defn asm_language_defn =
|
|||||||
0, /* String lower bound */
|
0, /* String lower bound */
|
||||||
&builtin_type_char, /* Type of string elements */
|
&builtin_type_char, /* Type of string elements */
|
||||||
default_word_break_characters,
|
default_word_break_characters,
|
||||||
|
NULL, /* FIXME: la_language_arch_info. */
|
||||||
LANG_MAGIC
|
LANG_MAGIC
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -708,6 +711,7 @@ const struct language_defn minimal_language_defn =
|
|||||||
0, /* String lower bound */
|
0, /* String lower bound */
|
||||||
&builtin_type_char, /* Type of string elements */
|
&builtin_type_char, /* Type of string elements */
|
||||||
default_word_break_characters,
|
default_word_break_characters,
|
||||||
|
NULL, /* FIXME: la_language_arch_info. */
|
||||||
LANG_MAGIC
|
LANG_MAGIC
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -220,7 +220,8 @@ enum language
|
|||||||
language_asm, /* Assembly language */
|
language_asm, /* Assembly language */
|
||||||
language_scm, /* Scheme / Guile */
|
language_scm, /* Scheme / Guile */
|
||||||
language_pascal, /* Pascal */
|
language_pascal, /* Pascal */
|
||||||
language_minimal /* All other languages, minimal support only */
|
language_minimal, /* All other languages, minimal support only */
|
||||||
|
nr_languages
|
||||||
};
|
};
|
||||||
|
|
||||||
enum precision_type
|
enum precision_type
|
||||||
|
@ -488,6 +488,7 @@ const struct language_defn f_language_defn =
|
|||||||
1, /* String lower bound */
|
1, /* String lower bound */
|
||||||
&builtin_type_f_character, /* Type of string elements */
|
&builtin_type_f_character, /* Type of string elements */
|
||||||
default_word_break_characters,
|
default_word_break_characters,
|
||||||
|
NULL, /* FIXME: la_language_arch_info. */
|
||||||
LANG_MAGIC
|
LANG_MAGIC
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -774,8 +774,12 @@ create_array_type (struct type *result_type, struct type *element_type,
|
|||||||
struct type *
|
struct type *
|
||||||
create_string_type (struct type *result_type, struct type *range_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,
|
result_type = create_array_type (result_type,
|
||||||
*current_language->string_char_type,
|
string_char_type,
|
||||||
range_type);
|
range_type);
|
||||||
TYPE_CODE (result_type) = TYPE_CODE_STRING;
|
TYPE_CODE (result_type) = TYPE_CODE_STRING;
|
||||||
return (result_type);
|
return (result_type);
|
||||||
@ -1032,16 +1036,9 @@ type_name_no_tag (const struct type *type)
|
|||||||
struct type *
|
struct type *
|
||||||
lookup_primitive_typename (char *name)
|
lookup_primitive_typename (char *name)
|
||||||
{
|
{
|
||||||
struct type **const *p;
|
return language_lookup_primative_type_by_name (current_language,
|
||||||
|
current_gdbarch,
|
||||||
for (p = current_language->la_builtin_type_vector; *p != NULL; p++)
|
name);
|
||||||
{
|
|
||||||
if (strcmp (TYPE_NAME (**p), name) == 0)
|
|
||||||
{
|
|
||||||
return (**p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Lookup a typedef or primitive type named NAME,
|
/* Lookup a typedef or primitive type named NAME,
|
||||||
|
@ -1114,6 +1114,7 @@ const struct language_defn java_language_defn =
|
|||||||
0, /* String lower bound */
|
0, /* String lower bound */
|
||||||
&builtin_type_char, /* Type of string elements */
|
&builtin_type_char, /* Type of string elements */
|
||||||
default_word_break_characters,
|
default_word_break_characters,
|
||||||
|
NULL, /* FIXME: la_language_arch_info. */
|
||||||
LANG_MAGIC
|
LANG_MAGIC
|
||||||
};
|
};
|
||||||
|
|
||||||
|
101
gdb/language.c
101
gdb/language.c
@ -1273,20 +1273,25 @@ static char *unk_lang_class_name (const char *mangled)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct type **const (unknown_builtin_types[]) =
|
|
||||||
{
|
|
||||||
0
|
|
||||||
};
|
|
||||||
static const struct op_print unk_op_print_tab[] =
|
static const struct op_print unk_op_print_tab[] =
|
||||||
{
|
{
|
||||||
{NULL, OP_NULL, PREC_NULL, 0}
|
{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 =
|
const struct language_defn unknown_language_defn =
|
||||||
{
|
{
|
||||||
"unknown",
|
"unknown",
|
||||||
language_unknown,
|
language_unknown,
|
||||||
&unknown_builtin_types[0],
|
NULL,
|
||||||
range_check_off,
|
range_check_off,
|
||||||
type_check_off,
|
type_check_off,
|
||||||
case_sensitive_on,
|
case_sensitive_on,
|
||||||
@ -1314,8 +1319,9 @@ const struct language_defn unknown_language_defn =
|
|||||||
unk_op_print_tab, /* expression operators for printing */
|
unk_op_print_tab, /* expression operators for printing */
|
||||||
1, /* c-style arrays */
|
1, /* c-style arrays */
|
||||||
0, /* String lower bound */
|
0, /* String lower bound */
|
||||||
&builtin_type_char, /* Type of string elements */
|
NULL,
|
||||||
default_word_break_characters,
|
default_word_break_characters,
|
||||||
|
unknown_language_arch_info, /* la_language_arch_info. */
|
||||||
LANG_MAGIC
|
LANG_MAGIC
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1324,7 +1330,7 @@ const struct language_defn auto_language_defn =
|
|||||||
{
|
{
|
||||||
"auto",
|
"auto",
|
||||||
language_auto,
|
language_auto,
|
||||||
&unknown_builtin_types[0],
|
NULL,
|
||||||
range_check_off,
|
range_check_off,
|
||||||
type_check_off,
|
type_check_off,
|
||||||
case_sensitive_on,
|
case_sensitive_on,
|
||||||
@ -1352,8 +1358,9 @@ const struct language_defn auto_language_defn =
|
|||||||
unk_op_print_tab, /* expression operators for printing */
|
unk_op_print_tab, /* expression operators for printing */
|
||||||
1, /* c-style arrays */
|
1, /* c-style arrays */
|
||||||
0, /* String lower bound */
|
0, /* String lower bound */
|
||||||
&builtin_type_char, /* Type of string elements */
|
NULL,
|
||||||
default_word_break_characters,
|
default_word_break_characters,
|
||||||
|
unknown_language_arch_info, /* la_language_arch_info. */
|
||||||
LANG_MAGIC
|
LANG_MAGIC
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1361,7 +1368,7 @@ const struct language_defn local_language_defn =
|
|||||||
{
|
{
|
||||||
"local",
|
"local",
|
||||||
language_auto,
|
language_auto,
|
||||||
&unknown_builtin_types[0],
|
NULL,
|
||||||
range_check_off,
|
range_check_off,
|
||||||
type_check_off,
|
type_check_off,
|
||||||
case_sensitive_on,
|
case_sensitive_on,
|
||||||
@ -1389,11 +1396,82 @@ const struct language_defn local_language_defn =
|
|||||||
unk_op_print_tab, /* expression operators for printing */
|
unk_op_print_tab, /* expression operators for printing */
|
||||||
1, /* c-style arrays */
|
1, /* c-style arrays */
|
||||||
0, /* String lower bound */
|
0, /* String lower bound */
|
||||||
&builtin_type_char, /* Type of string elements */
|
NULL,
|
||||||
default_word_break_characters,
|
default_word_break_characters,
|
||||||
|
unknown_language_arch_info, /* la_language_arch_info. */
|
||||||
LANG_MAGIC
|
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 */
|
/* Initialize the language routines */
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -1401,6 +1479,9 @@ _initialize_language (void)
|
|||||||
{
|
{
|
||||||
struct cmd_list_element *set, *show;
|
struct cmd_list_element *set, *show;
|
||||||
|
|
||||||
|
language_gdbarch_data
|
||||||
|
= gdbarch_data_register_post_init (language_gdbarch_post_init);
|
||||||
|
|
||||||
/* GDB commands for language specific stuff */
|
/* GDB commands for language specific stuff */
|
||||||
|
|
||||||
set = add_set_cmd ("language", class_support, var_string_noescape,
|
set = add_set_cmd ("language", class_support, var_string_noescape,
|
||||||
|
@ -137,6 +137,26 @@ struct language_format_info
|
|||||||
char *la_format_suffix; /* Suffix for custom format string */
|
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. */
|
/* Structure tying together assorted information about a language. */
|
||||||
|
|
||||||
struct language_defn
|
struct language_defn
|
||||||
@ -284,6 +304,10 @@ struct language_defn
|
|||||||
/* The list of characters forming word boundaries. */
|
/* The list of characters forming word boundaries. */
|
||||||
char *(*la_word_break_characters) (void);
|
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. */
|
/* Add fields above this point, so the magic number is always last. */
|
||||||
/* Magic number for compat checking */
|
/* Magic number for compat checking */
|
||||||
|
|
||||||
|
@ -441,6 +441,7 @@ const struct language_defn m2_language_defn =
|
|||||||
0, /* String lower bound */
|
0, /* String lower bound */
|
||||||
&builtin_type_m2_char, /* Type of string elements */
|
&builtin_type_m2_char, /* Type of string elements */
|
||||||
default_word_break_characters,
|
default_word_break_characters,
|
||||||
|
NULL, /* FIXME: la_language_arch_info. */
|
||||||
LANG_MAGIC
|
LANG_MAGIC
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -685,6 +685,7 @@ const struct language_defn objc_language_defn = {
|
|||||||
0, /* String lower bound */
|
0, /* String lower bound */
|
||||||
&builtin_type_char, /* Type of string elements */
|
&builtin_type_char, /* Type of string elements */
|
||||||
default_word_break_characters,
|
default_word_break_characters,
|
||||||
|
NULL, /* FIXME: la_language_arch_info. */
|
||||||
LANG_MAGIC
|
LANG_MAGIC
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -477,6 +477,7 @@ const struct language_defn pascal_language_defn =
|
|||||||
0, /* String lower bound */
|
0, /* String lower bound */
|
||||||
&builtin_type_char, /* Type of string elements */
|
&builtin_type_char, /* Type of string elements */
|
||||||
default_word_break_characters,
|
default_word_break_characters,
|
||||||
|
NULL, /* FIXME: la_language_arch_info. */
|
||||||
LANG_MAGIC
|
LANG_MAGIC
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -276,6 +276,7 @@ const struct language_defn scm_language_defn =
|
|||||||
0, /* String lower bound */
|
0, /* String lower bound */
|
||||||
&builtin_type_char, /* Type of string elements */
|
&builtin_type_char, /* Type of string elements */
|
||||||
default_word_break_characters,
|
default_word_break_characters,
|
||||||
|
NULL, /* FIXME: la_language_arch_info. */
|
||||||
LANG_MAGIC
|
LANG_MAGIC
|
||||||
};
|
};
|
||||||
|
|
||||||
|
19
gdb/values.c
19
gdb/values.c
@ -1170,15 +1170,18 @@ value_from_string (char *ptr)
|
|||||||
struct value *val;
|
struct value *val;
|
||||||
int len = strlen (ptr);
|
int len = strlen (ptr);
|
||||||
int lowbound = current_language->string_lower_bound;
|
int lowbound = current_language->string_lower_bound;
|
||||||
struct type *rangetype =
|
struct type *string_char_type;
|
||||||
create_range_type ((struct type *) NULL,
|
struct type *rangetype;
|
||||||
builtin_type_int,
|
struct type *stringtype;
|
||||||
lowbound, len + lowbound - 1);
|
|
||||||
struct type *stringtype =
|
|
||||||
create_array_type ((struct type *) NULL,
|
|
||||||
*current_language->string_char_type,
|
|
||||||
rangetype);
|
|
||||||
|
|
||||||
|
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);
|
val = allocate_value (stringtype);
|
||||||
memcpy (VALUE_CONTENTS_RAW (val), ptr, len);
|
memcpy (VALUE_CONTENTS_RAW (val), ptr, len);
|
||||||
return val;
|
return val;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user