xref: /openbsd-src/gnu/usr.bin/binutils/gdb/scm-lang.c (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
1e93f7393Sniklas /* Scheme/Guile language support routines for GDB, the GNU debugger.
2b725ae77Skettenis 
3b725ae77Skettenis    Copyright 1995, 1996, 1998, 2000, 2001, 2002, 2003, 2004 Free Software
4b725ae77Skettenis    Foundation, Inc.
5e93f7393Sniklas 
6e93f7393Sniklas    This file is part of GDB.
7e93f7393Sniklas 
8e93f7393Sniklas    This program is free software; you can redistribute it and/or modify
9e93f7393Sniklas    it under the terms of the GNU General Public License as published by
10e93f7393Sniklas    the Free Software Foundation; either version 2 of the License, or
11e93f7393Sniklas    (at your option) any later version.
12e93f7393Sniklas 
13e93f7393Sniklas    This program is distributed in the hope that it will be useful,
14e93f7393Sniklas    but WITHOUT ANY WARRANTY; without even the implied warranty of
15e93f7393Sniklas    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16e93f7393Sniklas    GNU General Public License for more details.
17e93f7393Sniklas 
18e93f7393Sniklas    You should have received a copy of the GNU General Public License
19e93f7393Sniklas    along with this program; if not, write to the Free Software
20b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330,
21b725ae77Skettenis    Boston, MA 02111-1307, USA.  */
22e93f7393Sniklas 
23e93f7393Sniklas #include "defs.h"
24e93f7393Sniklas #include "symtab.h"
25e93f7393Sniklas #include "gdbtypes.h"
26e93f7393Sniklas #include "expression.h"
27e93f7393Sniklas #include "parser-defs.h"
28e93f7393Sniklas #include "language.h"
29e93f7393Sniklas #include "value.h"
30e93f7393Sniklas #include "c-lang.h"
31e93f7393Sniklas #include "scm-lang.h"
32e93f7393Sniklas #include "scm-tags.h"
33b725ae77Skettenis #include "source.h"
34e93f7393Sniklas #include "gdb_string.h"
35e93f7393Sniklas #include "gdbcore.h"
36b725ae77Skettenis #include "infcall.h"
37e93f7393Sniklas 
38b725ae77Skettenis extern void _initialize_scheme_language (void);
39b725ae77Skettenis static struct value *evaluate_subexp_scm (struct type *, struct expression *,
40b725ae77Skettenis 				      int *, enum noside);
41b725ae77Skettenis static struct value *scm_lookup_name (char *);
42b725ae77Skettenis static int in_eval_c (void);
43b725ae77Skettenis static void scm_printstr (struct ui_file * stream, char *string,
44b725ae77Skettenis 			  unsigned int length, int width,
45b725ae77Skettenis 			  int force_ellipses);
46e93f7393Sniklas 
47e93f7393Sniklas struct type *builtin_type_scm;
48e93f7393Sniklas 
49e93f7393Sniklas void
scm_printchar(int c,struct ui_file * stream)50b725ae77Skettenis scm_printchar (int c, struct ui_file *stream)
51e93f7393Sniklas {
52e93f7393Sniklas   fprintf_filtered (stream, "#\\%c", c);
53e93f7393Sniklas }
54e93f7393Sniklas 
55e93f7393Sniklas static void
scm_printstr(struct ui_file * stream,char * string,unsigned int length,int width,int force_ellipses)56b725ae77Skettenis scm_printstr (struct ui_file *stream, char *string, unsigned int length,
57b725ae77Skettenis 	      int width, int force_ellipses)
58e93f7393Sniklas {
59e93f7393Sniklas   fprintf_filtered (stream, "\"%s\"", string);
60e93f7393Sniklas }
61e93f7393Sniklas 
62e93f7393Sniklas int
is_scmvalue_type(struct type * type)63b725ae77Skettenis is_scmvalue_type (struct type *type)
64e93f7393Sniklas {
65e93f7393Sniklas   if (TYPE_CODE (type) == TYPE_CODE_INT
66e93f7393Sniklas       && TYPE_NAME (type) && strcmp (TYPE_NAME (type), "SCM") == 0)
67e93f7393Sniklas     {
68e93f7393Sniklas       return 1;
69e93f7393Sniklas     }
70e93f7393Sniklas   return 0;
71e93f7393Sniklas }
72e93f7393Sniklas 
73e93f7393Sniklas /* Get the INDEX'th SCM value, assuming SVALUE is the address
74e93f7393Sniklas    of the 0'th one.  */
75e93f7393Sniklas 
76e93f7393Sniklas LONGEST
scm_get_field(LONGEST svalue,int index)77b725ae77Skettenis scm_get_field (LONGEST svalue, int index)
78e93f7393Sniklas {
79e93f7393Sniklas   char buffer[20];
80e93f7393Sniklas   read_memory (SCM2PTR (svalue) + index * TYPE_LENGTH (builtin_type_scm),
81e93f7393Sniklas 	       buffer, TYPE_LENGTH (builtin_type_scm));
82e93f7393Sniklas   return extract_signed_integer (buffer, TYPE_LENGTH (builtin_type_scm));
83e93f7393Sniklas }
84e93f7393Sniklas 
85e93f7393Sniklas /* Unpack a value of type TYPE in buffer VALADDR as an integer
86e93f7393Sniklas    (if CONTEXT == TYPE_CODE_IN), a pointer (CONTEXT == TYPE_CODE_PTR),
87e93f7393Sniklas    or Boolean (CONTEXT == TYPE_CODE_BOOL).  */
88e93f7393Sniklas 
89e93f7393Sniklas LONGEST
scm_unpack(struct type * type,const char * valaddr,enum type_code context)90b725ae77Skettenis scm_unpack (struct type *type, const char *valaddr, enum type_code context)
91e93f7393Sniklas {
92e93f7393Sniklas   if (is_scmvalue_type (type))
93e93f7393Sniklas     {
94e93f7393Sniklas       LONGEST svalue = extract_signed_integer (valaddr, TYPE_LENGTH (type));
95e93f7393Sniklas       if (context == TYPE_CODE_BOOL)
96e93f7393Sniklas 	{
97e93f7393Sniklas 	  if (svalue == SCM_BOOL_F)
98e93f7393Sniklas 	    return 0;
99e93f7393Sniklas 	  else
100e93f7393Sniklas 	    return 1;
101e93f7393Sniklas 	}
102b725ae77Skettenis       switch (7 & (int) svalue)
103e93f7393Sniklas 	{
104b725ae77Skettenis 	case 2:
105b725ae77Skettenis 	case 6:		/* fixnum */
106e93f7393Sniklas 	  return svalue >> 2;
107e93f7393Sniklas 	case 4:		/* other immediate value */
108e93f7393Sniklas 	  if (SCM_ICHRP (svalue))	/* character */
109e93f7393Sniklas 	    return SCM_ICHR (svalue);
110e93f7393Sniklas 	  else if (SCM_IFLAGP (svalue))
111e93f7393Sniklas 	    {
112b725ae77Skettenis 	      switch ((int) svalue)
113e93f7393Sniklas 		{
114e93f7393Sniklas #ifndef SICP
115e93f7393Sniklas 		case SCM_EOL:
116e93f7393Sniklas #endif
117e93f7393Sniklas 		case SCM_BOOL_F:
118e93f7393Sniklas 		  return 0;
119e93f7393Sniklas 		case SCM_BOOL_T:
120e93f7393Sniklas 		  return 1;
121e93f7393Sniklas 		}
122e93f7393Sniklas 	    }
123e93f7393Sniklas 	  error ("Value can't be converted to integer.");
124e93f7393Sniklas 	default:
125e93f7393Sniklas 	  return svalue;
126e93f7393Sniklas 	}
127e93f7393Sniklas     }
128e93f7393Sniklas   else
129e93f7393Sniklas     return unpack_long (type, valaddr);
130e93f7393Sniklas }
131e93f7393Sniklas 
132e93f7393Sniklas /* True if we're correctly in Guile's eval.c (the evaluator and apply). */
133e93f7393Sniklas 
134e93f7393Sniklas static int
in_eval_c(void)135b725ae77Skettenis in_eval_c (void)
136e93f7393Sniklas {
137b725ae77Skettenis   struct symtab_and_line cursal = get_current_source_symtab_and_line ();
138b725ae77Skettenis 
139b725ae77Skettenis   if (cursal.symtab && cursal.symtab->filename)
140e93f7393Sniklas     {
141b725ae77Skettenis       char *filename = cursal.symtab->filename;
142e93f7393Sniklas       int len = strlen (filename);
143e93f7393Sniklas       if (len >= 6 && strcmp (filename + len - 6, "eval.c") == 0)
144e93f7393Sniklas 	return 1;
145e93f7393Sniklas     }
146e93f7393Sniklas   return 0;
147e93f7393Sniklas }
148e93f7393Sniklas 
149e93f7393Sniklas /* Lookup a value for the variable named STR.
150e93f7393Sniklas    First lookup in Scheme context (using the scm_lookup_cstr inferior
151e93f7393Sniklas    function), then try lookup_symbol for compiled variables. */
152e93f7393Sniklas 
153b725ae77Skettenis static struct value *
scm_lookup_name(char * str)154b725ae77Skettenis scm_lookup_name (char *str)
155e93f7393Sniklas {
156b725ae77Skettenis   struct value *args[3];
157e93f7393Sniklas   int len = strlen (str);
158b725ae77Skettenis   struct value *func;
159b725ae77Skettenis   struct value *val;
160e93f7393Sniklas   struct symbol *sym;
161e93f7393Sniklas   args[0] = value_allocate_space_in_inferior (len);
162e93f7393Sniklas   args[1] = value_from_longest (builtin_type_int, len);
163e93f7393Sniklas   write_memory (value_as_long (args[0]), str, len);
164e93f7393Sniklas 
165e93f7393Sniklas   if (in_eval_c ()
166e93f7393Sniklas       && (sym = lookup_symbol ("env",
167e93f7393Sniklas 			       expression_context_block,
168b725ae77Skettenis 			       VAR_DOMAIN, (int *) NULL,
169e93f7393Sniklas 			       (struct symtab **) NULL)) != NULL)
170e93f7393Sniklas     args[2] = value_of_variable (sym, expression_context_block);
171e93f7393Sniklas   else
172e93f7393Sniklas     /* FIXME in this case, we should try lookup_symbol first */
173e93f7393Sniklas     args[2] = value_from_longest (builtin_type_scm, SCM_EOL);
174e93f7393Sniklas 
175e93f7393Sniklas   func = find_function_in_inferior ("scm_lookup_cstr");
176e93f7393Sniklas   val = call_function_by_hand (func, 3, args);
177e93f7393Sniklas   if (!value_logical_not (val))
178e93f7393Sniklas     return value_ind (val);
179e93f7393Sniklas 
180e93f7393Sniklas   sym = lookup_symbol (str,
181e93f7393Sniklas 		       expression_context_block,
182b725ae77Skettenis 		       VAR_DOMAIN, (int *) NULL,
183e93f7393Sniklas 		       (struct symtab **) NULL);
184e93f7393Sniklas   if (sym)
185e93f7393Sniklas     return value_of_variable (sym, NULL);
186b725ae77Skettenis   error ("No symbol \"%s\" in current context.", str);
187e93f7393Sniklas }
188e93f7393Sniklas 
189b725ae77Skettenis struct value *
scm_evaluate_string(char * str,int len)190b725ae77Skettenis scm_evaluate_string (char *str, int len)
191e93f7393Sniklas {
192b725ae77Skettenis   struct value *func;
193b725ae77Skettenis   struct value *addr = value_allocate_space_in_inferior (len + 1);
194e93f7393Sniklas   LONGEST iaddr = value_as_long (addr);
195e93f7393Sniklas   write_memory (iaddr, str, len);
196e93f7393Sniklas   /* FIXME - should find and pass env */
197e93f7393Sniklas   write_memory (iaddr + len, "", 1);
198e93f7393Sniklas   func = find_function_in_inferior ("scm_evstr");
199e93f7393Sniklas   return call_function_by_hand (func, 1, &addr);
200e93f7393Sniklas }
201e93f7393Sniklas 
202b725ae77Skettenis static struct value *
evaluate_subexp_scm(struct type * expect_type,struct expression * exp,int * pos,enum noside noside)203b725ae77Skettenis evaluate_subexp_scm (struct type *expect_type, struct expression *exp,
204b725ae77Skettenis 		     int *pos, enum noside noside)
205e93f7393Sniklas {
206e93f7393Sniklas   enum exp_opcode op = exp->elts[*pos].opcode;
207b725ae77Skettenis   int len, pc;
208b725ae77Skettenis   char *str;
209e93f7393Sniklas   switch (op)
210e93f7393Sniklas     {
211e93f7393Sniklas     case OP_NAME:
212e93f7393Sniklas       pc = (*pos)++;
213e93f7393Sniklas       len = longest_to_int (exp->elts[pc + 1].longconst);
214e93f7393Sniklas       (*pos) += 3 + BYTES_TO_EXP_ELEM (len + 1);
215e93f7393Sniklas       if (noside == EVAL_SKIP)
216e93f7393Sniklas 	goto nosideret;
217e93f7393Sniklas       str = &exp->elts[pc + 2].string;
218e93f7393Sniklas       return scm_lookup_name (str);
219e93f7393Sniklas     case OP_EXPRSTRING:
220e93f7393Sniklas       pc = (*pos)++;
221e93f7393Sniklas       len = longest_to_int (exp->elts[pc + 1].longconst);
222e93f7393Sniklas       (*pos) += 3 + BYTES_TO_EXP_ELEM (len + 1);
223e93f7393Sniklas       if (noside == EVAL_SKIP)
224e93f7393Sniklas 	goto nosideret;
225e93f7393Sniklas       str = &exp->elts[pc + 2].string;
226e93f7393Sniklas       return scm_evaluate_string (str, len);
227e93f7393Sniklas     default:;
228e93f7393Sniklas     }
229e93f7393Sniklas   return evaluate_subexp_standard (expect_type, exp, pos, noside);
230e93f7393Sniklas nosideret:
231e93f7393Sniklas   return value_from_longest (builtin_type_long, (LONGEST) 1);
232e93f7393Sniklas }
233e93f7393Sniklas 
234b725ae77Skettenis const struct exp_descriptor exp_descriptor_scm =
235b725ae77Skettenis {
236b725ae77Skettenis   print_subexp_standard,
237b725ae77Skettenis   operator_length_standard,
238b725ae77Skettenis   op_name_standard,
239b725ae77Skettenis   dump_subexp_body_standard,
240b725ae77Skettenis   evaluate_subexp_scm
241b725ae77Skettenis };
242b725ae77Skettenis 
243b725ae77Skettenis const struct language_defn scm_language_defn =
244b725ae77Skettenis {
245e93f7393Sniklas   "scheme",			/* Language name */
246e93f7393Sniklas   language_scm,
247*63addd46Skettenis   NULL,
248e93f7393Sniklas   range_check_off,
249e93f7393Sniklas   type_check_off,
250b725ae77Skettenis   case_sensitive_off,
251*63addd46Skettenis   array_row_major,
252b725ae77Skettenis   &exp_descriptor_scm,
253e93f7393Sniklas   scm_parse,
254e93f7393Sniklas   c_error,
255*63addd46Skettenis   null_post_parser,
256e93f7393Sniklas   scm_printchar,		/* Print a character constant */
257e93f7393Sniklas   scm_printstr,			/* Function to print string constant */
258b725ae77Skettenis   NULL,				/* Function to print a single character */
259e93f7393Sniklas   NULL,				/* Create fundamental type in this language */
260e93f7393Sniklas   c_print_type,			/* Print a type using appropriate syntax */
261e93f7393Sniklas   scm_val_print,		/* Print a value using appropriate syntax */
262e93f7393Sniklas   scm_value_print,		/* Print a top-level value */
263b725ae77Skettenis   NULL,				/* Language specific skip_trampoline */
264b725ae77Skettenis   value_of_this,		/* value_of_this */
265b725ae77Skettenis   basic_lookup_symbol_nonlocal,	/* lookup_symbol_nonlocal */
266b725ae77Skettenis   basic_lookup_transparent_type,/* lookup_transparent_type */
267b725ae77Skettenis   NULL,				/* Language specific symbol demangler */
268*63addd46Skettenis   NULL,				/* Language specific class_name_from_physname */
269e93f7393Sniklas   NULL,				/* expression operators for printing */
270e93f7393Sniklas   1,				/* c-style arrays */
271e93f7393Sniklas   0,				/* String lower bound */
272*63addd46Skettenis   NULL,
273b725ae77Skettenis   default_word_break_characters,
274*63addd46Skettenis   c_language_arch_info,
275e93f7393Sniklas   LANG_MAGIC
276e93f7393Sniklas };
277e93f7393Sniklas 
278e93f7393Sniklas void
_initialize_scheme_language(void)279b725ae77Skettenis _initialize_scheme_language (void)
280e93f7393Sniklas {
281e93f7393Sniklas   add_language (&scm_language_defn);
282e93f7393Sniklas   builtin_type_scm = init_type (TYPE_CODE_INT,
283e93f7393Sniklas 				TARGET_LONG_BIT / TARGET_CHAR_BIT,
284e93f7393Sniklas 				0, "SCM", (struct objfile *) NULL);
285e93f7393Sniklas }
286