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