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