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