]> Git Repo - binutils.git/blob - gdb/valarith.c
* mdebugread.c (mylookup_symbol): enum namespace becomes
[binutils.git] / gdb / valarith.c
1 /* Perform arithmetic and other operations on values, for GDB.
2    Copyright 1986, 1989, 1991, 1992, 1993, 1994
3    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 2 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, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21 #include "defs.h"
22 #include "value.h"
23 #include "symtab.h"
24 #include "gdbtypes.h"
25 #include "expression.h"
26 #include "target.h"
27 #include "language.h"
28 #include "demangle.h"
29 #include "gdb_string.h"
30
31 /* Define whether or not the C operator '/' truncates towards zero for
32    differently signed operands (truncation direction is undefined in C). */
33
34 #ifndef TRUNCATION_TOWARDS_ZERO
35 #define TRUNCATION_TOWARDS_ZERO ((-5 / 2) == -2)
36 #endif
37
38 static value_ptr value_subscripted_rvalue PARAMS ((value_ptr, value_ptr, int));
39
40 \f
41 value_ptr
42 value_add (arg1, arg2)
43      value_ptr arg1, arg2;
44 {
45   register value_ptr valint, valptr;
46   register int len;
47   struct type *type1, *type2, *valptrtype;
48
49   COERCE_ARRAY (arg1);
50   COERCE_ARRAY (arg2);
51   type1 = check_typedef (VALUE_TYPE (arg1));
52   type2 = check_typedef (VALUE_TYPE (arg2));
53
54   if ((TYPE_CODE (type1) == TYPE_CODE_PTR
55        || TYPE_CODE (type2) == TYPE_CODE_PTR)
56       &&
57       (TYPE_CODE (type1) == TYPE_CODE_INT
58        || TYPE_CODE (type2) == TYPE_CODE_INT))
59     /* Exactly one argument is a pointer, and one is an integer.  */
60     {
61       if (TYPE_CODE (type1) == TYPE_CODE_PTR)
62         {
63           valptr = arg1;
64           valint = arg2;
65           valptrtype = type1;
66         }
67       else
68         {
69           valptr = arg2;
70           valint = arg1;
71           valptrtype = type2;
72         }
73       len = TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (valptrtype)));
74       if (len == 0) len = 1;    /* For (void *) */
75       return value_from_longest (valptrtype,
76                               value_as_long (valptr)
77                               + (len * value_as_long (valint)));
78     }
79
80   return value_binop (arg1, arg2, BINOP_ADD);
81 }
82
83 value_ptr
84 value_sub (arg1, arg2)
85      value_ptr arg1, arg2;
86 {
87   struct type *type1, *type2;
88   COERCE_ARRAY (arg1);
89   COERCE_ARRAY (arg2);
90   type1 = check_typedef (VALUE_TYPE (arg1));
91   type2 = check_typedef (VALUE_TYPE (arg2));
92
93   if (TYPE_CODE (type1) == TYPE_CODE_PTR)
94     {
95       if (TYPE_CODE (type2) == TYPE_CODE_INT)
96         {
97           /* pointer - integer.  */
98           LONGEST sz = TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type1)));
99           return value_from_longest
100             (VALUE_TYPE (arg1),
101              value_as_long (arg1) - (sz * value_as_long (arg2)));
102         }
103       else if (TYPE_CODE (type2) == TYPE_CODE_PTR
104                && TYPE_LENGTH (TYPE_TARGET_TYPE (type1))
105                   == TYPE_LENGTH (TYPE_TARGET_TYPE (type2)))
106         {
107           /* pointer to <type x> - pointer to <type x>.  */
108           LONGEST sz = TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type1)));
109           return value_from_longest
110             (builtin_type_long,         /* FIXME -- should be ptrdiff_t */
111              (value_as_long (arg1) - value_as_long (arg2)) / sz);
112         }
113       else
114         {
115           error ("\
116 First argument of `-' is a pointer and second argument is neither\n\
117 an integer nor a pointer of the same type.");
118         }
119     }
120
121   return value_binop (arg1, arg2, BINOP_SUB);
122 }
123
124 /* Return the value of ARRAY[IDX].
125    See comments in value_coerce_array() for rationale for reason for
126    doing lower bounds adjustment here rather than there.
127    FIXME:  Perhaps we should validate that the index is valid and if
128    verbosity is set, warn about invalid indices (but still use them). */
129
130 value_ptr
131 value_subscript (array, idx)
132      value_ptr array, idx;
133 {
134   value_ptr bound;
135   int c_style = current_language->c_style_arrays;
136   struct type *tarray, *tint;
137
138   COERCE_REF (array);
139   tarray = check_typedef (VALUE_TYPE (array));
140   COERCE_VARYING_ARRAY (array, tarray);
141
142   if (TYPE_CODE (tarray) == TYPE_CODE_ARRAY
143       || TYPE_CODE (tarray) == TYPE_CODE_STRING)
144     {
145       struct type *range_type = TYPE_INDEX_TYPE (tarray);
146       LONGEST lowerbound, upperbound;
147       get_discrete_bounds (range_type, &lowerbound, &upperbound);
148
149       if (VALUE_LVAL (array) != lval_memory)
150         return value_subscripted_rvalue (array, idx, lowerbound);
151
152       if (c_style == 0)
153         {
154           LONGEST index = value_as_long (idx);
155           if (index >= lowerbound && index <= upperbound)
156             return value_subscripted_rvalue (array, idx, lowerbound);
157           warning ("array or string index out of range");
158           /* fall doing C stuff */
159           c_style = 1;
160         }
161
162       if (lowerbound != 0)
163         {
164           bound = value_from_longest (builtin_type_int, (LONGEST) lowerbound);
165           idx = value_sub (idx, bound);
166         }
167
168       array = value_coerce_array (array);
169     }
170
171   if (TYPE_CODE (tarray) == TYPE_CODE_BITSTRING)
172     {
173       struct type *range_type = TYPE_INDEX_TYPE (tarray);
174       LONGEST index = value_as_long (idx);
175       value_ptr v;
176       int offset, byte, bit_index;
177       LONGEST lowerbound, upperbound, word;
178       get_discrete_bounds (range_type, &lowerbound, &upperbound);
179       if (index < lowerbound || index > upperbound)
180         error ("bitstring index out of range");
181       index -= lowerbound;
182       offset = index / TARGET_CHAR_BIT;
183       byte = *((char*)VALUE_CONTENTS (array) + offset);
184       bit_index = index % TARGET_CHAR_BIT;
185       byte >>= (BITS_BIG_ENDIAN ? TARGET_CHAR_BIT - 1 - bit_index : bit_index);
186       v = value_from_longest (builtin_type_int, byte & 1);
187       VALUE_BITPOS (v) = bit_index;
188       VALUE_BITSIZE (v) = 1;
189       VALUE_LVAL (v) = VALUE_LVAL (array);
190       if (VALUE_LVAL (array) == lval_internalvar)
191         VALUE_LVAL (v) = lval_internalvar_component;
192       VALUE_ADDRESS (v) = VALUE_ADDRESS (array);
193       VALUE_OFFSET (v) = offset + VALUE_OFFSET (array);
194       return v;
195     }
196
197   if (c_style)
198     return value_ind (value_add (array, idx));
199   else
200     error ("not an array or string");
201 }
202
203 /* Return the value of EXPR[IDX], expr an aggregate rvalue
204    (eg, a vector register).  This routine used to promote floats
205    to doubles, but no longer does.  */
206
207 static value_ptr
208 value_subscripted_rvalue (array, idx, lowerbound)
209      value_ptr array, idx;
210      int lowerbound;
211 {
212   struct type *array_type = check_typedef (VALUE_TYPE (array));
213   struct type *elt_type = check_typedef (TYPE_TARGET_TYPE (array_type));
214   int elt_size = TYPE_LENGTH (elt_type);
215   LONGEST index = value_as_long (idx);
216   int elt_offs = elt_size * longest_to_int (index - lowerbound);
217   value_ptr v;
218
219   if (index < lowerbound || elt_offs >= TYPE_LENGTH (array_type))
220     error ("no such vector element");
221
222   v = allocate_value (elt_type);
223   if (VALUE_LAZY (array))
224     VALUE_LAZY (v) = 1;
225   else
226     memcpy (VALUE_CONTENTS (v), VALUE_CONTENTS (array) + elt_offs, elt_size);
227
228   if (VALUE_LVAL (array) == lval_internalvar)
229     VALUE_LVAL (v) = lval_internalvar_component;
230   else
231     VALUE_LVAL (v) = VALUE_LVAL (array);
232   VALUE_ADDRESS (v) = VALUE_ADDRESS (array);
233   VALUE_OFFSET (v) = VALUE_OFFSET (array) + elt_offs;
234   return v;
235 }
236 \f
237 /* Check to see if either argument is a structure.  This is called so
238    we know whether to go ahead with the normal binop or look for a 
239    user defined function instead.
240
241    For now, we do not overload the `=' operator.  */
242
243 int
244 binop_user_defined_p (op, arg1, arg2)
245      enum exp_opcode op;
246      value_ptr arg1, arg2;
247 {
248   struct type *type1, *type2;
249   if (op == BINOP_ASSIGN)
250     return 0;
251   type1 = check_typedef (VALUE_TYPE (arg1));
252   type2 = check_typedef (VALUE_TYPE (arg2));
253   return (TYPE_CODE (type1) == TYPE_CODE_STRUCT
254           || TYPE_CODE (type2) == TYPE_CODE_STRUCT
255           || (TYPE_CODE (type1) == TYPE_CODE_REF
256               && TYPE_CODE (TYPE_TARGET_TYPE (type1)) == TYPE_CODE_STRUCT)
257           || (TYPE_CODE (type2) == TYPE_CODE_REF
258               && TYPE_CODE (TYPE_TARGET_TYPE (type2)) == TYPE_CODE_STRUCT));
259 }
260
261 /* Check to see if argument is a structure.  This is called so
262    we know whether to go ahead with the normal unop or look for a 
263    user defined function instead.
264
265    For now, we do not overload the `&' operator.  */
266
267 int unop_user_defined_p (op, arg1)
268      enum exp_opcode op;
269      value_ptr arg1;
270 {
271   struct type *type1;
272   if (op == UNOP_ADDR)
273     return 0;
274   type1 = check_typedef (VALUE_TYPE (arg1));
275   for (;;)
276     {
277       if (TYPE_CODE (type1) == TYPE_CODE_STRUCT)
278         return 1;
279       else if (TYPE_CODE (type1) == TYPE_CODE_REF)
280         type1 = TYPE_TARGET_TYPE (type1);
281       else
282         return 0;
283     }
284 }
285
286 /* We know either arg1 or arg2 is a structure, so try to find the right
287    user defined function.  Create an argument vector that calls 
288    arg1.operator @ (arg1,arg2) and return that value (where '@' is any
289    binary operator which is legal for GNU C++).
290
291    OP is the operatore, and if it is BINOP_ASSIGN_MODIFY, then OTHEROP
292    is the opcode saying how to modify it.  Otherwise, OTHEROP is
293    unused.  */
294
295 value_ptr
296 value_x_binop (arg1, arg2, op, otherop)
297      value_ptr arg1, arg2;
298      enum exp_opcode op, otherop;
299 {
300   value_ptr * argvec;
301   char *ptr;
302   char tstr[13];
303   int static_memfuncp;
304
305   COERCE_REF (arg1);
306   COERCE_REF (arg2);
307   COERCE_ENUM (arg1);
308   COERCE_ENUM (arg2);
309
310   /* now we know that what we have to do is construct our
311      arg vector and find the right function to call it with.  */
312
313   if (TYPE_CODE (check_typedef (VALUE_TYPE (arg1))) != TYPE_CODE_STRUCT)
314     error ("Can't do that binary op on that type");  /* FIXME be explicit */
315
316   argvec = (value_ptr *) alloca (sizeof (value_ptr) * 4);
317   argvec[1] = value_addr (arg1);
318   argvec[2] = arg2;
319   argvec[3] = 0;
320
321   /* make the right function name up */  
322   strcpy(tstr, "operator__");
323   ptr = tstr+8;
324   switch (op)
325     {
326     case BINOP_ADD:             strcpy(ptr,"+"); break;
327     case BINOP_SUB:             strcpy(ptr,"-"); break;
328     case BINOP_MUL:             strcpy(ptr,"*"); break;
329     case BINOP_DIV:             strcpy(ptr,"/"); break;
330     case BINOP_REM:             strcpy(ptr,"%"); break;
331     case BINOP_LSH:             strcpy(ptr,"<<"); break;
332     case BINOP_RSH:             strcpy(ptr,">>"); break;
333     case BINOP_BITWISE_AND:     strcpy(ptr,"&"); break;
334     case BINOP_BITWISE_IOR:     strcpy(ptr,"|"); break;
335     case BINOP_BITWISE_XOR:     strcpy(ptr,"^"); break;
336     case BINOP_LOGICAL_AND:     strcpy(ptr,"&&"); break;
337     case BINOP_LOGICAL_OR:      strcpy(ptr,"||"); break;
338     case BINOP_MIN:             strcpy(ptr,"<?"); break;
339     case BINOP_MAX:             strcpy(ptr,">?"); break;
340     case BINOP_ASSIGN:          strcpy(ptr,"="); break;
341     case BINOP_ASSIGN_MODIFY:   
342       switch (otherop)
343         {
344         case BINOP_ADD:         strcpy(ptr,"+="); break;
345         case BINOP_SUB:         strcpy(ptr,"-="); break;
346         case BINOP_MUL:         strcpy(ptr,"*="); break;
347         case BINOP_DIV:         strcpy(ptr,"/="); break;
348         case BINOP_REM:         strcpy(ptr,"%="); break;
349         case BINOP_BITWISE_AND: strcpy(ptr,"&="); break;
350         case BINOP_BITWISE_IOR: strcpy(ptr,"|="); break;
351         case BINOP_BITWISE_XOR: strcpy(ptr,"^="); break;
352         case BINOP_MOD:         /* invalid */
353         default:
354           error ("Invalid binary operation specified.");
355         }
356       break;
357     case BINOP_SUBSCRIPT: strcpy(ptr,"[]"); break;
358     case BINOP_EQUAL:     strcpy(ptr,"=="); break;
359     case BINOP_NOTEQUAL:  strcpy(ptr,"!="); break;
360     case BINOP_LESS:      strcpy(ptr,"<"); break;
361     case BINOP_GTR:       strcpy(ptr,">"); break;
362     case BINOP_GEQ:       strcpy(ptr,">="); break;
363     case BINOP_LEQ:       strcpy(ptr,"<="); break;
364     case BINOP_MOD:       /* invalid */
365     default:
366       error ("Invalid binary operation specified.");
367     }
368
369   argvec[0] = value_struct_elt (&arg1, argvec+1, tstr, &static_memfuncp, "structure");
370   
371   if (argvec[0])
372     {
373       if (static_memfuncp)
374         {
375           argvec[1] = argvec[0];
376           argvec++;
377         }
378       return call_function_by_hand (argvec[0], 2 - static_memfuncp, argvec + 1);
379     }
380   error ("member function %s not found", tstr);
381 #ifdef lint
382   return call_function_by_hand (argvec[0], 2 - static_memfuncp, argvec + 1);
383 #endif
384 }
385
386 /* We know that arg1 is a structure, so try to find a unary user
387    defined operator that matches the operator in question.  
388    Create an argument vector that calls arg1.operator @ (arg1)
389    and return that value (where '@' is (almost) any unary operator which
390    is legal for GNU C++).  */
391
392 value_ptr
393 value_x_unop (arg1, op)
394      value_ptr arg1;
395      enum exp_opcode op;
396 {
397   value_ptr * argvec;
398   char *ptr, *mangle_ptr;
399   char tstr[13], mangle_tstr[13];
400   int static_memfuncp;
401
402   COERCE_ENUM (arg1);
403
404   /* now we know that what we have to do is construct our
405      arg vector and find the right function to call it with.  */
406
407   if (TYPE_CODE (check_typedef (VALUE_TYPE (arg1))) != TYPE_CODE_STRUCT)
408     error ("Can't do that unary op on that type");  /* FIXME be explicit */
409
410   argvec = (value_ptr *) alloca (sizeof (value_ptr) * 3);
411   argvec[1] = value_addr (arg1);
412   argvec[2] = 0;
413
414   /* make the right function name up */  
415   strcpy(tstr,"operator__");
416   ptr = tstr+8;
417   strcpy(mangle_tstr, "__");
418   mangle_ptr = mangle_tstr+2;
419   switch (op)
420     {
421     case UNOP_PREINCREMENT:     strcpy(ptr,"++"); break;
422     case UNOP_PREDECREMENT:     strcpy(ptr,"++"); break;
423     case UNOP_POSTINCREMENT:    strcpy(ptr,"++"); break;
424     case UNOP_POSTDECREMENT:    strcpy(ptr,"++"); break;
425     case UNOP_LOGICAL_NOT:      strcpy(ptr,"!"); break;
426     case UNOP_COMPLEMENT:       strcpy(ptr,"~"); break;
427     case UNOP_NEG:              strcpy(ptr,"-"); break;
428     default:
429       error ("Invalid binary operation specified.");
430     }
431
432   argvec[0] = value_struct_elt (&arg1, argvec+1, tstr, &static_memfuncp, "structure");
433
434   if (argvec[0])
435     {
436       if (static_memfuncp)
437         {
438           argvec[1] = argvec[0];
439           argvec++;
440         }
441       return call_function_by_hand (argvec[0], 1 - static_memfuncp, argvec + 1);
442     }
443   error ("member function %s not found", tstr);
444   return 0;  /* For lint -- never reached */
445 }
446
447 \f
448 /* Concatenate two values with the following conditions:
449
450    (1)  Both values must be either bitstring values or character string
451         values and the resulting value consists of the concatenation of
452         ARG1 followed by ARG2.
453
454         or
455
456         One value must be an integer value and the other value must be
457         either a bitstring value or character string value, which is
458         to be repeated by the number of times specified by the integer
459         value.
460
461
462     (2) Boolean values are also allowed and are treated as bit string
463         values of length 1.
464
465     (3) Character values are also allowed and are treated as character
466         string values of length 1.
467 */
468
469 value_ptr
470 value_concat (arg1, arg2)
471      value_ptr arg1, arg2;
472 {
473   register value_ptr inval1, inval2, outval;
474   int inval1len, inval2len;
475   int count, idx;
476   char *ptr;
477   char inchar;
478   struct type *type1 = check_typedef (VALUE_TYPE (arg1));
479   struct type *type2 = check_typedef (VALUE_TYPE (arg2));
480
481   /* First figure out if we are dealing with two values to be concatenated
482      or a repeat count and a value to be repeated.  INVAL1 is set to the
483      first of two concatenated values, or the repeat count.  INVAL2 is set
484      to the second of the two concatenated values or the value to be 
485      repeated. */
486
487   if (TYPE_CODE (type2) == TYPE_CODE_INT)
488     {
489       struct type *tmp = type1;
490       type1 = tmp;
491       tmp = type2;
492       inval1 = arg2;
493       inval2 = arg1;
494     }
495   else
496     {
497       inval1 = arg1;
498       inval2 = arg2;
499     }
500
501   /* Now process the input values. */
502
503   if (TYPE_CODE (type1) == TYPE_CODE_INT)
504     {
505       /* We have a repeat count.  Validate the second value and then
506          construct a value repeated that many times. */
507       if (TYPE_CODE (type2) == TYPE_CODE_STRING
508           || TYPE_CODE (type2) == TYPE_CODE_CHAR)
509         {
510           count = longest_to_int (value_as_long (inval1));
511           inval2len = TYPE_LENGTH (type2);
512           ptr = (char *) alloca (count * inval2len);
513           if (TYPE_CODE (type2) == TYPE_CODE_CHAR)
514             {
515               inchar = (char) unpack_long (type2,
516                                            VALUE_CONTENTS (inval2));
517               for (idx = 0; idx < count; idx++)
518                 {
519                   *(ptr + idx) = inchar;
520                 }
521             }
522           else
523             {
524               for (idx = 0; idx < count; idx++)
525                 {
526                   memcpy (ptr + (idx * inval2len), VALUE_CONTENTS (inval2),
527                           inval2len);
528                 }
529             }
530           outval = value_string (ptr, count * inval2len);
531         }
532       else if (TYPE_CODE (type2) == TYPE_CODE_BITSTRING
533                || TYPE_CODE (type2) == TYPE_CODE_BOOL)
534         {
535           error ("unimplemented support for bitstring/boolean repeats");
536         }
537       else
538         {
539           error ("can't repeat values of that type");
540         }
541     }
542   else if (TYPE_CODE (type1) == TYPE_CODE_STRING
543       || TYPE_CODE (type1) == TYPE_CODE_CHAR)
544     {
545       /* We have two character strings to concatenate. */
546       if (TYPE_CODE (type2) != TYPE_CODE_STRING
547           && TYPE_CODE (type2) != TYPE_CODE_CHAR)
548         {
549           error ("Strings can only be concatenated with other strings.");
550         }
551       inval1len = TYPE_LENGTH (type1);
552       inval2len = TYPE_LENGTH (type2);
553       ptr = (char *) alloca (inval1len + inval2len);
554       if (TYPE_CODE (type1) == TYPE_CODE_CHAR)
555         {
556           *ptr = (char) unpack_long (type1, VALUE_CONTENTS (inval1));
557         }
558       else
559         {
560           memcpy (ptr, VALUE_CONTENTS (inval1), inval1len);
561         }
562       if (TYPE_CODE (type2) == TYPE_CODE_CHAR)
563         {
564           *(ptr + inval1len) = 
565             (char) unpack_long (type2, VALUE_CONTENTS (inval2));
566         }
567       else
568         {
569           memcpy (ptr + inval1len, VALUE_CONTENTS (inval2), inval2len);
570         }
571       outval = value_string (ptr, inval1len + inval2len);
572     }
573   else if (TYPE_CODE (type1) == TYPE_CODE_BITSTRING
574            || TYPE_CODE (type1) == TYPE_CODE_BOOL)
575     {
576       /* We have two bitstrings to concatenate. */
577       if (TYPE_CODE (type2) != TYPE_CODE_BITSTRING
578           && TYPE_CODE (type2) != TYPE_CODE_BOOL)
579         {
580           error ("Bitstrings or booleans can only be concatenated with other bitstrings or booleans.");
581         }
582       error ("unimplemented support for bitstring/boolean concatenation.");
583     }      
584   else
585     {
586       /* We don't know how to concatenate these operands. */
587       error ("illegal operands for concatenation.");
588     }
589   return (outval);
590 }
591
592 \f
593
594 /* Perform a binary operation on two operands which have reasonable
595    representations as integers or floats.  This includes booleans,
596    characters, integers, or floats.
597    Does not support addition and subtraction on pointers;
598    use value_add or value_sub if you want to handle those possibilities.  */
599
600 value_ptr
601 value_binop (arg1, arg2, op)
602      value_ptr arg1, arg2;
603      enum exp_opcode op;
604 {
605   register value_ptr val;
606   struct type *type1, *type2;
607
608   COERCE_ENUM (arg1);
609   COERCE_ENUM (arg2);
610   type1 = check_typedef (VALUE_TYPE (arg1));
611   type2 = check_typedef (VALUE_TYPE (arg2));
612
613   if ((TYPE_CODE (type1) != TYPE_CODE_FLT
614        && TYPE_CODE (type1) != TYPE_CODE_CHAR
615        && TYPE_CODE (type1) != TYPE_CODE_INT
616        && TYPE_CODE (type1) != TYPE_CODE_BOOL
617        && TYPE_CODE (type1) != TYPE_CODE_RANGE)
618       ||
619       (TYPE_CODE (type2) != TYPE_CODE_FLT
620        && TYPE_CODE (type2) != TYPE_CODE_CHAR
621        && TYPE_CODE (type2) != TYPE_CODE_INT
622        && TYPE_CODE (type2) != TYPE_CODE_BOOL
623        && TYPE_CODE (type2) != TYPE_CODE_RANGE))
624     error ("Argument to arithmetic operation not a number or boolean.");
625
626   if (TYPE_CODE (type1) == TYPE_CODE_FLT
627       ||
628       TYPE_CODE (type2) == TYPE_CODE_FLT)
629     {
630       /* FIXME-if-picky-about-floating-accuracy: Should be doing this
631          in target format.  real.c in GCC probably has the necessary
632          code.  */
633       double v1, v2, v;
634       v1 = value_as_double (arg1);
635       v2 = value_as_double (arg2);
636       switch (op)
637         {
638         case BINOP_ADD:
639           v = v1 + v2;
640           break;
641
642         case BINOP_SUB:
643           v = v1 - v2;
644           break;
645
646         case BINOP_MUL:
647           v = v1 * v2;
648           break;
649
650         case BINOP_DIV:
651           v = v1 / v2;
652           break;
653
654         default:
655           error ("Integer-only operation on floating point number.");
656         }
657
658       val = allocate_value (builtin_type_double);
659       store_floating (VALUE_CONTENTS_RAW (val), TYPE_LENGTH (VALUE_TYPE (val)),
660                       v);
661     }
662   else if (TYPE_CODE (type1) == TYPE_CODE_BOOL
663            &&
664            TYPE_CODE (type2) == TYPE_CODE_BOOL)
665       {
666           LONGEST v1, v2, v;
667           v1 = value_as_long (arg1);
668           v2 = value_as_long (arg2);
669           
670           switch (op)
671             {
672             case BINOP_BITWISE_AND:
673               v = v1 & v2;
674               break;
675               
676             case BINOP_BITWISE_IOR:
677               v = v1 | v2;
678               break;
679               
680             case BINOP_BITWISE_XOR:
681               v = v1 ^ v2;
682               break;
683               
684             default:
685               error ("Invalid operation on booleans.");
686             }
687           
688           val = allocate_value (type1);
689           store_signed_integer (VALUE_CONTENTS_RAW (val),
690                                 TYPE_LENGTH (type1),
691                                 v);
692       }
693   else
694     /* Integral operations here.  */
695     /* FIXME:  Also mixed integral/booleans, with result an integer. */
696     /* FIXME: This implements ANSI C rules (also correct for C++).
697        What about FORTRAN and chill?  */
698     {
699       int promoted_len1 = TYPE_LENGTH (type1);
700       int promoted_len2 = TYPE_LENGTH (type2);
701       int is_unsigned1 = TYPE_UNSIGNED (type1);
702       int is_unsigned2 = TYPE_UNSIGNED (type2);
703       int result_len;
704       int unsigned_operation;
705
706       /* Determine type length and signedness after promotion for
707          both operands.  */
708       if (promoted_len1 < TYPE_LENGTH (builtin_type_int))
709         {
710           is_unsigned1 = 0;
711           promoted_len1 = TYPE_LENGTH (builtin_type_int);
712         }
713       if (promoted_len2 < TYPE_LENGTH (builtin_type_int))
714         {
715           is_unsigned2 = 0;
716           promoted_len2 = TYPE_LENGTH (builtin_type_int);
717         }
718
719       /* Determine type length of the result, and if the operation should
720          be done unsigned.
721          Use the signedness of the operand with the greater length.
722          If both operands are of equal length, use unsigned operation
723          if one of the operands is unsigned.  */
724       if (promoted_len1 > promoted_len2)
725         {
726           unsigned_operation = is_unsigned1;
727           result_len = promoted_len1;
728         }
729       else if (promoted_len2 > promoted_len1)
730         {
731           unsigned_operation = is_unsigned2;
732           result_len = promoted_len2;
733         }
734       else
735         {
736           unsigned_operation = is_unsigned1 || is_unsigned2;
737           result_len = promoted_len1;
738         }
739
740       if (unsigned_operation)
741         {
742           unsigned LONGEST v1, v2, v;
743           v1 = (unsigned LONGEST) value_as_long (arg1);
744           v2 = (unsigned LONGEST) value_as_long (arg2);
745
746           /* Truncate values to the type length of the result.  */
747           if (result_len < sizeof (unsigned LONGEST))
748             {
749               v1 &= ((LONGEST) 1 << HOST_CHAR_BIT * result_len) - 1;
750               v2 &= ((LONGEST) 1 << HOST_CHAR_BIT * result_len) - 1;
751             }
752           
753           switch (op)
754             {
755             case BINOP_ADD:
756               v = v1 + v2;
757               break;
758               
759             case BINOP_SUB:
760               v = v1 - v2;
761               break;
762               
763             case BINOP_MUL:
764               v = v1 * v2;
765               break;
766               
767             case BINOP_DIV:
768               v = v1 / v2;
769               break;
770               
771             case BINOP_REM:
772               v = v1 % v2;
773               break;
774               
775             case BINOP_MOD:
776               /* Knuth 1.2.4, integer only.  Note that unlike the C '%' op,
777                  v1 mod 0 has a defined value, v1. */
778               /* Chill specifies that v2 must be > 0, so check for that. */
779               if (current_language -> la_language == language_chill
780                   && value_as_long (arg2) <= 0)
781                 {
782                   error ("Second operand of MOD must be greater than zero.");
783                 }
784               if (v2 == 0)
785                 {
786                   v = v1;
787                 }
788               else
789                 {
790                   v = v1/v2;
791                   /* Note floor(v1/v2) == v1/v2 for unsigned. */
792                   v = v1 - (v2 * v);
793                 }
794               break;
795               
796             case BINOP_LSH:
797               v = v1 << v2;
798               break;
799               
800             case BINOP_RSH:
801               v = v1 >> v2;
802               break;
803               
804             case BINOP_BITWISE_AND:
805               v = v1 & v2;
806               break;
807               
808             case BINOP_BITWISE_IOR:
809               v = v1 | v2;
810               break;
811               
812             case BINOP_BITWISE_XOR:
813               v = v1 ^ v2;
814               break;
815               
816             case BINOP_LOGICAL_AND:
817               v = v1 && v2;
818               break;
819               
820             case BINOP_LOGICAL_OR:
821               v = v1 || v2;
822               break;
823               
824             case BINOP_MIN:
825               v = v1 < v2 ? v1 : v2;
826               break;
827               
828             case BINOP_MAX:
829               v = v1 > v2 ? v1 : v2;
830               break;
831
832             case BINOP_EQUAL:
833               v = v1 == v2;
834               break;
835
836             case BINOP_LESS:
837               v = v1 < v2;
838               break;
839               
840             default:
841               error ("Invalid binary operation on numbers.");
842             }
843
844           /* This is a kludge to get around the fact that we don't
845              know how to determine the result type from the types of
846              the operands.  (I'm not really sure how much we feel the
847              need to duplicate the exact rules of the current
848              language.  They can get really hairy.  But not to do so
849              makes it hard to document just what we *do* do).  */
850
851           /* Can't just call init_type because we wouldn't know what
852              name to give the type.  */
853           val = allocate_value
854             (result_len > TARGET_LONG_BIT / HOST_CHAR_BIT
855              ? builtin_type_unsigned_long_long
856              : builtin_type_unsigned_long);
857           store_unsigned_integer (VALUE_CONTENTS_RAW (val),
858                                   TYPE_LENGTH (VALUE_TYPE (val)),
859                                   v);
860         }
861       else
862         {
863           LONGEST v1, v2, v;
864           v1 = value_as_long (arg1);
865           v2 = value_as_long (arg2);
866           
867           switch (op)
868             {
869             case BINOP_ADD:
870               v = v1 + v2;
871               break;
872               
873             case BINOP_SUB:
874               v = v1 - v2;
875               break;
876               
877             case BINOP_MUL:
878               v = v1 * v2;
879               break;
880               
881             case BINOP_DIV:
882               v = v1 / v2;
883               break;
884               
885             case BINOP_REM:
886               v = v1 % v2;
887               break;
888               
889             case BINOP_MOD:
890               /* Knuth 1.2.4, integer only.  Note that unlike the C '%' op,
891                  X mod 0 has a defined value, X. */
892               /* Chill specifies that v2 must be > 0, so check for that. */
893               if (current_language -> la_language == language_chill
894                   && v2 <= 0)
895                 {
896                   error ("Second operand of MOD must be greater than zero.");
897                 }
898               if (v2 == 0)
899                 {
900                   v = v1;
901                 }
902               else
903                 {
904                   v = v1/v2;
905                   /* Compute floor. */
906                   if (TRUNCATION_TOWARDS_ZERO && (v < 0) && ((v1 % v2) != 0))
907                     {
908                       v--;
909                     }
910                   v = v1 - (v2 * v);
911                 }
912               break;
913               
914             case BINOP_LSH:
915               v = v1 << v2;
916               break;
917               
918             case BINOP_RSH:
919               v = v1 >> v2;
920               break;
921               
922             case BINOP_BITWISE_AND:
923               v = v1 & v2;
924               break;
925               
926             case BINOP_BITWISE_IOR:
927               v = v1 | v2;
928               break;
929               
930             case BINOP_BITWISE_XOR:
931               v = v1 ^ v2;
932               break;
933               
934             case BINOP_LOGICAL_AND:
935               v = v1 && v2;
936               break;
937               
938             case BINOP_LOGICAL_OR:
939               v = v1 || v2;
940               break;
941               
942             case BINOP_MIN:
943               v = v1 < v2 ? v1 : v2;
944               break;
945               
946             case BINOP_MAX:
947               v = v1 > v2 ? v1 : v2;
948               break;
949
950             case BINOP_EQUAL:
951               v = v1 == v2;
952               break;
953
954             case BINOP_LESS:
955               v = v1 < v2;
956               break;
957               
958             default:
959               error ("Invalid binary operation on numbers.");
960             }
961
962           /* This is a kludge to get around the fact that we don't
963              know how to determine the result type from the types of
964              the operands.  (I'm not really sure how much we feel the
965              need to duplicate the exact rules of the current
966              language.  They can get really hairy.  But not to do so
967              makes it hard to document just what we *do* do).  */
968
969           /* Can't just call init_type because we wouldn't know what
970              name to give the type.  */
971           val = allocate_value
972             (result_len > TARGET_LONG_BIT / HOST_CHAR_BIT
973              ? builtin_type_long_long
974              : builtin_type_long);
975           store_signed_integer (VALUE_CONTENTS_RAW (val),
976                                 TYPE_LENGTH (VALUE_TYPE (val)),
977                                 v);
978         }
979     }
980
981   return val;
982 }
983 \f
984 /* Simulate the C operator ! -- return 1 if ARG1 contains zero.  */
985
986 int
987 value_logical_not (arg1)
988      value_ptr arg1;
989 {
990   register int len;
991   register char *p;
992   struct type *type1;
993
994   COERCE_ARRAY (arg1);
995   type1 = check_typedef (VALUE_TYPE (arg1));
996
997   if (TYPE_CODE (type1) == TYPE_CODE_FLT)
998     return 0 == value_as_double (arg1);
999
1000   len = TYPE_LENGTH (type1);
1001   p = VALUE_CONTENTS (arg1);
1002
1003   while (--len >= 0)
1004     {
1005       if (*p++)
1006         break;
1007     }
1008
1009   return len < 0;
1010 }
1011
1012 /* Simulate the C operator == by returning a 1
1013    iff ARG1 and ARG2 have equal contents.  */
1014
1015 int
1016 value_equal (arg1, arg2)
1017      register value_ptr arg1, arg2;
1018
1019 {
1020   register int len;
1021   register char *p1, *p2;
1022   struct type *type1, *type2;
1023   enum type_code code1;
1024   enum type_code code2;
1025
1026   COERCE_ARRAY (arg1);
1027   COERCE_ARRAY (arg2);
1028
1029   type1 = check_typedef (VALUE_TYPE (arg1));
1030   type2 = check_typedef (VALUE_TYPE (arg2));
1031   code1 = TYPE_CODE (type1);
1032   code2 = TYPE_CODE (type2);
1033
1034   if (code1 == TYPE_CODE_INT && code2 == TYPE_CODE_INT)
1035     return longest_to_int (value_as_long (value_binop (arg1, arg2,
1036                                                        BINOP_EQUAL)));
1037   else if ((code1 == TYPE_CODE_FLT || code1 == TYPE_CODE_INT)
1038            && (code2 == TYPE_CODE_FLT || code2 == TYPE_CODE_INT))
1039     return value_as_double (arg1) == value_as_double (arg2);
1040
1041   /* FIXME: Need to promote to either CORE_ADDR or LONGEST, whichever
1042      is bigger.  */
1043   else if (code1 == TYPE_CODE_PTR && code2 == TYPE_CODE_INT)
1044     return value_as_pointer (arg1) == (CORE_ADDR) value_as_long (arg2);
1045   else if (code2 == TYPE_CODE_PTR && code1 == TYPE_CODE_INT)
1046     return (CORE_ADDR) value_as_long (arg1) == value_as_pointer (arg2);
1047
1048   else if (code1 == code2
1049            && ((len = TYPE_LENGTH (type1))
1050                == TYPE_LENGTH (type2)))
1051     {
1052       p1 = VALUE_CONTENTS (arg1);
1053       p2 = VALUE_CONTENTS (arg2);
1054       while (--len >= 0)
1055         {
1056           if (*p1++ != *p2++)
1057             break;
1058         }
1059       return len < 0;
1060     }
1061   else
1062     {
1063       error ("Invalid type combination in equality test.");
1064       return 0;  /* For lint -- never reached */
1065     }
1066 }
1067
1068 /* Simulate the C operator < by returning 1
1069    iff ARG1's contents are less than ARG2's.  */
1070
1071 int
1072 value_less (arg1, arg2)
1073      register value_ptr arg1, arg2;
1074 {
1075   register enum type_code code1;
1076   register enum type_code code2;
1077   struct type *type1, *type2;
1078
1079   COERCE_ARRAY (arg1);
1080   COERCE_ARRAY (arg2);
1081
1082   type1 = check_typedef (VALUE_TYPE (arg1));
1083   type2 = check_typedef (VALUE_TYPE (arg2));
1084   code1 = TYPE_CODE (type1);
1085   code2 = TYPE_CODE (type2);
1086
1087   if (code1 == TYPE_CODE_INT && code2 == TYPE_CODE_INT)
1088     return longest_to_int (value_as_long (value_binop (arg1, arg2,
1089                                                        BINOP_LESS)));
1090   else if ((code1 == TYPE_CODE_FLT || code1 == TYPE_CODE_INT)
1091            && (code2 == TYPE_CODE_FLT || code2 == TYPE_CODE_INT))
1092     return value_as_double (arg1) < value_as_double (arg2);
1093   else if (code1 == TYPE_CODE_PTR && code2 == TYPE_CODE_PTR)
1094     return value_as_pointer (arg1) < value_as_pointer (arg2);
1095
1096   /* FIXME: Need to promote to either CORE_ADDR or LONGEST, whichever
1097      is bigger.  */
1098   else if (code1 == TYPE_CODE_PTR && code2 == TYPE_CODE_INT)
1099     return value_as_pointer (arg1) < (CORE_ADDR) value_as_long (arg2);
1100   else if (code2 == TYPE_CODE_PTR && code1 == TYPE_CODE_INT)
1101     return (CORE_ADDR) value_as_long (arg1) < value_as_pointer (arg2);
1102
1103   else
1104     {
1105       error ("Invalid type combination in ordering comparison.");
1106       return 0;
1107     }
1108 }
1109 \f
1110 /* The unary operators - and ~.  Both free the argument ARG1.  */
1111
1112 value_ptr
1113 value_neg (arg1)
1114      register value_ptr arg1;
1115 {
1116   register struct type *type;
1117
1118   COERCE_ENUM (arg1);
1119
1120   type = check_typedef (VALUE_TYPE (arg1));
1121
1122   if (TYPE_CODE (type) == TYPE_CODE_FLT)
1123     return value_from_double (type, - value_as_double (arg1));
1124   else if (TYPE_CODE (type) == TYPE_CODE_INT)
1125     return value_from_longest (type, - value_as_long (arg1));
1126   else {
1127     error ("Argument to negate operation not a number.");
1128     return 0;  /* For lint -- never reached */
1129   }
1130 }
1131
1132 value_ptr
1133 value_complement (arg1)
1134      register value_ptr arg1;
1135 {
1136   COERCE_ENUM (arg1);
1137
1138   if (TYPE_CODE (check_typedef (VALUE_TYPE (arg1))) != TYPE_CODE_INT)
1139     error ("Argument to complement operation not an integer.");
1140
1141   return value_from_longest (VALUE_TYPE (arg1), ~ value_as_long (arg1));
1142 }
1143 \f
1144 /* The INDEX'th bit of SET value whose VALUE_TYPE is TYPE,
1145    and whose VALUE_CONTENTS is valaddr.
1146    Return -1 if out of range, -2 other error. */
1147
1148 int
1149 value_bit_index (type, valaddr, index)
1150      struct type *type;
1151      char *valaddr;
1152      int index;
1153 {
1154   LONGEST low_bound, high_bound;
1155   LONGEST word;
1156   unsigned rel_index;
1157   struct type *range = TYPE_FIELD_TYPE (type, 0);
1158   if (get_discrete_bounds (range, &low_bound, &high_bound) < 0)
1159     return -2;
1160   if (index < low_bound || index > high_bound)
1161     return -1;
1162   rel_index = index - low_bound;
1163   word = unpack_long (builtin_type_unsigned_char,
1164                       valaddr + (rel_index / TARGET_CHAR_BIT));
1165   rel_index %= TARGET_CHAR_BIT;
1166   if (BITS_BIG_ENDIAN)
1167     rel_index = TARGET_CHAR_BIT - 1 - rel_index;
1168   return (word >> rel_index) & 1;
1169 }
1170
1171 value_ptr
1172 value_in (element, set)
1173      value_ptr element, set;
1174 {
1175   int member;
1176   struct type *settype = check_typedef (VALUE_TYPE (set));
1177   struct type *eltype = check_typedef (VALUE_TYPE (element));
1178   if (TYPE_CODE (settype) != TYPE_CODE_SET)
1179     error ("Second argument of 'IN' has wrong type");
1180   if (TYPE_CODE (eltype) != TYPE_CODE_INT
1181       && TYPE_CODE (eltype) != TYPE_CODE_CHAR
1182       && TYPE_CODE (eltype) != TYPE_CODE_ENUM
1183       && TYPE_CODE (eltype) != TYPE_CODE_BOOL)
1184     error ("First argument of 'IN' has wrong type");
1185   member = value_bit_index (settype, VALUE_CONTENTS (set),
1186                             value_as_long (element));
1187   if (member < 0)
1188     error ("First argument of 'IN' not in range");
1189   return value_from_longest (builtin_type_int, member);
1190 }
1191
1192 void
1193 _initialize_valarith ()
1194 {
1195 }
This page took 0.092704 seconds and 4 git commands to generate.