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