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