1b725ae77Skettenis /* YACC parser for Ada expressions, for GDB.
2*11efff7fSkettenis Copyright (C) 1986, 1989, 1990, 1991, 1993, 1994, 1997, 2000, 2003,
3*11efff7fSkettenis 2004 Free Software Foundation, Inc.
4b725ae77Skettenis
5b725ae77Skettenis This file is part of GDB.
6b725ae77Skettenis
7b725ae77Skettenis This program is free software; you can redistribute it and/or modify
8b725ae77Skettenis it under the terms of the GNU General Public License as published by
9b725ae77Skettenis the Free Software Foundation; either version 2 of the License, or
10b725ae77Skettenis (at your option) any later version.
11b725ae77Skettenis
12b725ae77Skettenis This program is distributed in the hope that it will be useful,
13b725ae77Skettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
14b725ae77Skettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15b725ae77Skettenis GNU General Public License for more details.
16b725ae77Skettenis
17b725ae77Skettenis You should have received a copy of the GNU General Public License
18b725ae77Skettenis along with this program; if not, write to the Free Software
19b725ae77Skettenis Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20b725ae77Skettenis
21b725ae77Skettenis /* Parse an Ada expression from text in a string,
22b725ae77Skettenis and return the result as a struct expression pointer.
23b725ae77Skettenis That structure contains arithmetic operations in reverse polish,
24b725ae77Skettenis with constants represented by operations that are followed by special data.
25b725ae77Skettenis See expression.h for the details of the format.
26b725ae77Skettenis What is important here is that it can be built up sequentially
27b725ae77Skettenis during the process of parsing; the lower levels of the tree always
28b725ae77Skettenis come first in the result.
29b725ae77Skettenis
30b725ae77Skettenis malloc's and realloc's in this file are transformed to
31b725ae77Skettenis xmalloc and xrealloc respectively by the same sed command in the
32b725ae77Skettenis makefile that remaps any other malloc/realloc inserted by the parser
33b725ae77Skettenis generator. Doing this with #defines and trying to control the interaction
34b725ae77Skettenis with include files (<malloc.h> and <stdlib.h> for example) just became
35b725ae77Skettenis too messy, particularly when such includes can be inserted at random
36b725ae77Skettenis times by the parser generator. */
37b725ae77Skettenis
38b725ae77Skettenis %{
39b725ae77Skettenis
40b725ae77Skettenis #include "defs.h"
41*11efff7fSkettenis #include "gdb_string.h"
42b725ae77Skettenis #include <ctype.h>
43b725ae77Skettenis #include "expression.h"
44b725ae77Skettenis #include "value.h"
45b725ae77Skettenis #include "parser-defs.h"
46b725ae77Skettenis #include "language.h"
47b725ae77Skettenis #include "ada-lang.h"
48b725ae77Skettenis #include "bfd.h" /* Required by objfiles.h. */
49b725ae77Skettenis #include "symfile.h" /* Required by objfiles.h. */
50b725ae77Skettenis #include "objfiles.h" /* For have_full_symbols and have_partial_symbols */
51b725ae77Skettenis #include "frame.h"
52b725ae77Skettenis #include "block.h"
53b725ae77Skettenis
54b725ae77Skettenis /* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
55b725ae77Skettenis as well as gratuitiously global symbol names, so we can have multiple
56b725ae77Skettenis yacc generated parsers in gdb. These are only the variables
57b725ae77Skettenis produced by yacc. If other parser generators (bison, byacc, etc) produce
58b725ae77Skettenis additional global names that conflict at link time, then those parser
59b725ae77Skettenis generators need to be fixed instead of adding those names to this list. */
60b725ae77Skettenis
61b725ae77Skettenis /* NOTE: This is clumsy, especially since BISON and FLEX provide --prefix
62b725ae77Skettenis options. I presume we are maintaining it to accommodate systems
63b725ae77Skettenis without BISON? (PNH) */
64b725ae77Skettenis
65b725ae77Skettenis #define yymaxdepth ada_maxdepth
66b725ae77Skettenis #define yyparse _ada_parse /* ada_parse calls this after initialization */
67b725ae77Skettenis #define yylex ada_lex
68b725ae77Skettenis #define yyerror ada_error
69b725ae77Skettenis #define yylval ada_lval
70b725ae77Skettenis #define yychar ada_char
71b725ae77Skettenis #define yydebug ada_debug
72b725ae77Skettenis #define yypact ada_pact
73b725ae77Skettenis #define yyr1 ada_r1
74b725ae77Skettenis #define yyr2 ada_r2
75b725ae77Skettenis #define yydef ada_def
76b725ae77Skettenis #define yychk ada_chk
77b725ae77Skettenis #define yypgo ada_pgo
78b725ae77Skettenis #define yyact ada_act
79b725ae77Skettenis #define yyexca ada_exca
80b725ae77Skettenis #define yyerrflag ada_errflag
81b725ae77Skettenis #define yynerrs ada_nerrs
82b725ae77Skettenis #define yyps ada_ps
83b725ae77Skettenis #define yypv ada_pv
84b725ae77Skettenis #define yys ada_s
85b725ae77Skettenis #define yy_yys ada_yys
86b725ae77Skettenis #define yystate ada_state
87b725ae77Skettenis #define yytmp ada_tmp
88b725ae77Skettenis #define yyv ada_v
89b725ae77Skettenis #define yy_yyv ada_yyv
90b725ae77Skettenis #define yyval ada_val
91b725ae77Skettenis #define yylloc ada_lloc
92b725ae77Skettenis #define yyreds ada_reds /* With YYDEBUG defined */
93b725ae77Skettenis #define yytoks ada_toks /* With YYDEBUG defined */
94b725ae77Skettenis #define yyname ada_name /* With YYDEBUG defined */
95b725ae77Skettenis #define yyrule ada_rule /* With YYDEBUG defined */
96b725ae77Skettenis
97b725ae77Skettenis #ifndef YYDEBUG
98b725ae77Skettenis #define YYDEBUG 1 /* Default to yydebug support */
99b725ae77Skettenis #endif
100b725ae77Skettenis
101b725ae77Skettenis #define YYFPRINTF parser_fprintf
102b725ae77Skettenis
103b725ae77Skettenis struct name_info {
104b725ae77Skettenis struct symbol *sym;
105b725ae77Skettenis struct minimal_symbol *msym;
106b725ae77Skettenis struct block *block;
107b725ae77Skettenis struct stoken stoken;
108b725ae77Skettenis };
109b725ae77Skettenis
110b725ae77Skettenis /* If expression is in the context of TYPE'(...), then TYPE, else
111b725ae77Skettenis * NULL. */
112b725ae77Skettenis static struct type *type_qualifier;
113b725ae77Skettenis
114b725ae77Skettenis int yyparse (void);
115b725ae77Skettenis
116b725ae77Skettenis static int yylex (void);
117b725ae77Skettenis
118b725ae77Skettenis void yyerror (char *);
119b725ae77Skettenis
120b725ae77Skettenis static struct stoken string_to_operator (struct stoken);
121b725ae77Skettenis
122*11efff7fSkettenis static void write_int (LONGEST, struct type *);
123b725ae77Skettenis
124*11efff7fSkettenis static void write_object_renaming (struct block *, struct symbol *, int);
125b725ae77Skettenis
126b725ae77Skettenis static void write_var_from_name (struct block *, struct name_info);
127b725ae77Skettenis
128*11efff7fSkettenis static LONGEST convert_char_literal (struct type *, LONGEST);
129*11efff7fSkettenis
130*11efff7fSkettenis static struct type *type_int (void);
131*11efff7fSkettenis
132*11efff7fSkettenis static struct type *type_long (void);
133*11efff7fSkettenis
134*11efff7fSkettenis static struct type *type_long_long (void);
135*11efff7fSkettenis
136*11efff7fSkettenis static struct type *type_float (void);
137*11efff7fSkettenis
138*11efff7fSkettenis static struct type *type_double (void);
139*11efff7fSkettenis
140*11efff7fSkettenis static struct type *type_long_double (void);
141*11efff7fSkettenis
142*11efff7fSkettenis static struct type *type_char (void);
143*11efff7fSkettenis
144*11efff7fSkettenis static struct type *type_system_address (void);
145b725ae77Skettenis %}
146b725ae77Skettenis
147b725ae77Skettenis %union
148b725ae77Skettenis {
149b725ae77Skettenis LONGEST lval;
150b725ae77Skettenis struct {
151b725ae77Skettenis LONGEST val;
152b725ae77Skettenis struct type *type;
153b725ae77Skettenis } typed_val;
154b725ae77Skettenis struct {
155b725ae77Skettenis DOUBLEST dval;
156b725ae77Skettenis struct type *type;
157b725ae77Skettenis } typed_val_float;
158b725ae77Skettenis struct type *tval;
159b725ae77Skettenis struct stoken sval;
160b725ae77Skettenis struct name_info ssym;
161b725ae77Skettenis int voidval;
162b725ae77Skettenis struct block *bval;
163b725ae77Skettenis struct internalvar *ivar;
164b725ae77Skettenis
165b725ae77Skettenis }
166b725ae77Skettenis
167b725ae77Skettenis %type <voidval> exp exp1 simple_exp start variable
168b725ae77Skettenis %type <tval> type
169b725ae77Skettenis
170b725ae77Skettenis %token <typed_val> INT NULL_PTR CHARLIT
171b725ae77Skettenis %token <typed_val_float> FLOAT
172b725ae77Skettenis %token <tval> TYPENAME
173b725ae77Skettenis %token <bval> BLOCKNAME
174b725ae77Skettenis
175b725ae77Skettenis /* Both NAME and TYPENAME tokens represent symbols in the input,
176b725ae77Skettenis and both convey their data as strings.
177b725ae77Skettenis But a TYPENAME is a string that happens to be defined as a typedef
178b725ae77Skettenis or builtin type name (such as int or char)
179b725ae77Skettenis and a NAME is any other symbol.
180b725ae77Skettenis Contexts where this distinction is not important can use the
181b725ae77Skettenis nonterminal "name", which matches either NAME or TYPENAME. */
182b725ae77Skettenis
183b725ae77Skettenis %token <sval> STRING
184b725ae77Skettenis %token <ssym> NAME DOT_ID OBJECT_RENAMING
185b725ae77Skettenis %type <bval> block
186b725ae77Skettenis %type <lval> arglist tick_arglist
187b725ae77Skettenis
188b725ae77Skettenis %type <tval> save_qualifier
189b725ae77Skettenis
190b725ae77Skettenis %token DOT_ALL
191b725ae77Skettenis
192b725ae77Skettenis /* Special type cases, put in to allow the parser to distinguish different
193b725ae77Skettenis legal basetypes. */
194*11efff7fSkettenis %token <sval> SPECIAL_VARIABLE
195b725ae77Skettenis
196b725ae77Skettenis %nonassoc ASSIGN
197b725ae77Skettenis %left _AND_ OR XOR THEN ELSE
198b725ae77Skettenis %left '=' NOTEQUAL '<' '>' LEQ GEQ IN DOTDOT
199b725ae77Skettenis %left '@'
200b725ae77Skettenis %left '+' '-' '&'
201b725ae77Skettenis %left UNARY
202b725ae77Skettenis %left '*' '/' MOD REM
203b725ae77Skettenis %right STARSTAR ABS NOT
204b725ae77Skettenis /* The following are right-associative only so that reductions at this
205b725ae77Skettenis precedence have lower precedence than '.' and '('. The syntax still
206b725ae77Skettenis forces a.b.c, e.g., to be LEFT-associated. */
207b725ae77Skettenis %right TICK_ACCESS TICK_ADDRESS TICK_FIRST TICK_LAST TICK_LENGTH
208b725ae77Skettenis %right TICK_MAX TICK_MIN TICK_MODULUS
209b725ae77Skettenis %right TICK_POS TICK_RANGE TICK_SIZE TICK_TAG TICK_VAL
210b725ae77Skettenis %right '.' '(' '[' DOT_ID DOT_ALL
211b725ae77Skettenis
212b725ae77Skettenis %token ARROW NEW
213b725ae77Skettenis
214b725ae77Skettenis
215b725ae77Skettenis %%
216b725ae77Skettenis
217b725ae77Skettenis start : exp1
218b725ae77Skettenis | type { write_exp_elt_opcode (OP_TYPE);
219b725ae77Skettenis write_exp_elt_type ($1);
220b725ae77Skettenis write_exp_elt_opcode (OP_TYPE); }
221b725ae77Skettenis ;
222b725ae77Skettenis
223b725ae77Skettenis /* Expressions, including the sequencing operator. */
224b725ae77Skettenis exp1 : exp
225b725ae77Skettenis | exp1 ';' exp
226b725ae77Skettenis { write_exp_elt_opcode (BINOP_COMMA); }
227b725ae77Skettenis ;
228b725ae77Skettenis
229b725ae77Skettenis /* Expressions, not including the sequencing operator. */
230b725ae77Skettenis simple_exp : simple_exp DOT_ALL
231b725ae77Skettenis { write_exp_elt_opcode (UNOP_IND); }
232b725ae77Skettenis ;
233b725ae77Skettenis
234b725ae77Skettenis simple_exp : simple_exp DOT_ID
235b725ae77Skettenis { write_exp_elt_opcode (STRUCTOP_STRUCT);
236b725ae77Skettenis write_exp_string ($2.stoken);
237b725ae77Skettenis write_exp_elt_opcode (STRUCTOP_STRUCT);
238b725ae77Skettenis }
239b725ae77Skettenis ;
240b725ae77Skettenis
241b725ae77Skettenis simple_exp : simple_exp '(' arglist ')'
242b725ae77Skettenis {
243b725ae77Skettenis write_exp_elt_opcode (OP_FUNCALL);
244b725ae77Skettenis write_exp_elt_longcst ($3);
245b725ae77Skettenis write_exp_elt_opcode (OP_FUNCALL);
246b725ae77Skettenis }
247b725ae77Skettenis ;
248b725ae77Skettenis
249b725ae77Skettenis simple_exp : type '(' exp ')'
250b725ae77Skettenis {
251b725ae77Skettenis write_exp_elt_opcode (UNOP_CAST);
252b725ae77Skettenis write_exp_elt_type ($1);
253b725ae77Skettenis write_exp_elt_opcode (UNOP_CAST);
254b725ae77Skettenis }
255b725ae77Skettenis ;
256b725ae77Skettenis
257b725ae77Skettenis simple_exp : type '\'' save_qualifier { type_qualifier = $1; } '(' exp ')'
258b725ae77Skettenis {
259*11efff7fSkettenis write_exp_elt_opcode (UNOP_QUAL);
260b725ae77Skettenis write_exp_elt_type ($1);
261*11efff7fSkettenis write_exp_elt_opcode (UNOP_QUAL);
262b725ae77Skettenis type_qualifier = $3;
263b725ae77Skettenis }
264b725ae77Skettenis ;
265b725ae77Skettenis
266b725ae77Skettenis save_qualifier : { $$ = type_qualifier; }
267b725ae77Skettenis ;
268b725ae77Skettenis
269b725ae77Skettenis simple_exp :
270b725ae77Skettenis simple_exp '(' exp DOTDOT exp ')'
271b725ae77Skettenis { write_exp_elt_opcode (TERNOP_SLICE); }
272b725ae77Skettenis ;
273b725ae77Skettenis
274b725ae77Skettenis simple_exp : '(' exp1 ')' { }
275b725ae77Skettenis ;
276b725ae77Skettenis
277b725ae77Skettenis simple_exp : variable
278b725ae77Skettenis ;
279b725ae77Skettenis
280*11efff7fSkettenis simple_exp: SPECIAL_VARIABLE /* Various GDB extensions */
281*11efff7fSkettenis { write_dollar_variable ($1); }
282b725ae77Skettenis ;
283b725ae77Skettenis
284b725ae77Skettenis exp : simple_exp
285b725ae77Skettenis ;
286b725ae77Skettenis
287b725ae77Skettenis exp : exp ASSIGN exp /* Extension for convenience */
288b725ae77Skettenis { write_exp_elt_opcode (BINOP_ASSIGN); }
289b725ae77Skettenis ;
290b725ae77Skettenis
291b725ae77Skettenis exp : '-' exp %prec UNARY
292b725ae77Skettenis { write_exp_elt_opcode (UNOP_NEG); }
293b725ae77Skettenis ;
294b725ae77Skettenis
295b725ae77Skettenis exp : '+' exp %prec UNARY
296b725ae77Skettenis { write_exp_elt_opcode (UNOP_PLUS); }
297b725ae77Skettenis ;
298b725ae77Skettenis
299b725ae77Skettenis exp : NOT exp %prec UNARY
300b725ae77Skettenis { write_exp_elt_opcode (UNOP_LOGICAL_NOT); }
301b725ae77Skettenis ;
302b725ae77Skettenis
303b725ae77Skettenis exp : ABS exp %prec UNARY
304b725ae77Skettenis { write_exp_elt_opcode (UNOP_ABS); }
305b725ae77Skettenis ;
306b725ae77Skettenis
307b725ae77Skettenis arglist : { $$ = 0; }
308b725ae77Skettenis ;
309b725ae77Skettenis
310b725ae77Skettenis arglist : exp
311b725ae77Skettenis { $$ = 1; }
312b725ae77Skettenis | any_name ARROW exp
313b725ae77Skettenis { $$ = 1; }
314b725ae77Skettenis | arglist ',' exp
315b725ae77Skettenis { $$ = $1 + 1; }
316b725ae77Skettenis | arglist ',' any_name ARROW exp
317b725ae77Skettenis { $$ = $1 + 1; }
318b725ae77Skettenis ;
319b725ae77Skettenis
320b725ae77Skettenis exp : '{' type '}' exp %prec '.'
321b725ae77Skettenis /* GDB extension */
322b725ae77Skettenis { write_exp_elt_opcode (UNOP_MEMVAL);
323b725ae77Skettenis write_exp_elt_type ($2);
324b725ae77Skettenis write_exp_elt_opcode (UNOP_MEMVAL);
325b725ae77Skettenis }
326b725ae77Skettenis ;
327b725ae77Skettenis
328b725ae77Skettenis /* Binary operators in order of decreasing precedence. */
329b725ae77Skettenis
330b725ae77Skettenis exp : exp STARSTAR exp
331b725ae77Skettenis { write_exp_elt_opcode (BINOP_EXP); }
332b725ae77Skettenis ;
333b725ae77Skettenis
334b725ae77Skettenis exp : exp '*' exp
335b725ae77Skettenis { write_exp_elt_opcode (BINOP_MUL); }
336b725ae77Skettenis ;
337b725ae77Skettenis
338b725ae77Skettenis exp : exp '/' exp
339b725ae77Skettenis { write_exp_elt_opcode (BINOP_DIV); }
340b725ae77Skettenis ;
341b725ae77Skettenis
342b725ae77Skettenis exp : exp REM exp /* May need to be fixed to give correct Ada REM */
343b725ae77Skettenis { write_exp_elt_opcode (BINOP_REM); }
344b725ae77Skettenis ;
345b725ae77Skettenis
346b725ae77Skettenis exp : exp MOD exp
347b725ae77Skettenis { write_exp_elt_opcode (BINOP_MOD); }
348b725ae77Skettenis ;
349b725ae77Skettenis
350b725ae77Skettenis exp : exp '@' exp /* GDB extension */
351b725ae77Skettenis { write_exp_elt_opcode (BINOP_REPEAT); }
352b725ae77Skettenis ;
353b725ae77Skettenis
354b725ae77Skettenis exp : exp '+' exp
355b725ae77Skettenis { write_exp_elt_opcode (BINOP_ADD); }
356b725ae77Skettenis ;
357b725ae77Skettenis
358b725ae77Skettenis exp : exp '&' exp
359b725ae77Skettenis { write_exp_elt_opcode (BINOP_CONCAT); }
360b725ae77Skettenis ;
361b725ae77Skettenis
362b725ae77Skettenis exp : exp '-' exp
363b725ae77Skettenis { write_exp_elt_opcode (BINOP_SUB); }
364b725ae77Skettenis ;
365b725ae77Skettenis
366b725ae77Skettenis exp : exp '=' exp
367b725ae77Skettenis { write_exp_elt_opcode (BINOP_EQUAL); }
368b725ae77Skettenis ;
369b725ae77Skettenis
370b725ae77Skettenis exp : exp NOTEQUAL exp
371b725ae77Skettenis { write_exp_elt_opcode (BINOP_NOTEQUAL); }
372b725ae77Skettenis ;
373b725ae77Skettenis
374b725ae77Skettenis exp : exp LEQ exp
375b725ae77Skettenis { write_exp_elt_opcode (BINOP_LEQ); }
376b725ae77Skettenis ;
377b725ae77Skettenis
378b725ae77Skettenis exp : exp IN exp DOTDOT exp
379*11efff7fSkettenis { write_exp_elt_opcode (TERNOP_IN_RANGE); }
380b725ae77Skettenis | exp IN exp TICK_RANGE tick_arglist
381*11efff7fSkettenis { write_exp_elt_opcode (BINOP_IN_BOUNDS);
382b725ae77Skettenis write_exp_elt_longcst ((LONGEST) $5);
383*11efff7fSkettenis write_exp_elt_opcode (BINOP_IN_BOUNDS);
384b725ae77Skettenis }
385b725ae77Skettenis | exp IN TYPENAME %prec TICK_ACCESS
386*11efff7fSkettenis { write_exp_elt_opcode (UNOP_IN_RANGE);
387b725ae77Skettenis write_exp_elt_type ($3);
388*11efff7fSkettenis write_exp_elt_opcode (UNOP_IN_RANGE);
389b725ae77Skettenis }
390b725ae77Skettenis | exp NOT IN exp DOTDOT exp
391*11efff7fSkettenis { write_exp_elt_opcode (TERNOP_IN_RANGE);
392b725ae77Skettenis write_exp_elt_opcode (UNOP_LOGICAL_NOT);
393b725ae77Skettenis }
394b725ae77Skettenis | exp NOT IN exp TICK_RANGE tick_arglist
395*11efff7fSkettenis { write_exp_elt_opcode (BINOP_IN_BOUNDS);
396b725ae77Skettenis write_exp_elt_longcst ((LONGEST) $6);
397*11efff7fSkettenis write_exp_elt_opcode (BINOP_IN_BOUNDS);
398b725ae77Skettenis write_exp_elt_opcode (UNOP_LOGICAL_NOT);
399b725ae77Skettenis }
400b725ae77Skettenis | exp NOT IN TYPENAME %prec TICK_ACCESS
401*11efff7fSkettenis { write_exp_elt_opcode (UNOP_IN_RANGE);
402b725ae77Skettenis write_exp_elt_type ($4);
403*11efff7fSkettenis write_exp_elt_opcode (UNOP_IN_RANGE);
404b725ae77Skettenis write_exp_elt_opcode (UNOP_LOGICAL_NOT);
405b725ae77Skettenis }
406b725ae77Skettenis ;
407b725ae77Skettenis
408b725ae77Skettenis exp : exp GEQ exp
409b725ae77Skettenis { write_exp_elt_opcode (BINOP_GEQ); }
410b725ae77Skettenis ;
411b725ae77Skettenis
412b725ae77Skettenis exp : exp '<' exp
413b725ae77Skettenis { write_exp_elt_opcode (BINOP_LESS); }
414b725ae77Skettenis ;
415b725ae77Skettenis
416b725ae77Skettenis exp : exp '>' exp
417b725ae77Skettenis { write_exp_elt_opcode (BINOP_GTR); }
418b725ae77Skettenis ;
419b725ae77Skettenis
420b725ae77Skettenis exp : exp _AND_ exp /* Fix for Ada elementwise AND. */
421b725ae77Skettenis { write_exp_elt_opcode (BINOP_BITWISE_AND); }
422b725ae77Skettenis ;
423b725ae77Skettenis
424b725ae77Skettenis exp : exp _AND_ THEN exp %prec _AND_
425b725ae77Skettenis { write_exp_elt_opcode (BINOP_LOGICAL_AND); }
426b725ae77Skettenis ;
427b725ae77Skettenis
428b725ae77Skettenis exp : exp OR exp /* Fix for Ada elementwise OR */
429b725ae77Skettenis { write_exp_elt_opcode (BINOP_BITWISE_IOR); }
430b725ae77Skettenis ;
431b725ae77Skettenis
432b725ae77Skettenis exp : exp OR ELSE exp
433b725ae77Skettenis { write_exp_elt_opcode (BINOP_LOGICAL_OR); }
434b725ae77Skettenis ;
435b725ae77Skettenis
436b725ae77Skettenis exp : exp XOR exp /* Fix for Ada elementwise XOR */
437b725ae77Skettenis { write_exp_elt_opcode (BINOP_BITWISE_XOR); }
438b725ae77Skettenis ;
439b725ae77Skettenis
440b725ae77Skettenis simple_exp : simple_exp TICK_ACCESS
441b725ae77Skettenis { write_exp_elt_opcode (UNOP_ADDR); }
442b725ae77Skettenis | simple_exp TICK_ADDRESS
443b725ae77Skettenis { write_exp_elt_opcode (UNOP_ADDR);
444b725ae77Skettenis write_exp_elt_opcode (UNOP_CAST);
445*11efff7fSkettenis write_exp_elt_type (type_system_address ());
446b725ae77Skettenis write_exp_elt_opcode (UNOP_CAST);
447b725ae77Skettenis }
448b725ae77Skettenis | simple_exp TICK_FIRST tick_arglist
449*11efff7fSkettenis { write_int ($3, type_int ());
450*11efff7fSkettenis write_exp_elt_opcode (OP_ATR_FIRST); }
451b725ae77Skettenis | simple_exp TICK_LAST tick_arglist
452*11efff7fSkettenis { write_int ($3, type_int ());
453*11efff7fSkettenis write_exp_elt_opcode (OP_ATR_LAST); }
454b725ae77Skettenis | simple_exp TICK_LENGTH tick_arglist
455*11efff7fSkettenis { write_int ($3, type_int ());
456*11efff7fSkettenis write_exp_elt_opcode (OP_ATR_LENGTH); }
457b725ae77Skettenis | simple_exp TICK_SIZE
458*11efff7fSkettenis { write_exp_elt_opcode (OP_ATR_SIZE); }
459b725ae77Skettenis | simple_exp TICK_TAG
460*11efff7fSkettenis { write_exp_elt_opcode (OP_ATR_TAG); }
461b725ae77Skettenis | opt_type_prefix TICK_MIN '(' exp ',' exp ')'
462*11efff7fSkettenis { write_exp_elt_opcode (OP_ATR_MIN); }
463b725ae77Skettenis | opt_type_prefix TICK_MAX '(' exp ',' exp ')'
464*11efff7fSkettenis { write_exp_elt_opcode (OP_ATR_MAX); }
465b725ae77Skettenis | opt_type_prefix TICK_POS '(' exp ')'
466*11efff7fSkettenis { write_exp_elt_opcode (OP_ATR_POS); }
467b725ae77Skettenis | type_prefix TICK_FIRST tick_arglist
468*11efff7fSkettenis { write_int ($3, type_int ());
469*11efff7fSkettenis write_exp_elt_opcode (OP_ATR_FIRST); }
470b725ae77Skettenis | type_prefix TICK_LAST tick_arglist
471*11efff7fSkettenis { write_int ($3, type_int ());
472*11efff7fSkettenis write_exp_elt_opcode (OP_ATR_LAST); }
473b725ae77Skettenis | type_prefix TICK_LENGTH tick_arglist
474*11efff7fSkettenis { write_int ($3, type_int ());
475*11efff7fSkettenis write_exp_elt_opcode (OP_ATR_LENGTH); }
476b725ae77Skettenis | type_prefix TICK_VAL '(' exp ')'
477*11efff7fSkettenis { write_exp_elt_opcode (OP_ATR_VAL); }
478b725ae77Skettenis | type_prefix TICK_MODULUS
479*11efff7fSkettenis { write_exp_elt_opcode (OP_ATR_MODULUS); }
480b725ae77Skettenis ;
481b725ae77Skettenis
482b725ae77Skettenis tick_arglist : %prec '('
483b725ae77Skettenis { $$ = 1; }
484b725ae77Skettenis | '(' INT ')'
485b725ae77Skettenis { $$ = $2.val; }
486b725ae77Skettenis ;
487b725ae77Skettenis
488b725ae77Skettenis type_prefix :
489b725ae77Skettenis TYPENAME
490b725ae77Skettenis { write_exp_elt_opcode (OP_TYPE);
491b725ae77Skettenis write_exp_elt_type ($1);
492b725ae77Skettenis write_exp_elt_opcode (OP_TYPE); }
493b725ae77Skettenis ;
494b725ae77Skettenis
495b725ae77Skettenis opt_type_prefix :
496b725ae77Skettenis type_prefix
497b725ae77Skettenis | /* EMPTY */
498b725ae77Skettenis { write_exp_elt_opcode (OP_TYPE);
499b725ae77Skettenis write_exp_elt_type (builtin_type_void);
500b725ae77Skettenis write_exp_elt_opcode (OP_TYPE); }
501b725ae77Skettenis ;
502b725ae77Skettenis
503b725ae77Skettenis
504b725ae77Skettenis exp : INT
505*11efff7fSkettenis { write_int ((LONGEST) $1.val, $1.type); }
506b725ae77Skettenis ;
507b725ae77Skettenis
508b725ae77Skettenis exp : CHARLIT
509*11efff7fSkettenis { write_int (convert_char_literal (type_qualifier, $1.val),
510*11efff7fSkettenis (type_qualifier == NULL)
511*11efff7fSkettenis ? $1.type : type_qualifier);
512b725ae77Skettenis }
513b725ae77Skettenis ;
514b725ae77Skettenis
515b725ae77Skettenis exp : FLOAT
516b725ae77Skettenis { write_exp_elt_opcode (OP_DOUBLE);
517b725ae77Skettenis write_exp_elt_type ($1.type);
518b725ae77Skettenis write_exp_elt_dblcst ($1.dval);
519b725ae77Skettenis write_exp_elt_opcode (OP_DOUBLE);
520b725ae77Skettenis }
521b725ae77Skettenis ;
522b725ae77Skettenis
523b725ae77Skettenis exp : NULL_PTR
524*11efff7fSkettenis { write_int (0, type_int ()); }
525b725ae77Skettenis ;
526b725ae77Skettenis
527b725ae77Skettenis exp : STRING
528b725ae77Skettenis {
529*11efff7fSkettenis write_exp_elt_opcode (OP_STRING);
530*11efff7fSkettenis write_exp_string ($1);
531*11efff7fSkettenis write_exp_elt_opcode (OP_STRING);
532b725ae77Skettenis }
533b725ae77Skettenis ;
534b725ae77Skettenis
535b725ae77Skettenis exp : NEW TYPENAME
536b725ae77Skettenis { error ("NEW not implemented."); }
537b725ae77Skettenis ;
538b725ae77Skettenis
539b725ae77Skettenis variable: NAME { write_var_from_name (NULL, $1); }
540b725ae77Skettenis | block NAME /* GDB extension */
541b725ae77Skettenis { write_var_from_name ($1, $2); }
542*11efff7fSkettenis | OBJECT_RENAMING
543*11efff7fSkettenis { write_object_renaming (NULL, $1.sym,
544*11efff7fSkettenis MAX_RENAMING_CHAIN_LENGTH); }
545b725ae77Skettenis | block OBJECT_RENAMING
546*11efff7fSkettenis { write_object_renaming ($1, $2.sym,
547*11efff7fSkettenis MAX_RENAMING_CHAIN_LENGTH); }
548b725ae77Skettenis ;
549b725ae77Skettenis
550b725ae77Skettenis any_name : NAME { }
551b725ae77Skettenis | TYPENAME { }
552b725ae77Skettenis | OBJECT_RENAMING { }
553b725ae77Skettenis ;
554b725ae77Skettenis
555b725ae77Skettenis block : BLOCKNAME /* GDB extension */
556b725ae77Skettenis { $$ = $1; }
557b725ae77Skettenis | block BLOCKNAME /* GDB extension */
558b725ae77Skettenis { $$ = $2; }
559b725ae77Skettenis ;
560b725ae77Skettenis
561b725ae77Skettenis
562b725ae77Skettenis type : TYPENAME { $$ = $1; }
563b725ae77Skettenis | block TYPENAME { $$ = $2; }
564b725ae77Skettenis | TYPENAME TICK_ACCESS
565b725ae77Skettenis { $$ = lookup_pointer_type ($1); }
566b725ae77Skettenis | block TYPENAME TICK_ACCESS
567b725ae77Skettenis { $$ = lookup_pointer_type ($2); }
568b725ae77Skettenis ;
569b725ae77Skettenis
570b725ae77Skettenis /* Some extensions borrowed from C, for the benefit of those who find they
571b725ae77Skettenis can't get used to Ada notation in GDB. */
572b725ae77Skettenis
573b725ae77Skettenis exp : '*' exp %prec '.'
574b725ae77Skettenis { write_exp_elt_opcode (UNOP_IND); }
575b725ae77Skettenis | '&' exp %prec '.'
576b725ae77Skettenis { write_exp_elt_opcode (UNOP_ADDR); }
577b725ae77Skettenis | exp '[' exp ']'
578b725ae77Skettenis { write_exp_elt_opcode (BINOP_SUBSCRIPT); }
579b725ae77Skettenis ;
580b725ae77Skettenis
581b725ae77Skettenis %%
582b725ae77Skettenis
583b725ae77Skettenis /* yylex defined in ada-lex.c: Reads one token, getting characters */
584b725ae77Skettenis /* through lexptr. */
585b725ae77Skettenis
586b725ae77Skettenis /* Remap normal flex interface names (yylex) as well as gratuitiously */
587b725ae77Skettenis /* global symbol names, so we can have multiple flex-generated parsers */
588b725ae77Skettenis /* in gdb. */
589b725ae77Skettenis
590b725ae77Skettenis /* (See note above on previous definitions for YACC.) */
591b725ae77Skettenis
592b725ae77Skettenis #define yy_create_buffer ada_yy_create_buffer
593b725ae77Skettenis #define yy_delete_buffer ada_yy_delete_buffer
594b725ae77Skettenis #define yy_init_buffer ada_yy_init_buffer
595b725ae77Skettenis #define yy_load_buffer_state ada_yy_load_buffer_state
596b725ae77Skettenis #define yy_switch_to_buffer ada_yy_switch_to_buffer
597b725ae77Skettenis #define yyrestart ada_yyrestart
598b725ae77Skettenis #define yytext ada_yytext
599b725ae77Skettenis #define yywrap ada_yywrap
600b725ae77Skettenis
601*11efff7fSkettenis static struct obstack temp_parse_space;
602*11efff7fSkettenis
603b725ae77Skettenis /* The following kludge was found necessary to prevent conflicts between */
604b725ae77Skettenis /* defs.h and non-standard stdlib.h files. */
605b725ae77Skettenis #define qsort __qsort__dummy
606b725ae77Skettenis #include "ada-lex.c"
607b725ae77Skettenis
608b725ae77Skettenis int
ada_parse(void)609*11efff7fSkettenis ada_parse (void)
610b725ae77Skettenis {
611b725ae77Skettenis lexer_init (yyin); /* (Re-)initialize lexer. */
612b725ae77Skettenis left_block_context = NULL;
613b725ae77Skettenis type_qualifier = NULL;
614*11efff7fSkettenis obstack_free (&temp_parse_space, NULL);
615*11efff7fSkettenis obstack_init (&temp_parse_space);
616b725ae77Skettenis
617b725ae77Skettenis return _ada_parse ();
618b725ae77Skettenis }
619b725ae77Skettenis
620b725ae77Skettenis void
yyerror(char * msg)621*11efff7fSkettenis yyerror (char *msg)
622b725ae77Skettenis {
623b725ae77Skettenis error ("A %s in expression, near `%s'.", (msg ? msg : "error"), lexptr);
624b725ae77Skettenis }
625b725ae77Skettenis
626b725ae77Skettenis /* The operator name corresponding to operator symbol STRING (adds
627b725ae77Skettenis quotes and maps to lower-case). Destroys the previous contents of
628b725ae77Skettenis the array pointed to by STRING.ptr. Error if STRING does not match
629b725ae77Skettenis a valid Ada operator. Assumes that STRING.ptr points to a
630b725ae77Skettenis null-terminated string and that, if STRING is a valid operator
631b725ae77Skettenis symbol, the array pointed to by STRING.ptr contains at least
632b725ae77Skettenis STRING.length+3 characters. */
633b725ae77Skettenis
634b725ae77Skettenis static struct stoken
string_to_operator(struct stoken string)635*11efff7fSkettenis string_to_operator (struct stoken string)
636b725ae77Skettenis {
637b725ae77Skettenis int i;
638b725ae77Skettenis
639*11efff7fSkettenis for (i = 0; ada_opname_table[i].encoded != NULL; i += 1)
640b725ae77Skettenis {
641*11efff7fSkettenis if (string.length == strlen (ada_opname_table[i].decoded)-2
642*11efff7fSkettenis && strncasecmp (string.ptr, ada_opname_table[i].decoded+1,
643b725ae77Skettenis string.length) == 0)
644b725ae77Skettenis {
645*11efff7fSkettenis strncpy (string.ptr, ada_opname_table[i].decoded,
646b725ae77Skettenis string.length+2);
647b725ae77Skettenis string.length += 2;
648b725ae77Skettenis return string;
649b725ae77Skettenis }
650b725ae77Skettenis }
651b725ae77Skettenis error ("Invalid operator symbol `%s'", string.ptr);
652b725ae77Skettenis }
653b725ae77Skettenis
654b725ae77Skettenis /* Emit expression to access an instance of SYM, in block BLOCK (if
655b725ae77Skettenis * non-NULL), and with :: qualification ORIG_LEFT_CONTEXT. */
656b725ae77Skettenis static void
write_var_from_sym(struct block * orig_left_context,struct block * block,struct symbol * sym)657*11efff7fSkettenis write_var_from_sym (struct block *orig_left_context,
658*11efff7fSkettenis struct block *block,
659*11efff7fSkettenis struct symbol *sym)
660b725ae77Skettenis {
661b725ae77Skettenis if (orig_left_context == NULL && symbol_read_needs_frame (sym))
662b725ae77Skettenis {
663*11efff7fSkettenis if (innermost_block == 0
664*11efff7fSkettenis || contained_in (block, innermost_block))
665b725ae77Skettenis innermost_block = block;
666b725ae77Skettenis }
667b725ae77Skettenis
668b725ae77Skettenis write_exp_elt_opcode (OP_VAR_VALUE);
669*11efff7fSkettenis write_exp_elt_block (block);
670b725ae77Skettenis write_exp_elt_sym (sym);
671b725ae77Skettenis write_exp_elt_opcode (OP_VAR_VALUE);
672b725ae77Skettenis }
673b725ae77Skettenis
674*11efff7fSkettenis /* Emit expression to access an instance of NAME in :: context
675*11efff7fSkettenis * ORIG_LEFT_CONTEXT. If no unique symbol for NAME has been found,
676*11efff7fSkettenis * output a dummy symbol (good to the next call of ada_parse) for NAME
677*11efff7fSkettenis * in the UNDEF_DOMAIN, for later resolution by ada_resolve. */
678b725ae77Skettenis static void
write_var_from_name(struct block * orig_left_context,struct name_info name)679*11efff7fSkettenis write_var_from_name (struct block *orig_left_context,
680*11efff7fSkettenis struct name_info name)
681b725ae77Skettenis {
682b725ae77Skettenis if (name.msym != NULL)
683b725ae77Skettenis {
684b725ae77Skettenis write_exp_msymbol (name.msym,
685*11efff7fSkettenis lookup_function_type (type_int ()),
686*11efff7fSkettenis type_int ());
687b725ae77Skettenis }
688b725ae77Skettenis else if (name.sym == NULL)
689b725ae77Skettenis {
690b725ae77Skettenis /* Multiple matches: record name and starting block for later
691b725ae77Skettenis resolution by ada_resolve. */
692*11efff7fSkettenis char *encoded_name = ada_encode (name.stoken.ptr);
693*11efff7fSkettenis struct symbol *sym =
694*11efff7fSkettenis obstack_alloc (&temp_parse_space, sizeof (struct symbol));
695*11efff7fSkettenis memset (sym, 0, sizeof (struct symbol));
696*11efff7fSkettenis SYMBOL_DOMAIN (sym) = UNDEF_DOMAIN;
697*11efff7fSkettenis SYMBOL_LINKAGE_NAME (sym)
698*11efff7fSkettenis = obsavestring (encoded_name, strlen (encoded_name), &temp_parse_space);
699*11efff7fSkettenis SYMBOL_LANGUAGE (sym) = language_ada;
700*11efff7fSkettenis
701*11efff7fSkettenis write_exp_elt_opcode (OP_VAR_VALUE);
702b725ae77Skettenis write_exp_elt_block (name.block);
703*11efff7fSkettenis write_exp_elt_sym (sym);
704*11efff7fSkettenis write_exp_elt_opcode (OP_VAR_VALUE);
705b725ae77Skettenis }
706b725ae77Skettenis else
707b725ae77Skettenis write_var_from_sym (orig_left_context, name.block, name.sym);
708b725ae77Skettenis }
709b725ae77Skettenis
710*11efff7fSkettenis /* Write integer constant ARG of type TYPE. */
711b725ae77Skettenis
712b725ae77Skettenis static void
write_int(LONGEST arg,struct type * type)713*11efff7fSkettenis write_int (LONGEST arg, struct type *type)
714b725ae77Skettenis {
715b725ae77Skettenis write_exp_elt_opcode (OP_LONG);
716*11efff7fSkettenis write_exp_elt_type (type);
717b725ae77Skettenis write_exp_elt_longcst (arg);
718b725ae77Skettenis write_exp_elt_opcode (OP_LONG);
719b725ae77Skettenis }
720b725ae77Skettenis
721b725ae77Skettenis /* Emit expression corresponding to the renamed object designated by
722b725ae77Skettenis * the type RENAMING, which must be the referent of an object renaming
723*11efff7fSkettenis * type, in the context of ORIG_LEFT_CONTEXT. MAX_DEPTH is the maximum
724*11efff7fSkettenis * number of cascaded renamings to allow. */
725b725ae77Skettenis static void
write_object_renaming(struct block * orig_left_context,struct symbol * renaming,int max_depth)726*11efff7fSkettenis write_object_renaming (struct block *orig_left_context,
727*11efff7fSkettenis struct symbol *renaming, int max_depth)
728b725ae77Skettenis {
729*11efff7fSkettenis const char *qualification = SYMBOL_LINKAGE_NAME (renaming);
730b725ae77Skettenis const char *simple_tail;
731b725ae77Skettenis const char *expr = TYPE_FIELD_NAME (SYMBOL_TYPE (renaming), 0);
732b725ae77Skettenis const char *suffix;
733b725ae77Skettenis char *name;
734b725ae77Skettenis struct symbol *sym;
735b725ae77Skettenis enum { SIMPLE_INDEX, LOWER_BOUND, UPPER_BOUND } slice_state;
736b725ae77Skettenis
737*11efff7fSkettenis if (max_depth <= 0)
738*11efff7fSkettenis error ("Could not find renamed symbol");
739*11efff7fSkettenis
740b725ae77Skettenis /* if orig_left_context is null, then use the currently selected
741*11efff7fSkettenis block; otherwise we might fail our symbol lookup below. */
742b725ae77Skettenis if (orig_left_context == NULL)
743b725ae77Skettenis orig_left_context = get_selected_block (NULL);
744b725ae77Skettenis
745b725ae77Skettenis for (simple_tail = qualification + strlen (qualification);
746b725ae77Skettenis simple_tail != qualification; simple_tail -= 1)
747b725ae77Skettenis {
748b725ae77Skettenis if (*simple_tail == '.')
749b725ae77Skettenis {
750b725ae77Skettenis simple_tail += 1;
751b725ae77Skettenis break;
752b725ae77Skettenis }
753*11efff7fSkettenis else if (strncmp (simple_tail, "__", 2) == 0)
754b725ae77Skettenis {
755b725ae77Skettenis simple_tail += 2;
756b725ae77Skettenis break;
757b725ae77Skettenis }
758b725ae77Skettenis }
759b725ae77Skettenis
760b725ae77Skettenis suffix = strstr (expr, "___XE");
761b725ae77Skettenis if (suffix == NULL)
762b725ae77Skettenis goto BadEncoding;
763b725ae77Skettenis
764*11efff7fSkettenis name = (char *) obstack_alloc (&temp_parse_space, suffix - expr + 1);
765b725ae77Skettenis strncpy (name, expr, suffix-expr);
766b725ae77Skettenis name[suffix-expr] = '\000';
767b725ae77Skettenis sym = lookup_symbol (name, orig_left_context, VAR_DOMAIN, 0, NULL);
768*11efff7fSkettenis if (sym == NULL)
769*11efff7fSkettenis error ("Could not find renamed variable: %s", ada_decode (name));
770*11efff7fSkettenis if (ada_is_object_renaming (sym))
771*11efff7fSkettenis write_object_renaming (orig_left_context, sym, max_depth-1);
772*11efff7fSkettenis else
773b725ae77Skettenis write_var_from_sym (orig_left_context, block_found, sym);
774b725ae77Skettenis
775b725ae77Skettenis suffix += 5;
776b725ae77Skettenis slice_state = SIMPLE_INDEX;
777b725ae77Skettenis while (*suffix == 'X')
778b725ae77Skettenis {
779b725ae77Skettenis suffix += 1;
780b725ae77Skettenis
781b725ae77Skettenis switch (*suffix) {
782*11efff7fSkettenis case 'A':
783*11efff7fSkettenis suffix += 1;
784*11efff7fSkettenis write_exp_elt_opcode (UNOP_IND);
785*11efff7fSkettenis break;
786b725ae77Skettenis case 'L':
787b725ae77Skettenis slice_state = LOWER_BOUND;
788b725ae77Skettenis case 'S':
789b725ae77Skettenis suffix += 1;
790b725ae77Skettenis if (isdigit (*suffix))
791b725ae77Skettenis {
792b725ae77Skettenis char *next;
793b725ae77Skettenis long val = strtol (suffix, &next, 10);
794b725ae77Skettenis if (next == suffix)
795b725ae77Skettenis goto BadEncoding;
796b725ae77Skettenis suffix = next;
797b725ae77Skettenis write_exp_elt_opcode (OP_LONG);
798*11efff7fSkettenis write_exp_elt_type (type_int ());
799b725ae77Skettenis write_exp_elt_longcst ((LONGEST) val);
800b725ae77Skettenis write_exp_elt_opcode (OP_LONG);
801b725ae77Skettenis }
802b725ae77Skettenis else
803b725ae77Skettenis {
804b725ae77Skettenis const char *end;
805b725ae77Skettenis char *index_name;
806b725ae77Skettenis int index_len;
807b725ae77Skettenis struct symbol *index_sym;
808b725ae77Skettenis
809b725ae77Skettenis end = strchr (suffix, 'X');
810b725ae77Skettenis if (end == NULL)
811b725ae77Skettenis end = suffix + strlen (suffix);
812b725ae77Skettenis
813b725ae77Skettenis index_len = simple_tail - qualification + 2 + (suffix - end) + 1;
814*11efff7fSkettenis index_name
815*11efff7fSkettenis = (char *) obstack_alloc (&temp_parse_space, index_len);
816b725ae77Skettenis memset (index_name, '\000', index_len);
817b725ae77Skettenis strncpy (index_name, qualification, simple_tail - qualification);
818b725ae77Skettenis index_name[simple_tail - qualification] = '\000';
819b725ae77Skettenis strncat (index_name, suffix, suffix-end);
820b725ae77Skettenis suffix = end;
821b725ae77Skettenis
822b725ae77Skettenis index_sym =
823b725ae77Skettenis lookup_symbol (index_name, NULL, VAR_DOMAIN, 0, NULL);
824b725ae77Skettenis if (index_sym == NULL)
825b725ae77Skettenis error ("Could not find %s", index_name);
826b725ae77Skettenis write_var_from_sym (NULL, block_found, sym);
827b725ae77Skettenis }
828b725ae77Skettenis if (slice_state == SIMPLE_INDEX)
829b725ae77Skettenis {
830b725ae77Skettenis write_exp_elt_opcode (OP_FUNCALL);
831b725ae77Skettenis write_exp_elt_longcst ((LONGEST) 1);
832b725ae77Skettenis write_exp_elt_opcode (OP_FUNCALL);
833b725ae77Skettenis }
834b725ae77Skettenis else if (slice_state == LOWER_BOUND)
835b725ae77Skettenis slice_state = UPPER_BOUND;
836b725ae77Skettenis else if (slice_state == UPPER_BOUND)
837b725ae77Skettenis {
838b725ae77Skettenis write_exp_elt_opcode (TERNOP_SLICE);
839b725ae77Skettenis slice_state = SIMPLE_INDEX;
840b725ae77Skettenis }
841b725ae77Skettenis break;
842b725ae77Skettenis
843b725ae77Skettenis case 'R':
844b725ae77Skettenis {
845b725ae77Skettenis struct stoken field_name;
846b725ae77Skettenis const char *end;
847b725ae77Skettenis suffix += 1;
848b725ae77Skettenis
849b725ae77Skettenis if (slice_state != SIMPLE_INDEX)
850b725ae77Skettenis goto BadEncoding;
851b725ae77Skettenis end = strchr (suffix, 'X');
852b725ae77Skettenis if (end == NULL)
853b725ae77Skettenis end = suffix + strlen (suffix);
854b725ae77Skettenis field_name.length = end - suffix;
855*11efff7fSkettenis field_name.ptr = xmalloc (end - suffix + 1);
856b725ae77Skettenis strncpy (field_name.ptr, suffix, end - suffix);
857b725ae77Skettenis field_name.ptr[end - suffix] = '\000';
858b725ae77Skettenis suffix = end;
859b725ae77Skettenis write_exp_elt_opcode (STRUCTOP_STRUCT);
860b725ae77Skettenis write_exp_string (field_name);
861b725ae77Skettenis write_exp_elt_opcode (STRUCTOP_STRUCT);
862b725ae77Skettenis break;
863b725ae77Skettenis }
864b725ae77Skettenis
865b725ae77Skettenis default:
866b725ae77Skettenis goto BadEncoding;
867b725ae77Skettenis }
868b725ae77Skettenis }
869b725ae77Skettenis if (slice_state == SIMPLE_INDEX)
870b725ae77Skettenis return;
871b725ae77Skettenis
872b725ae77Skettenis BadEncoding:
873b725ae77Skettenis error ("Internal error in encoding of renaming declaration: %s",
874*11efff7fSkettenis SYMBOL_LINKAGE_NAME (renaming));
875b725ae77Skettenis }
876b725ae77Skettenis
877b725ae77Skettenis /* Convert the character literal whose ASCII value would be VAL to the
878b725ae77Skettenis appropriate value of type TYPE, if there is a translation.
879b725ae77Skettenis Otherwise return VAL. Hence, in an enumeration type ('A', 'B'),
880b725ae77Skettenis the literal 'A' (VAL == 65), returns 0. */
881b725ae77Skettenis static LONGEST
convert_char_literal(struct type * type,LONGEST val)882b725ae77Skettenis convert_char_literal (struct type *type, LONGEST val)
883b725ae77Skettenis {
884b725ae77Skettenis char name[7];
885b725ae77Skettenis int f;
886b725ae77Skettenis
887b725ae77Skettenis if (type == NULL || TYPE_CODE (type) != TYPE_CODE_ENUM)
888b725ae77Skettenis return val;
889b725ae77Skettenis sprintf (name, "QU%02x", (int) val);
890b725ae77Skettenis for (f = 0; f < TYPE_NFIELDS (type); f += 1)
891b725ae77Skettenis {
892*11efff7fSkettenis if (strcmp (name, TYPE_FIELD_NAME (type, f)) == 0)
893b725ae77Skettenis return TYPE_FIELD_BITPOS (type, f);
894b725ae77Skettenis }
895b725ae77Skettenis return val;
896b725ae77Skettenis }
897*11efff7fSkettenis
898*11efff7fSkettenis static struct type *
type_int(void)899*11efff7fSkettenis type_int (void)
900*11efff7fSkettenis {
901*11efff7fSkettenis return builtin_type (current_gdbarch)->builtin_int;
902*11efff7fSkettenis }
903*11efff7fSkettenis
904*11efff7fSkettenis static struct type *
type_long(void)905*11efff7fSkettenis type_long (void)
906*11efff7fSkettenis {
907*11efff7fSkettenis return builtin_type (current_gdbarch)->builtin_long;
908*11efff7fSkettenis }
909*11efff7fSkettenis
910*11efff7fSkettenis static struct type *
type_long_long(void)911*11efff7fSkettenis type_long_long (void)
912*11efff7fSkettenis {
913*11efff7fSkettenis return builtin_type (current_gdbarch)->builtin_long_long;
914*11efff7fSkettenis }
915*11efff7fSkettenis
916*11efff7fSkettenis static struct type *
type_float(void)917*11efff7fSkettenis type_float (void)
918*11efff7fSkettenis {
919*11efff7fSkettenis return builtin_type (current_gdbarch)->builtin_float;
920*11efff7fSkettenis }
921*11efff7fSkettenis
922*11efff7fSkettenis static struct type *
type_double(void)923*11efff7fSkettenis type_double (void)
924*11efff7fSkettenis {
925*11efff7fSkettenis return builtin_type (current_gdbarch)->builtin_double;
926*11efff7fSkettenis }
927*11efff7fSkettenis
928*11efff7fSkettenis static struct type *
type_long_double(void)929*11efff7fSkettenis type_long_double (void)
930*11efff7fSkettenis {
931*11efff7fSkettenis return builtin_type (current_gdbarch)->builtin_long_double;
932*11efff7fSkettenis }
933*11efff7fSkettenis
934*11efff7fSkettenis static struct type *
type_char(void)935*11efff7fSkettenis type_char (void)
936*11efff7fSkettenis {
937*11efff7fSkettenis return language_string_char_type (current_language, current_gdbarch);
938*11efff7fSkettenis }
939*11efff7fSkettenis
940*11efff7fSkettenis static struct type *
type_system_address(void)941*11efff7fSkettenis type_system_address (void)
942*11efff7fSkettenis {
943*11efff7fSkettenis struct type *type
944*11efff7fSkettenis = language_lookup_primitive_type_by_name (current_language,
945*11efff7fSkettenis current_gdbarch,
946*11efff7fSkettenis "system__address");
947*11efff7fSkettenis return type != NULL ? type : lookup_pointer_type (builtin_type_void);
948*11efff7fSkettenis }
949*11efff7fSkettenis
950*11efff7fSkettenis void
_initialize_ada_exp(void)951*11efff7fSkettenis _initialize_ada_exp (void)
952*11efff7fSkettenis {
953*11efff7fSkettenis obstack_init (&temp_parse_space);
954*11efff7fSkettenis }
955*11efff7fSkettenis
956*11efff7fSkettenis /* FIXME: hilfingr/2004-10-05: Hack to remove warning. The function
957*11efff7fSkettenis string_to_operator is supposed to be used for cases where one
958*11efff7fSkettenis calls an operator function with prefix notation, as in
959*11efff7fSkettenis "+" (a, b), but at some point, this code seems to have gone
960*11efff7fSkettenis missing. */
961*11efff7fSkettenis
962*11efff7fSkettenis struct stoken (*dummy_string_to_ada_operator) (struct stoken)
963*11efff7fSkettenis = string_to_operator;
964*11efff7fSkettenis
965