1 /* Parse expressions for GDB.
2 Copyright (C) 1986, 1989, 1990, 1991 Free Software Foundation, Inc.
3 Modified from expread.y by the Department of Computer Science at the
4 State University of New York at Buffalo, 1991.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
22 /* Parse an expression from text in a string,
23 and return the result as a struct expression pointer.
24 That structure contains arithmetic operations in reverse polish,
25 with constants represented by operations that are followed by special data.
26 See expression.h for the details of the format.
27 What is important here is that it can be built up sequentially
28 during the process of parsing; the lower levels of the tree always
29 come first in the result. */
35 #include "expression.h"
39 #include "parser-defs.h"
42 prefixify_expression PARAMS ((struct expression *));
45 length_of_subexp PARAMS ((struct expression *, int));
48 prefixify_subexp PARAMS ((struct expression *, struct expression *, int, int));
50 /* Assign machine-independent names to certain registers
51 (unless overridden by the REGISTER_NAMES table) */
53 struct std_regs std_regs[] = {
68 unsigned num_std_regs = (sizeof std_regs / sizeof std_regs[0]);
71 /* Begin counting arguments for a function call,
72 saving the data about any containing call. */
77 register struct funcall *new = (struct funcall *) xmalloc (sizeof (struct funcall));
79 new->next = funcall_chain;
80 new->arglist_len = arglist_len;
85 /* Return the number of arguments in a function call just terminated,
86 and restore the data for the containing function call. */
91 register int val = arglist_len;
92 register struct funcall *call = funcall_chain;
93 funcall_chain = call->next;
94 arglist_len = call->arglist_len;
99 /* Free everything in the funcall chain.
100 Used when there is an error inside parsing. */
105 register struct funcall *call, *next;
107 for (call = funcall_chain; call; call = next)
114 /* This page contains the functions for adding data to the struct expression
115 being constructed. */
117 /* Add one element to the end of the expression. */
119 /* To avoid a bug in the Sun 4 compiler, we pass things that can fit into
120 a register through here */
123 write_exp_elt (expelt)
124 union exp_element expelt;
126 if (expout_ptr >= expout_size)
129 expout = (struct expression *) xrealloc ((char *) expout,
130 sizeof (struct expression)
131 + expout_size * sizeof (union exp_element));
133 expout->elts[expout_ptr++] = expelt;
137 write_exp_elt_opcode (expelt)
138 enum exp_opcode expelt;
140 union exp_element tmp;
148 write_exp_elt_sym (expelt)
149 struct symbol *expelt;
151 union exp_element tmp;
159 write_exp_elt_longcst (expelt)
162 union exp_element tmp;
164 tmp.longconst = expelt;
170 write_exp_elt_dblcst (expelt)
173 union exp_element tmp;
175 tmp.doubleconst = expelt;
181 write_exp_elt_type (expelt)
184 union exp_element tmp;
192 write_exp_elt_intern (expelt)
193 struct internalvar *expelt;
195 union exp_element tmp;
197 tmp.internalvar = expelt;
202 /* Add a string constant to the end of the expression.
204 String constants are stored by first writing an expression element
205 that contains the length of the string, then stuffing the string
206 constant itself into however many expression elements are needed
207 to hold it, and then writing another expression element that contains
208 the length of the string. I.E. an expression element at each end of
209 the string records the string length, so you can skip over the
210 expression elements containing the actual string bytes from either
211 end of the string. Note that this also allows gdb to handle
212 strings with embedded null bytes, as is required for some languages.
214 Don't be fooled by the fact that the string is null byte terminated,
215 this is strictly for the convenience of debugging gdb itself. Gdb
216 Gdb does not depend up the string being null terminated, since the
217 actual length is recorded in expression elements at each end of the
218 string. The null byte is taken into consideration when computing how
219 many expression elements are required to hold the string constant, of
224 write_exp_string (str)
227 register int len = str.length;
229 register char *strdata;
231 /* Compute the number of expression elements required to hold the string
232 (including a null byte terminator), along with one expression element
233 at each end to record the actual string length (not including the
234 null byte terminator). */
236 lenelt = 2 + (len + sizeof (union exp_element)) / sizeof (union exp_element);
238 /* Ensure that we have enough available expression elements to store
241 if ((expout_ptr + lenelt) >= expout_size)
243 expout_size = max (expout_size * 2, expout_ptr + lenelt + 10);
244 expout = (struct expression *)
245 xrealloc ((char *) expout, (sizeof (struct expression)
246 + (expout_size * sizeof (union exp_element))));
249 /* Write the leading length expression element (which advances the current
250 expression element index), then write the string constant followed by a
251 terminating null byte, and then write the trailing length expression
254 write_exp_elt_longcst ((LONGEST) len);
255 strdata = (char *) &expout->elts[expout_ptr];
256 memcpy (strdata, str.ptr, len);
257 *(strdata + len) = '\0';
258 expout_ptr += lenelt - 2;
259 write_exp_elt_longcst ((LONGEST) len);
262 /* Return a null-terminated temporary copy of the name
263 of a string token. */
269 memcpy (namecopy, token.ptr, token.length);
270 namecopy[token.length] = 0;
274 /* Reverse an expression from suffix form (in which it is constructed)
275 to prefix form (in which we can conveniently print or execute it). */
278 prefixify_expression (expr)
279 register struct expression *expr;
281 register int len = sizeof (struct expression) +
282 expr->nelts * sizeof (union exp_element);
283 register struct expression *temp;
284 register int inpos = expr->nelts, outpos = 0;
286 temp = (struct expression *) alloca (len);
288 /* Copy the original expression into temp. */
289 memcpy (temp, expr, len);
291 prefixify_subexp (temp, expr, inpos, outpos);
294 /* Return the number of exp_elements in the subexpression of EXPR
295 whose last exp_element is at index ENDPOS - 1 in EXPR. */
298 length_of_subexp (expr, endpos)
299 register struct expression *expr;
302 register int oplen = 1;
303 register int args = 0;
307 error ("?error in length_of_subexp");
309 i = (int) expr->elts[endpos - 1].opcode;
315 oplen = 5 + ((longest_to_int (expr->elts[endpos - 2].longconst)
316 + sizeof (union exp_element))
317 / sizeof (union exp_element));
336 args = 1 + longest_to_int (expr->elts[endpos - 2].longconst);
363 case STRUCTOP_STRUCT:
369 oplen = 4 + ((longest_to_int (expr->elts[endpos - 2].longconst)
370 + sizeof (union exp_element))
371 / sizeof (union exp_element));
379 case BINOP_MULTI_SUBSCRIPT:
381 args = 1 + longest_to_int (expr->elts[endpos- 2].longconst);
384 case BINOP_ASSIGN_MODIFY:
395 args = 1 + (i < (int) BINOP_END);
400 oplen += length_of_subexp (expr, endpos - oplen);
407 /* Copy the subexpression ending just before index INEND in INEXPR
408 into OUTEXPR, starting at index OUTBEG.
409 In the process, convert it from suffix to prefix form. */
412 prefixify_subexp (inexpr, outexpr, inend, outbeg)
413 register struct expression *inexpr;
414 struct expression *outexpr;
418 register int oplen = 1;
419 register int args = 0;
422 enum exp_opcode opcode;
424 /* Compute how long the last operation is (in OPLEN),
425 and also how many preceding subexpressions serve as
426 arguments for it (in ARGS). */
428 opcode = inexpr->elts[inend - 1].opcode;
433 oplen = 5 + ((longest_to_int (inexpr->elts[inend - 2].longconst)
434 + sizeof (union exp_element))
435 / sizeof (union exp_element));
454 args = 1 + longest_to_int (inexpr->elts[inend - 2].longconst);
480 case STRUCTOP_STRUCT:
486 oplen = 4 + ((longest_to_int (inexpr->elts[inend - 2].longconst)
487 + sizeof (union exp_element))
488 / sizeof (union exp_element));
495 case BINOP_ASSIGN_MODIFY:
501 case BINOP_MULTI_SUBSCRIPT:
503 args = 1 + longest_to_int (inexpr->elts[inend - 2].longconst);
512 args = 1 + ((int) opcode < (int) BINOP_END);
515 /* Copy the final operator itself, from the end of the input
516 to the beginning of the output. */
518 memcpy (&outexpr->elts[outbeg], &inexpr->elts[inend],
519 oplen * sizeof (union exp_element));
522 /* Find the lengths of the arg subexpressions. */
523 arglens = (int *) alloca (args * sizeof (int));
524 for (i = args - 1; i >= 0; i--)
526 oplen = length_of_subexp (inexpr, inend);
531 /* Now copy each subexpression, preserving the order of
532 the subexpressions, but prefixifying each one.
533 In this loop, inend starts at the beginning of
534 the expression this level is working on
535 and marches forward over the arguments.
536 outbeg does similarly in the output. */
537 for (i = 0; i < args; i++)
541 prefixify_subexp (inexpr, outexpr, inend, outbeg);
546 /* This page contains the two entry points to this file. */
548 /* Read an expression from the string *STRINGPTR points to,
549 parse it, and return a pointer to a struct expression that we malloc.
550 Use block BLOCK as the lexical context for variable names;
551 if BLOCK is zero, use the block of the selected stack frame.
552 Meanwhile, advance *STRINGPTR to point after the expression,
553 at the first nonwhite character that is not part of the expression
554 (possibly a null character).
556 If COMMA is nonzero, stop if a comma is reached. */
559 parse_exp_1 (stringptr, block, comma)
564 struct cleanup *old_chain;
569 type_stack_depth = 0;
571 comma_terminates = comma;
573 if (lexptr == 0 || *lexptr == 0)
574 error_no_arg ("expression to compute");
576 old_chain = make_cleanup (free_funcalls, 0);
579 expression_context_block = block ? block : get_selected_block ();
581 namecopy = (char *) alloca (strlen (lexptr) + 1);
584 expout = (struct expression *)
585 xmalloc (sizeof (struct expression)
586 + expout_size * sizeof (union exp_element));
587 expout->language_defn = current_language;
588 make_cleanup (free_current_contents, &expout);
590 if (current_language->la_parser ())
591 current_language->la_error (NULL);
593 discard_cleanups (old_chain);
594 expout->nelts = expout_ptr;
595 expout = (struct expression *)
596 xrealloc ((char *) expout,
597 sizeof (struct expression)
598 + expout_ptr * sizeof (union exp_element));
599 prefixify_expression (expout);
604 /* Parse STRING as an expression, and complain if this fails
605 to use up all of the contents of STRING. */
608 parse_expression (string)
611 register struct expression *exp;
612 exp = parse_exp_1 (&string, 0, 0);
614 error ("Junk after end of expression.");
622 if (type_stack_depth == type_stack_size)
624 type_stack_size *= 2;
625 type_stack = (union type_stack_elt *)
626 xrealloc ((char *) type_stack, type_stack_size * sizeof (*type_stack));
628 type_stack[type_stack_depth++].piece = tp;
635 if (type_stack_depth == type_stack_size)
637 type_stack_size *= 2;
638 type_stack = (union type_stack_elt *)
639 xrealloc ((char *) type_stack, type_stack_size * sizeof (*type_stack));
641 type_stack[type_stack_depth++].int_val = n;
647 if (type_stack_depth)
648 return type_stack[--type_stack_depth].piece;
655 if (type_stack_depth)
656 return type_stack[--type_stack_depth].int_val;
657 /* "Can't happen". */
664 type_stack_size = 80;
665 type_stack_depth = 0;
666 type_stack = (union type_stack_elt *)
667 xmalloc (type_stack_size * sizeof (*type_stack));