]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/expprint.c
elfNN_c64_resize_section always sets alignment
[thirdparty/binutils-gdb.git] / gdb / expprint.c
1 /* Print in infix form a struct expression.
2
3 Copyright (C) 1986-2020 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
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 3 of the License, or
10 (at your option) any later version.
11
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.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20 #include "defs.h"
21 #include "symtab.h"
22 #include "gdbtypes.h"
23 #include "expression.h"
24 #include "value.h"
25 #include "language.h"
26 #include "parser-defs.h"
27 #include "user-regs.h" /* For user_reg_map_regnum_to_name. */
28 #include "target.h"
29 #include "block.h"
30 #include "objfiles.h"
31 #include "valprint.h"
32 #include "cli/cli-style.h"
33
34 #include <ctype.h>
35
36 void
37 print_expression (struct expression *exp, struct ui_file *stream)
38 {
39 int pc = 0;
40
41 print_subexp (exp, &pc, stream, PREC_NULL);
42 }
43
44 /* Print the subexpression of EXP that starts in position POS, on STREAM.
45 PREC is the precedence of the surrounding operator;
46 if the precedence of the main operator of this subexpression is less,
47 parentheses are needed here. */
48
49 void
50 print_subexp (struct expression *exp, int *pos,
51 struct ui_file *stream, enum precedence prec)
52 {
53 exp->language_defn->expression_ops ()->print_subexp (exp, pos, stream,
54 prec);
55 }
56
57 /* See parser-defs.h. */
58
59 void
60 print_subexp_funcall (struct expression *exp, int *pos,
61 struct ui_file *stream)
62 {
63 (*pos) += 2;
64 unsigned nargs = longest_to_int (exp->elts[*pos].longconst);
65 print_subexp (exp, pos, stream, PREC_SUFFIX);
66 fputs_filtered (" (", stream);
67 for (unsigned tem = 0; tem < nargs; tem++)
68 {
69 if (tem != 0)
70 fputs_filtered (", ", stream);
71 print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
72 }
73 fputs_filtered (")", stream);
74 }
75
76 /* Standard implementation of print_subexp for use in language_defn
77 vectors. */
78 void
79 print_subexp_standard (struct expression *exp, int *pos,
80 struct ui_file *stream, enum precedence prec)
81 {
82 unsigned tem;
83 const struct op_print *op_print_tab;
84 int pc;
85 unsigned nargs;
86 const char *op_str;
87 int assign_modify = 0;
88 enum exp_opcode opcode;
89 enum precedence myprec = PREC_NULL;
90 /* Set to 1 for a right-associative operator. */
91 int assoc = 0;
92 struct value *val;
93 char *tempstr = NULL;
94
95 op_print_tab = exp->language_defn->opcode_print_table ();
96 pc = (*pos)++;
97 opcode = exp->elts[pc].opcode;
98 switch (opcode)
99 {
100 /* Common ops */
101
102 case OP_TYPE:
103 (*pos) += 2;
104 type_print (exp->elts[pc + 1].type, "", stream, 0);
105 return;
106
107 case OP_SCOPE:
108 myprec = PREC_PREFIX;
109 assoc = 0;
110 fputs_filtered (exp->elts[pc + 1].type->name (), stream);
111 fputs_filtered ("::", stream);
112 nargs = longest_to_int (exp->elts[pc + 2].longconst);
113 (*pos) += 4 + BYTES_TO_EXP_ELEM (nargs + 1);
114 fputs_filtered (&exp->elts[pc + 3].string, stream);
115 return;
116
117 case OP_LONG:
118 {
119 struct value_print_options opts;
120
121 get_no_prettyformat_print_options (&opts);
122 (*pos) += 3;
123 value_print (value_from_longest (exp->elts[pc + 1].type,
124 exp->elts[pc + 2].longconst),
125 stream, &opts);
126 }
127 return;
128
129 case OP_FLOAT:
130 {
131 struct value_print_options opts;
132
133 get_no_prettyformat_print_options (&opts);
134 (*pos) += 3;
135 value_print (value_from_contents (exp->elts[pc + 1].type,
136 exp->elts[pc + 2].floatconst),
137 stream, &opts);
138 }
139 return;
140
141 case OP_VAR_VALUE:
142 {
143 const struct block *b;
144
145 (*pos) += 3;
146 b = exp->elts[pc + 1].block;
147 if (b != NULL
148 && BLOCK_FUNCTION (b) != NULL
149 && BLOCK_FUNCTION (b)->print_name () != NULL)
150 {
151 fputs_filtered (BLOCK_FUNCTION (b)->print_name (), stream);
152 fputs_filtered ("::", stream);
153 }
154 fputs_filtered (exp->elts[pc + 2].symbol->print_name (), stream);
155 }
156 return;
157
158 case OP_VAR_MSYM_VALUE:
159 {
160 (*pos) += 3;
161 fputs_filtered (exp->elts[pc + 2].msymbol->print_name (), stream);
162 }
163 return;
164
165 case OP_FUNC_STATIC_VAR:
166 {
167 tem = longest_to_int (exp->elts[pc + 1].longconst);
168 (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1);
169 fputs_filtered (&exp->elts[pc + 1].string, stream);
170 }
171 return;
172
173 case OP_VAR_ENTRY_VALUE:
174 {
175 (*pos) += 2;
176 fprintf_filtered (stream, "%s@entry",
177 exp->elts[pc + 1].symbol->print_name ());
178 }
179 return;
180
181 case OP_LAST:
182 (*pos) += 2;
183 fprintf_filtered (stream, "$%d",
184 longest_to_int (exp->elts[pc + 1].longconst));
185 return;
186
187 case OP_REGISTER:
188 {
189 const char *name = &exp->elts[pc + 2].string;
190
191 (*pos) += 3 + BYTES_TO_EXP_ELEM (exp->elts[pc + 1].longconst + 1);
192 fprintf_filtered (stream, "$%s", name);
193 return;
194 }
195
196 case OP_BOOL:
197 (*pos) += 2;
198 fprintf_filtered (stream, "%s",
199 longest_to_int (exp->elts[pc + 1].longconst)
200 ? "TRUE" : "FALSE");
201 return;
202
203 case OP_INTERNALVAR:
204 (*pos) += 2;
205 fprintf_filtered (stream, "$%s",
206 internalvar_name (exp->elts[pc + 1].internalvar));
207 return;
208
209 case OP_FUNCALL:
210 print_subexp_funcall (exp, pos, stream);
211 return;
212
213 case OP_NAME:
214 nargs = longest_to_int (exp->elts[pc + 1].longconst);
215 (*pos) += 3 + BYTES_TO_EXP_ELEM (nargs + 1);
216 fputs_filtered (&exp->elts[pc + 2].string, stream);
217 return;
218
219 case OP_STRING:
220 {
221 struct value_print_options opts;
222
223 nargs = longest_to_int (exp->elts[pc + 1].longconst);
224 (*pos) += 3 + BYTES_TO_EXP_ELEM (nargs + 1);
225 /* LA_PRINT_STRING will print using the current repeat count threshold.
226 If necessary, we can temporarily set it to zero, or pass it as an
227 additional parameter to LA_PRINT_STRING. -fnf */
228 get_user_print_options (&opts);
229 LA_PRINT_STRING (stream, builtin_type (exp->gdbarch)->builtin_char,
230 (gdb_byte *) &exp->elts[pc + 2].string, nargs,
231 NULL, 0, &opts);
232 }
233 return;
234
235 case OP_OBJC_NSSTRING: /* Objective-C Foundation Class
236 NSString constant. */
237 {
238 struct value_print_options opts;
239
240 nargs = longest_to_int (exp->elts[pc + 1].longconst);
241 (*pos) += 3 + BYTES_TO_EXP_ELEM (nargs + 1);
242 fputs_filtered ("@\"", stream);
243 get_user_print_options (&opts);
244 LA_PRINT_STRING (stream, builtin_type (exp->gdbarch)->builtin_char,
245 (gdb_byte *) &exp->elts[pc + 2].string, nargs,
246 NULL, 0, &opts);
247 fputs_filtered ("\"", stream);
248 }
249 return;
250
251 case OP_OBJC_MSGCALL:
252 { /* Objective C message (method) call. */
253 (*pos) += 3;
254 nargs = longest_to_int (exp->elts[pc + 2].longconst);
255 fprintf_unfiltered (stream, "[");
256 print_subexp (exp, pos, stream, PREC_SUFFIX);
257 gdb::unique_xmalloc_ptr<char> selector
258 = target_read_string (exp->elts[pc + 1].longconst, 1024);
259 if (selector == nullptr)
260 error (_("bad selector"));
261 if (nargs)
262 {
263 char *s, *nextS;
264
265 s = selector.get ();
266 for (tem = 0; tem < nargs; tem++)
267 {
268 nextS = strchr (s, ':');
269 gdb_assert (nextS); /* Make sure we found ':'. */
270 *nextS = '\0';
271 fprintf_unfiltered (stream, " %s: ", s);
272 s = nextS + 1;
273 print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
274 }
275 }
276 else
277 {
278 fprintf_unfiltered (stream, " %s", selector.get ());
279 }
280 fprintf_unfiltered (stream, "]");
281 return;
282 }
283
284 case OP_ARRAY:
285 (*pos) += 3;
286 nargs = longest_to_int (exp->elts[pc + 2].longconst);
287 nargs -= longest_to_int (exp->elts[pc + 1].longconst);
288 nargs++;
289 tem = 0;
290 if (exp->elts[pc + 4].opcode == OP_LONG
291 && exp->elts[pc + 5].type
292 == builtin_type (exp->gdbarch)->builtin_char
293 && exp->language_defn->la_language == language_c)
294 {
295 /* Attempt to print C character arrays using string syntax.
296 Walk through the args, picking up one character from each
297 of the OP_LONG expression elements. If any array element
298 does not match our expection of what we should find for
299 a simple string, revert back to array printing. Note that
300 the last expression element is an explicit null terminator
301 byte, which doesn't get printed. */
302 tempstr = (char *) alloca (nargs);
303 pc += 4;
304 while (tem < nargs)
305 {
306 if (exp->elts[pc].opcode != OP_LONG
307 || exp->elts[pc + 1].type
308 != builtin_type (exp->gdbarch)->builtin_char)
309 {
310 /* Not a simple array of char, use regular array
311 printing. */
312 tem = 0;
313 break;
314 }
315 else
316 {
317 tempstr[tem++] =
318 longest_to_int (exp->elts[pc + 2].longconst);
319 pc += 4;
320 }
321 }
322 }
323 if (tem > 0)
324 {
325 struct value_print_options opts;
326
327 get_user_print_options (&opts);
328 LA_PRINT_STRING (stream, builtin_type (exp->gdbarch)->builtin_char,
329 (gdb_byte *) tempstr, nargs - 1, NULL, 0, &opts);
330 (*pos) = pc;
331 }
332 else
333 {
334 fputs_filtered (" {", stream);
335 for (tem = 0; tem < nargs; tem++)
336 {
337 if (tem != 0)
338 {
339 fputs_filtered (", ", stream);
340 }
341 print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
342 }
343 fputs_filtered ("}", stream);
344 }
345 return;
346
347 case TERNOP_COND:
348 if ((int) prec > (int) PREC_COMMA)
349 fputs_filtered ("(", stream);
350 /* Print the subexpressions, forcing parentheses
351 around any binary operations within them.
352 This is more parentheses than are strictly necessary,
353 but it looks clearer. */
354 print_subexp (exp, pos, stream, PREC_HYPER);
355 fputs_filtered (" ? ", stream);
356 print_subexp (exp, pos, stream, PREC_HYPER);
357 fputs_filtered (" : ", stream);
358 print_subexp (exp, pos, stream, PREC_HYPER);
359 if ((int) prec > (int) PREC_COMMA)
360 fputs_filtered (")", stream);
361 return;
362
363 case TERNOP_SLICE:
364 print_subexp (exp, pos, stream, PREC_SUFFIX);
365 fputs_filtered ("(", stream);
366 print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
367 fputs_filtered (opcode == TERNOP_SLICE ? " : " : " UP ", stream);
368 print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
369 fputs_filtered (")", stream);
370 return;
371
372 case STRUCTOP_STRUCT:
373 tem = longest_to_int (exp->elts[pc + 1].longconst);
374 (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1);
375 print_subexp (exp, pos, stream, PREC_SUFFIX);
376 fputs_filtered (".", stream);
377 fputs_filtered (&exp->elts[pc + 2].string, stream);
378 return;
379
380 /* Will not occur for Modula-2. */
381 case STRUCTOP_PTR:
382 tem = longest_to_int (exp->elts[pc + 1].longconst);
383 (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1);
384 print_subexp (exp, pos, stream, PREC_SUFFIX);
385 fputs_filtered ("->", stream);
386 fputs_filtered (&exp->elts[pc + 2].string, stream);
387 return;
388
389 case STRUCTOP_MEMBER:
390 print_subexp (exp, pos, stream, PREC_SUFFIX);
391 fputs_filtered (".*", stream);
392 print_subexp (exp, pos, stream, PREC_SUFFIX);
393 return;
394
395 case STRUCTOP_MPTR:
396 print_subexp (exp, pos, stream, PREC_SUFFIX);
397 fputs_filtered ("->*", stream);
398 print_subexp (exp, pos, stream, PREC_SUFFIX);
399 return;
400
401 case BINOP_SUBSCRIPT:
402 print_subexp (exp, pos, stream, PREC_SUFFIX);
403 fputs_filtered ("[", stream);
404 print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
405 fputs_filtered ("]", stream);
406 return;
407
408 case UNOP_POSTINCREMENT:
409 print_subexp (exp, pos, stream, PREC_SUFFIX);
410 fputs_filtered ("++", stream);
411 return;
412
413 case UNOP_POSTDECREMENT:
414 print_subexp (exp, pos, stream, PREC_SUFFIX);
415 fputs_filtered ("--", stream);
416 return;
417
418 case UNOP_CAST:
419 (*pos) += 2;
420 if ((int) prec > (int) PREC_PREFIX)
421 fputs_filtered ("(", stream);
422 fputs_filtered ("(", stream);
423 type_print (exp->elts[pc + 1].type, "", stream, 0);
424 fputs_filtered (") ", stream);
425 print_subexp (exp, pos, stream, PREC_PREFIX);
426 if ((int) prec > (int) PREC_PREFIX)
427 fputs_filtered (")", stream);
428 return;
429
430 case UNOP_CAST_TYPE:
431 if ((int) prec > (int) PREC_PREFIX)
432 fputs_filtered ("(", stream);
433 fputs_filtered ("(", stream);
434 print_subexp (exp, pos, stream, PREC_PREFIX);
435 fputs_filtered (") ", stream);
436 print_subexp (exp, pos, stream, PREC_PREFIX);
437 if ((int) prec > (int) PREC_PREFIX)
438 fputs_filtered (")", stream);
439 return;
440
441 case UNOP_DYNAMIC_CAST:
442 case UNOP_REINTERPRET_CAST:
443 fputs_filtered (opcode == UNOP_DYNAMIC_CAST ? "dynamic_cast"
444 : "reinterpret_cast", stream);
445 fputs_filtered ("<", stream);
446 print_subexp (exp, pos, stream, PREC_PREFIX);
447 fputs_filtered ("> (", stream);
448 print_subexp (exp, pos, stream, PREC_PREFIX);
449 fputs_filtered (")", stream);
450 return;
451
452 case UNOP_MEMVAL:
453 (*pos) += 2;
454 if ((int) prec > (int) PREC_PREFIX)
455 fputs_filtered ("(", stream);
456 if (exp->elts[pc + 1].type->code () == TYPE_CODE_FUNC
457 && exp->elts[pc + 3].opcode == OP_LONG)
458 {
459 struct value_print_options opts;
460
461 /* We have a minimal symbol fn, probably. It's encoded
462 as a UNOP_MEMVAL (function-type) of an OP_LONG (int, address).
463 Swallow the OP_LONG (including both its opcodes); ignore
464 its type; print the value in the type of the MEMVAL. */
465 (*pos) += 4;
466 val = value_at_lazy (exp->elts[pc + 1].type,
467 (CORE_ADDR) exp->elts[pc + 5].longconst);
468 get_no_prettyformat_print_options (&opts);
469 value_print (val, stream, &opts);
470 }
471 else
472 {
473 fputs_filtered ("{", stream);
474 type_print (exp->elts[pc + 1].type, "", stream, 0);
475 fputs_filtered ("} ", stream);
476 print_subexp (exp, pos, stream, PREC_PREFIX);
477 }
478 if ((int) prec > (int) PREC_PREFIX)
479 fputs_filtered (")", stream);
480 return;
481
482 case UNOP_MEMVAL_TYPE:
483 if ((int) prec > (int) PREC_PREFIX)
484 fputs_filtered ("(", stream);
485 fputs_filtered ("{", stream);
486 print_subexp (exp, pos, stream, PREC_PREFIX);
487 fputs_filtered ("} ", stream);
488 print_subexp (exp, pos, stream, PREC_PREFIX);
489 if ((int) prec > (int) PREC_PREFIX)
490 fputs_filtered (")", stream);
491 return;
492
493 case BINOP_ASSIGN_MODIFY:
494 opcode = exp->elts[pc + 1].opcode;
495 (*pos) += 2;
496 myprec = PREC_ASSIGN;
497 assoc = 1;
498 assign_modify = 1;
499 op_str = "???";
500 for (tem = 0; op_print_tab[tem].opcode != OP_NULL; tem++)
501 if (op_print_tab[tem].opcode == opcode)
502 {
503 op_str = op_print_tab[tem].string;
504 break;
505 }
506 if (op_print_tab[tem].opcode != opcode)
507 /* Not found; don't try to keep going because we don't know how
508 to interpret further elements. */
509 error (_("Invalid expression"));
510 break;
511
512 /* C++ ops */
513
514 case OP_THIS:
515 ++(*pos);
516 if (exp->language_defn->name_of_this () != NULL)
517 fputs_filtered (exp->language_defn->name_of_this (), stream);
518 else
519 fprintf_styled (stream, metadata_style.style (),
520 _("<language %s has no 'this'>"),
521 exp->language_defn->name ());
522 return;
523
524 /* Modula-2 ops */
525
526 case MULTI_SUBSCRIPT:
527 (*pos) += 2;
528 nargs = longest_to_int (exp->elts[pc + 1].longconst);
529 print_subexp (exp, pos, stream, PREC_SUFFIX);
530 fprintf_unfiltered (stream, " [");
531 for (tem = 0; tem < nargs; tem++)
532 {
533 if (tem != 0)
534 fprintf_unfiltered (stream, ", ");
535 print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
536 }
537 fprintf_unfiltered (stream, "]");
538 return;
539
540 case BINOP_VAL:
541 (*pos) += 2;
542 fprintf_unfiltered (stream, "VAL(");
543 type_print (exp->elts[pc + 1].type, "", stream, 0);
544 fprintf_unfiltered (stream, ",");
545 print_subexp (exp, pos, stream, PREC_PREFIX);
546 fprintf_unfiltered (stream, ")");
547 return;
548
549 case TYPE_INSTANCE:
550 {
551 type_instance_flags flags
552 = (type_instance_flag_value) longest_to_int (exp->elts[pc + 1].longconst);
553 LONGEST count = exp->elts[pc + 2].longconst;
554
555 /* The FLAGS. */
556 (*pos)++;
557 /* The COUNT. */
558 (*pos)++;
559 fputs_unfiltered ("TypeInstance(", stream);
560 while (count-- > 0)
561 {
562 type_print (exp->elts[(*pos)++].type, "", stream, 0);
563 if (count > 0)
564 fputs_unfiltered (",", stream);
565 }
566 fputs_unfiltered (",", stream);
567 /* Ending COUNT and ending TYPE_INSTANCE. */
568 (*pos) += 2;
569 print_subexp (exp, pos, stream, PREC_PREFIX);
570
571 if (flags & TYPE_INSTANCE_FLAG_CONST)
572 fputs_unfiltered (",const", stream);
573 if (flags & TYPE_INSTANCE_FLAG_VOLATILE)
574 fputs_unfiltered (",volatile", stream);
575
576 fputs_unfiltered (")", stream);
577 return;
578 }
579
580 case OP_RANGE:
581 {
582 enum range_type range_type;
583
584 range_type = (enum range_type)
585 longest_to_int (exp->elts[pc + 1].longconst);
586 *pos += 2;
587
588 if (range_type == NONE_BOUND_DEFAULT_EXCLUSIVE
589 || range_type == LOW_BOUND_DEFAULT_EXCLUSIVE)
590 fputs_filtered ("EXCLUSIVE_", stream);
591 fputs_filtered ("RANGE(", stream);
592 if (range_type == HIGH_BOUND_DEFAULT
593 || range_type == NONE_BOUND_DEFAULT
594 || range_type == NONE_BOUND_DEFAULT_EXCLUSIVE)
595 print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
596 fputs_filtered ("..", stream);
597 if (range_type == LOW_BOUND_DEFAULT
598 || range_type == NONE_BOUND_DEFAULT)
599 print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
600 fputs_filtered (")", stream);
601 return;
602 }
603
604 /* Default ops */
605
606 default:
607 op_str = "???";
608 for (tem = 0; op_print_tab[tem].opcode != OP_NULL; tem++)
609 if (op_print_tab[tem].opcode == opcode)
610 {
611 op_str = op_print_tab[tem].string;
612 myprec = op_print_tab[tem].precedence;
613 assoc = op_print_tab[tem].right_assoc;
614 break;
615 }
616 if (op_print_tab[tem].opcode != opcode)
617 /* Not found; don't try to keep going because we don't know how
618 to interpret further elements. For example, this happens
619 if opcode is OP_TYPE. */
620 error (_("Invalid expression"));
621 }
622
623 /* Note that PREC_BUILTIN will always emit parentheses. */
624 if ((int) myprec < (int) prec)
625 fputs_filtered ("(", stream);
626 if ((int) opcode > (int) BINOP_END)
627 {
628 if (assoc)
629 {
630 /* Unary postfix operator. */
631 print_subexp (exp, pos, stream, PREC_SUFFIX);
632 fputs_filtered (op_str, stream);
633 }
634 else
635 {
636 /* Unary prefix operator. */
637 fputs_filtered (op_str, stream);
638 if (myprec == PREC_BUILTIN_FUNCTION)
639 fputs_filtered ("(", stream);
640 print_subexp (exp, pos, stream, PREC_PREFIX);
641 if (myprec == PREC_BUILTIN_FUNCTION)
642 fputs_filtered (")", stream);
643 }
644 }
645 else
646 {
647 /* Binary operator. */
648 /* Print left operand.
649 If operator is right-associative,
650 increment precedence for this operand. */
651 print_subexp (exp, pos, stream,
652 (enum precedence) ((int) myprec + assoc));
653 /* Print the operator itself. */
654 if (assign_modify)
655 fprintf_filtered (stream, " %s= ", op_str);
656 else if (op_str[0] == ',')
657 fprintf_filtered (stream, "%s ", op_str);
658 else
659 fprintf_filtered (stream, " %s ", op_str);
660 /* Print right operand.
661 If operator is left-associative,
662 increment precedence for this operand. */
663 print_subexp (exp, pos, stream,
664 (enum precedence) ((int) myprec + !assoc));
665 }
666
667 if ((int) myprec < (int) prec)
668 fputs_filtered (")", stream);
669 }
670
671 /* Return the operator corresponding to opcode OP as
672 a string. NULL indicates that the opcode was not found in the
673 current language table. */
674 const char *
675 op_string (enum exp_opcode op)
676 {
677 int tem;
678 const struct op_print *op_print_tab;
679
680 op_print_tab = current_language->opcode_print_table ();
681 for (tem = 0; op_print_tab[tem].opcode != OP_NULL; tem++)
682 if (op_print_tab[tem].opcode == op)
683 return op_print_tab[tem].string;
684 return NULL;
685 }
686
687 /* Support for dumping the raw data from expressions in a human readable
688 form. */
689
690 static int dump_subexp_body (struct expression *exp, struct ui_file *, int);
691
692 /* Name for OPCODE, when it appears in expression EXP. */
693
694 const char *
695 op_name (struct expression *exp, enum exp_opcode opcode)
696 {
697 if (opcode >= OP_UNUSED_LAST)
698 {
699 char *cell = get_print_cell ();
700 xsnprintf (cell, PRINT_CELL_SIZE, "unknown opcode: %u",
701 unsigned (opcode));
702 return cell;
703 }
704 return exp->language_defn->expression_ops ()->op_name (opcode);
705 }
706
707 /* Default name for the standard operator OPCODE (i.e., one defined in
708 the definition of enum exp_opcode). */
709
710 const char *
711 op_name_standard (enum exp_opcode opcode)
712 {
713 switch (opcode)
714 {
715 default:
716 {
717 static char buf[30];
718
719 xsnprintf (buf, sizeof (buf), "<unknown %d>", opcode);
720 return buf;
721 }
722 #define OP(name) \
723 case name: \
724 return #name ;
725 #include "std-operator.def"
726 #undef OP
727 }
728 }
729
730 /* Print a raw dump of expression EXP to STREAM.
731 NOTE, if non-NULL, is printed as extra explanatory text. */
732
733 void
734 dump_raw_expression (struct expression *exp, struct ui_file *stream,
735 const char *note)
736 {
737 int elt;
738 char *eltscan;
739 int eltsize;
740
741 fprintf_filtered (stream, "Dump of expression @ ");
742 gdb_print_host_address (exp, stream);
743 if (note)
744 fprintf_filtered (stream, ", %s:", note);
745 fprintf_filtered (stream, "\n\tLanguage %s, %d elements, %ld bytes each.\n",
746 exp->language_defn->name (), exp->nelts,
747 (long) sizeof (union exp_element));
748 fprintf_filtered (stream, "\t%5s %20s %16s %s\n", "Index", "Opcode",
749 "Hex Value", "String Value");
750 for (elt = 0; elt < exp->nelts; elt++)
751 {
752 fprintf_filtered (stream, "\t%5d ", elt);
753
754 const char *opcode_name = op_name (exp, exp->elts[elt].opcode);
755 fprintf_filtered (stream, "%20s ", opcode_name);
756
757 print_longest (stream, 'd', 0, exp->elts[elt].longconst);
758 fprintf_filtered (stream, " ");
759
760 for (eltscan = (char *) &exp->elts[elt],
761 eltsize = sizeof (union exp_element);
762 eltsize-- > 0;
763 eltscan++)
764 {
765 fprintf_filtered (stream, "%c",
766 isprint (*eltscan) ? (*eltscan & 0xFF) : '.');
767 }
768 fprintf_filtered (stream, "\n");
769 }
770 }
771
772 /* Dump the subexpression of prefix expression EXP whose operator is at
773 position ELT onto STREAM. Returns the position of the next
774 subexpression in EXP. */
775
776 int
777 dump_subexp (struct expression *exp, struct ui_file *stream, int elt)
778 {
779 static int indent = 0;
780 int i;
781
782 fprintf_filtered (stream, "\n");
783 fprintf_filtered (stream, "\t%5d ", elt);
784
785 for (i = 1; i <= indent; i++)
786 fprintf_filtered (stream, " ");
787 indent += 2;
788
789 fprintf_filtered (stream, "%-20s ", op_name (exp, exp->elts[elt].opcode));
790
791 elt = dump_subexp_body (exp, stream, elt);
792
793 indent -= 2;
794
795 return elt;
796 }
797
798 /* Dump the operands of prefix expression EXP whose opcode is at
799 position ELT onto STREAM. Returns the position of the next
800 subexpression in EXP. */
801
802 static int
803 dump_subexp_body (struct expression *exp, struct ui_file *stream, int elt)
804 {
805 return exp->language_defn->expression_ops ()->dump_subexp_body (exp, stream,
806 elt);
807 }
808
809 /* See parser-defs.h. */
810
811 int
812 dump_subexp_body_funcall (struct expression *exp,
813 struct ui_file *stream, int elt)
814 {
815 int nargs = longest_to_int (exp->elts[elt].longconst);
816 fprintf_filtered (stream, "Number of args: %d", nargs);
817 elt += 2;
818
819 for (int i = 1; i <= nargs + 1; i++)
820 elt = dump_subexp (exp, stream, elt);
821
822 return elt;
823 }
824
825 /* Default value for subexp_body in exp_descriptor vector. */
826
827 int
828 dump_subexp_body_standard (struct expression *exp,
829 struct ui_file *stream, int elt)
830 {
831 int opcode = exp->elts[elt++].opcode;
832
833 switch (opcode)
834 {
835 case TERNOP_COND:
836 case TERNOP_SLICE:
837 elt = dump_subexp (exp, stream, elt);
838 /* FALL THROUGH */
839 case BINOP_ADD:
840 case BINOP_SUB:
841 case BINOP_MUL:
842 case BINOP_DIV:
843 case BINOP_REM:
844 case BINOP_MOD:
845 case BINOP_LSH:
846 case BINOP_RSH:
847 case BINOP_LOGICAL_AND:
848 case BINOP_LOGICAL_OR:
849 case BINOP_BITWISE_AND:
850 case BINOP_BITWISE_IOR:
851 case BINOP_BITWISE_XOR:
852 case BINOP_EQUAL:
853 case BINOP_NOTEQUAL:
854 case BINOP_LESS:
855 case BINOP_GTR:
856 case BINOP_LEQ:
857 case BINOP_GEQ:
858 case BINOP_REPEAT:
859 case BINOP_ASSIGN:
860 case BINOP_COMMA:
861 case BINOP_SUBSCRIPT:
862 case BINOP_EXP:
863 case BINOP_MIN:
864 case BINOP_MAX:
865 case BINOP_INTDIV:
866 case BINOP_ASSIGN_MODIFY:
867 case BINOP_VAL:
868 case BINOP_CONCAT:
869 case BINOP_END:
870 case STRUCTOP_MEMBER:
871 case STRUCTOP_MPTR:
872 elt = dump_subexp (exp, stream, elt);
873 /* FALL THROUGH */
874 case UNOP_NEG:
875 case UNOP_LOGICAL_NOT:
876 case UNOP_COMPLEMENT:
877 case UNOP_IND:
878 case UNOP_ADDR:
879 case UNOP_PREINCREMENT:
880 case UNOP_POSTINCREMENT:
881 case UNOP_PREDECREMENT:
882 case UNOP_POSTDECREMENT:
883 case UNOP_SIZEOF:
884 case UNOP_ALIGNOF:
885 case UNOP_PLUS:
886 case UNOP_CAP:
887 case UNOP_CHR:
888 case UNOP_ORD:
889 case UNOP_ABS:
890 case UNOP_FLOAT:
891 case UNOP_HIGH:
892 case UNOP_MAX:
893 case UNOP_MIN:
894 case UNOP_ODD:
895 case UNOP_TRUNC:
896 elt = dump_subexp (exp, stream, elt);
897 break;
898 case OP_LONG:
899 fprintf_filtered (stream, "Type @");
900 gdb_print_host_address (exp->elts[elt].type, stream);
901 fprintf_filtered (stream, " (");
902 type_print (exp->elts[elt].type, NULL, stream, 0);
903 fprintf_filtered (stream, "), value %ld (0x%lx)",
904 (long) exp->elts[elt + 1].longconst,
905 (long) exp->elts[elt + 1].longconst);
906 elt += 3;
907 break;
908 case OP_FLOAT:
909 fprintf_filtered (stream, "Type @");
910 gdb_print_host_address (exp->elts[elt].type, stream);
911 fprintf_filtered (stream, " (");
912 type_print (exp->elts[elt].type, NULL, stream, 0);
913 fprintf_filtered (stream, "), value ");
914 print_floating (exp->elts[elt + 1].floatconst,
915 exp->elts[elt].type, stream);
916 elt += 3;
917 break;
918 case OP_VAR_VALUE:
919 fprintf_filtered (stream, "Block @");
920 gdb_print_host_address (exp->elts[elt].block, stream);
921 fprintf_filtered (stream, ", symbol @");
922 gdb_print_host_address (exp->elts[elt + 1].symbol, stream);
923 fprintf_filtered (stream, " (%s)",
924 exp->elts[elt + 1].symbol->print_name ());
925 elt += 3;
926 break;
927 case OP_VAR_MSYM_VALUE:
928 fprintf_filtered (stream, "Objfile @");
929 gdb_print_host_address (exp->elts[elt].objfile, stream);
930 fprintf_filtered (stream, ", msymbol @");
931 gdb_print_host_address (exp->elts[elt + 1].msymbol, stream);
932 fprintf_filtered (stream, " (%s)",
933 exp->elts[elt + 1].msymbol->print_name ());
934 elt += 3;
935 break;
936 case OP_VAR_ENTRY_VALUE:
937 fprintf_filtered (stream, "Entry value of symbol @");
938 gdb_print_host_address (exp->elts[elt].symbol, stream);
939 fprintf_filtered (stream, " (%s)",
940 exp->elts[elt].symbol->print_name ());
941 elt += 2;
942 break;
943 case OP_LAST:
944 fprintf_filtered (stream, "History element %ld",
945 (long) exp->elts[elt].longconst);
946 elt += 2;
947 break;
948 case OP_REGISTER:
949 fprintf_filtered (stream, "Register $%s", &exp->elts[elt + 1].string);
950 elt += 3 + BYTES_TO_EXP_ELEM (exp->elts[elt].longconst + 1);
951 break;
952 case OP_INTERNALVAR:
953 fprintf_filtered (stream, "Internal var @");
954 gdb_print_host_address (exp->elts[elt].internalvar, stream);
955 fprintf_filtered (stream, " (%s)",
956 internalvar_name (exp->elts[elt].internalvar));
957 elt += 2;
958 break;
959 case OP_FUNCALL:
960 elt = dump_subexp_body_funcall (exp, stream, elt);
961 break;
962 case OP_ARRAY:
963 {
964 int lower, upper;
965 int i;
966
967 lower = longest_to_int (exp->elts[elt].longconst);
968 upper = longest_to_int (exp->elts[elt + 1].longconst);
969
970 fprintf_filtered (stream, "Bounds [%d:%d]", lower, upper);
971 elt += 3;
972
973 for (i = 1; i <= upper - lower + 1; i++)
974 elt = dump_subexp (exp, stream, elt);
975 }
976 break;
977 case UNOP_DYNAMIC_CAST:
978 case UNOP_REINTERPRET_CAST:
979 case UNOP_CAST_TYPE:
980 case UNOP_MEMVAL_TYPE:
981 fprintf_filtered (stream, " (");
982 elt = dump_subexp (exp, stream, elt);
983 fprintf_filtered (stream, ")");
984 elt = dump_subexp (exp, stream, elt);
985 break;
986 case UNOP_MEMVAL:
987 case UNOP_CAST:
988 fprintf_filtered (stream, "Type @");
989 gdb_print_host_address (exp->elts[elt].type, stream);
990 fprintf_filtered (stream, " (");
991 type_print (exp->elts[elt].type, NULL, stream, 0);
992 fprintf_filtered (stream, ")");
993 elt = dump_subexp (exp, stream, elt + 2);
994 break;
995 case OP_TYPE:
996 fprintf_filtered (stream, "Type @");
997 gdb_print_host_address (exp->elts[elt].type, stream);
998 fprintf_filtered (stream, " (");
999 type_print (exp->elts[elt].type, NULL, stream, 0);
1000 fprintf_filtered (stream, ")");
1001 elt += 2;
1002 break;
1003 case OP_TYPEOF:
1004 case OP_DECLTYPE:
1005 fprintf_filtered (stream, "Typeof (");
1006 elt = dump_subexp (exp, stream, elt);
1007 fprintf_filtered (stream, ")");
1008 break;
1009 case OP_TYPEID:
1010 fprintf_filtered (stream, "typeid (");
1011 elt = dump_subexp (exp, stream, elt);
1012 fprintf_filtered (stream, ")");
1013 break;
1014 case STRUCTOP_STRUCT:
1015 case STRUCTOP_PTR:
1016 {
1017 char *elem_name;
1018 int len;
1019
1020 len = longest_to_int (exp->elts[elt].longconst);
1021 elem_name = &exp->elts[elt + 1].string;
1022
1023 fprintf_filtered (stream, "Element name: `%.*s'", len, elem_name);
1024 elt = dump_subexp (exp, stream, elt + 3 + BYTES_TO_EXP_ELEM (len + 1));
1025 }
1026 break;
1027 case OP_SCOPE:
1028 {
1029 char *elem_name;
1030 int len;
1031
1032 fprintf_filtered (stream, "Type @");
1033 gdb_print_host_address (exp->elts[elt].type, stream);
1034 fprintf_filtered (stream, " (");
1035 type_print (exp->elts[elt].type, NULL, stream, 0);
1036 fprintf_filtered (stream, ") ");
1037
1038 len = longest_to_int (exp->elts[elt + 1].longconst);
1039 elem_name = &exp->elts[elt + 2].string;
1040
1041 fprintf_filtered (stream, "Field name: `%.*s'", len, elem_name);
1042 elt += 4 + BYTES_TO_EXP_ELEM (len + 1);
1043 }
1044 break;
1045
1046 case OP_FUNC_STATIC_VAR:
1047 {
1048 int len = longest_to_int (exp->elts[elt].longconst);
1049 const char *var_name = &exp->elts[elt + 1].string;
1050 fprintf_filtered (stream, "Field name: `%.*s'", len, var_name);
1051 elt += 3 + BYTES_TO_EXP_ELEM (len + 1);
1052 }
1053 break;
1054
1055 case TYPE_INSTANCE:
1056 {
1057 type_instance_flags flags
1058 = (type_instance_flag_value) longest_to_int (exp->elts[elt++].longconst);
1059 LONGEST len = exp->elts[elt++].longconst;
1060 fprintf_filtered (stream, "%s TypeInstance: ", plongest (len));
1061 while (len-- > 0)
1062 {
1063 fprintf_filtered (stream, "Type @");
1064 gdb_print_host_address (exp->elts[elt].type, stream);
1065 fprintf_filtered (stream, " (");
1066 type_print (exp->elts[elt].type, NULL, stream, 0);
1067 fprintf_filtered (stream, ")");
1068 elt++;
1069 if (len > 0)
1070 fputs_filtered (", ", stream);
1071 }
1072
1073 fprintf_filtered (stream, " Flags: %s (", hex_string (flags));
1074 bool space = false;
1075 auto print_one = [&] (const char *mod)
1076 {
1077 if (space)
1078 fputs_filtered (" ", stream);
1079 space = true;
1080 fprintf_filtered (stream, "%s", mod);
1081 };
1082 if (flags & TYPE_INSTANCE_FLAG_CONST)
1083 print_one ("const");
1084 if (flags & TYPE_INSTANCE_FLAG_VOLATILE)
1085 print_one ("volatile");
1086 fprintf_filtered (stream, ")");
1087
1088 /* Ending LEN and ending TYPE_INSTANCE. */
1089 elt += 2;
1090 elt = dump_subexp (exp, stream, elt);
1091 }
1092 break;
1093 case OP_STRING:
1094 {
1095 LONGEST len = exp->elts[elt].longconst;
1096 LONGEST type = exp->elts[elt + 1].longconst;
1097
1098 fprintf_filtered (stream, "Language-specific string type: %s",
1099 plongest (type));
1100
1101 /* Skip length. */
1102 elt += 1;
1103
1104 /* Skip string content. */
1105 elt += BYTES_TO_EXP_ELEM (len);
1106
1107 /* Skip length and ending OP_STRING. */
1108 elt += 2;
1109 }
1110 break;
1111 case OP_RANGE:
1112 {
1113 enum range_type range_type;
1114
1115 range_type = (enum range_type)
1116 longest_to_int (exp->elts[elt].longconst);
1117 elt += 2;
1118
1119 switch (range_type)
1120 {
1121 case BOTH_BOUND_DEFAULT:
1122 fputs_filtered ("Range '..'", stream);
1123 break;
1124 case LOW_BOUND_DEFAULT:
1125 fputs_filtered ("Range '..EXP'", stream);
1126 break;
1127 case LOW_BOUND_DEFAULT_EXCLUSIVE:
1128 fputs_filtered ("ExclusiveRange '..EXP'", stream);
1129 break;
1130 case HIGH_BOUND_DEFAULT:
1131 fputs_filtered ("Range 'EXP..'", stream);
1132 break;
1133 case NONE_BOUND_DEFAULT:
1134 fputs_filtered ("Range 'EXP..EXP'", stream);
1135 break;
1136 case NONE_BOUND_DEFAULT_EXCLUSIVE:
1137 fputs_filtered ("ExclusiveRange 'EXP..EXP'", stream);
1138 break;
1139 default:
1140 fputs_filtered ("Invalid Range!", stream);
1141 break;
1142 }
1143
1144 if (range_type == HIGH_BOUND_DEFAULT
1145 || range_type == NONE_BOUND_DEFAULT)
1146 elt = dump_subexp (exp, stream, elt);
1147 if (range_type == LOW_BOUND_DEFAULT
1148 || range_type == NONE_BOUND_DEFAULT)
1149 elt = dump_subexp (exp, stream, elt);
1150 }
1151 break;
1152
1153 default:
1154 case OP_NULL:
1155 case MULTI_SUBSCRIPT:
1156 case OP_COMPLEX:
1157 case OP_BOOL:
1158 case OP_M2_STRING:
1159 case OP_THIS:
1160 case OP_NAME:
1161 fprintf_filtered (stream, "Unknown format");
1162 }
1163
1164 return elt;
1165 }
1166
1167 void
1168 dump_prefix_expression (struct expression *exp, struct ui_file *stream)
1169 {
1170 int elt;
1171
1172 fprintf_filtered (stream, "Dump of expression @ ");
1173 gdb_print_host_address (exp, stream);
1174 fputs_filtered (", after conversion to prefix form:\nExpression: `", stream);
1175 print_expression (exp, stream);
1176 fprintf_filtered (stream, "'\n\tLanguage %s, %d elements, %ld bytes each.\n",
1177 exp->language_defn->name (), exp->nelts,
1178 (long) sizeof (union exp_element));
1179 fputs_filtered ("\n", stream);
1180
1181 for (elt = 0; elt < exp->nelts;)
1182 elt = dump_subexp (exp, stream, elt);
1183 fputs_filtered ("\n", stream);
1184 }