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