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