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