1 /* Perform arithmetic and other operations on values, for GDB.
2 Copyright 1986, 1989, 1991, 1992 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
24 #include "expression.h"
29 value_subscripted_rvalue
PARAMS ((value
, value
));
33 value_add (arg1
, arg2
)
36 register value valint
, valptr
;
42 if ((TYPE_CODE (VALUE_TYPE (arg1
)) == TYPE_CODE_PTR
43 || TYPE_CODE (VALUE_TYPE (arg2
)) == TYPE_CODE_PTR
)
45 (TYPE_CODE (VALUE_TYPE (arg1
)) == TYPE_CODE_INT
46 || TYPE_CODE (VALUE_TYPE (arg2
)) == TYPE_CODE_INT
))
47 /* Exactly one argument is a pointer, and one is an integer. */
49 if (TYPE_CODE (VALUE_TYPE (arg1
)) == TYPE_CODE_PTR
)
59 len
= TYPE_LENGTH (TYPE_TARGET_TYPE (VALUE_TYPE (valptr
)));
60 if (len
== 0) len
= 1; /* For (void *) */
61 return value_from_longest (VALUE_TYPE (valptr
),
62 value_as_long (valptr
)
63 + (len
* value_as_long (valint
)));
66 return value_binop (arg1
, arg2
, BINOP_ADD
);
70 value_sub (arg1
, arg2
)
77 if (TYPE_CODE (VALUE_TYPE (arg1
)) == TYPE_CODE_PTR
)
79 if (TYPE_CODE (VALUE_TYPE (arg2
)) == TYPE_CODE_INT
)
81 /* pointer - integer. */
82 return value_from_longest
85 - (TYPE_LENGTH (TYPE_TARGET_TYPE (VALUE_TYPE (arg1
)))
86 * value_as_long (arg2
)));
88 else if (VALUE_TYPE (arg1
) == VALUE_TYPE (arg2
))
90 /* pointer to <type x> - pointer to <type x>. */
91 return value_from_longest
92 (builtin_type_long
, /* FIXME -- should be ptrdiff_t */
93 (value_as_long (arg1
) - value_as_long (arg2
))
94 / TYPE_LENGTH (TYPE_TARGET_TYPE (VALUE_TYPE (arg1
))));
99 First argument of `-' is a pointer and second argument is neither\n\
100 an integer nor a pointer of the same type.");
104 return value_binop (arg1
, arg2
, BINOP_SUB
);
107 /* Return the value of ARRAY[IDX]. */
110 value_subscript (array
, idx
)
113 if (TYPE_CODE (VALUE_TYPE (array
)) == TYPE_CODE_ARRAY
114 && VALUE_LVAL (array
) != lval_memory
)
115 return value_subscripted_rvalue (array
, idx
);
117 return value_ind (value_add (array
, idx
));
120 /* Return the value of EXPR[IDX], expr an aggregate rvalue
121 (eg, a vector register). This routine used to promote floats
122 to doubles, but no longer does. */
125 value_subscripted_rvalue (array
, idx
)
128 struct type
*elt_type
= TYPE_TARGET_TYPE (VALUE_TYPE (array
));
129 int elt_size
= TYPE_LENGTH (elt_type
);
130 int elt_offs
= elt_size
* longest_to_int (value_as_long (idx
));
133 if (elt_offs
>= TYPE_LENGTH (VALUE_TYPE (array
)))
134 error ("no such vector element");
136 v
= allocate_value (elt_type
);
137 memcpy (VALUE_CONTENTS (v
), VALUE_CONTENTS (array
) + elt_offs
, elt_size
);
139 if (VALUE_LVAL (array
) == lval_internalvar
)
140 VALUE_LVAL (v
) = lval_internalvar_component
;
142 VALUE_LVAL (v
) = not_lval
;
143 VALUE_ADDRESS (v
) = VALUE_ADDRESS (array
);
144 VALUE_OFFSET (v
) = VALUE_OFFSET (array
) + elt_offs
;
145 VALUE_BITSIZE (v
) = elt_size
* 8;
149 /* Check to see if either argument is a structure. This is called so
150 we know whether to go ahead with the normal binop or look for a
151 user defined function instead.
153 For now, we do not overload the `=' operator. */
156 binop_user_defined_p (op
, arg1
, arg2
)
160 if (op
== BINOP_ASSIGN
)
162 return (TYPE_CODE (VALUE_TYPE (arg1
)) == TYPE_CODE_STRUCT
163 || TYPE_CODE (VALUE_TYPE (arg2
)) == TYPE_CODE_STRUCT
164 || (TYPE_CODE (VALUE_TYPE (arg1
)) == TYPE_CODE_REF
165 && TYPE_CODE (TYPE_TARGET_TYPE (VALUE_TYPE (arg1
))) == TYPE_CODE_STRUCT
)
166 || (TYPE_CODE (VALUE_TYPE (arg2
)) == TYPE_CODE_REF
167 && TYPE_CODE (TYPE_TARGET_TYPE (VALUE_TYPE (arg2
))) == TYPE_CODE_STRUCT
));
170 /* Check to see if argument is a structure. This is called so
171 we know whether to go ahead with the normal unop or look for a
172 user defined function instead.
174 For now, we do not overload the `&' operator. */
176 int unop_user_defined_p (op
, arg1
)
182 return (TYPE_CODE (VALUE_TYPE (arg1
)) == TYPE_CODE_STRUCT
183 || (TYPE_CODE (VALUE_TYPE (arg1
)) == TYPE_CODE_REF
184 && TYPE_CODE (TYPE_TARGET_TYPE (VALUE_TYPE (arg1
))) == TYPE_CODE_STRUCT
));
187 /* We know either arg1 or arg2 is a structure, so try to find the right
188 user defined function. Create an argument vector that calls
189 arg1.operator @ (arg1,arg2) and return that value (where '@' is any
190 binary operator which is legal for GNU C++).
192 OP is the operatore, and if it is BINOP_ASSIGN_MODIFY, then OTHEROP
193 is the opcode saying how to modify it. Otherwise, OTHEROP is
197 value_x_binop (arg1
, arg2
, op
, otherop
)
199 enum exp_opcode op
, otherop
;
211 /* now we know that what we have to do is construct our
212 arg vector and find the right function to call it with. */
214 if (TYPE_CODE (VALUE_TYPE (arg1
)) != TYPE_CODE_STRUCT
)
215 error ("Can't do that binary op on that type"); /* FIXME be explicit */
217 argvec
= (value
*) alloca (sizeof (value
) * 4);
218 argvec
[1] = value_addr (arg1
);
222 /* make the right function name up */
223 strcpy(tstr
, "operator__");
227 case BINOP_ADD
: strcpy(ptr
,"+"); break;
228 case BINOP_SUB
: strcpy(ptr
,"-"); break;
229 case BINOP_MUL
: strcpy(ptr
,"*"); break;
230 case BINOP_DIV
: strcpy(ptr
,"/"); break;
231 case BINOP_REM
: strcpy(ptr
,"%"); break;
232 case BINOP_LSH
: strcpy(ptr
,"<<"); break;
233 case BINOP_RSH
: strcpy(ptr
,">>"); break;
234 case BINOP_BITWISE_AND
: strcpy(ptr
,"&"); break;
235 case BINOP_BITWISE_IOR
: strcpy(ptr
,"|"); break;
236 case BINOP_BITWISE_XOR
: strcpy(ptr
,"^"); break;
237 case BINOP_LOGICAL_AND
: strcpy(ptr
,"&&"); break;
238 case BINOP_LOGICAL_OR
: strcpy(ptr
,"||"); break;
239 case BINOP_MIN
: strcpy(ptr
,"<?"); break;
240 case BINOP_MAX
: strcpy(ptr
,">?"); break;
241 case BINOP_ASSIGN
: strcpy(ptr
,"="); break;
242 case BINOP_ASSIGN_MODIFY
:
245 case BINOP_ADD
: strcpy(ptr
,"+="); break;
246 case BINOP_SUB
: strcpy(ptr
,"-="); break;
247 case BINOP_MUL
: strcpy(ptr
,"*="); break;
248 case BINOP_DIV
: strcpy(ptr
,"/="); break;
249 case BINOP_REM
: strcpy(ptr
,"%="); break;
250 case BINOP_BITWISE_AND
: strcpy(ptr
,"&="); break;
251 case BINOP_BITWISE_IOR
: strcpy(ptr
,"|="); break;
252 case BINOP_BITWISE_XOR
: strcpy(ptr
,"^="); break;
254 error ("Invalid binary operation specified.");
257 case BINOP_SUBSCRIPT
: strcpy(ptr
,"[]"); break;
258 case BINOP_EQUAL
: strcpy(ptr
,"=="); break;
259 case BINOP_NOTEQUAL
: strcpy(ptr
,"!="); break;
260 case BINOP_LESS
: strcpy(ptr
,"<"); break;
261 case BINOP_GTR
: strcpy(ptr
,">"); break;
262 case BINOP_GEQ
: strcpy(ptr
,">="); break;
263 case BINOP_LEQ
: strcpy(ptr
,"<="); break;
265 error ("Invalid binary operation specified.");
267 argvec
[0] = value_struct_elt (&arg1
, argvec
+1, tstr
, &static_memfuncp
, "structure");
272 argvec
[1] = argvec
[0];
275 return call_function_by_hand (argvec
[0], 2 - static_memfuncp
, argvec
+ 1);
277 error ("member function %s not found", tstr
);
279 return call_function_by_hand (argvec
[0], 2 - static_memfuncp
, argvec
+ 1);
283 /* We know that arg1 is a structure, so try to find a unary user
284 defined operator that matches the operator in question.
285 Create an argument vector that calls arg1.operator @ (arg1)
286 and return that value (where '@' is (almost) any unary operator which
287 is legal for GNU C++). */
290 value_x_unop (arg1
, op
)
301 /* now we know that what we have to do is construct our
302 arg vector and find the right function to call it with. */
304 if (TYPE_CODE (VALUE_TYPE (arg1
)) != TYPE_CODE_STRUCT
)
305 error ("Can't do that unary op on that type"); /* FIXME be explicit */
307 argvec
= (value
*) alloca (sizeof (value
) * 3);
308 argvec
[1] = value_addr (arg1
);
311 /* make the right function name up */
312 strcpy(tstr
,"operator__");
316 case UNOP_PREINCREMENT
: strcpy(ptr
,"++"); break;
317 case UNOP_PREDECREMENT
: strcpy(ptr
,"++"); break;
318 case UNOP_POSTINCREMENT
: strcpy(ptr
,"++"); break;
319 case UNOP_POSTDECREMENT
: strcpy(ptr
,"++"); break;
320 case UNOP_LOGICAL_NOT
: strcpy(ptr
,"!"); break;
321 case UNOP_COMPLEMENT
: strcpy(ptr
,"~"); break;
322 case UNOP_NEG
: strcpy(ptr
,"-"); break;
324 error ("Invalid binary operation specified.");
326 argvec
[0] = value_struct_elt (&arg1
, argvec
+1, tstr
, &static_memfuncp
, "structure");
331 argvec
[1] = argvec
[0];
334 return call_function_by_hand (argvec
[0], 1 - static_memfuncp
, argvec
+ 1);
336 error ("member function %s not found", tstr
);
337 return 0; /* For lint -- never reached */
340 /* Perform a binary operation on two integers or two floats.
341 Does not support addition and subtraction on pointers;
342 use value_add or value_sub if you want to handle those possibilities. */
345 value_binop (arg1
, arg2
, op
)
354 if ((TYPE_CODE (VALUE_TYPE (arg1
)) != TYPE_CODE_FLT
356 TYPE_CODE (VALUE_TYPE (arg1
)) != TYPE_CODE_INT
358 TYPE_CODE (VALUE_TYPE (arg1
)) != TYPE_CODE_BOOL
)
360 (TYPE_CODE (VALUE_TYPE (arg2
)) != TYPE_CODE_FLT
362 TYPE_CODE (VALUE_TYPE (arg2
)) != TYPE_CODE_INT
364 TYPE_CODE (VALUE_TYPE (arg2
)) != TYPE_CODE_BOOL
))
365 error ("Argument to arithmetic operation not a number or boolean.");
367 if (TYPE_CODE (VALUE_TYPE (arg1
)) == TYPE_CODE_FLT
369 TYPE_CODE (VALUE_TYPE (arg2
)) == TYPE_CODE_FLT
)
372 v1
= value_as_double (arg1
);
373 v2
= value_as_double (arg2
);
393 error ("Integer-only operation on floating point number.");
396 val
= allocate_value (builtin_type_double
);
397 SWAP_TARGET_AND_HOST (&v
, sizeof (v
));
398 *(double *) VALUE_CONTENTS_RAW (val
) = v
;
400 else if (TYPE_CODE (VALUE_TYPE (arg1
)) == TYPE_CODE_BOOL
402 TYPE_CODE (VALUE_TYPE (arg2
)) == TYPE_CODE_BOOL
)
405 v1
= value_as_long (arg1
);
406 v2
= value_as_long (arg2
);
410 case BINOP_BITWISE_AND
:
414 case BINOP_BITWISE_IOR
:
418 case BINOP_BITWISE_XOR
:
423 error ("Invalid operation on booleans.");
426 val
= allocate_value (builtin_type_chill_bool
);
427 SWAP_TARGET_AND_HOST (&v
, sizeof (v
));
428 *(LONGEST
*) VALUE_CONTENTS_RAW (val
) = v
;
431 /* Integral operations here. */
432 /* FIXME: Also mixed integral/booleans, with result an integer. */
434 /* Should we promote to unsigned longest? */
435 if ((TYPE_UNSIGNED (VALUE_TYPE (arg1
))
436 || TYPE_UNSIGNED (VALUE_TYPE (arg2
)))
437 && (TYPE_LENGTH (VALUE_TYPE (arg1
)) >= sizeof (unsigned LONGEST
)
438 || TYPE_LENGTH (VALUE_TYPE (arg1
)) >= sizeof (unsigned LONGEST
)))
440 unsigned LONGEST v1
, v2
, v
;
441 v1
= (unsigned LONGEST
) value_as_long (arg1
);
442 v2
= (unsigned LONGEST
) value_as_long (arg2
);
474 case BINOP_BITWISE_AND
:
478 case BINOP_BITWISE_IOR
:
482 case BINOP_BITWISE_XOR
:
486 case BINOP_LOGICAL_AND
:
490 case BINOP_LOGICAL_OR
:
495 v
= v1
< v2
? v1
: v2
;
499 v
= v1
> v2
? v1
: v2
;
503 error ("Invalid binary operation on numbers.");
506 val
= allocate_value (BUILTIN_TYPE_UNSIGNED_LONGEST
);
507 SWAP_TARGET_AND_HOST (&v
, sizeof (v
));
508 *(unsigned LONGEST
*) VALUE_CONTENTS_RAW (val
) = v
;
513 v1
= value_as_long (arg1
);
514 v2
= value_as_long (arg2
);
546 case BINOP_BITWISE_AND
:
550 case BINOP_BITWISE_IOR
:
554 case BINOP_BITWISE_XOR
:
558 case BINOP_LOGICAL_AND
:
562 case BINOP_LOGICAL_OR
:
567 v
= v1
< v2
? v1
: v2
;
571 v
= v1
> v2
? v1
: v2
;
575 error ("Invalid binary operation on numbers.");
578 val
= allocate_value (BUILTIN_TYPE_LONGEST
);
579 SWAP_TARGET_AND_HOST (&v
, sizeof (v
));
580 *(LONGEST
*) VALUE_CONTENTS_RAW (val
) = v
;
587 /* Simulate the C operator ! -- return 1 if ARG1 contains zero. */
590 value_logical_not (arg1
)
598 if (TYPE_CODE (VALUE_TYPE (arg1
)) == TYPE_CODE_FLT
)
599 return 0 == value_as_double (arg1
);
601 len
= TYPE_LENGTH (VALUE_TYPE (arg1
));
602 p
= VALUE_CONTENTS (arg1
);
613 /* Simulate the C operator == by returning a 1
614 iff ARG1 and ARG2 have equal contents. */
617 value_equal (arg1
, arg2
)
618 register value arg1
, arg2
;
622 register char *p1
, *p2
;
623 enum type_code code1
;
624 enum type_code code2
;
629 code1
= TYPE_CODE (VALUE_TYPE (arg1
));
630 code2
= TYPE_CODE (VALUE_TYPE (arg2
));
632 if (code1
== TYPE_CODE_INT
&& code2
== TYPE_CODE_INT
)
633 return value_as_long (arg1
) == value_as_long (arg2
);
634 else if ((code1
== TYPE_CODE_FLT
|| code1
== TYPE_CODE_INT
)
635 && (code2
== TYPE_CODE_FLT
|| code2
== TYPE_CODE_INT
))
636 return value_as_double (arg1
) == value_as_double (arg2
);
638 /* FIXME: Need to promote to either CORE_ADDR or LONGEST, whichever
640 else if (code1
== TYPE_CODE_PTR
&& code2
== TYPE_CODE_INT
)
641 return value_as_pointer (arg1
) == (CORE_ADDR
) value_as_long (arg2
);
642 else if (code2
== TYPE_CODE_PTR
&& code1
== TYPE_CODE_INT
)
643 return (CORE_ADDR
) value_as_long (arg1
) == value_as_pointer (arg2
);
645 else if (code1
== code2
646 && ((len
= TYPE_LENGTH (VALUE_TYPE (arg1
)))
647 == TYPE_LENGTH (VALUE_TYPE (arg2
))))
649 p1
= VALUE_CONTENTS (arg1
);
650 p2
= VALUE_CONTENTS (arg2
);
660 error ("Invalid type combination in equality test.");
661 return 0; /* For lint -- never reached */
665 /* Simulate the C operator < by returning 1
666 iff ARG1's contents are less than ARG2's. */
669 value_less (arg1
, arg2
)
670 register value arg1
, arg2
;
672 register enum type_code code1
;
673 register enum type_code code2
;
678 code1
= TYPE_CODE (VALUE_TYPE (arg1
));
679 code2
= TYPE_CODE (VALUE_TYPE (arg2
));
681 if (code1
== TYPE_CODE_INT
&& code2
== TYPE_CODE_INT
)
683 if (TYPE_UNSIGNED (VALUE_TYPE (arg1
))
684 || TYPE_UNSIGNED (VALUE_TYPE (arg2
)))
685 return ((unsigned LONGEST
) value_as_long (arg1
)
686 < (unsigned LONGEST
) value_as_long (arg2
));
688 return value_as_long (arg1
) < value_as_long (arg2
);
690 else if ((code1
== TYPE_CODE_FLT
|| code1
== TYPE_CODE_INT
)
691 && (code2
== TYPE_CODE_FLT
|| code2
== TYPE_CODE_INT
))
692 return value_as_double (arg1
) < value_as_double (arg2
);
693 else if (code1
== TYPE_CODE_PTR
&& code2
== TYPE_CODE_PTR
)
694 return value_as_pointer (arg1
) < value_as_pointer (arg2
);
696 /* FIXME: Need to promote to either CORE_ADDR or LONGEST, whichever
698 else if (code1
== TYPE_CODE_PTR
&& code2
== TYPE_CODE_INT
)
699 return value_as_pointer (arg1
) < (CORE_ADDR
) value_as_long (arg2
);
700 else if (code2
== TYPE_CODE_PTR
&& code1
== TYPE_CODE_INT
)
701 return (CORE_ADDR
) value_as_long (arg1
) < value_as_pointer (arg2
);
705 error ("Invalid type combination in ordering comparison.");
710 /* The unary operators - and ~. Both free the argument ARG1. */
716 register struct type
*type
;
720 type
= VALUE_TYPE (arg1
);
722 if (TYPE_CODE (type
) == TYPE_CODE_FLT
)
723 return value_from_double (type
, - value_as_double (arg1
));
724 else if (TYPE_CODE (type
) == TYPE_CODE_INT
)
725 return value_from_longest (type
, - value_as_long (arg1
));
727 error ("Argument to negate operation not a number.");
728 return 0; /* For lint -- never reached */
733 value_complement (arg1
)
738 if (TYPE_CODE (VALUE_TYPE (arg1
)) != TYPE_CODE_INT
)
739 error ("Argument to complement operation not an integer.");
741 return value_from_longest (VALUE_TYPE (arg1
), ~ value_as_long (arg1
));