]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/expprint.c
* elf32-s390.c (elf_howto_table): Change R_390_GOT12 to
[thirdparty/binutils-gdb.git] / gdb / expprint.c
CommitLineData
c906108c 1/* Print in infix form a struct expression.
1bac305b 2
b6ba6518 3 Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
1bac305b 4 1998, 1999, 2000, 2003 Free Software Foundation, Inc.
c906108c 5
c5aa993b 6 This file is part of GDB.
c906108c 7
c5aa993b
JM
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
c906108c 12
c5aa993b
JM
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
c906108c 17
c5aa993b
JM
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
c906108c
SS
22
23#include "defs.h"
24#include "symtab.h"
25#include "gdbtypes.h"
26#include "expression.h"
27#include "value.h"
28#include "language.h"
29#include "parser-defs.h"
e36180d7 30#include "frame.h" /* For frame_map_regnum_to_name. */
82eeeb94
AF
31#include "target.h"
32#include "gdb_string.h"
fe898f56 33#include "block.h"
c906108c
SS
34
35#ifdef HAVE_CTYPE_H
36#include <ctype.h>
37#endif
38
39/* Prototypes for local functions */
40
d9fcf2fb
JM
41static void print_subexp (struct expression *, int *, struct ui_file *,
42 enum precedence);
c906108c
SS
43
44void
fba45db2 45print_expression (struct expression *exp, struct ui_file *stream)
c906108c
SS
46{
47 int pc = 0;
48 print_subexp (exp, &pc, stream, PREC_NULL);
49}
50
51/* Print the subexpression of EXP that starts in position POS, on STREAM.
52 PREC is the precedence of the surrounding operator;
53 if the precedence of the main operator of this subexpression is less,
54 parentheses are needed here. */
55
56static void
fba45db2
KB
57print_subexp (register struct expression *exp, register int *pos,
58 struct ui_file *stream, enum precedence prec)
c906108c
SS
59{
60 register unsigned tem;
61 register const struct op_print *op_print_tab;
62 register int pc;
63 unsigned nargs;
64 register char *op_str;
65 int assign_modify = 0;
66 enum exp_opcode opcode;
67 enum precedence myprec = PREC_NULL;
68 /* Set to 1 for a right-associative operator. */
69 int assoc = 0;
3d6d86c6 70 struct value *val;
c906108c
SS
71 char *tempstr = NULL;
72
73 op_print_tab = exp->language_defn->la_op_print_tab;
74 pc = (*pos)++;
75 opcode = exp->elts[pc].opcode;
76 switch (opcode)
77 {
c5aa993b 78 /* Common ops */
c906108c
SS
79
80 case OP_SCOPE:
81 myprec = PREC_PREFIX;
82 assoc = 0;
83 fputs_filtered (type_name_no_tag (exp->elts[pc + 1].type), stream);
84 fputs_filtered ("::", stream);
85 nargs = longest_to_int (exp->elts[pc + 2].longconst);
86 (*pos) += 4 + BYTES_TO_EXP_ELEM (nargs + 1);
87 fputs_filtered (&exp->elts[pc + 3].string, stream);
88 return;
89
90 case OP_LONG:
91 (*pos) += 3;
92 value_print (value_from_longest (exp->elts[pc + 1].type,
93 exp->elts[pc + 2].longconst),
94 stream, 0, Val_no_prettyprint);
95 return;
96
97 case OP_DOUBLE:
98 (*pos) += 3;
99 value_print (value_from_double (exp->elts[pc + 1].type,
100 exp->elts[pc + 2].doubleconst),
101 stream, 0, Val_no_prettyprint);
102 return;
103
104 case OP_VAR_VALUE:
105 {
106 struct block *b;
107 (*pos) += 3;
108 b = exp->elts[pc + 1].block;
109 if (b != NULL
110 && BLOCK_FUNCTION (b) != NULL
de5ad195 111 && SYMBOL_PRINT_NAME (BLOCK_FUNCTION (b)) != NULL)
c906108c 112 {
de5ad195 113 fputs_filtered (SYMBOL_PRINT_NAME (BLOCK_FUNCTION (b)), stream);
c906108c
SS
114 fputs_filtered ("::", stream);
115 }
de5ad195 116 fputs_filtered (SYMBOL_PRINT_NAME (exp->elts[pc + 2].symbol), stream);
c906108c
SS
117 }
118 return;
119
120 case OP_LAST:
121 (*pos) += 2;
122 fprintf_filtered (stream, "$%d",
123 longest_to_int (exp->elts[pc + 1].longconst));
124 return;
125
126 case OP_REGISTER:
e36180d7
AC
127 {
128 int regnum = longest_to_int (exp->elts[pc + 1].longconst);
129 (*pos) += 2;
130 fprintf_filtered (stream, "$%s", frame_map_regnum_to_name (regnum));
131 return;
132 }
c906108c
SS
133
134 case OP_BOOL:
135 (*pos) += 2;
136 fprintf_filtered (stream, "%s",
137 longest_to_int (exp->elts[pc + 1].longconst)
138 ? "TRUE" : "FALSE");
139 return;
140
141 case OP_INTERNALVAR:
142 (*pos) += 2;
143 fprintf_filtered (stream, "$%s",
c5aa993b 144 internalvar_name (exp->elts[pc + 1].internalvar));
c906108c
SS
145 return;
146
147 case OP_FUNCALL:
148 (*pos) += 2;
149 nargs = longest_to_int (exp->elts[pc + 1].longconst);
150 print_subexp (exp, pos, stream, PREC_SUFFIX);
151 fputs_filtered (" (", stream);
152 for (tem = 0; tem < nargs; tem++)
153 {
154 if (tem != 0)
155 fputs_filtered (", ", stream);
156 print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
157 }
158 fputs_filtered (")", stream);
159 return;
160
161 case OP_NAME:
162 case OP_EXPRSTRING:
c5aa993b 163 nargs = longest_to_int (exp->elts[pc + 1].longconst);
c906108c
SS
164 (*pos) += 3 + BYTES_TO_EXP_ELEM (nargs + 1);
165 fputs_filtered (&exp->elts[pc + 2].string, stream);
166 return;
167
168 case OP_STRING:
c5aa993b 169 nargs = longest_to_int (exp->elts[pc + 1].longconst);
c906108c
SS
170 (*pos) += 3 + BYTES_TO_EXP_ELEM (nargs + 1);
171 /* LA_PRINT_STRING will print using the current repeat count threshold.
c5aa993b
JM
172 If necessary, we can temporarily set it to zero, or pass it as an
173 additional parameter to LA_PRINT_STRING. -fnf */
c906108c
SS
174 LA_PRINT_STRING (stream, &exp->elts[pc + 2].string, nargs, 1, 0);
175 return;
176
177 case OP_BITSTRING:
c5aa993b 178 nargs = longest_to_int (exp->elts[pc + 1].longconst);
c906108c
SS
179 (*pos)
180 += 3 + BYTES_TO_EXP_ELEM ((nargs + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT);
181 fprintf_unfiltered (stream, "B'<unimplemented>'");
182 return;
183
82eeeb94
AF
184 case OP_OBJC_NSSTRING: /* Objective-C Foundation Class NSString constant. */
185 nargs = longest_to_int (exp->elts[pc + 1].longconst);
186 (*pos) += 3 + BYTES_TO_EXP_ELEM (nargs + 1);
187 fputs_filtered ("@\"", stream);
188 LA_PRINT_STRING (stream, &exp->elts[pc + 2].string, nargs, 1, 0);
189 fputs_filtered ("\"", stream);
190 return;
191
192 case OP_OBJC_MSGCALL:
193 { /* Objective C message (method) call. */
194 char *selector;
195 (*pos) += 3;
196 nargs = longest_to_int (exp->elts[pc + 2].longconst);
197 fprintf_unfiltered (stream, "[");
198 print_subexp (exp, pos, stream, PREC_SUFFIX);
199 if (0 == target_read_string (exp->elts[pc + 1].longconst,
200 &selector, 1024, NULL))
201 {
202 error ("bad selector");
203 return;
204 }
205 if (nargs)
206 {
207 char *s, *nextS;
208 s = alloca (strlen (selector) + 1);
209 strcpy (s, selector);
210 for (tem = 0; tem < nargs; tem++)
211 {
212 nextS = strchr (s, ':');
213 *nextS = '\0';
214 fprintf_unfiltered (stream, " %s: ", s);
215 s = nextS + 1;
216 print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
217 }
218 }
219 else
220 {
221 fprintf_unfiltered (stream, " %s", selector);
222 }
223 fprintf_unfiltered (stream, "]");
224 /* "selector" was malloc'd by target_read_string. Free it. */
4ef3f3be 225 xfree (selector);
82eeeb94
AF
226 return;
227 }
228
c906108c
SS
229 case OP_ARRAY:
230 (*pos) += 3;
231 nargs = longest_to_int (exp->elts[pc + 2].longconst);
232 nargs -= longest_to_int (exp->elts[pc + 1].longconst);
233 nargs++;
234 tem = 0;
235 if (exp->elts[pc + 4].opcode == OP_LONG
236 && exp->elts[pc + 5].type == builtin_type_char
237 && exp->language_defn->la_language == language_c)
238 {
239 /* Attempt to print C character arrays using string syntax.
240 Walk through the args, picking up one character from each
241 of the OP_LONG expression elements. If any array element
242 does not match our expection of what we should find for
243 a simple string, revert back to array printing. Note that
244 the last expression element is an explicit null terminator
245 byte, which doesn't get printed. */
246 tempstr = alloca (nargs);
247 pc += 4;
248 while (tem < nargs)
249 {
250 if (exp->elts[pc].opcode != OP_LONG
251 || exp->elts[pc + 1].type != builtin_type_char)
252 {
253 /* Not a simple array of char, use regular array printing. */
254 tem = 0;
255 break;
256 }
257 else
258 {
259 tempstr[tem++] =
260 longest_to_int (exp->elts[pc + 2].longconst);
261 pc += 4;
262 }
263 }
264 }
265 if (tem > 0)
266 {
267 LA_PRINT_STRING (stream, tempstr, nargs - 1, 1, 0);
268 (*pos) = pc;
269 }
270 else
271 {
db034ac5 272 fputs_filtered (" {", stream);
c906108c
SS
273 for (tem = 0; tem < nargs; tem++)
274 {
275 if (tem != 0)
276 {
277 fputs_filtered (", ", stream);
278 }
279 print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
280 }
db034ac5 281 fputs_filtered ("}", stream);
c906108c
SS
282 }
283 return;
284
285 case OP_LABELED:
286 tem = longest_to_int (exp->elts[pc + 1].longconst);
287 (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1);
1b831c93 288 /* Gcc support both these syntaxes. Unsure which is preferred. */
c906108c 289#if 1
1b831c93
AC
290 fputs_filtered (&exp->elts[pc + 2].string, stream);
291 fputs_filtered (": ", stream);
c906108c 292#else
1b831c93
AC
293 fputs_filtered (".", stream);
294 fputs_filtered (&exp->elts[pc + 2].string, stream);
295 fputs_filtered ("=", stream);
c906108c 296#endif
c906108c
SS
297 print_subexp (exp, pos, stream, PREC_SUFFIX);
298 return;
299
300 case TERNOP_COND:
301 if ((int) prec > (int) PREC_COMMA)
302 fputs_filtered ("(", stream);
303 /* Print the subexpressions, forcing parentheses
c5aa993b
JM
304 around any binary operations within them.
305 This is more parentheses than are strictly necessary,
306 but it looks clearer. */
c906108c
SS
307 print_subexp (exp, pos, stream, PREC_HYPER);
308 fputs_filtered (" ? ", stream);
309 print_subexp (exp, pos, stream, PREC_HYPER);
310 fputs_filtered (" : ", stream);
311 print_subexp (exp, pos, stream, PREC_HYPER);
312 if ((int) prec > (int) PREC_COMMA)
313 fputs_filtered (")", stream);
314 return;
315
316 case TERNOP_SLICE:
317 case TERNOP_SLICE_COUNT:
318 print_subexp (exp, pos, stream, PREC_SUFFIX);
319 fputs_filtered ("(", stream);
320 print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
321 fputs_filtered (opcode == TERNOP_SLICE ? " : " : " UP ", stream);
322 print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
323 fputs_filtered (")", stream);
324 return;
325
326 case STRUCTOP_STRUCT:
327 tem = longest_to_int (exp->elts[pc + 1].longconst);
328 (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1);
329 print_subexp (exp, pos, stream, PREC_SUFFIX);
330 fputs_filtered (".", stream);
331 fputs_filtered (&exp->elts[pc + 2].string, stream);
332 return;
333
c5aa993b 334 /* Will not occur for Modula-2 */
c906108c
SS
335 case STRUCTOP_PTR:
336 tem = longest_to_int (exp->elts[pc + 1].longconst);
337 (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1);
338 print_subexp (exp, pos, stream, PREC_SUFFIX);
339 fputs_filtered ("->", stream);
340 fputs_filtered (&exp->elts[pc + 2].string, stream);
341 return;
342
343 case BINOP_SUBSCRIPT:
344 print_subexp (exp, pos, stream, PREC_SUFFIX);
345 fputs_filtered ("[", stream);
346 print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
347 fputs_filtered ("]", stream);
348 return;
349
350 case UNOP_POSTINCREMENT:
351 print_subexp (exp, pos, stream, PREC_SUFFIX);
352 fputs_filtered ("++", stream);
353 return;
354
355 case UNOP_POSTDECREMENT:
356 print_subexp (exp, pos, stream, PREC_SUFFIX);
357 fputs_filtered ("--", stream);
358 return;
359
360 case UNOP_CAST:
361 (*pos) += 2;
362 if ((int) prec > (int) PREC_PREFIX)
c5aa993b 363 fputs_filtered ("(", stream);
c906108c
SS
364 fputs_filtered ("(", stream);
365 type_print (exp->elts[pc + 1].type, "", stream, 0);
366 fputs_filtered (") ", stream);
367 print_subexp (exp, pos, stream, PREC_PREFIX);
368 if ((int) prec > (int) PREC_PREFIX)
c5aa993b 369 fputs_filtered (")", stream);
c906108c
SS
370 return;
371
372 case UNOP_MEMVAL:
373 (*pos) += 2;
374 if ((int) prec > (int) PREC_PREFIX)
c5aa993b 375 fputs_filtered ("(", stream);
0004e5a2 376 if (TYPE_CODE (exp->elts[pc + 1].type) == TYPE_CODE_FUNC &&
c5aa993b
JM
377 exp->elts[pc + 3].opcode == OP_LONG)
378 {
379 /* We have a minimal symbol fn, probably. It's encoded
380 as a UNOP_MEMVAL (function-type) of an OP_LONG (int, address).
381 Swallow the OP_LONG (including both its opcodes); ignore
382 its type; print the value in the type of the MEMVAL. */
383 (*pos) += 4;
384 val = value_at_lazy (exp->elts[pc + 1].type,
385 (CORE_ADDR) exp->elts[pc + 5].longconst,
386 NULL);
387 value_print (val, stream, 0, Val_no_prettyprint);
388 }
389 else
390 {
391 fputs_filtered ("{", stream);
392 type_print (exp->elts[pc + 1].type, "", stream, 0);
393 fputs_filtered ("} ", stream);
394 print_subexp (exp, pos, stream, PREC_PREFIX);
395 }
c906108c 396 if ((int) prec > (int) PREC_PREFIX)
c5aa993b 397 fputs_filtered (")", stream);
c906108c
SS
398 return;
399
400 case BINOP_ASSIGN_MODIFY:
401 opcode = exp->elts[pc + 1].opcode;
402 (*pos) += 2;
403 myprec = PREC_ASSIGN;
404 assoc = 1;
405 assign_modify = 1;
406 op_str = "???";
407 for (tem = 0; op_print_tab[tem].opcode != OP_NULL; tem++)
408 if (op_print_tab[tem].opcode == opcode)
409 {
410 op_str = op_print_tab[tem].string;
411 break;
412 }
413 if (op_print_tab[tem].opcode != opcode)
414 /* Not found; don't try to keep going because we don't know how
415 to interpret further elements. */
416 error ("Invalid expression");
417 break;
418
c5aa993b 419 /* C++ ops */
c906108c
SS
420
421 case OP_THIS:
422 ++(*pos);
423 fputs_filtered ("this", stream);
424 return;
425
82eeeb94
AF
426 /* Objective-C ops */
427
428 case OP_OBJC_SELF:
429 ++(*pos);
430 fputs_filtered ("self", stream); /* The ObjC equivalent of "this". */
431 return;
432
c5aa993b 433 /* Modula-2 ops */
c906108c
SS
434
435 case MULTI_SUBSCRIPT:
436 (*pos) += 2;
437 nargs = longest_to_int (exp->elts[pc + 1].longconst);
438 print_subexp (exp, pos, stream, PREC_SUFFIX);
439 fprintf_unfiltered (stream, " [");
440 for (tem = 0; tem < nargs; tem++)
441 {
442 if (tem != 0)
443 fprintf_unfiltered (stream, ", ");
444 print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
445 }
446 fprintf_unfiltered (stream, "]");
447 return;
448
449 case BINOP_VAL:
c5aa993b
JM
450 (*pos) += 2;
451 fprintf_unfiltered (stream, "VAL(");
452 type_print (exp->elts[pc + 1].type, "", stream, 0);
453 fprintf_unfiltered (stream, ",");
454 print_subexp (exp, pos, stream, PREC_PREFIX);
455 fprintf_unfiltered (stream, ")");
c906108c 456 return;
c5aa993b 457
c906108c
SS
458 case BINOP_INCL:
459 case BINOP_EXCL:
c5aa993b 460 error ("print_subexp: Not implemented.");
c906108c 461
c5aa993b 462 /* Default ops */
c906108c
SS
463
464 default:
465 op_str = "???";
466 for (tem = 0; op_print_tab[tem].opcode != OP_NULL; tem++)
467 if (op_print_tab[tem].opcode == opcode)
468 {
469 op_str = op_print_tab[tem].string;
470 myprec = op_print_tab[tem].precedence;
471 assoc = op_print_tab[tem].right_assoc;
472 break;
473 }
474 if (op_print_tab[tem].opcode != opcode)
475 /* Not found; don't try to keep going because we don't know how
476 to interpret further elements. For example, this happens
477 if opcode is OP_TYPE. */
478 error ("Invalid expression");
c5aa993b 479 }
c906108c
SS
480
481 /* Note that PREC_BUILTIN will always emit parentheses. */
482 if ((int) myprec < (int) prec)
483 fputs_filtered ("(", stream);
484 if ((int) opcode > (int) BINOP_END)
485 {
486 if (assoc)
487 {
488 /* Unary postfix operator. */
489 print_subexp (exp, pos, stream, PREC_SUFFIX);
490 fputs_filtered (op_str, stream);
491 }
492 else
493 {
494 /* Unary prefix operator. */
495 fputs_filtered (op_str, stream);
496 if (myprec == PREC_BUILTIN_FUNCTION)
497 fputs_filtered ("(", stream);
498 print_subexp (exp, pos, stream, PREC_PREFIX);
499 if (myprec == PREC_BUILTIN_FUNCTION)
500 fputs_filtered (")", stream);
501 }
502 }
503 else
504 {
505 /* Binary operator. */
506 /* Print left operand.
c5aa993b
JM
507 If operator is right-associative,
508 increment precedence for this operand. */
c906108c
SS
509 print_subexp (exp, pos, stream,
510 (enum precedence) ((int) myprec + assoc));
511 /* Print the operator itself. */
512 if (assign_modify)
513 fprintf_filtered (stream, " %s= ", op_str);
514 else if (op_str[0] == ',')
515 fprintf_filtered (stream, "%s ", op_str);
516 else
517 fprintf_filtered (stream, " %s ", op_str);
518 /* Print right operand.
c5aa993b
JM
519 If operator is left-associative,
520 increment precedence for this operand. */
c906108c
SS
521 print_subexp (exp, pos, stream,
522 (enum precedence) ((int) myprec + !assoc));
523 }
524
525 if ((int) myprec < (int) prec)
526 fputs_filtered (")", stream);
527}
528
529/* Return the operator corresponding to opcode OP as
530 a string. NULL indicates that the opcode was not found in the
531 current language table. */
532char *
fba45db2 533op_string (enum exp_opcode op)
c906108c
SS
534{
535 int tem;
536 register const struct op_print *op_print_tab;
537
538 op_print_tab = current_language->la_op_print_tab;
539 for (tem = 0; op_print_tab[tem].opcode != OP_NULL; tem++)
540 if (op_print_tab[tem].opcode == op)
541 return op_print_tab[tem].string;
542 return NULL;
543}
544
c906108c
SS
545/* Support for dumping the raw data from expressions in a human readable
546 form. */
547
a14ed312 548static char *op_name (int opcode);
c906108c
SS
549
550static char *
fba45db2 551op_name (int opcode)
c906108c
SS
552{
553 switch (opcode)
554 {
555 default:
556 {
557 static char buf[30];
558
559 sprintf (buf, "<unknown %d>", opcode);
560 return buf;
561 }
c5aa993b
JM
562 case OP_NULL:
563 return "OP_NULL";
564 case BINOP_ADD:
565 return "BINOP_ADD";
566 case BINOP_SUB:
567 return "BINOP_SUB";
568 case BINOP_MUL:
569 return "BINOP_MUL";
570 case BINOP_DIV:
571 return "BINOP_DIV";
572 case BINOP_REM:
573 return "BINOP_REM";
574 case BINOP_MOD:
575 return "BINOP_MOD";
576 case BINOP_LSH:
577 return "BINOP_LSH";
578 case BINOP_RSH:
579 return "BINOP_RSH";
580 case BINOP_LOGICAL_AND:
581 return "BINOP_LOGICAL_AND";
582 case BINOP_LOGICAL_OR:
583 return "BINOP_LOGICAL_OR";
584 case BINOP_BITWISE_AND:
585 return "BINOP_BITWISE_AND";
586 case BINOP_BITWISE_IOR:
587 return "BINOP_BITWISE_IOR";
588 case BINOP_BITWISE_XOR:
589 return "BINOP_BITWISE_XOR";
590 case BINOP_EQUAL:
591 return "BINOP_EQUAL";
592 case BINOP_NOTEQUAL:
593 return "BINOP_NOTEQUAL";
594 case BINOP_LESS:
595 return "BINOP_LESS";
596 case BINOP_GTR:
597 return "BINOP_GTR";
598 case BINOP_LEQ:
599 return "BINOP_LEQ";
600 case BINOP_GEQ:
601 return "BINOP_GEQ";
602 case BINOP_REPEAT:
603 return "BINOP_REPEAT";
604 case BINOP_ASSIGN:
605 return "BINOP_ASSIGN";
606 case BINOP_COMMA:
607 return "BINOP_COMMA";
608 case BINOP_SUBSCRIPT:
609 return "BINOP_SUBSCRIPT";
610 case MULTI_SUBSCRIPT:
611 return "MULTI_SUBSCRIPT";
612 case BINOP_EXP:
613 return "BINOP_EXP";
614 case BINOP_MIN:
615 return "BINOP_MIN";
616 case BINOP_MAX:
617 return "BINOP_MAX";
c5aa993b
JM
618 case STRUCTOP_MEMBER:
619 return "STRUCTOP_MEMBER";
620 case STRUCTOP_MPTR:
621 return "STRUCTOP_MPTR";
622 case BINOP_INTDIV:
623 return "BINOP_INTDIV";
624 case BINOP_ASSIGN_MODIFY:
625 return "BINOP_ASSIGN_MODIFY";
626 case BINOP_VAL:
627 return "BINOP_VAL";
628 case BINOP_INCL:
629 return "BINOP_INCL";
630 case BINOP_EXCL:
631 return "BINOP_EXCL";
632 case BINOP_CONCAT:
633 return "BINOP_CONCAT";
634 case BINOP_RANGE:
635 return "BINOP_RANGE";
636 case BINOP_END:
637 return "BINOP_END";
638 case TERNOP_COND:
639 return "TERNOP_COND";
640 case TERNOP_SLICE:
641 return "TERNOP_SLICE";
642 case TERNOP_SLICE_COUNT:
643 return "TERNOP_SLICE_COUNT";
644 case OP_LONG:
645 return "OP_LONG";
646 case OP_DOUBLE:
647 return "OP_DOUBLE";
648 case OP_VAR_VALUE:
649 return "OP_VAR_VALUE";
650 case OP_LAST:
651 return "OP_LAST";
652 case OP_REGISTER:
653 return "OP_REGISTER";
654 case OP_INTERNALVAR:
655 return "OP_INTERNALVAR";
656 case OP_FUNCALL:
657 return "OP_FUNCALL";
658 case OP_STRING:
659 return "OP_STRING";
660 case OP_BITSTRING:
661 return "OP_BITSTRING";
662 case OP_ARRAY:
663 return "OP_ARRAY";
664 case UNOP_CAST:
665 return "UNOP_CAST";
666 case UNOP_MEMVAL:
667 return "UNOP_MEMVAL";
668 case UNOP_NEG:
669 return "UNOP_NEG";
670 case UNOP_LOGICAL_NOT:
671 return "UNOP_LOGICAL_NOT";
672 case UNOP_COMPLEMENT:
673 return "UNOP_COMPLEMENT";
674 case UNOP_IND:
675 return "UNOP_IND";
676 case UNOP_ADDR:
677 return "UNOP_ADDR";
678 case UNOP_PREINCREMENT:
679 return "UNOP_PREINCREMENT";
680 case UNOP_POSTINCREMENT:
681 return "UNOP_POSTINCREMENT";
682 case UNOP_PREDECREMENT:
683 return "UNOP_PREDECREMENT";
684 case UNOP_POSTDECREMENT:
685 return "UNOP_POSTDECREMENT";
686 case UNOP_SIZEOF:
687 return "UNOP_SIZEOF";
688 case UNOP_LOWER:
689 return "UNOP_LOWER";
690 case UNOP_UPPER:
691 return "UNOP_UPPER";
692 case UNOP_LENGTH:
693 return "UNOP_LENGTH";
694 case UNOP_PLUS:
695 return "UNOP_PLUS";
696 case UNOP_CAP:
697 return "UNOP_CAP";
698 case UNOP_CHR:
699 return "UNOP_CHR";
700 case UNOP_ORD:
701 return "UNOP_ORD";
702 case UNOP_ABS:
703 return "UNOP_ABS";
704 case UNOP_FLOAT:
705 return "UNOP_FLOAT";
706 case UNOP_HIGH:
707 return "UNOP_HIGH";
708 case UNOP_MAX:
709 return "UNOP_MAX";
710 case UNOP_MIN:
711 return "UNOP_MIN";
712 case UNOP_ODD:
713 return "UNOP_ODD";
714 case UNOP_TRUNC:
715 return "UNOP_TRUNC";
716 case OP_BOOL:
717 return "OP_BOOL";
718 case OP_M2_STRING:
719 return "OP_M2_STRING";
720 case STRUCTOP_STRUCT:
721 return "STRUCTOP_STRUCT";
722 case STRUCTOP_PTR:
723 return "STRUCTOP_PTR";
724 case OP_THIS:
725 return "OP_THIS";
82eeeb94
AF
726 case OP_OBJC_SELF:
727 return "OP_OBJC_SELF";
c5aa993b
JM
728 case OP_SCOPE:
729 return "OP_SCOPE";
730 case OP_TYPE:
731 return "OP_TYPE";
732 case OP_LABELED:
733 return "OP_LABELED";
c906108c
SS
734 }
735}
736
737void
fba45db2
KB
738dump_prefix_expression (struct expression *exp, struct ui_file *stream,
739 char *note)
c906108c
SS
740{
741 int elt;
742 char *opcode_name;
743 char *eltscan;
744 int eltsize;
745
746 fprintf_filtered (stream, "Dump of expression @ ");
d4f3574e 747 gdb_print_host_address (exp, stream);
c906108c
SS
748 fprintf_filtered (stream, ", %s:\nExpression: `", note);
749 if (exp->elts[0].opcode != OP_TYPE)
750 print_expression (exp, stream);
751 else
752 fprintf_filtered (stream, "Type printing not yet supported....");
9d271fd8 753 fprintf_filtered (stream, "'\n\tLanguage %s, %d elements, %ld bytes each.\n",
c5aa993b 754 exp->language_defn->la_name, exp->nelts,
9d271fd8 755 (long) sizeof (union exp_element));
c906108c
SS
756 fprintf_filtered (stream, "\t%5s %20s %16s %s\n", "Index", "Opcode",
757 "Hex Value", "String Value");
c5aa993b 758 for (elt = 0; elt < exp->nelts; elt++)
c906108c
SS
759 {
760 fprintf_filtered (stream, "\t%5d ", elt);
c5aa993b 761 opcode_name = op_name (exp->elts[elt].opcode);
c906108c
SS
762
763 fprintf_filtered (stream, "%20s ", opcode_name);
c5aa993b 764 print_longest (stream, 'd', 0, exp->elts[elt].longconst);
c906108c
SS
765 fprintf_filtered (stream, " ");
766
767 for (eltscan = (char *) &exp->elts[elt],
c5aa993b 768 eltsize = sizeof (union exp_element);
c906108c
SS
769 eltsize-- > 0;
770 eltscan++)
771 {
772 fprintf_filtered (stream, "%c",
773 isprint (*eltscan) ? (*eltscan & 0xFF) : '.');
774 }
775 fprintf_filtered (stream, "\n");
776 }
777}
778
a14ed312
KB
779static int dump_subexp (struct expression *exp, struct ui_file *stream,
780 int elt);
c906108c
SS
781
782static int
fba45db2 783dump_subexp (struct expression *exp, struct ui_file *stream, int elt)
c906108c
SS
784{
785 static int indent = 0;
786 int i;
787
788 fprintf_filtered (stream, "\n");
789 fprintf_filtered (stream, "\t%5d ", elt);
790
791 for (i = 1; i <= indent; i++)
792 fprintf_filtered (stream, " ");
793 indent += 2;
794
795 fprintf_filtered (stream, "%-20s ", op_name (exp->elts[elt].opcode));
796
c5aa993b 797 switch (exp->elts[elt++].opcode)
c906108c
SS
798 {
799 case TERNOP_COND:
800 case TERNOP_SLICE:
801 case TERNOP_SLICE_COUNT:
802 elt = dump_subexp (exp, stream, elt);
803 case BINOP_ADD:
804 case BINOP_SUB:
805 case BINOP_MUL:
806 case BINOP_DIV:
807 case BINOP_REM:
808 case BINOP_MOD:
809 case BINOP_LSH:
810 case BINOP_RSH:
811 case BINOP_LOGICAL_AND:
812 case BINOP_LOGICAL_OR:
813 case BINOP_BITWISE_AND:
814 case BINOP_BITWISE_IOR:
815 case BINOP_BITWISE_XOR:
816 case BINOP_EQUAL:
817 case BINOP_NOTEQUAL:
818 case BINOP_LESS:
819 case BINOP_GTR:
820 case BINOP_LEQ:
821 case BINOP_GEQ:
822 case BINOP_REPEAT:
823 case BINOP_ASSIGN:
824 case BINOP_COMMA:
825 case BINOP_SUBSCRIPT:
826 case BINOP_EXP:
827 case BINOP_MIN:
828 case BINOP_MAX:
c906108c
SS
829 case BINOP_INTDIV:
830 case BINOP_ASSIGN_MODIFY:
831 case BINOP_VAL:
832 case BINOP_INCL:
833 case BINOP_EXCL:
834 case BINOP_CONCAT:
835 case BINOP_IN:
836 case BINOP_RANGE:
837 case BINOP_END:
838 elt = dump_subexp (exp, stream, elt);
839 case UNOP_NEG:
840 case UNOP_LOGICAL_NOT:
841 case UNOP_COMPLEMENT:
842 case UNOP_IND:
843 case UNOP_ADDR:
844 case UNOP_PREINCREMENT:
845 case UNOP_POSTINCREMENT:
846 case UNOP_PREDECREMENT:
847 case UNOP_POSTDECREMENT:
848 case UNOP_SIZEOF:
849 case UNOP_PLUS:
850 case UNOP_CAP:
851 case UNOP_CHR:
852 case UNOP_ORD:
853 case UNOP_ABS:
854 case UNOP_FLOAT:
855 case UNOP_HIGH:
856 case UNOP_MAX:
857 case UNOP_MIN:
858 case UNOP_ODD:
859 case UNOP_TRUNC:
860 case UNOP_LOWER:
861 case UNOP_UPPER:
862 case UNOP_LENGTH:
863 case UNOP_CARD:
864 case UNOP_CHMAX:
865 case UNOP_CHMIN:
866 elt = dump_subexp (exp, stream, elt);
867 break;
868 case OP_LONG:
d4f3574e
SS
869 fprintf_filtered (stream, "Type @");
870 gdb_print_host_address (exp->elts[elt].type, stream);
871 fprintf_filtered (stream, " (");
c906108c
SS
872 type_print (exp->elts[elt].type, NULL, stream, 0);
873 fprintf_filtered (stream, "), value %ld (0x%lx)",
c5aa993b
JM
874 (long) exp->elts[elt + 1].longconst,
875 (long) exp->elts[elt + 1].longconst);
c906108c
SS
876 elt += 3;
877 break;
878 case OP_DOUBLE:
d4f3574e
SS
879 fprintf_filtered (stream, "Type @");
880 gdb_print_host_address (exp->elts[elt].type, stream);
881 fprintf_filtered (stream, " (");
c906108c
SS
882 type_print (exp->elts[elt].type, NULL, stream, 0);
883 fprintf_filtered (stream, "), value %g",
c5aa993b 884 (double) exp->elts[elt + 1].doubleconst);
c906108c
SS
885 elt += 3;
886 break;
887 case OP_VAR_VALUE:
d4f3574e
SS
888 fprintf_filtered (stream, "Block @");
889 gdb_print_host_address (exp->elts[elt].block, stream);
890 fprintf_filtered (stream, ", symbol @");
891 gdb_print_host_address (exp->elts[elt + 1].symbol, stream);
892 fprintf_filtered (stream, " (%s)",
22abf04a 893 DEPRECATED_SYMBOL_NAME (exp->elts[elt + 1].symbol));
c906108c
SS
894 elt += 3;
895 break;
896 case OP_LAST:
897 fprintf_filtered (stream, "History element %ld",
c5aa993b 898 (long) exp->elts[elt].longconst);
c906108c
SS
899 elt += 2;
900 break;
901 case OP_REGISTER:
902 fprintf_filtered (stream, "Register %ld",
c5aa993b 903 (long) exp->elts[elt].longconst);
c906108c
SS
904 elt += 2;
905 break;
906 case OP_INTERNALVAR:
d4f3574e
SS
907 fprintf_filtered (stream, "Internal var @");
908 gdb_print_host_address (exp->elts[elt].internalvar, stream);
909 fprintf_filtered (stream, " (%s)",
c906108c
SS
910 exp->elts[elt].internalvar->name);
911 elt += 2;
912 break;
913 case OP_FUNCALL:
914 {
915 int nargs;
916
917 nargs = longest_to_int (exp->elts[elt].longconst);
918
919 fprintf_filtered (stream, "Number of args: %d", nargs);
920 elt += 2;
921
922 for (i = 1; i <= nargs + 1; i++)
923 elt = dump_subexp (exp, stream, elt);
924 }
925 break;
926 case OP_ARRAY:
927 {
928 int lower, upper;
929 int i;
930
931 lower = longest_to_int (exp->elts[elt].longconst);
932 upper = longest_to_int (exp->elts[elt + 1].longconst);
933
934 fprintf_filtered (stream, "Bounds [%d:%d]", lower, upper);
935 elt += 3;
936
937 for (i = 1; i <= upper - lower + 1; i++)
938 elt = dump_subexp (exp, stream, elt);
939 }
940 break;
941 case UNOP_MEMVAL:
942 case UNOP_CAST:
d4f3574e
SS
943 fprintf_filtered (stream, "Type @");
944 gdb_print_host_address (exp->elts[elt].type, stream);
945 fprintf_filtered (stream, " (");
c906108c
SS
946 type_print (exp->elts[elt].type, NULL, stream, 0);
947 fprintf_filtered (stream, ")");
948 elt = dump_subexp (exp, stream, elt + 2);
949 break;
950 case OP_TYPE:
d4f3574e
SS
951 fprintf_filtered (stream, "Type @");
952 gdb_print_host_address (exp->elts[elt].type, stream);
953 fprintf_filtered (stream, " (");
c906108c
SS
954 type_print (exp->elts[elt].type, NULL, stream, 0);
955 fprintf_filtered (stream, ")");
956 elt += 2;
957 break;
958 case STRUCTOP_STRUCT:
959 case STRUCTOP_PTR:
960 {
961 char *elem_name;
962 int len;
963
964 len = longest_to_int (exp->elts[elt].longconst);
965 elem_name = &exp->elts[elt + 1].string;
966
967 fprintf_filtered (stream, "Element name: `%.*s'", len, elem_name);
968 elt = dump_subexp (exp, stream, elt + 3 + BYTES_TO_EXP_ELEM (len + 1));
969 }
970 break;
971 case OP_SCOPE:
972 {
973 char *elem_name;
974 int len;
975
d4f3574e
SS
976 fprintf_filtered (stream, "Type @");
977 gdb_print_host_address (exp->elts[elt].type, stream);
978 fprintf_filtered (stream, " (");
c906108c
SS
979 type_print (exp->elts[elt].type, NULL, stream, 0);
980 fprintf_filtered (stream, ") ");
981
982 len = longest_to_int (exp->elts[elt + 1].longconst);
983 elem_name = &exp->elts[elt + 2].string;
984
985 fprintf_filtered (stream, "Field name: `%.*s'", len, elem_name);
986 elt += 4 + BYTES_TO_EXP_ELEM (len + 1);
987 }
988 break;
989 default:
990 case OP_NULL:
991 case STRUCTOP_MEMBER:
992 case STRUCTOP_MPTR:
993 case MULTI_SUBSCRIPT:
994 case OP_F77_UNDETERMINED_ARGLIST:
995 case OP_COMPLEX:
996 case OP_STRING:
997 case OP_BITSTRING:
998 case OP_BOOL:
999 case OP_M2_STRING:
1000 case OP_THIS:
1001 case OP_LABELED:
1002 case OP_NAME:
1003 case OP_EXPRSTRING:
1004 fprintf_filtered (stream, "Unknown format");
1005 }
1006
1007 indent -= 2;
1008
1009 return elt;
1010}
1011
1012void
fba45db2
KB
1013dump_postfix_expression (struct expression *exp, struct ui_file *stream,
1014 char *note)
c906108c
SS
1015{
1016 int elt;
1017
1018 fprintf_filtered (stream, "Dump of expression @ ");
d4f3574e 1019 gdb_print_host_address (exp, stream);
c906108c
SS
1020 fprintf_filtered (stream, ", %s:\nExpression: `", note);
1021 if (exp->elts[0].opcode != OP_TYPE)
1022 print_expression (exp, stream);
1023 else
1024 fputs_filtered ("Type printing not yet supported....", stream);
9d271fd8 1025 fprintf_filtered (stream, "'\n\tLanguage %s, %d elements, %ld bytes each.\n",
c5aa993b 1026 exp->language_defn->la_name, exp->nelts,
9d271fd8 1027 (long) sizeof (union exp_element));
c906108c
SS
1028 fputs_filtered ("\n", stream);
1029
c5aa993b 1030 for (elt = 0; elt < exp->nelts;)
c906108c
SS
1031 elt = dump_subexp (exp, stream, elt);
1032 fputs_filtered ("\n", stream);
1033}