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