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