Fix all failing FPXX tests for tx39-elf.
[platform/upstream/binutils.git] / gdb / guile / scm-math.c
1 /* GDB/Scheme support for math operations on values.
2
3    Copyright (C) 2008-2014 Free Software Foundation, Inc.
4
5    This file is part of GDB.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20 /* See README file in this directory for implementation notes, coding
21    conventions, et.al.  */
22
23 #include "defs.h"
24 #include "arch-utils.h"
25 #include "charset.h"
26 #include "cp-abi.h"
27 #include "doublest.h" /* Needed by dfp.h.  */
28 #include "expression.h" /* Needed by dfp.h.  */
29 #include "dfp.h"
30 #include "symtab.h" /* Needed by language.h.  */
31 #include "language.h"
32 #include "valprint.h"
33 #include "value.h"
34 #include "guile-internal.h"
35
36 /* Note: Use target types here to remain consistent with the values system in
37    GDB (which uses target arithmetic).  */
38
39 enum valscm_unary_opcode
40 {
41   VALSCM_NOT,
42   VALSCM_NEG,
43   VALSCM_NOP,
44   VALSCM_ABS,
45   /* Note: This is Scheme's "logical not", not GDB's.
46      GDB calls this UNOP_COMPLEMENT.  */
47   VALSCM_LOGNOT
48 };
49
50 enum valscm_binary_opcode
51 {
52   VALSCM_ADD,
53   VALSCM_SUB,
54   VALSCM_MUL,
55   VALSCM_DIV,
56   VALSCM_REM,
57   VALSCM_MOD,
58   VALSCM_POW,
59   VALSCM_LSH,
60   VALSCM_RSH,
61   VALSCM_MIN,
62   VALSCM_MAX,
63   VALSCM_BITAND,
64   VALSCM_BITOR,
65   VALSCM_BITXOR
66 };
67
68 /* If TYPE is a reference, return the target; otherwise return TYPE.  */
69 #define STRIP_REFERENCE(TYPE) \
70   ((TYPE_CODE (TYPE) == TYPE_CODE_REF) ? (TYPE_TARGET_TYPE (TYPE)) : (TYPE))
71
72 /* Returns a value object which is the result of applying the operation
73    specified by OPCODE to the given argument.
74    If there's an error a Scheme exception is thrown.  */
75
76 static SCM
77 vlscm_unop (enum valscm_unary_opcode opcode, SCM x, const char *func_name)
78 {
79   struct gdbarch *gdbarch = get_current_arch ();
80   const struct language_defn *language = current_language;
81   struct value *arg1;
82   SCM result = SCM_BOOL_F;
83   struct value *res_val = NULL;
84   SCM except_scm;
85   struct cleanup *cleanups;
86   volatile struct gdb_exception except;
87
88   cleanups = make_cleanup_value_free_to_mark (value_mark ());
89
90   arg1 = vlscm_convert_value_from_scheme (func_name, SCM_ARG1, x,
91                                           &except_scm, gdbarch, language);
92   if (arg1 == NULL)
93     {
94       do_cleanups (cleanups);
95       gdbscm_throw (except_scm);
96     }
97
98   TRY_CATCH (except, RETURN_MASK_ALL)
99     {
100       switch (opcode)
101         {
102         case VALSCM_NOT:
103           /* Alas gdb and guile use the opposite meaning for "logical not".  */
104           {
105             struct type *type = language_bool_type (language, gdbarch);
106             res_val
107               = value_from_longest (type, (LONGEST) value_logical_not (arg1));
108           }
109           break;
110         case VALSCM_NEG:
111           res_val = value_neg (arg1);
112           break;
113         case VALSCM_NOP:
114           /* Seemingly a no-op, but if X was a Scheme value it is now
115              a <gdb:value> object.  */
116           res_val = arg1;
117           break;
118         case VALSCM_ABS:
119           if (value_less (arg1, value_zero (value_type (arg1), not_lval)))
120             res_val = value_neg (arg1);
121           else
122             res_val = arg1;
123           break;
124         case VALSCM_LOGNOT:
125           res_val = value_complement (arg1);
126           break;
127         default:
128           gdb_assert_not_reached ("unsupported operation");
129         }
130     }
131   GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
132
133   gdb_assert (res_val != NULL);
134   result = vlscm_scm_from_value (res_val);
135
136   do_cleanups (cleanups);
137
138   if (gdbscm_is_exception (result))
139     gdbscm_throw (result);
140
141   return result;
142 }
143
144 /* Returns a value object which is the result of applying the operation
145    specified by OPCODE to the given arguments.
146    If there's an error a Scheme exception is thrown.  */
147
148 static SCM
149 vlscm_binop (enum valscm_binary_opcode opcode, SCM x, SCM y,
150              const char *func_name)
151 {
152   struct gdbarch *gdbarch = get_current_arch ();
153   const struct language_defn *language = current_language;
154   struct value *arg1, *arg2;
155   SCM result = SCM_BOOL_F;
156   struct value *res_val = NULL;
157   SCM except_scm;
158   struct cleanup *cleanups;
159   volatile struct gdb_exception except;
160
161   cleanups = make_cleanup_value_free_to_mark (value_mark ());
162
163   arg1 = vlscm_convert_value_from_scheme (func_name, SCM_ARG1, x,
164                                           &except_scm, gdbarch, language);
165   if (arg1 == NULL)
166     {
167       do_cleanups (cleanups);
168       gdbscm_throw (except_scm);
169     }
170   arg2 = vlscm_convert_value_from_scheme (func_name, SCM_ARG2, y,
171                                           &except_scm, gdbarch, language);
172   if (arg2 == NULL)
173     {
174       do_cleanups (cleanups);
175       gdbscm_throw (except_scm);
176     }
177
178   TRY_CATCH (except, RETURN_MASK_ALL)
179     {
180       switch (opcode)
181         {
182         case VALSCM_ADD:
183           {
184             struct type *ltype = value_type (arg1);
185             struct type *rtype = value_type (arg2);
186
187             CHECK_TYPEDEF (ltype);
188             ltype = STRIP_REFERENCE (ltype);
189             CHECK_TYPEDEF (rtype);
190             rtype = STRIP_REFERENCE (rtype);
191
192             if (TYPE_CODE (ltype) == TYPE_CODE_PTR
193                 && is_integral_type (rtype))
194               res_val = value_ptradd (arg1, value_as_long (arg2));
195             else if (TYPE_CODE (rtype) == TYPE_CODE_PTR
196                      && is_integral_type (ltype))
197               res_val = value_ptradd (arg2, value_as_long (arg1));
198             else
199               res_val = value_binop (arg1, arg2, BINOP_ADD);
200           }
201           break;
202         case VALSCM_SUB:
203           {
204             struct type *ltype = value_type (arg1);
205             struct type *rtype = value_type (arg2);
206
207             CHECK_TYPEDEF (ltype);
208             ltype = STRIP_REFERENCE (ltype);
209             CHECK_TYPEDEF (rtype);
210             rtype = STRIP_REFERENCE (rtype);
211
212             if (TYPE_CODE (ltype) == TYPE_CODE_PTR
213                 && TYPE_CODE (rtype) == TYPE_CODE_PTR)
214               {
215                 /* A ptrdiff_t for the target would be preferable here.  */
216                 res_val
217                   = value_from_longest (builtin_type (gdbarch)->builtin_long,
218                                         value_ptrdiff (arg1, arg2));
219               }
220             else if (TYPE_CODE (ltype) == TYPE_CODE_PTR
221                      && is_integral_type (rtype))
222               res_val = value_ptradd (arg1, - value_as_long (arg2));
223             else
224               res_val = value_binop (arg1, arg2, BINOP_SUB);
225           }
226           break;
227         case VALSCM_MUL:
228           res_val = value_binop (arg1, arg2, BINOP_MUL);
229           break;
230         case VALSCM_DIV:
231           res_val = value_binop (arg1, arg2, BINOP_DIV);
232           break;
233         case VALSCM_REM:
234           res_val = value_binop (arg1, arg2, BINOP_REM);
235           break;
236         case VALSCM_MOD:
237           res_val = value_binop (arg1, arg2, BINOP_MOD);
238           break;
239         case VALSCM_POW:
240           res_val = value_binop (arg1, arg2, BINOP_EXP);
241           break;
242         case VALSCM_LSH:
243           res_val = value_binop (arg1, arg2, BINOP_LSH);
244           break;
245         case VALSCM_RSH:
246           res_val = value_binop (arg1, arg2, BINOP_RSH);
247           break;
248         case VALSCM_MIN:
249           res_val = value_binop (arg1, arg2, BINOP_MIN);
250           break;
251         case VALSCM_MAX:
252           res_val = value_binop (arg1, arg2, BINOP_MAX);
253           break;
254         case VALSCM_BITAND:
255           res_val = value_binop (arg1, arg2, BINOP_BITWISE_AND);
256           break;
257         case VALSCM_BITOR:
258           res_val = value_binop (arg1, arg2, BINOP_BITWISE_IOR);
259           break;
260         case VALSCM_BITXOR:
261           res_val = value_binop (arg1, arg2, BINOP_BITWISE_XOR);
262           break;
263         default:
264           gdb_assert_not_reached ("unsupported operation");
265         }
266     }
267   GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
268
269   gdb_assert (res_val != NULL);
270   result = vlscm_scm_from_value (res_val);
271
272   do_cleanups (cleanups);
273
274   if (gdbscm_is_exception (result))
275     gdbscm_throw (result);
276
277   return result;
278 }
279
280 /* (value-add x y) -> <gdb:value> */
281
282 static SCM
283 gdbscm_value_add (SCM x, SCM y)
284 {
285   return vlscm_binop (VALSCM_ADD, x, y, FUNC_NAME);
286 }
287
288 /* (value-sub x y) -> <gdb:value> */
289
290 static SCM
291 gdbscm_value_sub (SCM x, SCM y)
292 {
293   return vlscm_binop (VALSCM_SUB, x, y, FUNC_NAME);
294 }
295
296 /* (value-mul x y) -> <gdb:value> */
297
298 static SCM
299 gdbscm_value_mul (SCM x, SCM y)
300 {
301   return vlscm_binop (VALSCM_MUL, x, y, FUNC_NAME);
302 }
303
304 /* (value-div x y) -> <gdb:value> */
305
306 static SCM
307 gdbscm_value_div (SCM x, SCM y)
308 {
309   return vlscm_binop (VALSCM_DIV, x, y, FUNC_NAME);
310 }
311
312 /* (value-rem x y) -> <gdb:value> */
313
314 static SCM
315 gdbscm_value_rem (SCM x, SCM y)
316 {
317   return vlscm_binop (VALSCM_REM, x, y, FUNC_NAME);
318 }
319
320 /* (value-mod x y) -> <gdb:value> */
321
322 static SCM
323 gdbscm_value_mod (SCM x, SCM y)
324 {
325   return vlscm_binop (VALSCM_MOD, x, y, FUNC_NAME);
326 }
327
328 /* (value-pow x y) -> <gdb:value> */
329
330 static SCM
331 gdbscm_value_pow (SCM x, SCM y)
332 {
333   return vlscm_binop (VALSCM_POW, x, y, FUNC_NAME);
334 }
335
336 /* (value-neg x) -> <gdb:value> */
337
338 static SCM
339 gdbscm_value_neg (SCM x)
340 {
341   return vlscm_unop (VALSCM_NEG, x, FUNC_NAME);
342 }
343
344 /* (value-pos x) -> <gdb:value> */
345
346 static SCM
347 gdbscm_value_pos (SCM x)
348 {
349   return vlscm_unop (VALSCM_NOP, x, FUNC_NAME);
350 }
351
352 /* (value-abs x) -> <gdb:value> */
353
354 static SCM
355 gdbscm_value_abs (SCM x)
356 {
357   return vlscm_unop (VALSCM_ABS, x, FUNC_NAME);
358 }
359
360 /* (value-lsh x y) -> <gdb:value> */
361
362 static SCM
363 gdbscm_value_lsh (SCM x, SCM y)
364 {
365   return vlscm_binop (VALSCM_LSH, x, y, FUNC_NAME);
366 }
367
368 /* (value-rsh x y) -> <gdb:value> */
369
370 static SCM
371 gdbscm_value_rsh (SCM x, SCM y)
372 {
373   return vlscm_binop (VALSCM_RSH, x, y, FUNC_NAME);
374 }
375
376 /* (value-min x y) -> <gdb:value> */
377
378 static SCM
379 gdbscm_value_min (SCM x, SCM y)
380 {
381   return vlscm_binop (VALSCM_MIN, x, y, FUNC_NAME);
382 }
383
384 /* (value-max x y) -> <gdb:value> */
385
386 static SCM
387 gdbscm_value_max (SCM x, SCM y)
388 {
389   return vlscm_binop (VALSCM_MAX, x, y, FUNC_NAME);
390 }
391
392 /* (value-not x) -> <gdb:value> */
393
394 static SCM
395 gdbscm_value_not (SCM x)
396 {
397   return vlscm_unop (VALSCM_NOT, x, FUNC_NAME);
398 }
399
400 /* (value-lognot x) -> <gdb:value> */
401
402 static SCM
403 gdbscm_value_lognot (SCM x)
404 {
405   return vlscm_unop (VALSCM_LOGNOT, x, FUNC_NAME);
406 }
407
408 /* (value-logand x y) -> <gdb:value> */
409
410 static SCM
411 gdbscm_value_logand (SCM x, SCM y)
412 {
413   return vlscm_binop (VALSCM_BITAND, x, y, FUNC_NAME);
414 }
415
416 /* (value-logior x y) -> <gdb:value> */
417
418 static SCM
419 gdbscm_value_logior (SCM x, SCM y)
420 {
421   return vlscm_binop (VALSCM_BITOR, x, y, FUNC_NAME);
422 }
423
424 /* (value-logxor x y) -> <gdb:value> */
425
426 static SCM
427 gdbscm_value_logxor (SCM x, SCM y)
428 {
429   return vlscm_binop (VALSCM_BITXOR, x, y, FUNC_NAME);
430 }
431
432 /* Utility to perform all value comparisons.
433    If there's an error a Scheme exception is thrown.  */
434
435 static SCM
436 vlscm_rich_compare (int op, SCM x, SCM y, const char *func_name)
437 {
438   struct gdbarch *gdbarch = get_current_arch ();
439   const struct language_defn *language = current_language;
440   struct value *v1, *v2;
441   int result = 0;
442   SCM except_scm;
443   struct cleanup *cleanups;
444   volatile struct gdb_exception except;
445
446   cleanups = make_cleanup_value_free_to_mark (value_mark ());
447
448   v1 = vlscm_convert_value_from_scheme (func_name, SCM_ARG1, x,
449                                         &except_scm, gdbarch, language);
450   if (v1 == NULL)
451     {
452       do_cleanups (cleanups);
453       gdbscm_throw (except_scm);
454     }
455   v2 = vlscm_convert_value_from_scheme (func_name, SCM_ARG2, y,
456                                         &except_scm, gdbarch, language);
457   if (v2 == NULL)
458     {
459       do_cleanups (cleanups);
460       gdbscm_throw (except_scm);
461     }
462
463   TRY_CATCH (except, RETURN_MASK_ALL)
464     {
465       switch (op)
466         {
467         case BINOP_LESS:
468           result = value_less (v1, v2);
469           break;
470         case BINOP_LEQ:
471           result = (value_less (v1, v2)
472                     || value_equal (v1, v2));
473           break;
474         case BINOP_EQUAL:
475           result = value_equal (v1, v2);
476           break;
477         case BINOP_NOTEQUAL:
478           gdb_assert_not_reached ("not-equal not implemented");
479         case BINOP_GTR:
480           result = value_less (v2, v1);
481           break;
482         case BINOP_GEQ:
483           result = (value_less (v2, v1)
484                     || value_equal (v1, v2));
485           break;
486         default:
487           gdb_assert_not_reached ("invalid <gdb:value> comparison");
488       }
489     }
490   do_cleanups (cleanups);
491   GDBSCM_HANDLE_GDB_EXCEPTION (except);
492
493   return scm_from_bool (result);
494 }
495
496 /* (value=? x y) -> boolean
497    There is no "not-equal?" function (value!= ?) on purpose.
498    We're following string=?, etc. as our Guide here.  */
499
500 static SCM
501 gdbscm_value_eq_p (SCM x, SCM y)
502 {
503   return vlscm_rich_compare (BINOP_EQUAL, x, y, FUNC_NAME);
504 }
505
506 /* (value<? x y) -> boolean */
507
508 static SCM
509 gdbscm_value_lt_p (SCM x, SCM y)
510 {
511   return vlscm_rich_compare (BINOP_LESS, x, y, FUNC_NAME);
512 }
513
514 /* (value<=? x y) -> boolean */
515
516 static SCM
517 gdbscm_value_le_p (SCM x, SCM y)
518 {
519   return vlscm_rich_compare (BINOP_LEQ, x, y, FUNC_NAME);
520 }
521
522 /* (value>? x y) -> boolean */
523
524 static SCM
525 gdbscm_value_gt_p (SCM x, SCM y)
526 {
527   return vlscm_rich_compare (BINOP_GTR, x, y, FUNC_NAME);
528 }
529
530 /* (value>=? x y) -> boolean */
531
532 static SCM
533 gdbscm_value_ge_p (SCM x, SCM y)
534 {
535   return vlscm_rich_compare (BINOP_GEQ, x, y, FUNC_NAME);
536 }
537 \f
538 /* Subroutine of vlscm_convert_typed_value_from_scheme to simplify it.
539    Convert OBJ, a Scheme number, to a <gdb:value> object.
540    OBJ_ARG_POS is its position in the argument list, used in exception text.
541
542    TYPE is the result type.  TYPE_ARG_POS is its position in
543    the argument list, used in exception text.
544    TYPE_SCM is Scheme object wrapping TYPE, used in exception text.
545
546    If the number isn't representable, e.g. it's too big, a <gdb:exception>
547    object is stored in *EXCEPT_SCMP and NULL is returned.
548    The conversion may throw a gdb error, e.g., if TYPE is invalid.  */
549
550 static struct value *
551 vlscm_convert_typed_number (const char *func_name, int obj_arg_pos, SCM obj,
552                             int type_arg_pos, SCM type_scm, struct type *type,
553                             struct gdbarch *gdbarch, SCM *except_scmp)
554 {
555   if (is_integral_type (type)
556       || TYPE_CODE (type) == TYPE_CODE_PTR)
557     {
558       if (TYPE_UNSIGNED (type))
559         {
560           ULONGEST max;
561
562           get_unsigned_type_max (type, &max);
563           if (!scm_is_unsigned_integer (obj, 0, max))
564             {
565               *except_scmp
566                 = gdbscm_make_out_of_range_error (func_name,
567                                                   obj_arg_pos, obj,
568                                         _("value out of range for type"));
569               return NULL;
570             }
571           return value_from_longest (type, gdbscm_scm_to_ulongest (obj));
572         }
573       else
574         {
575           LONGEST min, max;
576
577           get_signed_type_minmax (type, &min, &max);
578           if (!scm_is_signed_integer (obj, min, max))
579             {
580               *except_scmp
581                 = gdbscm_make_out_of_range_error (func_name,
582                                                   obj_arg_pos, obj,
583                                         _("value out of range for type"));
584               return NULL;
585             }
586           return value_from_longest (type, gdbscm_scm_to_longest (obj));
587         }
588     }
589   else if (TYPE_CODE (type) == TYPE_CODE_FLT)
590     return value_from_double (type, scm_to_double (obj));
591   else
592     {
593       *except_scmp = gdbscm_make_type_error (func_name, obj_arg_pos, obj,
594                                              NULL);
595       return NULL;
596     }
597 }
598
599 /* Return non-zero if OBJ, an integer, fits in TYPE.  */
600
601 static int
602 vlscm_integer_fits_p (SCM obj, struct type *type)
603 {
604   if (TYPE_UNSIGNED (type))
605     {
606       ULONGEST max;
607
608       /* If scm_is_unsigned_integer can't work with this type, just punt.  */
609       if (TYPE_LENGTH (type) > sizeof (scm_t_uintmax))
610         return 0;
611       get_unsigned_type_max (type, &max);
612       return scm_is_unsigned_integer (obj, 0, max);
613     }
614   else
615     {
616       LONGEST min, max;
617
618       /* If scm_is_signed_integer can't work with this type, just punt.  */
619       if (TYPE_LENGTH (type) > sizeof (scm_t_intmax))
620         return 0;
621       get_signed_type_minmax (type, &min, &max);
622       return scm_is_signed_integer (obj, min, max);
623     }
624 }
625
626 /* Subroutine of vlscm_convert_typed_value_from_scheme to simplify it.
627    Convert OBJ, a Scheme number, to a <gdb:value> object.
628    OBJ_ARG_POS is its position in the argument list, used in exception text.
629
630    If OBJ is an integer, then the smallest int that will hold the value in
631    the following progression is chosen:
632    int, unsigned int, long, unsigned long, long long, unsigned long long.
633    Otherwise, if OBJ is a real number, then it is converted to a double.
634    Otherwise an exception is thrown.
635
636    If the number isn't representable, e.g. it's too big, a <gdb:exception>
637    object is stored in *EXCEPT_SCMP and NULL is returned.  */
638
639 static struct value *
640 vlscm_convert_number (const char *func_name, int obj_arg_pos, SCM obj,
641                       struct gdbarch *gdbarch, SCM *except_scmp)
642 {
643   const struct builtin_type *bt = builtin_type (gdbarch);
644
645   /* One thing to keep in mind here is that we are interested in the
646      target's representation of OBJ, not the host's.  */
647
648   if (scm_is_exact (obj) && scm_is_integer (obj))
649     {
650       if (vlscm_integer_fits_p (obj, bt->builtin_int))
651         return value_from_longest (bt->builtin_int,
652                                    gdbscm_scm_to_longest (obj));
653       if (vlscm_integer_fits_p (obj, bt->builtin_unsigned_int))
654         return value_from_longest (bt->builtin_unsigned_int,
655                                    gdbscm_scm_to_ulongest (obj));
656       if (vlscm_integer_fits_p (obj, bt->builtin_long))
657         return value_from_longest (bt->builtin_long,
658                                    gdbscm_scm_to_longest (obj));
659       if (vlscm_integer_fits_p (obj, bt->builtin_unsigned_long))
660         return value_from_longest (bt->builtin_unsigned_long,
661                                    gdbscm_scm_to_ulongest (obj));
662       if (vlscm_integer_fits_p (obj, bt->builtin_long_long))
663         return value_from_longest (bt->builtin_long_long,
664                                    gdbscm_scm_to_longest (obj));
665       if (vlscm_integer_fits_p (obj, bt->builtin_unsigned_long_long))
666         return value_from_longest (bt->builtin_unsigned_long_long,
667                                    gdbscm_scm_to_ulongest (obj));
668     }
669   else if (scm_is_real (obj))
670     return value_from_double (bt->builtin_double, scm_to_double (obj));
671
672   *except_scmp = gdbscm_make_out_of_range_error (func_name, obj_arg_pos, obj,
673                         _("value not a number representable on the target"));
674   return NULL;
675 }
676
677 /* Subroutine of vlscm_convert_typed_value_from_scheme to simplify it.
678    Convert BV, a Scheme bytevector, to a <gdb:value> object.
679
680    TYPE, if non-NULL, is the result type.  Otherwise, a vector of type
681    uint8_t is used.
682    TYPE_SCM is Scheme object wrapping TYPE, used in exception text,
683    or #f if TYPE is NULL.
684
685    If the bytevector isn't the same size as the type, then a <gdb:exception>
686    object is stored in *EXCEPT_SCMP, and NULL is returned.  */
687
688 static struct value *
689 vlscm_convert_bytevector (SCM bv, struct type *type, SCM type_scm,
690                           int arg_pos, const char *func_name,
691                           SCM *except_scmp, struct gdbarch *gdbarch)
692 {
693   LONGEST length = SCM_BYTEVECTOR_LENGTH (bv);
694   struct value *value;
695
696   if (type == NULL)
697     {
698       type = builtin_type (gdbarch)->builtin_uint8;
699       type = lookup_array_range_type (type, 0, length);
700       make_vector_type (type);
701     }
702   type = check_typedef (type);
703   if (TYPE_LENGTH (type) != length)
704     {
705       *except_scmp = gdbscm_make_out_of_range_error (func_name, arg_pos,
706                                                      type_scm,
707                         _("size of type does not match size of bytevector"));
708       return NULL;
709     }
710
711   value = value_from_contents (type,
712                                (gdb_byte *) SCM_BYTEVECTOR_CONTENTS (bv));
713   return value;
714 }
715
716 /* Convert OBJ, a Scheme value, to a <gdb:value> object.
717    OBJ_ARG_POS is its position in the argument list, used in exception text.
718
719    TYPE, if non-NULL, is the result type which must be compatible with
720    the value being converted.
721    If TYPE is NULL then a suitable default type is chosen.
722    TYPE_SCM is Scheme object wrapping TYPE, used in exception text,
723    or SCM_UNDEFINED if TYPE is NULL.
724    TYPE_ARG_POS is its position in the argument list, used in exception text,
725    or -1 if TYPE is NULL.
726
727    OBJ may also be a <gdb:value> object, in which case a copy is returned
728    and TYPE must be NULL.
729
730    If the value cannot be converted, NULL is returned and a gdb:exception
731    object is stored in *EXCEPT_SCMP.
732    Otherwise the new value is returned, added to the all_values chain.  */
733
734 struct value *
735 vlscm_convert_typed_value_from_scheme (const char *func_name,
736                                        int obj_arg_pos, SCM obj,
737                                        int type_arg_pos, SCM type_scm,
738                                        struct type *type,
739                                        SCM *except_scmp,
740                                        struct gdbarch *gdbarch,
741                                        const struct language_defn *language)
742 {
743   struct value *value = NULL;
744   SCM except_scm = SCM_BOOL_F;
745   volatile struct gdb_exception except;
746
747   if (type == NULL)
748     {
749       gdb_assert (type_arg_pos == -1);
750       gdb_assert (SCM_UNBNDP (type_scm));
751     }
752
753   *except_scmp = SCM_BOOL_F;
754
755   TRY_CATCH (except, RETURN_MASK_ALL)
756     {
757       if (vlscm_is_value (obj))
758         {
759           if (type != NULL)
760             {
761               except_scm = gdbscm_make_misc_error (func_name, type_arg_pos,
762                                                    type_scm,
763                                                    _("No type allowed"));
764               value = NULL;
765             }
766           else
767             value = value_copy (vlscm_scm_to_value (obj));
768         }
769       else if (gdbscm_is_true (scm_bytevector_p (obj)))
770         {
771           value = vlscm_convert_bytevector (obj, type, type_scm,
772                                             obj_arg_pos, func_name,
773                                             &except_scm, gdbarch);
774         }
775       else if (gdbscm_is_bool (obj)) 
776         {
777           if (type != NULL
778               && !is_integral_type (type))
779             {
780               except_scm = gdbscm_make_type_error (func_name, type_arg_pos,
781                                                    type_scm, NULL);
782             }
783           else
784             {
785               value = value_from_longest (type
786                                           ? type
787                                           : language_bool_type (language,
788                                                                 gdbarch),
789                                           gdbscm_is_true (obj));
790             }
791         }
792       else if (scm_is_number (obj))
793         {
794           if (type != NULL)
795             {
796               value = vlscm_convert_typed_number (func_name, obj_arg_pos, obj,
797                                                   type_arg_pos, type_scm, type,
798                                                   gdbarch, &except_scm);
799             }
800           else
801             {
802               value = vlscm_convert_number (func_name, obj_arg_pos, obj,
803                                             gdbarch, &except_scm);
804             }
805         }
806       else if (scm_is_string (obj))
807         {
808           char *s;
809           size_t len;
810           struct cleanup *cleanup;
811
812           if (type != NULL)
813             {
814               except_scm = gdbscm_make_misc_error (func_name, type_arg_pos,
815                                                    type_scm,
816                                                    _("No type allowed"));
817               value = NULL;
818             }
819           else
820             {
821               /* TODO: Provide option to specify conversion strategy.  */
822               s = gdbscm_scm_to_string (obj, &len,
823                                         target_charset (gdbarch),
824                                         0 /*non-strict*/,
825                                         &except_scm);
826               if (s != NULL)
827                 {
828                   cleanup = make_cleanup (xfree, s);
829                   value
830                     = value_cstring (s, len,
831                                      language_string_char_type (language,
832                                                                 gdbarch));
833                   do_cleanups (cleanup);
834                 }
835               else
836                 value = NULL;
837             }
838         }
839       else if (lsscm_is_lazy_string (obj))
840         {
841           if (type != NULL)
842             {
843               except_scm = gdbscm_make_misc_error (func_name, type_arg_pos,
844                                                    type_scm,
845                                                    _("No type allowed"));
846               value = NULL;
847             }
848           else
849             {
850               value = lsscm_safe_lazy_string_to_value (obj, obj_arg_pos,
851                                                        func_name,
852                                                        &except_scm);
853             }
854         }
855       else /* OBJ isn't anything we support.  */
856         {
857           except_scm = gdbscm_make_type_error (func_name, obj_arg_pos, obj,
858                                                NULL);
859           value = NULL;
860         }
861     }
862   if (except.reason < 0)
863     except_scm = gdbscm_scm_from_gdb_exception (except);
864
865   if (gdbscm_is_true (except_scm))
866     {
867       gdb_assert (value == NULL);
868       *except_scmp = except_scm;
869     }
870
871   return value;
872 }
873
874 /* Wrapper around vlscm_convert_typed_value_from_scheme for cases where there
875    is no supplied type.  See vlscm_convert_typed_value_from_scheme for
876    details.  */
877
878 struct value *
879 vlscm_convert_value_from_scheme (const char *func_name,
880                                  int obj_arg_pos, SCM obj,
881                                  SCM *except_scmp, struct gdbarch *gdbarch,
882                                  const struct language_defn *language)
883 {
884   return vlscm_convert_typed_value_from_scheme (func_name, obj_arg_pos, obj,
885                                                 -1, SCM_UNDEFINED, NULL,
886                                                 except_scmp,
887                                                 gdbarch, language);
888 }
889 \f
890 /* Initialize value math support.  */
891
892 static const scheme_function math_functions[] =
893 {
894   { "value-add", 2, 0, 0, gdbscm_value_add,
895     "\
896 Return a + b." },
897
898   { "value-sub", 2, 0, 0, gdbscm_value_sub,
899     "\
900 Return a - b." },
901
902   { "value-mul", 2, 0, 0, gdbscm_value_mul,
903     "\
904 Return a * b." },
905
906   { "value-div", 2, 0, 0, gdbscm_value_div,
907     "\
908 Return a / b." },
909
910   { "value-rem", 2, 0, 0, gdbscm_value_rem,
911     "\
912 Return a % b." },
913
914   { "value-mod", 2, 0, 0, gdbscm_value_mod,
915     "\
916 Return a mod b.  See Knuth 1.2.4." },
917
918   { "value-pow", 2, 0, 0, gdbscm_value_pow,
919     "\
920 Return pow (x, y)." },
921
922   { "value-not", 1, 0, 0, gdbscm_value_not,
923     "\
924 Return !a." },
925
926   { "value-neg", 1, 0, 0, gdbscm_value_neg,
927     "\
928 Return -a." },
929
930   { "value-pos", 1, 0, 0, gdbscm_value_pos,
931     "\
932 Return a." },
933
934   { "value-abs", 1, 0, 0, gdbscm_value_abs,
935     "\
936 Return abs (a)." },
937
938   { "value-lsh", 2, 0, 0, gdbscm_value_lsh,
939     "\
940 Return a << b." },
941
942   { "value-rsh", 2, 0, 0, gdbscm_value_rsh,
943     "\
944 Return a >> b." },
945
946   { "value-min", 2, 0, 0, gdbscm_value_min,
947     "\
948 Return min (a, b)." },
949
950   { "value-max", 2, 0, 0, gdbscm_value_max,
951     "\
952 Return max (a, b)." },
953
954   { "value-lognot", 1, 0, 0, gdbscm_value_lognot,
955     "\
956 Return ~a." },
957
958   { "value-logand", 2, 0, 0, gdbscm_value_logand,
959     "\
960 Return a & b." },
961
962   { "value-logior", 2, 0, 0, gdbscm_value_logior,
963     "\
964 Return a | b." },
965
966   { "value-logxor", 2, 0, 0, gdbscm_value_logxor,
967     "\
968 Return a ^ b." },
969
970   { "value=?", 2, 0, 0, gdbscm_value_eq_p,
971     "\
972 Return a == b." },
973
974   { "value<?", 2, 0, 0, gdbscm_value_lt_p,
975     "\
976 Return a < b." },
977
978   { "value<=?", 2, 0, 0, gdbscm_value_le_p,
979     "\
980 Return a <= b." },
981
982   { "value>?", 2, 0, 0, gdbscm_value_gt_p,
983     "\
984 Return a > b." },
985
986   { "value>=?", 2, 0, 0, gdbscm_value_ge_p,
987     "\
988 Return a >= b." },
989
990   END_FUNCTIONS
991 };
992
993 void
994 gdbscm_initialize_math (void)
995 {
996   gdbscm_define_functions (math_functions, 1);
997 }