]> Git Repo - binutils.git/blob - gdb/parse.c
* parse.c (write_exp_string): Complete rewrite to store string
[binutils.git] / gdb / parse.c
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.
5
6 This file is part of GDB.
7
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.
12
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.
17
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.  */
21
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.  */
30    
31 #include "defs.h"
32 #include "symtab.h"
33 #include "gdbtypes.h"
34 #include "frame.h"
35 #include "expression.h"
36 #include "value.h"
37 #include "command.h"
38 #include "language.h"
39 #include "parser-defs.h"
40
41 static void
42 prefixify_expression PARAMS ((struct expression *));
43
44 static int
45 length_of_subexp PARAMS ((struct expression *, int));
46
47 static void
48 prefixify_subexp PARAMS ((struct expression *, struct expression *, int, int));
49
50 /* Assign machine-independent names to certain registers 
51    (unless overridden by the REGISTER_NAMES table) */
52
53 struct std_regs std_regs[] = {
54 #ifdef PC_REGNUM
55         { "pc", PC_REGNUM },
56 #endif
57 #ifdef FP_REGNUM
58         { "fp", FP_REGNUM },
59 #endif
60 #ifdef SP_REGNUM
61         { "sp", SP_REGNUM },
62 #endif
63 #ifdef PS_REGNUM
64         { "ps", PS_REGNUM },
65 #endif
66 };
67
68 unsigned num_std_regs = (sizeof std_regs / sizeof std_regs[0]);
69
70
71 /* Begin counting arguments for a function call,
72    saving the data about any containing call.  */
73
74 void
75 start_arglist ()
76 {
77   register struct funcall *new = (struct funcall *) xmalloc (sizeof (struct funcall));
78
79   new->next = funcall_chain;
80   new->arglist_len = arglist_len;
81   arglist_len = 0;
82   funcall_chain = new;
83 }
84
85 /* Return the number of arguments in a function call just terminated,
86    and restore the data for the containing function call.  */
87
88 int
89 end_arglist ()
90 {
91   register int val = arglist_len;
92   register struct funcall *call = funcall_chain;
93   funcall_chain = call->next;
94   arglist_len = call->arglist_len;
95   free ((PTR)call);
96   return val;
97 }
98
99 /* Free everything in the funcall chain.
100    Used when there is an error inside parsing.  */
101
102 void
103 free_funcalls ()
104 {
105   register struct funcall *call, *next;
106
107   for (call = funcall_chain; call; call = next)
108     {
109       next = call->next;
110       free ((PTR)call);
111     }
112 }
113 \f
114 /* This page contains the functions for adding data to the  struct expression
115    being constructed.  */
116
117 /* Add one element to the end of the expression.  */
118
119 /* To avoid a bug in the Sun 4 compiler, we pass things that can fit into
120    a register through here */
121
122 void
123 write_exp_elt (expelt)
124      union exp_element expelt;
125 {
126   if (expout_ptr >= expout_size)
127     {
128       expout_size *= 2;
129       expout = (struct expression *) xrealloc ((char *) expout,
130                                                sizeof (struct expression)
131                                                + expout_size * sizeof (union exp_element));
132     }
133   expout->elts[expout_ptr++] = expelt;
134 }
135
136 void
137 write_exp_elt_opcode (expelt)
138      enum exp_opcode expelt;
139 {
140   union exp_element tmp;
141
142   tmp.opcode = expelt;
143
144   write_exp_elt (tmp);
145 }
146
147 void
148 write_exp_elt_sym (expelt)
149      struct symbol *expelt;
150 {
151   union exp_element tmp;
152
153   tmp.symbol = expelt;
154
155   write_exp_elt (tmp);
156 }
157
158 void
159 write_exp_elt_longcst (expelt)
160      LONGEST expelt;
161 {
162   union exp_element tmp;
163
164   tmp.longconst = expelt;
165
166   write_exp_elt (tmp);
167 }
168
169 void
170 write_exp_elt_dblcst (expelt)
171      double expelt;
172 {
173   union exp_element tmp;
174
175   tmp.doubleconst = expelt;
176
177   write_exp_elt (tmp);
178 }
179
180 void
181 write_exp_elt_type (expelt)
182      struct type *expelt;
183 {
184   union exp_element tmp;
185
186   tmp.type = expelt;
187
188   write_exp_elt (tmp);
189 }
190
191 void
192 write_exp_elt_intern (expelt)
193      struct internalvar *expelt;
194 {
195   union exp_element tmp;
196
197   tmp.internalvar = expelt;
198
199   write_exp_elt (tmp);
200 }
201
202 /* Add a string constant to the end of the expression.
203
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.
213
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
220    course. */
221
222
223 void
224 write_exp_string (str)
225      struct stoken str;
226 {
227   register int len = str.length;
228   register int lenelt;
229   register char *strdata;
230
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). */
235
236   lenelt = 2 + (len + sizeof (union exp_element)) / sizeof (union exp_element);
237
238   /* Ensure that we have enough available expression elements to store
239      everything. */
240
241   if ((expout_ptr + lenelt) >= expout_size)
242     {
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))));
247     }
248
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
252      element. */
253
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);
260 }
261 \f
262 /* Return a null-terminated temporary copy of the name
263    of a string token.  */
264
265 char *
266 copy_name (token)
267      struct stoken token;
268 {
269   memcpy (namecopy, token.ptr, token.length);
270   namecopy[token.length] = 0;
271   return namecopy;
272 }
273 \f
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).  */
276
277 static void
278 prefixify_expression (expr)
279      register struct expression *expr;
280 {
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;
285
286   temp = (struct expression *) alloca (len);
287
288   /* Copy the original expression into temp.  */
289   memcpy (temp, expr, len);
290
291   prefixify_subexp (temp, expr, inpos, outpos);
292 }
293
294 /* Return the number of exp_elements in the subexpression of EXPR
295    whose last exp_element is at index ENDPOS - 1 in EXPR.  */
296
297 static int
298 length_of_subexp (expr, endpos)
299      register struct expression *expr;
300      register int endpos;
301 {
302   register int oplen = 1;
303   register int args = 0;
304   register int i;
305
306   if (endpos < 1)
307     error ("?error in length_of_subexp");
308
309   i = (int) expr->elts[endpos - 1].opcode;
310
311   switch (i)
312     {
313       /* C++  */
314     case OP_SCOPE:
315       oplen = 5 + ((longest_to_int (expr->elts[endpos - 2].longconst)
316                     + sizeof (union exp_element))
317                    / sizeof (union exp_element));
318       break;
319
320     case OP_LONG:
321     case OP_DOUBLE:
322       oplen = 4;
323       break;
324
325     case OP_TYPE:
326     case OP_BOOL:
327     case OP_VAR_VALUE:
328     case OP_LAST:
329     case OP_REGISTER:
330     case OP_INTERNALVAR:
331       oplen = 3;
332       break;
333
334     case OP_FUNCALL:
335       oplen = 3;
336       args = 1 + longest_to_int (expr->elts[endpos - 2].longconst);
337       break;
338
339     case UNOP_MAX:
340     case UNOP_MIN:
341       oplen = 3;
342       break;
343
344    case BINOP_VAL:
345    case UNOP_CAST:
346    case UNOP_MEMVAL:
347       oplen = 3;
348       args = 1;
349       break;
350
351     case UNOP_ABS:
352     case UNOP_CAP:
353     case UNOP_CHR:
354     case UNOP_FLOAT:
355     case UNOP_HIGH:
356     case UNOP_ODD:
357     case UNOP_ORD:
358     case UNOP_TRUNC:
359       oplen = 1;
360       args = 1;
361       break;
362
363     case STRUCTOP_STRUCT:
364     case STRUCTOP_PTR:
365       args = 1;
366       /* fall through */
367     case OP_M2_STRING:
368     case OP_STRING:
369       oplen = 4 + ((longest_to_int (expr->elts[endpos - 2].longconst)
370                     + sizeof (union exp_element))
371                    / sizeof (union exp_element));
372       break;
373
374     case TERNOP_COND:
375       args = 3;
376       break;
377
378       /* Modula-2 */
379    case BINOP_MULTI_SUBSCRIPT:
380       oplen=3;
381       args = 1 + longest_to_int (expr->elts[endpos- 2].longconst);
382       break;
383
384     case BINOP_ASSIGN_MODIFY:
385       oplen = 3;
386       args = 2;
387       break;
388
389       /* C++ */
390     case OP_THIS:
391       oplen = 2;
392       break;
393
394     default:
395       args = 1 + (i < (int) BINOP_END);
396     }
397
398   while (args > 0)
399     {
400       oplen += length_of_subexp (expr, endpos - oplen);
401       args--;
402     }
403
404   return oplen;
405 }
406
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.  */
410
411 static void
412 prefixify_subexp (inexpr, outexpr, inend, outbeg)
413      register struct expression *inexpr;
414      struct expression *outexpr;
415      register int inend;
416      int outbeg;
417 {
418   register int oplen = 1;
419   register int args = 0;
420   register int i;
421   int *arglens;
422   enum exp_opcode opcode;
423
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).  */
427
428   opcode = inexpr->elts[inend - 1].opcode;
429   switch (opcode)
430     {
431       /* C++  */
432     case OP_SCOPE:
433       oplen = 5 + ((longest_to_int (inexpr->elts[inend - 2].longconst)
434                     + sizeof (union exp_element))
435                    / sizeof (union exp_element));
436       break;
437
438     case OP_LONG:
439     case OP_DOUBLE:
440       oplen = 4;
441       break;
442
443     case OP_TYPE:
444     case OP_BOOL:
445     case OP_VAR_VALUE:
446     case OP_LAST:
447     case OP_REGISTER:
448     case OP_INTERNALVAR:
449       oplen = 3;
450       break;
451
452     case OP_FUNCALL:
453       oplen = 3;
454       args = 1 + longest_to_int (inexpr->elts[inend - 2].longconst);
455       break;
456
457     case UNOP_MIN:
458     case UNOP_MAX:
459       oplen = 3;
460       break;
461
462     case UNOP_CAST:
463     case UNOP_MEMVAL:
464       oplen = 3;
465       args = 1;
466       break;
467
468     case UNOP_ABS:
469     case UNOP_CAP:
470     case UNOP_CHR:
471     case UNOP_FLOAT:
472     case UNOP_HIGH:
473     case UNOP_ODD:
474     case UNOP_ORD:
475     case UNOP_TRUNC:
476       oplen=1;
477       args=1;
478       break;
479
480    case STRUCTOP_STRUCT:
481     case STRUCTOP_PTR:
482       args = 1;
483       /* fall through */
484     case OP_M2_STRING:
485     case OP_STRING:
486       oplen = 4 + ((longest_to_int (inexpr->elts[inend - 2].longconst)
487                     + sizeof (union exp_element))
488                    / sizeof (union exp_element));
489       break;
490
491     case TERNOP_COND:
492       args = 3;
493       break;
494
495     case BINOP_ASSIGN_MODIFY:
496       oplen = 3;
497       args = 2;
498       break;
499
500       /* Modula-2 */
501    case BINOP_MULTI_SUBSCRIPT:
502       oplen=3;
503       args = 1 + longest_to_int (inexpr->elts[inend - 2].longconst);
504       break;
505
506       /* C++ */
507     case OP_THIS:
508       oplen = 2;
509       break;
510
511     default:
512       args = 1 + ((int) opcode < (int) BINOP_END);
513     }
514
515   /* Copy the final operator itself, from the end of the input
516      to the beginning of the output.  */
517   inend -= oplen;
518   memcpy (&outexpr->elts[outbeg], &inexpr->elts[inend],
519                  oplen * sizeof (union exp_element));
520   outbeg += oplen;
521
522   /* Find the lengths of the arg subexpressions.  */
523   arglens = (int *) alloca (args * sizeof (int));
524   for (i = args - 1; i >= 0; i--)
525     {
526       oplen = length_of_subexp (inexpr, inend);
527       arglens[i] = oplen;
528       inend -= oplen;
529     }
530
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++)
538     {
539       oplen = arglens[i];
540       inend += oplen;
541       prefixify_subexp (inexpr, outexpr, inend, outbeg);
542       outbeg += oplen;
543     }
544 }
545 \f
546 /* This page contains the two entry points to this file.  */
547
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).
555
556    If COMMA is nonzero, stop if a comma is reached.  */
557
558 struct expression *
559 parse_exp_1 (stringptr, block, comma)
560      char **stringptr;
561      struct block *block;
562      int comma;
563 {
564   struct cleanup *old_chain;
565
566   lexptr = *stringptr;
567
568   paren_depth = 0;
569   type_stack_depth = 0;
570
571   comma_terminates = comma;
572
573   if (lexptr == 0 || *lexptr == 0)
574     error_no_arg ("expression to compute");
575
576   old_chain = make_cleanup (free_funcalls, 0);
577   funcall_chain = 0;
578
579   expression_context_block = block ? block : get_selected_block ();
580
581   namecopy = (char *) alloca (strlen (lexptr) + 1);
582   expout_size = 10;
583   expout_ptr = 0;
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);
589
590   if (current_language->la_parser ())
591     current_language->la_error (NULL);
592
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);
600   *stringptr = lexptr;
601   return expout;
602 }
603
604 /* Parse STRING as an expression, and complain if this fails
605    to use up all of the contents of STRING.  */
606
607 struct expression *
608 parse_expression (string)
609      char *string;
610 {
611   register struct expression *exp;
612   exp = parse_exp_1 (&string, 0, 0);
613   if (*string)
614     error ("Junk after end of expression.");
615   return exp;
616 }
617
618 void 
619 push_type (tp)
620      enum type_pieces tp;
621 {
622   if (type_stack_depth == type_stack_size)
623     {
624       type_stack_size *= 2;
625       type_stack = (union type_stack_elt *)
626         xrealloc ((char *) type_stack, type_stack_size * sizeof (*type_stack));
627     }
628   type_stack[type_stack_depth++].piece = tp;
629 }
630
631 void
632 push_type_int (n)
633      int n;
634 {
635   if (type_stack_depth == type_stack_size)
636     {
637       type_stack_size *= 2;
638       type_stack = (union type_stack_elt *)
639         xrealloc ((char *) type_stack, type_stack_size * sizeof (*type_stack));
640     }
641   type_stack[type_stack_depth++].int_val = n;
642 }
643
644 enum type_pieces 
645 pop_type ()
646 {
647   if (type_stack_depth)
648     return type_stack[--type_stack_depth].piece;
649   return tp_end;
650 }
651
652 int
653 pop_type_int ()
654 {
655   if (type_stack_depth)
656     return type_stack[--type_stack_depth].int_val;
657   /* "Can't happen".  */
658   return 0;
659 }
660
661 void
662 _initialize_parse ()
663 {
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));
668 }
This page took 0.058723 seconds and 4 git commands to generate.