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