aboutsummaryrefslogtreecommitdiff
path: root/gdb/scm-lang.c
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2009-06-03 18:10:06 +0000
committerUlrich Weigand <uweigand@de.ibm.com>2009-06-03 18:10:06 +0000
commit6ceaaae57734058aa008b218f3b44581c5655a56 (patch)
treeb7a322dab44a3faa2f2c4a0c77aa19a098c2430e /gdb/scm-lang.c
parent0a9d309acdc7975ab48ed972899c5d26ee41f72b (diff)
downloadgdb-6ceaaae57734058aa008b218f3b44581c5655a56.zip
gdb-6ceaaae57734058aa008b218f3b44581c5655a56.tar.gz
gdb-6ceaaae57734058aa008b218f3b44581c5655a56.tar.bz2
* scm-lang.c (builtin_type_scm): Remove.
(scm_lookup_name): Add GDBARCH parameter. Use it instead of objfile architecture. Use per-architecture builtin_scm_type instead of builtin_type_scm. (evaluate_exp): Pass expression architecture to scm_lookup_name. (scm_get_field): Add SIZE parameter. Use it instead of TYPE_LENGTH (builtin_type_scm). (build_scm_types): New function. (scm_type_data): New variable. (builtin_scm_type): New function. (_initialize_scheme_language): Do not initialize builtin_type_scm. Register build_scm_types as post-init function for scm_type_data. * scm-exp.c (scm_lreadr): Use per-architecture builtin_scm_type instead of builtin_type_scm. * scm-lang.h (SCM_CAR, SCM_CDR): Pass SCM_SIZE to scm_get_field. (scm_get_field): Add SIZE paramter. (scm_scmval_print): Remove prototype. (builtin_type_scm): Remove. (struct builtin_scm_type): Add structure definition. (builtin_scm_type): Add prototype. * scm-valprint.c (scm_inferior_print): Add TYPE parameter. Use it instead of builtin_core_addr type; do not use objfile architecture. (scm_scmlist_print): Add TYPE parameter. Use it to define SCM_SIZE. Pass type to scm_scmval_print. (scm_ipruk): Add TYPE parameter. Use it to define SCM_SIZE. (scm_scmval_print): Make static. Add TYPE parameter. Use it to define SCM_SIZE. Pass type to scm_ipruk and scm_scmlist_print. (scm_val_print): Pass type to scm_inferior_print and scm_scmval_print.
Diffstat (limited to 'gdb/scm-lang.c')
-rw-r--r--gdb/scm-lang.c51
1 files changed, 33 insertions, 18 deletions
diff --git a/gdb/scm-lang.c b/gdb/scm-lang.c
index e2568c8..b1d7865 100644
--- a/gdb/scm-lang.c
+++ b/gdb/scm-lang.c
@@ -37,11 +37,9 @@
extern void _initialize_scheme_language (void);
static struct value *evaluate_subexp_scm (struct type *, struct expression *,
int *, enum noside);
-static struct value *scm_lookup_name (char *);
+static struct value *scm_lookup_name (struct gdbarch *, char *);
static int in_eval_c (void);
-struct type *builtin_type_scm;
-
void
scm_printchar (int c, struct type *type, struct ui_file *stream)
{
@@ -70,12 +68,11 @@ is_scmvalue_type (struct type *type)
of the 0'th one. */
LONGEST
-scm_get_field (LONGEST svalue, int index)
+scm_get_field (LONGEST svalue, int index, int size)
{
gdb_byte buffer[20];
- read_memory (SCM2PTR (svalue) + index * TYPE_LENGTH (builtin_type_scm),
- buffer, TYPE_LENGTH (builtin_type_scm));
- return extract_signed_integer (buffer, TYPE_LENGTH (builtin_type_scm));
+ read_memory (SCM2PTR (svalue) + index * size, buffer, size);
+ return extract_signed_integer (buffer, size);
}
/* Unpack a value of type TYPE in buffer VALADDR as an integer
@@ -147,18 +144,15 @@ in_eval_c (void)
function), then try lookup_symbol for compiled variables. */
static struct value *
-scm_lookup_name (char *str)
+scm_lookup_name (struct gdbarch *gdbarch, char *str)
{
- struct objfile *objf;
- struct gdbarch *gdbarch;
struct value *args[3];
int len = strlen (str);
struct value *func;
struct value *val;
struct symbol *sym;
- func = find_function_in_inferior ("scm_lookup_cstr", &objf);
- gdbarch = get_objfile_arch (objf);
+ func = find_function_in_inferior ("scm_lookup_cstr", NULL);
args[0] = value_allocate_space_in_inferior (len);
args[1] = value_from_longest (builtin_type (gdbarch)->builtin_int, len);
@@ -171,7 +165,8 @@ scm_lookup_name (char *str)
args[2] = value_of_variable (sym, expression_context_block);
else
/* FIXME in this case, we should try lookup_symbol first */
- args[2] = value_from_longest (builtin_type_scm, SCM_EOL);
+ args[2] = value_from_longest (builtin_scm_type (gdbarch)->builtin_scm,
+ SCM_EOL);
val = call_function_by_hand (func, 3, args);
if (!value_logical_not (val))
@@ -214,7 +209,7 @@ evaluate_exp (struct type *expect_type, struct expression *exp,
if (noside == EVAL_SKIP)
goto nosideret;
str = &exp->elts[pc + 2].string;
- return scm_lookup_name (str);
+ return scm_lookup_name (exp->gdbarch, str);
case OP_STRING:
pc = (*pos)++;
len = longest_to_int (exp->elts[pc + 1].longconst);
@@ -277,12 +272,32 @@ const struct language_defn scm_language_defn =
LANG_MAGIC
};
+static void *
+build_scm_types (struct gdbarch *gdbarch)
+{
+ struct builtin_scm_type *builtin_scm_type
+ = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct builtin_scm_type);
+
+ builtin_scm_type->builtin_scm =
+ init_type (TYPE_CODE_INT,
+ gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT,
+ 0, "SCM", (struct objfile *) NULL);
+
+ return builtin_scm_type;
+}
+
+static struct gdbarch_data *scm_type_data;
+
+const struct builtin_scm_type *
+builtin_scm_type (struct gdbarch *gdbarch)
+{
+ return gdbarch_data (gdbarch, scm_type_data);
+}
+
void
_initialize_scheme_language (void)
{
+ scm_type_data = gdbarch_data_register_post_init (build_scm_types);
+
add_language (&scm_language_defn);
- builtin_type_scm =
- init_type (TYPE_CODE_INT,
- gdbarch_long_bit (current_gdbarch) / TARGET_CHAR_BIT,
- 0, "SCM", (struct objfile *) NULL);
}