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