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