1b725ae77Skettenis /* Ada language support routines for GDB, the GNU debugger. Copyright
2*11efff7fSkettenis 1992, 1993, 1994, 1997, 1998, 1999, 2000, 2003, 2004.
3b725ae77Skettenis 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
21*11efff7fSkettenis
22*11efff7fSkettenis #include "defs.h"
23b725ae77Skettenis #include <stdio.h>
24b725ae77Skettenis #include "gdb_string.h"
25b725ae77Skettenis #include <ctype.h>
26b725ae77Skettenis #include <stdarg.h>
27b725ae77Skettenis #include "demangle.h"
28*11efff7fSkettenis #include "gdb_regex.h"
29*11efff7fSkettenis #include "frame.h"
30b725ae77Skettenis #include "symtab.h"
31b725ae77Skettenis #include "gdbtypes.h"
32b725ae77Skettenis #include "gdbcmd.h"
33b725ae77Skettenis #include "expression.h"
34b725ae77Skettenis #include "parser-defs.h"
35b725ae77Skettenis #include "language.h"
36b725ae77Skettenis #include "c-lang.h"
37b725ae77Skettenis #include "inferior.h"
38b725ae77Skettenis #include "symfile.h"
39b725ae77Skettenis #include "objfiles.h"
40b725ae77Skettenis #include "breakpoint.h"
41b725ae77Skettenis #include "gdbcore.h"
42*11efff7fSkettenis #include "hashtab.h"
43*11efff7fSkettenis #include "gdb_obstack.h"
44b725ae77Skettenis #include "ada-lang.h"
45*11efff7fSkettenis #include "completer.h"
46*11efff7fSkettenis #include "gdb_stat.h"
47*11efff7fSkettenis #ifdef UI_OUT
48b725ae77Skettenis #include "ui-out.h"
49*11efff7fSkettenis #endif
50b725ae77Skettenis #include "block.h"
51b725ae77Skettenis #include "infcall.h"
52b725ae77Skettenis #include "dictionary.h"
53b725ae77Skettenis
54*11efff7fSkettenis #ifndef ADA_RETAIN_DOTS
55*11efff7fSkettenis #define ADA_RETAIN_DOTS 0
56*11efff7fSkettenis #endif
57b725ae77Skettenis
58*11efff7fSkettenis /* Define whether or not the C operator '/' truncates towards zero for
59*11efff7fSkettenis differently signed operands (truncation direction is undefined in C).
60*11efff7fSkettenis Copied from valarith.c. */
61*11efff7fSkettenis
62*11efff7fSkettenis #ifndef TRUNCATION_TOWARDS_ZERO
63*11efff7fSkettenis #define TRUNCATION_TOWARDS_ZERO ((-5 / 2) == -2)
64*11efff7fSkettenis #endif
65*11efff7fSkettenis
66*11efff7fSkettenis
67*11efff7fSkettenis static void extract_string (CORE_ADDR addr, char *buf);
68b725ae77Skettenis
69b725ae77Skettenis static struct type *ada_create_fundamental_type (struct objfile *, int);
70b725ae77Skettenis
71b725ae77Skettenis static void modify_general_field (char *, LONGEST, int, int);
72b725ae77Skettenis
73b725ae77Skettenis static struct type *desc_base_type (struct type *);
74b725ae77Skettenis
75b725ae77Skettenis static struct type *desc_bounds_type (struct type *);
76b725ae77Skettenis
77b725ae77Skettenis static struct value *desc_bounds (struct value *);
78b725ae77Skettenis
79b725ae77Skettenis static int fat_pntr_bounds_bitpos (struct type *);
80b725ae77Skettenis
81b725ae77Skettenis static int fat_pntr_bounds_bitsize (struct type *);
82b725ae77Skettenis
83b725ae77Skettenis static struct type *desc_data_type (struct type *);
84b725ae77Skettenis
85b725ae77Skettenis static struct value *desc_data (struct value *);
86b725ae77Skettenis
87b725ae77Skettenis static int fat_pntr_data_bitpos (struct type *);
88b725ae77Skettenis
89b725ae77Skettenis static int fat_pntr_data_bitsize (struct type *);
90b725ae77Skettenis
91b725ae77Skettenis static struct value *desc_one_bound (struct value *, int, int);
92b725ae77Skettenis
93b725ae77Skettenis static int desc_bound_bitpos (struct type *, int, int);
94b725ae77Skettenis
95b725ae77Skettenis static int desc_bound_bitsize (struct type *, int, int);
96b725ae77Skettenis
97b725ae77Skettenis static struct type *desc_index_type (struct type *, int);
98b725ae77Skettenis
99b725ae77Skettenis static int desc_arity (struct type *);
100b725ae77Skettenis
101b725ae77Skettenis static int ada_type_match (struct type *, struct type *, int);
102b725ae77Skettenis
103b725ae77Skettenis static int ada_args_match (struct symbol *, struct value **, int);
104b725ae77Skettenis
105*11efff7fSkettenis static struct value *ensure_lval (struct value *, CORE_ADDR *);
106b725ae77Skettenis
107b725ae77Skettenis static struct value *convert_actual (struct value *, struct type *,
108b725ae77Skettenis CORE_ADDR *);
109b725ae77Skettenis
110b725ae77Skettenis static struct value *make_array_descriptor (struct type *, struct value *,
111b725ae77Skettenis CORE_ADDR *);
112b725ae77Skettenis
113*11efff7fSkettenis static void ada_add_block_symbols (struct obstack *,
114*11efff7fSkettenis struct block *, const char *,
115*11efff7fSkettenis domain_enum, struct objfile *,
116*11efff7fSkettenis struct symtab *, int);
117b725ae77Skettenis
118*11efff7fSkettenis static int is_nonfunction (struct ada_symbol_info *, int);
119b725ae77Skettenis
120*11efff7fSkettenis static void add_defn_to_vec (struct obstack *, struct symbol *,
121*11efff7fSkettenis struct block *, struct symtab *);
122b725ae77Skettenis
123*11efff7fSkettenis static int num_defns_collected (struct obstack *);
124*11efff7fSkettenis
125*11efff7fSkettenis static struct ada_symbol_info *defns_collected (struct obstack *, int);
126b725ae77Skettenis
127b725ae77Skettenis static struct partial_symbol *ada_lookup_partial_symbol (struct partial_symtab
128b725ae77Skettenis *, const char *, int,
129b725ae77Skettenis domain_enum, int);
130b725ae77Skettenis
131b725ae77Skettenis static struct symtab *symtab_for_sym (struct symbol *);
132b725ae77Skettenis
133*11efff7fSkettenis static struct value *resolve_subexp (struct expression **, int *, int,
134b725ae77Skettenis struct type *);
135b725ae77Skettenis
136b725ae77Skettenis static void replace_operator_with_call (struct expression **, int, int, int,
137b725ae77Skettenis struct symbol *, struct block *);
138b725ae77Skettenis
139b725ae77Skettenis static int possible_user_operator_p (enum exp_opcode, struct value **);
140b725ae77Skettenis
141*11efff7fSkettenis static char *ada_op_name (enum exp_opcode);
142*11efff7fSkettenis
143*11efff7fSkettenis static const char *ada_decoded_op_name (enum exp_opcode);
144b725ae77Skettenis
145b725ae77Skettenis static int numeric_type_p (struct type *);
146b725ae77Skettenis
147b725ae77Skettenis static int integer_type_p (struct type *);
148b725ae77Skettenis
149b725ae77Skettenis static int scalar_type_p (struct type *);
150b725ae77Skettenis
151b725ae77Skettenis static int discrete_type_p (struct type *);
152b725ae77Skettenis
153*11efff7fSkettenis static struct type *ada_lookup_struct_elt_type (struct type *, char *,
154*11efff7fSkettenis int, int, int *);
155b725ae77Skettenis
156b725ae77Skettenis static struct value *evaluate_subexp (struct type *, struct expression *,
157b725ae77Skettenis int *, enum noside);
158b725ae77Skettenis
159b725ae77Skettenis static struct value *evaluate_subexp_type (struct expression *, int *);
160b725ae77Skettenis
161b725ae77Skettenis static int is_dynamic_field (struct type *, int);
162b725ae77Skettenis
163b725ae77Skettenis static struct type *to_fixed_variant_branch_type (struct type *, char *,
164b725ae77Skettenis CORE_ADDR, struct value *);
165b725ae77Skettenis
166*11efff7fSkettenis static struct type *to_fixed_array_type (struct type *, struct value *, int);
167*11efff7fSkettenis
168b725ae77Skettenis static struct type *to_fixed_range_type (char *, struct value *,
169b725ae77Skettenis struct objfile *);
170b725ae77Skettenis
171b725ae77Skettenis static struct type *to_static_fixed_type (struct type *);
172b725ae77Skettenis
173b725ae77Skettenis static struct value *unwrap_value (struct value *);
174b725ae77Skettenis
175b725ae77Skettenis static struct type *packed_array_type (struct type *, long *);
176b725ae77Skettenis
177b725ae77Skettenis static struct type *decode_packed_array_type (struct type *);
178b725ae77Skettenis
179b725ae77Skettenis static struct value *decode_packed_array (struct value *);
180b725ae77Skettenis
181b725ae77Skettenis static struct value *value_subscript_packed (struct value *, int,
182b725ae77Skettenis struct value **);
183b725ae77Skettenis
184*11efff7fSkettenis static struct value *coerce_unspec_val_to_type (struct value *,
185b725ae77Skettenis struct type *);
186b725ae77Skettenis
187b725ae77Skettenis static struct value *get_var_value (char *, char *);
188b725ae77Skettenis
189b725ae77Skettenis static int lesseq_defined_than (struct symbol *, struct symbol *);
190b725ae77Skettenis
191b725ae77Skettenis static int equiv_types (struct type *, struct type *);
192b725ae77Skettenis
193b725ae77Skettenis static int is_name_suffix (const char *);
194b725ae77Skettenis
195b725ae77Skettenis static int wild_match (const char *, int, const char *);
196b725ae77Skettenis
197b725ae77Skettenis static struct value *ada_coerce_ref (struct value *);
198b725ae77Skettenis
199*11efff7fSkettenis static LONGEST pos_atr (struct value *);
200*11efff7fSkettenis
201b725ae77Skettenis static struct value *value_pos_atr (struct value *);
202b725ae77Skettenis
203b725ae77Skettenis static struct value *value_val_atr (struct type *, struct value *);
204b725ae77Skettenis
205*11efff7fSkettenis static struct symbol *standard_lookup (const char *, const struct block *,
206*11efff7fSkettenis domain_enum);
207b725ae77Skettenis
208*11efff7fSkettenis static struct value *ada_search_struct_field (char *, struct value *, int,
209*11efff7fSkettenis struct type *);
210*11efff7fSkettenis
211*11efff7fSkettenis static struct value *ada_value_primitive_field (struct value *, int, int,
212*11efff7fSkettenis struct type *);
213*11efff7fSkettenis
214*11efff7fSkettenis static int find_struct_field (char *, struct type *, int,
215*11efff7fSkettenis struct type **, int *, int *, int *);
216*11efff7fSkettenis
217*11efff7fSkettenis static struct value *ada_to_fixed_value_create (struct type *, CORE_ADDR,
218*11efff7fSkettenis struct value *);
219*11efff7fSkettenis
220*11efff7fSkettenis static struct value *ada_to_fixed_value (struct value *);
221*11efff7fSkettenis
222*11efff7fSkettenis static int ada_resolve_function (struct ada_symbol_info *, int,
223*11efff7fSkettenis struct value **, int, const char *,
224*11efff7fSkettenis struct type *);
225*11efff7fSkettenis
226*11efff7fSkettenis static struct value *ada_coerce_to_simple_array (struct value *);
227*11efff7fSkettenis
228*11efff7fSkettenis static int ada_is_direct_array_type (struct type *);
229*11efff7fSkettenis
230*11efff7fSkettenis static void ada_language_arch_info (struct gdbarch *,
231*11efff7fSkettenis struct language_arch_info *);
232*11efff7fSkettenis
233*11efff7fSkettenis static void check_size (const struct type *);
234b725ae77Skettenis
235b725ae77Skettenis
236b725ae77Skettenis
237b725ae77Skettenis /* Maximum-sized dynamic type. */
238b725ae77Skettenis static unsigned int varsize_limit;
239b725ae77Skettenis
240*11efff7fSkettenis /* FIXME: brobecker/2003-09-17: No longer a const because it is
241*11efff7fSkettenis returned by a function that does not return a const char *. */
242*11efff7fSkettenis static char *ada_completer_word_break_characters =
243*11efff7fSkettenis #ifdef VMS
244*11efff7fSkettenis " \t\n!@#%^&*()+=|~`}{[]\";:?/,-";
245*11efff7fSkettenis #else
246b725ae77Skettenis " \t\n!@#$%^&*()+=|~`}{[]\";:?/,-";
247*11efff7fSkettenis #endif
248b725ae77Skettenis
249*11efff7fSkettenis /* The name of the symbol to use to get the name of the main subprogram. */
250*11efff7fSkettenis static const char ADA_MAIN_PROGRAM_SYMBOL_NAME[]
251*11efff7fSkettenis = "__gnat_ada_main_program_name";
252*11efff7fSkettenis
253*11efff7fSkettenis /* The name of the runtime function called when an exception is raised. */
254*11efff7fSkettenis static const char raise_sym_name[] = "__gnat_raise_nodefer_with_msg";
255*11efff7fSkettenis
256*11efff7fSkettenis /* The name of the runtime function called when an unhandled exception
257*11efff7fSkettenis is raised. */
258*11efff7fSkettenis static const char raise_unhandled_sym_name[] = "__gnat_unhandled_exception";
259*11efff7fSkettenis
260*11efff7fSkettenis /* The name of the runtime function called when an assert failure is
261*11efff7fSkettenis raised. */
262*11efff7fSkettenis static const char raise_assert_sym_name[] =
263*11efff7fSkettenis "system__assertions__raise_assert_failure";
264*11efff7fSkettenis
265*11efff7fSkettenis /* When GDB stops on an unhandled exception, GDB will go up the stack until
266*11efff7fSkettenis if finds a frame corresponding to this function, in order to extract the
267*11efff7fSkettenis name of the exception that has been raised from one of the parameters. */
268*11efff7fSkettenis static const char process_raise_exception_name[] =
269*11efff7fSkettenis "ada__exceptions__process_raise_exception";
270*11efff7fSkettenis
271*11efff7fSkettenis /* A string that reflects the longest exception expression rewrite,
272*11efff7fSkettenis aside from the exception name. */
273*11efff7fSkettenis static const char longest_exception_template[] =
274*11efff7fSkettenis "'__gnat_raise_nodefer_with_msg' if long_integer(e) = long_integer(&)";
275*11efff7fSkettenis
276*11efff7fSkettenis /* Limit on the number of warnings to raise per expression evaluation. */
277*11efff7fSkettenis static int warning_limit = 2;
278*11efff7fSkettenis
279*11efff7fSkettenis /* Number of warning messages issued; reset to 0 by cleanups after
280*11efff7fSkettenis expression evaluation. */
281*11efff7fSkettenis static int warnings_issued = 0;
282*11efff7fSkettenis
283*11efff7fSkettenis static const char *known_runtime_file_name_patterns[] = {
284*11efff7fSkettenis ADA_KNOWN_RUNTIME_FILE_NAME_PATTERNS NULL
285*11efff7fSkettenis };
286*11efff7fSkettenis
287*11efff7fSkettenis static const char *known_auxiliary_function_name_patterns[] = {
288*11efff7fSkettenis ADA_KNOWN_AUXILIARY_FUNCTION_NAME_PATTERNS NULL
289*11efff7fSkettenis };
290*11efff7fSkettenis
291*11efff7fSkettenis /* Space for allocating results of ada_lookup_symbol_list. */
292*11efff7fSkettenis static struct obstack symbol_list_obstack;
293b725ae77Skettenis
294b725ae77Skettenis /* Utilities */
295b725ae77Skettenis
296*11efff7fSkettenis
297*11efff7fSkettenis static char *
ada_get_gdb_completer_word_break_characters(void)298*11efff7fSkettenis ada_get_gdb_completer_word_break_characters (void)
299*11efff7fSkettenis {
300*11efff7fSkettenis return ada_completer_word_break_characters;
301*11efff7fSkettenis }
302*11efff7fSkettenis
303*11efff7fSkettenis /* Read the string located at ADDR from the inferior and store the
304*11efff7fSkettenis result into BUF. */
305*11efff7fSkettenis
306*11efff7fSkettenis static void
extract_string(CORE_ADDR addr,char * buf)307b725ae77Skettenis extract_string (CORE_ADDR addr, char *buf)
308b725ae77Skettenis {
309b725ae77Skettenis int char_index = 0;
310b725ae77Skettenis
311b725ae77Skettenis /* Loop, reading one byte at a time, until we reach the '\000'
312*11efff7fSkettenis end-of-string marker. */
313b725ae77Skettenis do
314b725ae77Skettenis {
315b725ae77Skettenis target_read_memory (addr + char_index * sizeof (char),
316b725ae77Skettenis buf + char_index * sizeof (char), sizeof (char));
317b725ae77Skettenis char_index++;
318b725ae77Skettenis }
319b725ae77Skettenis while (buf[char_index - 1] != '\000');
320b725ae77Skettenis }
321b725ae77Skettenis
322b725ae77Skettenis /* Assuming *OLD_VECT points to an array of *SIZE objects of size
323b725ae77Skettenis ELEMENT_SIZE, grow it to contain at least MIN_SIZE objects,
324b725ae77Skettenis updating *OLD_VECT and *SIZE as necessary. */
325b725ae77Skettenis
326b725ae77Skettenis void
grow_vect(void ** old_vect,size_t * size,size_t min_size,int element_size)327b725ae77Skettenis grow_vect (void **old_vect, size_t * size, size_t min_size, int element_size)
328b725ae77Skettenis {
329b725ae77Skettenis if (*size < min_size)
330b725ae77Skettenis {
331b725ae77Skettenis *size *= 2;
332b725ae77Skettenis if (*size < min_size)
333b725ae77Skettenis *size = min_size;
334b725ae77Skettenis *old_vect = xrealloc (*old_vect, *size * element_size);
335b725ae77Skettenis }
336b725ae77Skettenis }
337b725ae77Skettenis
338b725ae77Skettenis /* True (non-zero) iff TARGET matches FIELD_NAME up to any trailing
339*11efff7fSkettenis suffix of FIELD_NAME beginning "___". */
340b725ae77Skettenis
341b725ae77Skettenis static int
field_name_match(const char * field_name,const char * target)342b725ae77Skettenis field_name_match (const char *field_name, const char *target)
343b725ae77Skettenis {
344b725ae77Skettenis int len = strlen (target);
345b725ae77Skettenis return
346*11efff7fSkettenis (strncmp (field_name, target, len) == 0
347b725ae77Skettenis && (field_name[len] == '\0'
348*11efff7fSkettenis || (strncmp (field_name + len, "___", 3) == 0
349*11efff7fSkettenis && strcmp (field_name + strlen (field_name) - 6,
350*11efff7fSkettenis "___XVN") != 0)));
351b725ae77Skettenis }
352b725ae77Skettenis
353b725ae77Skettenis
354*11efff7fSkettenis /* Assuming TYPE is a TYPE_CODE_STRUCT, find the field whose name matches
355*11efff7fSkettenis FIELD_NAME, and return its index. This function also handles fields
356*11efff7fSkettenis whose name have ___ suffixes because the compiler sometimes alters
357*11efff7fSkettenis their name by adding such a suffix to represent fields with certain
358*11efff7fSkettenis constraints. If the field could not be found, return a negative
359*11efff7fSkettenis number if MAYBE_MISSING is set. Otherwise raise an error. */
360*11efff7fSkettenis
361*11efff7fSkettenis int
ada_get_field_index(const struct type * type,const char * field_name,int maybe_missing)362*11efff7fSkettenis ada_get_field_index (const struct type *type, const char *field_name,
363*11efff7fSkettenis int maybe_missing)
364*11efff7fSkettenis {
365*11efff7fSkettenis int fieldno;
366*11efff7fSkettenis for (fieldno = 0; fieldno < TYPE_NFIELDS (type); fieldno++)
367*11efff7fSkettenis if (field_name_match (TYPE_FIELD_NAME (type, fieldno), field_name))
368*11efff7fSkettenis return fieldno;
369*11efff7fSkettenis
370*11efff7fSkettenis if (!maybe_missing)
371*11efff7fSkettenis error ("Unable to find field %s in struct %s. Aborting",
372*11efff7fSkettenis field_name, TYPE_NAME (type));
373*11efff7fSkettenis
374*11efff7fSkettenis return -1;
375*11efff7fSkettenis }
376*11efff7fSkettenis
377b725ae77Skettenis /* The length of the prefix of NAME prior to any "___" suffix. */
378b725ae77Skettenis
379b725ae77Skettenis int
ada_name_prefix_len(const char * name)380b725ae77Skettenis ada_name_prefix_len (const char *name)
381b725ae77Skettenis {
382b725ae77Skettenis if (name == NULL)
383b725ae77Skettenis return 0;
384b725ae77Skettenis else
385b725ae77Skettenis {
386b725ae77Skettenis const char *p = strstr (name, "___");
387b725ae77Skettenis if (p == NULL)
388b725ae77Skettenis return strlen (name);
389b725ae77Skettenis else
390b725ae77Skettenis return p - name;
391b725ae77Skettenis }
392b725ae77Skettenis }
393b725ae77Skettenis
394*11efff7fSkettenis /* Return non-zero if SUFFIX is a suffix of STR.
395*11efff7fSkettenis Return zero if STR is null. */
396*11efff7fSkettenis
397b725ae77Skettenis static int
is_suffix(const char * str,const char * suffix)398b725ae77Skettenis is_suffix (const char *str, const char *suffix)
399b725ae77Skettenis {
400b725ae77Skettenis int len1, len2;
401b725ae77Skettenis if (str == NULL)
402b725ae77Skettenis return 0;
403b725ae77Skettenis len1 = strlen (str);
404b725ae77Skettenis len2 = strlen (suffix);
405*11efff7fSkettenis return (len1 >= len2 && strcmp (str + len1 - len2, suffix) == 0);
406b725ae77Skettenis }
407b725ae77Skettenis
408b725ae77Skettenis /* Create a value of type TYPE whose contents come from VALADDR, if it
409*11efff7fSkettenis is non-null, and whose memory address (in the inferior) is
410*11efff7fSkettenis ADDRESS. */
411*11efff7fSkettenis
412b725ae77Skettenis struct value *
value_from_contents_and_address(struct type * type,char * valaddr,CORE_ADDR address)413b725ae77Skettenis value_from_contents_and_address (struct type *type, char *valaddr,
414b725ae77Skettenis CORE_ADDR address)
415b725ae77Skettenis {
416b725ae77Skettenis struct value *v = allocate_value (type);
417b725ae77Skettenis if (valaddr == NULL)
418b725ae77Skettenis VALUE_LAZY (v) = 1;
419b725ae77Skettenis else
420b725ae77Skettenis memcpy (VALUE_CONTENTS_RAW (v), valaddr, TYPE_LENGTH (type));
421b725ae77Skettenis VALUE_ADDRESS (v) = address;
422b725ae77Skettenis if (address != 0)
423b725ae77Skettenis VALUE_LVAL (v) = lval_memory;
424b725ae77Skettenis return v;
425b725ae77Skettenis }
426b725ae77Skettenis
427*11efff7fSkettenis /* The contents of value VAL, treated as a value of type TYPE. The
428*11efff7fSkettenis result is an lval in memory if VAL is. */
429b725ae77Skettenis
430b725ae77Skettenis static struct value *
coerce_unspec_val_to_type(struct value * val,struct type * type)431*11efff7fSkettenis coerce_unspec_val_to_type (struct value *val, struct type *type)
432b725ae77Skettenis {
433*11efff7fSkettenis type = ada_check_typedef (type);
434*11efff7fSkettenis if (VALUE_TYPE (val) == type)
435*11efff7fSkettenis return val;
436b725ae77Skettenis else
437b725ae77Skettenis {
438*11efff7fSkettenis struct value *result;
439*11efff7fSkettenis
440*11efff7fSkettenis /* Make sure that the object size is not unreasonable before
441*11efff7fSkettenis trying to allocate some memory for it. */
442*11efff7fSkettenis check_size (type);
443*11efff7fSkettenis
444*11efff7fSkettenis result = allocate_value (type);
445*11efff7fSkettenis VALUE_LVAL (result) = VALUE_LVAL (val);
446*11efff7fSkettenis VALUE_BITSIZE (result) = VALUE_BITSIZE (val);
447*11efff7fSkettenis VALUE_BITPOS (result) = VALUE_BITPOS (val);
448*11efff7fSkettenis VALUE_ADDRESS (result) = VALUE_ADDRESS (val) + VALUE_OFFSET (val);
449*11efff7fSkettenis if (VALUE_LAZY (val)
450*11efff7fSkettenis || TYPE_LENGTH (type) > TYPE_LENGTH (VALUE_TYPE (val)))
451b725ae77Skettenis VALUE_LAZY (result) = 1;
452*11efff7fSkettenis else
453*11efff7fSkettenis memcpy (VALUE_CONTENTS_RAW (result), VALUE_CONTENTS (val),
454*11efff7fSkettenis TYPE_LENGTH (type));
455b725ae77Skettenis return result;
456b725ae77Skettenis }
457b725ae77Skettenis }
458b725ae77Skettenis
459b725ae77Skettenis static char *
cond_offset_host(char * valaddr,long offset)460b725ae77Skettenis cond_offset_host (char *valaddr, long offset)
461b725ae77Skettenis {
462b725ae77Skettenis if (valaddr == NULL)
463b725ae77Skettenis return NULL;
464b725ae77Skettenis else
465b725ae77Skettenis return valaddr + offset;
466b725ae77Skettenis }
467b725ae77Skettenis
468b725ae77Skettenis static CORE_ADDR
cond_offset_target(CORE_ADDR address,long offset)469b725ae77Skettenis cond_offset_target (CORE_ADDR address, long offset)
470b725ae77Skettenis {
471b725ae77Skettenis if (address == 0)
472b725ae77Skettenis return 0;
473b725ae77Skettenis else
474b725ae77Skettenis return address + offset;
475b725ae77Skettenis }
476b725ae77Skettenis
477*11efff7fSkettenis /* Issue a warning (as for the definition of warning in utils.c, but
478*11efff7fSkettenis with exactly one argument rather than ...), unless the limit on the
479*11efff7fSkettenis number of warnings has passed during the evaluation of the current
480*11efff7fSkettenis expression. */
481b725ae77Skettenis
482*11efff7fSkettenis /* FIXME: cagney/2004-10-10: This function is mimicking the behavior
483*11efff7fSkettenis provided by "complaint". */
484*11efff7fSkettenis static void lim_warning (const char *format, ...) ATTR_FORMAT (printf, 1, 2);
485*11efff7fSkettenis
486*11efff7fSkettenis static void
lim_warning(const char * format,...)487*11efff7fSkettenis lim_warning (const char *format, ...)
488b725ae77Skettenis {
489*11efff7fSkettenis va_list args;
490*11efff7fSkettenis va_start (args, format);
491*11efff7fSkettenis
492*11efff7fSkettenis warnings_issued += 1;
493*11efff7fSkettenis if (warnings_issued <= warning_limit)
494*11efff7fSkettenis vwarning (format, args);
495*11efff7fSkettenis
496*11efff7fSkettenis va_end (args);
497b725ae77Skettenis }
498*11efff7fSkettenis
499*11efff7fSkettenis /* Issue an error if the size of an object of type T is unreasonable,
500*11efff7fSkettenis i.e. if it would be a bad idea to allocate a value of this type in
501*11efff7fSkettenis GDB. */
502*11efff7fSkettenis
503*11efff7fSkettenis static void
check_size(const struct type * type)504*11efff7fSkettenis check_size (const struct type *type)
505*11efff7fSkettenis {
506*11efff7fSkettenis if (TYPE_LENGTH (type) > varsize_limit)
507*11efff7fSkettenis error ("object size is larger than varsize-limit");
508*11efff7fSkettenis }
509*11efff7fSkettenis
510*11efff7fSkettenis
511*11efff7fSkettenis /* Note: would have used MAX_OF_TYPE and MIN_OF_TYPE macros from
512*11efff7fSkettenis gdbtypes.h, but some of the necessary definitions in that file
513*11efff7fSkettenis seem to have gone missing. */
514*11efff7fSkettenis
515*11efff7fSkettenis /* Maximum value of a SIZE-byte signed integer type. */
516*11efff7fSkettenis static LONGEST
max_of_size(int size)517*11efff7fSkettenis max_of_size (int size)
518*11efff7fSkettenis {
519*11efff7fSkettenis LONGEST top_bit = (LONGEST) 1 << (size * 8 - 2);
520*11efff7fSkettenis return top_bit | (top_bit - 1);
521*11efff7fSkettenis }
522*11efff7fSkettenis
523*11efff7fSkettenis /* Minimum value of a SIZE-byte signed integer type. */
524*11efff7fSkettenis static LONGEST
min_of_size(int size)525*11efff7fSkettenis min_of_size (int size)
526*11efff7fSkettenis {
527*11efff7fSkettenis return -max_of_size (size) - 1;
528*11efff7fSkettenis }
529*11efff7fSkettenis
530*11efff7fSkettenis /* Maximum value of a SIZE-byte unsigned integer type. */
531*11efff7fSkettenis static ULONGEST
umax_of_size(int size)532*11efff7fSkettenis umax_of_size (int size)
533*11efff7fSkettenis {
534*11efff7fSkettenis ULONGEST top_bit = (ULONGEST) 1 << (size * 8 - 1);
535*11efff7fSkettenis return top_bit | (top_bit - 1);
536*11efff7fSkettenis }
537*11efff7fSkettenis
538*11efff7fSkettenis /* Maximum value of integral type T, as a signed quantity. */
539*11efff7fSkettenis static LONGEST
max_of_type(struct type * t)540*11efff7fSkettenis max_of_type (struct type *t)
541*11efff7fSkettenis {
542*11efff7fSkettenis if (TYPE_UNSIGNED (t))
543*11efff7fSkettenis return (LONGEST) umax_of_size (TYPE_LENGTH (t));
544*11efff7fSkettenis else
545*11efff7fSkettenis return max_of_size (TYPE_LENGTH (t));
546*11efff7fSkettenis }
547*11efff7fSkettenis
548*11efff7fSkettenis /* Minimum value of integral type T, as a signed quantity. */
549*11efff7fSkettenis static LONGEST
min_of_type(struct type * t)550*11efff7fSkettenis min_of_type (struct type *t)
551*11efff7fSkettenis {
552*11efff7fSkettenis if (TYPE_UNSIGNED (t))
553*11efff7fSkettenis return 0;
554*11efff7fSkettenis else
555*11efff7fSkettenis return min_of_size (TYPE_LENGTH (t));
556*11efff7fSkettenis }
557*11efff7fSkettenis
558*11efff7fSkettenis /* The largest value in the domain of TYPE, a discrete type, as an integer. */
559*11efff7fSkettenis static struct value *
discrete_type_high_bound(struct type * type)560*11efff7fSkettenis discrete_type_high_bound (struct type *type)
561*11efff7fSkettenis {
562*11efff7fSkettenis switch (TYPE_CODE (type))
563*11efff7fSkettenis {
564*11efff7fSkettenis case TYPE_CODE_RANGE:
565*11efff7fSkettenis return value_from_longest (TYPE_TARGET_TYPE (type),
566*11efff7fSkettenis TYPE_HIGH_BOUND (type));
567*11efff7fSkettenis case TYPE_CODE_ENUM:
568*11efff7fSkettenis return
569*11efff7fSkettenis value_from_longest (type,
570*11efff7fSkettenis TYPE_FIELD_BITPOS (type,
571*11efff7fSkettenis TYPE_NFIELDS (type) - 1));
572*11efff7fSkettenis case TYPE_CODE_INT:
573*11efff7fSkettenis return value_from_longest (type, max_of_type (type));
574*11efff7fSkettenis default:
575*11efff7fSkettenis error ("Unexpected type in discrete_type_high_bound.");
576*11efff7fSkettenis }
577*11efff7fSkettenis }
578*11efff7fSkettenis
579*11efff7fSkettenis /* The largest value in the domain of TYPE, a discrete type, as an integer. */
580*11efff7fSkettenis static struct value *
discrete_type_low_bound(struct type * type)581*11efff7fSkettenis discrete_type_low_bound (struct type *type)
582*11efff7fSkettenis {
583*11efff7fSkettenis switch (TYPE_CODE (type))
584*11efff7fSkettenis {
585*11efff7fSkettenis case TYPE_CODE_RANGE:
586*11efff7fSkettenis return value_from_longest (TYPE_TARGET_TYPE (type),
587*11efff7fSkettenis TYPE_LOW_BOUND (type));
588*11efff7fSkettenis case TYPE_CODE_ENUM:
589*11efff7fSkettenis return value_from_longest (type, TYPE_FIELD_BITPOS (type, 0));
590*11efff7fSkettenis case TYPE_CODE_INT:
591*11efff7fSkettenis return value_from_longest (type, min_of_type (type));
592*11efff7fSkettenis default:
593*11efff7fSkettenis error ("Unexpected type in discrete_type_low_bound.");
594*11efff7fSkettenis }
595*11efff7fSkettenis }
596*11efff7fSkettenis
597*11efff7fSkettenis /* The identity on non-range types. For range types, the underlying
598*11efff7fSkettenis non-range scalar type. */
599*11efff7fSkettenis
600*11efff7fSkettenis static struct type *
base_type(struct type * type)601*11efff7fSkettenis base_type (struct type *type)
602*11efff7fSkettenis {
603*11efff7fSkettenis while (type != NULL && TYPE_CODE (type) == TYPE_CODE_RANGE)
604*11efff7fSkettenis {
605*11efff7fSkettenis if (type == TYPE_TARGET_TYPE (type) || TYPE_TARGET_TYPE (type) == NULL)
606*11efff7fSkettenis return type;
607*11efff7fSkettenis type = TYPE_TARGET_TYPE (type);
608*11efff7fSkettenis }
609*11efff7fSkettenis return type;
610b725ae77Skettenis }
611b725ae77Skettenis
612b725ae77Skettenis
613b725ae77Skettenis /* Language Selection */
614b725ae77Skettenis
615b725ae77Skettenis /* If the main program is in Ada, return language_ada, otherwise return LANG
616b725ae77Skettenis (the main program is in Ada iif the adainit symbol is found).
617b725ae77Skettenis
618b725ae77Skettenis MAIN_PST is not used. */
619b725ae77Skettenis
620b725ae77Skettenis enum language
ada_update_initial_language(enum language lang,struct partial_symtab * main_pst)621b725ae77Skettenis ada_update_initial_language (enum language lang,
622b725ae77Skettenis struct partial_symtab *main_pst)
623b725ae77Skettenis {
624b725ae77Skettenis if (lookup_minimal_symbol ("adainit", (const char *) NULL,
625b725ae77Skettenis (struct objfile *) NULL) != NULL)
626*11efff7fSkettenis return language_ada;
627b725ae77Skettenis
628b725ae77Skettenis return lang;
629b725ae77Skettenis }
630b725ae77Skettenis
631*11efff7fSkettenis /* If the main procedure is written in Ada, then return its name.
632*11efff7fSkettenis The result is good until the next call. Return NULL if the main
633*11efff7fSkettenis procedure doesn't appear to be in Ada. */
634*11efff7fSkettenis
635*11efff7fSkettenis char *
ada_main_name(void)636*11efff7fSkettenis ada_main_name (void)
637*11efff7fSkettenis {
638*11efff7fSkettenis struct minimal_symbol *msym;
639*11efff7fSkettenis CORE_ADDR main_program_name_addr;
640*11efff7fSkettenis static char main_program_name[1024];
641*11efff7fSkettenis
642*11efff7fSkettenis /* For Ada, the name of the main procedure is stored in a specific
643*11efff7fSkettenis string constant, generated by the binder. Look for that symbol,
644*11efff7fSkettenis extract its address, and then read that string. If we didn't find
645*11efff7fSkettenis that string, then most probably the main procedure is not written
646*11efff7fSkettenis in Ada. */
647*11efff7fSkettenis msym = lookup_minimal_symbol (ADA_MAIN_PROGRAM_SYMBOL_NAME, NULL, NULL);
648*11efff7fSkettenis
649*11efff7fSkettenis if (msym != NULL)
650*11efff7fSkettenis {
651*11efff7fSkettenis main_program_name_addr = SYMBOL_VALUE_ADDRESS (msym);
652*11efff7fSkettenis if (main_program_name_addr == 0)
653*11efff7fSkettenis error ("Invalid address for Ada main program name.");
654*11efff7fSkettenis
655*11efff7fSkettenis extract_string (main_program_name_addr, main_program_name);
656*11efff7fSkettenis return main_program_name;
657*11efff7fSkettenis }
658*11efff7fSkettenis
659*11efff7fSkettenis /* The main procedure doesn't seem to be in Ada. */
660*11efff7fSkettenis return NULL;
661*11efff7fSkettenis }
662*11efff7fSkettenis
663b725ae77Skettenis /* Symbols */
664b725ae77Skettenis
665*11efff7fSkettenis /* Table of Ada operators and their GNAT-encoded names. Last entry is pair
666b725ae77Skettenis of NULLs. */
667b725ae77Skettenis
668b725ae77Skettenis const struct ada_opname_map ada_opname_table[] = {
669b725ae77Skettenis {"Oadd", "\"+\"", BINOP_ADD},
670b725ae77Skettenis {"Osubtract", "\"-\"", BINOP_SUB},
671b725ae77Skettenis {"Omultiply", "\"*\"", BINOP_MUL},
672b725ae77Skettenis {"Odivide", "\"/\"", BINOP_DIV},
673b725ae77Skettenis {"Omod", "\"mod\"", BINOP_MOD},
674b725ae77Skettenis {"Orem", "\"rem\"", BINOP_REM},
675b725ae77Skettenis {"Oexpon", "\"**\"", BINOP_EXP},
676b725ae77Skettenis {"Olt", "\"<\"", BINOP_LESS},
677b725ae77Skettenis {"Ole", "\"<=\"", BINOP_LEQ},
678b725ae77Skettenis {"Ogt", "\">\"", BINOP_GTR},
679b725ae77Skettenis {"Oge", "\">=\"", BINOP_GEQ},
680b725ae77Skettenis {"Oeq", "\"=\"", BINOP_EQUAL},
681b725ae77Skettenis {"One", "\"/=\"", BINOP_NOTEQUAL},
682b725ae77Skettenis {"Oand", "\"and\"", BINOP_BITWISE_AND},
683b725ae77Skettenis {"Oor", "\"or\"", BINOP_BITWISE_IOR},
684b725ae77Skettenis {"Oxor", "\"xor\"", BINOP_BITWISE_XOR},
685b725ae77Skettenis {"Oconcat", "\"&\"", BINOP_CONCAT},
686b725ae77Skettenis {"Oabs", "\"abs\"", UNOP_ABS},
687b725ae77Skettenis {"Onot", "\"not\"", UNOP_LOGICAL_NOT},
688b725ae77Skettenis {"Oadd", "\"+\"", UNOP_PLUS},
689b725ae77Skettenis {"Osubtract", "\"-\"", UNOP_NEG},
690b725ae77Skettenis {NULL, NULL}
691b725ae77Skettenis };
692b725ae77Skettenis
693*11efff7fSkettenis /* Return non-zero if STR should be suppressed in info listings. */
694*11efff7fSkettenis
695b725ae77Skettenis static int
is_suppressed_name(const char * str)696b725ae77Skettenis is_suppressed_name (const char *str)
697b725ae77Skettenis {
698*11efff7fSkettenis if (strncmp (str, "_ada_", 5) == 0)
699b725ae77Skettenis str += 5;
700b725ae77Skettenis if (str[0] == '_' || str[0] == '\000')
701b725ae77Skettenis return 1;
702b725ae77Skettenis else
703b725ae77Skettenis {
704b725ae77Skettenis const char *p;
705b725ae77Skettenis const char *suffix = strstr (str, "___");
706b725ae77Skettenis if (suffix != NULL && suffix[3] != 'X')
707b725ae77Skettenis return 1;
708b725ae77Skettenis if (suffix == NULL)
709b725ae77Skettenis suffix = str + strlen (str);
710b725ae77Skettenis for (p = suffix - 1; p != str; p -= 1)
711b725ae77Skettenis if (isupper (*p))
712b725ae77Skettenis {
713b725ae77Skettenis int i;
714b725ae77Skettenis if (p[0] == 'X' && p[-1] != '_')
715b725ae77Skettenis goto OK;
716b725ae77Skettenis if (*p != 'O')
717b725ae77Skettenis return 1;
718*11efff7fSkettenis for (i = 0; ada_opname_table[i].encoded != NULL; i += 1)
719*11efff7fSkettenis if (strncmp (ada_opname_table[i].encoded, p,
720*11efff7fSkettenis strlen (ada_opname_table[i].encoded)) == 0)
721b725ae77Skettenis goto OK;
722b725ae77Skettenis return 1;
723b725ae77Skettenis OK:;
724b725ae77Skettenis }
725b725ae77Skettenis return 0;
726b725ae77Skettenis }
727b725ae77Skettenis }
728b725ae77Skettenis
729*11efff7fSkettenis /* The "encoded" form of DECODED, according to GNAT conventions.
730*11efff7fSkettenis The result is valid until the next call to ada_encode. */
731*11efff7fSkettenis
732b725ae77Skettenis char *
ada_encode(const char * decoded)733*11efff7fSkettenis ada_encode (const char *decoded)
734b725ae77Skettenis {
735*11efff7fSkettenis static char *encoding_buffer = NULL;
736*11efff7fSkettenis static size_t encoding_buffer_size = 0;
737b725ae77Skettenis const char *p;
738b725ae77Skettenis int k;
739b725ae77Skettenis
740*11efff7fSkettenis if (decoded == NULL)
741b725ae77Skettenis return NULL;
742b725ae77Skettenis
743*11efff7fSkettenis GROW_VECT (encoding_buffer, encoding_buffer_size,
744*11efff7fSkettenis 2 * strlen (decoded) + 10);
745b725ae77Skettenis
746b725ae77Skettenis k = 0;
747*11efff7fSkettenis for (p = decoded; *p != '\0'; p += 1)
748b725ae77Skettenis {
749*11efff7fSkettenis if (!ADA_RETAIN_DOTS && *p == '.')
750b725ae77Skettenis {
751*11efff7fSkettenis encoding_buffer[k] = encoding_buffer[k + 1] = '_';
752b725ae77Skettenis k += 2;
753b725ae77Skettenis }
754b725ae77Skettenis else if (*p == '"')
755b725ae77Skettenis {
756b725ae77Skettenis const struct ada_opname_map *mapping;
757b725ae77Skettenis
758b725ae77Skettenis for (mapping = ada_opname_table;
759*11efff7fSkettenis mapping->encoded != NULL
760*11efff7fSkettenis && strncmp (mapping->decoded, p,
761*11efff7fSkettenis strlen (mapping->decoded)) != 0; mapping += 1)
762b725ae77Skettenis ;
763*11efff7fSkettenis if (mapping->encoded == NULL)
764b725ae77Skettenis error ("invalid Ada operator name: %s", p);
765*11efff7fSkettenis strcpy (encoding_buffer + k, mapping->encoded);
766*11efff7fSkettenis k += strlen (mapping->encoded);
767b725ae77Skettenis break;
768b725ae77Skettenis }
769b725ae77Skettenis else
770b725ae77Skettenis {
771*11efff7fSkettenis encoding_buffer[k] = *p;
772b725ae77Skettenis k += 1;
773b725ae77Skettenis }
774b725ae77Skettenis }
775b725ae77Skettenis
776*11efff7fSkettenis encoding_buffer[k] = '\0';
777*11efff7fSkettenis return encoding_buffer;
778b725ae77Skettenis }
779b725ae77Skettenis
780b725ae77Skettenis /* Return NAME folded to lower case, or, if surrounded by single
781*11efff7fSkettenis quotes, unfolded, but with the quotes stripped away. Result good
782*11efff7fSkettenis to next call. */
783*11efff7fSkettenis
784b725ae77Skettenis char *
ada_fold_name(const char * name)785b725ae77Skettenis ada_fold_name (const char *name)
786b725ae77Skettenis {
787b725ae77Skettenis static char *fold_buffer = NULL;
788b725ae77Skettenis static size_t fold_buffer_size = 0;
789b725ae77Skettenis
790b725ae77Skettenis int len = strlen (name);
791b725ae77Skettenis GROW_VECT (fold_buffer, fold_buffer_size, len + 1);
792b725ae77Skettenis
793b725ae77Skettenis if (name[0] == '\'')
794b725ae77Skettenis {
795b725ae77Skettenis strncpy (fold_buffer, name + 1, len - 2);
796b725ae77Skettenis fold_buffer[len - 2] = '\000';
797b725ae77Skettenis }
798b725ae77Skettenis else
799b725ae77Skettenis {
800b725ae77Skettenis int i;
801b725ae77Skettenis for (i = 0; i <= len; i += 1)
802b725ae77Skettenis fold_buffer[i] = tolower (name[i]);
803b725ae77Skettenis }
804b725ae77Skettenis
805b725ae77Skettenis return fold_buffer;
806b725ae77Skettenis }
807b725ae77Skettenis
808*11efff7fSkettenis /* decode:
809*11efff7fSkettenis 0. Discard trailing .{DIGIT}+ or trailing ___{DIGIT}+
810*11efff7fSkettenis These are suffixes introduced by GNAT5 to nested subprogram
811*11efff7fSkettenis names, and do not serve any purpose for the debugger.
812*11efff7fSkettenis 1. Discard final __{DIGIT}+ or $({DIGIT}+(__{DIGIT}+)*)
813b725ae77Skettenis 2. Convert other instances of embedded "__" to `.'.
814b725ae77Skettenis 3. Discard leading _ada_.
815b725ae77Skettenis 4. Convert operator names to the appropriate quoted symbols.
816b725ae77Skettenis 5. Remove everything after first ___ if it is followed by
817b725ae77Skettenis 'X'.
818b725ae77Skettenis 6. Replace TK__ with __, and a trailing B or TKB with nothing.
819b725ae77Skettenis 7. Put symbols that should be suppressed in <...> brackets.
820b725ae77Skettenis 8. Remove trailing X[bn]* suffix (indicating names in package bodies).
821b725ae77Skettenis
822*11efff7fSkettenis The resulting string is valid until the next call of ada_decode.
823*11efff7fSkettenis If the string is unchanged by demangling, the original string pointer
824*11efff7fSkettenis is returned. */
825*11efff7fSkettenis
826*11efff7fSkettenis const char *
ada_decode(const char * encoded)827*11efff7fSkettenis ada_decode (const char *encoded)
828b725ae77Skettenis {
829b725ae77Skettenis int i, j;
830b725ae77Skettenis int len0;
831b725ae77Skettenis const char *p;
832*11efff7fSkettenis char *decoded;
833b725ae77Skettenis int at_start_name;
834*11efff7fSkettenis static char *decoding_buffer = NULL;
835*11efff7fSkettenis static size_t decoding_buffer_size = 0;
836b725ae77Skettenis
837*11efff7fSkettenis if (strncmp (encoded, "_ada_", 5) == 0)
838*11efff7fSkettenis encoded += 5;
839b725ae77Skettenis
840*11efff7fSkettenis if (encoded[0] == '_' || encoded[0] == '<')
841b725ae77Skettenis goto Suppress;
842b725ae77Skettenis
843*11efff7fSkettenis /* Remove trailing .{DIGIT}+ or ___{DIGIT}+. */
844*11efff7fSkettenis len0 = strlen (encoded);
845*11efff7fSkettenis if (len0 > 1 && isdigit (encoded[len0 - 1]))
846*11efff7fSkettenis {
847*11efff7fSkettenis i = len0 - 2;
848*11efff7fSkettenis while (i > 0 && isdigit (encoded[i]))
849*11efff7fSkettenis i--;
850*11efff7fSkettenis if (i >= 0 && encoded[i] == '.')
851*11efff7fSkettenis len0 = i;
852*11efff7fSkettenis else if (i >= 2 && strncmp (encoded + i - 2, "___", 3) == 0)
853*11efff7fSkettenis len0 = i - 2;
854*11efff7fSkettenis }
855*11efff7fSkettenis
856*11efff7fSkettenis /* Remove the ___X.* suffix if present. Do not forget to verify that
857*11efff7fSkettenis the suffix is located before the current "end" of ENCODED. We want
858*11efff7fSkettenis to avoid re-matching parts of ENCODED that have previously been
859*11efff7fSkettenis marked as discarded (by decrementing LEN0). */
860*11efff7fSkettenis p = strstr (encoded, "___");
861*11efff7fSkettenis if (p != NULL && p - encoded < len0 - 3)
862b725ae77Skettenis {
863b725ae77Skettenis if (p[3] == 'X')
864*11efff7fSkettenis len0 = p - encoded;
865b725ae77Skettenis else
866b725ae77Skettenis goto Suppress;
867b725ae77Skettenis }
868*11efff7fSkettenis
869*11efff7fSkettenis if (len0 > 3 && strncmp (encoded + len0 - 3, "TKB", 3) == 0)
870b725ae77Skettenis len0 -= 3;
871*11efff7fSkettenis
872*11efff7fSkettenis if (len0 > 1 && strncmp (encoded + len0 - 1, "B", 1) == 0)
873b725ae77Skettenis len0 -= 1;
874b725ae77Skettenis
875*11efff7fSkettenis /* Make decoded big enough for possible expansion by operator name. */
876*11efff7fSkettenis GROW_VECT (decoding_buffer, decoding_buffer_size, 2 * len0 + 1);
877*11efff7fSkettenis decoded = decoding_buffer;
878b725ae77Skettenis
879*11efff7fSkettenis if (len0 > 1 && isdigit (encoded[len0 - 1]))
880b725ae77Skettenis {
881*11efff7fSkettenis i = len0 - 2;
882*11efff7fSkettenis while ((i >= 0 && isdigit (encoded[i]))
883*11efff7fSkettenis || (i >= 1 && encoded[i] == '_' && isdigit (encoded[i - 1])))
884*11efff7fSkettenis i -= 1;
885*11efff7fSkettenis if (i > 1 && encoded[i] == '_' && encoded[i - 1] == '_')
886b725ae77Skettenis len0 = i - 1;
887*11efff7fSkettenis else if (encoded[i] == '$')
888b725ae77Skettenis len0 = i;
889b725ae77Skettenis }
890b725ae77Skettenis
891*11efff7fSkettenis for (i = 0, j = 0; i < len0 && !isalpha (encoded[i]); i += 1, j += 1)
892*11efff7fSkettenis decoded[j] = encoded[i];
893b725ae77Skettenis
894b725ae77Skettenis at_start_name = 1;
895b725ae77Skettenis while (i < len0)
896b725ae77Skettenis {
897*11efff7fSkettenis if (at_start_name && encoded[i] == 'O')
898b725ae77Skettenis {
899b725ae77Skettenis int k;
900*11efff7fSkettenis for (k = 0; ada_opname_table[k].encoded != NULL; k += 1)
901b725ae77Skettenis {
902*11efff7fSkettenis int op_len = strlen (ada_opname_table[k].encoded);
903*11efff7fSkettenis if ((strncmp (ada_opname_table[k].encoded + 1, encoded + i + 1,
904*11efff7fSkettenis op_len - 1) == 0)
905*11efff7fSkettenis && !isalnum (encoded[i + op_len]))
906b725ae77Skettenis {
907*11efff7fSkettenis strcpy (decoded + j, ada_opname_table[k].decoded);
908b725ae77Skettenis at_start_name = 0;
909b725ae77Skettenis i += op_len;
910*11efff7fSkettenis j += strlen (ada_opname_table[k].decoded);
911b725ae77Skettenis break;
912b725ae77Skettenis }
913b725ae77Skettenis }
914*11efff7fSkettenis if (ada_opname_table[k].encoded != NULL)
915b725ae77Skettenis continue;
916b725ae77Skettenis }
917b725ae77Skettenis at_start_name = 0;
918b725ae77Skettenis
919*11efff7fSkettenis if (i < len0 - 4 && strncmp (encoded + i, "TK__", 4) == 0)
920b725ae77Skettenis i += 2;
921*11efff7fSkettenis if (encoded[i] == 'X' && i != 0 && isalnum (encoded[i - 1]))
922b725ae77Skettenis {
923b725ae77Skettenis do
924b725ae77Skettenis i += 1;
925*11efff7fSkettenis while (i < len0 && (encoded[i] == 'b' || encoded[i] == 'n'));
926b725ae77Skettenis if (i < len0)
927b725ae77Skettenis goto Suppress;
928b725ae77Skettenis }
929*11efff7fSkettenis else if (!ADA_RETAIN_DOTS
930*11efff7fSkettenis && i < len0 - 2 && encoded[i] == '_' && encoded[i + 1] == '_')
931b725ae77Skettenis {
932*11efff7fSkettenis decoded[j] = '.';
933b725ae77Skettenis at_start_name = 1;
934b725ae77Skettenis i += 2;
935b725ae77Skettenis j += 1;
936b725ae77Skettenis }
937b725ae77Skettenis else
938b725ae77Skettenis {
939*11efff7fSkettenis decoded[j] = encoded[i];
940b725ae77Skettenis i += 1;
941b725ae77Skettenis j += 1;
942b725ae77Skettenis }
943b725ae77Skettenis }
944*11efff7fSkettenis decoded[j] = '\000';
945b725ae77Skettenis
946*11efff7fSkettenis for (i = 0; decoded[i] != '\0'; i += 1)
947*11efff7fSkettenis if (isupper (decoded[i]) || decoded[i] == ' ')
948b725ae77Skettenis goto Suppress;
949b725ae77Skettenis
950*11efff7fSkettenis if (strcmp (decoded, encoded) == 0)
951*11efff7fSkettenis return encoded;
952*11efff7fSkettenis else
953*11efff7fSkettenis return decoded;
954b725ae77Skettenis
955b725ae77Skettenis Suppress:
956*11efff7fSkettenis GROW_VECT (decoding_buffer, decoding_buffer_size, strlen (encoded) + 3);
957*11efff7fSkettenis decoded = decoding_buffer;
958*11efff7fSkettenis if (encoded[0] == '<')
959*11efff7fSkettenis strcpy (decoded, encoded);
960b725ae77Skettenis else
961*11efff7fSkettenis sprintf (decoded, "<%s>", encoded);
962*11efff7fSkettenis return decoded;
963b725ae77Skettenis
964b725ae77Skettenis }
965b725ae77Skettenis
966*11efff7fSkettenis /* Table for keeping permanent unique copies of decoded names. Once
967*11efff7fSkettenis allocated, names in this table are never released. While this is a
968*11efff7fSkettenis storage leak, it should not be significant unless there are massive
969*11efff7fSkettenis changes in the set of decoded names in successive versions of a
970*11efff7fSkettenis symbol table loaded during a single session. */
971*11efff7fSkettenis static struct htab *decoded_names_store;
972*11efff7fSkettenis
973*11efff7fSkettenis /* Returns the decoded name of GSYMBOL, as for ada_decode, caching it
974*11efff7fSkettenis in the language-specific part of GSYMBOL, if it has not been
975*11efff7fSkettenis previously computed. Tries to save the decoded name in the same
976*11efff7fSkettenis obstack as GSYMBOL, if possible, and otherwise on the heap (so that,
977*11efff7fSkettenis in any case, the decoded symbol has a lifetime at least that of
978*11efff7fSkettenis GSYMBOL).
979*11efff7fSkettenis The GSYMBOL parameter is "mutable" in the C++ sense: logically
980*11efff7fSkettenis const, but nevertheless modified to a semantically equivalent form
981*11efff7fSkettenis when a decoded name is cached in it.
982*11efff7fSkettenis */
983*11efff7fSkettenis
984*11efff7fSkettenis char *
ada_decode_symbol(const struct general_symbol_info * gsymbol)985*11efff7fSkettenis ada_decode_symbol (const struct general_symbol_info *gsymbol)
986*11efff7fSkettenis {
987*11efff7fSkettenis char **resultp =
988*11efff7fSkettenis (char **) &gsymbol->language_specific.cplus_specific.demangled_name;
989*11efff7fSkettenis if (*resultp == NULL)
990*11efff7fSkettenis {
991*11efff7fSkettenis const char *decoded = ada_decode (gsymbol->name);
992*11efff7fSkettenis if (gsymbol->bfd_section != NULL)
993*11efff7fSkettenis {
994*11efff7fSkettenis bfd *obfd = gsymbol->bfd_section->owner;
995*11efff7fSkettenis if (obfd != NULL)
996*11efff7fSkettenis {
997*11efff7fSkettenis struct objfile *objf;
998*11efff7fSkettenis ALL_OBJFILES (objf)
999*11efff7fSkettenis {
1000*11efff7fSkettenis if (obfd == objf->obfd)
1001*11efff7fSkettenis {
1002*11efff7fSkettenis *resultp = obsavestring (decoded, strlen (decoded),
1003*11efff7fSkettenis &objf->objfile_obstack);
1004*11efff7fSkettenis break;
1005*11efff7fSkettenis }
1006*11efff7fSkettenis }
1007*11efff7fSkettenis }
1008*11efff7fSkettenis }
1009*11efff7fSkettenis /* Sometimes, we can't find a corresponding objfile, in which
1010*11efff7fSkettenis case, we put the result on the heap. Since we only decode
1011*11efff7fSkettenis when needed, we hope this usually does not cause a
1012*11efff7fSkettenis significant memory leak (FIXME). */
1013*11efff7fSkettenis if (*resultp == NULL)
1014*11efff7fSkettenis {
1015*11efff7fSkettenis char **slot = (char **) htab_find_slot (decoded_names_store,
1016*11efff7fSkettenis decoded, INSERT);
1017*11efff7fSkettenis if (*slot == NULL)
1018*11efff7fSkettenis *slot = xstrdup (decoded);
1019*11efff7fSkettenis *resultp = *slot;
1020*11efff7fSkettenis }
1021*11efff7fSkettenis }
1022*11efff7fSkettenis
1023*11efff7fSkettenis return *resultp;
1024*11efff7fSkettenis }
1025*11efff7fSkettenis
1026*11efff7fSkettenis char *
ada_la_decode(const char * encoded,int options)1027*11efff7fSkettenis ada_la_decode (const char *encoded, int options)
1028*11efff7fSkettenis {
1029*11efff7fSkettenis return xstrdup (ada_decode (encoded));
1030*11efff7fSkettenis }
1031*11efff7fSkettenis
1032b725ae77Skettenis /* Returns non-zero iff SYM_NAME matches NAME, ignoring any trailing
1033*11efff7fSkettenis suffixes that encode debugging information or leading _ada_ on
1034*11efff7fSkettenis SYM_NAME (see is_name_suffix commentary for the debugging
1035*11efff7fSkettenis information that is ignored). If WILD, then NAME need only match a
1036*11efff7fSkettenis suffix of SYM_NAME minus the same suffixes. Also returns 0 if
1037*11efff7fSkettenis either argument is NULL. */
1038b725ae77Skettenis
1039b725ae77Skettenis int
ada_match_name(const char * sym_name,const char * name,int wild)1040b725ae77Skettenis ada_match_name (const char *sym_name, const char *name, int wild)
1041b725ae77Skettenis {
1042b725ae77Skettenis if (sym_name == NULL || name == NULL)
1043b725ae77Skettenis return 0;
1044b725ae77Skettenis else if (wild)
1045b725ae77Skettenis return wild_match (name, strlen (name), sym_name);
1046b725ae77Skettenis else
1047b725ae77Skettenis {
1048b725ae77Skettenis int len_name = strlen (name);
1049*11efff7fSkettenis return (strncmp (sym_name, name, len_name) == 0
1050b725ae77Skettenis && is_name_suffix (sym_name + len_name))
1051*11efff7fSkettenis || (strncmp (sym_name, "_ada_", 5) == 0
1052*11efff7fSkettenis && strncmp (sym_name + 5, name, len_name) == 0
1053b725ae77Skettenis && is_name_suffix (sym_name + len_name + 5));
1054b725ae77Skettenis }
1055b725ae77Skettenis }
1056b725ae77Skettenis
1057*11efff7fSkettenis /* True (non-zero) iff, in Ada mode, the symbol SYM should be
1058b725ae77Skettenis suppressed in info listings. */
1059b725ae77Skettenis
1060b725ae77Skettenis int
ada_suppress_symbol_printing(struct symbol * sym)1061b725ae77Skettenis ada_suppress_symbol_printing (struct symbol *sym)
1062b725ae77Skettenis {
1063b725ae77Skettenis if (SYMBOL_DOMAIN (sym) == STRUCT_DOMAIN)
1064b725ae77Skettenis return 1;
1065b725ae77Skettenis else
1066*11efff7fSkettenis return is_suppressed_name (SYMBOL_LINKAGE_NAME (sym));
1067b725ae77Skettenis }
1068b725ae77Skettenis
1069b725ae77Skettenis
1070b725ae77Skettenis /* Arrays */
1071b725ae77Skettenis
1072*11efff7fSkettenis /* Names of MAX_ADA_DIMENS bounds in P_BOUNDS fields of array descriptors. */
1073b725ae77Skettenis
1074b725ae77Skettenis static char *bound_name[] = {
1075b725ae77Skettenis "LB0", "UB0", "LB1", "UB1", "LB2", "UB2", "LB3", "UB3",
1076b725ae77Skettenis "LB4", "UB4", "LB5", "UB5", "LB6", "UB6", "LB7", "UB7"
1077b725ae77Skettenis };
1078b725ae77Skettenis
1079b725ae77Skettenis /* Maximum number of array dimensions we are prepared to handle. */
1080b725ae77Skettenis
1081b725ae77Skettenis #define MAX_ADA_DIMENS (sizeof(bound_name) / (2*sizeof(char *)))
1082b725ae77Skettenis
1083b725ae77Skettenis /* Like modify_field, but allows bitpos > wordlength. */
1084b725ae77Skettenis
1085b725ae77Skettenis static void
modify_general_field(char * addr,LONGEST fieldval,int bitpos,int bitsize)1086b725ae77Skettenis modify_general_field (char *addr, LONGEST fieldval, int bitpos, int bitsize)
1087b725ae77Skettenis {
1088*11efff7fSkettenis modify_field (addr + bitpos / 8, fieldval, bitpos % 8, bitsize);
1089b725ae77Skettenis }
1090b725ae77Skettenis
1091b725ae77Skettenis
1092b725ae77Skettenis /* The desc_* routines return primitive portions of array descriptors
1093b725ae77Skettenis (fat pointers). */
1094b725ae77Skettenis
1095b725ae77Skettenis /* The descriptor or array type, if any, indicated by TYPE; removes
1096b725ae77Skettenis level of indirection, if needed. */
1097*11efff7fSkettenis
1098b725ae77Skettenis static struct type *
desc_base_type(struct type * type)1099b725ae77Skettenis desc_base_type (struct type *type)
1100b725ae77Skettenis {
1101b725ae77Skettenis if (type == NULL)
1102b725ae77Skettenis return NULL;
1103*11efff7fSkettenis type = ada_check_typedef (type);
1104*11efff7fSkettenis if (type != NULL
1105*11efff7fSkettenis && (TYPE_CODE (type) == TYPE_CODE_PTR
1106*11efff7fSkettenis || TYPE_CODE (type) == TYPE_CODE_REF))
1107*11efff7fSkettenis return ada_check_typedef (TYPE_TARGET_TYPE (type));
1108b725ae77Skettenis else
1109b725ae77Skettenis return type;
1110b725ae77Skettenis }
1111b725ae77Skettenis
1112b725ae77Skettenis /* True iff TYPE indicates a "thin" array pointer type. */
1113*11efff7fSkettenis
1114b725ae77Skettenis static int
is_thin_pntr(struct type * type)1115b725ae77Skettenis is_thin_pntr (struct type *type)
1116b725ae77Skettenis {
1117b725ae77Skettenis return
1118b725ae77Skettenis is_suffix (ada_type_name (desc_base_type (type)), "___XUT")
1119b725ae77Skettenis || is_suffix (ada_type_name (desc_base_type (type)), "___XUT___XVE");
1120b725ae77Skettenis }
1121b725ae77Skettenis
1122b725ae77Skettenis /* The descriptor type for thin pointer type TYPE. */
1123*11efff7fSkettenis
1124b725ae77Skettenis static struct type *
thin_descriptor_type(struct type * type)1125b725ae77Skettenis thin_descriptor_type (struct type *type)
1126b725ae77Skettenis {
1127b725ae77Skettenis struct type *base_type = desc_base_type (type);
1128b725ae77Skettenis if (base_type == NULL)
1129b725ae77Skettenis return NULL;
1130b725ae77Skettenis if (is_suffix (ada_type_name (base_type), "___XVE"))
1131b725ae77Skettenis return base_type;
1132b725ae77Skettenis else
1133b725ae77Skettenis {
1134b725ae77Skettenis struct type *alt_type = ada_find_parallel_type (base_type, "___XVE");
1135b725ae77Skettenis if (alt_type == NULL)
1136b725ae77Skettenis return base_type;
1137b725ae77Skettenis else
1138b725ae77Skettenis return alt_type;
1139b725ae77Skettenis }
1140b725ae77Skettenis }
1141b725ae77Skettenis
1142b725ae77Skettenis /* A pointer to the array data for thin-pointer value VAL. */
1143*11efff7fSkettenis
1144b725ae77Skettenis static struct value *
thin_data_pntr(struct value * val)1145b725ae77Skettenis thin_data_pntr (struct value *val)
1146b725ae77Skettenis {
1147b725ae77Skettenis struct type *type = VALUE_TYPE (val);
1148b725ae77Skettenis if (TYPE_CODE (type) == TYPE_CODE_PTR)
1149b725ae77Skettenis return value_cast (desc_data_type (thin_descriptor_type (type)),
1150b725ae77Skettenis value_copy (val));
1151b725ae77Skettenis else
1152b725ae77Skettenis return value_from_longest (desc_data_type (thin_descriptor_type (type)),
1153b725ae77Skettenis VALUE_ADDRESS (val) + VALUE_OFFSET (val));
1154b725ae77Skettenis }
1155b725ae77Skettenis
1156b725ae77Skettenis /* True iff TYPE indicates a "thick" array pointer type. */
1157*11efff7fSkettenis
1158b725ae77Skettenis static int
is_thick_pntr(struct type * type)1159b725ae77Skettenis is_thick_pntr (struct type *type)
1160b725ae77Skettenis {
1161b725ae77Skettenis type = desc_base_type (type);
1162b725ae77Skettenis return (type != NULL && TYPE_CODE (type) == TYPE_CODE_STRUCT
1163b725ae77Skettenis && lookup_struct_elt_type (type, "P_BOUNDS", 1) != NULL);
1164b725ae77Skettenis }
1165b725ae77Skettenis
1166b725ae77Skettenis /* If TYPE is the type of an array descriptor (fat or thin pointer) or a
1167b725ae77Skettenis pointer to one, the type of its bounds data; otherwise, NULL. */
1168*11efff7fSkettenis
1169b725ae77Skettenis static struct type *
desc_bounds_type(struct type * type)1170b725ae77Skettenis desc_bounds_type (struct type *type)
1171b725ae77Skettenis {
1172b725ae77Skettenis struct type *r;
1173b725ae77Skettenis
1174b725ae77Skettenis type = desc_base_type (type);
1175b725ae77Skettenis
1176b725ae77Skettenis if (type == NULL)
1177b725ae77Skettenis return NULL;
1178b725ae77Skettenis else if (is_thin_pntr (type))
1179b725ae77Skettenis {
1180b725ae77Skettenis type = thin_descriptor_type (type);
1181b725ae77Skettenis if (type == NULL)
1182b725ae77Skettenis return NULL;
1183b725ae77Skettenis r = lookup_struct_elt_type (type, "BOUNDS", 1);
1184b725ae77Skettenis if (r != NULL)
1185*11efff7fSkettenis return ada_check_typedef (r);
1186b725ae77Skettenis }
1187b725ae77Skettenis else if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
1188b725ae77Skettenis {
1189b725ae77Skettenis r = lookup_struct_elt_type (type, "P_BOUNDS", 1);
1190b725ae77Skettenis if (r != NULL)
1191*11efff7fSkettenis return ada_check_typedef (TYPE_TARGET_TYPE (ada_check_typedef (r)));
1192b725ae77Skettenis }
1193b725ae77Skettenis return NULL;
1194b725ae77Skettenis }
1195b725ae77Skettenis
1196b725ae77Skettenis /* If ARR is an array descriptor (fat or thin pointer), or pointer to
1197b725ae77Skettenis one, a pointer to its bounds data. Otherwise NULL. */
1198*11efff7fSkettenis
1199b725ae77Skettenis static struct value *
desc_bounds(struct value * arr)1200b725ae77Skettenis desc_bounds (struct value *arr)
1201b725ae77Skettenis {
1202*11efff7fSkettenis struct type *type = ada_check_typedef (VALUE_TYPE (arr));
1203b725ae77Skettenis if (is_thin_pntr (type))
1204b725ae77Skettenis {
1205b725ae77Skettenis struct type *bounds_type =
1206b725ae77Skettenis desc_bounds_type (thin_descriptor_type (type));
1207b725ae77Skettenis LONGEST addr;
1208b725ae77Skettenis
1209b725ae77Skettenis if (desc_bounds_type == NULL)
1210b725ae77Skettenis error ("Bad GNAT array descriptor");
1211b725ae77Skettenis
1212b725ae77Skettenis /* NOTE: The following calculation is not really kosher, but
1213b725ae77Skettenis since desc_type is an XVE-encoded type (and shouldn't be),
1214b725ae77Skettenis the correct calculation is a real pain. FIXME (and fix GCC). */
1215b725ae77Skettenis if (TYPE_CODE (type) == TYPE_CODE_PTR)
1216b725ae77Skettenis addr = value_as_long (arr);
1217b725ae77Skettenis else
1218b725ae77Skettenis addr = VALUE_ADDRESS (arr) + VALUE_OFFSET (arr);
1219b725ae77Skettenis
1220b725ae77Skettenis return
1221b725ae77Skettenis value_from_longest (lookup_pointer_type (bounds_type),
1222b725ae77Skettenis addr - TYPE_LENGTH (bounds_type));
1223b725ae77Skettenis }
1224b725ae77Skettenis
1225b725ae77Skettenis else if (is_thick_pntr (type))
1226b725ae77Skettenis return value_struct_elt (&arr, NULL, "P_BOUNDS", NULL,
1227b725ae77Skettenis "Bad GNAT array descriptor");
1228b725ae77Skettenis else
1229b725ae77Skettenis return NULL;
1230b725ae77Skettenis }
1231b725ae77Skettenis
1232b725ae77Skettenis /* If TYPE is the type of an array-descriptor (fat pointer), the bit
1233b725ae77Skettenis position of the field containing the address of the bounds data. */
1234*11efff7fSkettenis
1235b725ae77Skettenis static int
fat_pntr_bounds_bitpos(struct type * type)1236b725ae77Skettenis fat_pntr_bounds_bitpos (struct type *type)
1237b725ae77Skettenis {
1238b725ae77Skettenis return TYPE_FIELD_BITPOS (desc_base_type (type), 1);
1239b725ae77Skettenis }
1240b725ae77Skettenis
1241b725ae77Skettenis /* If TYPE is the type of an array-descriptor (fat pointer), the bit
1242b725ae77Skettenis size of the field containing the address of the bounds data. */
1243*11efff7fSkettenis
1244b725ae77Skettenis static int
fat_pntr_bounds_bitsize(struct type * type)1245b725ae77Skettenis fat_pntr_bounds_bitsize (struct type *type)
1246b725ae77Skettenis {
1247b725ae77Skettenis type = desc_base_type (type);
1248b725ae77Skettenis
1249b725ae77Skettenis if (TYPE_FIELD_BITSIZE (type, 1) > 0)
1250b725ae77Skettenis return TYPE_FIELD_BITSIZE (type, 1);
1251b725ae77Skettenis else
1252*11efff7fSkettenis return 8 * TYPE_LENGTH (ada_check_typedef (TYPE_FIELD_TYPE (type, 1)));
1253b725ae77Skettenis }
1254b725ae77Skettenis
1255b725ae77Skettenis /* If TYPE is the type of an array descriptor (fat or thin pointer) or a
1256b725ae77Skettenis pointer to one, the type of its array data (a
1257b725ae77Skettenis pointer-to-array-with-no-bounds type); otherwise, NULL. Use
1258b725ae77Skettenis ada_type_of_array to get an array type with bounds data. */
1259*11efff7fSkettenis
1260b725ae77Skettenis static struct type *
desc_data_type(struct type * type)1261b725ae77Skettenis desc_data_type (struct type *type)
1262b725ae77Skettenis {
1263b725ae77Skettenis type = desc_base_type (type);
1264b725ae77Skettenis
1265b725ae77Skettenis /* NOTE: The following is bogus; see comment in desc_bounds. */
1266b725ae77Skettenis if (is_thin_pntr (type))
1267b725ae77Skettenis return lookup_pointer_type
1268b725ae77Skettenis (desc_base_type (TYPE_FIELD_TYPE (thin_descriptor_type (type), 1)));
1269b725ae77Skettenis else if (is_thick_pntr (type))
1270b725ae77Skettenis return lookup_struct_elt_type (type, "P_ARRAY", 1);
1271b725ae77Skettenis else
1272b725ae77Skettenis return NULL;
1273b725ae77Skettenis }
1274b725ae77Skettenis
1275b725ae77Skettenis /* If ARR is an array descriptor (fat or thin pointer), a pointer to
1276b725ae77Skettenis its array data. */
1277*11efff7fSkettenis
1278b725ae77Skettenis static struct value *
desc_data(struct value * arr)1279b725ae77Skettenis desc_data (struct value *arr)
1280b725ae77Skettenis {
1281b725ae77Skettenis struct type *type = VALUE_TYPE (arr);
1282b725ae77Skettenis if (is_thin_pntr (type))
1283b725ae77Skettenis return thin_data_pntr (arr);
1284b725ae77Skettenis else if (is_thick_pntr (type))
1285b725ae77Skettenis return value_struct_elt (&arr, NULL, "P_ARRAY", NULL,
1286b725ae77Skettenis "Bad GNAT array descriptor");
1287b725ae77Skettenis else
1288b725ae77Skettenis return NULL;
1289b725ae77Skettenis }
1290b725ae77Skettenis
1291b725ae77Skettenis
1292b725ae77Skettenis /* If TYPE is the type of an array-descriptor (fat pointer), the bit
1293b725ae77Skettenis position of the field containing the address of the data. */
1294*11efff7fSkettenis
1295b725ae77Skettenis static int
fat_pntr_data_bitpos(struct type * type)1296b725ae77Skettenis fat_pntr_data_bitpos (struct type *type)
1297b725ae77Skettenis {
1298b725ae77Skettenis return TYPE_FIELD_BITPOS (desc_base_type (type), 0);
1299b725ae77Skettenis }
1300b725ae77Skettenis
1301b725ae77Skettenis /* If TYPE is the type of an array-descriptor (fat pointer), the bit
1302b725ae77Skettenis size of the field containing the address of the data. */
1303*11efff7fSkettenis
1304b725ae77Skettenis static int
fat_pntr_data_bitsize(struct type * type)1305b725ae77Skettenis fat_pntr_data_bitsize (struct type *type)
1306b725ae77Skettenis {
1307b725ae77Skettenis type = desc_base_type (type);
1308b725ae77Skettenis
1309b725ae77Skettenis if (TYPE_FIELD_BITSIZE (type, 0) > 0)
1310b725ae77Skettenis return TYPE_FIELD_BITSIZE (type, 0);
1311b725ae77Skettenis else
1312b725ae77Skettenis return TARGET_CHAR_BIT * TYPE_LENGTH (TYPE_FIELD_TYPE (type, 0));
1313b725ae77Skettenis }
1314b725ae77Skettenis
1315b725ae77Skettenis /* If BOUNDS is an array-bounds structure (or pointer to one), return
1316b725ae77Skettenis the Ith lower bound stored in it, if WHICH is 0, and the Ith upper
1317b725ae77Skettenis bound, if WHICH is 1. The first bound is I=1. */
1318*11efff7fSkettenis
1319b725ae77Skettenis static struct value *
desc_one_bound(struct value * bounds,int i,int which)1320b725ae77Skettenis desc_one_bound (struct value *bounds, int i, int which)
1321b725ae77Skettenis {
1322b725ae77Skettenis return value_struct_elt (&bounds, NULL, bound_name[2 * i + which - 2], NULL,
1323b725ae77Skettenis "Bad GNAT array descriptor bounds");
1324b725ae77Skettenis }
1325b725ae77Skettenis
1326b725ae77Skettenis /* If BOUNDS is an array-bounds structure type, return the bit position
1327b725ae77Skettenis of the Ith lower bound stored in it, if WHICH is 0, and the Ith upper
1328b725ae77Skettenis bound, if WHICH is 1. The first bound is I=1. */
1329*11efff7fSkettenis
1330b725ae77Skettenis static int
desc_bound_bitpos(struct type * type,int i,int which)1331b725ae77Skettenis desc_bound_bitpos (struct type *type, int i, int which)
1332b725ae77Skettenis {
1333b725ae77Skettenis return TYPE_FIELD_BITPOS (desc_base_type (type), 2 * i + which - 2);
1334b725ae77Skettenis }
1335b725ae77Skettenis
1336b725ae77Skettenis /* If BOUNDS is an array-bounds structure type, return the bit field size
1337b725ae77Skettenis of the Ith lower bound stored in it, if WHICH is 0, and the Ith upper
1338b725ae77Skettenis bound, if WHICH is 1. The first bound is I=1. */
1339*11efff7fSkettenis
1340b725ae77Skettenis static int
desc_bound_bitsize(struct type * type,int i,int which)1341b725ae77Skettenis desc_bound_bitsize (struct type *type, int i, int which)
1342b725ae77Skettenis {
1343b725ae77Skettenis type = desc_base_type (type);
1344b725ae77Skettenis
1345b725ae77Skettenis if (TYPE_FIELD_BITSIZE (type, 2 * i + which - 2) > 0)
1346b725ae77Skettenis return TYPE_FIELD_BITSIZE (type, 2 * i + which - 2);
1347b725ae77Skettenis else
1348b725ae77Skettenis return 8 * TYPE_LENGTH (TYPE_FIELD_TYPE (type, 2 * i + which - 2));
1349b725ae77Skettenis }
1350b725ae77Skettenis
1351b725ae77Skettenis /* If TYPE is the type of an array-bounds structure, the type of its
1352b725ae77Skettenis Ith bound (numbering from 1). Otherwise, NULL. */
1353*11efff7fSkettenis
1354b725ae77Skettenis static struct type *
desc_index_type(struct type * type,int i)1355b725ae77Skettenis desc_index_type (struct type *type, int i)
1356b725ae77Skettenis {
1357b725ae77Skettenis type = desc_base_type (type);
1358b725ae77Skettenis
1359b725ae77Skettenis if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
1360b725ae77Skettenis return lookup_struct_elt_type (type, bound_name[2 * i - 2], 1);
1361b725ae77Skettenis else
1362b725ae77Skettenis return NULL;
1363b725ae77Skettenis }
1364b725ae77Skettenis
1365*11efff7fSkettenis /* The number of index positions in the array-bounds type TYPE.
1366*11efff7fSkettenis Return 0 if TYPE is NULL. */
1367*11efff7fSkettenis
1368b725ae77Skettenis static int
desc_arity(struct type * type)1369b725ae77Skettenis desc_arity (struct type *type)
1370b725ae77Skettenis {
1371b725ae77Skettenis type = desc_base_type (type);
1372b725ae77Skettenis
1373b725ae77Skettenis if (type != NULL)
1374b725ae77Skettenis return TYPE_NFIELDS (type) / 2;
1375b725ae77Skettenis return 0;
1376b725ae77Skettenis }
1377b725ae77Skettenis
1378*11efff7fSkettenis /* Non-zero iff TYPE is a simple array type (not a pointer to one) or
1379*11efff7fSkettenis an array descriptor type (representing an unconstrained array
1380*11efff7fSkettenis type). */
1381b725ae77Skettenis
1382*11efff7fSkettenis static int
ada_is_direct_array_type(struct type * type)1383*11efff7fSkettenis ada_is_direct_array_type (struct type *type)
1384b725ae77Skettenis {
1385b725ae77Skettenis if (type == NULL)
1386b725ae77Skettenis return 0;
1387*11efff7fSkettenis type = ada_check_typedef (type);
1388*11efff7fSkettenis return (TYPE_CODE (type) == TYPE_CODE_ARRAY
1389*11efff7fSkettenis || ada_is_array_descriptor_type (type));
1390*11efff7fSkettenis }
1391*11efff7fSkettenis
1392*11efff7fSkettenis /* Non-zero iff TYPE is a simple array type or pointer to one. */
1393*11efff7fSkettenis
1394*11efff7fSkettenis int
ada_is_simple_array_type(struct type * type)1395*11efff7fSkettenis ada_is_simple_array_type (struct type *type)
1396*11efff7fSkettenis {
1397*11efff7fSkettenis if (type == NULL)
1398*11efff7fSkettenis return 0;
1399*11efff7fSkettenis type = ada_check_typedef (type);
1400b725ae77Skettenis return (TYPE_CODE (type) == TYPE_CODE_ARRAY
1401b725ae77Skettenis || (TYPE_CODE (type) == TYPE_CODE_PTR
1402b725ae77Skettenis && TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_ARRAY));
1403b725ae77Skettenis }
1404b725ae77Skettenis
1405*11efff7fSkettenis /* Non-zero iff TYPE belongs to a GNAT array descriptor. */
1406*11efff7fSkettenis
1407b725ae77Skettenis int
ada_is_array_descriptor_type(struct type * type)1408*11efff7fSkettenis ada_is_array_descriptor_type (struct type *type)
1409b725ae77Skettenis {
1410b725ae77Skettenis struct type *data_type = desc_data_type (type);
1411b725ae77Skettenis
1412b725ae77Skettenis if (type == NULL)
1413b725ae77Skettenis return 0;
1414*11efff7fSkettenis type = ada_check_typedef (type);
1415b725ae77Skettenis return
1416b725ae77Skettenis data_type != NULL
1417b725ae77Skettenis && ((TYPE_CODE (data_type) == TYPE_CODE_PTR
1418b725ae77Skettenis && TYPE_TARGET_TYPE (data_type) != NULL
1419b725ae77Skettenis && TYPE_CODE (TYPE_TARGET_TYPE (data_type)) == TYPE_CODE_ARRAY)
1420*11efff7fSkettenis || TYPE_CODE (data_type) == TYPE_CODE_ARRAY)
1421b725ae77Skettenis && desc_arity (desc_bounds_type (type)) > 0;
1422b725ae77Skettenis }
1423b725ae77Skettenis
1424b725ae77Skettenis /* Non-zero iff type is a partially mal-formed GNAT array
1425*11efff7fSkettenis descriptor. FIXME: This is to compensate for some problems with
1426b725ae77Skettenis debugging output from GNAT. Re-examine periodically to see if it
1427b725ae77Skettenis is still needed. */
1428*11efff7fSkettenis
1429b725ae77Skettenis int
ada_is_bogus_array_descriptor(struct type * type)1430b725ae77Skettenis ada_is_bogus_array_descriptor (struct type *type)
1431b725ae77Skettenis {
1432b725ae77Skettenis return
1433b725ae77Skettenis type != NULL
1434b725ae77Skettenis && TYPE_CODE (type) == TYPE_CODE_STRUCT
1435b725ae77Skettenis && (lookup_struct_elt_type (type, "P_BOUNDS", 1) != NULL
1436b725ae77Skettenis || lookup_struct_elt_type (type, "P_ARRAY", 1) != NULL)
1437*11efff7fSkettenis && !ada_is_array_descriptor_type (type);
1438b725ae77Skettenis }
1439b725ae77Skettenis
1440b725ae77Skettenis
1441b725ae77Skettenis /* If ARR has a record type in the form of a standard GNAT array descriptor,
1442b725ae77Skettenis (fat pointer) returns the type of the array data described---specifically,
1443b725ae77Skettenis a pointer-to-array type. If BOUNDS is non-zero, the bounds data are filled
1444b725ae77Skettenis in from the descriptor; otherwise, they are left unspecified. If
1445b725ae77Skettenis the ARR denotes a null array descriptor and BOUNDS is non-zero,
1446b725ae77Skettenis returns NULL. The result is simply the type of ARR if ARR is not
1447b725ae77Skettenis a descriptor. */
1448b725ae77Skettenis struct type *
ada_type_of_array(struct value * arr,int bounds)1449b725ae77Skettenis ada_type_of_array (struct value *arr, int bounds)
1450b725ae77Skettenis {
1451b725ae77Skettenis if (ada_is_packed_array_type (VALUE_TYPE (arr)))
1452b725ae77Skettenis return decode_packed_array_type (VALUE_TYPE (arr));
1453b725ae77Skettenis
1454*11efff7fSkettenis if (!ada_is_array_descriptor_type (VALUE_TYPE (arr)))
1455b725ae77Skettenis return VALUE_TYPE (arr);
1456b725ae77Skettenis
1457b725ae77Skettenis if (!bounds)
1458b725ae77Skettenis return
1459*11efff7fSkettenis ada_check_typedef (TYPE_TARGET_TYPE (desc_data_type (VALUE_TYPE (arr))));
1460b725ae77Skettenis else
1461b725ae77Skettenis {
1462b725ae77Skettenis struct type *elt_type;
1463b725ae77Skettenis int arity;
1464b725ae77Skettenis struct value *descriptor;
1465b725ae77Skettenis struct objfile *objf = TYPE_OBJFILE (VALUE_TYPE (arr));
1466b725ae77Skettenis
1467b725ae77Skettenis elt_type = ada_array_element_type (VALUE_TYPE (arr), -1);
1468b725ae77Skettenis arity = ada_array_arity (VALUE_TYPE (arr));
1469b725ae77Skettenis
1470b725ae77Skettenis if (elt_type == NULL || arity == 0)
1471*11efff7fSkettenis return ada_check_typedef (VALUE_TYPE (arr));
1472b725ae77Skettenis
1473b725ae77Skettenis descriptor = desc_bounds (arr);
1474b725ae77Skettenis if (value_as_long (descriptor) == 0)
1475b725ae77Skettenis return NULL;
1476b725ae77Skettenis while (arity > 0)
1477b725ae77Skettenis {
1478b725ae77Skettenis struct type *range_type = alloc_type (objf);
1479b725ae77Skettenis struct type *array_type = alloc_type (objf);
1480b725ae77Skettenis struct value *low = desc_one_bound (descriptor, arity, 0);
1481b725ae77Skettenis struct value *high = desc_one_bound (descriptor, arity, 1);
1482b725ae77Skettenis arity -= 1;
1483b725ae77Skettenis
1484b725ae77Skettenis create_range_type (range_type, VALUE_TYPE (low),
1485b725ae77Skettenis (int) value_as_long (low),
1486b725ae77Skettenis (int) value_as_long (high));
1487b725ae77Skettenis elt_type = create_array_type (array_type, elt_type, range_type);
1488b725ae77Skettenis }
1489b725ae77Skettenis
1490b725ae77Skettenis return lookup_pointer_type (elt_type);
1491b725ae77Skettenis }
1492b725ae77Skettenis }
1493b725ae77Skettenis
1494b725ae77Skettenis /* If ARR does not represent an array, returns ARR unchanged.
1495b725ae77Skettenis Otherwise, returns either a standard GDB array with bounds set
1496b725ae77Skettenis appropriately or, if ARR is a non-null fat pointer, a pointer to a standard
1497b725ae77Skettenis GDB array. Returns NULL if ARR is a null fat pointer. */
1498*11efff7fSkettenis
1499b725ae77Skettenis struct value *
ada_coerce_to_simple_array_ptr(struct value * arr)1500b725ae77Skettenis ada_coerce_to_simple_array_ptr (struct value *arr)
1501b725ae77Skettenis {
1502*11efff7fSkettenis if (ada_is_array_descriptor_type (VALUE_TYPE (arr)))
1503b725ae77Skettenis {
1504b725ae77Skettenis struct type *arrType = ada_type_of_array (arr, 1);
1505b725ae77Skettenis if (arrType == NULL)
1506b725ae77Skettenis return NULL;
1507b725ae77Skettenis return value_cast (arrType, value_copy (desc_data (arr)));
1508b725ae77Skettenis }
1509b725ae77Skettenis else if (ada_is_packed_array_type (VALUE_TYPE (arr)))
1510b725ae77Skettenis return decode_packed_array (arr);
1511b725ae77Skettenis else
1512b725ae77Skettenis return arr;
1513b725ae77Skettenis }
1514b725ae77Skettenis
1515b725ae77Skettenis /* If ARR does not represent an array, returns ARR unchanged.
1516b725ae77Skettenis Otherwise, returns a standard GDB array describing ARR (which may
1517b725ae77Skettenis be ARR itself if it already is in the proper form). */
1518*11efff7fSkettenis
1519*11efff7fSkettenis static struct value *
ada_coerce_to_simple_array(struct value * arr)1520b725ae77Skettenis ada_coerce_to_simple_array (struct value *arr)
1521b725ae77Skettenis {
1522*11efff7fSkettenis if (ada_is_array_descriptor_type (VALUE_TYPE (arr)))
1523b725ae77Skettenis {
1524b725ae77Skettenis struct value *arrVal = ada_coerce_to_simple_array_ptr (arr);
1525b725ae77Skettenis if (arrVal == NULL)
1526b725ae77Skettenis error ("Bounds unavailable for null array pointer.");
1527b725ae77Skettenis return value_ind (arrVal);
1528b725ae77Skettenis }
1529b725ae77Skettenis else if (ada_is_packed_array_type (VALUE_TYPE (arr)))
1530b725ae77Skettenis return decode_packed_array (arr);
1531b725ae77Skettenis else
1532b725ae77Skettenis return arr;
1533b725ae77Skettenis }
1534b725ae77Skettenis
1535b725ae77Skettenis /* If TYPE represents a GNAT array type, return it translated to an
1536b725ae77Skettenis ordinary GDB array type (possibly with BITSIZE fields indicating
1537b725ae77Skettenis packing). For other types, is the identity. */
1538*11efff7fSkettenis
1539b725ae77Skettenis struct type *
ada_coerce_to_simple_array_type(struct type * type)1540b725ae77Skettenis ada_coerce_to_simple_array_type (struct type *type)
1541b725ae77Skettenis {
1542b725ae77Skettenis struct value *mark = value_mark ();
1543b725ae77Skettenis struct value *dummy = value_from_longest (builtin_type_long, 0);
1544b725ae77Skettenis struct type *result;
1545b725ae77Skettenis VALUE_TYPE (dummy) = type;
1546b725ae77Skettenis result = ada_type_of_array (dummy, 0);
1547*11efff7fSkettenis value_free_to_mark (mark);
1548b725ae77Skettenis return result;
1549b725ae77Skettenis }
1550b725ae77Skettenis
1551b725ae77Skettenis /* Non-zero iff TYPE represents a standard GNAT packed-array type. */
1552*11efff7fSkettenis
1553b725ae77Skettenis int
ada_is_packed_array_type(struct type * type)1554b725ae77Skettenis ada_is_packed_array_type (struct type *type)
1555b725ae77Skettenis {
1556b725ae77Skettenis if (type == NULL)
1557b725ae77Skettenis return 0;
1558*11efff7fSkettenis type = desc_base_type (type);
1559*11efff7fSkettenis type = ada_check_typedef (type);
1560b725ae77Skettenis return
1561b725ae77Skettenis ada_type_name (type) != NULL
1562b725ae77Skettenis && strstr (ada_type_name (type), "___XP") != NULL;
1563b725ae77Skettenis }
1564b725ae77Skettenis
1565b725ae77Skettenis /* Given that TYPE is a standard GDB array type with all bounds filled
1566b725ae77Skettenis in, and that the element size of its ultimate scalar constituents
1567b725ae77Skettenis (that is, either its elements, or, if it is an array of arrays, its
1568b725ae77Skettenis elements' elements, etc.) is *ELT_BITS, return an identical type,
1569b725ae77Skettenis but with the bit sizes of its elements (and those of any
1570b725ae77Skettenis constituent arrays) recorded in the BITSIZE components of its
1571b725ae77Skettenis TYPE_FIELD_BITSIZE values, and with *ELT_BITS set to its total size
1572b725ae77Skettenis in bits. */
1573*11efff7fSkettenis
1574b725ae77Skettenis static struct type *
packed_array_type(struct type * type,long * elt_bits)1575b725ae77Skettenis packed_array_type (struct type *type, long *elt_bits)
1576b725ae77Skettenis {
1577b725ae77Skettenis struct type *new_elt_type;
1578b725ae77Skettenis struct type *new_type;
1579b725ae77Skettenis LONGEST low_bound, high_bound;
1580b725ae77Skettenis
1581*11efff7fSkettenis type = ada_check_typedef (type);
1582b725ae77Skettenis if (TYPE_CODE (type) != TYPE_CODE_ARRAY)
1583b725ae77Skettenis return type;
1584b725ae77Skettenis
1585b725ae77Skettenis new_type = alloc_type (TYPE_OBJFILE (type));
1586*11efff7fSkettenis new_elt_type = packed_array_type (ada_check_typedef (TYPE_TARGET_TYPE (type)),
1587b725ae77Skettenis elt_bits);
1588b725ae77Skettenis create_array_type (new_type, new_elt_type, TYPE_FIELD_TYPE (type, 0));
1589b725ae77Skettenis TYPE_FIELD_BITSIZE (new_type, 0) = *elt_bits;
1590b725ae77Skettenis TYPE_NAME (new_type) = ada_type_name (type);
1591b725ae77Skettenis
1592b725ae77Skettenis if (get_discrete_bounds (TYPE_FIELD_TYPE (type, 0),
1593b725ae77Skettenis &low_bound, &high_bound) < 0)
1594b725ae77Skettenis low_bound = high_bound = 0;
1595b725ae77Skettenis if (high_bound < low_bound)
1596b725ae77Skettenis *elt_bits = TYPE_LENGTH (new_type) = 0;
1597b725ae77Skettenis else
1598b725ae77Skettenis {
1599b725ae77Skettenis *elt_bits *= (high_bound - low_bound + 1);
1600b725ae77Skettenis TYPE_LENGTH (new_type) =
1601b725ae77Skettenis (*elt_bits + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT;
1602b725ae77Skettenis }
1603b725ae77Skettenis
1604*11efff7fSkettenis TYPE_FLAGS (new_type) |= TYPE_FLAG_FIXED_INSTANCE;
1605b725ae77Skettenis return new_type;
1606b725ae77Skettenis }
1607b725ae77Skettenis
1608*11efff7fSkettenis /* The array type encoded by TYPE, where ada_is_packed_array_type (TYPE). */
1609*11efff7fSkettenis
1610b725ae77Skettenis static struct type *
decode_packed_array_type(struct type * type)1611b725ae77Skettenis decode_packed_array_type (struct type *type)
1612b725ae77Skettenis {
1613*11efff7fSkettenis struct symbol *sym;
1614b725ae77Skettenis struct block **blocks;
1615*11efff7fSkettenis const char *raw_name = ada_type_name (ada_check_typedef (type));
1616b725ae77Skettenis char *name = (char *) alloca (strlen (raw_name) + 1);
1617b725ae77Skettenis char *tail = strstr (raw_name, "___XP");
1618b725ae77Skettenis struct type *shadow_type;
1619b725ae77Skettenis long bits;
1620b725ae77Skettenis int i, n;
1621b725ae77Skettenis
1622*11efff7fSkettenis type = desc_base_type (type);
1623*11efff7fSkettenis
1624b725ae77Skettenis memcpy (name, raw_name, tail - raw_name);
1625b725ae77Skettenis name[tail - raw_name] = '\000';
1626b725ae77Skettenis
1627*11efff7fSkettenis sym = standard_lookup (name, get_selected_block (0), VAR_DOMAIN);
1628*11efff7fSkettenis if (sym == NULL || SYMBOL_TYPE (sym) == NULL)
1629b725ae77Skettenis {
1630*11efff7fSkettenis lim_warning ("could not find bounds information on packed array");
1631b725ae77Skettenis return NULL;
1632b725ae77Skettenis }
1633*11efff7fSkettenis shadow_type = SYMBOL_TYPE (sym);
1634b725ae77Skettenis
1635b725ae77Skettenis if (TYPE_CODE (shadow_type) != TYPE_CODE_ARRAY)
1636b725ae77Skettenis {
1637*11efff7fSkettenis lim_warning ("could not understand bounds information on packed array");
1638b725ae77Skettenis return NULL;
1639b725ae77Skettenis }
1640b725ae77Skettenis
1641b725ae77Skettenis if (sscanf (tail + sizeof ("___XP") - 1, "%ld", &bits) != 1)
1642b725ae77Skettenis {
1643*11efff7fSkettenis lim_warning
1644*11efff7fSkettenis ("could not understand bit size information on packed array");
1645b725ae77Skettenis return NULL;
1646b725ae77Skettenis }
1647b725ae77Skettenis
1648b725ae77Skettenis return packed_array_type (shadow_type, &bits);
1649b725ae77Skettenis }
1650b725ae77Skettenis
1651b725ae77Skettenis /* Given that ARR is a struct value *indicating a GNAT packed array,
1652b725ae77Skettenis returns a simple array that denotes that array. Its type is a
1653b725ae77Skettenis standard GDB array type except that the BITSIZEs of the array
1654b725ae77Skettenis target types are set to the number of bits in each element, and the
1655b725ae77Skettenis type length is set appropriately. */
1656b725ae77Skettenis
1657b725ae77Skettenis static struct value *
decode_packed_array(struct value * arr)1658b725ae77Skettenis decode_packed_array (struct value *arr)
1659b725ae77Skettenis {
1660*11efff7fSkettenis struct type *type;
1661b725ae77Skettenis
1662*11efff7fSkettenis arr = ada_coerce_ref (arr);
1663*11efff7fSkettenis if (TYPE_CODE (VALUE_TYPE (arr)) == TYPE_CODE_PTR)
1664*11efff7fSkettenis arr = ada_value_ind (arr);
1665*11efff7fSkettenis
1666*11efff7fSkettenis type = decode_packed_array_type (VALUE_TYPE (arr));
1667b725ae77Skettenis if (type == NULL)
1668b725ae77Skettenis {
1669b725ae77Skettenis error ("can't unpack array");
1670b725ae77Skettenis return NULL;
1671b725ae77Skettenis }
1672*11efff7fSkettenis
1673*11efff7fSkettenis if (BITS_BIG_ENDIAN && ada_is_modular_type (VALUE_TYPE (arr)))
1674*11efff7fSkettenis {
1675*11efff7fSkettenis /* This is a (right-justified) modular type representing a packed
1676*11efff7fSkettenis array with no wrapper. In order to interpret the value through
1677*11efff7fSkettenis the (left-justified) packed array type we just built, we must
1678*11efff7fSkettenis first left-justify it. */
1679*11efff7fSkettenis int bit_size, bit_pos;
1680*11efff7fSkettenis ULONGEST mod;
1681*11efff7fSkettenis
1682*11efff7fSkettenis mod = ada_modulus (VALUE_TYPE (arr)) - 1;
1683*11efff7fSkettenis bit_size = 0;
1684*11efff7fSkettenis while (mod > 0)
1685*11efff7fSkettenis {
1686*11efff7fSkettenis bit_size += 1;
1687*11efff7fSkettenis mod >>= 1;
1688*11efff7fSkettenis }
1689*11efff7fSkettenis bit_pos = HOST_CHAR_BIT * TYPE_LENGTH (VALUE_TYPE (arr)) - bit_size;
1690*11efff7fSkettenis arr = ada_value_primitive_packed_val (arr, NULL,
1691*11efff7fSkettenis bit_pos / HOST_CHAR_BIT,
1692*11efff7fSkettenis bit_pos % HOST_CHAR_BIT,
1693*11efff7fSkettenis bit_size,
1694*11efff7fSkettenis type);
1695*11efff7fSkettenis }
1696*11efff7fSkettenis
1697*11efff7fSkettenis return coerce_unspec_val_to_type (arr, type);
1698b725ae77Skettenis }
1699b725ae77Skettenis
1700b725ae77Skettenis
1701b725ae77Skettenis /* The value of the element of packed array ARR at the ARITY indices
1702b725ae77Skettenis given in IND. ARR must be a simple array. */
1703b725ae77Skettenis
1704b725ae77Skettenis static struct value *
value_subscript_packed(struct value * arr,int arity,struct value ** ind)1705b725ae77Skettenis value_subscript_packed (struct value *arr, int arity, struct value **ind)
1706b725ae77Skettenis {
1707b725ae77Skettenis int i;
1708b725ae77Skettenis int bits, elt_off, bit_off;
1709b725ae77Skettenis long elt_total_bit_offset;
1710b725ae77Skettenis struct type *elt_type;
1711b725ae77Skettenis struct value *v;
1712b725ae77Skettenis
1713b725ae77Skettenis bits = 0;
1714b725ae77Skettenis elt_total_bit_offset = 0;
1715*11efff7fSkettenis elt_type = ada_check_typedef (VALUE_TYPE (arr));
1716b725ae77Skettenis for (i = 0; i < arity; i += 1)
1717b725ae77Skettenis {
1718b725ae77Skettenis if (TYPE_CODE (elt_type) != TYPE_CODE_ARRAY
1719b725ae77Skettenis || TYPE_FIELD_BITSIZE (elt_type, 0) == 0)
1720b725ae77Skettenis error
1721b725ae77Skettenis ("attempt to do packed indexing of something other than a packed array");
1722b725ae77Skettenis else
1723b725ae77Skettenis {
1724b725ae77Skettenis struct type *range_type = TYPE_INDEX_TYPE (elt_type);
1725b725ae77Skettenis LONGEST lowerbound, upperbound;
1726b725ae77Skettenis LONGEST idx;
1727b725ae77Skettenis
1728b725ae77Skettenis if (get_discrete_bounds (range_type, &lowerbound, &upperbound) < 0)
1729b725ae77Skettenis {
1730*11efff7fSkettenis lim_warning ("don't know bounds of array");
1731b725ae77Skettenis lowerbound = upperbound = 0;
1732b725ae77Skettenis }
1733b725ae77Skettenis
1734b725ae77Skettenis idx = value_as_long (value_pos_atr (ind[i]));
1735b725ae77Skettenis if (idx < lowerbound || idx > upperbound)
1736*11efff7fSkettenis lim_warning ("packed array index %ld out of bounds", (long) idx);
1737b725ae77Skettenis bits = TYPE_FIELD_BITSIZE (elt_type, 0);
1738b725ae77Skettenis elt_total_bit_offset += (idx - lowerbound) * bits;
1739*11efff7fSkettenis elt_type = ada_check_typedef (TYPE_TARGET_TYPE (elt_type));
1740b725ae77Skettenis }
1741b725ae77Skettenis }
1742b725ae77Skettenis elt_off = elt_total_bit_offset / HOST_CHAR_BIT;
1743b725ae77Skettenis bit_off = elt_total_bit_offset % HOST_CHAR_BIT;
1744b725ae77Skettenis
1745b725ae77Skettenis v = ada_value_primitive_packed_val (arr, NULL, elt_off, bit_off,
1746b725ae77Skettenis bits, elt_type);
1747b725ae77Skettenis if (VALUE_LVAL (arr) == lval_internalvar)
1748b725ae77Skettenis VALUE_LVAL (v) = lval_internalvar_component;
1749b725ae77Skettenis else
1750b725ae77Skettenis VALUE_LVAL (v) = VALUE_LVAL (arr);
1751b725ae77Skettenis return v;
1752b725ae77Skettenis }
1753b725ae77Skettenis
1754b725ae77Skettenis /* Non-zero iff TYPE includes negative integer values. */
1755b725ae77Skettenis
1756b725ae77Skettenis static int
has_negatives(struct type * type)1757b725ae77Skettenis has_negatives (struct type *type)
1758b725ae77Skettenis {
1759b725ae77Skettenis switch (TYPE_CODE (type))
1760b725ae77Skettenis {
1761b725ae77Skettenis default:
1762b725ae77Skettenis return 0;
1763b725ae77Skettenis case TYPE_CODE_INT:
1764b725ae77Skettenis return !TYPE_UNSIGNED (type);
1765b725ae77Skettenis case TYPE_CODE_RANGE:
1766b725ae77Skettenis return TYPE_LOW_BOUND (type) < 0;
1767b725ae77Skettenis }
1768b725ae77Skettenis }
1769b725ae77Skettenis
1770b725ae77Skettenis
1771b725ae77Skettenis /* Create a new value of type TYPE from the contents of OBJ starting
1772b725ae77Skettenis at byte OFFSET, and bit offset BIT_OFFSET within that byte,
1773b725ae77Skettenis proceeding for BIT_SIZE bits. If OBJ is an lval in memory, then
1774*11efff7fSkettenis assigning through the result will set the field fetched from.
1775*11efff7fSkettenis VALADDR is ignored unless OBJ is NULL, in which case,
1776*11efff7fSkettenis VALADDR+OFFSET must address the start of storage containing the
1777*11efff7fSkettenis packed value. The value returned in this case is never an lval.
1778b725ae77Skettenis Assumes 0 <= BIT_OFFSET < HOST_CHAR_BIT. */
1779b725ae77Skettenis
1780b725ae77Skettenis struct value *
ada_value_primitive_packed_val(struct value * obj,char * valaddr,long offset,int bit_offset,int bit_size,struct type * type)1781b725ae77Skettenis ada_value_primitive_packed_val (struct value *obj, char *valaddr, long offset,
1782b725ae77Skettenis int bit_offset, int bit_size,
1783b725ae77Skettenis struct type *type)
1784b725ae77Skettenis {
1785b725ae77Skettenis struct value *v;
1786*11efff7fSkettenis int src, /* Index into the source area */
1787*11efff7fSkettenis targ, /* Index into the target area */
1788*11efff7fSkettenis srcBitsLeft, /* Number of source bits left to move */
1789*11efff7fSkettenis nsrc, ntarg, /* Number of source and target bytes */
1790b725ae77Skettenis unusedLS, /* Number of bits in next significant
1791*11efff7fSkettenis byte of source that are unused */
1792b725ae77Skettenis accumSize; /* Number of meaningful bits in accum */
1793*11efff7fSkettenis unsigned char *bytes; /* First byte containing data to unpack */
1794b725ae77Skettenis unsigned char *unpacked;
1795b725ae77Skettenis unsigned long accum; /* Staging area for bits being transferred */
1796b725ae77Skettenis unsigned char sign;
1797b725ae77Skettenis int len = (bit_size + bit_offset + HOST_CHAR_BIT - 1) / 8;
1798*11efff7fSkettenis /* Transmit bytes from least to most significant; delta is the direction
1799*11efff7fSkettenis the indices move. */
1800b725ae77Skettenis int delta = BITS_BIG_ENDIAN ? -1 : 1;
1801b725ae77Skettenis
1802*11efff7fSkettenis type = ada_check_typedef (type);
1803b725ae77Skettenis
1804b725ae77Skettenis if (obj == NULL)
1805b725ae77Skettenis {
1806b725ae77Skettenis v = allocate_value (type);
1807b725ae77Skettenis bytes = (unsigned char *) (valaddr + offset);
1808b725ae77Skettenis }
1809b725ae77Skettenis else if (VALUE_LAZY (obj))
1810b725ae77Skettenis {
1811b725ae77Skettenis v = value_at (type,
1812b725ae77Skettenis VALUE_ADDRESS (obj) + VALUE_OFFSET (obj) + offset, NULL);
1813b725ae77Skettenis bytes = (unsigned char *) alloca (len);
1814b725ae77Skettenis read_memory (VALUE_ADDRESS (v), bytes, len);
1815b725ae77Skettenis }
1816b725ae77Skettenis else
1817b725ae77Skettenis {
1818b725ae77Skettenis v = allocate_value (type);
1819b725ae77Skettenis bytes = (unsigned char *) VALUE_CONTENTS (obj) + offset;
1820b725ae77Skettenis }
1821b725ae77Skettenis
1822b725ae77Skettenis if (obj != NULL)
1823b725ae77Skettenis {
1824b725ae77Skettenis VALUE_LVAL (v) = VALUE_LVAL (obj);
1825b725ae77Skettenis if (VALUE_LVAL (obj) == lval_internalvar)
1826b725ae77Skettenis VALUE_LVAL (v) = lval_internalvar_component;
1827b725ae77Skettenis VALUE_ADDRESS (v) = VALUE_ADDRESS (obj) + VALUE_OFFSET (obj) + offset;
1828b725ae77Skettenis VALUE_BITPOS (v) = bit_offset + VALUE_BITPOS (obj);
1829b725ae77Skettenis VALUE_BITSIZE (v) = bit_size;
1830b725ae77Skettenis if (VALUE_BITPOS (v) >= HOST_CHAR_BIT)
1831b725ae77Skettenis {
1832b725ae77Skettenis VALUE_ADDRESS (v) += 1;
1833b725ae77Skettenis VALUE_BITPOS (v) -= HOST_CHAR_BIT;
1834b725ae77Skettenis }
1835b725ae77Skettenis }
1836b725ae77Skettenis else
1837b725ae77Skettenis VALUE_BITSIZE (v) = bit_size;
1838b725ae77Skettenis unpacked = (unsigned char *) VALUE_CONTENTS (v);
1839b725ae77Skettenis
1840b725ae77Skettenis srcBitsLeft = bit_size;
1841b725ae77Skettenis nsrc = len;
1842b725ae77Skettenis ntarg = TYPE_LENGTH (type);
1843b725ae77Skettenis sign = 0;
1844b725ae77Skettenis if (bit_size == 0)
1845b725ae77Skettenis {
1846b725ae77Skettenis memset (unpacked, 0, TYPE_LENGTH (type));
1847b725ae77Skettenis return v;
1848b725ae77Skettenis }
1849b725ae77Skettenis else if (BITS_BIG_ENDIAN)
1850b725ae77Skettenis {
1851b725ae77Skettenis src = len - 1;
1852*11efff7fSkettenis if (has_negatives (type)
1853*11efff7fSkettenis && ((bytes[0] << bit_offset) & (1 << (HOST_CHAR_BIT - 1))))
1854b725ae77Skettenis sign = ~0;
1855b725ae77Skettenis
1856b725ae77Skettenis unusedLS =
1857b725ae77Skettenis (HOST_CHAR_BIT - (bit_size + bit_offset) % HOST_CHAR_BIT)
1858b725ae77Skettenis % HOST_CHAR_BIT;
1859b725ae77Skettenis
1860b725ae77Skettenis switch (TYPE_CODE (type))
1861b725ae77Skettenis {
1862b725ae77Skettenis case TYPE_CODE_ARRAY:
1863b725ae77Skettenis case TYPE_CODE_UNION:
1864b725ae77Skettenis case TYPE_CODE_STRUCT:
1865*11efff7fSkettenis /* Non-scalar values must be aligned at a byte boundary... */
1866b725ae77Skettenis accumSize =
1867b725ae77Skettenis (HOST_CHAR_BIT - bit_size % HOST_CHAR_BIT) % HOST_CHAR_BIT;
1868*11efff7fSkettenis /* ... And are placed at the beginning (most-significant) bytes
1869*11efff7fSkettenis of the target. */
1870b725ae77Skettenis targ = src;
1871b725ae77Skettenis break;
1872b725ae77Skettenis default:
1873b725ae77Skettenis accumSize = 0;
1874b725ae77Skettenis targ = TYPE_LENGTH (type) - 1;
1875b725ae77Skettenis break;
1876b725ae77Skettenis }
1877b725ae77Skettenis }
1878b725ae77Skettenis else
1879b725ae77Skettenis {
1880b725ae77Skettenis int sign_bit_offset = (bit_size + bit_offset - 1) % 8;
1881b725ae77Skettenis
1882b725ae77Skettenis src = targ = 0;
1883b725ae77Skettenis unusedLS = bit_offset;
1884b725ae77Skettenis accumSize = 0;
1885b725ae77Skettenis
1886b725ae77Skettenis if (has_negatives (type) && (bytes[len - 1] & (1 << sign_bit_offset)))
1887b725ae77Skettenis sign = ~0;
1888b725ae77Skettenis }
1889b725ae77Skettenis
1890b725ae77Skettenis accum = 0;
1891b725ae77Skettenis while (nsrc > 0)
1892b725ae77Skettenis {
1893b725ae77Skettenis /* Mask for removing bits of the next source byte that are not
1894*11efff7fSkettenis part of the value. */
1895b725ae77Skettenis unsigned int unusedMSMask =
1896b725ae77Skettenis (1 << (srcBitsLeft >= HOST_CHAR_BIT ? HOST_CHAR_BIT : srcBitsLeft)) -
1897b725ae77Skettenis 1;
1898b725ae77Skettenis /* Sign-extend bits for this byte. */
1899b725ae77Skettenis unsigned int signMask = sign & ~unusedMSMask;
1900b725ae77Skettenis accum |=
1901b725ae77Skettenis (((bytes[src] >> unusedLS) & unusedMSMask) | signMask) << accumSize;
1902b725ae77Skettenis accumSize += HOST_CHAR_BIT - unusedLS;
1903b725ae77Skettenis if (accumSize >= HOST_CHAR_BIT)
1904b725ae77Skettenis {
1905b725ae77Skettenis unpacked[targ] = accum & ~(~0L << HOST_CHAR_BIT);
1906b725ae77Skettenis accumSize -= HOST_CHAR_BIT;
1907b725ae77Skettenis accum >>= HOST_CHAR_BIT;
1908b725ae77Skettenis ntarg -= 1;
1909b725ae77Skettenis targ += delta;
1910b725ae77Skettenis }
1911b725ae77Skettenis srcBitsLeft -= HOST_CHAR_BIT - unusedLS;
1912b725ae77Skettenis unusedLS = 0;
1913b725ae77Skettenis nsrc -= 1;
1914b725ae77Skettenis src += delta;
1915b725ae77Skettenis }
1916b725ae77Skettenis while (ntarg > 0)
1917b725ae77Skettenis {
1918b725ae77Skettenis accum |= sign << accumSize;
1919b725ae77Skettenis unpacked[targ] = accum & ~(~0L << HOST_CHAR_BIT);
1920b725ae77Skettenis accumSize -= HOST_CHAR_BIT;
1921b725ae77Skettenis accum >>= HOST_CHAR_BIT;
1922b725ae77Skettenis ntarg -= 1;
1923b725ae77Skettenis targ += delta;
1924b725ae77Skettenis }
1925b725ae77Skettenis
1926b725ae77Skettenis return v;
1927b725ae77Skettenis }
1928b725ae77Skettenis
1929b725ae77Skettenis /* Move N bits from SOURCE, starting at bit offset SRC_OFFSET to
1930b725ae77Skettenis TARGET, starting at bit offset TARG_OFFSET. SOURCE and TARGET must
1931b725ae77Skettenis not overlap. */
1932b725ae77Skettenis static void
move_bits(char * target,int targ_offset,char * source,int src_offset,int n)1933b725ae77Skettenis move_bits (char *target, int targ_offset, char *source, int src_offset, int n)
1934b725ae77Skettenis {
1935b725ae77Skettenis unsigned int accum, mask;
1936b725ae77Skettenis int accum_bits, chunk_size;
1937b725ae77Skettenis
1938b725ae77Skettenis target += targ_offset / HOST_CHAR_BIT;
1939b725ae77Skettenis targ_offset %= HOST_CHAR_BIT;
1940b725ae77Skettenis source += src_offset / HOST_CHAR_BIT;
1941b725ae77Skettenis src_offset %= HOST_CHAR_BIT;
1942b725ae77Skettenis if (BITS_BIG_ENDIAN)
1943b725ae77Skettenis {
1944b725ae77Skettenis accum = (unsigned char) *source;
1945b725ae77Skettenis source += 1;
1946b725ae77Skettenis accum_bits = HOST_CHAR_BIT - src_offset;
1947b725ae77Skettenis
1948b725ae77Skettenis while (n > 0)
1949b725ae77Skettenis {
1950b725ae77Skettenis int unused_right;
1951b725ae77Skettenis accum = (accum << HOST_CHAR_BIT) + (unsigned char) *source;
1952b725ae77Skettenis accum_bits += HOST_CHAR_BIT;
1953b725ae77Skettenis source += 1;
1954b725ae77Skettenis chunk_size = HOST_CHAR_BIT - targ_offset;
1955b725ae77Skettenis if (chunk_size > n)
1956b725ae77Skettenis chunk_size = n;
1957b725ae77Skettenis unused_right = HOST_CHAR_BIT - (chunk_size + targ_offset);
1958b725ae77Skettenis mask = ((1 << chunk_size) - 1) << unused_right;
1959b725ae77Skettenis *target =
1960b725ae77Skettenis (*target & ~mask)
1961b725ae77Skettenis | ((accum >> (accum_bits - chunk_size - unused_right)) & mask);
1962b725ae77Skettenis n -= chunk_size;
1963b725ae77Skettenis accum_bits -= chunk_size;
1964b725ae77Skettenis target += 1;
1965b725ae77Skettenis targ_offset = 0;
1966b725ae77Skettenis }
1967b725ae77Skettenis }
1968b725ae77Skettenis else
1969b725ae77Skettenis {
1970b725ae77Skettenis accum = (unsigned char) *source >> src_offset;
1971b725ae77Skettenis source += 1;
1972b725ae77Skettenis accum_bits = HOST_CHAR_BIT - src_offset;
1973b725ae77Skettenis
1974b725ae77Skettenis while (n > 0)
1975b725ae77Skettenis {
1976b725ae77Skettenis accum = accum + ((unsigned char) *source << accum_bits);
1977b725ae77Skettenis accum_bits += HOST_CHAR_BIT;
1978b725ae77Skettenis source += 1;
1979b725ae77Skettenis chunk_size = HOST_CHAR_BIT - targ_offset;
1980b725ae77Skettenis if (chunk_size > n)
1981b725ae77Skettenis chunk_size = n;
1982b725ae77Skettenis mask = ((1 << chunk_size) - 1) << targ_offset;
1983b725ae77Skettenis *target = (*target & ~mask) | ((accum << targ_offset) & mask);
1984b725ae77Skettenis n -= chunk_size;
1985b725ae77Skettenis accum_bits -= chunk_size;
1986b725ae77Skettenis accum >>= chunk_size;
1987b725ae77Skettenis target += 1;
1988b725ae77Skettenis targ_offset = 0;
1989b725ae77Skettenis }
1990b725ae77Skettenis }
1991b725ae77Skettenis }
1992b725ae77Skettenis
1993b725ae77Skettenis
1994b725ae77Skettenis /* Store the contents of FROMVAL into the location of TOVAL.
1995b725ae77Skettenis Return a new value with the location of TOVAL and contents of
1996b725ae77Skettenis FROMVAL. Handles assignment into packed fields that have
1997b725ae77Skettenis floating-point or non-scalar types. */
1998b725ae77Skettenis
1999b725ae77Skettenis static struct value *
ada_value_assign(struct value * toval,struct value * fromval)2000b725ae77Skettenis ada_value_assign (struct value *toval, struct value *fromval)
2001b725ae77Skettenis {
2002b725ae77Skettenis struct type *type = VALUE_TYPE (toval);
2003b725ae77Skettenis int bits = VALUE_BITSIZE (toval);
2004b725ae77Skettenis
2005b725ae77Skettenis if (!toval->modifiable)
2006b725ae77Skettenis error ("Left operand of assignment is not a modifiable lvalue.");
2007b725ae77Skettenis
2008b725ae77Skettenis COERCE_REF (toval);
2009b725ae77Skettenis
2010b725ae77Skettenis if (VALUE_LVAL (toval) == lval_memory
2011b725ae77Skettenis && bits > 0
2012b725ae77Skettenis && (TYPE_CODE (type) == TYPE_CODE_FLT
2013b725ae77Skettenis || TYPE_CODE (type) == TYPE_CODE_STRUCT))
2014b725ae77Skettenis {
2015b725ae77Skettenis int len =
2016b725ae77Skettenis (VALUE_BITPOS (toval) + bits + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT;
2017b725ae77Skettenis char *buffer = (char *) alloca (len);
2018b725ae77Skettenis struct value *val;
2019b725ae77Skettenis
2020b725ae77Skettenis if (TYPE_CODE (type) == TYPE_CODE_FLT)
2021b725ae77Skettenis fromval = value_cast (type, fromval);
2022b725ae77Skettenis
2023b725ae77Skettenis read_memory (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval), buffer, len);
2024b725ae77Skettenis if (BITS_BIG_ENDIAN)
2025b725ae77Skettenis move_bits (buffer, VALUE_BITPOS (toval),
2026b725ae77Skettenis VALUE_CONTENTS (fromval),
2027b725ae77Skettenis TYPE_LENGTH (VALUE_TYPE (fromval)) * TARGET_CHAR_BIT -
2028b725ae77Skettenis bits, bits);
2029b725ae77Skettenis else
2030b725ae77Skettenis move_bits (buffer, VALUE_BITPOS (toval), VALUE_CONTENTS (fromval),
2031b725ae77Skettenis 0, bits);
2032b725ae77Skettenis write_memory (VALUE_ADDRESS (toval) + VALUE_OFFSET (toval), buffer,
2033b725ae77Skettenis len);
2034b725ae77Skettenis
2035b725ae77Skettenis val = value_copy (toval);
2036b725ae77Skettenis memcpy (VALUE_CONTENTS_RAW (val), VALUE_CONTENTS (fromval),
2037b725ae77Skettenis TYPE_LENGTH (type));
2038b725ae77Skettenis VALUE_TYPE (val) = type;
2039b725ae77Skettenis
2040b725ae77Skettenis return val;
2041b725ae77Skettenis }
2042b725ae77Skettenis
2043b725ae77Skettenis return value_assign (toval, fromval);
2044b725ae77Skettenis }
2045b725ae77Skettenis
2046b725ae77Skettenis
2047b725ae77Skettenis /* The value of the element of array ARR at the ARITY indices given in IND.
2048b725ae77Skettenis ARR may be either a simple array, GNAT array descriptor, or pointer
2049b725ae77Skettenis thereto. */
2050b725ae77Skettenis
2051b725ae77Skettenis struct value *
ada_value_subscript(struct value * arr,int arity,struct value ** ind)2052b725ae77Skettenis ada_value_subscript (struct value *arr, int arity, struct value **ind)
2053b725ae77Skettenis {
2054b725ae77Skettenis int k;
2055b725ae77Skettenis struct value *elt;
2056b725ae77Skettenis struct type *elt_type;
2057b725ae77Skettenis
2058b725ae77Skettenis elt = ada_coerce_to_simple_array (arr);
2059b725ae77Skettenis
2060*11efff7fSkettenis elt_type = ada_check_typedef (VALUE_TYPE (elt));
2061b725ae77Skettenis if (TYPE_CODE (elt_type) == TYPE_CODE_ARRAY
2062b725ae77Skettenis && TYPE_FIELD_BITSIZE (elt_type, 0) > 0)
2063b725ae77Skettenis return value_subscript_packed (elt, arity, ind);
2064b725ae77Skettenis
2065b725ae77Skettenis for (k = 0; k < arity; k += 1)
2066b725ae77Skettenis {
2067b725ae77Skettenis if (TYPE_CODE (elt_type) != TYPE_CODE_ARRAY)
2068b725ae77Skettenis error ("too many subscripts (%d expected)", k);
2069b725ae77Skettenis elt = value_subscript (elt, value_pos_atr (ind[k]));
2070b725ae77Skettenis }
2071b725ae77Skettenis return elt;
2072b725ae77Skettenis }
2073b725ae77Skettenis
2074b725ae77Skettenis /* Assuming ARR is a pointer to a standard GDB array of type TYPE, the
2075b725ae77Skettenis value of the element of *ARR at the ARITY indices given in
2076b725ae77Skettenis IND. Does not read the entire array into memory. */
2077b725ae77Skettenis
2078b725ae77Skettenis struct value *
ada_value_ptr_subscript(struct value * arr,struct type * type,int arity,struct value ** ind)2079b725ae77Skettenis ada_value_ptr_subscript (struct value *arr, struct type *type, int arity,
2080b725ae77Skettenis struct value **ind)
2081b725ae77Skettenis {
2082b725ae77Skettenis int k;
2083b725ae77Skettenis
2084b725ae77Skettenis for (k = 0; k < arity; k += 1)
2085b725ae77Skettenis {
2086b725ae77Skettenis LONGEST lwb, upb;
2087b725ae77Skettenis struct value *idx;
2088b725ae77Skettenis
2089b725ae77Skettenis if (TYPE_CODE (type) != TYPE_CODE_ARRAY)
2090b725ae77Skettenis error ("too many subscripts (%d expected)", k);
2091b725ae77Skettenis arr = value_cast (lookup_pointer_type (TYPE_TARGET_TYPE (type)),
2092b725ae77Skettenis value_copy (arr));
2093b725ae77Skettenis get_discrete_bounds (TYPE_INDEX_TYPE (type), &lwb, &upb);
2094*11efff7fSkettenis idx = value_pos_atr (ind[k]);
2095*11efff7fSkettenis if (lwb != 0)
2096*11efff7fSkettenis idx = value_sub (idx, value_from_longest (builtin_type_int, lwb));
2097b725ae77Skettenis arr = value_add (arr, idx);
2098b725ae77Skettenis type = TYPE_TARGET_TYPE (type);
2099b725ae77Skettenis }
2100b725ae77Skettenis
2101b725ae77Skettenis return value_ind (arr);
2102b725ae77Skettenis }
2103b725ae77Skettenis
2104*11efff7fSkettenis /* Given that ARRAY_PTR is a pointer or reference to an array of type TYPE (the
2105*11efff7fSkettenis actual type of ARRAY_PTR is ignored), returns a reference to
2106*11efff7fSkettenis the Ada slice of HIGH-LOW+1 elements starting at index LOW. The lower
2107*11efff7fSkettenis bound of this array is LOW, as per Ada rules. */
2108*11efff7fSkettenis static struct value *
ada_value_slice_ptr(struct value * array_ptr,struct type * type,int low,int high)2109*11efff7fSkettenis ada_value_slice_ptr (struct value *array_ptr, struct type *type,
2110*11efff7fSkettenis int low, int high)
2111*11efff7fSkettenis {
2112*11efff7fSkettenis CORE_ADDR base = value_as_address (array_ptr)
2113*11efff7fSkettenis + ((low - TYPE_LOW_BOUND (TYPE_INDEX_TYPE (type)))
2114*11efff7fSkettenis * TYPE_LENGTH (TYPE_TARGET_TYPE (type)));
2115*11efff7fSkettenis struct type *index_type =
2116*11efff7fSkettenis create_range_type (NULL, TYPE_TARGET_TYPE (TYPE_INDEX_TYPE (type)),
2117*11efff7fSkettenis low, high);
2118*11efff7fSkettenis struct type *slice_type =
2119*11efff7fSkettenis create_array_type (NULL, TYPE_TARGET_TYPE (type), index_type);
2120*11efff7fSkettenis return value_from_pointer (lookup_reference_type (slice_type), base);
2121*11efff7fSkettenis }
2122*11efff7fSkettenis
2123*11efff7fSkettenis
2124*11efff7fSkettenis static struct value *
ada_value_slice(struct value * array,int low,int high)2125*11efff7fSkettenis ada_value_slice (struct value *array, int low, int high)
2126*11efff7fSkettenis {
2127*11efff7fSkettenis struct type *type = VALUE_TYPE (array);
2128*11efff7fSkettenis struct type *index_type =
2129*11efff7fSkettenis create_range_type (NULL, TYPE_INDEX_TYPE (type), low, high);
2130*11efff7fSkettenis struct type *slice_type =
2131*11efff7fSkettenis create_array_type (NULL, TYPE_TARGET_TYPE (type), index_type);
2132*11efff7fSkettenis return value_cast (slice_type, value_slice (array, low, high - low + 1));
2133*11efff7fSkettenis }
2134*11efff7fSkettenis
2135b725ae77Skettenis /* If type is a record type in the form of a standard GNAT array
2136b725ae77Skettenis descriptor, returns the number of dimensions for type. If arr is a
2137b725ae77Skettenis simple array, returns the number of "array of"s that prefix its
2138b725ae77Skettenis type designation. Otherwise, returns 0. */
2139b725ae77Skettenis
2140b725ae77Skettenis int
ada_array_arity(struct type * type)2141b725ae77Skettenis ada_array_arity (struct type *type)
2142b725ae77Skettenis {
2143b725ae77Skettenis int arity;
2144b725ae77Skettenis
2145b725ae77Skettenis if (type == NULL)
2146b725ae77Skettenis return 0;
2147b725ae77Skettenis
2148b725ae77Skettenis type = desc_base_type (type);
2149b725ae77Skettenis
2150b725ae77Skettenis arity = 0;
2151b725ae77Skettenis if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
2152b725ae77Skettenis return desc_arity (desc_bounds_type (type));
2153b725ae77Skettenis else
2154b725ae77Skettenis while (TYPE_CODE (type) == TYPE_CODE_ARRAY)
2155b725ae77Skettenis {
2156b725ae77Skettenis arity += 1;
2157*11efff7fSkettenis type = ada_check_typedef (TYPE_TARGET_TYPE (type));
2158b725ae77Skettenis }
2159b725ae77Skettenis
2160b725ae77Skettenis return arity;
2161b725ae77Skettenis }
2162b725ae77Skettenis
2163b725ae77Skettenis /* If TYPE is a record type in the form of a standard GNAT array
2164b725ae77Skettenis descriptor or a simple array type, returns the element type for
2165b725ae77Skettenis TYPE after indexing by NINDICES indices, or by all indices if
2166b725ae77Skettenis NINDICES is -1. Otherwise, returns NULL. */
2167b725ae77Skettenis
2168b725ae77Skettenis struct type *
ada_array_element_type(struct type * type,int nindices)2169b725ae77Skettenis ada_array_element_type (struct type *type, int nindices)
2170b725ae77Skettenis {
2171b725ae77Skettenis type = desc_base_type (type);
2172b725ae77Skettenis
2173b725ae77Skettenis if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
2174b725ae77Skettenis {
2175b725ae77Skettenis int k;
2176b725ae77Skettenis struct type *p_array_type;
2177b725ae77Skettenis
2178b725ae77Skettenis p_array_type = desc_data_type (type);
2179b725ae77Skettenis
2180b725ae77Skettenis k = ada_array_arity (type);
2181b725ae77Skettenis if (k == 0)
2182b725ae77Skettenis return NULL;
2183b725ae77Skettenis
2184*11efff7fSkettenis /* Initially p_array_type = elt_type(*)[]...(k times)...[]. */
2185b725ae77Skettenis if (nindices >= 0 && k > nindices)
2186b725ae77Skettenis k = nindices;
2187b725ae77Skettenis p_array_type = TYPE_TARGET_TYPE (p_array_type);
2188b725ae77Skettenis while (k > 0 && p_array_type != NULL)
2189b725ae77Skettenis {
2190*11efff7fSkettenis p_array_type = ada_check_typedef (TYPE_TARGET_TYPE (p_array_type));
2191b725ae77Skettenis k -= 1;
2192b725ae77Skettenis }
2193b725ae77Skettenis return p_array_type;
2194b725ae77Skettenis }
2195b725ae77Skettenis else if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
2196b725ae77Skettenis {
2197b725ae77Skettenis while (nindices != 0 && TYPE_CODE (type) == TYPE_CODE_ARRAY)
2198b725ae77Skettenis {
2199b725ae77Skettenis type = TYPE_TARGET_TYPE (type);
2200b725ae77Skettenis nindices -= 1;
2201b725ae77Skettenis }
2202b725ae77Skettenis return type;
2203b725ae77Skettenis }
2204b725ae77Skettenis
2205b725ae77Skettenis return NULL;
2206b725ae77Skettenis }
2207b725ae77Skettenis
2208*11efff7fSkettenis /* The type of nth index in arrays of given type (n numbering from 1).
2209*11efff7fSkettenis Does not examine memory. */
2210b725ae77Skettenis
2211b725ae77Skettenis struct type *
ada_index_type(struct type * type,int n)2212b725ae77Skettenis ada_index_type (struct type *type, int n)
2213b725ae77Skettenis {
2214*11efff7fSkettenis struct type *result_type;
2215*11efff7fSkettenis
2216b725ae77Skettenis type = desc_base_type (type);
2217b725ae77Skettenis
2218b725ae77Skettenis if (n > ada_array_arity (type))
2219b725ae77Skettenis return NULL;
2220b725ae77Skettenis
2221*11efff7fSkettenis if (ada_is_simple_array_type (type))
2222b725ae77Skettenis {
2223b725ae77Skettenis int i;
2224b725ae77Skettenis
2225b725ae77Skettenis for (i = 1; i < n; i += 1)
2226b725ae77Skettenis type = TYPE_TARGET_TYPE (type);
2227*11efff7fSkettenis result_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 0));
2228*11efff7fSkettenis /* FIXME: The stabs type r(0,0);bound;bound in an array type
2229*11efff7fSkettenis has a target type of TYPE_CODE_UNDEF. We compensate here, but
2230*11efff7fSkettenis perhaps stabsread.c would make more sense. */
2231*11efff7fSkettenis if (result_type == NULL || TYPE_CODE (result_type) == TYPE_CODE_UNDEF)
2232*11efff7fSkettenis result_type = builtin_type_int;
2233b725ae77Skettenis
2234*11efff7fSkettenis return result_type;
2235b725ae77Skettenis }
2236b725ae77Skettenis else
2237b725ae77Skettenis return desc_index_type (desc_bounds_type (type), n);
2238b725ae77Skettenis }
2239b725ae77Skettenis
2240b725ae77Skettenis /* Given that arr is an array type, returns the lower bound of the
2241b725ae77Skettenis Nth index (numbering from 1) if WHICH is 0, and the upper bound if
2242b725ae77Skettenis WHICH is 1. This returns bounds 0 .. -1 if ARR_TYPE is an
2243b725ae77Skettenis array-descriptor type. If TYPEP is non-null, *TYPEP is set to the
2244b725ae77Skettenis bounds type. It works for other arrays with bounds supplied by
2245b725ae77Skettenis run-time quantities other than discriminants. */
2246b725ae77Skettenis
2247b725ae77Skettenis LONGEST
ada_array_bound_from_type(struct type * arr_type,int n,int which,struct type ** typep)2248b725ae77Skettenis ada_array_bound_from_type (struct type * arr_type, int n, int which,
2249b725ae77Skettenis struct type ** typep)
2250b725ae77Skettenis {
2251b725ae77Skettenis struct type *type;
2252b725ae77Skettenis struct type *index_type_desc;
2253b725ae77Skettenis
2254b725ae77Skettenis if (ada_is_packed_array_type (arr_type))
2255b725ae77Skettenis arr_type = decode_packed_array_type (arr_type);
2256b725ae77Skettenis
2257*11efff7fSkettenis if (arr_type == NULL || !ada_is_simple_array_type (arr_type))
2258b725ae77Skettenis {
2259b725ae77Skettenis if (typep != NULL)
2260b725ae77Skettenis *typep = builtin_type_int;
2261b725ae77Skettenis return (LONGEST) - which;
2262b725ae77Skettenis }
2263b725ae77Skettenis
2264b725ae77Skettenis if (TYPE_CODE (arr_type) == TYPE_CODE_PTR)
2265b725ae77Skettenis type = TYPE_TARGET_TYPE (arr_type);
2266b725ae77Skettenis else
2267b725ae77Skettenis type = arr_type;
2268b725ae77Skettenis
2269b725ae77Skettenis index_type_desc = ada_find_parallel_type (type, "___XA");
2270b725ae77Skettenis if (index_type_desc == NULL)
2271b725ae77Skettenis {
2272b725ae77Skettenis struct type *range_type;
2273b725ae77Skettenis struct type *index_type;
2274b725ae77Skettenis
2275b725ae77Skettenis while (n > 1)
2276b725ae77Skettenis {
2277b725ae77Skettenis type = TYPE_TARGET_TYPE (type);
2278b725ae77Skettenis n -= 1;
2279b725ae77Skettenis }
2280b725ae77Skettenis
2281b725ae77Skettenis range_type = TYPE_INDEX_TYPE (type);
2282b725ae77Skettenis index_type = TYPE_TARGET_TYPE (range_type);
2283b725ae77Skettenis if (TYPE_CODE (index_type) == TYPE_CODE_UNDEF)
2284b725ae77Skettenis index_type = builtin_type_long;
2285b725ae77Skettenis if (typep != NULL)
2286b725ae77Skettenis *typep = index_type;
2287b725ae77Skettenis return
2288b725ae77Skettenis (LONGEST) (which == 0
2289b725ae77Skettenis ? TYPE_LOW_BOUND (range_type)
2290b725ae77Skettenis : TYPE_HIGH_BOUND (range_type));
2291b725ae77Skettenis }
2292b725ae77Skettenis else
2293b725ae77Skettenis {
2294b725ae77Skettenis struct type *index_type =
2295b725ae77Skettenis to_fixed_range_type (TYPE_FIELD_NAME (index_type_desc, n - 1),
2296b725ae77Skettenis NULL, TYPE_OBJFILE (arr_type));
2297b725ae77Skettenis if (typep != NULL)
2298b725ae77Skettenis *typep = TYPE_TARGET_TYPE (index_type);
2299b725ae77Skettenis return
2300b725ae77Skettenis (LONGEST) (which == 0
2301b725ae77Skettenis ? TYPE_LOW_BOUND (index_type)
2302b725ae77Skettenis : TYPE_HIGH_BOUND (index_type));
2303b725ae77Skettenis }
2304b725ae77Skettenis }
2305b725ae77Skettenis
2306b725ae77Skettenis /* Given that arr is an array value, returns the lower bound of the
2307b725ae77Skettenis nth index (numbering from 1) if which is 0, and the upper bound if
2308b725ae77Skettenis which is 1. This routine will also work for arrays with bounds
2309b725ae77Skettenis supplied by run-time quantities other than discriminants. */
2310b725ae77Skettenis
2311b725ae77Skettenis struct value *
ada_array_bound(struct value * arr,int n,int which)2312b725ae77Skettenis ada_array_bound (struct value *arr, int n, int which)
2313b725ae77Skettenis {
2314b725ae77Skettenis struct type *arr_type = VALUE_TYPE (arr);
2315b725ae77Skettenis
2316b725ae77Skettenis if (ada_is_packed_array_type (arr_type))
2317b725ae77Skettenis return ada_array_bound (decode_packed_array (arr), n, which);
2318*11efff7fSkettenis else if (ada_is_simple_array_type (arr_type))
2319b725ae77Skettenis {
2320b725ae77Skettenis struct type *type;
2321b725ae77Skettenis LONGEST v = ada_array_bound_from_type (arr_type, n, which, &type);
2322b725ae77Skettenis return value_from_longest (type, v);
2323b725ae77Skettenis }
2324b725ae77Skettenis else
2325b725ae77Skettenis return desc_one_bound (desc_bounds (arr), n, which);
2326b725ae77Skettenis }
2327b725ae77Skettenis
2328b725ae77Skettenis /* Given that arr is an array value, returns the length of the
2329b725ae77Skettenis nth index. This routine will also work for arrays with bounds
2330*11efff7fSkettenis supplied by run-time quantities other than discriminants.
2331*11efff7fSkettenis Does not work for arrays indexed by enumeration types with representation
2332b725ae77Skettenis clauses at the moment. */
2333b725ae77Skettenis
2334b725ae77Skettenis struct value *
ada_array_length(struct value * arr,int n)2335b725ae77Skettenis ada_array_length (struct value *arr, int n)
2336b725ae77Skettenis {
2337*11efff7fSkettenis struct type *arr_type = ada_check_typedef (VALUE_TYPE (arr));
2338b725ae77Skettenis
2339b725ae77Skettenis if (ada_is_packed_array_type (arr_type))
2340b725ae77Skettenis return ada_array_length (decode_packed_array (arr), n);
2341b725ae77Skettenis
2342*11efff7fSkettenis if (ada_is_simple_array_type (arr_type))
2343b725ae77Skettenis {
2344b725ae77Skettenis struct type *type;
2345b725ae77Skettenis LONGEST v =
2346b725ae77Skettenis ada_array_bound_from_type (arr_type, n, 1, &type) -
2347b725ae77Skettenis ada_array_bound_from_type (arr_type, n, 0, NULL) + 1;
2348b725ae77Skettenis return value_from_longest (type, v);
2349b725ae77Skettenis }
2350b725ae77Skettenis else
2351b725ae77Skettenis return
2352*11efff7fSkettenis value_from_longest (builtin_type_int,
2353b725ae77Skettenis value_as_long (desc_one_bound (desc_bounds (arr),
2354b725ae77Skettenis n, 1))
2355b725ae77Skettenis - value_as_long (desc_one_bound (desc_bounds (arr),
2356b725ae77Skettenis n, 0)) + 1);
2357b725ae77Skettenis }
2358*11efff7fSkettenis
2359*11efff7fSkettenis /* An empty array whose type is that of ARR_TYPE (an array type),
2360*11efff7fSkettenis with bounds LOW to LOW-1. */
2361*11efff7fSkettenis
2362*11efff7fSkettenis static struct value *
empty_array(struct type * arr_type,int low)2363*11efff7fSkettenis empty_array (struct type *arr_type, int low)
2364*11efff7fSkettenis {
2365*11efff7fSkettenis struct type *index_type =
2366*11efff7fSkettenis create_range_type (NULL, TYPE_TARGET_TYPE (TYPE_INDEX_TYPE (arr_type)),
2367*11efff7fSkettenis low, low - 1);
2368*11efff7fSkettenis struct type *elt_type = ada_array_element_type (arr_type, 1);
2369*11efff7fSkettenis return allocate_value (create_array_type (NULL, elt_type, index_type));
2370*11efff7fSkettenis }
2371b725ae77Skettenis
2372b725ae77Skettenis
2373b725ae77Skettenis /* Name resolution */
2374b725ae77Skettenis
2375*11efff7fSkettenis /* The "decoded" name for the user-definable Ada operator corresponding
2376*11efff7fSkettenis to OP. */
2377b725ae77Skettenis
2378b725ae77Skettenis static const char *
ada_decoded_op_name(enum exp_opcode op)2379*11efff7fSkettenis ada_decoded_op_name (enum exp_opcode op)
2380b725ae77Skettenis {
2381b725ae77Skettenis int i;
2382b725ae77Skettenis
2383*11efff7fSkettenis for (i = 0; ada_opname_table[i].encoded != NULL; i += 1)
2384b725ae77Skettenis {
2385b725ae77Skettenis if (ada_opname_table[i].op == op)
2386*11efff7fSkettenis return ada_opname_table[i].decoded;
2387b725ae77Skettenis }
2388b725ae77Skettenis error ("Could not find operator name for opcode");
2389b725ae77Skettenis }
2390b725ae77Skettenis
2391b725ae77Skettenis
2392b725ae77Skettenis /* Same as evaluate_type (*EXP), but resolves ambiguous symbol
2393*11efff7fSkettenis references (marked by OP_VAR_VALUE nodes in which the symbol has an
2394*11efff7fSkettenis undefined namespace) and converts operators that are
2395b725ae77Skettenis user-defined into appropriate function calls. If CONTEXT_TYPE is
2396b725ae77Skettenis non-null, it provides a preferred result type [at the moment, only
2397b725ae77Skettenis type void has any effect---causing procedures to be preferred over
2398b725ae77Skettenis functions in calls]. A null CONTEXT_TYPE indicates that a non-void
2399*11efff7fSkettenis return type is preferred. May change (expand) *EXP. */
2400b725ae77Skettenis
2401*11efff7fSkettenis static void
resolve(struct expression ** expp,int void_context_p)2402*11efff7fSkettenis resolve (struct expression **expp, int void_context_p)
2403b725ae77Skettenis {
2404b725ae77Skettenis int pc;
2405b725ae77Skettenis pc = 0;
2406*11efff7fSkettenis resolve_subexp (expp, &pc, 1, void_context_p ? builtin_type_void : NULL);
2407b725ae77Skettenis }
2408b725ae77Skettenis
2409b725ae77Skettenis /* Resolve the operator of the subexpression beginning at
2410b725ae77Skettenis position *POS of *EXPP. "Resolving" consists of replacing
2411*11efff7fSkettenis the symbols that have undefined namespaces in OP_VAR_VALUE nodes
2412*11efff7fSkettenis with their resolutions, replacing built-in operators with
2413*11efff7fSkettenis function calls to user-defined operators, where appropriate, and,
2414*11efff7fSkettenis when DEPROCEDURE_P is non-zero, converting function-valued variables
2415*11efff7fSkettenis into parameterless calls. May expand *EXPP. The CONTEXT_TYPE functions
2416*11efff7fSkettenis are as in ada_resolve, above. */
2417b725ae77Skettenis
2418b725ae77Skettenis static struct value *
resolve_subexp(struct expression ** expp,int * pos,int deprocedure_p,struct type * context_type)2419*11efff7fSkettenis resolve_subexp (struct expression **expp, int *pos, int deprocedure_p,
2420b725ae77Skettenis struct type *context_type)
2421b725ae77Skettenis {
2422b725ae77Skettenis int pc = *pos;
2423b725ae77Skettenis int i;
2424*11efff7fSkettenis struct expression *exp; /* Convenience: == *expp. */
2425b725ae77Skettenis enum exp_opcode op = (*expp)->elts[pc].opcode;
2426b725ae77Skettenis struct value **argvec; /* Vector of operand types (alloca'ed). */
2427*11efff7fSkettenis int nargs; /* Number of operands. */
2428b725ae77Skettenis
2429b725ae77Skettenis argvec = NULL;
2430b725ae77Skettenis nargs = 0;
2431b725ae77Skettenis exp = *expp;
2432b725ae77Skettenis
2433b725ae77Skettenis /* Pass one: resolve operands, saving their types and updating *pos. */
2434b725ae77Skettenis switch (op)
2435b725ae77Skettenis {
2436b725ae77Skettenis case OP_FUNCALL:
2437*11efff7fSkettenis if (exp->elts[pc + 3].opcode == OP_VAR_VALUE
2438*11efff7fSkettenis && SYMBOL_DOMAIN (exp->elts[pc + 5].symbol) == UNDEF_DOMAIN)
2439b725ae77Skettenis *pos += 7;
2440b725ae77Skettenis else
2441b725ae77Skettenis {
2442b725ae77Skettenis *pos += 3;
2443*11efff7fSkettenis resolve_subexp (expp, pos, 0, NULL);
2444b725ae77Skettenis }
2445*11efff7fSkettenis nargs = longest_to_int (exp->elts[pc + 1].longconst);
2446b725ae77Skettenis break;
2447b725ae77Skettenis
2448*11efff7fSkettenis case UNOP_QUAL:
2449b725ae77Skettenis *pos += 3;
2450*11efff7fSkettenis resolve_subexp (expp, pos, 1, exp->elts[pc + 1].type);
2451b725ae77Skettenis break;
2452*11efff7fSkettenis
2453b725ae77Skettenis case UNOP_ADDR:
2454b725ae77Skettenis *pos += 1;
2455*11efff7fSkettenis resolve_subexp (expp, pos, 0, NULL);
2456*11efff7fSkettenis break;
2457*11efff7fSkettenis
2458*11efff7fSkettenis case OP_ATR_MODULUS:
2459*11efff7fSkettenis *pos += 4;
2460*11efff7fSkettenis break;
2461*11efff7fSkettenis
2462*11efff7fSkettenis case OP_ATR_SIZE:
2463*11efff7fSkettenis case OP_ATR_TAG:
2464*11efff7fSkettenis *pos += 1;
2465*11efff7fSkettenis nargs = 1;
2466*11efff7fSkettenis break;
2467*11efff7fSkettenis
2468*11efff7fSkettenis case OP_ATR_FIRST:
2469*11efff7fSkettenis case OP_ATR_LAST:
2470*11efff7fSkettenis case OP_ATR_LENGTH:
2471*11efff7fSkettenis case OP_ATR_POS:
2472*11efff7fSkettenis case OP_ATR_VAL:
2473*11efff7fSkettenis *pos += 1;
2474*11efff7fSkettenis nargs = 2;
2475*11efff7fSkettenis break;
2476*11efff7fSkettenis
2477*11efff7fSkettenis case OP_ATR_MIN:
2478*11efff7fSkettenis case OP_ATR_MAX:
2479*11efff7fSkettenis *pos += 1;
2480*11efff7fSkettenis nargs = 3;
2481b725ae77Skettenis break;
2482b725ae77Skettenis
2483b725ae77Skettenis case BINOP_ASSIGN:
2484b725ae77Skettenis {
2485b725ae77Skettenis struct value *arg1;
2486*11efff7fSkettenis
2487b725ae77Skettenis *pos += 1;
2488*11efff7fSkettenis arg1 = resolve_subexp (expp, pos, 0, NULL);
2489b725ae77Skettenis if (arg1 == NULL)
2490*11efff7fSkettenis resolve_subexp (expp, pos, 1, NULL);
2491b725ae77Skettenis else
2492*11efff7fSkettenis resolve_subexp (expp, pos, 1, VALUE_TYPE (arg1));
2493b725ae77Skettenis break;
2494b725ae77Skettenis }
2495b725ae77Skettenis
2496b725ae77Skettenis case UNOP_CAST:
2497*11efff7fSkettenis case UNOP_IN_RANGE:
2498b725ae77Skettenis *pos += 3;
2499*11efff7fSkettenis nargs = 1;
2500b725ae77Skettenis break;
2501*11efff7fSkettenis
2502b725ae77Skettenis case BINOP_ADD:
2503b725ae77Skettenis case BINOP_SUB:
2504b725ae77Skettenis case BINOP_MUL:
2505b725ae77Skettenis case BINOP_DIV:
2506b725ae77Skettenis case BINOP_REM:
2507b725ae77Skettenis case BINOP_MOD:
2508b725ae77Skettenis case BINOP_EXP:
2509b725ae77Skettenis case BINOP_CONCAT:
2510b725ae77Skettenis case BINOP_LOGICAL_AND:
2511b725ae77Skettenis case BINOP_LOGICAL_OR:
2512b725ae77Skettenis case BINOP_BITWISE_AND:
2513b725ae77Skettenis case BINOP_BITWISE_IOR:
2514b725ae77Skettenis case BINOP_BITWISE_XOR:
2515b725ae77Skettenis
2516b725ae77Skettenis case BINOP_EQUAL:
2517b725ae77Skettenis case BINOP_NOTEQUAL:
2518b725ae77Skettenis case BINOP_LESS:
2519b725ae77Skettenis case BINOP_GTR:
2520b725ae77Skettenis case BINOP_LEQ:
2521b725ae77Skettenis case BINOP_GEQ:
2522b725ae77Skettenis
2523b725ae77Skettenis case BINOP_REPEAT:
2524b725ae77Skettenis case BINOP_SUBSCRIPT:
2525b725ae77Skettenis case BINOP_COMMA:
2526b725ae77Skettenis *pos += 1;
2527*11efff7fSkettenis nargs = 2;
2528b725ae77Skettenis break;
2529b725ae77Skettenis
2530b725ae77Skettenis case UNOP_NEG:
2531b725ae77Skettenis case UNOP_PLUS:
2532b725ae77Skettenis case UNOP_LOGICAL_NOT:
2533b725ae77Skettenis case UNOP_ABS:
2534b725ae77Skettenis case UNOP_IND:
2535b725ae77Skettenis *pos += 1;
2536*11efff7fSkettenis nargs = 1;
2537b725ae77Skettenis break;
2538b725ae77Skettenis
2539b725ae77Skettenis case OP_LONG:
2540b725ae77Skettenis case OP_DOUBLE:
2541b725ae77Skettenis case OP_VAR_VALUE:
2542b725ae77Skettenis *pos += 4;
2543b725ae77Skettenis break;
2544b725ae77Skettenis
2545b725ae77Skettenis case OP_TYPE:
2546b725ae77Skettenis case OP_BOOL:
2547b725ae77Skettenis case OP_LAST:
2548b725ae77Skettenis case OP_REGISTER:
2549b725ae77Skettenis case OP_INTERNALVAR:
2550b725ae77Skettenis *pos += 3;
2551b725ae77Skettenis break;
2552b725ae77Skettenis
2553b725ae77Skettenis case UNOP_MEMVAL:
2554b725ae77Skettenis *pos += 3;
2555b725ae77Skettenis nargs = 1;
2556b725ae77Skettenis break;
2557b725ae77Skettenis
2558b725ae77Skettenis case STRUCTOP_STRUCT:
2559b725ae77Skettenis *pos += 4 + BYTES_TO_EXP_ELEM (exp->elts[pc + 1].longconst + 1);
2560*11efff7fSkettenis nargs = 1;
2561b725ae77Skettenis break;
2562b725ae77Skettenis
2563*11efff7fSkettenis case OP_STRING:
2564*11efff7fSkettenis (*pos) += 3
2565*11efff7fSkettenis + BYTES_TO_EXP_ELEM (longest_to_int (exp->elts[pc + 1].longconst)
2566*11efff7fSkettenis + 1);
2567*11efff7fSkettenis break;
2568b725ae77Skettenis
2569b725ae77Skettenis case TERNOP_SLICE:
2570*11efff7fSkettenis case TERNOP_IN_RANGE:
2571b725ae77Skettenis *pos += 1;
2572b725ae77Skettenis nargs = 3;
2573b725ae77Skettenis break;
2574*11efff7fSkettenis
2575*11efff7fSkettenis case BINOP_IN_BOUNDS:
2576b725ae77Skettenis *pos += 3;
2577b725ae77Skettenis nargs = 2;
2578*11efff7fSkettenis break;
2579*11efff7fSkettenis
2580*11efff7fSkettenis default:
2581*11efff7fSkettenis error ("Unexpected operator during name resolution");
2582b725ae77Skettenis }
2583b725ae77Skettenis
2584*11efff7fSkettenis argvec = (struct value * *) alloca (sizeof (struct value *) * (nargs + 1));
2585b725ae77Skettenis for (i = 0; i < nargs; i += 1)
2586*11efff7fSkettenis argvec[i] = resolve_subexp (expp, pos, 1, NULL);
2587b725ae77Skettenis argvec[i] = NULL;
2588b725ae77Skettenis exp = *expp;
2589b725ae77Skettenis
2590b725ae77Skettenis /* Pass two: perform any resolution on principal operator. */
2591b725ae77Skettenis switch (op)
2592b725ae77Skettenis {
2593b725ae77Skettenis default:
2594b725ae77Skettenis break;
2595b725ae77Skettenis
2596*11efff7fSkettenis case OP_VAR_VALUE:
2597*11efff7fSkettenis if (SYMBOL_DOMAIN (exp->elts[pc + 2].symbol) == UNDEF_DOMAIN)
2598b725ae77Skettenis {
2599*11efff7fSkettenis struct ada_symbol_info *candidates;
2600b725ae77Skettenis int n_candidates;
2601b725ae77Skettenis
2602*11efff7fSkettenis n_candidates =
2603*11efff7fSkettenis ada_lookup_symbol_list (SYMBOL_LINKAGE_NAME
2604*11efff7fSkettenis (exp->elts[pc + 2].symbol),
2605*11efff7fSkettenis exp->elts[pc + 1].block, VAR_DOMAIN,
2606*11efff7fSkettenis &candidates);
2607b725ae77Skettenis
2608b725ae77Skettenis if (n_candidates > 1)
2609*11efff7fSkettenis {
2610b725ae77Skettenis /* Types tend to get re-introduced locally, so if there
2611b725ae77Skettenis are any local symbols that are not types, first filter
2612*11efff7fSkettenis out all types. */
2613b725ae77Skettenis int j;
2614b725ae77Skettenis for (j = 0; j < n_candidates; j += 1)
2615*11efff7fSkettenis switch (SYMBOL_CLASS (candidates[j].sym))
2616b725ae77Skettenis {
2617b725ae77Skettenis case LOC_REGISTER:
2618b725ae77Skettenis case LOC_ARG:
2619b725ae77Skettenis case LOC_REF_ARG:
2620b725ae77Skettenis case LOC_REGPARM:
2621b725ae77Skettenis case LOC_REGPARM_ADDR:
2622b725ae77Skettenis case LOC_LOCAL:
2623b725ae77Skettenis case LOC_LOCAL_ARG:
2624b725ae77Skettenis case LOC_BASEREG:
2625b725ae77Skettenis case LOC_BASEREG_ARG:
2626b725ae77Skettenis case LOC_COMPUTED:
2627b725ae77Skettenis case LOC_COMPUTED_ARG:
2628b725ae77Skettenis goto FoundNonType;
2629b725ae77Skettenis default:
2630b725ae77Skettenis break;
2631b725ae77Skettenis }
2632b725ae77Skettenis FoundNonType:
2633b725ae77Skettenis if (j < n_candidates)
2634b725ae77Skettenis {
2635b725ae77Skettenis j = 0;
2636b725ae77Skettenis while (j < n_candidates)
2637b725ae77Skettenis {
2638*11efff7fSkettenis if (SYMBOL_CLASS (candidates[j].sym) == LOC_TYPEDEF)
2639b725ae77Skettenis {
2640*11efff7fSkettenis candidates[j] = candidates[n_candidates - 1];
2641b725ae77Skettenis n_candidates -= 1;
2642b725ae77Skettenis }
2643b725ae77Skettenis else
2644b725ae77Skettenis j += 1;
2645b725ae77Skettenis }
2646b725ae77Skettenis }
2647b725ae77Skettenis }
2648b725ae77Skettenis
2649b725ae77Skettenis if (n_candidates == 0)
2650b725ae77Skettenis error ("No definition found for %s",
2651*11efff7fSkettenis SYMBOL_PRINT_NAME (exp->elts[pc + 2].symbol));
2652b725ae77Skettenis else if (n_candidates == 1)
2653b725ae77Skettenis i = 0;
2654b725ae77Skettenis else if (deprocedure_p
2655*11efff7fSkettenis && !is_nonfunction (candidates, n_candidates))
2656b725ae77Skettenis {
2657*11efff7fSkettenis i = ada_resolve_function
2658*11efff7fSkettenis (candidates, n_candidates, NULL, 0,
2659*11efff7fSkettenis SYMBOL_LINKAGE_NAME (exp->elts[pc + 2].symbol),
2660*11efff7fSkettenis context_type);
2661b725ae77Skettenis if (i < 0)
2662b725ae77Skettenis error ("Could not find a match for %s",
2663*11efff7fSkettenis SYMBOL_PRINT_NAME (exp->elts[pc + 2].symbol));
2664b725ae77Skettenis }
2665b725ae77Skettenis else
2666b725ae77Skettenis {
2667b725ae77Skettenis printf_filtered ("Multiple matches for %s\n",
2668*11efff7fSkettenis SYMBOL_PRINT_NAME (exp->elts[pc + 2].symbol));
2669*11efff7fSkettenis user_select_syms (candidates, n_candidates, 1);
2670b725ae77Skettenis i = 0;
2671b725ae77Skettenis }
2672b725ae77Skettenis
2673*11efff7fSkettenis exp->elts[pc + 1].block = candidates[i].block;
2674*11efff7fSkettenis exp->elts[pc + 2].symbol = candidates[i].sym;
2675*11efff7fSkettenis if (innermost_block == NULL
2676*11efff7fSkettenis || contained_in (candidates[i].block, innermost_block))
2677*11efff7fSkettenis innermost_block = candidates[i].block;
2678*11efff7fSkettenis }
2679b725ae77Skettenis
2680*11efff7fSkettenis if (deprocedure_p
2681*11efff7fSkettenis && (TYPE_CODE (SYMBOL_TYPE (exp->elts[pc + 2].symbol))
2682*11efff7fSkettenis == TYPE_CODE_FUNC))
2683b725ae77Skettenis {
2684b725ae77Skettenis replace_operator_with_call (expp, pc, 0, 0,
2685b725ae77Skettenis exp->elts[pc + 2].symbol,
2686b725ae77Skettenis exp->elts[pc + 1].block);
2687b725ae77Skettenis exp = *expp;
2688b725ae77Skettenis }
2689b725ae77Skettenis break;
2690b725ae77Skettenis
2691b725ae77Skettenis case OP_FUNCALL:
2692b725ae77Skettenis {
2693*11efff7fSkettenis if (exp->elts[pc + 3].opcode == OP_VAR_VALUE
2694*11efff7fSkettenis && SYMBOL_DOMAIN (exp->elts[pc + 5].symbol) == UNDEF_DOMAIN)
2695b725ae77Skettenis {
2696*11efff7fSkettenis struct ada_symbol_info *candidates;
2697b725ae77Skettenis int n_candidates;
2698b725ae77Skettenis
2699*11efff7fSkettenis n_candidates =
2700*11efff7fSkettenis ada_lookup_symbol_list (SYMBOL_LINKAGE_NAME
2701*11efff7fSkettenis (exp->elts[pc + 5].symbol),
2702*11efff7fSkettenis exp->elts[pc + 4].block, VAR_DOMAIN,
2703*11efff7fSkettenis &candidates);
2704b725ae77Skettenis if (n_candidates == 1)
2705b725ae77Skettenis i = 0;
2706b725ae77Skettenis else
2707b725ae77Skettenis {
2708*11efff7fSkettenis i = ada_resolve_function
2709*11efff7fSkettenis (candidates, n_candidates,
2710*11efff7fSkettenis argvec, nargs,
2711*11efff7fSkettenis SYMBOL_LINKAGE_NAME (exp->elts[pc + 5].symbol),
2712*11efff7fSkettenis context_type);
2713b725ae77Skettenis if (i < 0)
2714b725ae77Skettenis error ("Could not find a match for %s",
2715*11efff7fSkettenis SYMBOL_PRINT_NAME (exp->elts[pc + 5].symbol));
2716b725ae77Skettenis }
2717b725ae77Skettenis
2718*11efff7fSkettenis exp->elts[pc + 4].block = candidates[i].block;
2719*11efff7fSkettenis exp->elts[pc + 5].symbol = candidates[i].sym;
2720*11efff7fSkettenis if (innermost_block == NULL
2721*11efff7fSkettenis || contained_in (candidates[i].block, innermost_block))
2722*11efff7fSkettenis innermost_block = candidates[i].block;
2723*11efff7fSkettenis }
2724b725ae77Skettenis }
2725b725ae77Skettenis break;
2726b725ae77Skettenis case BINOP_ADD:
2727b725ae77Skettenis case BINOP_SUB:
2728b725ae77Skettenis case BINOP_MUL:
2729b725ae77Skettenis case BINOP_DIV:
2730b725ae77Skettenis case BINOP_REM:
2731b725ae77Skettenis case BINOP_MOD:
2732b725ae77Skettenis case BINOP_CONCAT:
2733b725ae77Skettenis case BINOP_BITWISE_AND:
2734b725ae77Skettenis case BINOP_BITWISE_IOR:
2735b725ae77Skettenis case BINOP_BITWISE_XOR:
2736b725ae77Skettenis case BINOP_EQUAL:
2737b725ae77Skettenis case BINOP_NOTEQUAL:
2738b725ae77Skettenis case BINOP_LESS:
2739b725ae77Skettenis case BINOP_GTR:
2740b725ae77Skettenis case BINOP_LEQ:
2741b725ae77Skettenis case BINOP_GEQ:
2742b725ae77Skettenis case BINOP_EXP:
2743b725ae77Skettenis case UNOP_NEG:
2744b725ae77Skettenis case UNOP_PLUS:
2745b725ae77Skettenis case UNOP_LOGICAL_NOT:
2746b725ae77Skettenis case UNOP_ABS:
2747b725ae77Skettenis if (possible_user_operator_p (op, argvec))
2748b725ae77Skettenis {
2749*11efff7fSkettenis struct ada_symbol_info *candidates;
2750b725ae77Skettenis int n_candidates;
2751b725ae77Skettenis
2752b725ae77Skettenis n_candidates =
2753*11efff7fSkettenis ada_lookup_symbol_list (ada_encode (ada_decoded_op_name (op)),
2754b725ae77Skettenis (struct block *) NULL, VAR_DOMAIN,
2755*11efff7fSkettenis &candidates);
2756*11efff7fSkettenis i = ada_resolve_function (candidates, n_candidates, argvec, nargs,
2757*11efff7fSkettenis ada_decoded_op_name (op), NULL);
2758b725ae77Skettenis if (i < 0)
2759b725ae77Skettenis break;
2760b725ae77Skettenis
2761b725ae77Skettenis replace_operator_with_call (expp, pc, nargs, 1,
2762*11efff7fSkettenis candidates[i].sym, candidates[i].block);
2763b725ae77Skettenis exp = *expp;
2764b725ae77Skettenis }
2765b725ae77Skettenis break;
2766*11efff7fSkettenis
2767*11efff7fSkettenis case OP_TYPE:
2768*11efff7fSkettenis return NULL;
2769b725ae77Skettenis }
2770b725ae77Skettenis
2771b725ae77Skettenis *pos = pc;
2772b725ae77Skettenis return evaluate_subexp_type (exp, pos);
2773b725ae77Skettenis }
2774b725ae77Skettenis
2775b725ae77Skettenis /* Return non-zero if formal type FTYPE matches actual type ATYPE. If
2776b725ae77Skettenis MAY_DEREF is non-zero, the formal may be a pointer and the actual
2777*11efff7fSkettenis a non-pointer. A type of 'void' (which is never a valid expression type)
2778*11efff7fSkettenis by convention matches anything. */
2779b725ae77Skettenis /* The term "match" here is rather loose. The match is heuristic and
2780b725ae77Skettenis liberal. FIXME: TOO liberal, in fact. */
2781b725ae77Skettenis
2782b725ae77Skettenis static int
ada_type_match(struct type * ftype,struct type * atype,int may_deref)2783b725ae77Skettenis ada_type_match (struct type *ftype, struct type *atype, int may_deref)
2784b725ae77Skettenis {
2785*11efff7fSkettenis ftype = ada_check_typedef (ftype);
2786*11efff7fSkettenis atype = ada_check_typedef (atype);
2787b725ae77Skettenis
2788b725ae77Skettenis if (TYPE_CODE (ftype) == TYPE_CODE_REF)
2789b725ae77Skettenis ftype = TYPE_TARGET_TYPE (ftype);
2790b725ae77Skettenis if (TYPE_CODE (atype) == TYPE_CODE_REF)
2791b725ae77Skettenis atype = TYPE_TARGET_TYPE (atype);
2792b725ae77Skettenis
2793b725ae77Skettenis if (TYPE_CODE (ftype) == TYPE_CODE_VOID
2794b725ae77Skettenis || TYPE_CODE (atype) == TYPE_CODE_VOID)
2795b725ae77Skettenis return 1;
2796b725ae77Skettenis
2797b725ae77Skettenis switch (TYPE_CODE (ftype))
2798b725ae77Skettenis {
2799b725ae77Skettenis default:
2800b725ae77Skettenis return 1;
2801b725ae77Skettenis case TYPE_CODE_PTR:
2802b725ae77Skettenis if (TYPE_CODE (atype) == TYPE_CODE_PTR)
2803b725ae77Skettenis return ada_type_match (TYPE_TARGET_TYPE (ftype),
2804b725ae77Skettenis TYPE_TARGET_TYPE (atype), 0);
2805b725ae77Skettenis else
2806*11efff7fSkettenis return (may_deref
2807*11efff7fSkettenis && ada_type_match (TYPE_TARGET_TYPE (ftype), atype, 0));
2808b725ae77Skettenis case TYPE_CODE_INT:
2809b725ae77Skettenis case TYPE_CODE_ENUM:
2810b725ae77Skettenis case TYPE_CODE_RANGE:
2811b725ae77Skettenis switch (TYPE_CODE (atype))
2812b725ae77Skettenis {
2813b725ae77Skettenis case TYPE_CODE_INT:
2814b725ae77Skettenis case TYPE_CODE_ENUM:
2815b725ae77Skettenis case TYPE_CODE_RANGE:
2816b725ae77Skettenis return 1;
2817b725ae77Skettenis default:
2818b725ae77Skettenis return 0;
2819b725ae77Skettenis }
2820b725ae77Skettenis
2821b725ae77Skettenis case TYPE_CODE_ARRAY:
2822b725ae77Skettenis return (TYPE_CODE (atype) == TYPE_CODE_ARRAY
2823*11efff7fSkettenis || ada_is_array_descriptor_type (atype));
2824b725ae77Skettenis
2825b725ae77Skettenis case TYPE_CODE_STRUCT:
2826*11efff7fSkettenis if (ada_is_array_descriptor_type (ftype))
2827b725ae77Skettenis return (TYPE_CODE (atype) == TYPE_CODE_ARRAY
2828*11efff7fSkettenis || ada_is_array_descriptor_type (atype));
2829b725ae77Skettenis else
2830b725ae77Skettenis return (TYPE_CODE (atype) == TYPE_CODE_STRUCT
2831*11efff7fSkettenis && !ada_is_array_descriptor_type (atype));
2832b725ae77Skettenis
2833b725ae77Skettenis case TYPE_CODE_UNION:
2834b725ae77Skettenis case TYPE_CODE_FLT:
2835b725ae77Skettenis return (TYPE_CODE (atype) == TYPE_CODE (ftype));
2836b725ae77Skettenis }
2837b725ae77Skettenis }
2838b725ae77Skettenis
2839b725ae77Skettenis /* Return non-zero if the formals of FUNC "sufficiently match" the
2840b725ae77Skettenis vector of actual argument types ACTUALS of size N_ACTUALS. FUNC
2841b725ae77Skettenis may also be an enumeral, in which case it is treated as a 0-
2842b725ae77Skettenis argument function. */
2843b725ae77Skettenis
2844b725ae77Skettenis static int
ada_args_match(struct symbol * func,struct value ** actuals,int n_actuals)2845b725ae77Skettenis ada_args_match (struct symbol *func, struct value **actuals, int n_actuals)
2846b725ae77Skettenis {
2847b725ae77Skettenis int i;
2848b725ae77Skettenis struct type *func_type = SYMBOL_TYPE (func);
2849b725ae77Skettenis
2850*11efff7fSkettenis if (SYMBOL_CLASS (func) == LOC_CONST
2851*11efff7fSkettenis && TYPE_CODE (func_type) == TYPE_CODE_ENUM)
2852b725ae77Skettenis return (n_actuals == 0);
2853b725ae77Skettenis else if (func_type == NULL || TYPE_CODE (func_type) != TYPE_CODE_FUNC)
2854b725ae77Skettenis return 0;
2855b725ae77Skettenis
2856b725ae77Skettenis if (TYPE_NFIELDS (func_type) != n_actuals)
2857b725ae77Skettenis return 0;
2858b725ae77Skettenis
2859b725ae77Skettenis for (i = 0; i < n_actuals; i += 1)
2860b725ae77Skettenis {
2861*11efff7fSkettenis if (actuals[i] == NULL)
2862b725ae77Skettenis return 0;
2863*11efff7fSkettenis else
2864*11efff7fSkettenis {
2865*11efff7fSkettenis struct type *ftype = ada_check_typedef (TYPE_FIELD_TYPE (func_type, i));
2866*11efff7fSkettenis struct type *atype = ada_check_typedef (VALUE_TYPE (actuals[i]));
2867*11efff7fSkettenis
2868*11efff7fSkettenis if (!ada_type_match (ftype, atype, 1))
2869*11efff7fSkettenis return 0;
2870*11efff7fSkettenis }
2871b725ae77Skettenis }
2872b725ae77Skettenis return 1;
2873b725ae77Skettenis }
2874b725ae77Skettenis
2875b725ae77Skettenis /* False iff function type FUNC_TYPE definitely does not produce a value
2876b725ae77Skettenis compatible with type CONTEXT_TYPE. Conservatively returns 1 if
2877b725ae77Skettenis FUNC_TYPE is not a valid function type with a non-null return type
2878b725ae77Skettenis or an enumerated type. A null CONTEXT_TYPE indicates any non-void type. */
2879b725ae77Skettenis
2880b725ae77Skettenis static int
return_match(struct type * func_type,struct type * context_type)2881b725ae77Skettenis return_match (struct type *func_type, struct type *context_type)
2882b725ae77Skettenis {
2883b725ae77Skettenis struct type *return_type;
2884b725ae77Skettenis
2885b725ae77Skettenis if (func_type == NULL)
2886b725ae77Skettenis return 1;
2887b725ae77Skettenis
2888*11efff7fSkettenis if (TYPE_CODE (func_type) == TYPE_CODE_FUNC)
2889b725ae77Skettenis return_type = base_type (TYPE_TARGET_TYPE (func_type));
2890b725ae77Skettenis else
2891*11efff7fSkettenis return_type = base_type (func_type);
2892b725ae77Skettenis if (return_type == NULL)
2893b725ae77Skettenis return 1;
2894b725ae77Skettenis
2895*11efff7fSkettenis context_type = base_type (context_type);
2896b725ae77Skettenis
2897b725ae77Skettenis if (TYPE_CODE (return_type) == TYPE_CODE_ENUM)
2898b725ae77Skettenis return context_type == NULL || return_type == context_type;
2899b725ae77Skettenis else if (context_type == NULL)
2900b725ae77Skettenis return TYPE_CODE (return_type) != TYPE_CODE_VOID;
2901b725ae77Skettenis else
2902b725ae77Skettenis return TYPE_CODE (return_type) == TYPE_CODE (context_type);
2903b725ae77Skettenis }
2904b725ae77Skettenis
2905b725ae77Skettenis
2906*11efff7fSkettenis /* Returns the index in SYMS[0..NSYMS-1] that contains the symbol for the
2907b725ae77Skettenis function (if any) that matches the types of the NARGS arguments in
2908*11efff7fSkettenis ARGS. If CONTEXT_TYPE is non-null and there is at least one match
2909*11efff7fSkettenis that returns that type, then eliminate matches that don't. If
2910*11efff7fSkettenis CONTEXT_TYPE is void and there is at least one match that does not
2911*11efff7fSkettenis return void, eliminate all matches that do.
2912*11efff7fSkettenis
2913b725ae77Skettenis Asks the user if there is more than one match remaining. Returns -1
2914b725ae77Skettenis if there is no such symbol or none is selected. NAME is used
2915b725ae77Skettenis solely for messages. May re-arrange and modify SYMS in
2916*11efff7fSkettenis the process; the index returned is for the modified vector. */
2917b725ae77Skettenis
2918*11efff7fSkettenis static int
ada_resolve_function(struct ada_symbol_info syms[],int nsyms,struct value ** args,int nargs,const char * name,struct type * context_type)2919*11efff7fSkettenis ada_resolve_function (struct ada_symbol_info syms[],
2920b725ae77Skettenis int nsyms, struct value **args, int nargs,
2921b725ae77Skettenis const char *name, struct type *context_type)
2922b725ae77Skettenis {
2923b725ae77Skettenis int k;
2924b725ae77Skettenis int m; /* Number of hits */
2925b725ae77Skettenis struct type *fallback;
2926b725ae77Skettenis struct type *return_type;
2927b725ae77Skettenis
2928b725ae77Skettenis return_type = context_type;
2929b725ae77Skettenis if (context_type == NULL)
2930b725ae77Skettenis fallback = builtin_type_void;
2931b725ae77Skettenis else
2932b725ae77Skettenis fallback = NULL;
2933b725ae77Skettenis
2934b725ae77Skettenis m = 0;
2935b725ae77Skettenis while (1)
2936b725ae77Skettenis {
2937b725ae77Skettenis for (k = 0; k < nsyms; k += 1)
2938b725ae77Skettenis {
2939*11efff7fSkettenis struct type *type = ada_check_typedef (SYMBOL_TYPE (syms[k].sym));
2940b725ae77Skettenis
2941*11efff7fSkettenis if (ada_args_match (syms[k].sym, args, nargs)
2942*11efff7fSkettenis && return_match (type, return_type))
2943b725ae77Skettenis {
2944b725ae77Skettenis syms[m] = syms[k];
2945b725ae77Skettenis m += 1;
2946b725ae77Skettenis }
2947b725ae77Skettenis }
2948b725ae77Skettenis if (m > 0 || return_type == fallback)
2949b725ae77Skettenis break;
2950b725ae77Skettenis else
2951b725ae77Skettenis return_type = fallback;
2952b725ae77Skettenis }
2953b725ae77Skettenis
2954b725ae77Skettenis if (m == 0)
2955b725ae77Skettenis return -1;
2956b725ae77Skettenis else if (m > 1)
2957b725ae77Skettenis {
2958b725ae77Skettenis printf_filtered ("Multiple matches for %s\n", name);
2959*11efff7fSkettenis user_select_syms (syms, m, 1);
2960b725ae77Skettenis return 0;
2961b725ae77Skettenis }
2962b725ae77Skettenis return 0;
2963b725ae77Skettenis }
2964b725ae77Skettenis
2965*11efff7fSkettenis /* Returns true (non-zero) iff decoded name N0 should appear before N1
2966*11efff7fSkettenis in a listing of choices during disambiguation (see sort_choices, below).
2967*11efff7fSkettenis The idea is that overloadings of a subprogram name from the
2968*11efff7fSkettenis same package should sort in their source order. We settle for ordering
2969*11efff7fSkettenis such symbols by their trailing number (__N or $N). */
2970*11efff7fSkettenis
2971b725ae77Skettenis static int
encoded_ordered_before(char * N0,char * N1)2972*11efff7fSkettenis encoded_ordered_before (char *N0, char *N1)
2973b725ae77Skettenis {
2974b725ae77Skettenis if (N1 == NULL)
2975b725ae77Skettenis return 0;
2976b725ae77Skettenis else if (N0 == NULL)
2977b725ae77Skettenis return 1;
2978b725ae77Skettenis else
2979b725ae77Skettenis {
2980b725ae77Skettenis int k0, k1;
2981b725ae77Skettenis for (k0 = strlen (N0) - 1; k0 > 0 && isdigit (N0[k0]); k0 -= 1)
2982b725ae77Skettenis ;
2983b725ae77Skettenis for (k1 = strlen (N1) - 1; k1 > 0 && isdigit (N1[k1]); k1 -= 1)
2984b725ae77Skettenis ;
2985b725ae77Skettenis if ((N0[k0] == '_' || N0[k0] == '$') && N0[k0 + 1] != '\000'
2986b725ae77Skettenis && (N1[k1] == '_' || N1[k1] == '$') && N1[k1 + 1] != '\000')
2987b725ae77Skettenis {
2988b725ae77Skettenis int n0, n1;
2989b725ae77Skettenis n0 = k0;
2990b725ae77Skettenis while (N0[n0] == '_' && n0 > 0 && N0[n0 - 1] == '_')
2991b725ae77Skettenis n0 -= 1;
2992b725ae77Skettenis n1 = k1;
2993b725ae77Skettenis while (N1[n1] == '_' && n1 > 0 && N1[n1 - 1] == '_')
2994b725ae77Skettenis n1 -= 1;
2995*11efff7fSkettenis if (n0 == n1 && strncmp (N0, N1, n0) == 0)
2996b725ae77Skettenis return (atoi (N0 + k0 + 1) < atoi (N1 + k1 + 1));
2997b725ae77Skettenis }
2998b725ae77Skettenis return (strcmp (N0, N1) < 0);
2999b725ae77Skettenis }
3000b725ae77Skettenis }
3001b725ae77Skettenis
3002*11efff7fSkettenis /* Sort SYMS[0..NSYMS-1] to put the choices in a canonical order by the
3003*11efff7fSkettenis encoded names. */
3004*11efff7fSkettenis
3005b725ae77Skettenis static void
sort_choices(struct ada_symbol_info syms[],int nsyms)3006*11efff7fSkettenis sort_choices (struct ada_symbol_info syms[], int nsyms)
3007b725ae77Skettenis {
3008*11efff7fSkettenis int i;
3009b725ae77Skettenis for (i = 1; i < nsyms; i += 1)
3010b725ae77Skettenis {
3011*11efff7fSkettenis struct ada_symbol_info sym = syms[i];
3012b725ae77Skettenis int j;
3013b725ae77Skettenis
3014b725ae77Skettenis for (j = i - 1; j >= 0; j -= 1)
3015b725ae77Skettenis {
3016*11efff7fSkettenis if (encoded_ordered_before (SYMBOL_LINKAGE_NAME (syms[j].sym),
3017*11efff7fSkettenis SYMBOL_LINKAGE_NAME (sym.sym)))
3018b725ae77Skettenis break;
3019b725ae77Skettenis syms[j + 1] = syms[j];
3020b725ae77Skettenis }
3021b725ae77Skettenis syms[j + 1] = sym;
3022b725ae77Skettenis }
3023b725ae77Skettenis }
3024b725ae77Skettenis
3025*11efff7fSkettenis /* Given a list of NSYMS symbols in SYMS, select up to MAX_RESULTS>0
3026*11efff7fSkettenis by asking the user (if necessary), returning the number selected,
3027*11efff7fSkettenis and setting the first elements of SYMS items. Error if no symbols
3028*11efff7fSkettenis selected. */
3029b725ae77Skettenis
3030b725ae77Skettenis /* NOTE: Adapted from decode_line_2 in symtab.c, with which it ought
3031b725ae77Skettenis to be re-integrated one of these days. */
3032b725ae77Skettenis
3033b725ae77Skettenis int
user_select_syms(struct ada_symbol_info * syms,int nsyms,int max_results)3034*11efff7fSkettenis user_select_syms (struct ada_symbol_info *syms, int nsyms, int max_results)
3035b725ae77Skettenis {
3036b725ae77Skettenis int i;
3037b725ae77Skettenis int *chosen = (int *) alloca (sizeof (int) * nsyms);
3038b725ae77Skettenis int n_chosen;
3039b725ae77Skettenis int first_choice = (max_results == 1) ? 1 : 2;
3040b725ae77Skettenis
3041b725ae77Skettenis if (max_results < 1)
3042b725ae77Skettenis error ("Request to select 0 symbols!");
3043b725ae77Skettenis if (nsyms <= 1)
3044b725ae77Skettenis return nsyms;
3045b725ae77Skettenis
3046b725ae77Skettenis printf_unfiltered ("[0] cancel\n");
3047b725ae77Skettenis if (max_results > 1)
3048b725ae77Skettenis printf_unfiltered ("[1] all\n");
3049b725ae77Skettenis
3050*11efff7fSkettenis sort_choices (syms, nsyms);
3051b725ae77Skettenis
3052b725ae77Skettenis for (i = 0; i < nsyms; i += 1)
3053b725ae77Skettenis {
3054*11efff7fSkettenis if (syms[i].sym == NULL)
3055b725ae77Skettenis continue;
3056b725ae77Skettenis
3057*11efff7fSkettenis if (SYMBOL_CLASS (syms[i].sym) == LOC_BLOCK)
3058b725ae77Skettenis {
3059*11efff7fSkettenis struct symtab_and_line sal =
3060*11efff7fSkettenis find_function_start_sal (syms[i].sym, 1);
3061*11efff7fSkettenis printf_unfiltered ("[%d] %s at %s:%d\n", i + first_choice,
3062*11efff7fSkettenis SYMBOL_PRINT_NAME (syms[i].sym),
3063*11efff7fSkettenis (sal.symtab == NULL
3064b725ae77Skettenis ? "<no source file available>"
3065*11efff7fSkettenis : sal.symtab->filename), sal.line);
3066b725ae77Skettenis continue;
3067b725ae77Skettenis }
3068b725ae77Skettenis else
3069b725ae77Skettenis {
3070b725ae77Skettenis int is_enumeral =
3071*11efff7fSkettenis (SYMBOL_CLASS (syms[i].sym) == LOC_CONST
3072*11efff7fSkettenis && SYMBOL_TYPE (syms[i].sym) != NULL
3073*11efff7fSkettenis && TYPE_CODE (SYMBOL_TYPE (syms[i].sym)) == TYPE_CODE_ENUM);
3074*11efff7fSkettenis struct symtab *symtab = symtab_for_sym (syms[i].sym);
3075b725ae77Skettenis
3076*11efff7fSkettenis if (SYMBOL_LINE (syms[i].sym) != 0 && symtab != NULL)
3077b725ae77Skettenis printf_unfiltered ("[%d] %s at %s:%d\n",
3078b725ae77Skettenis i + first_choice,
3079*11efff7fSkettenis SYMBOL_PRINT_NAME (syms[i].sym),
3080*11efff7fSkettenis symtab->filename, SYMBOL_LINE (syms[i].sym));
3081*11efff7fSkettenis else if (is_enumeral
3082*11efff7fSkettenis && TYPE_NAME (SYMBOL_TYPE (syms[i].sym)) != NULL)
3083b725ae77Skettenis {
3084b725ae77Skettenis printf_unfiltered ("[%d] ", i + first_choice);
3085*11efff7fSkettenis ada_print_type (SYMBOL_TYPE (syms[i].sym), NULL,
3086*11efff7fSkettenis gdb_stdout, -1, 0);
3087b725ae77Skettenis printf_unfiltered ("'(%s) (enumeral)\n",
3088*11efff7fSkettenis SYMBOL_PRINT_NAME (syms[i].sym));
3089b725ae77Skettenis }
3090b725ae77Skettenis else if (symtab != NULL)
3091b725ae77Skettenis printf_unfiltered (is_enumeral
3092b725ae77Skettenis ? "[%d] %s in %s (enumeral)\n"
3093b725ae77Skettenis : "[%d] %s at %s:?\n",
3094b725ae77Skettenis i + first_choice,
3095*11efff7fSkettenis SYMBOL_PRINT_NAME (syms[i].sym),
3096b725ae77Skettenis symtab->filename);
3097b725ae77Skettenis else
3098b725ae77Skettenis printf_unfiltered (is_enumeral
3099b725ae77Skettenis ? "[%d] %s (enumeral)\n"
3100b725ae77Skettenis : "[%d] %s at ?\n",
3101b725ae77Skettenis i + first_choice,
3102*11efff7fSkettenis SYMBOL_PRINT_NAME (syms[i].sym));
3103b725ae77Skettenis }
3104b725ae77Skettenis }
3105b725ae77Skettenis
3106b725ae77Skettenis n_chosen = get_selections (chosen, nsyms, max_results, max_results > 1,
3107b725ae77Skettenis "overload-choice");
3108b725ae77Skettenis
3109b725ae77Skettenis for (i = 0; i < n_chosen; i += 1)
3110b725ae77Skettenis syms[i] = syms[chosen[i]];
3111b725ae77Skettenis
3112b725ae77Skettenis return n_chosen;
3113b725ae77Skettenis }
3114b725ae77Skettenis
3115b725ae77Skettenis /* Read and validate a set of numeric choices from the user in the
3116b725ae77Skettenis range 0 .. N_CHOICES-1. Place the results in increasing
3117b725ae77Skettenis order in CHOICES[0 .. N-1], and return N.
3118b725ae77Skettenis
3119b725ae77Skettenis The user types choices as a sequence of numbers on one line
3120b725ae77Skettenis separated by blanks, encoding them as follows:
3121b725ae77Skettenis
3122b725ae77Skettenis + A choice of 0 means to cancel the selection, throwing an error.
3123b725ae77Skettenis + If IS_ALL_CHOICE, a choice of 1 selects the entire set 0 .. N_CHOICES-1.
3124b725ae77Skettenis + The user chooses k by typing k+IS_ALL_CHOICE+1.
3125b725ae77Skettenis
3126b725ae77Skettenis The user is not allowed to choose more than MAX_RESULTS values.
3127b725ae77Skettenis
3128b725ae77Skettenis ANNOTATION_SUFFIX, if present, is used to annotate the input
3129b725ae77Skettenis prompts (for use with the -f switch). */
3130b725ae77Skettenis
3131b725ae77Skettenis int
get_selections(int * choices,int n_choices,int max_results,int is_all_choice,char * annotation_suffix)3132b725ae77Skettenis get_selections (int *choices, int n_choices, int max_results,
3133b725ae77Skettenis int is_all_choice, char *annotation_suffix)
3134b725ae77Skettenis {
3135b725ae77Skettenis char *args;
3136b725ae77Skettenis const char *prompt;
3137b725ae77Skettenis int n_chosen;
3138b725ae77Skettenis int first_choice = is_all_choice ? 2 : 1;
3139b725ae77Skettenis
3140b725ae77Skettenis prompt = getenv ("PS2");
3141b725ae77Skettenis if (prompt == NULL)
3142b725ae77Skettenis prompt = ">";
3143b725ae77Skettenis
3144b725ae77Skettenis printf_unfiltered ("%s ", prompt);
3145b725ae77Skettenis gdb_flush (gdb_stdout);
3146b725ae77Skettenis
3147b725ae77Skettenis args = command_line_input ((char *) NULL, 0, annotation_suffix);
3148b725ae77Skettenis
3149b725ae77Skettenis if (args == NULL)
3150b725ae77Skettenis error_no_arg ("one or more choice numbers");
3151b725ae77Skettenis
3152b725ae77Skettenis n_chosen = 0;
3153b725ae77Skettenis
3154b725ae77Skettenis /* Set choices[0 .. n_chosen-1] to the users' choices in ascending
3155b725ae77Skettenis order, as given in args. Choices are validated. */
3156b725ae77Skettenis while (1)
3157b725ae77Skettenis {
3158b725ae77Skettenis char *args2;
3159b725ae77Skettenis int choice, j;
3160b725ae77Skettenis
3161b725ae77Skettenis while (isspace (*args))
3162b725ae77Skettenis args += 1;
3163b725ae77Skettenis if (*args == '\0' && n_chosen == 0)
3164b725ae77Skettenis error_no_arg ("one or more choice numbers");
3165b725ae77Skettenis else if (*args == '\0')
3166b725ae77Skettenis break;
3167b725ae77Skettenis
3168b725ae77Skettenis choice = strtol (args, &args2, 10);
3169b725ae77Skettenis if (args == args2 || choice < 0
3170b725ae77Skettenis || choice > n_choices + first_choice - 1)
3171b725ae77Skettenis error ("Argument must be choice number");
3172b725ae77Skettenis args = args2;
3173b725ae77Skettenis
3174b725ae77Skettenis if (choice == 0)
3175b725ae77Skettenis error ("cancelled");
3176b725ae77Skettenis
3177b725ae77Skettenis if (choice < first_choice)
3178b725ae77Skettenis {
3179b725ae77Skettenis n_chosen = n_choices;
3180b725ae77Skettenis for (j = 0; j < n_choices; j += 1)
3181b725ae77Skettenis choices[j] = j;
3182b725ae77Skettenis break;
3183b725ae77Skettenis }
3184b725ae77Skettenis choice -= first_choice;
3185b725ae77Skettenis
3186b725ae77Skettenis for (j = n_chosen - 1; j >= 0 && choice < choices[j]; j -= 1)
3187b725ae77Skettenis {
3188b725ae77Skettenis }
3189b725ae77Skettenis
3190b725ae77Skettenis if (j < 0 || choice != choices[j])
3191b725ae77Skettenis {
3192b725ae77Skettenis int k;
3193b725ae77Skettenis for (k = n_chosen - 1; k > j; k -= 1)
3194b725ae77Skettenis choices[k + 1] = choices[k];
3195b725ae77Skettenis choices[j + 1] = choice;
3196b725ae77Skettenis n_chosen += 1;
3197b725ae77Skettenis }
3198b725ae77Skettenis }
3199b725ae77Skettenis
3200b725ae77Skettenis if (n_chosen > max_results)
3201b725ae77Skettenis error ("Select no more than %d of the above", max_results);
3202b725ae77Skettenis
3203b725ae77Skettenis return n_chosen;
3204b725ae77Skettenis }
3205b725ae77Skettenis
3206*11efff7fSkettenis /* Replace the operator of length OPLEN at position PC in *EXPP with a call
3207*11efff7fSkettenis on the function identified by SYM and BLOCK, and taking NARGS
3208*11efff7fSkettenis arguments. Update *EXPP as needed to hold more space. */
3209b725ae77Skettenis
3210b725ae77Skettenis static void
replace_operator_with_call(struct expression ** expp,int pc,int nargs,int oplen,struct symbol * sym,struct block * block)3211b725ae77Skettenis replace_operator_with_call (struct expression **expp, int pc, int nargs,
3212b725ae77Skettenis int oplen, struct symbol *sym,
3213b725ae77Skettenis struct block *block)
3214b725ae77Skettenis {
3215b725ae77Skettenis /* A new expression, with 6 more elements (3 for funcall, 4 for function
3216b725ae77Skettenis symbol, -oplen for operator being replaced). */
3217b725ae77Skettenis struct expression *newexp = (struct expression *)
3218b725ae77Skettenis xmalloc (sizeof (struct expression)
3219b725ae77Skettenis + EXP_ELEM_TO_BYTES ((*expp)->nelts + 7 - oplen));
3220b725ae77Skettenis struct expression *exp = *expp;
3221b725ae77Skettenis
3222b725ae77Skettenis newexp->nelts = exp->nelts + 7 - oplen;
3223b725ae77Skettenis newexp->language_defn = exp->language_defn;
3224b725ae77Skettenis memcpy (newexp->elts, exp->elts, EXP_ELEM_TO_BYTES (pc));
3225b725ae77Skettenis memcpy (newexp->elts + pc + 7, exp->elts + pc + oplen,
3226b725ae77Skettenis EXP_ELEM_TO_BYTES (exp->nelts - pc - oplen));
3227b725ae77Skettenis
3228b725ae77Skettenis newexp->elts[pc].opcode = newexp->elts[pc + 2].opcode = OP_FUNCALL;
3229b725ae77Skettenis newexp->elts[pc + 1].longconst = (LONGEST) nargs;
3230b725ae77Skettenis
3231b725ae77Skettenis newexp->elts[pc + 3].opcode = newexp->elts[pc + 6].opcode = OP_VAR_VALUE;
3232b725ae77Skettenis newexp->elts[pc + 4].block = block;
3233b725ae77Skettenis newexp->elts[pc + 5].symbol = sym;
3234b725ae77Skettenis
3235b725ae77Skettenis *expp = newexp;
3236b725ae77Skettenis xfree (exp);
3237b725ae77Skettenis }
3238b725ae77Skettenis
3239b725ae77Skettenis /* Type-class predicates */
3240b725ae77Skettenis
3241*11efff7fSkettenis /* True iff TYPE is numeric (i.e., an INT, RANGE (of numeric type),
3242*11efff7fSkettenis or FLOAT). */
3243b725ae77Skettenis
3244b725ae77Skettenis static int
numeric_type_p(struct type * type)3245b725ae77Skettenis numeric_type_p (struct type *type)
3246b725ae77Skettenis {
3247b725ae77Skettenis if (type == NULL)
3248b725ae77Skettenis return 0;
3249b725ae77Skettenis else
3250b725ae77Skettenis {
3251b725ae77Skettenis switch (TYPE_CODE (type))
3252b725ae77Skettenis {
3253b725ae77Skettenis case TYPE_CODE_INT:
3254b725ae77Skettenis case TYPE_CODE_FLT:
3255b725ae77Skettenis return 1;
3256b725ae77Skettenis case TYPE_CODE_RANGE:
3257b725ae77Skettenis return (type == TYPE_TARGET_TYPE (type)
3258b725ae77Skettenis || numeric_type_p (TYPE_TARGET_TYPE (type)));
3259b725ae77Skettenis default:
3260b725ae77Skettenis return 0;
3261b725ae77Skettenis }
3262b725ae77Skettenis }
3263b725ae77Skettenis }
3264b725ae77Skettenis
3265b725ae77Skettenis /* True iff TYPE is integral (an INT or RANGE of INTs). */
3266b725ae77Skettenis
3267b725ae77Skettenis static int
integer_type_p(struct type * type)3268b725ae77Skettenis integer_type_p (struct type *type)
3269b725ae77Skettenis {
3270b725ae77Skettenis if (type == NULL)
3271b725ae77Skettenis return 0;
3272b725ae77Skettenis else
3273b725ae77Skettenis {
3274b725ae77Skettenis switch (TYPE_CODE (type))
3275b725ae77Skettenis {
3276b725ae77Skettenis case TYPE_CODE_INT:
3277b725ae77Skettenis return 1;
3278b725ae77Skettenis case TYPE_CODE_RANGE:
3279b725ae77Skettenis return (type == TYPE_TARGET_TYPE (type)
3280b725ae77Skettenis || integer_type_p (TYPE_TARGET_TYPE (type)));
3281b725ae77Skettenis default:
3282b725ae77Skettenis return 0;
3283b725ae77Skettenis }
3284b725ae77Skettenis }
3285b725ae77Skettenis }
3286b725ae77Skettenis
3287b725ae77Skettenis /* True iff TYPE is scalar (INT, RANGE, FLOAT, ENUM). */
3288b725ae77Skettenis
3289b725ae77Skettenis static int
scalar_type_p(struct type * type)3290b725ae77Skettenis scalar_type_p (struct type *type)
3291b725ae77Skettenis {
3292b725ae77Skettenis if (type == NULL)
3293b725ae77Skettenis return 0;
3294b725ae77Skettenis else
3295b725ae77Skettenis {
3296b725ae77Skettenis switch (TYPE_CODE (type))
3297b725ae77Skettenis {
3298b725ae77Skettenis case TYPE_CODE_INT:
3299b725ae77Skettenis case TYPE_CODE_RANGE:
3300b725ae77Skettenis case TYPE_CODE_ENUM:
3301b725ae77Skettenis case TYPE_CODE_FLT:
3302b725ae77Skettenis return 1;
3303b725ae77Skettenis default:
3304b725ae77Skettenis return 0;
3305b725ae77Skettenis }
3306b725ae77Skettenis }
3307b725ae77Skettenis }
3308b725ae77Skettenis
3309b725ae77Skettenis /* True iff TYPE is discrete (INT, RANGE, ENUM). */
3310b725ae77Skettenis
3311b725ae77Skettenis static int
discrete_type_p(struct type * type)3312b725ae77Skettenis discrete_type_p (struct type *type)
3313b725ae77Skettenis {
3314b725ae77Skettenis if (type == NULL)
3315b725ae77Skettenis return 0;
3316b725ae77Skettenis else
3317b725ae77Skettenis {
3318b725ae77Skettenis switch (TYPE_CODE (type))
3319b725ae77Skettenis {
3320b725ae77Skettenis case TYPE_CODE_INT:
3321b725ae77Skettenis case TYPE_CODE_RANGE:
3322b725ae77Skettenis case TYPE_CODE_ENUM:
3323b725ae77Skettenis return 1;
3324b725ae77Skettenis default:
3325b725ae77Skettenis return 0;
3326b725ae77Skettenis }
3327b725ae77Skettenis }
3328b725ae77Skettenis }
3329b725ae77Skettenis
3330*11efff7fSkettenis /* Returns non-zero if OP with operands in the vector ARGS could be
3331b725ae77Skettenis a user-defined function. Errs on the side of pre-defined operators
3332b725ae77Skettenis (i.e., result 0). */
3333b725ae77Skettenis
3334b725ae77Skettenis static int
possible_user_operator_p(enum exp_opcode op,struct value * args[])3335b725ae77Skettenis possible_user_operator_p (enum exp_opcode op, struct value *args[])
3336b725ae77Skettenis {
3337*11efff7fSkettenis struct type *type0 =
3338*11efff7fSkettenis (args[0] == NULL) ? NULL : ada_check_typedef (VALUE_TYPE (args[0]));
3339b725ae77Skettenis struct type *type1 =
3340*11efff7fSkettenis (args[1] == NULL) ? NULL : ada_check_typedef (VALUE_TYPE (args[1]));
3341*11efff7fSkettenis
3342*11efff7fSkettenis if (type0 == NULL)
3343*11efff7fSkettenis return 0;
3344b725ae77Skettenis
3345b725ae77Skettenis switch (op)
3346b725ae77Skettenis {
3347b725ae77Skettenis default:
3348b725ae77Skettenis return 0;
3349b725ae77Skettenis
3350b725ae77Skettenis case BINOP_ADD:
3351b725ae77Skettenis case BINOP_SUB:
3352b725ae77Skettenis case BINOP_MUL:
3353b725ae77Skettenis case BINOP_DIV:
3354b725ae77Skettenis return (!(numeric_type_p (type0) && numeric_type_p (type1)));
3355b725ae77Skettenis
3356b725ae77Skettenis case BINOP_REM:
3357b725ae77Skettenis case BINOP_MOD:
3358b725ae77Skettenis case BINOP_BITWISE_AND:
3359b725ae77Skettenis case BINOP_BITWISE_IOR:
3360b725ae77Skettenis case BINOP_BITWISE_XOR:
3361b725ae77Skettenis return (!(integer_type_p (type0) && integer_type_p (type1)));
3362b725ae77Skettenis
3363b725ae77Skettenis case BINOP_EQUAL:
3364b725ae77Skettenis case BINOP_NOTEQUAL:
3365b725ae77Skettenis case BINOP_LESS:
3366b725ae77Skettenis case BINOP_GTR:
3367b725ae77Skettenis case BINOP_LEQ:
3368b725ae77Skettenis case BINOP_GEQ:
3369b725ae77Skettenis return (!(scalar_type_p (type0) && scalar_type_p (type1)));
3370b725ae77Skettenis
3371b725ae77Skettenis case BINOP_CONCAT:
3372*11efff7fSkettenis return
3373*11efff7fSkettenis ((TYPE_CODE (type0) != TYPE_CODE_ARRAY
3374*11efff7fSkettenis && (TYPE_CODE (type0) != TYPE_CODE_PTR
3375*11efff7fSkettenis || TYPE_CODE (TYPE_TARGET_TYPE (type0)) != TYPE_CODE_ARRAY))
3376*11efff7fSkettenis || (TYPE_CODE (type1) != TYPE_CODE_ARRAY
3377*11efff7fSkettenis && (TYPE_CODE (type1) != TYPE_CODE_PTR
3378*11efff7fSkettenis || (TYPE_CODE (TYPE_TARGET_TYPE (type1))
3379*11efff7fSkettenis != TYPE_CODE_ARRAY))));
3380b725ae77Skettenis
3381b725ae77Skettenis case BINOP_EXP:
3382b725ae77Skettenis return (!(numeric_type_p (type0) && integer_type_p (type1)));
3383b725ae77Skettenis
3384b725ae77Skettenis case UNOP_NEG:
3385b725ae77Skettenis case UNOP_PLUS:
3386b725ae77Skettenis case UNOP_LOGICAL_NOT:
3387b725ae77Skettenis case UNOP_ABS:
3388b725ae77Skettenis return (!numeric_type_p (type0));
3389b725ae77Skettenis
3390b725ae77Skettenis }
3391b725ae77Skettenis }
3392b725ae77Skettenis
3393b725ae77Skettenis /* Renaming */
3394b725ae77Skettenis
3395*11efff7fSkettenis /* NOTE: In the following, we assume that a renaming type's name may
3396*11efff7fSkettenis have an ___XD suffix. It would be nice if this went away at some
3397*11efff7fSkettenis point. */
3398b725ae77Skettenis
3399b725ae77Skettenis /* If TYPE encodes a renaming, returns the renaming suffix, which
3400*11efff7fSkettenis is XR for an object renaming, XRP for a procedure renaming, XRE for
3401*11efff7fSkettenis an exception renaming, and XRS for a subprogram renaming. Returns
3402*11efff7fSkettenis NULL if NAME encodes none of these. */
3403*11efff7fSkettenis
3404b725ae77Skettenis const char *
ada_renaming_type(struct type * type)3405b725ae77Skettenis ada_renaming_type (struct type *type)
3406b725ae77Skettenis {
3407b725ae77Skettenis if (type != NULL && TYPE_CODE (type) == TYPE_CODE_ENUM)
3408b725ae77Skettenis {
3409b725ae77Skettenis const char *name = type_name_no_tag (type);
3410b725ae77Skettenis const char *suffix = (name == NULL) ? NULL : strstr (name, "___XR");
3411b725ae77Skettenis if (suffix == NULL
3412b725ae77Skettenis || (suffix[5] != '\000' && strchr ("PES_", suffix[5]) == NULL))
3413b725ae77Skettenis return NULL;
3414b725ae77Skettenis else
3415b725ae77Skettenis return suffix + 3;
3416b725ae77Skettenis }
3417b725ae77Skettenis else
3418b725ae77Skettenis return NULL;
3419b725ae77Skettenis }
3420b725ae77Skettenis
3421b725ae77Skettenis /* Return non-zero iff SYM encodes an object renaming. */
3422*11efff7fSkettenis
3423b725ae77Skettenis int
ada_is_object_renaming(struct symbol * sym)3424b725ae77Skettenis ada_is_object_renaming (struct symbol *sym)
3425b725ae77Skettenis {
3426b725ae77Skettenis const char *renaming_type = ada_renaming_type (SYMBOL_TYPE (sym));
3427b725ae77Skettenis return renaming_type != NULL
3428b725ae77Skettenis && (renaming_type[2] == '\0' || renaming_type[2] == '_');
3429b725ae77Skettenis }
3430b725ae77Skettenis
3431b725ae77Skettenis /* Assuming that SYM encodes a non-object renaming, returns the original
3432*11efff7fSkettenis name of the renamed entity. The name is good until the end of
3433*11efff7fSkettenis parsing. */
3434*11efff7fSkettenis
3435*11efff7fSkettenis char *
ada_simple_renamed_entity(struct symbol * sym)3436b725ae77Skettenis ada_simple_renamed_entity (struct symbol *sym)
3437b725ae77Skettenis {
3438b725ae77Skettenis struct type *type;
3439b725ae77Skettenis const char *raw_name;
3440b725ae77Skettenis int len;
3441b725ae77Skettenis char *result;
3442b725ae77Skettenis
3443b725ae77Skettenis type = SYMBOL_TYPE (sym);
3444b725ae77Skettenis if (type == NULL || TYPE_NFIELDS (type) < 1)
3445b725ae77Skettenis error ("Improperly encoded renaming.");
3446b725ae77Skettenis
3447b725ae77Skettenis raw_name = TYPE_FIELD_NAME (type, 0);
3448b725ae77Skettenis len = (raw_name == NULL ? 0 : strlen (raw_name)) - 5;
3449b725ae77Skettenis if (len <= 0)
3450b725ae77Skettenis error ("Improperly encoded renaming.");
3451b725ae77Skettenis
3452b725ae77Skettenis result = xmalloc (len + 1);
3453b725ae77Skettenis strncpy (result, raw_name, len);
3454b725ae77Skettenis result[len] = '\000';
3455b725ae77Skettenis return result;
3456b725ae77Skettenis }
3457b725ae77Skettenis
3458b725ae77Skettenis
3459b725ae77Skettenis /* Evaluation: Function Calls */
3460b725ae77Skettenis
3461*11efff7fSkettenis /* Return an lvalue containing the value VAL. This is the identity on
3462*11efff7fSkettenis lvalues, and otherwise has the side-effect of pushing a copy of VAL
3463*11efff7fSkettenis on the stack, using and updating *SP as the stack pointer, and
3464*11efff7fSkettenis returning an lvalue whose VALUE_ADDRESS points to the copy. */
3465b725ae77Skettenis
3466b725ae77Skettenis static struct value *
ensure_lval(struct value * val,CORE_ADDR * sp)3467*11efff7fSkettenis ensure_lval (struct value *val, CORE_ADDR *sp)
3468b725ae77Skettenis {
3469*11efff7fSkettenis if (! VALUE_LVAL (val))
3470*11efff7fSkettenis {
3471*11efff7fSkettenis int len = TYPE_LENGTH (ada_check_typedef (VALUE_TYPE (val)));
3472b725ae77Skettenis
3473*11efff7fSkettenis /* The following is taken from the structure-return code in
3474*11efff7fSkettenis call_function_by_hand. FIXME: Therefore, some refactoring seems
3475*11efff7fSkettenis indicated. */
3476b725ae77Skettenis if (INNER_THAN (1, 2))
3477*11efff7fSkettenis {
3478*11efff7fSkettenis /* Stack grows downward. Align SP and VALUE_ADDRESS (val) after
3479*11efff7fSkettenis reserving sufficient space. */
3480*11efff7fSkettenis *sp -= len;
3481*11efff7fSkettenis if (gdbarch_frame_align_p (current_gdbarch))
3482*11efff7fSkettenis *sp = gdbarch_frame_align (current_gdbarch, *sp);
3483b725ae77Skettenis VALUE_ADDRESS (val) = *sp;
3484*11efff7fSkettenis }
3485b725ae77Skettenis else
3486*11efff7fSkettenis {
3487*11efff7fSkettenis /* Stack grows upward. Align the frame, allocate space, and
3488*11efff7fSkettenis then again, re-align the frame. */
3489*11efff7fSkettenis if (gdbarch_frame_align_p (current_gdbarch))
3490*11efff7fSkettenis *sp = gdbarch_frame_align (current_gdbarch, *sp);
3491*11efff7fSkettenis VALUE_ADDRESS (val) = *sp;
3492*11efff7fSkettenis *sp += len;
3493*11efff7fSkettenis if (gdbarch_frame_align_p (current_gdbarch))
3494*11efff7fSkettenis *sp = gdbarch_frame_align (current_gdbarch, *sp);
3495*11efff7fSkettenis }
3496*11efff7fSkettenis
3497*11efff7fSkettenis write_memory (VALUE_ADDRESS (val), VALUE_CONTENTS_RAW (val), len);
3498*11efff7fSkettenis }
3499b725ae77Skettenis
3500b725ae77Skettenis return val;
3501b725ae77Skettenis }
3502b725ae77Skettenis
3503b725ae77Skettenis /* Return the value ACTUAL, converted to be an appropriate value for a
3504b725ae77Skettenis formal of type FORMAL_TYPE. Use *SP as a stack pointer for
3505b725ae77Skettenis allocating any necessary descriptors (fat pointers), or copies of
3506b725ae77Skettenis values not residing in memory, updating it as needed. */
3507b725ae77Skettenis
3508b725ae77Skettenis static struct value *
convert_actual(struct value * actual,struct type * formal_type0,CORE_ADDR * sp)3509b725ae77Skettenis convert_actual (struct value *actual, struct type *formal_type0,
3510b725ae77Skettenis CORE_ADDR *sp)
3511b725ae77Skettenis {
3512*11efff7fSkettenis struct type *actual_type = ada_check_typedef (VALUE_TYPE (actual));
3513*11efff7fSkettenis struct type *formal_type = ada_check_typedef (formal_type0);
3514b725ae77Skettenis struct type *formal_target =
3515b725ae77Skettenis TYPE_CODE (formal_type) == TYPE_CODE_PTR
3516*11efff7fSkettenis ? ada_check_typedef (TYPE_TARGET_TYPE (formal_type)) : formal_type;
3517b725ae77Skettenis struct type *actual_target =
3518b725ae77Skettenis TYPE_CODE (actual_type) == TYPE_CODE_PTR
3519*11efff7fSkettenis ? ada_check_typedef (TYPE_TARGET_TYPE (actual_type)) : actual_type;
3520b725ae77Skettenis
3521*11efff7fSkettenis if (ada_is_array_descriptor_type (formal_target)
3522b725ae77Skettenis && TYPE_CODE (actual_target) == TYPE_CODE_ARRAY)
3523b725ae77Skettenis return make_array_descriptor (formal_type, actual, sp);
3524b725ae77Skettenis else if (TYPE_CODE (formal_type) == TYPE_CODE_PTR)
3525b725ae77Skettenis {
3526b725ae77Skettenis if (TYPE_CODE (formal_target) == TYPE_CODE_ARRAY
3527*11efff7fSkettenis && ada_is_array_descriptor_type (actual_target))
3528b725ae77Skettenis return desc_data (actual);
3529b725ae77Skettenis else if (TYPE_CODE (actual_type) != TYPE_CODE_PTR)
3530b725ae77Skettenis {
3531b725ae77Skettenis if (VALUE_LVAL (actual) != lval_memory)
3532b725ae77Skettenis {
3533b725ae77Skettenis struct value *val;
3534*11efff7fSkettenis actual_type = ada_check_typedef (VALUE_TYPE (actual));
3535b725ae77Skettenis val = allocate_value (actual_type);
3536b725ae77Skettenis memcpy ((char *) VALUE_CONTENTS_RAW (val),
3537b725ae77Skettenis (char *) VALUE_CONTENTS (actual),
3538b725ae77Skettenis TYPE_LENGTH (actual_type));
3539*11efff7fSkettenis actual = ensure_lval (val, sp);
3540b725ae77Skettenis }
3541b725ae77Skettenis return value_addr (actual);
3542b725ae77Skettenis }
3543b725ae77Skettenis }
3544b725ae77Skettenis else if (TYPE_CODE (actual_type) == TYPE_CODE_PTR)
3545b725ae77Skettenis return ada_value_ind (actual);
3546b725ae77Skettenis
3547b725ae77Skettenis return actual;
3548b725ae77Skettenis }
3549b725ae77Skettenis
3550b725ae77Skettenis
3551b725ae77Skettenis /* Push a descriptor of type TYPE for array value ARR on the stack at
3552b725ae77Skettenis *SP, updating *SP to reflect the new descriptor. Return either
3553b725ae77Skettenis an lvalue representing the new descriptor, or (if TYPE is a pointer-
3554b725ae77Skettenis to-descriptor type rather than a descriptor type), a struct value *
3555b725ae77Skettenis representing a pointer to this descriptor. */
3556b725ae77Skettenis
3557b725ae77Skettenis static struct value *
make_array_descriptor(struct type * type,struct value * arr,CORE_ADDR * sp)3558b725ae77Skettenis make_array_descriptor (struct type *type, struct value *arr, CORE_ADDR *sp)
3559b725ae77Skettenis {
3560b725ae77Skettenis struct type *bounds_type = desc_bounds_type (type);
3561b725ae77Skettenis struct type *desc_type = desc_base_type (type);
3562b725ae77Skettenis struct value *descriptor = allocate_value (desc_type);
3563b725ae77Skettenis struct value *bounds = allocate_value (bounds_type);
3564b725ae77Skettenis int i;
3565b725ae77Skettenis
3566*11efff7fSkettenis for (i = ada_array_arity (ada_check_typedef (VALUE_TYPE (arr))); i > 0; i -= 1)
3567b725ae77Skettenis {
3568b725ae77Skettenis modify_general_field (VALUE_CONTENTS (bounds),
3569b725ae77Skettenis value_as_long (ada_array_bound (arr, i, 0)),
3570b725ae77Skettenis desc_bound_bitpos (bounds_type, i, 0),
3571b725ae77Skettenis desc_bound_bitsize (bounds_type, i, 0));
3572b725ae77Skettenis modify_general_field (VALUE_CONTENTS (bounds),
3573b725ae77Skettenis value_as_long (ada_array_bound (arr, i, 1)),
3574b725ae77Skettenis desc_bound_bitpos (bounds_type, i, 1),
3575b725ae77Skettenis desc_bound_bitsize (bounds_type, i, 1));
3576b725ae77Skettenis }
3577b725ae77Skettenis
3578*11efff7fSkettenis bounds = ensure_lval (bounds, sp);
3579b725ae77Skettenis
3580b725ae77Skettenis modify_general_field (VALUE_CONTENTS (descriptor),
3581*11efff7fSkettenis VALUE_ADDRESS (ensure_lval (arr, sp)),
3582b725ae77Skettenis fat_pntr_data_bitpos (desc_type),
3583b725ae77Skettenis fat_pntr_data_bitsize (desc_type));
3584*11efff7fSkettenis
3585b725ae77Skettenis modify_general_field (VALUE_CONTENTS (descriptor),
3586b725ae77Skettenis VALUE_ADDRESS (bounds),
3587b725ae77Skettenis fat_pntr_bounds_bitpos (desc_type),
3588b725ae77Skettenis fat_pntr_bounds_bitsize (desc_type));
3589b725ae77Skettenis
3590*11efff7fSkettenis descriptor = ensure_lval (descriptor, sp);
3591b725ae77Skettenis
3592b725ae77Skettenis if (TYPE_CODE (type) == TYPE_CODE_PTR)
3593b725ae77Skettenis return value_addr (descriptor);
3594b725ae77Skettenis else
3595b725ae77Skettenis return descriptor;
3596b725ae77Skettenis }
3597b725ae77Skettenis
3598b725ae77Skettenis
3599b725ae77Skettenis /* Assuming a dummy frame has been established on the target, perform any
3600b725ae77Skettenis conversions needed for calling function FUNC on the NARGS actual
3601b725ae77Skettenis parameters in ARGS, other than standard C conversions. Does
3602b725ae77Skettenis nothing if FUNC does not have Ada-style prototype data, or if NARGS
3603b725ae77Skettenis does not match the number of arguments expected. Use *SP as a
3604b725ae77Skettenis stack pointer for additional data that must be pushed, updating its
3605b725ae77Skettenis value as needed. */
3606b725ae77Skettenis
3607b725ae77Skettenis void
ada_convert_actuals(struct value * func,int nargs,struct value * args[],CORE_ADDR * sp)3608b725ae77Skettenis ada_convert_actuals (struct value *func, int nargs, struct value *args[],
3609b725ae77Skettenis CORE_ADDR *sp)
3610b725ae77Skettenis {
3611b725ae77Skettenis int i;
3612b725ae77Skettenis
3613b725ae77Skettenis if (TYPE_NFIELDS (VALUE_TYPE (func)) == 0
3614b725ae77Skettenis || nargs != TYPE_NFIELDS (VALUE_TYPE (func)))
3615b725ae77Skettenis return;
3616b725ae77Skettenis
3617b725ae77Skettenis for (i = 0; i < nargs; i += 1)
3618b725ae77Skettenis args[i] =
3619b725ae77Skettenis convert_actual (args[i], TYPE_FIELD_TYPE (VALUE_TYPE (func), i), sp);
3620b725ae77Skettenis }
3621b725ae77Skettenis
3622*11efff7fSkettenis /* Dummy definitions for an experimental caching module that is not
3623*11efff7fSkettenis * used in the public sources. */
3624b725ae77Skettenis
3625*11efff7fSkettenis static int
lookup_cached_symbol(const char * name,domain_enum namespace,struct symbol ** sym,struct block ** block,struct symtab ** symtab)3626*11efff7fSkettenis lookup_cached_symbol (const char *name, domain_enum namespace,
3627*11efff7fSkettenis struct symbol **sym, struct block **block,
3628*11efff7fSkettenis struct symtab **symtab)
3629*11efff7fSkettenis {
3630*11efff7fSkettenis return 0;
3631*11efff7fSkettenis }
3632*11efff7fSkettenis
3633*11efff7fSkettenis static void
cache_symbol(const char * name,domain_enum namespace,struct symbol * sym,struct block * block,struct symtab * symtab)3634*11efff7fSkettenis cache_symbol (const char *name, domain_enum namespace, struct symbol *sym,
3635*11efff7fSkettenis struct block *block, struct symtab *symtab)
3636*11efff7fSkettenis {
3637*11efff7fSkettenis }
3638*11efff7fSkettenis
3639b725ae77Skettenis /* Symbol Lookup */
3640b725ae77Skettenis
3641b725ae77Skettenis /* Return the result of a standard (literal, C-like) lookup of NAME in
3642*11efff7fSkettenis given DOMAIN, visible from lexical block BLOCK. */
3643b725ae77Skettenis
3644b725ae77Skettenis static struct symbol *
standard_lookup(const char * name,const struct block * block,domain_enum domain)3645*11efff7fSkettenis standard_lookup (const char *name, const struct block *block,
3646*11efff7fSkettenis domain_enum domain)
3647b725ae77Skettenis {
3648b725ae77Skettenis struct symbol *sym;
3649*11efff7fSkettenis struct symtab *symtab;
3650*11efff7fSkettenis
3651*11efff7fSkettenis if (lookup_cached_symbol (name, domain, &sym, NULL, NULL))
3652*11efff7fSkettenis return sym;
3653*11efff7fSkettenis sym =
3654*11efff7fSkettenis lookup_symbol_in_language (name, block, domain, language_c, 0, &symtab);
3655*11efff7fSkettenis cache_symbol (name, domain, sym, block_found, symtab);
3656b725ae77Skettenis return sym;
3657b725ae77Skettenis }
3658b725ae77Skettenis
3659b725ae77Skettenis
3660*11efff7fSkettenis /* Non-zero iff there is at least one non-function/non-enumeral symbol
3661*11efff7fSkettenis in the symbol fields of SYMS[0..N-1]. We treat enumerals as functions,
3662*11efff7fSkettenis since they contend in overloading in the same way. */
3663b725ae77Skettenis static int
is_nonfunction(struct ada_symbol_info syms[],int n)3664*11efff7fSkettenis is_nonfunction (struct ada_symbol_info syms[], int n)
3665b725ae77Skettenis {
3666b725ae77Skettenis int i;
3667b725ae77Skettenis
3668b725ae77Skettenis for (i = 0; i < n; i += 1)
3669*11efff7fSkettenis if (TYPE_CODE (SYMBOL_TYPE (syms[i].sym)) != TYPE_CODE_FUNC
3670*11efff7fSkettenis && (TYPE_CODE (SYMBOL_TYPE (syms[i].sym)) != TYPE_CODE_ENUM
3671*11efff7fSkettenis || SYMBOL_CLASS (syms[i].sym) != LOC_CONST))
3672b725ae77Skettenis return 1;
3673b725ae77Skettenis
3674b725ae77Skettenis return 0;
3675b725ae77Skettenis }
3676b725ae77Skettenis
3677b725ae77Skettenis /* If true (non-zero), then TYPE0 and TYPE1 represent equivalent
3678b725ae77Skettenis struct types. Otherwise, they may not. */
3679b725ae77Skettenis
3680b725ae77Skettenis static int
equiv_types(struct type * type0,struct type * type1)3681b725ae77Skettenis equiv_types (struct type *type0, struct type *type1)
3682b725ae77Skettenis {
3683b725ae77Skettenis if (type0 == type1)
3684b725ae77Skettenis return 1;
3685b725ae77Skettenis if (type0 == NULL || type1 == NULL
3686b725ae77Skettenis || TYPE_CODE (type0) != TYPE_CODE (type1))
3687b725ae77Skettenis return 0;
3688b725ae77Skettenis if ((TYPE_CODE (type0) == TYPE_CODE_STRUCT
3689b725ae77Skettenis || TYPE_CODE (type0) == TYPE_CODE_ENUM)
3690b725ae77Skettenis && ada_type_name (type0) != NULL && ada_type_name (type1) != NULL
3691*11efff7fSkettenis && strcmp (ada_type_name (type0), ada_type_name (type1)) == 0)
3692b725ae77Skettenis return 1;
3693b725ae77Skettenis
3694b725ae77Skettenis return 0;
3695b725ae77Skettenis }
3696b725ae77Skettenis
3697b725ae77Skettenis /* True iff SYM0 represents the same entity as SYM1, or one that is
3698b725ae77Skettenis no more defined than that of SYM1. */
3699b725ae77Skettenis
3700b725ae77Skettenis static int
lesseq_defined_than(struct symbol * sym0,struct symbol * sym1)3701b725ae77Skettenis lesseq_defined_than (struct symbol *sym0, struct symbol *sym1)
3702b725ae77Skettenis {
3703b725ae77Skettenis if (sym0 == sym1)
3704b725ae77Skettenis return 1;
3705b725ae77Skettenis if (SYMBOL_DOMAIN (sym0) != SYMBOL_DOMAIN (sym1)
3706b725ae77Skettenis || SYMBOL_CLASS (sym0) != SYMBOL_CLASS (sym1))
3707b725ae77Skettenis return 0;
3708b725ae77Skettenis
3709b725ae77Skettenis switch (SYMBOL_CLASS (sym0))
3710b725ae77Skettenis {
3711b725ae77Skettenis case LOC_UNDEF:
3712b725ae77Skettenis return 1;
3713b725ae77Skettenis case LOC_TYPEDEF:
3714b725ae77Skettenis {
3715b725ae77Skettenis struct type *type0 = SYMBOL_TYPE (sym0);
3716b725ae77Skettenis struct type *type1 = SYMBOL_TYPE (sym1);
3717*11efff7fSkettenis char *name0 = SYMBOL_LINKAGE_NAME (sym0);
3718*11efff7fSkettenis char *name1 = SYMBOL_LINKAGE_NAME (sym1);
3719b725ae77Skettenis int len0 = strlen (name0);
3720b725ae77Skettenis return
3721b725ae77Skettenis TYPE_CODE (type0) == TYPE_CODE (type1)
3722b725ae77Skettenis && (equiv_types (type0, type1)
3723*11efff7fSkettenis || (len0 < strlen (name1) && strncmp (name0, name1, len0) == 0
3724*11efff7fSkettenis && strncmp (name1 + len0, "___XV", 5) == 0));
3725b725ae77Skettenis }
3726b725ae77Skettenis case LOC_CONST:
3727b725ae77Skettenis return SYMBOL_VALUE (sym0) == SYMBOL_VALUE (sym1)
3728b725ae77Skettenis && equiv_types (SYMBOL_TYPE (sym0), SYMBOL_TYPE (sym1));
3729b725ae77Skettenis default:
3730b725ae77Skettenis return 0;
3731b725ae77Skettenis }
3732b725ae77Skettenis }
3733b725ae77Skettenis
3734*11efff7fSkettenis /* Append (SYM,BLOCK,SYMTAB) to the end of the array of struct ada_symbol_info
3735*11efff7fSkettenis records in OBSTACKP. Do nothing if SYM is a duplicate. */
3736b725ae77Skettenis
3737b725ae77Skettenis static void
add_defn_to_vec(struct obstack * obstackp,struct symbol * sym,struct block * block,struct symtab * symtab)3738*11efff7fSkettenis add_defn_to_vec (struct obstack *obstackp,
3739*11efff7fSkettenis struct symbol *sym,
3740*11efff7fSkettenis struct block *block, struct symtab *symtab)
3741b725ae77Skettenis {
3742b725ae77Skettenis int i;
3743b725ae77Skettenis size_t tmp;
3744*11efff7fSkettenis struct ada_symbol_info *prevDefns = defns_collected (obstackp, 0);
3745b725ae77Skettenis
3746b725ae77Skettenis if (SYMBOL_TYPE (sym) != NULL)
3747*11efff7fSkettenis SYMBOL_TYPE (sym) = ada_check_typedef (SYMBOL_TYPE (sym));
3748*11efff7fSkettenis for (i = num_defns_collected (obstackp) - 1; i >= 0; i -= 1)
3749b725ae77Skettenis {
3750*11efff7fSkettenis if (lesseq_defined_than (sym, prevDefns[i].sym))
3751b725ae77Skettenis return;
3752*11efff7fSkettenis else if (lesseq_defined_than (prevDefns[i].sym, sym))
3753b725ae77Skettenis {
3754*11efff7fSkettenis prevDefns[i].sym = sym;
3755*11efff7fSkettenis prevDefns[i].block = block;
3756*11efff7fSkettenis prevDefns[i].symtab = symtab;
3757b725ae77Skettenis return;
3758b725ae77Skettenis }
3759b725ae77Skettenis }
3760b725ae77Skettenis
3761*11efff7fSkettenis {
3762*11efff7fSkettenis struct ada_symbol_info info;
3763b725ae77Skettenis
3764*11efff7fSkettenis info.sym = sym;
3765*11efff7fSkettenis info.block = block;
3766*11efff7fSkettenis info.symtab = symtab;
3767*11efff7fSkettenis obstack_grow (obstackp, &info, sizeof (struct ada_symbol_info));
3768*11efff7fSkettenis }
3769b725ae77Skettenis }
3770b725ae77Skettenis
3771*11efff7fSkettenis /* Number of ada_symbol_info structures currently collected in
3772*11efff7fSkettenis current vector in *OBSTACKP. */
3773*11efff7fSkettenis
3774*11efff7fSkettenis static int
num_defns_collected(struct obstack * obstackp)3775*11efff7fSkettenis num_defns_collected (struct obstack *obstackp)
3776*11efff7fSkettenis {
3777*11efff7fSkettenis return obstack_object_size (obstackp) / sizeof (struct ada_symbol_info);
3778*11efff7fSkettenis }
3779*11efff7fSkettenis
3780*11efff7fSkettenis /* Vector of ada_symbol_info structures currently collected in current
3781*11efff7fSkettenis vector in *OBSTACKP. If FINISH, close off the vector and return
3782*11efff7fSkettenis its final address. */
3783*11efff7fSkettenis
3784*11efff7fSkettenis static struct ada_symbol_info *
defns_collected(struct obstack * obstackp,int finish)3785*11efff7fSkettenis defns_collected (struct obstack *obstackp, int finish)
3786*11efff7fSkettenis {
3787*11efff7fSkettenis if (finish)
3788*11efff7fSkettenis return obstack_finish (obstackp);
3789*11efff7fSkettenis else
3790*11efff7fSkettenis return (struct ada_symbol_info *) obstack_base (obstackp);
3791*11efff7fSkettenis }
3792*11efff7fSkettenis
3793*11efff7fSkettenis /* Look, in partial_symtab PST, for symbol NAME in given namespace.
3794*11efff7fSkettenis Check the global symbols if GLOBAL, the static symbols if not.
3795*11efff7fSkettenis Do wild-card match if WILD. */
3796b725ae77Skettenis
3797b725ae77Skettenis static struct partial_symbol *
ada_lookup_partial_symbol(struct partial_symtab * pst,const char * name,int global,domain_enum namespace,int wild)3798b725ae77Skettenis ada_lookup_partial_symbol (struct partial_symtab *pst, const char *name,
3799*11efff7fSkettenis int global, domain_enum namespace, int wild)
3800b725ae77Skettenis {
3801b725ae77Skettenis struct partial_symbol **start;
3802b725ae77Skettenis int name_len = strlen (name);
3803b725ae77Skettenis int length = (global ? pst->n_global_syms : pst->n_static_syms);
3804b725ae77Skettenis int i;
3805b725ae77Skettenis
3806b725ae77Skettenis if (length == 0)
3807b725ae77Skettenis {
3808b725ae77Skettenis return (NULL);
3809b725ae77Skettenis }
3810b725ae77Skettenis
3811b725ae77Skettenis start = (global ?
3812b725ae77Skettenis pst->objfile->global_psymbols.list + pst->globals_offset :
3813b725ae77Skettenis pst->objfile->static_psymbols.list + pst->statics_offset);
3814b725ae77Skettenis
3815b725ae77Skettenis if (wild)
3816b725ae77Skettenis {
3817b725ae77Skettenis for (i = 0; i < length; i += 1)
3818b725ae77Skettenis {
3819b725ae77Skettenis struct partial_symbol *psym = start[i];
3820b725ae77Skettenis
3821*11efff7fSkettenis if (SYMBOL_DOMAIN (psym) == namespace
3822*11efff7fSkettenis && wild_match (name, name_len, SYMBOL_LINKAGE_NAME (psym)))
3823b725ae77Skettenis return psym;
3824b725ae77Skettenis }
3825b725ae77Skettenis return NULL;
3826b725ae77Skettenis }
3827b725ae77Skettenis else
3828b725ae77Skettenis {
3829b725ae77Skettenis if (global)
3830b725ae77Skettenis {
3831b725ae77Skettenis int U;
3832b725ae77Skettenis i = 0;
3833b725ae77Skettenis U = length - 1;
3834b725ae77Skettenis while (U - i > 4)
3835b725ae77Skettenis {
3836b725ae77Skettenis int M = (U + i) >> 1;
3837b725ae77Skettenis struct partial_symbol *psym = start[M];
3838*11efff7fSkettenis if (SYMBOL_LINKAGE_NAME (psym)[0] < name[0])
3839b725ae77Skettenis i = M + 1;
3840*11efff7fSkettenis else if (SYMBOL_LINKAGE_NAME (psym)[0] > name[0])
3841b725ae77Skettenis U = M - 1;
3842*11efff7fSkettenis else if (strcmp (SYMBOL_LINKAGE_NAME (psym), name) < 0)
3843b725ae77Skettenis i = M + 1;
3844b725ae77Skettenis else
3845b725ae77Skettenis U = M;
3846b725ae77Skettenis }
3847b725ae77Skettenis }
3848b725ae77Skettenis else
3849b725ae77Skettenis i = 0;
3850b725ae77Skettenis
3851b725ae77Skettenis while (i < length)
3852b725ae77Skettenis {
3853b725ae77Skettenis struct partial_symbol *psym = start[i];
3854b725ae77Skettenis
3855*11efff7fSkettenis if (SYMBOL_DOMAIN (psym) == namespace)
3856b725ae77Skettenis {
3857*11efff7fSkettenis int cmp = strncmp (name, SYMBOL_LINKAGE_NAME (psym), name_len);
3858b725ae77Skettenis
3859b725ae77Skettenis if (cmp < 0)
3860b725ae77Skettenis {
3861b725ae77Skettenis if (global)
3862b725ae77Skettenis break;
3863b725ae77Skettenis }
3864b725ae77Skettenis else if (cmp == 0
3865*11efff7fSkettenis && is_name_suffix (SYMBOL_LINKAGE_NAME (psym)
3866*11efff7fSkettenis + name_len))
3867b725ae77Skettenis return psym;
3868b725ae77Skettenis }
3869b725ae77Skettenis i += 1;
3870b725ae77Skettenis }
3871b725ae77Skettenis
3872b725ae77Skettenis if (global)
3873b725ae77Skettenis {
3874b725ae77Skettenis int U;
3875b725ae77Skettenis i = 0;
3876b725ae77Skettenis U = length - 1;
3877b725ae77Skettenis while (U - i > 4)
3878b725ae77Skettenis {
3879b725ae77Skettenis int M = (U + i) >> 1;
3880b725ae77Skettenis struct partial_symbol *psym = start[M];
3881*11efff7fSkettenis if (SYMBOL_LINKAGE_NAME (psym)[0] < '_')
3882b725ae77Skettenis i = M + 1;
3883*11efff7fSkettenis else if (SYMBOL_LINKAGE_NAME (psym)[0] > '_')
3884b725ae77Skettenis U = M - 1;
3885*11efff7fSkettenis else if (strcmp (SYMBOL_LINKAGE_NAME (psym), "_ada_") < 0)
3886b725ae77Skettenis i = M + 1;
3887b725ae77Skettenis else
3888b725ae77Skettenis U = M;
3889b725ae77Skettenis }
3890b725ae77Skettenis }
3891b725ae77Skettenis else
3892b725ae77Skettenis i = 0;
3893b725ae77Skettenis
3894b725ae77Skettenis while (i < length)
3895b725ae77Skettenis {
3896b725ae77Skettenis struct partial_symbol *psym = start[i];
3897b725ae77Skettenis
3898*11efff7fSkettenis if (SYMBOL_DOMAIN (psym) == namespace)
3899b725ae77Skettenis {
3900b725ae77Skettenis int cmp;
3901b725ae77Skettenis
3902*11efff7fSkettenis cmp = (int) '_' - (int) SYMBOL_LINKAGE_NAME (psym)[0];
3903b725ae77Skettenis if (cmp == 0)
3904b725ae77Skettenis {
3905*11efff7fSkettenis cmp = strncmp ("_ada_", SYMBOL_LINKAGE_NAME (psym), 5);
3906b725ae77Skettenis if (cmp == 0)
3907*11efff7fSkettenis cmp = strncmp (name, SYMBOL_LINKAGE_NAME (psym) + 5,
3908*11efff7fSkettenis name_len);
3909b725ae77Skettenis }
3910b725ae77Skettenis
3911b725ae77Skettenis if (cmp < 0)
3912b725ae77Skettenis {
3913b725ae77Skettenis if (global)
3914b725ae77Skettenis break;
3915b725ae77Skettenis }
3916b725ae77Skettenis else if (cmp == 0
3917*11efff7fSkettenis && is_name_suffix (SYMBOL_LINKAGE_NAME (psym)
3918*11efff7fSkettenis + name_len + 5))
3919b725ae77Skettenis return psym;
3920b725ae77Skettenis }
3921b725ae77Skettenis i += 1;
3922b725ae77Skettenis }
3923b725ae77Skettenis }
3924b725ae77Skettenis return NULL;
3925b725ae77Skettenis }
3926b725ae77Skettenis
3927b725ae77Skettenis /* Find a symbol table containing symbol SYM or NULL if none. */
3928*11efff7fSkettenis
3929b725ae77Skettenis static struct symtab *
symtab_for_sym(struct symbol * sym)3930b725ae77Skettenis symtab_for_sym (struct symbol *sym)
3931b725ae77Skettenis {
3932b725ae77Skettenis struct symtab *s;
3933b725ae77Skettenis struct objfile *objfile;
3934b725ae77Skettenis struct block *b;
3935b725ae77Skettenis struct symbol *tmp_sym;
3936b725ae77Skettenis struct dict_iterator iter;
3937b725ae77Skettenis int j;
3938b725ae77Skettenis
3939b725ae77Skettenis ALL_SYMTABS (objfile, s)
3940b725ae77Skettenis {
3941b725ae77Skettenis switch (SYMBOL_CLASS (sym))
3942b725ae77Skettenis {
3943b725ae77Skettenis case LOC_CONST:
3944b725ae77Skettenis case LOC_STATIC:
3945b725ae77Skettenis case LOC_TYPEDEF:
3946b725ae77Skettenis case LOC_REGISTER:
3947b725ae77Skettenis case LOC_LABEL:
3948b725ae77Skettenis case LOC_BLOCK:
3949b725ae77Skettenis case LOC_CONST_BYTES:
3950b725ae77Skettenis b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK);
3951b725ae77Skettenis ALL_BLOCK_SYMBOLS (b, iter, tmp_sym) if (sym == tmp_sym)
3952b725ae77Skettenis return s;
3953b725ae77Skettenis b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK);
3954b725ae77Skettenis ALL_BLOCK_SYMBOLS (b, iter, tmp_sym) if (sym == tmp_sym)
3955b725ae77Skettenis return s;
3956b725ae77Skettenis break;
3957b725ae77Skettenis default:
3958b725ae77Skettenis break;
3959b725ae77Skettenis }
3960b725ae77Skettenis switch (SYMBOL_CLASS (sym))
3961b725ae77Skettenis {
3962b725ae77Skettenis case LOC_REGISTER:
3963b725ae77Skettenis case LOC_ARG:
3964b725ae77Skettenis case LOC_REF_ARG:
3965b725ae77Skettenis case LOC_REGPARM:
3966b725ae77Skettenis case LOC_REGPARM_ADDR:
3967b725ae77Skettenis case LOC_LOCAL:
3968b725ae77Skettenis case LOC_TYPEDEF:
3969b725ae77Skettenis case LOC_LOCAL_ARG:
3970b725ae77Skettenis case LOC_BASEREG:
3971b725ae77Skettenis case LOC_BASEREG_ARG:
3972b725ae77Skettenis case LOC_COMPUTED:
3973b725ae77Skettenis case LOC_COMPUTED_ARG:
3974b725ae77Skettenis for (j = FIRST_LOCAL_BLOCK;
3975b725ae77Skettenis j < BLOCKVECTOR_NBLOCKS (BLOCKVECTOR (s)); j += 1)
3976b725ae77Skettenis {
3977b725ae77Skettenis b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), j);
3978b725ae77Skettenis ALL_BLOCK_SYMBOLS (b, iter, tmp_sym) if (sym == tmp_sym)
3979b725ae77Skettenis return s;
3980b725ae77Skettenis }
3981b725ae77Skettenis break;
3982b725ae77Skettenis default:
3983b725ae77Skettenis break;
3984b725ae77Skettenis }
3985b725ae77Skettenis }
3986b725ae77Skettenis return NULL;
3987b725ae77Skettenis }
3988b725ae77Skettenis
3989*11efff7fSkettenis /* Return a minimal symbol matching NAME according to Ada decoding
3990*11efff7fSkettenis rules. Returns NULL if there is no such minimal symbol. Names
3991*11efff7fSkettenis prefixed with "standard__" are handled specially: "standard__" is
3992*11efff7fSkettenis first stripped off, and only static and global symbols are searched. */
3993b725ae77Skettenis
3994b725ae77Skettenis struct minimal_symbol *
ada_lookup_simple_minsym(const char * name)3995*11efff7fSkettenis ada_lookup_simple_minsym (const char *name)
3996b725ae77Skettenis {
3997b725ae77Skettenis struct objfile *objfile;
3998b725ae77Skettenis struct minimal_symbol *msymbol;
3999*11efff7fSkettenis int wild_match;
4000*11efff7fSkettenis
4001*11efff7fSkettenis if (strncmp (name, "standard__", sizeof ("standard__") - 1) == 0)
4002*11efff7fSkettenis {
4003*11efff7fSkettenis name += sizeof ("standard__") - 1;
4004*11efff7fSkettenis wild_match = 0;
4005*11efff7fSkettenis }
4006*11efff7fSkettenis else
4007*11efff7fSkettenis wild_match = (strstr (name, "__") == NULL);
4008b725ae77Skettenis
4009b725ae77Skettenis ALL_MSYMBOLS (objfile, msymbol)
4010b725ae77Skettenis {
4011*11efff7fSkettenis if (ada_match_name (SYMBOL_LINKAGE_NAME (msymbol), name, wild_match)
4012b725ae77Skettenis && MSYMBOL_TYPE (msymbol) != mst_solib_trampoline)
4013b725ae77Skettenis return msymbol;
4014b725ae77Skettenis }
4015b725ae77Skettenis
4016b725ae77Skettenis return NULL;
4017b725ae77Skettenis }
4018b725ae77Skettenis
4019b725ae77Skettenis /* For all subprograms that statically enclose the subprogram of the
4020*11efff7fSkettenis selected frame, add symbols matching identifier NAME in DOMAIN
4021*11efff7fSkettenis and their blocks to the list of data in OBSTACKP, as for
4022*11efff7fSkettenis ada_add_block_symbols (q.v.). If WILD, treat as NAME with a
4023*11efff7fSkettenis wildcard prefix. */
4024*11efff7fSkettenis
4025b725ae77Skettenis static void
add_symbols_from_enclosing_procs(struct obstack * obstackp,const char * name,domain_enum namespace,int wild_match)4026*11efff7fSkettenis add_symbols_from_enclosing_procs (struct obstack *obstackp,
4027*11efff7fSkettenis const char *name, domain_enum namespace,
4028b725ae77Skettenis int wild_match)
4029b725ae77Skettenis {
4030b725ae77Skettenis }
4031b725ae77Skettenis
4032*11efff7fSkettenis /* FIXME: The next two routines belong in symtab.c */
4033*11efff7fSkettenis
4034*11efff7fSkettenis static void
restore_language(void * lang)4035*11efff7fSkettenis restore_language (void *lang)
4036b725ae77Skettenis {
4037*11efff7fSkettenis set_language ((enum language) lang);
4038b725ae77Skettenis }
4039b725ae77Skettenis
4040*11efff7fSkettenis /* As for lookup_symbol, but performed as if the current language
4041*11efff7fSkettenis were LANG. */
4042*11efff7fSkettenis
4043*11efff7fSkettenis struct symbol *
lookup_symbol_in_language(const char * name,const struct block * block,domain_enum domain,enum language lang,int * is_a_field_of_this,struct symtab ** symtab)4044*11efff7fSkettenis lookup_symbol_in_language (const char *name, const struct block *block,
4045*11efff7fSkettenis domain_enum domain, enum language lang,
4046*11efff7fSkettenis int *is_a_field_of_this, struct symtab **symtab)
4047*11efff7fSkettenis {
4048*11efff7fSkettenis struct cleanup *old_chain
4049*11efff7fSkettenis = make_cleanup (restore_language, (void *) current_language->la_language);
4050*11efff7fSkettenis struct symbol *result;
4051*11efff7fSkettenis set_language (lang);
4052*11efff7fSkettenis result = lookup_symbol (name, block, domain, is_a_field_of_this, symtab);
4053b725ae77Skettenis do_cleanups (old_chain);
4054*11efff7fSkettenis return result;
4055b725ae77Skettenis }
4056b725ae77Skettenis
4057b725ae77Skettenis /* True if TYPE is definitely an artificial type supplied to a symbol
4058*11efff7fSkettenis for which no debugging information was given in the symbol file. */
4059*11efff7fSkettenis
4060b725ae77Skettenis static int
is_nondebugging_type(struct type * type)4061b725ae77Skettenis is_nondebugging_type (struct type *type)
4062b725ae77Skettenis {
4063b725ae77Skettenis char *name = ada_type_name (type);
4064*11efff7fSkettenis return (name != NULL && strcmp (name, "<variable, no debug info>") == 0);
4065b725ae77Skettenis }
4066b725ae77Skettenis
4067b725ae77Skettenis /* Remove any non-debugging symbols in SYMS[0 .. NSYMS-1] that definitely
4068*11efff7fSkettenis duplicate other symbols in the list (The only case I know of where
4069*11efff7fSkettenis this happens is when object files containing stabs-in-ecoff are
4070*11efff7fSkettenis linked with files containing ordinary ecoff debugging symbols (or no
4071*11efff7fSkettenis debugging symbols)). Modifies SYMS to squeeze out deleted entries.
4072*11efff7fSkettenis Returns the number of items in the modified list. */
4073*11efff7fSkettenis
4074b725ae77Skettenis static int
remove_extra_symbols(struct ada_symbol_info * syms,int nsyms)4075*11efff7fSkettenis remove_extra_symbols (struct ada_symbol_info *syms, int nsyms)
4076b725ae77Skettenis {
4077b725ae77Skettenis int i, j;
4078b725ae77Skettenis
4079b725ae77Skettenis i = 0;
4080b725ae77Skettenis while (i < nsyms)
4081b725ae77Skettenis {
4082*11efff7fSkettenis if (SYMBOL_LINKAGE_NAME (syms[i].sym) != NULL
4083*11efff7fSkettenis && SYMBOL_CLASS (syms[i].sym) == LOC_STATIC
4084*11efff7fSkettenis && is_nondebugging_type (SYMBOL_TYPE (syms[i].sym)))
4085b725ae77Skettenis {
4086b725ae77Skettenis for (j = 0; j < nsyms; j += 1)
4087b725ae77Skettenis {
4088b725ae77Skettenis if (i != j
4089*11efff7fSkettenis && SYMBOL_LINKAGE_NAME (syms[j].sym) != NULL
4090*11efff7fSkettenis && strcmp (SYMBOL_LINKAGE_NAME (syms[i].sym),
4091*11efff7fSkettenis SYMBOL_LINKAGE_NAME (syms[j].sym)) == 0
4092*11efff7fSkettenis && SYMBOL_CLASS (syms[i].sym) == SYMBOL_CLASS (syms[j].sym)
4093*11efff7fSkettenis && SYMBOL_VALUE_ADDRESS (syms[i].sym)
4094*11efff7fSkettenis == SYMBOL_VALUE_ADDRESS (syms[j].sym))
4095b725ae77Skettenis {
4096b725ae77Skettenis int k;
4097b725ae77Skettenis for (k = i + 1; k < nsyms; k += 1)
4098b725ae77Skettenis syms[k - 1] = syms[k];
4099b725ae77Skettenis nsyms -= 1;
4100b725ae77Skettenis goto NextSymbol;
4101b725ae77Skettenis }
4102b725ae77Skettenis }
4103b725ae77Skettenis }
4104b725ae77Skettenis i += 1;
4105b725ae77Skettenis NextSymbol:
4106b725ae77Skettenis ;
4107b725ae77Skettenis }
4108b725ae77Skettenis return nsyms;
4109b725ae77Skettenis }
4110b725ae77Skettenis
4111*11efff7fSkettenis /* Given a type that corresponds to a renaming entity, use the type name
4112*11efff7fSkettenis to extract the scope (package name or function name, fully qualified,
4113*11efff7fSkettenis and following the GNAT encoding convention) where this renaming has been
4114*11efff7fSkettenis defined. The string returned needs to be deallocated after use. */
4115*11efff7fSkettenis
4116*11efff7fSkettenis static char *
xget_renaming_scope(struct type * renaming_type)4117*11efff7fSkettenis xget_renaming_scope (struct type *renaming_type)
4118*11efff7fSkettenis {
4119*11efff7fSkettenis /* The renaming types adhere to the following convention:
4120*11efff7fSkettenis <scope>__<rename>___<XR extension>.
4121*11efff7fSkettenis So, to extract the scope, we search for the "___XR" extension,
4122*11efff7fSkettenis and then backtrack until we find the first "__". */
4123*11efff7fSkettenis
4124*11efff7fSkettenis const char *name = type_name_no_tag (renaming_type);
4125*11efff7fSkettenis char *suffix = strstr (name, "___XR");
4126*11efff7fSkettenis char *last;
4127*11efff7fSkettenis int scope_len;
4128*11efff7fSkettenis char *scope;
4129*11efff7fSkettenis
4130*11efff7fSkettenis /* Now, backtrack a bit until we find the first "__". Start looking
4131*11efff7fSkettenis at suffix - 3, as the <rename> part is at least one character long. */
4132*11efff7fSkettenis
4133*11efff7fSkettenis for (last = suffix - 3; last > name; last--)
4134*11efff7fSkettenis if (last[0] == '_' && last[1] == '_')
4135*11efff7fSkettenis break;
4136*11efff7fSkettenis
4137*11efff7fSkettenis /* Make a copy of scope and return it. */
4138*11efff7fSkettenis
4139*11efff7fSkettenis scope_len = last - name;
4140*11efff7fSkettenis scope = (char *) xmalloc ((scope_len + 1) * sizeof (char));
4141*11efff7fSkettenis
4142*11efff7fSkettenis strncpy (scope, name, scope_len);
4143*11efff7fSkettenis scope[scope_len] = '\0';
4144*11efff7fSkettenis
4145*11efff7fSkettenis return scope;
4146*11efff7fSkettenis }
4147*11efff7fSkettenis
4148*11efff7fSkettenis /* Return nonzero if NAME corresponds to a package name. */
4149*11efff7fSkettenis
4150*11efff7fSkettenis static int
is_package_name(const char * name)4151*11efff7fSkettenis is_package_name (const char *name)
4152*11efff7fSkettenis {
4153*11efff7fSkettenis /* Here, We take advantage of the fact that no symbols are generated
4154*11efff7fSkettenis for packages, while symbols are generated for each function.
4155*11efff7fSkettenis So the condition for NAME represent a package becomes equivalent
4156*11efff7fSkettenis to NAME not existing in our list of symbols. There is only one
4157*11efff7fSkettenis small complication with library-level functions (see below). */
4158*11efff7fSkettenis
4159*11efff7fSkettenis char *fun_name;
4160*11efff7fSkettenis
4161*11efff7fSkettenis /* If it is a function that has not been defined at library level,
4162*11efff7fSkettenis then we should be able to look it up in the symbols. */
4163*11efff7fSkettenis if (standard_lookup (name, NULL, VAR_DOMAIN) != NULL)
4164*11efff7fSkettenis return 0;
4165*11efff7fSkettenis
4166*11efff7fSkettenis /* Library-level function names start with "_ada_". See if function
4167*11efff7fSkettenis "_ada_" followed by NAME can be found. */
4168*11efff7fSkettenis
4169*11efff7fSkettenis /* Do a quick check that NAME does not contain "__", since library-level
4170*11efff7fSkettenis functions names can not contain "__" in them. */
4171*11efff7fSkettenis if (strstr (name, "__") != NULL)
4172*11efff7fSkettenis return 0;
4173*11efff7fSkettenis
4174*11efff7fSkettenis fun_name = xstrprintf ("_ada_%s", name);
4175*11efff7fSkettenis
4176*11efff7fSkettenis return (standard_lookup (fun_name, NULL, VAR_DOMAIN) == NULL);
4177*11efff7fSkettenis }
4178*11efff7fSkettenis
4179*11efff7fSkettenis /* Return nonzero if SYM corresponds to a renaming entity that is
4180*11efff7fSkettenis visible from FUNCTION_NAME. */
4181*11efff7fSkettenis
4182*11efff7fSkettenis static int
renaming_is_visible(const struct symbol * sym,char * function_name)4183*11efff7fSkettenis renaming_is_visible (const struct symbol *sym, char *function_name)
4184*11efff7fSkettenis {
4185*11efff7fSkettenis char *scope = xget_renaming_scope (SYMBOL_TYPE (sym));
4186*11efff7fSkettenis
4187*11efff7fSkettenis make_cleanup (xfree, scope);
4188*11efff7fSkettenis
4189*11efff7fSkettenis /* If the rename has been defined in a package, then it is visible. */
4190*11efff7fSkettenis if (is_package_name (scope))
4191*11efff7fSkettenis return 1;
4192*11efff7fSkettenis
4193*11efff7fSkettenis /* Check that the rename is in the current function scope by checking
4194*11efff7fSkettenis that its name starts with SCOPE. */
4195*11efff7fSkettenis
4196*11efff7fSkettenis /* If the function name starts with "_ada_", it means that it is
4197*11efff7fSkettenis a library-level function. Strip this prefix before doing the
4198*11efff7fSkettenis comparison, as the encoding for the renaming does not contain
4199*11efff7fSkettenis this prefix. */
4200*11efff7fSkettenis if (strncmp (function_name, "_ada_", 5) == 0)
4201*11efff7fSkettenis function_name += 5;
4202*11efff7fSkettenis
4203*11efff7fSkettenis return (strncmp (function_name, scope, strlen (scope)) == 0);
4204*11efff7fSkettenis }
4205*11efff7fSkettenis
4206*11efff7fSkettenis /* Iterates over the SYMS list and remove any entry that corresponds to
4207*11efff7fSkettenis a renaming entity that is not visible from the function associated
4208*11efff7fSkettenis with CURRENT_BLOCK.
4209*11efff7fSkettenis
4210*11efff7fSkettenis Rationale:
4211*11efff7fSkettenis GNAT emits a type following a specified encoding for each renaming
4212*11efff7fSkettenis entity. Unfortunately, STABS currently does not support the definition
4213*11efff7fSkettenis of types that are local to a given lexical block, so all renamings types
4214*11efff7fSkettenis are emitted at library level. As a consequence, if an application
4215*11efff7fSkettenis contains two renaming entities using the same name, and a user tries to
4216*11efff7fSkettenis print the value of one of these entities, the result of the ada symbol
4217*11efff7fSkettenis lookup will also contain the wrong renaming type.
4218*11efff7fSkettenis
4219*11efff7fSkettenis This function partially covers for this limitation by attempting to
4220*11efff7fSkettenis remove from the SYMS list renaming symbols that should be visible
4221*11efff7fSkettenis from CURRENT_BLOCK. However, there does not seem be a 100% reliable
4222*11efff7fSkettenis method with the current information available. The implementation
4223*11efff7fSkettenis below has a couple of limitations (FIXME: brobecker-2003-05-12):
4224*11efff7fSkettenis
4225*11efff7fSkettenis - When the user tries to print a rename in a function while there
4226*11efff7fSkettenis is another rename entity defined in a package: Normally, the
4227*11efff7fSkettenis rename in the function has precedence over the rename in the
4228*11efff7fSkettenis package, so the latter should be removed from the list. This is
4229*11efff7fSkettenis currently not the case.
4230*11efff7fSkettenis
4231*11efff7fSkettenis - This function will incorrectly remove valid renames if
4232*11efff7fSkettenis the CURRENT_BLOCK corresponds to a function which symbol name
4233*11efff7fSkettenis has been changed by an "Export" pragma. As a consequence,
4234*11efff7fSkettenis the user will be unable to print such rename entities. */
4235*11efff7fSkettenis
4236*11efff7fSkettenis static int
remove_out_of_scope_renamings(struct ada_symbol_info * syms,int nsyms,struct block * current_block)4237*11efff7fSkettenis remove_out_of_scope_renamings (struct ada_symbol_info *syms,
4238*11efff7fSkettenis int nsyms, struct block *current_block)
4239*11efff7fSkettenis {
4240*11efff7fSkettenis struct symbol *current_function;
4241*11efff7fSkettenis char *current_function_name;
4242*11efff7fSkettenis int i;
4243*11efff7fSkettenis
4244*11efff7fSkettenis /* Extract the function name associated to CURRENT_BLOCK.
4245*11efff7fSkettenis Abort if unable to do so. */
4246*11efff7fSkettenis
4247*11efff7fSkettenis if (current_block == NULL)
4248*11efff7fSkettenis return nsyms;
4249*11efff7fSkettenis
4250*11efff7fSkettenis current_function = block_function (current_block);
4251*11efff7fSkettenis if (current_function == NULL)
4252*11efff7fSkettenis return nsyms;
4253*11efff7fSkettenis
4254*11efff7fSkettenis current_function_name = SYMBOL_LINKAGE_NAME (current_function);
4255*11efff7fSkettenis if (current_function_name == NULL)
4256*11efff7fSkettenis return nsyms;
4257*11efff7fSkettenis
4258*11efff7fSkettenis /* Check each of the symbols, and remove it from the list if it is
4259*11efff7fSkettenis a type corresponding to a renaming that is out of the scope of
4260*11efff7fSkettenis the current block. */
4261*11efff7fSkettenis
4262*11efff7fSkettenis i = 0;
4263*11efff7fSkettenis while (i < nsyms)
4264*11efff7fSkettenis {
4265*11efff7fSkettenis if (ada_is_object_renaming (syms[i].sym)
4266*11efff7fSkettenis && !renaming_is_visible (syms[i].sym, current_function_name))
4267*11efff7fSkettenis {
4268*11efff7fSkettenis int j;
4269*11efff7fSkettenis for (j = i + 1; j < nsyms; j++)
4270*11efff7fSkettenis syms[j - 1] = syms[j];
4271*11efff7fSkettenis nsyms -= 1;
4272*11efff7fSkettenis }
4273*11efff7fSkettenis else
4274*11efff7fSkettenis i += 1;
4275*11efff7fSkettenis }
4276*11efff7fSkettenis
4277*11efff7fSkettenis return nsyms;
4278*11efff7fSkettenis }
4279*11efff7fSkettenis
4280*11efff7fSkettenis /* Find symbols in DOMAIN matching NAME0, in BLOCK0 and enclosing
4281b725ae77Skettenis scope and in global scopes, returning the number of matches. Sets
4282*11efff7fSkettenis *RESULTS to point to a vector of (SYM,BLOCK,SYMTAB) triples,
4283*11efff7fSkettenis indicating the symbols found and the blocks and symbol tables (if
4284*11efff7fSkettenis any) in which they were found. This vector are transient---good only to
4285*11efff7fSkettenis the next call of ada_lookup_symbol_list. Any non-function/non-enumeral
4286*11efff7fSkettenis symbol match within the nest of blocks whose innermost member is BLOCK0,
4287*11efff7fSkettenis is the one match returned (no other matches in that or
4288b725ae77Skettenis enclosing blocks is returned). If there are any matches in or
4289*11efff7fSkettenis surrounding BLOCK0, then these alone are returned. Otherwise, the
4290*11efff7fSkettenis search extends to global and file-scope (static) symbol tables.
4291*11efff7fSkettenis Names prefixed with "standard__" are handled specially: "standard__"
4292*11efff7fSkettenis is first stripped off, and only static and global symbols are searched. */
4293b725ae77Skettenis
4294b725ae77Skettenis int
ada_lookup_symbol_list(const char * name0,const struct block * block0,domain_enum namespace,struct ada_symbol_info ** results)4295*11efff7fSkettenis ada_lookup_symbol_list (const char *name0, const struct block *block0,
4296*11efff7fSkettenis domain_enum namespace,
4297*11efff7fSkettenis struct ada_symbol_info **results)
4298b725ae77Skettenis {
4299b725ae77Skettenis struct symbol *sym;
4300b725ae77Skettenis struct symtab *s;
4301b725ae77Skettenis struct partial_symtab *ps;
4302b725ae77Skettenis struct blockvector *bv;
4303b725ae77Skettenis struct objfile *objfile;
4304b725ae77Skettenis struct block *block;
4305*11efff7fSkettenis const char *name;
4306b725ae77Skettenis struct minimal_symbol *msymbol;
4307*11efff7fSkettenis int wild_match;
4308b725ae77Skettenis int cacheIfUnique;
4309*11efff7fSkettenis int block_depth;
4310*11efff7fSkettenis int ndefns;
4311b725ae77Skettenis
4312*11efff7fSkettenis obstack_free (&symbol_list_obstack, NULL);
4313*11efff7fSkettenis obstack_init (&symbol_list_obstack);
4314b725ae77Skettenis
4315b725ae77Skettenis cacheIfUnique = 0;
4316b725ae77Skettenis
4317b725ae77Skettenis /* Search specified block and its superiors. */
4318b725ae77Skettenis
4319*11efff7fSkettenis wild_match = (strstr (name0, "__") == NULL);
4320*11efff7fSkettenis name = name0;
4321*11efff7fSkettenis block = (struct block *) block0; /* FIXME: No cast ought to be
4322*11efff7fSkettenis needed, but adding const will
4323*11efff7fSkettenis have a cascade effect. */
4324*11efff7fSkettenis if (strncmp (name0, "standard__", sizeof ("standard__") - 1) == 0)
4325*11efff7fSkettenis {
4326*11efff7fSkettenis wild_match = 0;
4327*11efff7fSkettenis block = NULL;
4328*11efff7fSkettenis name = name0 + sizeof ("standard__") - 1;
4329*11efff7fSkettenis }
4330*11efff7fSkettenis
4331*11efff7fSkettenis block_depth = 0;
4332b725ae77Skettenis while (block != NULL)
4333b725ae77Skettenis {
4334*11efff7fSkettenis block_depth += 1;
4335*11efff7fSkettenis ada_add_block_symbols (&symbol_list_obstack, block, name,
4336*11efff7fSkettenis namespace, NULL, NULL, wild_match);
4337b725ae77Skettenis
4338b725ae77Skettenis /* If we found a non-function match, assume that's the one. */
4339*11efff7fSkettenis if (is_nonfunction (defns_collected (&symbol_list_obstack, 0),
4340*11efff7fSkettenis num_defns_collected (&symbol_list_obstack)))
4341b725ae77Skettenis goto done;
4342b725ae77Skettenis
4343b725ae77Skettenis block = BLOCK_SUPERBLOCK (block);
4344b725ae77Skettenis }
4345b725ae77Skettenis
4346*11efff7fSkettenis /* If no luck so far, try to find NAME as a local symbol in some lexically
4347*11efff7fSkettenis enclosing subprogram. */
4348*11efff7fSkettenis if (num_defns_collected (&symbol_list_obstack) == 0 && block_depth > 2)
4349*11efff7fSkettenis add_symbols_from_enclosing_procs (&symbol_list_obstack,
4350*11efff7fSkettenis name, namespace, wild_match);
4351b725ae77Skettenis
4352*11efff7fSkettenis /* If we found ANY matches among non-global symbols, we're done. */
4353*11efff7fSkettenis
4354*11efff7fSkettenis if (num_defns_collected (&symbol_list_obstack) > 0)
4355b725ae77Skettenis goto done;
4356b725ae77Skettenis
4357b725ae77Skettenis cacheIfUnique = 1;
4358*11efff7fSkettenis if (lookup_cached_symbol (name0, namespace, &sym, &block, &s))
4359*11efff7fSkettenis {
4360*11efff7fSkettenis if (sym != NULL)
4361*11efff7fSkettenis add_defn_to_vec (&symbol_list_obstack, sym, block, s);
4362*11efff7fSkettenis goto done;
4363*11efff7fSkettenis }
4364b725ae77Skettenis
4365b725ae77Skettenis /* Now add symbols from all global blocks: symbol tables, minimal symbol
4366*11efff7fSkettenis tables, and psymtab's. */
4367b725ae77Skettenis
4368b725ae77Skettenis ALL_SYMTABS (objfile, s)
4369b725ae77Skettenis {
4370b725ae77Skettenis QUIT;
4371b725ae77Skettenis if (!s->primary)
4372b725ae77Skettenis continue;
4373b725ae77Skettenis bv = BLOCKVECTOR (s);
4374b725ae77Skettenis block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
4375*11efff7fSkettenis ada_add_block_symbols (&symbol_list_obstack, block, name, namespace,
4376*11efff7fSkettenis objfile, s, wild_match);
4377b725ae77Skettenis }
4378b725ae77Skettenis
4379*11efff7fSkettenis if (namespace == VAR_DOMAIN)
4380b725ae77Skettenis {
4381b725ae77Skettenis ALL_MSYMBOLS (objfile, msymbol)
4382b725ae77Skettenis {
4383*11efff7fSkettenis if (ada_match_name (SYMBOL_LINKAGE_NAME (msymbol), name, wild_match))
4384b725ae77Skettenis {
4385b725ae77Skettenis switch (MSYMBOL_TYPE (msymbol))
4386b725ae77Skettenis {
4387b725ae77Skettenis case mst_solib_trampoline:
4388b725ae77Skettenis break;
4389b725ae77Skettenis default:
4390b725ae77Skettenis s = find_pc_symtab (SYMBOL_VALUE_ADDRESS (msymbol));
4391b725ae77Skettenis if (s != NULL)
4392b725ae77Skettenis {
4393*11efff7fSkettenis int ndefns0 = num_defns_collected (&symbol_list_obstack);
4394b725ae77Skettenis QUIT;
4395b725ae77Skettenis bv = BLOCKVECTOR (s);
4396b725ae77Skettenis block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
4397*11efff7fSkettenis ada_add_block_symbols (&symbol_list_obstack, block,
4398*11efff7fSkettenis SYMBOL_LINKAGE_NAME (msymbol),
4399*11efff7fSkettenis namespace, objfile, s, wild_match);
4400*11efff7fSkettenis
4401*11efff7fSkettenis if (num_defns_collected (&symbol_list_obstack) == ndefns0)
4402b725ae77Skettenis {
4403b725ae77Skettenis block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
4404*11efff7fSkettenis ada_add_block_symbols (&symbol_list_obstack, block,
4405*11efff7fSkettenis SYMBOL_LINKAGE_NAME (msymbol),
4406*11efff7fSkettenis namespace, objfile, s,
4407b725ae77Skettenis wild_match);
4408b725ae77Skettenis }
4409b725ae77Skettenis }
4410b725ae77Skettenis }
4411b725ae77Skettenis }
4412b725ae77Skettenis }
4413b725ae77Skettenis }
4414b725ae77Skettenis
4415b725ae77Skettenis ALL_PSYMTABS (objfile, ps)
4416b725ae77Skettenis {
4417b725ae77Skettenis QUIT;
4418b725ae77Skettenis if (!ps->readin
4419*11efff7fSkettenis && ada_lookup_partial_symbol (ps, name, 1, namespace, wild_match))
4420b725ae77Skettenis {
4421b725ae77Skettenis s = PSYMTAB_TO_SYMTAB (ps);
4422b725ae77Skettenis if (!s->primary)
4423b725ae77Skettenis continue;
4424b725ae77Skettenis bv = BLOCKVECTOR (s);
4425b725ae77Skettenis block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
4426*11efff7fSkettenis ada_add_block_symbols (&symbol_list_obstack, block, name,
4427*11efff7fSkettenis namespace, objfile, s, wild_match);
4428b725ae77Skettenis }
4429b725ae77Skettenis }
4430b725ae77Skettenis
4431*11efff7fSkettenis /* Now add symbols from all per-file blocks if we've gotten no hits
4432b725ae77Skettenis (Not strictly correct, but perhaps better than an error).
4433*11efff7fSkettenis Do the symtabs first, then check the psymtabs. */
4434b725ae77Skettenis
4435*11efff7fSkettenis if (num_defns_collected (&symbol_list_obstack) == 0)
4436b725ae77Skettenis {
4437b725ae77Skettenis
4438b725ae77Skettenis ALL_SYMTABS (objfile, s)
4439b725ae77Skettenis {
4440b725ae77Skettenis QUIT;
4441b725ae77Skettenis if (!s->primary)
4442b725ae77Skettenis continue;
4443b725ae77Skettenis bv = BLOCKVECTOR (s);
4444b725ae77Skettenis block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
4445*11efff7fSkettenis ada_add_block_symbols (&symbol_list_obstack, block, name, namespace,
4446*11efff7fSkettenis objfile, s, wild_match);
4447b725ae77Skettenis }
4448b725ae77Skettenis
4449b725ae77Skettenis ALL_PSYMTABS (objfile, ps)
4450b725ae77Skettenis {
4451b725ae77Skettenis QUIT;
4452b725ae77Skettenis if (!ps->readin
4453*11efff7fSkettenis && ada_lookup_partial_symbol (ps, name, 0, namespace, wild_match))
4454b725ae77Skettenis {
4455b725ae77Skettenis s = PSYMTAB_TO_SYMTAB (ps);
4456b725ae77Skettenis bv = BLOCKVECTOR (s);
4457b725ae77Skettenis if (!s->primary)
4458b725ae77Skettenis continue;
4459b725ae77Skettenis block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
4460*11efff7fSkettenis ada_add_block_symbols (&symbol_list_obstack, block, name,
4461*11efff7fSkettenis namespace, objfile, s, wild_match);
4462b725ae77Skettenis }
4463b725ae77Skettenis }
4464b725ae77Skettenis }
4465b725ae77Skettenis
4466b725ae77Skettenis done:
4467*11efff7fSkettenis ndefns = num_defns_collected (&symbol_list_obstack);
4468*11efff7fSkettenis *results = defns_collected (&symbol_list_obstack, 1);
4469b725ae77Skettenis
4470*11efff7fSkettenis ndefns = remove_extra_symbols (*results, ndefns);
4471b725ae77Skettenis
4472*11efff7fSkettenis if (ndefns == 0)
4473*11efff7fSkettenis cache_symbol (name0, namespace, NULL, NULL, NULL);
4474*11efff7fSkettenis
4475*11efff7fSkettenis if (ndefns == 1 && cacheIfUnique)
4476*11efff7fSkettenis cache_symbol (name0, namespace, (*results)[0].sym, (*results)[0].block,
4477*11efff7fSkettenis (*results)[0].symtab);
4478*11efff7fSkettenis
4479*11efff7fSkettenis ndefns = remove_out_of_scope_renamings (*results, ndefns,
4480*11efff7fSkettenis (struct block *) block0);
4481*11efff7fSkettenis
4482b725ae77Skettenis return ndefns;
4483b725ae77Skettenis }
4484b725ae77Skettenis
4485b725ae77Skettenis /* Return a symbol in DOMAIN matching NAME, in BLOCK0 and enclosing
4486*11efff7fSkettenis scope and in global scopes, or NULL if none. NAME is folded and
4487*11efff7fSkettenis encoded first. Otherwise, the result is as for ada_lookup_symbol_list,
4488*11efff7fSkettenis choosing the first symbol if there are multiple choices.
4489*11efff7fSkettenis *IS_A_FIELD_OF_THIS is set to 0 and *SYMTAB is set to the symbol
4490*11efff7fSkettenis table in which the symbol was found (in both cases, these
4491*11efff7fSkettenis assignments occur only if the pointers are non-null). */
4492b725ae77Skettenis
4493b725ae77Skettenis struct symbol *
ada_lookup_symbol(const char * name,const struct block * block0,domain_enum namespace,int * is_a_field_of_this,struct symtab ** symtab)4494*11efff7fSkettenis ada_lookup_symbol (const char *name, const struct block *block0,
4495*11efff7fSkettenis domain_enum namespace, int *is_a_field_of_this,
4496*11efff7fSkettenis struct symtab **symtab)
4497b725ae77Skettenis {
4498*11efff7fSkettenis struct ada_symbol_info *candidates;
4499b725ae77Skettenis int n_candidates;
4500b725ae77Skettenis
4501*11efff7fSkettenis n_candidates = ada_lookup_symbol_list (ada_encode (ada_fold_name (name)),
4502*11efff7fSkettenis block0, namespace, &candidates);
4503b725ae77Skettenis
4504b725ae77Skettenis if (n_candidates == 0)
4505b725ae77Skettenis return NULL;
4506b725ae77Skettenis
4507*11efff7fSkettenis if (is_a_field_of_this != NULL)
4508*11efff7fSkettenis *is_a_field_of_this = 0;
4509*11efff7fSkettenis
4510*11efff7fSkettenis if (symtab != NULL)
4511*11efff7fSkettenis {
4512*11efff7fSkettenis *symtab = candidates[0].symtab;
4513*11efff7fSkettenis if (*symtab == NULL && candidates[0].block != NULL)
4514*11efff7fSkettenis {
4515*11efff7fSkettenis struct objfile *objfile;
4516*11efff7fSkettenis struct symtab *s;
4517*11efff7fSkettenis struct block *b;
4518*11efff7fSkettenis struct blockvector *bv;
4519*11efff7fSkettenis
4520*11efff7fSkettenis /* Search the list of symtabs for one which contains the
4521*11efff7fSkettenis address of the start of this block. */
4522*11efff7fSkettenis ALL_SYMTABS (objfile, s)
4523*11efff7fSkettenis {
4524*11efff7fSkettenis bv = BLOCKVECTOR (s);
4525*11efff7fSkettenis b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
4526*11efff7fSkettenis if (BLOCK_START (b) <= BLOCK_START (candidates[0].block)
4527*11efff7fSkettenis && BLOCK_END (b) > BLOCK_START (candidates[0].block))
4528*11efff7fSkettenis {
4529*11efff7fSkettenis *symtab = s;
4530*11efff7fSkettenis return fixup_symbol_section (candidates[0].sym, objfile);
4531*11efff7fSkettenis }
4532*11efff7fSkettenis return fixup_symbol_section (candidates[0].sym, NULL);
4533*11efff7fSkettenis }
4534*11efff7fSkettenis }
4535*11efff7fSkettenis }
4536*11efff7fSkettenis return candidates[0].sym;
4537*11efff7fSkettenis }
4538*11efff7fSkettenis
4539*11efff7fSkettenis static struct symbol *
ada_lookup_symbol_nonlocal(const char * name,const char * linkage_name,const struct block * block,const domain_enum domain,struct symtab ** symtab)4540*11efff7fSkettenis ada_lookup_symbol_nonlocal (const char *name,
4541*11efff7fSkettenis const char *linkage_name,
4542*11efff7fSkettenis const struct block *block,
4543*11efff7fSkettenis const domain_enum domain, struct symtab **symtab)
4544*11efff7fSkettenis {
4545*11efff7fSkettenis if (linkage_name == NULL)
4546*11efff7fSkettenis linkage_name = name;
4547*11efff7fSkettenis return ada_lookup_symbol (linkage_name, block_static_block (block), domain,
4548*11efff7fSkettenis NULL, symtab);
4549b725ae77Skettenis }
4550b725ae77Skettenis
4551b725ae77Skettenis
4552b725ae77Skettenis /* True iff STR is a possible encoded suffix of a normal Ada name
4553*11efff7fSkettenis that is to be ignored for matching purposes. Suffixes of parallel
4554*11efff7fSkettenis names (e.g., XVE) are not included here. Currently, the possible suffixes
4555*11efff7fSkettenis are given by either of the regular expression:
4556*11efff7fSkettenis
4557*11efff7fSkettenis (__[0-9]+)?\.[0-9]+ [nested subprogram suffix, on platforms such
4558*11efff7fSkettenis as GNU/Linux]
4559*11efff7fSkettenis ___[0-9]+ [nested subprogram suffix, on platforms such as HP/UX]
4560*11efff7fSkettenis (X[nb]*)?((\$|__)[0-9](_?[0-9]+)|___(JM|LJM|X([FDBUP].*|R[^T]?)))?$
4561b725ae77Skettenis */
4562*11efff7fSkettenis
4563b725ae77Skettenis static int
is_name_suffix(const char * str)4564b725ae77Skettenis is_name_suffix (const char *str)
4565b725ae77Skettenis {
4566b725ae77Skettenis int k;
4567*11efff7fSkettenis const char *matching;
4568*11efff7fSkettenis const int len = strlen (str);
4569*11efff7fSkettenis
4570*11efff7fSkettenis /* (__[0-9]+)?\.[0-9]+ */
4571*11efff7fSkettenis matching = str;
4572*11efff7fSkettenis if (len > 3 && str[0] == '_' && str[1] == '_' && isdigit (str[2]))
4573*11efff7fSkettenis {
4574*11efff7fSkettenis matching += 3;
4575*11efff7fSkettenis while (isdigit (matching[0]))
4576*11efff7fSkettenis matching += 1;
4577*11efff7fSkettenis if (matching[0] == '\0')
4578*11efff7fSkettenis return 1;
4579*11efff7fSkettenis }
4580*11efff7fSkettenis
4581*11efff7fSkettenis if (matching[0] == '.')
4582*11efff7fSkettenis {
4583*11efff7fSkettenis matching += 1;
4584*11efff7fSkettenis while (isdigit (matching[0]))
4585*11efff7fSkettenis matching += 1;
4586*11efff7fSkettenis if (matching[0] == '\0')
4587*11efff7fSkettenis return 1;
4588*11efff7fSkettenis }
4589*11efff7fSkettenis
4590*11efff7fSkettenis /* ___[0-9]+ */
4591*11efff7fSkettenis if (len > 3 && str[0] == '_' && str[1] == '_' && str[2] == '_')
4592*11efff7fSkettenis {
4593*11efff7fSkettenis matching = str + 3;
4594*11efff7fSkettenis while (isdigit (matching[0]))
4595*11efff7fSkettenis matching += 1;
4596*11efff7fSkettenis if (matching[0] == '\0')
4597*11efff7fSkettenis return 1;
4598*11efff7fSkettenis }
4599*11efff7fSkettenis
4600*11efff7fSkettenis /* ??? We should not modify STR directly, as we are doing below. This
4601*11efff7fSkettenis is fine in this case, but may become problematic later if we find
4602*11efff7fSkettenis that this alternative did not work, and want to try matching
4603*11efff7fSkettenis another one from the begining of STR. Since we modified it, we
4604*11efff7fSkettenis won't be able to find the begining of the string anymore! */
4605b725ae77Skettenis if (str[0] == 'X')
4606b725ae77Skettenis {
4607b725ae77Skettenis str += 1;
4608b725ae77Skettenis while (str[0] != '_' && str[0] != '\0')
4609b725ae77Skettenis {
4610b725ae77Skettenis if (str[0] != 'n' && str[0] != 'b')
4611b725ae77Skettenis return 0;
4612b725ae77Skettenis str += 1;
4613b725ae77Skettenis }
4614b725ae77Skettenis }
4615b725ae77Skettenis if (str[0] == '\000')
4616b725ae77Skettenis return 1;
4617b725ae77Skettenis if (str[0] == '_')
4618b725ae77Skettenis {
4619b725ae77Skettenis if (str[1] != '_' || str[2] == '\000')
4620b725ae77Skettenis return 0;
4621b725ae77Skettenis if (str[2] == '_')
4622b725ae77Skettenis {
4623*11efff7fSkettenis if (strcmp (str + 3, "JM") == 0)
4624*11efff7fSkettenis return 1;
4625*11efff7fSkettenis /* FIXME: brobecker/2004-09-30: GNAT will soon stop using
4626*11efff7fSkettenis the LJM suffix in favor of the JM one. But we will
4627*11efff7fSkettenis still accept LJM as a valid suffix for a reasonable
4628*11efff7fSkettenis amount of time, just to allow ourselves to debug programs
4629*11efff7fSkettenis compiled using an older version of GNAT. */
4630*11efff7fSkettenis if (strcmp (str + 3, "LJM") == 0)
4631b725ae77Skettenis return 1;
4632b725ae77Skettenis if (str[3] != 'X')
4633b725ae77Skettenis return 0;
4634*11efff7fSkettenis if (str[4] == 'F' || str[4] == 'D' || str[4] == 'B'
4635*11efff7fSkettenis || str[4] == 'U' || str[4] == 'P')
4636b725ae77Skettenis return 1;
4637b725ae77Skettenis if (str[4] == 'R' && str[5] != 'T')
4638b725ae77Skettenis return 1;
4639b725ae77Skettenis return 0;
4640b725ae77Skettenis }
4641*11efff7fSkettenis if (!isdigit (str[2]))
4642*11efff7fSkettenis return 0;
4643*11efff7fSkettenis for (k = 3; str[k] != '\0'; k += 1)
4644*11efff7fSkettenis if (!isdigit (str[k]) && str[k] != '_')
4645b725ae77Skettenis return 0;
4646b725ae77Skettenis return 1;
4647b725ae77Skettenis }
4648*11efff7fSkettenis if (str[0] == '$' && isdigit (str[1]))
4649b725ae77Skettenis {
4650*11efff7fSkettenis for (k = 2; str[k] != '\0'; k += 1)
4651*11efff7fSkettenis if (!isdigit (str[k]) && str[k] != '_')
4652b725ae77Skettenis return 0;
4653b725ae77Skettenis return 1;
4654b725ae77Skettenis }
4655b725ae77Skettenis return 0;
4656b725ae77Skettenis }
4657b725ae77Skettenis
4658*11efff7fSkettenis /* Return nonzero if the given string starts with a dot ('.')
4659*11efff7fSkettenis followed by zero or more digits.
4660*11efff7fSkettenis
4661*11efff7fSkettenis Note: brobecker/2003-11-10: A forward declaration has not been
4662*11efff7fSkettenis added at the begining of this file yet, because this function
4663*11efff7fSkettenis is only used to work around a problem found during wild matching
4664*11efff7fSkettenis when trying to match minimal symbol names against symbol names
4665*11efff7fSkettenis obtained from dwarf-2 data. This function is therefore currently
4666*11efff7fSkettenis only used in wild_match() and is likely to be deleted when the
4667*11efff7fSkettenis problem in dwarf-2 is fixed. */
4668*11efff7fSkettenis
4669*11efff7fSkettenis static int
is_dot_digits_suffix(const char * str)4670*11efff7fSkettenis is_dot_digits_suffix (const char *str)
4671*11efff7fSkettenis {
4672*11efff7fSkettenis if (str[0] != '.')
4673*11efff7fSkettenis return 0;
4674*11efff7fSkettenis
4675*11efff7fSkettenis str++;
4676*11efff7fSkettenis while (isdigit (str[0]))
4677*11efff7fSkettenis str++;
4678*11efff7fSkettenis return (str[0] == '\0');
4679*11efff7fSkettenis }
4680*11efff7fSkettenis
4681b725ae77Skettenis /* True if NAME represents a name of the form A1.A2....An, n>=1 and
4682*11efff7fSkettenis PATN[0..PATN_LEN-1] = Ak.Ak+1.....An for some k >= 1. Ignores
4683*11efff7fSkettenis informational suffixes of NAME (i.e., for which is_name_suffix is
4684*11efff7fSkettenis true). */
4685*11efff7fSkettenis
4686b725ae77Skettenis static int
wild_match(const char * patn0,int patn_len,const char * name0)4687*11efff7fSkettenis wild_match (const char *patn0, int patn_len, const char *name0)
4688b725ae77Skettenis {
4689b725ae77Skettenis int name_len;
4690*11efff7fSkettenis char *name;
4691*11efff7fSkettenis char *patn;
4692*11efff7fSkettenis
4693*11efff7fSkettenis /* FIXME: brobecker/2003-11-10: For some reason, the symbol name
4694*11efff7fSkettenis stored in the symbol table for nested function names is sometimes
4695*11efff7fSkettenis different from the name of the associated entity stored in
4696*11efff7fSkettenis the dwarf-2 data: This is the case for nested subprograms, where
4697*11efff7fSkettenis the minimal symbol name contains a trailing ".[:digit:]+" suffix,
4698*11efff7fSkettenis while the symbol name from the dwarf-2 data does not.
4699*11efff7fSkettenis
4700*11efff7fSkettenis Although the DWARF-2 standard documents that entity names stored
4701*11efff7fSkettenis in the dwarf-2 data should be identical to the name as seen in
4702*11efff7fSkettenis the source code, GNAT takes a different approach as we already use
4703*11efff7fSkettenis a special encoding mechanism to convey the information so that
4704*11efff7fSkettenis a C debugger can still use the information generated to debug
4705*11efff7fSkettenis Ada programs. A corollary is that the symbol names in the dwarf-2
4706*11efff7fSkettenis data should match the names found in the symbol table. I therefore
4707*11efff7fSkettenis consider this issue as a compiler defect.
4708*11efff7fSkettenis
4709*11efff7fSkettenis Until the compiler is properly fixed, we work-around the problem
4710*11efff7fSkettenis by ignoring such suffixes during the match. We do so by making
4711*11efff7fSkettenis a copy of PATN0 and NAME0, and then by stripping such a suffix
4712*11efff7fSkettenis if present. We then perform the match on the resulting strings. */
4713*11efff7fSkettenis {
4714*11efff7fSkettenis char *dot;
4715*11efff7fSkettenis name_len = strlen (name0);
4716*11efff7fSkettenis
4717*11efff7fSkettenis name = (char *) alloca ((name_len + 1) * sizeof (char));
4718*11efff7fSkettenis strcpy (name, name0);
4719*11efff7fSkettenis dot = strrchr (name, '.');
4720*11efff7fSkettenis if (dot != NULL && is_dot_digits_suffix (dot))
4721*11efff7fSkettenis *dot = '\0';
4722*11efff7fSkettenis
4723*11efff7fSkettenis patn = (char *) alloca ((patn_len + 1) * sizeof (char));
4724*11efff7fSkettenis strncpy (patn, patn0, patn_len);
4725*11efff7fSkettenis patn[patn_len] = '\0';
4726*11efff7fSkettenis dot = strrchr (patn, '.');
4727*11efff7fSkettenis if (dot != NULL && is_dot_digits_suffix (dot))
4728*11efff7fSkettenis {
4729*11efff7fSkettenis *dot = '\0';
4730*11efff7fSkettenis patn_len = dot - patn;
4731*11efff7fSkettenis }
4732*11efff7fSkettenis }
4733*11efff7fSkettenis
4734*11efff7fSkettenis /* Now perform the wild match. */
4735b725ae77Skettenis
4736b725ae77Skettenis name_len = strlen (name);
4737*11efff7fSkettenis if (name_len >= patn_len + 5 && strncmp (name, "_ada_", 5) == 0
4738*11efff7fSkettenis && strncmp (patn, name + 5, patn_len) == 0
4739b725ae77Skettenis && is_name_suffix (name + patn_len + 5))
4740b725ae77Skettenis return 1;
4741b725ae77Skettenis
4742b725ae77Skettenis while (name_len >= patn_len)
4743b725ae77Skettenis {
4744*11efff7fSkettenis if (strncmp (patn, name, patn_len) == 0
4745*11efff7fSkettenis && is_name_suffix (name + patn_len))
4746b725ae77Skettenis return 1;
4747b725ae77Skettenis do
4748b725ae77Skettenis {
4749b725ae77Skettenis name += 1;
4750b725ae77Skettenis name_len -= 1;
4751b725ae77Skettenis }
4752b725ae77Skettenis while (name_len > 0
4753b725ae77Skettenis && name[0] != '.' && (name[0] != '_' || name[1] != '_'));
4754b725ae77Skettenis if (name_len <= 0)
4755b725ae77Skettenis return 0;
4756b725ae77Skettenis if (name[0] == '_')
4757b725ae77Skettenis {
4758b725ae77Skettenis if (!islower (name[2]))
4759b725ae77Skettenis return 0;
4760b725ae77Skettenis name += 2;
4761b725ae77Skettenis name_len -= 2;
4762b725ae77Skettenis }
4763b725ae77Skettenis else
4764b725ae77Skettenis {
4765b725ae77Skettenis if (!islower (name[1]))
4766b725ae77Skettenis return 0;
4767b725ae77Skettenis name += 1;
4768b725ae77Skettenis name_len -= 1;
4769b725ae77Skettenis }
4770b725ae77Skettenis }
4771b725ae77Skettenis
4772b725ae77Skettenis return 0;
4773b725ae77Skettenis }
4774b725ae77Skettenis
4775b725ae77Skettenis
4776b725ae77Skettenis /* Add symbols from BLOCK matching identifier NAME in DOMAIN to
4777*11efff7fSkettenis vector *defn_symbols, updating the list of symbols in OBSTACKP
4778*11efff7fSkettenis (if necessary). If WILD, treat as NAME with a wildcard prefix.
4779*11efff7fSkettenis OBJFILE is the section containing BLOCK.
4780*11efff7fSkettenis SYMTAB is recorded with each symbol added. */
4781b725ae77Skettenis
4782b725ae77Skettenis static void
ada_add_block_symbols(struct obstack * obstackp,struct block * block,const char * name,domain_enum domain,struct objfile * objfile,struct symtab * symtab,int wild)4783*11efff7fSkettenis ada_add_block_symbols (struct obstack *obstackp,
4784*11efff7fSkettenis struct block *block, const char *name,
4785b725ae77Skettenis domain_enum domain, struct objfile *objfile,
4786*11efff7fSkettenis struct symtab *symtab, int wild)
4787b725ae77Skettenis {
4788b725ae77Skettenis struct dict_iterator iter;
4789b725ae77Skettenis int name_len = strlen (name);
4790b725ae77Skettenis /* A matching argument symbol, if any. */
4791b725ae77Skettenis struct symbol *arg_sym;
4792*11efff7fSkettenis /* Set true when we find a matching non-argument symbol. */
4793b725ae77Skettenis int found_sym;
4794b725ae77Skettenis struct symbol *sym;
4795b725ae77Skettenis
4796b725ae77Skettenis arg_sym = NULL;
4797b725ae77Skettenis found_sym = 0;
4798b725ae77Skettenis if (wild)
4799b725ae77Skettenis {
4800b725ae77Skettenis struct symbol *sym;
4801b725ae77Skettenis ALL_BLOCK_SYMBOLS (block, iter, sym)
4802b725ae77Skettenis {
4803*11efff7fSkettenis if (SYMBOL_DOMAIN (sym) == domain
4804*11efff7fSkettenis && wild_match (name, name_len, SYMBOL_LINKAGE_NAME (sym)))
4805b725ae77Skettenis {
4806b725ae77Skettenis switch (SYMBOL_CLASS (sym))
4807b725ae77Skettenis {
4808b725ae77Skettenis case LOC_ARG:
4809b725ae77Skettenis case LOC_LOCAL_ARG:
4810b725ae77Skettenis case LOC_REF_ARG:
4811b725ae77Skettenis case LOC_REGPARM:
4812b725ae77Skettenis case LOC_REGPARM_ADDR:
4813b725ae77Skettenis case LOC_BASEREG_ARG:
4814b725ae77Skettenis case LOC_COMPUTED_ARG:
4815b725ae77Skettenis arg_sym = sym;
4816b725ae77Skettenis break;
4817b725ae77Skettenis case LOC_UNRESOLVED:
4818b725ae77Skettenis continue;
4819b725ae77Skettenis default:
4820b725ae77Skettenis found_sym = 1;
4821*11efff7fSkettenis add_defn_to_vec (obstackp,
4822*11efff7fSkettenis fixup_symbol_section (sym, objfile),
4823*11efff7fSkettenis block, symtab);
4824b725ae77Skettenis break;
4825b725ae77Skettenis }
4826b725ae77Skettenis }
4827b725ae77Skettenis }
4828b725ae77Skettenis }
4829b725ae77Skettenis else
4830b725ae77Skettenis {
4831b725ae77Skettenis ALL_BLOCK_SYMBOLS (block, iter, sym)
4832b725ae77Skettenis {
4833b725ae77Skettenis if (SYMBOL_DOMAIN (sym) == domain)
4834b725ae77Skettenis {
4835*11efff7fSkettenis int cmp = strncmp (name, SYMBOL_LINKAGE_NAME (sym), name_len);
4836b725ae77Skettenis if (cmp == 0
4837*11efff7fSkettenis && is_name_suffix (SYMBOL_LINKAGE_NAME (sym) + name_len))
4838b725ae77Skettenis {
4839b725ae77Skettenis switch (SYMBOL_CLASS (sym))
4840b725ae77Skettenis {
4841b725ae77Skettenis case LOC_ARG:
4842b725ae77Skettenis case LOC_LOCAL_ARG:
4843b725ae77Skettenis case LOC_REF_ARG:
4844b725ae77Skettenis case LOC_REGPARM:
4845b725ae77Skettenis case LOC_REGPARM_ADDR:
4846b725ae77Skettenis case LOC_BASEREG_ARG:
4847b725ae77Skettenis case LOC_COMPUTED_ARG:
4848b725ae77Skettenis arg_sym = sym;
4849b725ae77Skettenis break;
4850b725ae77Skettenis case LOC_UNRESOLVED:
4851b725ae77Skettenis break;
4852b725ae77Skettenis default:
4853b725ae77Skettenis found_sym = 1;
4854*11efff7fSkettenis add_defn_to_vec (obstackp,
4855*11efff7fSkettenis fixup_symbol_section (sym, objfile),
4856*11efff7fSkettenis block, symtab);
4857b725ae77Skettenis break;
4858b725ae77Skettenis }
4859b725ae77Skettenis }
4860b725ae77Skettenis }
4861b725ae77Skettenis }
4862b725ae77Skettenis }
4863b725ae77Skettenis
4864b725ae77Skettenis if (!found_sym && arg_sym != NULL)
4865b725ae77Skettenis {
4866*11efff7fSkettenis add_defn_to_vec (obstackp,
4867*11efff7fSkettenis fixup_symbol_section (arg_sym, objfile),
4868*11efff7fSkettenis block, symtab);
4869b725ae77Skettenis }
4870b725ae77Skettenis
4871b725ae77Skettenis if (!wild)
4872b725ae77Skettenis {
4873b725ae77Skettenis arg_sym = NULL;
4874b725ae77Skettenis found_sym = 0;
4875b725ae77Skettenis
4876b725ae77Skettenis ALL_BLOCK_SYMBOLS (block, iter, sym)
4877b725ae77Skettenis {
4878b725ae77Skettenis if (SYMBOL_DOMAIN (sym) == domain)
4879b725ae77Skettenis {
4880b725ae77Skettenis int cmp;
4881b725ae77Skettenis
4882*11efff7fSkettenis cmp = (int) '_' - (int) SYMBOL_LINKAGE_NAME (sym)[0];
4883b725ae77Skettenis if (cmp == 0)
4884b725ae77Skettenis {
4885*11efff7fSkettenis cmp = strncmp ("_ada_", SYMBOL_LINKAGE_NAME (sym), 5);
4886b725ae77Skettenis if (cmp == 0)
4887*11efff7fSkettenis cmp = strncmp (name, SYMBOL_LINKAGE_NAME (sym) + 5,
4888*11efff7fSkettenis name_len);
4889b725ae77Skettenis }
4890b725ae77Skettenis
4891b725ae77Skettenis if (cmp == 0
4892*11efff7fSkettenis && is_name_suffix (SYMBOL_LINKAGE_NAME (sym) + name_len + 5))
4893b725ae77Skettenis {
4894b725ae77Skettenis switch (SYMBOL_CLASS (sym))
4895b725ae77Skettenis {
4896b725ae77Skettenis case LOC_ARG:
4897b725ae77Skettenis case LOC_LOCAL_ARG:
4898b725ae77Skettenis case LOC_REF_ARG:
4899b725ae77Skettenis case LOC_REGPARM:
4900b725ae77Skettenis case LOC_REGPARM_ADDR:
4901b725ae77Skettenis case LOC_BASEREG_ARG:
4902b725ae77Skettenis case LOC_COMPUTED_ARG:
4903b725ae77Skettenis arg_sym = sym;
4904b725ae77Skettenis break;
4905b725ae77Skettenis case LOC_UNRESOLVED:
4906b725ae77Skettenis break;
4907b725ae77Skettenis default:
4908b725ae77Skettenis found_sym = 1;
4909*11efff7fSkettenis add_defn_to_vec (obstackp,
4910*11efff7fSkettenis fixup_symbol_section (sym, objfile),
4911*11efff7fSkettenis block, symtab);
4912b725ae77Skettenis break;
4913b725ae77Skettenis }
4914b725ae77Skettenis }
4915b725ae77Skettenis }
4916b725ae77Skettenis }
4917b725ae77Skettenis
4918b725ae77Skettenis /* NOTE: This really shouldn't be needed for _ada_ symbols.
4919b725ae77Skettenis They aren't parameters, right? */
4920b725ae77Skettenis if (!found_sym && arg_sym != NULL)
4921b725ae77Skettenis {
4922*11efff7fSkettenis add_defn_to_vec (obstackp,
4923*11efff7fSkettenis fixup_symbol_section (arg_sym, objfile),
4924*11efff7fSkettenis block, symtab);
4925b725ae77Skettenis }
4926b725ae77Skettenis }
4927b725ae77Skettenis }
4928b725ae77Skettenis
4929b725ae77Skettenis /* Field Access */
4930b725ae77Skettenis
4931b725ae77Skettenis /* True if field number FIELD_NUM in struct or union type TYPE is supposed
4932b725ae77Skettenis to be invisible to users. */
4933b725ae77Skettenis
4934b725ae77Skettenis int
ada_is_ignored_field(struct type * type,int field_num)4935b725ae77Skettenis ada_is_ignored_field (struct type *type, int field_num)
4936b725ae77Skettenis {
4937b725ae77Skettenis if (field_num < 0 || field_num > TYPE_NFIELDS (type))
4938b725ae77Skettenis return 1;
4939b725ae77Skettenis else
4940b725ae77Skettenis {
4941b725ae77Skettenis const char *name = TYPE_FIELD_NAME (type, field_num);
4942b725ae77Skettenis return (name == NULL
4943*11efff7fSkettenis || (name[0] == '_' && strncmp (name, "_parent", 7) != 0));
4944b725ae77Skettenis }
4945b725ae77Skettenis }
4946b725ae77Skettenis
4947*11efff7fSkettenis /* True iff TYPE has a tag field. If REFOK, then TYPE may also be a
4948*11efff7fSkettenis pointer or reference type whose ultimate target has a tag field. */
4949b725ae77Skettenis
4950b725ae77Skettenis int
ada_is_tagged_type(struct type * type,int refok)4951*11efff7fSkettenis ada_is_tagged_type (struct type *type, int refok)
4952b725ae77Skettenis {
4953*11efff7fSkettenis return (ada_lookup_struct_elt_type (type, "_tag", refok, 1, NULL) != NULL);
4954*11efff7fSkettenis }
4955b725ae77Skettenis
4956*11efff7fSkettenis /* True iff TYPE represents the type of X'Tag */
4957*11efff7fSkettenis
4958*11efff7fSkettenis int
ada_is_tag_type(struct type * type)4959*11efff7fSkettenis ada_is_tag_type (struct type *type)
4960*11efff7fSkettenis {
4961*11efff7fSkettenis if (type == NULL || TYPE_CODE (type) != TYPE_CODE_PTR)
4962*11efff7fSkettenis return 0;
4963*11efff7fSkettenis else
4964*11efff7fSkettenis {
4965*11efff7fSkettenis const char *name = ada_type_name (TYPE_TARGET_TYPE (type));
4966*11efff7fSkettenis return (name != NULL
4967*11efff7fSkettenis && strcmp (name, "ada__tags__dispatch_table") == 0);
4968*11efff7fSkettenis }
4969b725ae77Skettenis }
4970b725ae77Skettenis
4971b725ae77Skettenis /* The type of the tag on VAL. */
4972b725ae77Skettenis
4973b725ae77Skettenis struct type *
ada_tag_type(struct value * val)4974b725ae77Skettenis ada_tag_type (struct value *val)
4975b725ae77Skettenis {
4976*11efff7fSkettenis return ada_lookup_struct_elt_type (VALUE_TYPE (val), "_tag", 1, 0, NULL);
4977b725ae77Skettenis }
4978b725ae77Skettenis
4979b725ae77Skettenis /* The value of the tag on VAL. */
4980b725ae77Skettenis
4981b725ae77Skettenis struct value *
ada_value_tag(struct value * val)4982b725ae77Skettenis ada_value_tag (struct value *val)
4983b725ae77Skettenis {
4984b725ae77Skettenis return ada_value_struct_elt (val, "_tag", "record");
4985b725ae77Skettenis }
4986b725ae77Skettenis
4987*11efff7fSkettenis /* The value of the tag on the object of type TYPE whose contents are
4988*11efff7fSkettenis saved at VALADDR, if it is non-null, or is at memory address
4989*11efff7fSkettenis ADDRESS. */
4990*11efff7fSkettenis
4991*11efff7fSkettenis static struct value *
value_tag_from_contents_and_address(struct type * type,char * valaddr,CORE_ADDR address)4992*11efff7fSkettenis value_tag_from_contents_and_address (struct type *type, char *valaddr,
4993*11efff7fSkettenis CORE_ADDR address)
4994*11efff7fSkettenis {
4995*11efff7fSkettenis int tag_byte_offset, dummy1, dummy2;
4996*11efff7fSkettenis struct type *tag_type;
4997*11efff7fSkettenis if (find_struct_field ("_tag", type, 0, &tag_type, &tag_byte_offset,
4998*11efff7fSkettenis &dummy1, &dummy2))
4999*11efff7fSkettenis {
5000*11efff7fSkettenis char *valaddr1 = (valaddr == NULL) ? NULL : valaddr + tag_byte_offset;
5001*11efff7fSkettenis CORE_ADDR address1 = (address == 0) ? 0 : address + tag_byte_offset;
5002*11efff7fSkettenis
5003*11efff7fSkettenis return value_from_contents_and_address (tag_type, valaddr1, address1);
5004*11efff7fSkettenis }
5005*11efff7fSkettenis return NULL;
5006*11efff7fSkettenis }
5007*11efff7fSkettenis
5008*11efff7fSkettenis static struct type *
type_from_tag(struct value * tag)5009*11efff7fSkettenis type_from_tag (struct value *tag)
5010*11efff7fSkettenis {
5011*11efff7fSkettenis const char *type_name = ada_tag_name (tag);
5012*11efff7fSkettenis if (type_name != NULL)
5013*11efff7fSkettenis return ada_find_any_type (ada_encode (type_name));
5014*11efff7fSkettenis return NULL;
5015*11efff7fSkettenis }
5016*11efff7fSkettenis
5017*11efff7fSkettenis struct tag_args
5018*11efff7fSkettenis {
5019*11efff7fSkettenis struct value *tag;
5020*11efff7fSkettenis char *name;
5021*11efff7fSkettenis };
5022*11efff7fSkettenis
5023*11efff7fSkettenis /* Wrapper function used by ada_tag_name. Given a struct tag_args*
5024*11efff7fSkettenis value ARGS, sets ARGS->name to the tag name of ARGS->tag.
5025*11efff7fSkettenis The value stored in ARGS->name is valid until the next call to
5026*11efff7fSkettenis ada_tag_name_1. */
5027*11efff7fSkettenis
5028*11efff7fSkettenis static int
ada_tag_name_1(void * args0)5029*11efff7fSkettenis ada_tag_name_1 (void *args0)
5030*11efff7fSkettenis {
5031*11efff7fSkettenis struct tag_args *args = (struct tag_args *) args0;
5032*11efff7fSkettenis static char name[1024];
5033*11efff7fSkettenis char *p;
5034*11efff7fSkettenis struct value *val;
5035*11efff7fSkettenis args->name = NULL;
5036*11efff7fSkettenis val = ada_value_struct_elt (args->tag, "tsd", NULL);
5037*11efff7fSkettenis if (val == NULL)
5038*11efff7fSkettenis return 0;
5039*11efff7fSkettenis val = ada_value_struct_elt (val, "expanded_name", NULL);
5040*11efff7fSkettenis if (val == NULL)
5041*11efff7fSkettenis return 0;
5042*11efff7fSkettenis read_memory_string (value_as_address (val), name, sizeof (name) - 1);
5043*11efff7fSkettenis for (p = name; *p != '\0'; p += 1)
5044*11efff7fSkettenis if (isalpha (*p))
5045*11efff7fSkettenis *p = tolower (*p);
5046*11efff7fSkettenis args->name = name;
5047*11efff7fSkettenis return 0;
5048*11efff7fSkettenis }
5049*11efff7fSkettenis
5050*11efff7fSkettenis /* The type name of the dynamic type denoted by the 'tag value TAG, as
5051*11efff7fSkettenis * a C string. */
5052*11efff7fSkettenis
5053*11efff7fSkettenis const char *
ada_tag_name(struct value * tag)5054*11efff7fSkettenis ada_tag_name (struct value *tag)
5055*11efff7fSkettenis {
5056*11efff7fSkettenis struct tag_args args;
5057*11efff7fSkettenis if (!ada_is_tag_type (VALUE_TYPE (tag)))
5058*11efff7fSkettenis return NULL;
5059*11efff7fSkettenis args.tag = tag;
5060*11efff7fSkettenis args.name = NULL;
5061*11efff7fSkettenis catch_errors (ada_tag_name_1, &args, NULL, RETURN_MASK_ALL);
5062*11efff7fSkettenis return args.name;
5063*11efff7fSkettenis }
5064*11efff7fSkettenis
5065b725ae77Skettenis /* The parent type of TYPE, or NULL if none. */
5066b725ae77Skettenis
5067b725ae77Skettenis struct type *
ada_parent_type(struct type * type)5068b725ae77Skettenis ada_parent_type (struct type *type)
5069b725ae77Skettenis {
5070b725ae77Skettenis int i;
5071b725ae77Skettenis
5072*11efff7fSkettenis type = ada_check_typedef (type);
5073b725ae77Skettenis
5074b725ae77Skettenis if (type == NULL || TYPE_CODE (type) != TYPE_CODE_STRUCT)
5075b725ae77Skettenis return NULL;
5076b725ae77Skettenis
5077b725ae77Skettenis for (i = 0; i < TYPE_NFIELDS (type); i += 1)
5078b725ae77Skettenis if (ada_is_parent_field (type, i))
5079*11efff7fSkettenis return ada_check_typedef (TYPE_FIELD_TYPE (type, i));
5080b725ae77Skettenis
5081b725ae77Skettenis return NULL;
5082b725ae77Skettenis }
5083b725ae77Skettenis
5084b725ae77Skettenis /* True iff field number FIELD_NUM of structure type TYPE contains the
5085b725ae77Skettenis parent-type (inherited) fields of a derived type. Assumes TYPE is
5086b725ae77Skettenis a structure type with at least FIELD_NUM+1 fields. */
5087b725ae77Skettenis
5088b725ae77Skettenis int
ada_is_parent_field(struct type * type,int field_num)5089b725ae77Skettenis ada_is_parent_field (struct type *type, int field_num)
5090b725ae77Skettenis {
5091*11efff7fSkettenis const char *name = TYPE_FIELD_NAME (ada_check_typedef (type), field_num);
5092*11efff7fSkettenis return (name != NULL
5093*11efff7fSkettenis && (strncmp (name, "PARENT", 6) == 0
5094*11efff7fSkettenis || strncmp (name, "_parent", 7) == 0));
5095b725ae77Skettenis }
5096b725ae77Skettenis
5097b725ae77Skettenis /* True iff field number FIELD_NUM of structure type TYPE is a
5098b725ae77Skettenis transparent wrapper field (which should be silently traversed when doing
5099b725ae77Skettenis field selection and flattened when printing). Assumes TYPE is a
5100b725ae77Skettenis structure type with at least FIELD_NUM+1 fields. Such fields are always
5101b725ae77Skettenis structures. */
5102b725ae77Skettenis
5103b725ae77Skettenis int
ada_is_wrapper_field(struct type * type,int field_num)5104b725ae77Skettenis ada_is_wrapper_field (struct type *type, int field_num)
5105b725ae77Skettenis {
5106b725ae77Skettenis const char *name = TYPE_FIELD_NAME (type, field_num);
5107b725ae77Skettenis return (name != NULL
5108*11efff7fSkettenis && (strncmp (name, "PARENT", 6) == 0
5109*11efff7fSkettenis || strcmp (name, "REP") == 0
5110*11efff7fSkettenis || strncmp (name, "_parent", 7) == 0
5111b725ae77Skettenis || name[0] == 'S' || name[0] == 'R' || name[0] == 'O'));
5112b725ae77Skettenis }
5113b725ae77Skettenis
5114b725ae77Skettenis /* True iff field number FIELD_NUM of structure or union type TYPE
5115b725ae77Skettenis is a variant wrapper. Assumes TYPE is a structure type with at least
5116b725ae77Skettenis FIELD_NUM+1 fields. */
5117b725ae77Skettenis
5118b725ae77Skettenis int
ada_is_variant_part(struct type * type,int field_num)5119b725ae77Skettenis ada_is_variant_part (struct type *type, int field_num)
5120b725ae77Skettenis {
5121b725ae77Skettenis struct type *field_type = TYPE_FIELD_TYPE (type, field_num);
5122b725ae77Skettenis return (TYPE_CODE (field_type) == TYPE_CODE_UNION
5123b725ae77Skettenis || (is_dynamic_field (type, field_num)
5124*11efff7fSkettenis && (TYPE_CODE (TYPE_TARGET_TYPE (field_type))
5125*11efff7fSkettenis == TYPE_CODE_UNION)));
5126b725ae77Skettenis }
5127b725ae77Skettenis
5128b725ae77Skettenis /* Assuming that VAR_TYPE is a variant wrapper (type of the variant part)
5129b725ae77Skettenis whose discriminants are contained in the record type OUTER_TYPE,
5130b725ae77Skettenis returns the type of the controlling discriminant for the variant. */
5131b725ae77Skettenis
5132b725ae77Skettenis struct type *
ada_variant_discrim_type(struct type * var_type,struct type * outer_type)5133b725ae77Skettenis ada_variant_discrim_type (struct type *var_type, struct type *outer_type)
5134b725ae77Skettenis {
5135b725ae77Skettenis char *name = ada_variant_discrim_name (var_type);
5136*11efff7fSkettenis struct type *type =
5137*11efff7fSkettenis ada_lookup_struct_elt_type (outer_type, name, 1, 1, NULL);
5138b725ae77Skettenis if (type == NULL)
5139b725ae77Skettenis return builtin_type_int;
5140b725ae77Skettenis else
5141b725ae77Skettenis return type;
5142b725ae77Skettenis }
5143b725ae77Skettenis
5144b725ae77Skettenis /* Assuming that TYPE is the type of a variant wrapper, and FIELD_NUM is a
5145b725ae77Skettenis valid field number within it, returns 1 iff field FIELD_NUM of TYPE
5146b725ae77Skettenis represents a 'when others' clause; otherwise 0. */
5147b725ae77Skettenis
5148b725ae77Skettenis int
ada_is_others_clause(struct type * type,int field_num)5149b725ae77Skettenis ada_is_others_clause (struct type *type, int field_num)
5150b725ae77Skettenis {
5151b725ae77Skettenis const char *name = TYPE_FIELD_NAME (type, field_num);
5152b725ae77Skettenis return (name != NULL && name[0] == 'O');
5153b725ae77Skettenis }
5154b725ae77Skettenis
5155b725ae77Skettenis /* Assuming that TYPE0 is the type of the variant part of a record,
5156*11efff7fSkettenis returns the name of the discriminant controlling the variant.
5157*11efff7fSkettenis The value is valid until the next call to ada_variant_discrim_name. */
5158b725ae77Skettenis
5159b725ae77Skettenis char *
ada_variant_discrim_name(struct type * type0)5160b725ae77Skettenis ada_variant_discrim_name (struct type *type0)
5161b725ae77Skettenis {
5162b725ae77Skettenis static char *result = NULL;
5163b725ae77Skettenis static size_t result_len = 0;
5164b725ae77Skettenis struct type *type;
5165b725ae77Skettenis const char *name;
5166b725ae77Skettenis const char *discrim_end;
5167b725ae77Skettenis const char *discrim_start;
5168b725ae77Skettenis
5169b725ae77Skettenis if (TYPE_CODE (type0) == TYPE_CODE_PTR)
5170b725ae77Skettenis type = TYPE_TARGET_TYPE (type0);
5171b725ae77Skettenis else
5172b725ae77Skettenis type = type0;
5173b725ae77Skettenis
5174b725ae77Skettenis name = ada_type_name (type);
5175b725ae77Skettenis
5176b725ae77Skettenis if (name == NULL || name[0] == '\000')
5177b725ae77Skettenis return "";
5178b725ae77Skettenis
5179b725ae77Skettenis for (discrim_end = name + strlen (name) - 6; discrim_end != name;
5180b725ae77Skettenis discrim_end -= 1)
5181b725ae77Skettenis {
5182*11efff7fSkettenis if (strncmp (discrim_end, "___XVN", 6) == 0)
5183b725ae77Skettenis break;
5184b725ae77Skettenis }
5185b725ae77Skettenis if (discrim_end == name)
5186b725ae77Skettenis return "";
5187b725ae77Skettenis
5188b725ae77Skettenis for (discrim_start = discrim_end; discrim_start != name + 3;
5189b725ae77Skettenis discrim_start -= 1)
5190b725ae77Skettenis {
5191b725ae77Skettenis if (discrim_start == name + 1)
5192b725ae77Skettenis return "";
5193*11efff7fSkettenis if ((discrim_start > name + 3
5194*11efff7fSkettenis && strncmp (discrim_start - 3, "___", 3) == 0)
5195b725ae77Skettenis || discrim_start[-1] == '.')
5196b725ae77Skettenis break;
5197b725ae77Skettenis }
5198b725ae77Skettenis
5199b725ae77Skettenis GROW_VECT (result, result_len, discrim_end - discrim_start + 1);
5200b725ae77Skettenis strncpy (result, discrim_start, discrim_end - discrim_start);
5201b725ae77Skettenis result[discrim_end - discrim_start] = '\0';
5202b725ae77Skettenis return result;
5203b725ae77Skettenis }
5204b725ae77Skettenis
5205*11efff7fSkettenis /* Scan STR for a subtype-encoded number, beginning at position K.
5206*11efff7fSkettenis Put the position of the character just past the number scanned in
5207*11efff7fSkettenis *NEW_K, if NEW_K!=NULL. Put the scanned number in *R, if R!=NULL.
5208*11efff7fSkettenis Return 1 if there was a valid number at the given position, and 0
5209*11efff7fSkettenis otherwise. A "subtype-encoded" number consists of the absolute value
5210*11efff7fSkettenis in decimal, followed by the letter 'm' to indicate a negative number.
5211*11efff7fSkettenis Assumes 0m does not occur. */
5212b725ae77Skettenis
5213b725ae77Skettenis int
ada_scan_number(const char str[],int k,LONGEST * R,int * new_k)5214b725ae77Skettenis ada_scan_number (const char str[], int k, LONGEST * R, int *new_k)
5215b725ae77Skettenis {
5216b725ae77Skettenis ULONGEST RU;
5217b725ae77Skettenis
5218b725ae77Skettenis if (!isdigit (str[k]))
5219b725ae77Skettenis return 0;
5220b725ae77Skettenis
5221b725ae77Skettenis /* Do it the hard way so as not to make any assumption about
5222b725ae77Skettenis the relationship of unsigned long (%lu scan format code) and
5223b725ae77Skettenis LONGEST. */
5224b725ae77Skettenis RU = 0;
5225b725ae77Skettenis while (isdigit (str[k]))
5226b725ae77Skettenis {
5227b725ae77Skettenis RU = RU * 10 + (str[k] - '0');
5228b725ae77Skettenis k += 1;
5229b725ae77Skettenis }
5230b725ae77Skettenis
5231b725ae77Skettenis if (str[k] == 'm')
5232b725ae77Skettenis {
5233b725ae77Skettenis if (R != NULL)
5234b725ae77Skettenis *R = (-(LONGEST) (RU - 1)) - 1;
5235b725ae77Skettenis k += 1;
5236b725ae77Skettenis }
5237b725ae77Skettenis else if (R != NULL)
5238b725ae77Skettenis *R = (LONGEST) RU;
5239b725ae77Skettenis
5240b725ae77Skettenis /* NOTE on the above: Technically, C does not say what the results of
5241b725ae77Skettenis - (LONGEST) RU or (LONGEST) -RU are for RU == largest positive
5242b725ae77Skettenis number representable as a LONGEST (although either would probably work
5243b725ae77Skettenis in most implementations). When RU>0, the locution in the then branch
5244b725ae77Skettenis above is always equivalent to the negative of RU. */
5245b725ae77Skettenis
5246b725ae77Skettenis if (new_k != NULL)
5247b725ae77Skettenis *new_k = k;
5248b725ae77Skettenis return 1;
5249b725ae77Skettenis }
5250b725ae77Skettenis
5251b725ae77Skettenis /* Assuming that TYPE is a variant part wrapper type (a VARIANTS field),
5252b725ae77Skettenis and FIELD_NUM is a valid field number within it, returns 1 iff VAL is
5253b725ae77Skettenis in the range encoded by field FIELD_NUM of TYPE; otherwise 0. */
5254b725ae77Skettenis
5255b725ae77Skettenis int
ada_in_variant(LONGEST val,struct type * type,int field_num)5256b725ae77Skettenis ada_in_variant (LONGEST val, struct type *type, int field_num)
5257b725ae77Skettenis {
5258b725ae77Skettenis const char *name = TYPE_FIELD_NAME (type, field_num);
5259b725ae77Skettenis int p;
5260b725ae77Skettenis
5261b725ae77Skettenis p = 0;
5262b725ae77Skettenis while (1)
5263b725ae77Skettenis {
5264b725ae77Skettenis switch (name[p])
5265b725ae77Skettenis {
5266b725ae77Skettenis case '\0':
5267b725ae77Skettenis return 0;
5268b725ae77Skettenis case 'S':
5269b725ae77Skettenis {
5270b725ae77Skettenis LONGEST W;
5271b725ae77Skettenis if (!ada_scan_number (name, p + 1, &W, &p))
5272b725ae77Skettenis return 0;
5273b725ae77Skettenis if (val == W)
5274b725ae77Skettenis return 1;
5275b725ae77Skettenis break;
5276b725ae77Skettenis }
5277b725ae77Skettenis case 'R':
5278b725ae77Skettenis {
5279b725ae77Skettenis LONGEST L, U;
5280b725ae77Skettenis if (!ada_scan_number (name, p + 1, &L, &p)
5281b725ae77Skettenis || name[p] != 'T' || !ada_scan_number (name, p + 1, &U, &p))
5282b725ae77Skettenis return 0;
5283b725ae77Skettenis if (val >= L && val <= U)
5284b725ae77Skettenis return 1;
5285b725ae77Skettenis break;
5286b725ae77Skettenis }
5287b725ae77Skettenis case 'O':
5288b725ae77Skettenis return 1;
5289b725ae77Skettenis default:
5290b725ae77Skettenis return 0;
5291b725ae77Skettenis }
5292b725ae77Skettenis }
5293b725ae77Skettenis }
5294b725ae77Skettenis
5295*11efff7fSkettenis /* FIXME: Lots of redundancy below. Try to consolidate. */
5296b725ae77Skettenis
5297*11efff7fSkettenis /* Given a value ARG1 (offset by OFFSET bytes) of a struct or union type
5298*11efff7fSkettenis ARG_TYPE, extract and return the value of one of its (non-static)
5299*11efff7fSkettenis fields. FIELDNO says which field. Differs from value_primitive_field
5300*11efff7fSkettenis only in that it can handle packed values of arbitrary type. */
5301*11efff7fSkettenis
5302*11efff7fSkettenis static struct value *
ada_value_primitive_field(struct value * arg1,int offset,int fieldno,struct type * arg_type)5303b725ae77Skettenis ada_value_primitive_field (struct value *arg1, int offset, int fieldno,
5304b725ae77Skettenis struct type *arg_type)
5305b725ae77Skettenis {
5306b725ae77Skettenis struct type *type;
5307b725ae77Skettenis
5308*11efff7fSkettenis arg_type = ada_check_typedef (arg_type);
5309b725ae77Skettenis type = TYPE_FIELD_TYPE (arg_type, fieldno);
5310b725ae77Skettenis
5311*11efff7fSkettenis /* Handle packed fields. */
5312b725ae77Skettenis
5313b725ae77Skettenis if (TYPE_FIELD_BITSIZE (arg_type, fieldno) != 0)
5314b725ae77Skettenis {
5315b725ae77Skettenis int bit_pos = TYPE_FIELD_BITPOS (arg_type, fieldno);
5316b725ae77Skettenis int bit_size = TYPE_FIELD_BITSIZE (arg_type, fieldno);
5317b725ae77Skettenis
5318b725ae77Skettenis return ada_value_primitive_packed_val (arg1, VALUE_CONTENTS (arg1),
5319b725ae77Skettenis offset + bit_pos / 8,
5320b725ae77Skettenis bit_pos % 8, bit_size, type);
5321b725ae77Skettenis }
5322b725ae77Skettenis else
5323b725ae77Skettenis return value_primitive_field (arg1, offset, fieldno, arg_type);
5324b725ae77Skettenis }
5325b725ae77Skettenis
5326*11efff7fSkettenis /* Find field with name NAME in object of type TYPE. If found, return 1
5327*11efff7fSkettenis after setting *FIELD_TYPE_P to the field's type, *BYTE_OFFSET_P to
5328*11efff7fSkettenis OFFSET + the byte offset of the field within an object of that type,
5329*11efff7fSkettenis *BIT_OFFSET_P to the bit offset modulo byte size of the field, and
5330*11efff7fSkettenis *BIT_SIZE_P to its size in bits if the field is packed, and 0 otherwise.
5331*11efff7fSkettenis Looks inside wrappers for the field. Returns 0 if field not
5332*11efff7fSkettenis found. */
5333*11efff7fSkettenis static int
find_struct_field(char * name,struct type * type,int offset,struct type ** field_type_p,int * byte_offset_p,int * bit_offset_p,int * bit_size_p)5334*11efff7fSkettenis find_struct_field (char *name, struct type *type, int offset,
5335*11efff7fSkettenis struct type **field_type_p,
5336*11efff7fSkettenis int *byte_offset_p, int *bit_offset_p, int *bit_size_p)
5337*11efff7fSkettenis {
5338*11efff7fSkettenis int i;
5339*11efff7fSkettenis
5340*11efff7fSkettenis type = ada_check_typedef (type);
5341*11efff7fSkettenis *field_type_p = NULL;
5342*11efff7fSkettenis *byte_offset_p = *bit_offset_p = *bit_size_p = 0;
5343*11efff7fSkettenis
5344*11efff7fSkettenis for (i = TYPE_NFIELDS (type) - 1; i >= 0; i -= 1)
5345*11efff7fSkettenis {
5346*11efff7fSkettenis int bit_pos = TYPE_FIELD_BITPOS (type, i);
5347*11efff7fSkettenis int fld_offset = offset + bit_pos / 8;
5348*11efff7fSkettenis char *t_field_name = TYPE_FIELD_NAME (type, i);
5349*11efff7fSkettenis
5350*11efff7fSkettenis if (t_field_name == NULL)
5351*11efff7fSkettenis continue;
5352*11efff7fSkettenis
5353*11efff7fSkettenis else if (field_name_match (t_field_name, name))
5354*11efff7fSkettenis {
5355*11efff7fSkettenis int bit_size = TYPE_FIELD_BITSIZE (type, i);
5356*11efff7fSkettenis *field_type_p = TYPE_FIELD_TYPE (type, i);
5357*11efff7fSkettenis *byte_offset_p = fld_offset;
5358*11efff7fSkettenis *bit_offset_p = bit_pos % 8;
5359*11efff7fSkettenis *bit_size_p = bit_size;
5360*11efff7fSkettenis return 1;
5361*11efff7fSkettenis }
5362*11efff7fSkettenis else if (ada_is_wrapper_field (type, i))
5363*11efff7fSkettenis {
5364*11efff7fSkettenis if (find_struct_field (name, TYPE_FIELD_TYPE (type, i), fld_offset,
5365*11efff7fSkettenis field_type_p, byte_offset_p, bit_offset_p,
5366*11efff7fSkettenis bit_size_p))
5367*11efff7fSkettenis return 1;
5368*11efff7fSkettenis }
5369*11efff7fSkettenis else if (ada_is_variant_part (type, i))
5370*11efff7fSkettenis {
5371*11efff7fSkettenis int j;
5372*11efff7fSkettenis struct type *field_type = ada_check_typedef (TYPE_FIELD_TYPE (type, i));
5373*11efff7fSkettenis
5374*11efff7fSkettenis for (j = TYPE_NFIELDS (field_type) - 1; j >= 0; j -= 1)
5375*11efff7fSkettenis {
5376*11efff7fSkettenis if (find_struct_field (name, TYPE_FIELD_TYPE (field_type, j),
5377*11efff7fSkettenis fld_offset
5378*11efff7fSkettenis + TYPE_FIELD_BITPOS (field_type, j) / 8,
5379*11efff7fSkettenis field_type_p, byte_offset_p,
5380*11efff7fSkettenis bit_offset_p, bit_size_p))
5381*11efff7fSkettenis return 1;
5382*11efff7fSkettenis }
5383*11efff7fSkettenis }
5384*11efff7fSkettenis }
5385*11efff7fSkettenis return 0;
5386*11efff7fSkettenis }
5387*11efff7fSkettenis
5388*11efff7fSkettenis
5389b725ae77Skettenis
5390b725ae77Skettenis /* Look for a field NAME in ARG. Adjust the address of ARG by OFFSET bytes,
5391b725ae77Skettenis and search in it assuming it has (class) type TYPE.
5392b725ae77Skettenis If found, return value, else return NULL.
5393b725ae77Skettenis
5394b725ae77Skettenis Searches recursively through wrapper fields (e.g., '_parent'). */
5395b725ae77Skettenis
5396*11efff7fSkettenis static struct value *
ada_search_struct_field(char * name,struct value * arg,int offset,struct type * type)5397b725ae77Skettenis ada_search_struct_field (char *name, struct value *arg, int offset,
5398b725ae77Skettenis struct type *type)
5399b725ae77Skettenis {
5400b725ae77Skettenis int i;
5401*11efff7fSkettenis type = ada_check_typedef (type);
5402b725ae77Skettenis
5403b725ae77Skettenis for (i = TYPE_NFIELDS (type) - 1; i >= 0; i -= 1)
5404b725ae77Skettenis {
5405b725ae77Skettenis char *t_field_name = TYPE_FIELD_NAME (type, i);
5406b725ae77Skettenis
5407b725ae77Skettenis if (t_field_name == NULL)
5408b725ae77Skettenis continue;
5409b725ae77Skettenis
5410b725ae77Skettenis else if (field_name_match (t_field_name, name))
5411b725ae77Skettenis return ada_value_primitive_field (arg, offset, i, type);
5412b725ae77Skettenis
5413b725ae77Skettenis else if (ada_is_wrapper_field (type, i))
5414b725ae77Skettenis {
5415*11efff7fSkettenis struct value *v = /* Do not let indent join lines here. */
5416*11efff7fSkettenis ada_search_struct_field (name, arg,
5417*11efff7fSkettenis offset + TYPE_FIELD_BITPOS (type, i) / 8,
5418*11efff7fSkettenis TYPE_FIELD_TYPE (type, i));
5419b725ae77Skettenis if (v != NULL)
5420b725ae77Skettenis return v;
5421b725ae77Skettenis }
5422b725ae77Skettenis
5423b725ae77Skettenis else if (ada_is_variant_part (type, i))
5424b725ae77Skettenis {
5425b725ae77Skettenis int j;
5426*11efff7fSkettenis struct type *field_type = ada_check_typedef (TYPE_FIELD_TYPE (type, i));
5427b725ae77Skettenis int var_offset = offset + TYPE_FIELD_BITPOS (type, i) / 8;
5428b725ae77Skettenis
5429b725ae77Skettenis for (j = TYPE_NFIELDS (field_type) - 1; j >= 0; j -= 1)
5430b725ae77Skettenis {
5431*11efff7fSkettenis struct value *v = ada_search_struct_field /* Force line break. */
5432*11efff7fSkettenis (name, arg,
5433*11efff7fSkettenis var_offset + TYPE_FIELD_BITPOS (field_type, j) / 8,
5434*11efff7fSkettenis TYPE_FIELD_TYPE (field_type, j));
5435b725ae77Skettenis if (v != NULL)
5436b725ae77Skettenis return v;
5437b725ae77Skettenis }
5438b725ae77Skettenis }
5439b725ae77Skettenis }
5440b725ae77Skettenis return NULL;
5441b725ae77Skettenis }
5442b725ae77Skettenis
5443*11efff7fSkettenis /* Given ARG, a value of type (pointer or reference to a)*
5444*11efff7fSkettenis structure/union, extract the component named NAME from the ultimate
5445*11efff7fSkettenis target structure/union and return it as a value with its
5446*11efff7fSkettenis appropriate type. If ARG is a pointer or reference and the field
5447*11efff7fSkettenis is not packed, returns a reference to the field, otherwise the
5448*11efff7fSkettenis value of the field (an lvalue if ARG is an lvalue).
5449b725ae77Skettenis
5450b725ae77Skettenis The routine searches for NAME among all members of the structure itself
5451b725ae77Skettenis and (recursively) among all members of any wrapper members
5452b725ae77Skettenis (e.g., '_parent').
5453b725ae77Skettenis
5454b725ae77Skettenis ERR is a name (for use in error messages) that identifies the class
5455*11efff7fSkettenis of entity that ARG is supposed to be. ERR may be null, indicating
5456*11efff7fSkettenis that on error, the function simply returns NULL, and does not
5457*11efff7fSkettenis throw an error. (FIXME: True only if ARG is a pointer or reference
5458*11efff7fSkettenis at the moment). */
5459b725ae77Skettenis
5460b725ae77Skettenis struct value *
ada_value_struct_elt(struct value * arg,char * name,char * err)5461b725ae77Skettenis ada_value_struct_elt (struct value *arg, char *name, char *err)
5462b725ae77Skettenis {
5463*11efff7fSkettenis struct type *t, *t1;
5464b725ae77Skettenis struct value *v;
5465b725ae77Skettenis
5466*11efff7fSkettenis v = NULL;
5467*11efff7fSkettenis t1 = t = ada_check_typedef (VALUE_TYPE (arg));
5468*11efff7fSkettenis if (TYPE_CODE (t) == TYPE_CODE_REF)
5469b725ae77Skettenis {
5470*11efff7fSkettenis t1 = TYPE_TARGET_TYPE (t);
5471*11efff7fSkettenis if (t1 == NULL)
5472*11efff7fSkettenis {
5473*11efff7fSkettenis if (err == NULL)
5474*11efff7fSkettenis return NULL;
5475*11efff7fSkettenis else
5476*11efff7fSkettenis error ("Bad value type in a %s.", err);
5477*11efff7fSkettenis }
5478*11efff7fSkettenis t1 = ada_check_typedef (t1);
5479*11efff7fSkettenis if (TYPE_CODE (t1) == TYPE_CODE_PTR)
5480*11efff7fSkettenis {
5481*11efff7fSkettenis COERCE_REF (arg);
5482*11efff7fSkettenis t = t1;
5483*11efff7fSkettenis }
5484b725ae77Skettenis }
5485b725ae77Skettenis
5486*11efff7fSkettenis while (TYPE_CODE (t) == TYPE_CODE_PTR)
5487*11efff7fSkettenis {
5488*11efff7fSkettenis t1 = TYPE_TARGET_TYPE (t);
5489*11efff7fSkettenis if (t1 == NULL)
5490*11efff7fSkettenis {
5491*11efff7fSkettenis if (err == NULL)
5492*11efff7fSkettenis return NULL;
5493*11efff7fSkettenis else
5494*11efff7fSkettenis error ("Bad value type in a %s.", err);
5495*11efff7fSkettenis }
5496*11efff7fSkettenis t1 = ada_check_typedef (t1);
5497*11efff7fSkettenis if (TYPE_CODE (t1) == TYPE_CODE_PTR)
5498*11efff7fSkettenis {
5499*11efff7fSkettenis arg = value_ind (arg);
5500*11efff7fSkettenis t = t1;
5501*11efff7fSkettenis }
5502*11efff7fSkettenis else
5503*11efff7fSkettenis break;
5504*11efff7fSkettenis }
5505*11efff7fSkettenis
5506*11efff7fSkettenis if (TYPE_CODE (t1) != TYPE_CODE_STRUCT && TYPE_CODE (t1) != TYPE_CODE_UNION)
5507*11efff7fSkettenis {
5508*11efff7fSkettenis if (err == NULL)
5509*11efff7fSkettenis return NULL;
5510*11efff7fSkettenis else
5511b725ae77Skettenis error ("Attempt to extract a component of a value that is not a %s.",
5512b725ae77Skettenis err);
5513*11efff7fSkettenis }
5514b725ae77Skettenis
5515*11efff7fSkettenis if (t1 == t)
5516b725ae77Skettenis v = ada_search_struct_field (name, arg, 0, t);
5517*11efff7fSkettenis else
5518*11efff7fSkettenis {
5519*11efff7fSkettenis int bit_offset, bit_size, byte_offset;
5520*11efff7fSkettenis struct type *field_type;
5521*11efff7fSkettenis CORE_ADDR address;
5522*11efff7fSkettenis
5523*11efff7fSkettenis if (TYPE_CODE (t) == TYPE_CODE_PTR)
5524*11efff7fSkettenis address = value_as_address (arg);
5525*11efff7fSkettenis else
5526*11efff7fSkettenis address = unpack_pointer (t, VALUE_CONTENTS (arg));
5527*11efff7fSkettenis
5528*11efff7fSkettenis t1 = ada_to_fixed_type (ada_get_base_type (t1), NULL, address, NULL);
5529*11efff7fSkettenis if (find_struct_field (name, t1, 0,
5530*11efff7fSkettenis &field_type, &byte_offset, &bit_offset,
5531*11efff7fSkettenis &bit_size))
5532*11efff7fSkettenis {
5533*11efff7fSkettenis if (bit_size != 0)
5534*11efff7fSkettenis {
5535*11efff7fSkettenis if (TYPE_CODE (t) == TYPE_CODE_REF)
5536*11efff7fSkettenis arg = ada_coerce_ref (arg);
5537*11efff7fSkettenis else
5538*11efff7fSkettenis arg = ada_value_ind (arg);
5539*11efff7fSkettenis v = ada_value_primitive_packed_val (arg, NULL, byte_offset,
5540*11efff7fSkettenis bit_offset, bit_size,
5541*11efff7fSkettenis field_type);
5542*11efff7fSkettenis }
5543*11efff7fSkettenis else
5544*11efff7fSkettenis v = value_from_pointer (lookup_reference_type (field_type),
5545*11efff7fSkettenis address + byte_offset);
5546*11efff7fSkettenis }
5547*11efff7fSkettenis }
5548*11efff7fSkettenis
5549*11efff7fSkettenis if (v == NULL && err != NULL)
5550b725ae77Skettenis error ("There is no member named %s.", name);
5551b725ae77Skettenis
5552b725ae77Skettenis return v;
5553b725ae77Skettenis }
5554b725ae77Skettenis
5555b725ae77Skettenis /* Given a type TYPE, look up the type of the component of type named NAME.
5556b725ae77Skettenis If DISPP is non-null, add its byte displacement from the beginning of a
5557b725ae77Skettenis structure (pointed to by a value) of type TYPE to *DISPP (does not
5558b725ae77Skettenis work for packed fields).
5559b725ae77Skettenis
5560b725ae77Skettenis Matches any field whose name has NAME as a prefix, possibly
5561b725ae77Skettenis followed by "___".
5562b725ae77Skettenis
5563*11efff7fSkettenis TYPE can be either a struct or union. If REFOK, TYPE may also
5564*11efff7fSkettenis be a (pointer or reference)+ to a struct or union, and the
5565*11efff7fSkettenis ultimate target type will be searched.
5566b725ae77Skettenis
5567b725ae77Skettenis Looks recursively into variant clauses and parent types.
5568b725ae77Skettenis
5569*11efff7fSkettenis If NOERR is nonzero, return NULL if NAME is not suitably defined or
5570*11efff7fSkettenis TYPE is not a type of the right kind. */
5571b725ae77Skettenis
5572*11efff7fSkettenis static struct type *
ada_lookup_struct_elt_type(struct type * type,char * name,int refok,int noerr,int * dispp)5573*11efff7fSkettenis ada_lookup_struct_elt_type (struct type *type, char *name, int refok,
5574*11efff7fSkettenis int noerr, int *dispp)
5575b725ae77Skettenis {
5576b725ae77Skettenis int i;
5577b725ae77Skettenis
5578b725ae77Skettenis if (name == NULL)
5579b725ae77Skettenis goto BadName;
5580b725ae77Skettenis
5581*11efff7fSkettenis if (refok && type != NULL)
5582b725ae77Skettenis while (1)
5583b725ae77Skettenis {
5584*11efff7fSkettenis type = ada_check_typedef (type);
5585b725ae77Skettenis if (TYPE_CODE (type) != TYPE_CODE_PTR
5586b725ae77Skettenis && TYPE_CODE (type) != TYPE_CODE_REF)
5587b725ae77Skettenis break;
5588b725ae77Skettenis type = TYPE_TARGET_TYPE (type);
5589b725ae77Skettenis }
5590b725ae77Skettenis
5591*11efff7fSkettenis if (type == NULL
5592*11efff7fSkettenis || (TYPE_CODE (type) != TYPE_CODE_STRUCT
5593*11efff7fSkettenis && TYPE_CODE (type) != TYPE_CODE_UNION))
5594*11efff7fSkettenis {
5595*11efff7fSkettenis if (noerr)
5596*11efff7fSkettenis return NULL;
5597*11efff7fSkettenis else
5598b725ae77Skettenis {
5599b725ae77Skettenis target_terminal_ours ();
5600b725ae77Skettenis gdb_flush (gdb_stdout);
5601b725ae77Skettenis fprintf_unfiltered (gdb_stderr, "Type ");
5602*11efff7fSkettenis if (type == NULL)
5603*11efff7fSkettenis fprintf_unfiltered (gdb_stderr, "(null)");
5604*11efff7fSkettenis else
5605b725ae77Skettenis type_print (type, "", gdb_stderr, -1);
5606b725ae77Skettenis error (" is not a structure or union type");
5607b725ae77Skettenis }
5608*11efff7fSkettenis }
5609b725ae77Skettenis
5610b725ae77Skettenis type = to_static_fixed_type (type);
5611b725ae77Skettenis
5612b725ae77Skettenis for (i = 0; i < TYPE_NFIELDS (type); i += 1)
5613b725ae77Skettenis {
5614b725ae77Skettenis char *t_field_name = TYPE_FIELD_NAME (type, i);
5615b725ae77Skettenis struct type *t;
5616b725ae77Skettenis int disp;
5617b725ae77Skettenis
5618b725ae77Skettenis if (t_field_name == NULL)
5619b725ae77Skettenis continue;
5620b725ae77Skettenis
5621b725ae77Skettenis else if (field_name_match (t_field_name, name))
5622b725ae77Skettenis {
5623b725ae77Skettenis if (dispp != NULL)
5624b725ae77Skettenis *dispp += TYPE_FIELD_BITPOS (type, i) / 8;
5625*11efff7fSkettenis return ada_check_typedef (TYPE_FIELD_TYPE (type, i));
5626b725ae77Skettenis }
5627b725ae77Skettenis
5628b725ae77Skettenis else if (ada_is_wrapper_field (type, i))
5629b725ae77Skettenis {
5630b725ae77Skettenis disp = 0;
5631b725ae77Skettenis t = ada_lookup_struct_elt_type (TYPE_FIELD_TYPE (type, i), name,
5632*11efff7fSkettenis 0, 1, &disp);
5633b725ae77Skettenis if (t != NULL)
5634b725ae77Skettenis {
5635b725ae77Skettenis if (dispp != NULL)
5636b725ae77Skettenis *dispp += disp + TYPE_FIELD_BITPOS (type, i) / 8;
5637b725ae77Skettenis return t;
5638b725ae77Skettenis }
5639b725ae77Skettenis }
5640b725ae77Skettenis
5641b725ae77Skettenis else if (ada_is_variant_part (type, i))
5642b725ae77Skettenis {
5643b725ae77Skettenis int j;
5644*11efff7fSkettenis struct type *field_type = ada_check_typedef (TYPE_FIELD_TYPE (type, i));
5645b725ae77Skettenis
5646b725ae77Skettenis for (j = TYPE_NFIELDS (field_type) - 1; j >= 0; j -= 1)
5647b725ae77Skettenis {
5648b725ae77Skettenis disp = 0;
5649b725ae77Skettenis t = ada_lookup_struct_elt_type (TYPE_FIELD_TYPE (field_type, j),
5650*11efff7fSkettenis name, 0, 1, &disp);
5651b725ae77Skettenis if (t != NULL)
5652b725ae77Skettenis {
5653b725ae77Skettenis if (dispp != NULL)
5654b725ae77Skettenis *dispp += disp + TYPE_FIELD_BITPOS (type, i) / 8;
5655b725ae77Skettenis return t;
5656b725ae77Skettenis }
5657b725ae77Skettenis }
5658b725ae77Skettenis }
5659b725ae77Skettenis
5660b725ae77Skettenis }
5661b725ae77Skettenis
5662b725ae77Skettenis BadName:
5663b725ae77Skettenis if (!noerr)
5664b725ae77Skettenis {
5665b725ae77Skettenis target_terminal_ours ();
5666b725ae77Skettenis gdb_flush (gdb_stdout);
5667b725ae77Skettenis fprintf_unfiltered (gdb_stderr, "Type ");
5668b725ae77Skettenis type_print (type, "", gdb_stderr, -1);
5669b725ae77Skettenis fprintf_unfiltered (gdb_stderr, " has no component named ");
5670b725ae77Skettenis error ("%s", name == NULL ? "<null>" : name);
5671b725ae77Skettenis }
5672b725ae77Skettenis
5673b725ae77Skettenis return NULL;
5674b725ae77Skettenis }
5675b725ae77Skettenis
5676b725ae77Skettenis /* Assuming that VAR_TYPE is the type of a variant part of a record (a union),
5677b725ae77Skettenis within a value of type OUTER_TYPE that is stored in GDB at
5678b725ae77Skettenis OUTER_VALADDR, determine which variant clause (field number in VAR_TYPE,
5679b725ae77Skettenis numbering from 0) is applicable. Returns -1 if none are. */
5680b725ae77Skettenis
5681b725ae77Skettenis int
ada_which_variant_applies(struct type * var_type,struct type * outer_type,char * outer_valaddr)5682b725ae77Skettenis ada_which_variant_applies (struct type *var_type, struct type *outer_type,
5683b725ae77Skettenis char *outer_valaddr)
5684b725ae77Skettenis {
5685b725ae77Skettenis int others_clause;
5686b725ae77Skettenis int i;
5687b725ae77Skettenis int disp;
5688b725ae77Skettenis struct type *discrim_type;
5689b725ae77Skettenis char *discrim_name = ada_variant_discrim_name (var_type);
5690b725ae77Skettenis LONGEST discrim_val;
5691b725ae77Skettenis
5692b725ae77Skettenis disp = 0;
5693b725ae77Skettenis discrim_type =
5694*11efff7fSkettenis ada_lookup_struct_elt_type (outer_type, discrim_name, 1, 1, &disp);
5695b725ae77Skettenis if (discrim_type == NULL)
5696b725ae77Skettenis return -1;
5697b725ae77Skettenis discrim_val = unpack_long (discrim_type, outer_valaddr + disp);
5698b725ae77Skettenis
5699b725ae77Skettenis others_clause = -1;
5700b725ae77Skettenis for (i = 0; i < TYPE_NFIELDS (var_type); i += 1)
5701b725ae77Skettenis {
5702b725ae77Skettenis if (ada_is_others_clause (var_type, i))
5703b725ae77Skettenis others_clause = i;
5704b725ae77Skettenis else if (ada_in_variant (discrim_val, var_type, i))
5705b725ae77Skettenis return i;
5706b725ae77Skettenis }
5707b725ae77Skettenis
5708b725ae77Skettenis return others_clause;
5709b725ae77Skettenis }
5710b725ae77Skettenis
5711b725ae77Skettenis
5712b725ae77Skettenis
5713b725ae77Skettenis /* Dynamic-Sized Records */
5714b725ae77Skettenis
5715b725ae77Skettenis /* Strategy: The type ostensibly attached to a value with dynamic size
5716b725ae77Skettenis (i.e., a size that is not statically recorded in the debugging
5717b725ae77Skettenis data) does not accurately reflect the size or layout of the value.
5718b725ae77Skettenis Our strategy is to convert these values to values with accurate,
5719b725ae77Skettenis conventional types that are constructed on the fly. */
5720b725ae77Skettenis
5721b725ae77Skettenis /* There is a subtle and tricky problem here. In general, we cannot
5722b725ae77Skettenis determine the size of dynamic records without its data. However,
5723b725ae77Skettenis the 'struct value' data structure, which GDB uses to represent
5724b725ae77Skettenis quantities in the inferior process (the target), requires the size
5725b725ae77Skettenis of the type at the time of its allocation in order to reserve space
5726b725ae77Skettenis for GDB's internal copy of the data. That's why the
5727b725ae77Skettenis 'to_fixed_xxx_type' routines take (target) addresses as parameters,
5728b725ae77Skettenis rather than struct value*s.
5729b725ae77Skettenis
5730b725ae77Skettenis However, GDB's internal history variables ($1, $2, etc.) are
5731b725ae77Skettenis struct value*s containing internal copies of the data that are not, in
5732b725ae77Skettenis general, the same as the data at their corresponding addresses in
5733b725ae77Skettenis the target. Fortunately, the types we give to these values are all
5734b725ae77Skettenis conventional, fixed-size types (as per the strategy described
5735b725ae77Skettenis above), so that we don't usually have to perform the
5736b725ae77Skettenis 'to_fixed_xxx_type' conversions to look at their values.
5737b725ae77Skettenis Unfortunately, there is one exception: if one of the internal
5738b725ae77Skettenis history variables is an array whose elements are unconstrained
5739b725ae77Skettenis records, then we will need to create distinct fixed types for each
5740b725ae77Skettenis element selected. */
5741b725ae77Skettenis
5742b725ae77Skettenis /* The upshot of all of this is that many routines take a (type, host
5743b725ae77Skettenis address, target address) triple as arguments to represent a value.
5744b725ae77Skettenis The host address, if non-null, is supposed to contain an internal
5745b725ae77Skettenis copy of the relevant data; otherwise, the program is to consult the
5746b725ae77Skettenis target at the target address. */
5747b725ae77Skettenis
5748b725ae77Skettenis /* Assuming that VAL0 represents a pointer value, the result of
5749b725ae77Skettenis dereferencing it. Differs from value_ind in its treatment of
5750b725ae77Skettenis dynamic-sized types. */
5751b725ae77Skettenis
5752b725ae77Skettenis struct value *
ada_value_ind(struct value * val0)5753b725ae77Skettenis ada_value_ind (struct value *val0)
5754b725ae77Skettenis {
5755b725ae77Skettenis struct value *val = unwrap_value (value_ind (val0));
5756*11efff7fSkettenis return ada_to_fixed_value (val);
5757b725ae77Skettenis }
5758b725ae77Skettenis
5759b725ae77Skettenis /* The value resulting from dereferencing any "reference to"
5760*11efff7fSkettenis qualifiers on VAL0. */
5761*11efff7fSkettenis
5762b725ae77Skettenis static struct value *
ada_coerce_ref(struct value * val0)5763b725ae77Skettenis ada_coerce_ref (struct value *val0)
5764b725ae77Skettenis {
5765b725ae77Skettenis if (TYPE_CODE (VALUE_TYPE (val0)) == TYPE_CODE_REF)
5766b725ae77Skettenis {
5767b725ae77Skettenis struct value *val = val0;
5768b725ae77Skettenis COERCE_REF (val);
5769b725ae77Skettenis val = unwrap_value (val);
5770*11efff7fSkettenis return ada_to_fixed_value (val);
5771b725ae77Skettenis }
5772b725ae77Skettenis else
5773b725ae77Skettenis return val0;
5774b725ae77Skettenis }
5775b725ae77Skettenis
5776b725ae77Skettenis /* Return OFF rounded upward if necessary to a multiple of
5777b725ae77Skettenis ALIGNMENT (a power of 2). */
5778b725ae77Skettenis
5779b725ae77Skettenis static unsigned int
align_value(unsigned int off,unsigned int alignment)5780b725ae77Skettenis align_value (unsigned int off, unsigned int alignment)
5781b725ae77Skettenis {
5782b725ae77Skettenis return (off + alignment - 1) & ~(alignment - 1);
5783b725ae77Skettenis }
5784b725ae77Skettenis
5785b725ae77Skettenis /* Return the bit alignment required for field #F of template type TYPE. */
5786b725ae77Skettenis
5787b725ae77Skettenis static unsigned int
field_alignment(struct type * type,int f)5788b725ae77Skettenis field_alignment (struct type *type, int f)
5789b725ae77Skettenis {
5790b725ae77Skettenis const char *name = TYPE_FIELD_NAME (type, f);
5791b725ae77Skettenis int len = (name == NULL) ? 0 : strlen (name);
5792b725ae77Skettenis int align_offset;
5793b725ae77Skettenis
5794*11efff7fSkettenis if (!isdigit (name[len - 1]))
5795*11efff7fSkettenis return 1;
5796b725ae77Skettenis
5797b725ae77Skettenis if (isdigit (name[len - 2]))
5798b725ae77Skettenis align_offset = len - 2;
5799b725ae77Skettenis else
5800b725ae77Skettenis align_offset = len - 1;
5801b725ae77Skettenis
5802*11efff7fSkettenis if (align_offset < 7 || strncmp ("___XV", name + align_offset - 6, 5) != 0)
5803b725ae77Skettenis return TARGET_CHAR_BIT;
5804b725ae77Skettenis
5805b725ae77Skettenis return atoi (name + align_offset) * TARGET_CHAR_BIT;
5806b725ae77Skettenis }
5807b725ae77Skettenis
5808*11efff7fSkettenis /* Find a symbol named NAME. Ignores ambiguity. */
5809*11efff7fSkettenis
5810*11efff7fSkettenis struct symbol *
ada_find_any_symbol(const char * name)5811*11efff7fSkettenis ada_find_any_symbol (const char *name)
5812b725ae77Skettenis {
5813b725ae77Skettenis struct symbol *sym;
5814b725ae77Skettenis
5815*11efff7fSkettenis sym = standard_lookup (name, get_selected_block (NULL), VAR_DOMAIN);
5816b725ae77Skettenis if (sym != NULL && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
5817*11efff7fSkettenis return sym;
5818b725ae77Skettenis
5819*11efff7fSkettenis sym = standard_lookup (name, NULL, STRUCT_DOMAIN);
5820*11efff7fSkettenis return sym;
5821*11efff7fSkettenis }
5822*11efff7fSkettenis
5823*11efff7fSkettenis /* Find a type named NAME. Ignores ambiguity. */
5824*11efff7fSkettenis
5825*11efff7fSkettenis struct type *
ada_find_any_type(const char * name)5826*11efff7fSkettenis ada_find_any_type (const char *name)
5827*11efff7fSkettenis {
5828*11efff7fSkettenis struct symbol *sym = ada_find_any_symbol (name);
5829*11efff7fSkettenis
5830b725ae77Skettenis if (sym != NULL)
5831b725ae77Skettenis return SYMBOL_TYPE (sym);
5832b725ae77Skettenis
5833b725ae77Skettenis return NULL;
5834b725ae77Skettenis }
5835b725ae77Skettenis
5836*11efff7fSkettenis /* Given a symbol NAME and its associated BLOCK, search all symbols
5837*11efff7fSkettenis for its ___XR counterpart, which is the ``renaming'' symbol
5838*11efff7fSkettenis associated to NAME. Return this symbol if found, return
5839*11efff7fSkettenis NULL otherwise. */
5840*11efff7fSkettenis
5841*11efff7fSkettenis struct symbol *
ada_find_renaming_symbol(const char * name,struct block * block)5842*11efff7fSkettenis ada_find_renaming_symbol (const char *name, struct block *block)
5843*11efff7fSkettenis {
5844*11efff7fSkettenis const struct symbol *function_sym = block_function (block);
5845*11efff7fSkettenis char *rename;
5846*11efff7fSkettenis
5847*11efff7fSkettenis if (function_sym != NULL)
5848*11efff7fSkettenis {
5849*11efff7fSkettenis /* If the symbol is defined inside a function, NAME is not fully
5850*11efff7fSkettenis qualified. This means we need to prepend the function name
5851*11efff7fSkettenis as well as adding the ``___XR'' suffix to build the name of
5852*11efff7fSkettenis the associated renaming symbol. */
5853*11efff7fSkettenis char *function_name = SYMBOL_LINKAGE_NAME (function_sym);
5854*11efff7fSkettenis const int function_name_len = strlen (function_name);
5855*11efff7fSkettenis const int rename_len = function_name_len + 2 /* "__" */
5856*11efff7fSkettenis + strlen (name) + 6 /* "___XR\0" */ ;
5857*11efff7fSkettenis
5858*11efff7fSkettenis /* Library-level functions are a special case, as GNAT adds
5859*11efff7fSkettenis a ``_ada_'' prefix to the function name to avoid namespace
5860*11efff7fSkettenis pollution. However, the renaming symbol themselves do not
5861*11efff7fSkettenis have this prefix, so we need to skip this prefix if present. */
5862*11efff7fSkettenis if (function_name_len > 5 /* "_ada_" */
5863*11efff7fSkettenis && strstr (function_name, "_ada_") == function_name)
5864*11efff7fSkettenis function_name = function_name + 5;
5865*11efff7fSkettenis
5866*11efff7fSkettenis rename = (char *) alloca (rename_len * sizeof (char));
5867*11efff7fSkettenis sprintf (rename, "%s__%s___XR", function_name, name);
5868*11efff7fSkettenis }
5869*11efff7fSkettenis else
5870*11efff7fSkettenis {
5871*11efff7fSkettenis const int rename_len = strlen (name) + 6;
5872*11efff7fSkettenis rename = (char *) alloca (rename_len * sizeof (char));
5873*11efff7fSkettenis sprintf (rename, "%s___XR", name);
5874*11efff7fSkettenis }
5875*11efff7fSkettenis
5876*11efff7fSkettenis return ada_find_any_symbol (rename);
5877*11efff7fSkettenis }
5878*11efff7fSkettenis
5879b725ae77Skettenis /* Because of GNAT encoding conventions, several GDB symbols may match a
5880b725ae77Skettenis given type name. If the type denoted by TYPE0 is to be preferred to
5881b725ae77Skettenis that of TYPE1 for purposes of type printing, return non-zero;
5882b725ae77Skettenis otherwise return 0. */
5883*11efff7fSkettenis
5884b725ae77Skettenis int
ada_prefer_type(struct type * type0,struct type * type1)5885b725ae77Skettenis ada_prefer_type (struct type *type0, struct type *type1)
5886b725ae77Skettenis {
5887b725ae77Skettenis if (type1 == NULL)
5888b725ae77Skettenis return 1;
5889b725ae77Skettenis else if (type0 == NULL)
5890b725ae77Skettenis return 0;
5891b725ae77Skettenis else if (TYPE_CODE (type1) == TYPE_CODE_VOID)
5892b725ae77Skettenis return 1;
5893b725ae77Skettenis else if (TYPE_CODE (type0) == TYPE_CODE_VOID)
5894b725ae77Skettenis return 0;
5895*11efff7fSkettenis else if (TYPE_NAME (type1) == NULL && TYPE_NAME (type0) != NULL)
5896*11efff7fSkettenis return 1;
5897b725ae77Skettenis else if (ada_is_packed_array_type (type0))
5898b725ae77Skettenis return 1;
5899*11efff7fSkettenis else if (ada_is_array_descriptor_type (type0)
5900*11efff7fSkettenis && !ada_is_array_descriptor_type (type1))
5901b725ae77Skettenis return 1;
5902b725ae77Skettenis else if (ada_renaming_type (type0) != NULL
5903b725ae77Skettenis && ada_renaming_type (type1) == NULL)
5904b725ae77Skettenis return 1;
5905b725ae77Skettenis return 0;
5906b725ae77Skettenis }
5907b725ae77Skettenis
5908b725ae77Skettenis /* The name of TYPE, which is either its TYPE_NAME, or, if that is
5909b725ae77Skettenis null, its TYPE_TAG_NAME. Null if TYPE is null. */
5910*11efff7fSkettenis
5911b725ae77Skettenis char *
ada_type_name(struct type * type)5912b725ae77Skettenis ada_type_name (struct type *type)
5913b725ae77Skettenis {
5914b725ae77Skettenis if (type == NULL)
5915b725ae77Skettenis return NULL;
5916b725ae77Skettenis else if (TYPE_NAME (type) != NULL)
5917b725ae77Skettenis return TYPE_NAME (type);
5918b725ae77Skettenis else
5919b725ae77Skettenis return TYPE_TAG_NAME (type);
5920b725ae77Skettenis }
5921b725ae77Skettenis
5922b725ae77Skettenis /* Find a parallel type to TYPE whose name is formed by appending
5923b725ae77Skettenis SUFFIX to the name of TYPE. */
5924b725ae77Skettenis
5925b725ae77Skettenis struct type *
ada_find_parallel_type(struct type * type,const char * suffix)5926b725ae77Skettenis ada_find_parallel_type (struct type *type, const char *suffix)
5927b725ae77Skettenis {
5928b725ae77Skettenis static char *name;
5929b725ae77Skettenis static size_t name_len = 0;
5930b725ae77Skettenis int len;
5931b725ae77Skettenis char *typename = ada_type_name (type);
5932b725ae77Skettenis
5933b725ae77Skettenis if (typename == NULL)
5934b725ae77Skettenis return NULL;
5935b725ae77Skettenis
5936b725ae77Skettenis len = strlen (typename);
5937b725ae77Skettenis
5938b725ae77Skettenis GROW_VECT (name, name_len, len + strlen (suffix) + 1);
5939b725ae77Skettenis
5940b725ae77Skettenis strcpy (name, typename);
5941b725ae77Skettenis strcpy (name + len, suffix);
5942b725ae77Skettenis
5943b725ae77Skettenis return ada_find_any_type (name);
5944b725ae77Skettenis }
5945b725ae77Skettenis
5946b725ae77Skettenis
5947b725ae77Skettenis /* If TYPE is a variable-size record type, return the corresponding template
5948b725ae77Skettenis type describing its fields. Otherwise, return NULL. */
5949b725ae77Skettenis
5950b725ae77Skettenis static struct type *
dynamic_template_type(struct type * type)5951b725ae77Skettenis dynamic_template_type (struct type *type)
5952b725ae77Skettenis {
5953*11efff7fSkettenis type = ada_check_typedef (type);
5954b725ae77Skettenis
5955b725ae77Skettenis if (type == NULL || TYPE_CODE (type) != TYPE_CODE_STRUCT
5956b725ae77Skettenis || ada_type_name (type) == NULL)
5957b725ae77Skettenis return NULL;
5958b725ae77Skettenis else
5959b725ae77Skettenis {
5960b725ae77Skettenis int len = strlen (ada_type_name (type));
5961*11efff7fSkettenis if (len > 6 && strcmp (ada_type_name (type) + len - 6, "___XVE") == 0)
5962b725ae77Skettenis return type;
5963b725ae77Skettenis else
5964b725ae77Skettenis return ada_find_parallel_type (type, "___XVE");
5965b725ae77Skettenis }
5966b725ae77Skettenis }
5967b725ae77Skettenis
5968b725ae77Skettenis /* Assuming that TEMPL_TYPE is a union or struct type, returns
5969b725ae77Skettenis non-zero iff field FIELD_NUM of TEMPL_TYPE has dynamic size. */
5970b725ae77Skettenis
5971b725ae77Skettenis static int
is_dynamic_field(struct type * templ_type,int field_num)5972b725ae77Skettenis is_dynamic_field (struct type *templ_type, int field_num)
5973b725ae77Skettenis {
5974b725ae77Skettenis const char *name = TYPE_FIELD_NAME (templ_type, field_num);
5975b725ae77Skettenis return name != NULL
5976b725ae77Skettenis && TYPE_CODE (TYPE_FIELD_TYPE (templ_type, field_num)) == TYPE_CODE_PTR
5977b725ae77Skettenis && strstr (name, "___XVL") != NULL;
5978b725ae77Skettenis }
5979b725ae77Skettenis
5980*11efff7fSkettenis /* The index of the variant field of TYPE, or -1 if TYPE does not
5981*11efff7fSkettenis represent a variant record type. */
5982b725ae77Skettenis
5983b725ae77Skettenis static int
variant_field_index(struct type * type)5984*11efff7fSkettenis variant_field_index (struct type *type)
5985b725ae77Skettenis {
5986b725ae77Skettenis int f;
5987b725ae77Skettenis
5988*11efff7fSkettenis if (type == NULL || TYPE_CODE (type) != TYPE_CODE_STRUCT)
5989*11efff7fSkettenis return -1;
5990*11efff7fSkettenis
5991*11efff7fSkettenis for (f = 0; f < TYPE_NFIELDS (type); f += 1)
5992*11efff7fSkettenis {
5993*11efff7fSkettenis if (ada_is_variant_part (type, f))
5994*11efff7fSkettenis return f;
5995*11efff7fSkettenis }
5996*11efff7fSkettenis return -1;
5997b725ae77Skettenis }
5998b725ae77Skettenis
5999*11efff7fSkettenis /* A record type with no fields. */
6000*11efff7fSkettenis
6001b725ae77Skettenis static struct type *
empty_record(struct objfile * objfile)6002b725ae77Skettenis empty_record (struct objfile *objfile)
6003b725ae77Skettenis {
6004b725ae77Skettenis struct type *type = alloc_type (objfile);
6005b725ae77Skettenis TYPE_CODE (type) = TYPE_CODE_STRUCT;
6006b725ae77Skettenis TYPE_NFIELDS (type) = 0;
6007b725ae77Skettenis TYPE_FIELDS (type) = NULL;
6008b725ae77Skettenis TYPE_NAME (type) = "<empty>";
6009b725ae77Skettenis TYPE_TAG_NAME (type) = NULL;
6010b725ae77Skettenis TYPE_FLAGS (type) = 0;
6011b725ae77Skettenis TYPE_LENGTH (type) = 0;
6012b725ae77Skettenis return type;
6013b725ae77Skettenis }
6014b725ae77Skettenis
6015b725ae77Skettenis /* An ordinary record type (with fixed-length fields) that describes
6016b725ae77Skettenis the value of type TYPE at VALADDR or ADDRESS (see comments at
6017b725ae77Skettenis the beginning of this section) VAL according to GNAT conventions.
6018b725ae77Skettenis DVAL0 should describe the (portion of a) record that contains any
6019b725ae77Skettenis necessary discriminants. It should be NULL if VALUE_TYPE (VAL) is
6020b725ae77Skettenis an outer-level type (i.e., as opposed to a branch of a variant.) A
6021b725ae77Skettenis variant field (unless unchecked) is replaced by a particular branch
6022*11efff7fSkettenis of the variant.
6023b725ae77Skettenis
6024*11efff7fSkettenis If not KEEP_DYNAMIC_FIELDS, then all fields whose position or
6025*11efff7fSkettenis length are not statically known are discarded. As a consequence,
6026*11efff7fSkettenis VALADDR, ADDRESS and DVAL0 are ignored.
6027*11efff7fSkettenis
6028*11efff7fSkettenis NOTE: Limitations: For now, we assume that dynamic fields and
6029*11efff7fSkettenis variants occupy whole numbers of bytes. However, they need not be
6030*11efff7fSkettenis byte-aligned. */
6031*11efff7fSkettenis
6032*11efff7fSkettenis struct type *
ada_template_to_fixed_record_type_1(struct type * type,char * valaddr,CORE_ADDR address,struct value * dval0,int keep_dynamic_fields)6033*11efff7fSkettenis ada_template_to_fixed_record_type_1 (struct type *type, char *valaddr,
6034*11efff7fSkettenis CORE_ADDR address, struct value *dval0,
6035*11efff7fSkettenis int keep_dynamic_fields)
6036b725ae77Skettenis {
6037b725ae77Skettenis struct value *mark = value_mark ();
6038b725ae77Skettenis struct value *dval;
6039b725ae77Skettenis struct type *rtype;
6040b725ae77Skettenis int nfields, bit_len;
6041*11efff7fSkettenis int variant_field;
6042b725ae77Skettenis long off;
6043*11efff7fSkettenis int fld_bit_len, bit_incr;
6044b725ae77Skettenis int f;
6045b725ae77Skettenis
6046*11efff7fSkettenis /* Compute the number of fields in this record type that are going
6047*11efff7fSkettenis to be processed: unless keep_dynamic_fields, this includes only
6048*11efff7fSkettenis fields whose position and length are static will be processed. */
6049*11efff7fSkettenis if (keep_dynamic_fields)
6050b725ae77Skettenis nfields = TYPE_NFIELDS (type);
6051*11efff7fSkettenis else
6052*11efff7fSkettenis {
6053*11efff7fSkettenis nfields = 0;
6054*11efff7fSkettenis while (nfields < TYPE_NFIELDS (type)
6055*11efff7fSkettenis && !ada_is_variant_part (type, nfields)
6056*11efff7fSkettenis && !is_dynamic_field (type, nfields))
6057*11efff7fSkettenis nfields++;
6058*11efff7fSkettenis }
6059*11efff7fSkettenis
6060b725ae77Skettenis rtype = alloc_type (TYPE_OBJFILE (type));
6061b725ae77Skettenis TYPE_CODE (rtype) = TYPE_CODE_STRUCT;
6062b725ae77Skettenis INIT_CPLUS_SPECIFIC (rtype);
6063b725ae77Skettenis TYPE_NFIELDS (rtype) = nfields;
6064b725ae77Skettenis TYPE_FIELDS (rtype) = (struct field *)
6065b725ae77Skettenis TYPE_ALLOC (rtype, nfields * sizeof (struct field));
6066b725ae77Skettenis memset (TYPE_FIELDS (rtype), 0, sizeof (struct field) * nfields);
6067b725ae77Skettenis TYPE_NAME (rtype) = ada_type_name (type);
6068b725ae77Skettenis TYPE_TAG_NAME (rtype) = NULL;
6069*11efff7fSkettenis TYPE_FLAGS (rtype) |= TYPE_FLAG_FIXED_INSTANCE;
6070b725ae77Skettenis
6071b725ae77Skettenis off = 0;
6072b725ae77Skettenis bit_len = 0;
6073*11efff7fSkettenis variant_field = -1;
6074*11efff7fSkettenis
6075b725ae77Skettenis for (f = 0; f < nfields; f += 1)
6076b725ae77Skettenis {
6077*11efff7fSkettenis off = align_value (off, field_alignment (type, f))
6078*11efff7fSkettenis + TYPE_FIELD_BITPOS (type, f);
6079b725ae77Skettenis TYPE_FIELD_BITPOS (rtype, f) = off;
6080b725ae77Skettenis TYPE_FIELD_BITSIZE (rtype, f) = 0;
6081b725ae77Skettenis
6082b725ae77Skettenis if (ada_is_variant_part (type, f))
6083b725ae77Skettenis {
6084*11efff7fSkettenis variant_field = f;
6085*11efff7fSkettenis fld_bit_len = bit_incr = 0;
6086b725ae77Skettenis }
6087b725ae77Skettenis else if (is_dynamic_field (type, f))
6088b725ae77Skettenis {
6089b725ae77Skettenis if (dval0 == NULL)
6090b725ae77Skettenis dval = value_from_contents_and_address (rtype, valaddr, address);
6091b725ae77Skettenis else
6092b725ae77Skettenis dval = dval0;
6093b725ae77Skettenis
6094b725ae77Skettenis TYPE_FIELD_TYPE (rtype, f) =
6095b725ae77Skettenis ada_to_fixed_type
6096b725ae77Skettenis (ada_get_base_type
6097b725ae77Skettenis (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, f))),
6098b725ae77Skettenis cond_offset_host (valaddr, off / TARGET_CHAR_BIT),
6099b725ae77Skettenis cond_offset_target (address, off / TARGET_CHAR_BIT), dval);
6100b725ae77Skettenis TYPE_FIELD_NAME (rtype, f) = TYPE_FIELD_NAME (type, f);
6101b725ae77Skettenis bit_incr = fld_bit_len =
6102b725ae77Skettenis TYPE_LENGTH (TYPE_FIELD_TYPE (rtype, f)) * TARGET_CHAR_BIT;
6103b725ae77Skettenis }
6104b725ae77Skettenis else
6105b725ae77Skettenis {
6106b725ae77Skettenis TYPE_FIELD_TYPE (rtype, f) = TYPE_FIELD_TYPE (type, f);
6107b725ae77Skettenis TYPE_FIELD_NAME (rtype, f) = TYPE_FIELD_NAME (type, f);
6108b725ae77Skettenis if (TYPE_FIELD_BITSIZE (type, f) > 0)
6109b725ae77Skettenis bit_incr = fld_bit_len =
6110b725ae77Skettenis TYPE_FIELD_BITSIZE (rtype, f) = TYPE_FIELD_BITSIZE (type, f);
6111b725ae77Skettenis else
6112b725ae77Skettenis bit_incr = fld_bit_len =
6113b725ae77Skettenis TYPE_LENGTH (TYPE_FIELD_TYPE (type, f)) * TARGET_CHAR_BIT;
6114b725ae77Skettenis }
6115b725ae77Skettenis if (off + fld_bit_len > bit_len)
6116b725ae77Skettenis bit_len = off + fld_bit_len;
6117b725ae77Skettenis off += bit_incr;
6118*11efff7fSkettenis TYPE_LENGTH (rtype) =
6119*11efff7fSkettenis align_value (bit_len, TARGET_CHAR_BIT) / TARGET_CHAR_BIT;
6120b725ae77Skettenis }
6121*11efff7fSkettenis
6122*11efff7fSkettenis /* We handle the variant part, if any, at the end because of certain
6123*11efff7fSkettenis odd cases in which it is re-ordered so as NOT the last field of
6124*11efff7fSkettenis the record. This can happen in the presence of representation
6125*11efff7fSkettenis clauses. */
6126*11efff7fSkettenis if (variant_field >= 0)
6127*11efff7fSkettenis {
6128*11efff7fSkettenis struct type *branch_type;
6129*11efff7fSkettenis
6130*11efff7fSkettenis off = TYPE_FIELD_BITPOS (rtype, variant_field);
6131*11efff7fSkettenis
6132*11efff7fSkettenis if (dval0 == NULL)
6133*11efff7fSkettenis dval = value_from_contents_and_address (rtype, valaddr, address);
6134*11efff7fSkettenis else
6135*11efff7fSkettenis dval = dval0;
6136*11efff7fSkettenis
6137*11efff7fSkettenis branch_type =
6138*11efff7fSkettenis to_fixed_variant_branch_type
6139*11efff7fSkettenis (TYPE_FIELD_TYPE (type, variant_field),
6140*11efff7fSkettenis cond_offset_host (valaddr, off / TARGET_CHAR_BIT),
6141*11efff7fSkettenis cond_offset_target (address, off / TARGET_CHAR_BIT), dval);
6142*11efff7fSkettenis if (branch_type == NULL)
6143*11efff7fSkettenis {
6144*11efff7fSkettenis for (f = variant_field + 1; f < TYPE_NFIELDS (rtype); f += 1)
6145*11efff7fSkettenis TYPE_FIELDS (rtype)[f - 1] = TYPE_FIELDS (rtype)[f];
6146*11efff7fSkettenis TYPE_NFIELDS (rtype) -= 1;
6147*11efff7fSkettenis }
6148*11efff7fSkettenis else
6149*11efff7fSkettenis {
6150*11efff7fSkettenis TYPE_FIELD_TYPE (rtype, variant_field) = branch_type;
6151*11efff7fSkettenis TYPE_FIELD_NAME (rtype, variant_field) = "S";
6152*11efff7fSkettenis fld_bit_len =
6153*11efff7fSkettenis TYPE_LENGTH (TYPE_FIELD_TYPE (rtype, variant_field)) *
6154*11efff7fSkettenis TARGET_CHAR_BIT;
6155*11efff7fSkettenis if (off + fld_bit_len > bit_len)
6156*11efff7fSkettenis bit_len = off + fld_bit_len;
6157*11efff7fSkettenis TYPE_LENGTH (rtype) =
6158*11efff7fSkettenis align_value (bit_len, TARGET_CHAR_BIT) / TARGET_CHAR_BIT;
6159*11efff7fSkettenis }
6160*11efff7fSkettenis }
6161*11efff7fSkettenis
6162*11efff7fSkettenis /* According to exp_dbug.ads, the size of TYPE for variable-size records
6163*11efff7fSkettenis should contain the alignment of that record, which should be a strictly
6164*11efff7fSkettenis positive value. If null or negative, then something is wrong, most
6165*11efff7fSkettenis probably in the debug info. In that case, we don't round up the size
6166*11efff7fSkettenis of the resulting type. If this record is not part of another structure,
6167*11efff7fSkettenis the current RTYPE length might be good enough for our purposes. */
6168*11efff7fSkettenis if (TYPE_LENGTH (type) <= 0)
6169*11efff7fSkettenis {
6170*11efff7fSkettenis warning ("Invalid type size for `%s' detected: %d.",
6171*11efff7fSkettenis TYPE_NAME (rtype) ? TYPE_NAME (rtype) : "<unnamed>",
6172*11efff7fSkettenis TYPE_LENGTH (type));
6173*11efff7fSkettenis }
6174*11efff7fSkettenis else
6175*11efff7fSkettenis {
6176*11efff7fSkettenis TYPE_LENGTH (rtype) = align_value (TYPE_LENGTH (rtype),
6177*11efff7fSkettenis TYPE_LENGTH (type));
6178*11efff7fSkettenis }
6179b725ae77Skettenis
6180b725ae77Skettenis value_free_to_mark (mark);
6181b725ae77Skettenis if (TYPE_LENGTH (rtype) > varsize_limit)
6182b725ae77Skettenis error ("record type with dynamic size is larger than varsize-limit");
6183b725ae77Skettenis return rtype;
6184b725ae77Skettenis }
6185b725ae77Skettenis
6186*11efff7fSkettenis /* As for ada_template_to_fixed_record_type_1 with KEEP_DYNAMIC_FIELDS
6187*11efff7fSkettenis of 1. */
6188b725ae77Skettenis
6189b725ae77Skettenis static struct type *
template_to_fixed_record_type(struct type * type,char * valaddr,CORE_ADDR address,struct value * dval0)6190*11efff7fSkettenis template_to_fixed_record_type (struct type *type, char *valaddr,
6191*11efff7fSkettenis CORE_ADDR address, struct value *dval0)
6192*11efff7fSkettenis {
6193*11efff7fSkettenis return ada_template_to_fixed_record_type_1 (type, valaddr,
6194*11efff7fSkettenis address, dval0, 1);
6195*11efff7fSkettenis }
6196*11efff7fSkettenis
6197*11efff7fSkettenis /* An ordinary record type in which ___XVL-convention fields and
6198*11efff7fSkettenis ___XVU- and ___XVN-convention field types in TYPE0 are replaced with
6199*11efff7fSkettenis static approximations, containing all possible fields. Uses
6200*11efff7fSkettenis no runtime values. Useless for use in values, but that's OK,
6201*11efff7fSkettenis since the results are used only for type determinations. Works on both
6202*11efff7fSkettenis structs and unions. Representation note: to save space, we memorize
6203*11efff7fSkettenis the result of this function in the TYPE_TARGET_TYPE of the
6204*11efff7fSkettenis template type. */
6205*11efff7fSkettenis
6206*11efff7fSkettenis static struct type *
template_to_static_fixed_type(struct type * type0)6207*11efff7fSkettenis template_to_static_fixed_type (struct type *type0)
6208b725ae77Skettenis {
6209b725ae77Skettenis struct type *type;
6210b725ae77Skettenis int nfields;
6211b725ae77Skettenis int f;
6212b725ae77Skettenis
6213*11efff7fSkettenis if (TYPE_TARGET_TYPE (type0) != NULL)
6214*11efff7fSkettenis return TYPE_TARGET_TYPE (type0);
6215b725ae77Skettenis
6216*11efff7fSkettenis nfields = TYPE_NFIELDS (type0);
6217*11efff7fSkettenis type = type0;
6218*11efff7fSkettenis
6219*11efff7fSkettenis for (f = 0; f < nfields; f += 1)
6220*11efff7fSkettenis {
6221*11efff7fSkettenis struct type *field_type = ada_check_typedef (TYPE_FIELD_TYPE (type0, f));
6222*11efff7fSkettenis struct type *new_type;
6223*11efff7fSkettenis
6224*11efff7fSkettenis if (is_dynamic_field (type0, f))
6225*11efff7fSkettenis new_type = to_static_fixed_type (TYPE_TARGET_TYPE (field_type));
6226*11efff7fSkettenis else
6227*11efff7fSkettenis new_type = to_static_fixed_type (field_type);
6228*11efff7fSkettenis if (type == type0 && new_type != field_type)
6229*11efff7fSkettenis {
6230*11efff7fSkettenis TYPE_TARGET_TYPE (type0) = type = alloc_type (TYPE_OBJFILE (type0));
6231*11efff7fSkettenis TYPE_CODE (type) = TYPE_CODE (type0);
6232b725ae77Skettenis INIT_CPLUS_SPECIFIC (type);
6233b725ae77Skettenis TYPE_NFIELDS (type) = nfields;
6234b725ae77Skettenis TYPE_FIELDS (type) = (struct field *)
6235b725ae77Skettenis TYPE_ALLOC (type, nfields * sizeof (struct field));
6236*11efff7fSkettenis memcpy (TYPE_FIELDS (type), TYPE_FIELDS (type0),
6237*11efff7fSkettenis sizeof (struct field) * nfields);
6238*11efff7fSkettenis TYPE_NAME (type) = ada_type_name (type0);
6239b725ae77Skettenis TYPE_TAG_NAME (type) = NULL;
6240*11efff7fSkettenis TYPE_FLAGS (type) |= TYPE_FLAG_FIXED_INSTANCE;
6241b725ae77Skettenis TYPE_LENGTH (type) = 0;
6242b725ae77Skettenis }
6243*11efff7fSkettenis TYPE_FIELD_TYPE (type, f) = new_type;
6244*11efff7fSkettenis TYPE_FIELD_NAME (type, f) = TYPE_FIELD_NAME (type0, f);
6245b725ae77Skettenis }
6246b725ae77Skettenis return type;
6247b725ae77Skettenis }
6248b725ae77Skettenis
6249*11efff7fSkettenis /* Given an object of type TYPE whose contents are at VALADDR and
6250*11efff7fSkettenis whose address in memory is ADDRESS, returns a revision of TYPE --
6251*11efff7fSkettenis a non-dynamic-sized record with a variant part -- in which
6252*11efff7fSkettenis the variant part is replaced with the appropriate branch. Looks
6253*11efff7fSkettenis for discriminant values in DVAL0, which can be NULL if the record
6254*11efff7fSkettenis contains the necessary discriminant values. */
6255*11efff7fSkettenis
6256b725ae77Skettenis static struct type *
to_record_with_fixed_variant_part(struct type * type,char * valaddr,CORE_ADDR address,struct value * dval0)6257b725ae77Skettenis to_record_with_fixed_variant_part (struct type *type, char *valaddr,
6258*11efff7fSkettenis CORE_ADDR address, struct value *dval0)
6259b725ae77Skettenis {
6260b725ae77Skettenis struct value *mark = value_mark ();
6261*11efff7fSkettenis struct value *dval;
6262b725ae77Skettenis struct type *rtype;
6263b725ae77Skettenis struct type *branch_type;
6264b725ae77Skettenis int nfields = TYPE_NFIELDS (type);
6265*11efff7fSkettenis int variant_field = variant_field_index (type);
6266b725ae77Skettenis
6267*11efff7fSkettenis if (variant_field == -1)
6268b725ae77Skettenis return type;
6269b725ae77Skettenis
6270*11efff7fSkettenis if (dval0 == NULL)
6271*11efff7fSkettenis dval = value_from_contents_and_address (type, valaddr, address);
6272*11efff7fSkettenis else
6273*11efff7fSkettenis dval = dval0;
6274*11efff7fSkettenis
6275b725ae77Skettenis rtype = alloc_type (TYPE_OBJFILE (type));
6276b725ae77Skettenis TYPE_CODE (rtype) = TYPE_CODE_STRUCT;
6277*11efff7fSkettenis INIT_CPLUS_SPECIFIC (rtype);
6278*11efff7fSkettenis TYPE_NFIELDS (rtype) = nfields;
6279b725ae77Skettenis TYPE_FIELDS (rtype) =
6280b725ae77Skettenis (struct field *) TYPE_ALLOC (rtype, nfields * sizeof (struct field));
6281b725ae77Skettenis memcpy (TYPE_FIELDS (rtype), TYPE_FIELDS (type),
6282b725ae77Skettenis sizeof (struct field) * nfields);
6283b725ae77Skettenis TYPE_NAME (rtype) = ada_type_name (type);
6284b725ae77Skettenis TYPE_TAG_NAME (rtype) = NULL;
6285*11efff7fSkettenis TYPE_FLAGS (rtype) |= TYPE_FLAG_FIXED_INSTANCE;
6286b725ae77Skettenis TYPE_LENGTH (rtype) = TYPE_LENGTH (type);
6287b725ae77Skettenis
6288*11efff7fSkettenis branch_type = to_fixed_variant_branch_type
6289*11efff7fSkettenis (TYPE_FIELD_TYPE (type, variant_field),
6290b725ae77Skettenis cond_offset_host (valaddr,
6291*11efff7fSkettenis TYPE_FIELD_BITPOS (type, variant_field)
6292*11efff7fSkettenis / TARGET_CHAR_BIT),
6293b725ae77Skettenis cond_offset_target (address,
6294*11efff7fSkettenis TYPE_FIELD_BITPOS (type, variant_field)
6295*11efff7fSkettenis / TARGET_CHAR_BIT), dval);
6296b725ae77Skettenis if (branch_type == NULL)
6297b725ae77Skettenis {
6298*11efff7fSkettenis int f;
6299*11efff7fSkettenis for (f = variant_field + 1; f < nfields; f += 1)
6300*11efff7fSkettenis TYPE_FIELDS (rtype)[f - 1] = TYPE_FIELDS (rtype)[f];
6301b725ae77Skettenis TYPE_NFIELDS (rtype) -= 1;
6302b725ae77Skettenis }
6303b725ae77Skettenis else
6304b725ae77Skettenis {
6305*11efff7fSkettenis TYPE_FIELD_TYPE (rtype, variant_field) = branch_type;
6306*11efff7fSkettenis TYPE_FIELD_NAME (rtype, variant_field) = "S";
6307*11efff7fSkettenis TYPE_FIELD_BITSIZE (rtype, variant_field) = 0;
6308b725ae77Skettenis TYPE_LENGTH (rtype) += TYPE_LENGTH (branch_type);
6309b725ae77Skettenis }
6310*11efff7fSkettenis TYPE_LENGTH (rtype) -= TYPE_LENGTH (TYPE_FIELD_TYPE (type, variant_field));
6311b725ae77Skettenis
6312*11efff7fSkettenis value_free_to_mark (mark);
6313b725ae77Skettenis return rtype;
6314b725ae77Skettenis }
6315b725ae77Skettenis
6316b725ae77Skettenis /* An ordinary record type (with fixed-length fields) that describes
6317b725ae77Skettenis the value at (TYPE0, VALADDR, ADDRESS) [see explanation at
6318b725ae77Skettenis beginning of this section]. Any necessary discriminants' values
6319*11efff7fSkettenis should be in DVAL, a record value; it may be NULL if the object
6320*11efff7fSkettenis at ADDR itself contains any necessary discriminant values.
6321*11efff7fSkettenis Additionally, VALADDR and ADDRESS may also be NULL if no discriminant
6322*11efff7fSkettenis values from the record are needed. Except in the case that DVAL,
6323*11efff7fSkettenis VALADDR, and ADDRESS are all 0 or NULL, a variant field (unless
6324*11efff7fSkettenis unchecked) is replaced by a particular branch of the variant.
6325*11efff7fSkettenis
6326*11efff7fSkettenis NOTE: the case in which DVAL and VALADDR are NULL and ADDRESS is 0
6327*11efff7fSkettenis is questionable and may be removed. It can arise during the
6328*11efff7fSkettenis processing of an unconstrained-array-of-record type where all the
6329*11efff7fSkettenis variant branches have exactly the same size. This is because in
6330*11efff7fSkettenis such cases, the compiler does not bother to use the XVS convention
6331*11efff7fSkettenis when encoding the record. I am currently dubious of this
6332*11efff7fSkettenis shortcut and suspect the compiler should be altered. FIXME. */
6333b725ae77Skettenis
6334b725ae77Skettenis static struct type *
to_fixed_record_type(struct type * type0,char * valaddr,CORE_ADDR address,struct value * dval)6335*11efff7fSkettenis to_fixed_record_type (struct type *type0, char *valaddr,
6336*11efff7fSkettenis CORE_ADDR address, struct value *dval)
6337b725ae77Skettenis {
6338b725ae77Skettenis struct type *templ_type;
6339b725ae77Skettenis
6340*11efff7fSkettenis if (TYPE_FLAGS (type0) & TYPE_FLAG_FIXED_INSTANCE)
6341b725ae77Skettenis return type0;
6342*11efff7fSkettenis
6343b725ae77Skettenis templ_type = dynamic_template_type (type0);
6344b725ae77Skettenis
6345b725ae77Skettenis if (templ_type != NULL)
6346b725ae77Skettenis return template_to_fixed_record_type (templ_type, valaddr, address, dval);
6347*11efff7fSkettenis else if (variant_field_index (type0) >= 0)
6348*11efff7fSkettenis {
6349*11efff7fSkettenis if (dval == NULL && valaddr == NULL && address == 0)
6350*11efff7fSkettenis return type0;
6351*11efff7fSkettenis return to_record_with_fixed_variant_part (type0, valaddr, address,
6352*11efff7fSkettenis dval);
6353*11efff7fSkettenis }
6354b725ae77Skettenis else
6355b725ae77Skettenis {
6356*11efff7fSkettenis TYPE_FLAGS (type0) |= TYPE_FLAG_FIXED_INSTANCE;
6357b725ae77Skettenis return type0;
6358b725ae77Skettenis }
6359b725ae77Skettenis
6360b725ae77Skettenis }
6361b725ae77Skettenis
6362b725ae77Skettenis /* An ordinary record type (with fixed-length fields) that describes
6363b725ae77Skettenis the value at (VAR_TYPE0, VALADDR, ADDRESS), where VAR_TYPE0 is a
6364b725ae77Skettenis union type. Any necessary discriminants' values should be in DVAL,
6365b725ae77Skettenis a record value. That is, this routine selects the appropriate
6366b725ae77Skettenis branch of the union at ADDR according to the discriminant value
6367b725ae77Skettenis indicated in the union's type name. */
6368b725ae77Skettenis
6369b725ae77Skettenis static struct type *
to_fixed_variant_branch_type(struct type * var_type0,char * valaddr,CORE_ADDR address,struct value * dval)6370b725ae77Skettenis to_fixed_variant_branch_type (struct type *var_type0, char *valaddr,
6371b725ae77Skettenis CORE_ADDR address, struct value *dval)
6372b725ae77Skettenis {
6373b725ae77Skettenis int which;
6374b725ae77Skettenis struct type *templ_type;
6375b725ae77Skettenis struct type *var_type;
6376b725ae77Skettenis
6377b725ae77Skettenis if (TYPE_CODE (var_type0) == TYPE_CODE_PTR)
6378b725ae77Skettenis var_type = TYPE_TARGET_TYPE (var_type0);
6379b725ae77Skettenis else
6380b725ae77Skettenis var_type = var_type0;
6381b725ae77Skettenis
6382b725ae77Skettenis templ_type = ada_find_parallel_type (var_type, "___XVU");
6383b725ae77Skettenis
6384b725ae77Skettenis if (templ_type != NULL)
6385b725ae77Skettenis var_type = templ_type;
6386b725ae77Skettenis
6387b725ae77Skettenis which =
6388b725ae77Skettenis ada_which_variant_applies (var_type,
6389b725ae77Skettenis VALUE_TYPE (dval), VALUE_CONTENTS (dval));
6390b725ae77Skettenis
6391b725ae77Skettenis if (which < 0)
6392b725ae77Skettenis return empty_record (TYPE_OBJFILE (var_type));
6393b725ae77Skettenis else if (is_dynamic_field (var_type, which))
6394*11efff7fSkettenis return to_fixed_record_type
6395b725ae77Skettenis (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (var_type, which)),
6396b725ae77Skettenis valaddr, address, dval);
6397*11efff7fSkettenis else if (variant_field_index (TYPE_FIELD_TYPE (var_type, which)) >= 0)
6398b725ae77Skettenis return
6399b725ae77Skettenis to_fixed_record_type
6400b725ae77Skettenis (TYPE_FIELD_TYPE (var_type, which), valaddr, address, dval);
6401b725ae77Skettenis else
6402b725ae77Skettenis return TYPE_FIELD_TYPE (var_type, which);
6403b725ae77Skettenis }
6404b725ae77Skettenis
6405b725ae77Skettenis /* Assuming that TYPE0 is an array type describing the type of a value
6406b725ae77Skettenis at ADDR, and that DVAL describes a record containing any
6407b725ae77Skettenis discriminants used in TYPE0, returns a type for the value that
6408b725ae77Skettenis contains no dynamic components (that is, no components whose sizes
6409b725ae77Skettenis are determined by run-time quantities). Unless IGNORE_TOO_BIG is
6410b725ae77Skettenis true, gives an error message if the resulting type's size is over
6411*11efff7fSkettenis varsize_limit. */
6412b725ae77Skettenis
6413b725ae77Skettenis static struct type *
to_fixed_array_type(struct type * type0,struct value * dval,int ignore_too_big)6414b725ae77Skettenis to_fixed_array_type (struct type *type0, struct value *dval,
6415b725ae77Skettenis int ignore_too_big)
6416b725ae77Skettenis {
6417b725ae77Skettenis struct type *index_type_desc;
6418b725ae77Skettenis struct type *result;
6419b725ae77Skettenis
6420*11efff7fSkettenis if (ada_is_packed_array_type (type0) /* revisit? */
6421b725ae77Skettenis || (TYPE_FLAGS (type0) & TYPE_FLAG_FIXED_INSTANCE))
6422*11efff7fSkettenis return type0;
6423b725ae77Skettenis
6424b725ae77Skettenis index_type_desc = ada_find_parallel_type (type0, "___XA");
6425b725ae77Skettenis if (index_type_desc == NULL)
6426b725ae77Skettenis {
6427*11efff7fSkettenis struct type *elt_type0 = ada_check_typedef (TYPE_TARGET_TYPE (type0));
6428b725ae77Skettenis /* NOTE: elt_type---the fixed version of elt_type0---should never
6429*11efff7fSkettenis depend on the contents of the array in properly constructed
6430*11efff7fSkettenis debugging data. */
6431b725ae77Skettenis struct type *elt_type = ada_to_fixed_type (elt_type0, 0, 0, dval);
6432b725ae77Skettenis
6433b725ae77Skettenis if (elt_type0 == elt_type)
6434b725ae77Skettenis result = type0;
6435b725ae77Skettenis else
6436b725ae77Skettenis result = create_array_type (alloc_type (TYPE_OBJFILE (type0)),
6437b725ae77Skettenis elt_type, TYPE_INDEX_TYPE (type0));
6438b725ae77Skettenis }
6439b725ae77Skettenis else
6440b725ae77Skettenis {
6441b725ae77Skettenis int i;
6442b725ae77Skettenis struct type *elt_type0;
6443b725ae77Skettenis
6444b725ae77Skettenis elt_type0 = type0;
6445b725ae77Skettenis for (i = TYPE_NFIELDS (index_type_desc); i > 0; i -= 1)
6446b725ae77Skettenis elt_type0 = TYPE_TARGET_TYPE (elt_type0);
6447b725ae77Skettenis
6448b725ae77Skettenis /* NOTE: result---the fixed version of elt_type0---should never
6449*11efff7fSkettenis depend on the contents of the array in properly constructed
6450*11efff7fSkettenis debugging data. */
6451*11efff7fSkettenis result = ada_to_fixed_type (ada_check_typedef (elt_type0), 0, 0, dval);
6452b725ae77Skettenis for (i = TYPE_NFIELDS (index_type_desc) - 1; i >= 0; i -= 1)
6453b725ae77Skettenis {
6454b725ae77Skettenis struct type *range_type =
6455b725ae77Skettenis to_fixed_range_type (TYPE_FIELD_NAME (index_type_desc, i),
6456b725ae77Skettenis dval, TYPE_OBJFILE (type0));
6457b725ae77Skettenis result = create_array_type (alloc_type (TYPE_OBJFILE (type0)),
6458b725ae77Skettenis result, range_type);
6459b725ae77Skettenis }
6460b725ae77Skettenis if (!ignore_too_big && TYPE_LENGTH (result) > varsize_limit)
6461b725ae77Skettenis error ("array type with dynamic size is larger than varsize-limit");
6462b725ae77Skettenis }
6463b725ae77Skettenis
6464*11efff7fSkettenis TYPE_FLAGS (result) |= TYPE_FLAG_FIXED_INSTANCE;
6465b725ae77Skettenis return result;
6466b725ae77Skettenis }
6467b725ae77Skettenis
6468b725ae77Skettenis
6469b725ae77Skettenis /* A standard type (containing no dynamically sized components)
6470b725ae77Skettenis corresponding to TYPE for the value (TYPE, VALADDR, ADDRESS)
6471b725ae77Skettenis DVAL describes a record containing any discriminants used in TYPE0,
6472*11efff7fSkettenis and may be NULL if there are none, or if the object of type TYPE at
6473*11efff7fSkettenis ADDRESS or in VALADDR contains these discriminants. */
6474b725ae77Skettenis
6475b725ae77Skettenis struct type *
ada_to_fixed_type(struct type * type,char * valaddr,CORE_ADDR address,struct value * dval)6476*11efff7fSkettenis ada_to_fixed_type (struct type *type, char *valaddr,
6477*11efff7fSkettenis CORE_ADDR address, struct value *dval)
6478b725ae77Skettenis {
6479*11efff7fSkettenis type = ada_check_typedef (type);
6480b725ae77Skettenis switch (TYPE_CODE (type))
6481b725ae77Skettenis {
6482b725ae77Skettenis default:
6483b725ae77Skettenis return type;
6484b725ae77Skettenis case TYPE_CODE_STRUCT:
6485*11efff7fSkettenis {
6486*11efff7fSkettenis struct type *static_type = to_static_fixed_type (type);
6487*11efff7fSkettenis if (ada_is_tagged_type (static_type, 0))
6488*11efff7fSkettenis {
6489*11efff7fSkettenis struct type *real_type =
6490*11efff7fSkettenis type_from_tag (value_tag_from_contents_and_address (static_type,
6491*11efff7fSkettenis valaddr,
6492*11efff7fSkettenis address));
6493*11efff7fSkettenis if (real_type != NULL)
6494*11efff7fSkettenis type = real_type;
6495*11efff7fSkettenis }
6496b725ae77Skettenis return to_fixed_record_type (type, valaddr, address, NULL);
6497*11efff7fSkettenis }
6498b725ae77Skettenis case TYPE_CODE_ARRAY:
6499*11efff7fSkettenis return to_fixed_array_type (type, dval, 1);
6500b725ae77Skettenis case TYPE_CODE_UNION:
6501b725ae77Skettenis if (dval == NULL)
6502b725ae77Skettenis return type;
6503b725ae77Skettenis else
6504b725ae77Skettenis return to_fixed_variant_branch_type (type, valaddr, address, dval);
6505b725ae77Skettenis }
6506b725ae77Skettenis }
6507b725ae77Skettenis
6508b725ae77Skettenis /* A standard (static-sized) type corresponding as well as possible to
6509b725ae77Skettenis TYPE0, but based on no runtime data. */
6510b725ae77Skettenis
6511b725ae77Skettenis static struct type *
to_static_fixed_type(struct type * type0)6512b725ae77Skettenis to_static_fixed_type (struct type *type0)
6513b725ae77Skettenis {
6514b725ae77Skettenis struct type *type;
6515b725ae77Skettenis
6516b725ae77Skettenis if (type0 == NULL)
6517b725ae77Skettenis return NULL;
6518b725ae77Skettenis
6519*11efff7fSkettenis if (TYPE_FLAGS (type0) & TYPE_FLAG_FIXED_INSTANCE)
6520b725ae77Skettenis return type0;
6521*11efff7fSkettenis
6522*11efff7fSkettenis type0 = ada_check_typedef (type0);
6523b725ae77Skettenis
6524b725ae77Skettenis switch (TYPE_CODE (type0))
6525b725ae77Skettenis {
6526b725ae77Skettenis default:
6527b725ae77Skettenis return type0;
6528b725ae77Skettenis case TYPE_CODE_STRUCT:
6529b725ae77Skettenis type = dynamic_template_type (type0);
6530b725ae77Skettenis if (type != NULL)
6531b725ae77Skettenis return template_to_static_fixed_type (type);
6532*11efff7fSkettenis else
6533*11efff7fSkettenis return template_to_static_fixed_type (type0);
6534b725ae77Skettenis case TYPE_CODE_UNION:
6535b725ae77Skettenis type = ada_find_parallel_type (type0, "___XVU");
6536b725ae77Skettenis if (type != NULL)
6537b725ae77Skettenis return template_to_static_fixed_type (type);
6538*11efff7fSkettenis else
6539*11efff7fSkettenis return template_to_static_fixed_type (type0);
6540b725ae77Skettenis }
6541b725ae77Skettenis }
6542b725ae77Skettenis
6543b725ae77Skettenis /* A static approximation of TYPE with all type wrappers removed. */
6544*11efff7fSkettenis
6545b725ae77Skettenis static struct type *
static_unwrap_type(struct type * type)6546b725ae77Skettenis static_unwrap_type (struct type *type)
6547b725ae77Skettenis {
6548b725ae77Skettenis if (ada_is_aligner_type (type))
6549b725ae77Skettenis {
6550*11efff7fSkettenis struct type *type1 = TYPE_FIELD_TYPE (ada_check_typedef (type), 0);
6551b725ae77Skettenis if (ada_type_name (type1) == NULL)
6552b725ae77Skettenis TYPE_NAME (type1) = ada_type_name (type);
6553b725ae77Skettenis
6554b725ae77Skettenis return static_unwrap_type (type1);
6555b725ae77Skettenis }
6556b725ae77Skettenis else
6557b725ae77Skettenis {
6558b725ae77Skettenis struct type *raw_real_type = ada_get_base_type (type);
6559b725ae77Skettenis if (raw_real_type == type)
6560b725ae77Skettenis return type;
6561b725ae77Skettenis else
6562b725ae77Skettenis return to_static_fixed_type (raw_real_type);
6563b725ae77Skettenis }
6564b725ae77Skettenis }
6565b725ae77Skettenis
6566b725ae77Skettenis /* In some cases, incomplete and private types require
6567b725ae77Skettenis cross-references that are not resolved as records (for example,
6568b725ae77Skettenis type Foo;
6569b725ae77Skettenis type FooP is access Foo;
6570b725ae77Skettenis V: FooP;
6571b725ae77Skettenis type Foo is array ...;
6572b725ae77Skettenis ). In these cases, since there is no mechanism for producing
6573b725ae77Skettenis cross-references to such types, we instead substitute for FooP a
6574b725ae77Skettenis stub enumeration type that is nowhere resolved, and whose tag is
6575b725ae77Skettenis the name of the actual type. Call these types "non-record stubs". */
6576b725ae77Skettenis
6577b725ae77Skettenis /* A type equivalent to TYPE that is not a non-record stub, if one
6578b725ae77Skettenis exists, otherwise TYPE. */
6579*11efff7fSkettenis
6580b725ae77Skettenis struct type *
ada_check_typedef(struct type * type)6581*11efff7fSkettenis ada_check_typedef (struct type *type)
6582b725ae77Skettenis {
6583b725ae77Skettenis CHECK_TYPEDEF (type);
6584b725ae77Skettenis if (type == NULL || TYPE_CODE (type) != TYPE_CODE_ENUM
6585b725ae77Skettenis || (TYPE_FLAGS (type) & TYPE_FLAG_STUB) == 0
6586b725ae77Skettenis || TYPE_TAG_NAME (type) == NULL)
6587b725ae77Skettenis return type;
6588b725ae77Skettenis else
6589b725ae77Skettenis {
6590b725ae77Skettenis char *name = TYPE_TAG_NAME (type);
6591b725ae77Skettenis struct type *type1 = ada_find_any_type (name);
6592b725ae77Skettenis return (type1 == NULL) ? type : type1;
6593b725ae77Skettenis }
6594b725ae77Skettenis }
6595b725ae77Skettenis
6596b725ae77Skettenis /* A value representing the data at VALADDR/ADDRESS as described by
6597b725ae77Skettenis type TYPE0, but with a standard (static-sized) type that correctly
6598b725ae77Skettenis describes it. If VAL0 is not NULL and TYPE0 already is a standard
6599b725ae77Skettenis type, then return VAL0 [this feature is simply to avoid redundant
6600b725ae77Skettenis creation of struct values]. */
6601b725ae77Skettenis
6602*11efff7fSkettenis static struct value *
ada_to_fixed_value_create(struct type * type0,CORE_ADDR address,struct value * val0)6603*11efff7fSkettenis ada_to_fixed_value_create (struct type *type0, CORE_ADDR address,
6604b725ae77Skettenis struct value *val0)
6605b725ae77Skettenis {
6606*11efff7fSkettenis struct type *type = ada_to_fixed_type (type0, 0, address, NULL);
6607b725ae77Skettenis if (type == type0 && val0 != NULL)
6608b725ae77Skettenis return val0;
6609b725ae77Skettenis else
6610*11efff7fSkettenis return value_from_contents_and_address (type, 0, address);
6611*11efff7fSkettenis }
6612*11efff7fSkettenis
6613*11efff7fSkettenis /* A value representing VAL, but with a standard (static-sized) type
6614*11efff7fSkettenis that correctly describes it. Does not necessarily create a new
6615*11efff7fSkettenis value. */
6616*11efff7fSkettenis
6617*11efff7fSkettenis static struct value *
ada_to_fixed_value(struct value * val)6618*11efff7fSkettenis ada_to_fixed_value (struct value *val)
6619*11efff7fSkettenis {
6620*11efff7fSkettenis return ada_to_fixed_value_create (VALUE_TYPE (val),
6621*11efff7fSkettenis VALUE_ADDRESS (val) + VALUE_OFFSET (val),
6622*11efff7fSkettenis val);
6623b725ae77Skettenis }
6624b725ae77Skettenis
6625b725ae77Skettenis /* A value representing VAL, but with a standard (static-sized) type
6626b725ae77Skettenis chosen to approximate the real type of VAL as well as possible, but
6627b725ae77Skettenis without consulting any runtime values. For Ada dynamic-sized
6628b725ae77Skettenis types, therefore, the type of the result is likely to be inaccurate. */
6629b725ae77Skettenis
6630b725ae77Skettenis struct value *
ada_to_static_fixed_value(struct value * val)6631b725ae77Skettenis ada_to_static_fixed_value (struct value *val)
6632b725ae77Skettenis {
6633b725ae77Skettenis struct type *type =
6634b725ae77Skettenis to_static_fixed_type (static_unwrap_type (VALUE_TYPE (val)));
6635b725ae77Skettenis if (type == VALUE_TYPE (val))
6636b725ae77Skettenis return val;
6637b725ae77Skettenis else
6638*11efff7fSkettenis return coerce_unspec_val_to_type (val, type);
6639b725ae77Skettenis }
6640b725ae77Skettenis
6641b725ae77Skettenis
6642b725ae77Skettenis /* Attributes */
6643b725ae77Skettenis
6644*11efff7fSkettenis /* Table mapping attribute numbers to names.
6645*11efff7fSkettenis NOTE: Keep up to date with enum ada_attribute definition in ada-lang.h. */
6646b725ae77Skettenis
6647b725ae77Skettenis static const char *attribute_names[] = {
6648b725ae77Skettenis "<?>",
6649b725ae77Skettenis
6650b725ae77Skettenis "first",
6651b725ae77Skettenis "last",
6652b725ae77Skettenis "length",
6653b725ae77Skettenis "image",
6654b725ae77Skettenis "max",
6655b725ae77Skettenis "min",
6656*11efff7fSkettenis "modulus",
6657*11efff7fSkettenis "pos",
6658*11efff7fSkettenis "size",
6659*11efff7fSkettenis "tag",
6660b725ae77Skettenis "val",
6661b725ae77Skettenis 0
6662b725ae77Skettenis };
6663b725ae77Skettenis
6664b725ae77Skettenis const char *
ada_attribute_name(enum exp_opcode n)6665*11efff7fSkettenis ada_attribute_name (enum exp_opcode n)
6666b725ae77Skettenis {
6667*11efff7fSkettenis if (n >= OP_ATR_FIRST && n <= (int) OP_ATR_VAL)
6668*11efff7fSkettenis return attribute_names[n - OP_ATR_FIRST + 1];
6669b725ae77Skettenis else
6670b725ae77Skettenis return attribute_names[0];
6671b725ae77Skettenis }
6672b725ae77Skettenis
6673b725ae77Skettenis /* Evaluate the 'POS attribute applied to ARG. */
6674b725ae77Skettenis
6675*11efff7fSkettenis static LONGEST
pos_atr(struct value * arg)6676*11efff7fSkettenis pos_atr (struct value *arg)
6677b725ae77Skettenis {
6678b725ae77Skettenis struct type *type = VALUE_TYPE (arg);
6679b725ae77Skettenis
6680b725ae77Skettenis if (!discrete_type_p (type))
6681b725ae77Skettenis error ("'POS only defined on discrete types");
6682b725ae77Skettenis
6683b725ae77Skettenis if (TYPE_CODE (type) == TYPE_CODE_ENUM)
6684b725ae77Skettenis {
6685b725ae77Skettenis int i;
6686b725ae77Skettenis LONGEST v = value_as_long (arg);
6687b725ae77Skettenis
6688b725ae77Skettenis for (i = 0; i < TYPE_NFIELDS (type); i += 1)
6689b725ae77Skettenis {
6690b725ae77Skettenis if (v == TYPE_FIELD_BITPOS (type, i))
6691*11efff7fSkettenis return i;
6692b725ae77Skettenis }
6693b725ae77Skettenis error ("enumeration value is invalid: can't find 'POS");
6694b725ae77Skettenis }
6695b725ae77Skettenis else
6696*11efff7fSkettenis return value_as_long (arg);
6697*11efff7fSkettenis }
6698*11efff7fSkettenis
6699*11efff7fSkettenis static struct value *
value_pos_atr(struct value * arg)6700*11efff7fSkettenis value_pos_atr (struct value *arg)
6701*11efff7fSkettenis {
6702*11efff7fSkettenis return value_from_longest (builtin_type_int, pos_atr (arg));
6703b725ae77Skettenis }
6704b725ae77Skettenis
6705b725ae77Skettenis /* Evaluate the TYPE'VAL attribute applied to ARG. */
6706b725ae77Skettenis
6707b725ae77Skettenis static struct value *
value_val_atr(struct type * type,struct value * arg)6708b725ae77Skettenis value_val_atr (struct type *type, struct value *arg)
6709b725ae77Skettenis {
6710b725ae77Skettenis if (!discrete_type_p (type))
6711b725ae77Skettenis error ("'VAL only defined on discrete types");
6712b725ae77Skettenis if (!integer_type_p (VALUE_TYPE (arg)))
6713b725ae77Skettenis error ("'VAL requires integral argument");
6714b725ae77Skettenis
6715b725ae77Skettenis if (TYPE_CODE (type) == TYPE_CODE_ENUM)
6716b725ae77Skettenis {
6717b725ae77Skettenis long pos = value_as_long (arg);
6718b725ae77Skettenis if (pos < 0 || pos >= TYPE_NFIELDS (type))
6719b725ae77Skettenis error ("argument to 'VAL out of range");
6720b725ae77Skettenis return value_from_longest (type, TYPE_FIELD_BITPOS (type, pos));
6721b725ae77Skettenis }
6722b725ae77Skettenis else
6723b725ae77Skettenis return value_from_longest (type, value_as_long (arg));
6724b725ae77Skettenis }
6725b725ae77Skettenis
6726b725ae77Skettenis
6727b725ae77Skettenis /* Evaluation */
6728b725ae77Skettenis
6729b725ae77Skettenis /* True if TYPE appears to be an Ada character type.
6730*11efff7fSkettenis [At the moment, this is true only for Character and Wide_Character;
6731*11efff7fSkettenis It is a heuristic test that could stand improvement]. */
6732b725ae77Skettenis
6733b725ae77Skettenis int
ada_is_character_type(struct type * type)6734b725ae77Skettenis ada_is_character_type (struct type *type)
6735b725ae77Skettenis {
6736b725ae77Skettenis const char *name = ada_type_name (type);
6737b725ae77Skettenis return
6738b725ae77Skettenis name != NULL
6739b725ae77Skettenis && (TYPE_CODE (type) == TYPE_CODE_CHAR
6740b725ae77Skettenis || TYPE_CODE (type) == TYPE_CODE_INT
6741b725ae77Skettenis || TYPE_CODE (type) == TYPE_CODE_RANGE)
6742*11efff7fSkettenis && (strcmp (name, "character") == 0
6743*11efff7fSkettenis || strcmp (name, "wide_character") == 0
6744*11efff7fSkettenis || strcmp (name, "unsigned char") == 0);
6745b725ae77Skettenis }
6746b725ae77Skettenis
6747b725ae77Skettenis /* True if TYPE appears to be an Ada string type. */
6748b725ae77Skettenis
6749b725ae77Skettenis int
ada_is_string_type(struct type * type)6750b725ae77Skettenis ada_is_string_type (struct type *type)
6751b725ae77Skettenis {
6752*11efff7fSkettenis type = ada_check_typedef (type);
6753b725ae77Skettenis if (type != NULL
6754b725ae77Skettenis && TYPE_CODE (type) != TYPE_CODE_PTR
6755*11efff7fSkettenis && (ada_is_simple_array_type (type)
6756*11efff7fSkettenis || ada_is_array_descriptor_type (type))
6757b725ae77Skettenis && ada_array_arity (type) == 1)
6758b725ae77Skettenis {
6759b725ae77Skettenis struct type *elttype = ada_array_element_type (type, 1);
6760b725ae77Skettenis
6761b725ae77Skettenis return ada_is_character_type (elttype);
6762b725ae77Skettenis }
6763b725ae77Skettenis else
6764b725ae77Skettenis return 0;
6765b725ae77Skettenis }
6766b725ae77Skettenis
6767b725ae77Skettenis
6768b725ae77Skettenis /* True if TYPE is a struct type introduced by the compiler to force the
6769b725ae77Skettenis alignment of a value. Such types have a single field with a
6770b725ae77Skettenis distinctive name. */
6771b725ae77Skettenis
6772b725ae77Skettenis int
ada_is_aligner_type(struct type * type)6773b725ae77Skettenis ada_is_aligner_type (struct type *type)
6774b725ae77Skettenis {
6775*11efff7fSkettenis type = ada_check_typedef (type);
6776*11efff7fSkettenis
6777*11efff7fSkettenis /* If we can find a parallel XVS type, then the XVS type should
6778*11efff7fSkettenis be used instead of this type. And hence, this is not an aligner
6779*11efff7fSkettenis type. */
6780*11efff7fSkettenis if (ada_find_parallel_type (type, "___XVS") != NULL)
6781*11efff7fSkettenis return 0;
6782*11efff7fSkettenis
6783b725ae77Skettenis return (TYPE_CODE (type) == TYPE_CODE_STRUCT
6784b725ae77Skettenis && TYPE_NFIELDS (type) == 1
6785*11efff7fSkettenis && strcmp (TYPE_FIELD_NAME (type, 0), "F") == 0);
6786b725ae77Skettenis }
6787b725ae77Skettenis
6788b725ae77Skettenis /* If there is an ___XVS-convention type parallel to SUBTYPE, return
6789b725ae77Skettenis the parallel type. */
6790b725ae77Skettenis
6791b725ae77Skettenis struct type *
ada_get_base_type(struct type * raw_type)6792b725ae77Skettenis ada_get_base_type (struct type *raw_type)
6793b725ae77Skettenis {
6794b725ae77Skettenis struct type *real_type_namer;
6795b725ae77Skettenis struct type *raw_real_type;
6796b725ae77Skettenis
6797b725ae77Skettenis if (raw_type == NULL || TYPE_CODE (raw_type) != TYPE_CODE_STRUCT)
6798b725ae77Skettenis return raw_type;
6799b725ae77Skettenis
6800b725ae77Skettenis real_type_namer = ada_find_parallel_type (raw_type, "___XVS");
6801b725ae77Skettenis if (real_type_namer == NULL
6802b725ae77Skettenis || TYPE_CODE (real_type_namer) != TYPE_CODE_STRUCT
6803b725ae77Skettenis || TYPE_NFIELDS (real_type_namer) != 1)
6804b725ae77Skettenis return raw_type;
6805b725ae77Skettenis
6806b725ae77Skettenis raw_real_type = ada_find_any_type (TYPE_FIELD_NAME (real_type_namer, 0));
6807b725ae77Skettenis if (raw_real_type == NULL)
6808b725ae77Skettenis return raw_type;
6809b725ae77Skettenis else
6810b725ae77Skettenis return raw_real_type;
6811b725ae77Skettenis }
6812b725ae77Skettenis
6813b725ae77Skettenis /* The type of value designated by TYPE, with all aligners removed. */
6814b725ae77Skettenis
6815b725ae77Skettenis struct type *
ada_aligned_type(struct type * type)6816b725ae77Skettenis ada_aligned_type (struct type *type)
6817b725ae77Skettenis {
6818b725ae77Skettenis if (ada_is_aligner_type (type))
6819b725ae77Skettenis return ada_aligned_type (TYPE_FIELD_TYPE (type, 0));
6820b725ae77Skettenis else
6821b725ae77Skettenis return ada_get_base_type (type);
6822b725ae77Skettenis }
6823b725ae77Skettenis
6824b725ae77Skettenis
6825b725ae77Skettenis /* The address of the aligned value in an object at address VALADDR
6826b725ae77Skettenis having type TYPE. Assumes ada_is_aligner_type (TYPE). */
6827b725ae77Skettenis
6828b725ae77Skettenis char *
ada_aligned_value_addr(struct type * type,char * valaddr)6829b725ae77Skettenis ada_aligned_value_addr (struct type *type, char *valaddr)
6830b725ae77Skettenis {
6831b725ae77Skettenis if (ada_is_aligner_type (type))
6832b725ae77Skettenis return ada_aligned_value_addr (TYPE_FIELD_TYPE (type, 0),
6833b725ae77Skettenis valaddr +
6834b725ae77Skettenis TYPE_FIELD_BITPOS (type,
6835b725ae77Skettenis 0) / TARGET_CHAR_BIT);
6836b725ae77Skettenis else
6837b725ae77Skettenis return valaddr;
6838b725ae77Skettenis }
6839b725ae77Skettenis
6840*11efff7fSkettenis
6841*11efff7fSkettenis
6842b725ae77Skettenis /* The printed representation of an enumeration literal with encoded
6843b725ae77Skettenis name NAME. The value is good to the next call of ada_enum_name. */
6844b725ae77Skettenis const char *
ada_enum_name(const char * name)6845b725ae77Skettenis ada_enum_name (const char *name)
6846b725ae77Skettenis {
6847*11efff7fSkettenis static char *result;
6848*11efff7fSkettenis static size_t result_len = 0;
6849b725ae77Skettenis char *tmp;
6850b725ae77Skettenis
6851*11efff7fSkettenis /* First, unqualify the enumeration name:
6852*11efff7fSkettenis 1. Search for the last '.' character. If we find one, then skip
6853*11efff7fSkettenis all the preceeding characters, the unqualified name starts
6854*11efff7fSkettenis right after that dot.
6855*11efff7fSkettenis 2. Otherwise, we may be debugging on a target where the compiler
6856*11efff7fSkettenis translates dots into "__". Search forward for double underscores,
6857*11efff7fSkettenis but stop searching when we hit an overloading suffix, which is
6858*11efff7fSkettenis of the form "__" followed by digits. */
6859*11efff7fSkettenis
6860*11efff7fSkettenis tmp = strrchr (name, '.');
6861*11efff7fSkettenis if (tmp != NULL)
6862b725ae77Skettenis name = tmp + 1;
6863b725ae77Skettenis else
6864*11efff7fSkettenis {
6865*11efff7fSkettenis while ((tmp = strstr (name, "__")) != NULL)
6866*11efff7fSkettenis {
6867*11efff7fSkettenis if (isdigit (tmp[2]))
6868b725ae77Skettenis break;
6869*11efff7fSkettenis else
6870*11efff7fSkettenis name = tmp + 2;
6871*11efff7fSkettenis }
6872b725ae77Skettenis }
6873b725ae77Skettenis
6874b725ae77Skettenis if (name[0] == 'Q')
6875b725ae77Skettenis {
6876b725ae77Skettenis int v;
6877b725ae77Skettenis if (name[1] == 'U' || name[1] == 'W')
6878b725ae77Skettenis {
6879b725ae77Skettenis if (sscanf (name + 2, "%x", &v) != 1)
6880b725ae77Skettenis return name;
6881b725ae77Skettenis }
6882b725ae77Skettenis else
6883b725ae77Skettenis return name;
6884b725ae77Skettenis
6885*11efff7fSkettenis GROW_VECT (result, result_len, 16);
6886b725ae77Skettenis if (isascii (v) && isprint (v))
6887b725ae77Skettenis sprintf (result, "'%c'", v);
6888b725ae77Skettenis else if (name[1] == 'U')
6889b725ae77Skettenis sprintf (result, "[\"%02x\"]", v);
6890b725ae77Skettenis else
6891b725ae77Skettenis sprintf (result, "[\"%04x\"]", v);
6892b725ae77Skettenis
6893b725ae77Skettenis return result;
6894b725ae77Skettenis }
6895b725ae77Skettenis else
6896*11efff7fSkettenis {
6897*11efff7fSkettenis tmp = strstr (name, "__");
6898*11efff7fSkettenis if (tmp == NULL)
6899*11efff7fSkettenis tmp = strstr (name, "$");
6900*11efff7fSkettenis if (tmp != NULL)
6901*11efff7fSkettenis {
6902*11efff7fSkettenis GROW_VECT (result, result_len, tmp - name + 1);
6903*11efff7fSkettenis strncpy (result, name, tmp - name);
6904*11efff7fSkettenis result[tmp - name] = '\0';
6905*11efff7fSkettenis return result;
6906*11efff7fSkettenis }
6907*11efff7fSkettenis
6908b725ae77Skettenis return name;
6909b725ae77Skettenis }
6910*11efff7fSkettenis }
6911b725ae77Skettenis
6912b725ae77Skettenis static struct value *
evaluate_subexp(struct type * expect_type,struct expression * exp,int * pos,enum noside noside)6913b725ae77Skettenis evaluate_subexp (struct type *expect_type, struct expression *exp, int *pos,
6914b725ae77Skettenis enum noside noside)
6915b725ae77Skettenis {
6916*11efff7fSkettenis return (*exp->language_defn->la_exp_desc->evaluate_exp)
6917*11efff7fSkettenis (expect_type, exp, pos, noside);
6918b725ae77Skettenis }
6919b725ae77Skettenis
6920b725ae77Skettenis /* Evaluate the subexpression of EXP starting at *POS as for
6921b725ae77Skettenis evaluate_type, updating *POS to point just past the evaluated
6922b725ae77Skettenis expression. */
6923b725ae77Skettenis
6924b725ae77Skettenis static struct value *
evaluate_subexp_type(struct expression * exp,int * pos)6925b725ae77Skettenis evaluate_subexp_type (struct expression *exp, int *pos)
6926b725ae77Skettenis {
6927*11efff7fSkettenis return (*exp->language_defn->la_exp_desc->evaluate_exp)
6928b725ae77Skettenis (NULL_TYPE, exp, pos, EVAL_AVOID_SIDE_EFFECTS);
6929b725ae77Skettenis }
6930b725ae77Skettenis
6931b725ae77Skettenis /* If VAL is wrapped in an aligner or subtype wrapper, return the
6932b725ae77Skettenis value it wraps. */
6933b725ae77Skettenis
6934b725ae77Skettenis static struct value *
unwrap_value(struct value * val)6935b725ae77Skettenis unwrap_value (struct value *val)
6936b725ae77Skettenis {
6937*11efff7fSkettenis struct type *type = ada_check_typedef (VALUE_TYPE (val));
6938b725ae77Skettenis if (ada_is_aligner_type (type))
6939b725ae77Skettenis {
6940b725ae77Skettenis struct value *v = value_struct_elt (&val, NULL, "F",
6941b725ae77Skettenis NULL, "internal structure");
6942*11efff7fSkettenis struct type *val_type = ada_check_typedef (VALUE_TYPE (v));
6943b725ae77Skettenis if (ada_type_name (val_type) == NULL)
6944b725ae77Skettenis TYPE_NAME (val_type) = ada_type_name (type);
6945b725ae77Skettenis
6946b725ae77Skettenis return unwrap_value (v);
6947b725ae77Skettenis }
6948b725ae77Skettenis else
6949b725ae77Skettenis {
6950b725ae77Skettenis struct type *raw_real_type =
6951*11efff7fSkettenis ada_check_typedef (ada_get_base_type (type));
6952b725ae77Skettenis
6953b725ae77Skettenis if (type == raw_real_type)
6954b725ae77Skettenis return val;
6955b725ae77Skettenis
6956b725ae77Skettenis return
6957b725ae77Skettenis coerce_unspec_val_to_type
6958*11efff7fSkettenis (val, ada_to_fixed_type (raw_real_type, 0,
6959b725ae77Skettenis VALUE_ADDRESS (val) + VALUE_OFFSET (val),
6960b725ae77Skettenis NULL));
6961b725ae77Skettenis }
6962b725ae77Skettenis }
6963b725ae77Skettenis
6964b725ae77Skettenis static struct value *
cast_to_fixed(struct type * type,struct value * arg)6965b725ae77Skettenis cast_to_fixed (struct type *type, struct value *arg)
6966b725ae77Skettenis {
6967b725ae77Skettenis LONGEST val;
6968b725ae77Skettenis
6969b725ae77Skettenis if (type == VALUE_TYPE (arg))
6970b725ae77Skettenis return arg;
6971b725ae77Skettenis else if (ada_is_fixed_point_type (VALUE_TYPE (arg)))
6972b725ae77Skettenis val = ada_float_to_fixed (type,
6973b725ae77Skettenis ada_fixed_to_float (VALUE_TYPE (arg),
6974b725ae77Skettenis value_as_long (arg)));
6975b725ae77Skettenis else
6976b725ae77Skettenis {
6977b725ae77Skettenis DOUBLEST argd =
6978b725ae77Skettenis value_as_double (value_cast (builtin_type_double, value_copy (arg)));
6979b725ae77Skettenis val = ada_float_to_fixed (type, argd);
6980b725ae77Skettenis }
6981b725ae77Skettenis
6982b725ae77Skettenis return value_from_longest (type, val);
6983b725ae77Skettenis }
6984b725ae77Skettenis
6985b725ae77Skettenis static struct value *
cast_from_fixed_to_double(struct value * arg)6986b725ae77Skettenis cast_from_fixed_to_double (struct value *arg)
6987b725ae77Skettenis {
6988b725ae77Skettenis DOUBLEST val = ada_fixed_to_float (VALUE_TYPE (arg),
6989b725ae77Skettenis value_as_long (arg));
6990b725ae77Skettenis return value_from_double (builtin_type_double, val);
6991b725ae77Skettenis }
6992b725ae77Skettenis
6993b725ae77Skettenis /* Coerce VAL as necessary for assignment to an lval of type TYPE, and
6994*11efff7fSkettenis return the converted value. */
6995*11efff7fSkettenis
6996b725ae77Skettenis static struct value *
coerce_for_assign(struct type * type,struct value * val)6997b725ae77Skettenis coerce_for_assign (struct type *type, struct value *val)
6998b725ae77Skettenis {
6999b725ae77Skettenis struct type *type2 = VALUE_TYPE (val);
7000b725ae77Skettenis if (type == type2)
7001b725ae77Skettenis return val;
7002b725ae77Skettenis
7003*11efff7fSkettenis type2 = ada_check_typedef (type2);
7004*11efff7fSkettenis type = ada_check_typedef (type);
7005b725ae77Skettenis
7006b725ae77Skettenis if (TYPE_CODE (type2) == TYPE_CODE_PTR
7007b725ae77Skettenis && TYPE_CODE (type) == TYPE_CODE_ARRAY)
7008b725ae77Skettenis {
7009b725ae77Skettenis val = ada_value_ind (val);
7010b725ae77Skettenis type2 = VALUE_TYPE (val);
7011b725ae77Skettenis }
7012b725ae77Skettenis
7013b725ae77Skettenis if (TYPE_CODE (type2) == TYPE_CODE_ARRAY
7014b725ae77Skettenis && TYPE_CODE (type) == TYPE_CODE_ARRAY)
7015b725ae77Skettenis {
7016b725ae77Skettenis if (TYPE_LENGTH (type2) != TYPE_LENGTH (type)
7017b725ae77Skettenis || TYPE_LENGTH (TYPE_TARGET_TYPE (type2))
7018b725ae77Skettenis != TYPE_LENGTH (TYPE_TARGET_TYPE (type2)))
7019b725ae77Skettenis error ("Incompatible types in assignment");
7020b725ae77Skettenis VALUE_TYPE (val) = type;
7021b725ae77Skettenis }
7022b725ae77Skettenis return val;
7023b725ae77Skettenis }
7024b725ae77Skettenis
7025*11efff7fSkettenis static struct value *
ada_value_binop(struct value * arg1,struct value * arg2,enum exp_opcode op)7026*11efff7fSkettenis ada_value_binop (struct value *arg1, struct value *arg2, enum exp_opcode op)
7027*11efff7fSkettenis {
7028*11efff7fSkettenis struct value *val;
7029*11efff7fSkettenis struct type *type1, *type2;
7030*11efff7fSkettenis LONGEST v, v1, v2;
7031*11efff7fSkettenis
7032*11efff7fSkettenis COERCE_REF (arg1);
7033*11efff7fSkettenis COERCE_REF (arg2);
7034*11efff7fSkettenis type1 = base_type (ada_check_typedef (VALUE_TYPE (arg1)));
7035*11efff7fSkettenis type2 = base_type (ada_check_typedef (VALUE_TYPE (arg2)));
7036*11efff7fSkettenis
7037*11efff7fSkettenis if (TYPE_CODE (type1) != TYPE_CODE_INT
7038*11efff7fSkettenis || TYPE_CODE (type2) != TYPE_CODE_INT)
7039*11efff7fSkettenis return value_binop (arg1, arg2, op);
7040*11efff7fSkettenis
7041*11efff7fSkettenis switch (op)
7042*11efff7fSkettenis {
7043*11efff7fSkettenis case BINOP_MOD:
7044*11efff7fSkettenis case BINOP_DIV:
7045*11efff7fSkettenis case BINOP_REM:
7046*11efff7fSkettenis break;
7047*11efff7fSkettenis default:
7048*11efff7fSkettenis return value_binop (arg1, arg2, op);
7049*11efff7fSkettenis }
7050*11efff7fSkettenis
7051*11efff7fSkettenis v2 = value_as_long (arg2);
7052*11efff7fSkettenis if (v2 == 0)
7053*11efff7fSkettenis error ("second operand of %s must not be zero.", op_string (op));
7054*11efff7fSkettenis
7055*11efff7fSkettenis if (TYPE_UNSIGNED (type1) || op == BINOP_MOD)
7056*11efff7fSkettenis return value_binop (arg1, arg2, op);
7057*11efff7fSkettenis
7058*11efff7fSkettenis v1 = value_as_long (arg1);
7059*11efff7fSkettenis switch (op)
7060*11efff7fSkettenis {
7061*11efff7fSkettenis case BINOP_DIV:
7062*11efff7fSkettenis v = v1 / v2;
7063*11efff7fSkettenis if (!TRUNCATION_TOWARDS_ZERO && v1 * (v1 % v2) < 0)
7064*11efff7fSkettenis v += v > 0 ? -1 : 1;
7065*11efff7fSkettenis break;
7066*11efff7fSkettenis case BINOP_REM:
7067*11efff7fSkettenis v = v1 % v2;
7068*11efff7fSkettenis if (v * v1 < 0)
7069*11efff7fSkettenis v -= v2;
7070*11efff7fSkettenis break;
7071*11efff7fSkettenis default:
7072*11efff7fSkettenis /* Should not reach this point. */
7073*11efff7fSkettenis v = 0;
7074*11efff7fSkettenis }
7075*11efff7fSkettenis
7076*11efff7fSkettenis val = allocate_value (type1);
7077*11efff7fSkettenis store_unsigned_integer (VALUE_CONTENTS_RAW (val),
7078*11efff7fSkettenis TYPE_LENGTH (VALUE_TYPE (val)), v);
7079*11efff7fSkettenis return val;
7080*11efff7fSkettenis }
7081*11efff7fSkettenis
7082*11efff7fSkettenis static int
ada_value_equal(struct value * arg1,struct value * arg2)7083*11efff7fSkettenis ada_value_equal (struct value *arg1, struct value *arg2)
7084*11efff7fSkettenis {
7085*11efff7fSkettenis if (ada_is_direct_array_type (VALUE_TYPE (arg1))
7086*11efff7fSkettenis || ada_is_direct_array_type (VALUE_TYPE (arg2)))
7087*11efff7fSkettenis {
7088*11efff7fSkettenis arg1 = ada_coerce_to_simple_array (arg1);
7089*11efff7fSkettenis arg2 = ada_coerce_to_simple_array (arg2);
7090*11efff7fSkettenis if (TYPE_CODE (VALUE_TYPE (arg1)) != TYPE_CODE_ARRAY
7091*11efff7fSkettenis || TYPE_CODE (VALUE_TYPE (arg2)) != TYPE_CODE_ARRAY)
7092*11efff7fSkettenis error ("Attempt to compare array with non-array");
7093*11efff7fSkettenis /* FIXME: The following works only for types whose
7094*11efff7fSkettenis representations use all bits (no padding or undefined bits)
7095*11efff7fSkettenis and do not have user-defined equality. */
7096*11efff7fSkettenis return
7097*11efff7fSkettenis TYPE_LENGTH (VALUE_TYPE (arg1)) == TYPE_LENGTH (VALUE_TYPE (arg2))
7098*11efff7fSkettenis && memcmp (VALUE_CONTENTS (arg1), VALUE_CONTENTS (arg2),
7099*11efff7fSkettenis TYPE_LENGTH (VALUE_TYPE (arg1))) == 0;
7100*11efff7fSkettenis }
7101*11efff7fSkettenis return value_equal (arg1, arg2);
7102*11efff7fSkettenis }
7103*11efff7fSkettenis
7104b725ae77Skettenis struct value *
ada_evaluate_subexp(struct type * expect_type,struct expression * exp,int * pos,enum noside noside)7105b725ae77Skettenis ada_evaluate_subexp (struct type *expect_type, struct expression *exp,
7106b725ae77Skettenis int *pos, enum noside noside)
7107b725ae77Skettenis {
7108b725ae77Skettenis enum exp_opcode op;
7109b725ae77Skettenis int tem, tem2, tem3;
7110b725ae77Skettenis int pc;
7111b725ae77Skettenis struct value *arg1 = NULL, *arg2 = NULL, *arg3;
7112b725ae77Skettenis struct type *type;
7113b725ae77Skettenis int nargs;
7114b725ae77Skettenis struct value **argvec;
7115b725ae77Skettenis
7116b725ae77Skettenis pc = *pos;
7117b725ae77Skettenis *pos += 1;
7118b725ae77Skettenis op = exp->elts[pc].opcode;
7119b725ae77Skettenis
7120b725ae77Skettenis switch (op)
7121b725ae77Skettenis {
7122b725ae77Skettenis default:
7123b725ae77Skettenis *pos -= 1;
7124b725ae77Skettenis return
7125b725ae77Skettenis unwrap_value (evaluate_subexp_standard
7126b725ae77Skettenis (expect_type, exp, pos, noside));
7127b725ae77Skettenis
7128*11efff7fSkettenis case OP_STRING:
7129*11efff7fSkettenis {
7130*11efff7fSkettenis struct value *result;
7131*11efff7fSkettenis *pos -= 1;
7132*11efff7fSkettenis result = evaluate_subexp_standard (expect_type, exp, pos, noside);
7133*11efff7fSkettenis /* The result type will have code OP_STRING, bashed there from
7134*11efff7fSkettenis OP_ARRAY. Bash it back. */
7135*11efff7fSkettenis if (TYPE_CODE (VALUE_TYPE (result)) == TYPE_CODE_STRING)
7136*11efff7fSkettenis TYPE_CODE (VALUE_TYPE (result)) = TYPE_CODE_ARRAY;
7137*11efff7fSkettenis return result;
7138*11efff7fSkettenis }
7139*11efff7fSkettenis
7140b725ae77Skettenis case UNOP_CAST:
7141b725ae77Skettenis (*pos) += 2;
7142b725ae77Skettenis type = exp->elts[pc + 1].type;
7143b725ae77Skettenis arg1 = evaluate_subexp (type, exp, pos, noside);
7144b725ae77Skettenis if (noside == EVAL_SKIP)
7145b725ae77Skettenis goto nosideret;
7146*11efff7fSkettenis if (type != ada_check_typedef (VALUE_TYPE (arg1)))
7147b725ae77Skettenis {
7148b725ae77Skettenis if (ada_is_fixed_point_type (type))
7149b725ae77Skettenis arg1 = cast_to_fixed (type, arg1);
7150b725ae77Skettenis else if (ada_is_fixed_point_type (VALUE_TYPE (arg1)))
7151b725ae77Skettenis arg1 = value_cast (type, cast_from_fixed_to_double (arg1));
7152b725ae77Skettenis else if (VALUE_LVAL (arg1) == lval_memory)
7153b725ae77Skettenis {
7154b725ae77Skettenis /* This is in case of the really obscure (and undocumented,
7155b725ae77Skettenis but apparently expected) case of (Foo) Bar.all, where Bar
7156b725ae77Skettenis is an integer constant and Foo is a dynamic-sized type.
7157b725ae77Skettenis If we don't do this, ARG1 will simply be relabeled with
7158b725ae77Skettenis TYPE. */
7159b725ae77Skettenis if (noside == EVAL_AVOID_SIDE_EFFECTS)
7160b725ae77Skettenis return value_zero (to_static_fixed_type (type), not_lval);
7161b725ae77Skettenis arg1 =
7162*11efff7fSkettenis ada_to_fixed_value_create
7163*11efff7fSkettenis (type, VALUE_ADDRESS (arg1) + VALUE_OFFSET (arg1), 0);
7164b725ae77Skettenis }
7165b725ae77Skettenis else
7166b725ae77Skettenis arg1 = value_cast (type, arg1);
7167b725ae77Skettenis }
7168b725ae77Skettenis return arg1;
7169b725ae77Skettenis
7170*11efff7fSkettenis case UNOP_QUAL:
7171b725ae77Skettenis (*pos) += 2;
7172b725ae77Skettenis type = exp->elts[pc + 1].type;
7173b725ae77Skettenis return ada_evaluate_subexp (type, exp, pos, noside);
7174*11efff7fSkettenis
7175b725ae77Skettenis case BINOP_ASSIGN:
7176b725ae77Skettenis arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7177b725ae77Skettenis arg2 = evaluate_subexp (VALUE_TYPE (arg1), exp, pos, noside);
7178b725ae77Skettenis if (noside == EVAL_SKIP || noside == EVAL_AVOID_SIDE_EFFECTS)
7179b725ae77Skettenis return arg1;
7180b725ae77Skettenis if (ada_is_fixed_point_type (VALUE_TYPE (arg1)))
7181b725ae77Skettenis arg2 = cast_to_fixed (VALUE_TYPE (arg1), arg2);
7182b725ae77Skettenis else if (ada_is_fixed_point_type (VALUE_TYPE (arg2)))
7183b725ae77Skettenis error
7184b725ae77Skettenis ("Fixed-point values must be assigned to fixed-point variables");
7185b725ae77Skettenis else
7186b725ae77Skettenis arg2 = coerce_for_assign (VALUE_TYPE (arg1), arg2);
7187b725ae77Skettenis return ada_value_assign (arg1, arg2);
7188b725ae77Skettenis
7189b725ae77Skettenis case BINOP_ADD:
7190b725ae77Skettenis arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
7191b725ae77Skettenis arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
7192b725ae77Skettenis if (noside == EVAL_SKIP)
7193b725ae77Skettenis goto nosideret;
7194b725ae77Skettenis if ((ada_is_fixed_point_type (VALUE_TYPE (arg1))
7195b725ae77Skettenis || ada_is_fixed_point_type (VALUE_TYPE (arg2)))
7196b725ae77Skettenis && VALUE_TYPE (arg1) != VALUE_TYPE (arg2))
7197*11efff7fSkettenis error ("Operands of fixed-point addition must have the same type");
7198b725ae77Skettenis return value_cast (VALUE_TYPE (arg1), value_add (arg1, arg2));
7199b725ae77Skettenis
7200b725ae77Skettenis case BINOP_SUB:
7201b725ae77Skettenis arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
7202b725ae77Skettenis arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
7203b725ae77Skettenis if (noside == EVAL_SKIP)
7204b725ae77Skettenis goto nosideret;
7205b725ae77Skettenis if ((ada_is_fixed_point_type (VALUE_TYPE (arg1))
7206b725ae77Skettenis || ada_is_fixed_point_type (VALUE_TYPE (arg2)))
7207b725ae77Skettenis && VALUE_TYPE (arg1) != VALUE_TYPE (arg2))
7208*11efff7fSkettenis error ("Operands of fixed-point subtraction must have the same type");
7209b725ae77Skettenis return value_cast (VALUE_TYPE (arg1), value_sub (arg1, arg2));
7210b725ae77Skettenis
7211b725ae77Skettenis case BINOP_MUL:
7212b725ae77Skettenis case BINOP_DIV:
7213b725ae77Skettenis arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7214b725ae77Skettenis arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7215b725ae77Skettenis if (noside == EVAL_SKIP)
7216b725ae77Skettenis goto nosideret;
7217*11efff7fSkettenis else if (noside == EVAL_AVOID_SIDE_EFFECTS
7218b725ae77Skettenis && (op == BINOP_DIV || op == BINOP_REM || op == BINOP_MOD))
7219b725ae77Skettenis return value_zero (VALUE_TYPE (arg1), not_lval);
7220b725ae77Skettenis else
7221b725ae77Skettenis {
7222b725ae77Skettenis if (ada_is_fixed_point_type (VALUE_TYPE (arg1)))
7223b725ae77Skettenis arg1 = cast_from_fixed_to_double (arg1);
7224b725ae77Skettenis if (ada_is_fixed_point_type (VALUE_TYPE (arg2)))
7225b725ae77Skettenis arg2 = cast_from_fixed_to_double (arg2);
7226*11efff7fSkettenis return ada_value_binop (arg1, arg2, op);
7227b725ae77Skettenis }
7228b725ae77Skettenis
7229*11efff7fSkettenis case BINOP_REM:
7230*11efff7fSkettenis case BINOP_MOD:
7231*11efff7fSkettenis arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7232*11efff7fSkettenis arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7233*11efff7fSkettenis if (noside == EVAL_SKIP)
7234*11efff7fSkettenis goto nosideret;
7235*11efff7fSkettenis else if (noside == EVAL_AVOID_SIDE_EFFECTS
7236*11efff7fSkettenis && (op == BINOP_DIV || op == BINOP_REM || op == BINOP_MOD))
7237*11efff7fSkettenis return value_zero (VALUE_TYPE (arg1), not_lval);
7238*11efff7fSkettenis else
7239*11efff7fSkettenis return ada_value_binop (arg1, arg2, op);
7240*11efff7fSkettenis
7241*11efff7fSkettenis case BINOP_EQUAL:
7242*11efff7fSkettenis case BINOP_NOTEQUAL:
7243*11efff7fSkettenis arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7244*11efff7fSkettenis arg2 = evaluate_subexp (VALUE_TYPE (arg1), exp, pos, noside);
7245*11efff7fSkettenis if (noside == EVAL_SKIP)
7246*11efff7fSkettenis goto nosideret;
7247*11efff7fSkettenis if (noside == EVAL_AVOID_SIDE_EFFECTS)
7248*11efff7fSkettenis tem = 0;
7249*11efff7fSkettenis else
7250*11efff7fSkettenis tem = ada_value_equal (arg1, arg2);
7251*11efff7fSkettenis if (op == BINOP_NOTEQUAL)
7252*11efff7fSkettenis tem = !tem;
7253*11efff7fSkettenis return value_from_longest (LA_BOOL_TYPE, (LONGEST) tem);
7254*11efff7fSkettenis
7255b725ae77Skettenis case UNOP_NEG:
7256b725ae77Skettenis arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7257b725ae77Skettenis if (noside == EVAL_SKIP)
7258b725ae77Skettenis goto nosideret;
7259b725ae77Skettenis else if (ada_is_fixed_point_type (VALUE_TYPE (arg1)))
7260b725ae77Skettenis return value_cast (VALUE_TYPE (arg1), value_neg (arg1));
7261b725ae77Skettenis else
7262b725ae77Skettenis return value_neg (arg1);
7263b725ae77Skettenis
7264b725ae77Skettenis case OP_VAR_VALUE:
7265b725ae77Skettenis *pos -= 1;
7266b725ae77Skettenis if (noside == EVAL_SKIP)
7267b725ae77Skettenis {
7268b725ae77Skettenis *pos += 4;
7269b725ae77Skettenis goto nosideret;
7270b725ae77Skettenis }
7271*11efff7fSkettenis else if (SYMBOL_DOMAIN (exp->elts[pc + 2].symbol) == UNDEF_DOMAIN)
7272*11efff7fSkettenis /* Only encountered when an unresolved symbol occurs in a
7273*11efff7fSkettenis context other than a function call, in which case, it is
7274*11efff7fSkettenis illegal. */
7275*11efff7fSkettenis error ("Unexpected unresolved symbol, %s, during evaluation",
7276*11efff7fSkettenis SYMBOL_PRINT_NAME (exp->elts[pc + 2].symbol));
7277b725ae77Skettenis else if (noside == EVAL_AVOID_SIDE_EFFECTS)
7278b725ae77Skettenis {
7279b725ae77Skettenis *pos += 4;
7280b725ae77Skettenis return value_zero
7281b725ae77Skettenis (to_static_fixed_type
7282b725ae77Skettenis (static_unwrap_type (SYMBOL_TYPE (exp->elts[pc + 2].symbol))),
7283b725ae77Skettenis not_lval);
7284b725ae77Skettenis }
7285b725ae77Skettenis else
7286b725ae77Skettenis {
7287b725ae77Skettenis arg1 =
7288b725ae77Skettenis unwrap_value (evaluate_subexp_standard
7289b725ae77Skettenis (expect_type, exp, pos, noside));
7290*11efff7fSkettenis return ada_to_fixed_value (arg1);
7291b725ae77Skettenis }
7292b725ae77Skettenis
7293b725ae77Skettenis case OP_FUNCALL:
7294b725ae77Skettenis (*pos) += 2;
7295b725ae77Skettenis
7296b725ae77Skettenis /* Allocate arg vector, including space for the function to be
7297*11efff7fSkettenis called in argvec[0] and a terminating NULL. */
7298b725ae77Skettenis nargs = longest_to_int (exp->elts[pc + 1].longconst);
7299b725ae77Skettenis argvec =
7300b725ae77Skettenis (struct value **) alloca (sizeof (struct value *) * (nargs + 2));
7301b725ae77Skettenis
7302*11efff7fSkettenis if (exp->elts[*pos].opcode == OP_VAR_VALUE
7303*11efff7fSkettenis && SYMBOL_DOMAIN (exp->elts[pc + 5].symbol) == UNDEF_DOMAIN)
7304b725ae77Skettenis error ("Unexpected unresolved symbol, %s, during evaluation",
7305*11efff7fSkettenis SYMBOL_PRINT_NAME (exp->elts[pc + 5].symbol));
7306b725ae77Skettenis else
7307b725ae77Skettenis {
7308b725ae77Skettenis for (tem = 0; tem <= nargs; tem += 1)
7309b725ae77Skettenis argvec[tem] = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7310b725ae77Skettenis argvec[tem] = 0;
7311b725ae77Skettenis
7312b725ae77Skettenis if (noside == EVAL_SKIP)
7313b725ae77Skettenis goto nosideret;
7314b725ae77Skettenis }
7315b725ae77Skettenis
7316*11efff7fSkettenis if (ada_is_packed_array_type (desc_base_type (VALUE_TYPE (argvec[0]))))
7317*11efff7fSkettenis argvec[0] = ada_coerce_to_simple_array (argvec[0]);
7318*11efff7fSkettenis else if (TYPE_CODE (VALUE_TYPE (argvec[0])) == TYPE_CODE_REF
7319*11efff7fSkettenis || (TYPE_CODE (VALUE_TYPE (argvec[0])) == TYPE_CODE_ARRAY
7320*11efff7fSkettenis && VALUE_LVAL (argvec[0]) == lval_memory))
7321b725ae77Skettenis argvec[0] = value_addr (argvec[0]);
7322b725ae77Skettenis
7323*11efff7fSkettenis type = ada_check_typedef (VALUE_TYPE (argvec[0]));
7324b725ae77Skettenis if (TYPE_CODE (type) == TYPE_CODE_PTR)
7325b725ae77Skettenis {
7326*11efff7fSkettenis switch (TYPE_CODE (ada_check_typedef (TYPE_TARGET_TYPE (type))))
7327b725ae77Skettenis {
7328b725ae77Skettenis case TYPE_CODE_FUNC:
7329*11efff7fSkettenis type = ada_check_typedef (TYPE_TARGET_TYPE (type));
7330b725ae77Skettenis break;
7331b725ae77Skettenis case TYPE_CODE_ARRAY:
7332b725ae77Skettenis break;
7333b725ae77Skettenis case TYPE_CODE_STRUCT:
7334b725ae77Skettenis if (noside != EVAL_AVOID_SIDE_EFFECTS)
7335b725ae77Skettenis argvec[0] = ada_value_ind (argvec[0]);
7336*11efff7fSkettenis type = ada_check_typedef (TYPE_TARGET_TYPE (type));
7337b725ae77Skettenis break;
7338b725ae77Skettenis default:
7339b725ae77Skettenis error ("cannot subscript or call something of type `%s'",
7340b725ae77Skettenis ada_type_name (VALUE_TYPE (argvec[0])));
7341b725ae77Skettenis break;
7342b725ae77Skettenis }
7343b725ae77Skettenis }
7344b725ae77Skettenis
7345b725ae77Skettenis switch (TYPE_CODE (type))
7346b725ae77Skettenis {
7347b725ae77Skettenis case TYPE_CODE_FUNC:
7348b725ae77Skettenis if (noside == EVAL_AVOID_SIDE_EFFECTS)
7349b725ae77Skettenis return allocate_value (TYPE_TARGET_TYPE (type));
7350b725ae77Skettenis return call_function_by_hand (argvec[0], nargs, argvec + 1);
7351b725ae77Skettenis case TYPE_CODE_STRUCT:
7352b725ae77Skettenis {
7353*11efff7fSkettenis int arity;
7354*11efff7fSkettenis
7355*11efff7fSkettenis arity = ada_array_arity (type);
7356b725ae77Skettenis type = ada_array_element_type (type, nargs);
7357b725ae77Skettenis if (type == NULL)
7358b725ae77Skettenis error ("cannot subscript or call a record");
7359b725ae77Skettenis if (arity != nargs)
7360b725ae77Skettenis error ("wrong number of subscripts; expecting %d", arity);
7361b725ae77Skettenis if (noside == EVAL_AVOID_SIDE_EFFECTS)
7362b725ae77Skettenis return allocate_value (ada_aligned_type (type));
7363b725ae77Skettenis return
7364b725ae77Skettenis unwrap_value (ada_value_subscript
7365b725ae77Skettenis (argvec[0], nargs, argvec + 1));
7366b725ae77Skettenis }
7367b725ae77Skettenis case TYPE_CODE_ARRAY:
7368b725ae77Skettenis if (noside == EVAL_AVOID_SIDE_EFFECTS)
7369b725ae77Skettenis {
7370b725ae77Skettenis type = ada_array_element_type (type, nargs);
7371b725ae77Skettenis if (type == NULL)
7372b725ae77Skettenis error ("element type of array unknown");
7373b725ae77Skettenis else
7374b725ae77Skettenis return allocate_value (ada_aligned_type (type));
7375b725ae77Skettenis }
7376b725ae77Skettenis return
7377b725ae77Skettenis unwrap_value (ada_value_subscript
7378b725ae77Skettenis (ada_coerce_to_simple_array (argvec[0]),
7379b725ae77Skettenis nargs, argvec + 1));
7380b725ae77Skettenis case TYPE_CODE_PTR: /* Pointer to array */
7381b725ae77Skettenis type = to_fixed_array_type (TYPE_TARGET_TYPE (type), NULL, 1);
7382b725ae77Skettenis if (noside == EVAL_AVOID_SIDE_EFFECTS)
7383b725ae77Skettenis {
7384b725ae77Skettenis type = ada_array_element_type (type, nargs);
7385b725ae77Skettenis if (type == NULL)
7386b725ae77Skettenis error ("element type of array unknown");
7387b725ae77Skettenis else
7388b725ae77Skettenis return allocate_value (ada_aligned_type (type));
7389b725ae77Skettenis }
7390b725ae77Skettenis return
7391b725ae77Skettenis unwrap_value (ada_value_ptr_subscript (argvec[0], type,
7392b725ae77Skettenis nargs, argvec + 1));
7393b725ae77Skettenis
7394b725ae77Skettenis default:
7395*11efff7fSkettenis error ("Attempt to index or call something other than an "
7396*11efff7fSkettenis "array or function");
7397b725ae77Skettenis }
7398b725ae77Skettenis
7399b725ae77Skettenis case TERNOP_SLICE:
7400b725ae77Skettenis {
7401b725ae77Skettenis struct value *array = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7402*11efff7fSkettenis struct value *low_bound_val =
7403*11efff7fSkettenis evaluate_subexp (NULL_TYPE, exp, pos, noside);
7404*11efff7fSkettenis struct value *high_bound_val =
7405*11efff7fSkettenis evaluate_subexp (NULL_TYPE, exp, pos, noside);
7406*11efff7fSkettenis LONGEST low_bound;
7407*11efff7fSkettenis LONGEST high_bound;
7408*11efff7fSkettenis COERCE_REF (low_bound_val);
7409*11efff7fSkettenis COERCE_REF (high_bound_val);
7410*11efff7fSkettenis low_bound = pos_atr (low_bound_val);
7411*11efff7fSkettenis high_bound = pos_atr (high_bound_val);
7412*11efff7fSkettenis
7413b725ae77Skettenis if (noside == EVAL_SKIP)
7414b725ae77Skettenis goto nosideret;
7415b725ae77Skettenis
7416*11efff7fSkettenis /* If this is a reference to an aligner type, then remove all
7417*11efff7fSkettenis the aligners. */
7418b725ae77Skettenis if (TYPE_CODE (VALUE_TYPE (array)) == TYPE_CODE_REF
7419*11efff7fSkettenis && ada_is_aligner_type (TYPE_TARGET_TYPE (VALUE_TYPE (array))))
7420*11efff7fSkettenis TYPE_TARGET_TYPE (VALUE_TYPE (array)) =
7421*11efff7fSkettenis ada_aligned_type (TYPE_TARGET_TYPE (VALUE_TYPE (array)));
7422b725ae77Skettenis
7423*11efff7fSkettenis if (ada_is_packed_array_type (VALUE_TYPE (array)))
7424*11efff7fSkettenis error ("cannot slice a packed array");
7425b725ae77Skettenis
7426*11efff7fSkettenis /* If this is a reference to an array or an array lvalue,
7427*11efff7fSkettenis convert to a pointer. */
7428*11efff7fSkettenis if (TYPE_CODE (VALUE_TYPE (array)) == TYPE_CODE_REF
7429*11efff7fSkettenis || (TYPE_CODE (VALUE_TYPE (array)) == TYPE_CODE_ARRAY
7430*11efff7fSkettenis && VALUE_LVAL (array) == lval_memory))
7431*11efff7fSkettenis array = value_addr (array);
7432b725ae77Skettenis
7433*11efff7fSkettenis if (noside == EVAL_AVOID_SIDE_EFFECTS
7434*11efff7fSkettenis && ada_is_array_descriptor_type (ada_check_typedef
7435*11efff7fSkettenis (VALUE_TYPE (array))))
7436*11efff7fSkettenis return empty_array (ada_type_of_array (array, 0), low_bound);
7437*11efff7fSkettenis
7438*11efff7fSkettenis array = ada_coerce_to_simple_array_ptr (array);
7439*11efff7fSkettenis
7440*11efff7fSkettenis /* If we have more than one level of pointer indirection,
7441*11efff7fSkettenis dereference the value until we get only one level. */
7442*11efff7fSkettenis while (TYPE_CODE (VALUE_TYPE (array)) == TYPE_CODE_PTR
7443*11efff7fSkettenis && (TYPE_CODE (TYPE_TARGET_TYPE (VALUE_TYPE (array)))
7444*11efff7fSkettenis == TYPE_CODE_PTR))
7445*11efff7fSkettenis array = value_ind (array);
7446*11efff7fSkettenis
7447*11efff7fSkettenis /* Make sure we really do have an array type before going further,
7448*11efff7fSkettenis to avoid a SEGV when trying to get the index type or the target
7449*11efff7fSkettenis type later down the road if the debug info generated by
7450*11efff7fSkettenis the compiler is incorrect or incomplete. */
7451*11efff7fSkettenis if (!ada_is_simple_array_type (VALUE_TYPE (array)))
7452*11efff7fSkettenis error ("cannot take slice of non-array");
7453*11efff7fSkettenis
7454*11efff7fSkettenis if (TYPE_CODE (VALUE_TYPE (array)) == TYPE_CODE_PTR)
7455*11efff7fSkettenis {
7456*11efff7fSkettenis if (high_bound < low_bound || noside == EVAL_AVOID_SIDE_EFFECTS)
7457*11efff7fSkettenis return empty_array (TYPE_TARGET_TYPE (VALUE_TYPE (array)),
7458*11efff7fSkettenis low_bound);
7459b725ae77Skettenis else
7460*11efff7fSkettenis {
7461*11efff7fSkettenis struct type *arr_type0 =
7462*11efff7fSkettenis to_fixed_array_type (TYPE_TARGET_TYPE (VALUE_TYPE (array)),
7463*11efff7fSkettenis NULL, 1);
7464*11efff7fSkettenis return ada_value_slice_ptr (array, arr_type0,
7465*11efff7fSkettenis (int) low_bound,
7466*11efff7fSkettenis (int) high_bound);
7467*11efff7fSkettenis }
7468*11efff7fSkettenis }
7469*11efff7fSkettenis else if (noside == EVAL_AVOID_SIDE_EFFECTS)
7470*11efff7fSkettenis return array;
7471*11efff7fSkettenis else if (high_bound < low_bound)
7472*11efff7fSkettenis return empty_array (VALUE_TYPE (array), low_bound);
7473*11efff7fSkettenis else
7474*11efff7fSkettenis return ada_value_slice (array, (int) low_bound, (int) high_bound);
7475b725ae77Skettenis }
7476b725ae77Skettenis
7477*11efff7fSkettenis case UNOP_IN_RANGE:
7478b725ae77Skettenis (*pos) += 2;
7479b725ae77Skettenis arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7480b725ae77Skettenis type = exp->elts[pc + 1].type;
7481b725ae77Skettenis
7482b725ae77Skettenis if (noside == EVAL_SKIP)
7483b725ae77Skettenis goto nosideret;
7484b725ae77Skettenis
7485b725ae77Skettenis switch (TYPE_CODE (type))
7486b725ae77Skettenis {
7487b725ae77Skettenis default:
7488*11efff7fSkettenis lim_warning ("Membership test incompletely implemented; "
7489*11efff7fSkettenis "always returns true");
7490b725ae77Skettenis return value_from_longest (builtin_type_int, (LONGEST) 1);
7491b725ae77Skettenis
7492b725ae77Skettenis case TYPE_CODE_RANGE:
7493*11efff7fSkettenis arg2 = value_from_longest (builtin_type_int, TYPE_LOW_BOUND (type));
7494b725ae77Skettenis arg3 = value_from_longest (builtin_type_int,
7495*11efff7fSkettenis TYPE_HIGH_BOUND (type));
7496b725ae77Skettenis return
7497b725ae77Skettenis value_from_longest (builtin_type_int,
7498b725ae77Skettenis (value_less (arg1, arg3)
7499b725ae77Skettenis || value_equal (arg1, arg3))
7500b725ae77Skettenis && (value_less (arg2, arg1)
7501b725ae77Skettenis || value_equal (arg2, arg1)));
7502b725ae77Skettenis }
7503*11efff7fSkettenis
7504*11efff7fSkettenis case BINOP_IN_BOUNDS:
7505b725ae77Skettenis (*pos) += 2;
7506b725ae77Skettenis arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7507b725ae77Skettenis arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7508b725ae77Skettenis
7509b725ae77Skettenis if (noside == EVAL_SKIP)
7510b725ae77Skettenis goto nosideret;
7511b725ae77Skettenis
7512b725ae77Skettenis if (noside == EVAL_AVOID_SIDE_EFFECTS)
7513b725ae77Skettenis return value_zero (builtin_type_int, not_lval);
7514b725ae77Skettenis
7515b725ae77Skettenis tem = longest_to_int (exp->elts[pc + 1].longconst);
7516b725ae77Skettenis
7517b725ae77Skettenis if (tem < 1 || tem > ada_array_arity (VALUE_TYPE (arg2)))
7518b725ae77Skettenis error ("invalid dimension number to '%s", "range");
7519b725ae77Skettenis
7520b725ae77Skettenis arg3 = ada_array_bound (arg2, tem, 1);
7521b725ae77Skettenis arg2 = ada_array_bound (arg2, tem, 0);
7522b725ae77Skettenis
7523b725ae77Skettenis return
7524b725ae77Skettenis value_from_longest (builtin_type_int,
7525b725ae77Skettenis (value_less (arg1, arg3)
7526b725ae77Skettenis || value_equal (arg1, arg3))
7527b725ae77Skettenis && (value_less (arg2, arg1)
7528b725ae77Skettenis || value_equal (arg2, arg1)));
7529*11efff7fSkettenis
7530*11efff7fSkettenis case TERNOP_IN_RANGE:
7531b725ae77Skettenis arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7532b725ae77Skettenis arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7533b725ae77Skettenis arg3 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7534b725ae77Skettenis
7535b725ae77Skettenis if (noside == EVAL_SKIP)
7536b725ae77Skettenis goto nosideret;
7537b725ae77Skettenis
7538b725ae77Skettenis return
7539b725ae77Skettenis value_from_longest (builtin_type_int,
7540b725ae77Skettenis (value_less (arg1, arg3)
7541b725ae77Skettenis || value_equal (arg1, arg3))
7542b725ae77Skettenis && (value_less (arg2, arg1)
7543b725ae77Skettenis || value_equal (arg2, arg1)));
7544b725ae77Skettenis
7545*11efff7fSkettenis case OP_ATR_FIRST:
7546*11efff7fSkettenis case OP_ATR_LAST:
7547*11efff7fSkettenis case OP_ATR_LENGTH:
7548b725ae77Skettenis {
7549b725ae77Skettenis struct type *type_arg;
7550b725ae77Skettenis if (exp->elts[*pos].opcode == OP_TYPE)
7551b725ae77Skettenis {
7552b725ae77Skettenis evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP);
7553b725ae77Skettenis arg1 = NULL;
7554*11efff7fSkettenis type_arg = exp->elts[pc + 2].type;
7555b725ae77Skettenis }
7556b725ae77Skettenis else
7557b725ae77Skettenis {
7558b725ae77Skettenis arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7559b725ae77Skettenis type_arg = NULL;
7560b725ae77Skettenis }
7561b725ae77Skettenis
7562b725ae77Skettenis if (exp->elts[*pos].opcode != OP_LONG)
7563*11efff7fSkettenis error ("illegal operand to '%s", ada_attribute_name (op));
7564b725ae77Skettenis tem = longest_to_int (exp->elts[*pos + 2].longconst);
7565b725ae77Skettenis *pos += 4;
7566b725ae77Skettenis
7567b725ae77Skettenis if (noside == EVAL_SKIP)
7568b725ae77Skettenis goto nosideret;
7569b725ae77Skettenis
7570b725ae77Skettenis if (type_arg == NULL)
7571b725ae77Skettenis {
7572b725ae77Skettenis arg1 = ada_coerce_ref (arg1);
7573b725ae77Skettenis
7574b725ae77Skettenis if (ada_is_packed_array_type (VALUE_TYPE (arg1)))
7575b725ae77Skettenis arg1 = ada_coerce_to_simple_array (arg1);
7576b725ae77Skettenis
7577b725ae77Skettenis if (tem < 1 || tem > ada_array_arity (VALUE_TYPE (arg1)))
7578b725ae77Skettenis error ("invalid dimension number to '%s",
7579*11efff7fSkettenis ada_attribute_name (op));
7580b725ae77Skettenis
7581b725ae77Skettenis if (noside == EVAL_AVOID_SIDE_EFFECTS)
7582b725ae77Skettenis {
7583b725ae77Skettenis type = ada_index_type (VALUE_TYPE (arg1), tem);
7584b725ae77Skettenis if (type == NULL)
7585*11efff7fSkettenis error
7586*11efff7fSkettenis ("attempt to take bound of something that is not an array");
7587b725ae77Skettenis return allocate_value (type);
7588b725ae77Skettenis }
7589b725ae77Skettenis
7590*11efff7fSkettenis switch (op)
7591b725ae77Skettenis {
7592*11efff7fSkettenis default: /* Should never happen. */
7593b725ae77Skettenis error ("unexpected attribute encountered");
7594*11efff7fSkettenis case OP_ATR_FIRST:
7595b725ae77Skettenis return ada_array_bound (arg1, tem, 0);
7596*11efff7fSkettenis case OP_ATR_LAST:
7597b725ae77Skettenis return ada_array_bound (arg1, tem, 1);
7598*11efff7fSkettenis case OP_ATR_LENGTH:
7599b725ae77Skettenis return ada_array_length (arg1, tem);
7600b725ae77Skettenis }
7601b725ae77Skettenis }
7602*11efff7fSkettenis else if (discrete_type_p (type_arg))
7603b725ae77Skettenis {
7604b725ae77Skettenis struct type *range_type;
7605b725ae77Skettenis char *name = ada_type_name (type_arg);
7606*11efff7fSkettenis range_type = NULL;
7607*11efff7fSkettenis if (name != NULL && TYPE_CODE (type_arg) != TYPE_CODE_ENUM)
7608b725ae77Skettenis range_type =
7609b725ae77Skettenis to_fixed_range_type (name, NULL, TYPE_OBJFILE (type_arg));
7610*11efff7fSkettenis if (range_type == NULL)
7611*11efff7fSkettenis range_type = type_arg;
7612*11efff7fSkettenis switch (op)
7613b725ae77Skettenis {
7614b725ae77Skettenis default:
7615b725ae77Skettenis error ("unexpected attribute encountered");
7616*11efff7fSkettenis case OP_ATR_FIRST:
7617*11efff7fSkettenis return discrete_type_low_bound (range_type);
7618*11efff7fSkettenis case OP_ATR_LAST:
7619*11efff7fSkettenis return discrete_type_high_bound (range_type);
7620*11efff7fSkettenis case OP_ATR_LENGTH:
7621*11efff7fSkettenis error ("the 'length attribute applies only to array types");
7622b725ae77Skettenis }
7623b725ae77Skettenis }
7624b725ae77Skettenis else if (TYPE_CODE (type_arg) == TYPE_CODE_FLT)
7625b725ae77Skettenis error ("unimplemented type attribute");
7626b725ae77Skettenis else
7627b725ae77Skettenis {
7628b725ae77Skettenis LONGEST low, high;
7629b725ae77Skettenis
7630b725ae77Skettenis if (ada_is_packed_array_type (type_arg))
7631b725ae77Skettenis type_arg = decode_packed_array_type (type_arg);
7632b725ae77Skettenis
7633b725ae77Skettenis if (tem < 1 || tem > ada_array_arity (type_arg))
7634b725ae77Skettenis error ("invalid dimension number to '%s",
7635*11efff7fSkettenis ada_attribute_name (op));
7636b725ae77Skettenis
7637b725ae77Skettenis type = ada_index_type (type_arg, tem);
7638b725ae77Skettenis if (type == NULL)
7639*11efff7fSkettenis error
7640*11efff7fSkettenis ("attempt to take bound of something that is not an array");
7641*11efff7fSkettenis if (noside == EVAL_AVOID_SIDE_EFFECTS)
7642b725ae77Skettenis return allocate_value (type);
7643b725ae77Skettenis
7644*11efff7fSkettenis switch (op)
7645b725ae77Skettenis {
7646b725ae77Skettenis default:
7647b725ae77Skettenis error ("unexpected attribute encountered");
7648*11efff7fSkettenis case OP_ATR_FIRST:
7649b725ae77Skettenis low = ada_array_bound_from_type (type_arg, tem, 0, &type);
7650b725ae77Skettenis return value_from_longest (type, low);
7651*11efff7fSkettenis case OP_ATR_LAST:
7652b725ae77Skettenis high = ada_array_bound_from_type (type_arg, tem, 1, &type);
7653b725ae77Skettenis return value_from_longest (type, high);
7654*11efff7fSkettenis case OP_ATR_LENGTH:
7655b725ae77Skettenis low = ada_array_bound_from_type (type_arg, tem, 0, &type);
7656b725ae77Skettenis high = ada_array_bound_from_type (type_arg, tem, 1, NULL);
7657b725ae77Skettenis return value_from_longest (type, high - low + 1);
7658b725ae77Skettenis }
7659b725ae77Skettenis }
7660b725ae77Skettenis }
7661b725ae77Skettenis
7662*11efff7fSkettenis case OP_ATR_TAG:
7663b725ae77Skettenis arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7664b725ae77Skettenis if (noside == EVAL_SKIP)
7665b725ae77Skettenis goto nosideret;
7666b725ae77Skettenis
7667b725ae77Skettenis if (noside == EVAL_AVOID_SIDE_EFFECTS)
7668*11efff7fSkettenis return value_zero (ada_tag_type (arg1), not_lval);
7669b725ae77Skettenis
7670b725ae77Skettenis return ada_value_tag (arg1);
7671b725ae77Skettenis
7672*11efff7fSkettenis case OP_ATR_MIN:
7673*11efff7fSkettenis case OP_ATR_MAX:
7674b725ae77Skettenis evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP);
7675b725ae77Skettenis arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7676b725ae77Skettenis arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7677b725ae77Skettenis if (noside == EVAL_SKIP)
7678b725ae77Skettenis goto nosideret;
7679b725ae77Skettenis else if (noside == EVAL_AVOID_SIDE_EFFECTS)
7680b725ae77Skettenis return value_zero (VALUE_TYPE (arg1), not_lval);
7681b725ae77Skettenis else
7682b725ae77Skettenis return value_binop (arg1, arg2,
7683*11efff7fSkettenis op == OP_ATR_MIN ? BINOP_MIN : BINOP_MAX);
7684b725ae77Skettenis
7685*11efff7fSkettenis case OP_ATR_MODULUS:
7686b725ae77Skettenis {
7687*11efff7fSkettenis struct type *type_arg = exp->elts[pc + 2].type;
7688b725ae77Skettenis evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP);
7689b725ae77Skettenis
7690b725ae77Skettenis if (noside == EVAL_SKIP)
7691b725ae77Skettenis goto nosideret;
7692b725ae77Skettenis
7693b725ae77Skettenis if (!ada_is_modular_type (type_arg))
7694b725ae77Skettenis error ("'modulus must be applied to modular type");
7695b725ae77Skettenis
7696b725ae77Skettenis return value_from_longest (TYPE_TARGET_TYPE (type_arg),
7697b725ae77Skettenis ada_modulus (type_arg));
7698b725ae77Skettenis }
7699b725ae77Skettenis
7700b725ae77Skettenis
7701*11efff7fSkettenis case OP_ATR_POS:
7702b725ae77Skettenis evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP);
7703b725ae77Skettenis arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7704b725ae77Skettenis if (noside == EVAL_SKIP)
7705b725ae77Skettenis goto nosideret;
7706b725ae77Skettenis else if (noside == EVAL_AVOID_SIDE_EFFECTS)
7707*11efff7fSkettenis return value_zero (builtin_type_int, not_lval);
7708b725ae77Skettenis else
7709b725ae77Skettenis return value_pos_atr (arg1);
7710b725ae77Skettenis
7711*11efff7fSkettenis case OP_ATR_SIZE:
7712b725ae77Skettenis arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7713b725ae77Skettenis if (noside == EVAL_SKIP)
7714b725ae77Skettenis goto nosideret;
7715b725ae77Skettenis else if (noside == EVAL_AVOID_SIDE_EFFECTS)
7716*11efff7fSkettenis return value_zero (builtin_type_int, not_lval);
7717b725ae77Skettenis else
7718*11efff7fSkettenis return value_from_longest (builtin_type_int,
7719b725ae77Skettenis TARGET_CHAR_BIT
7720b725ae77Skettenis * TYPE_LENGTH (VALUE_TYPE (arg1)));
7721b725ae77Skettenis
7722*11efff7fSkettenis case OP_ATR_VAL:
7723b725ae77Skettenis evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP);
7724b725ae77Skettenis arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7725*11efff7fSkettenis type = exp->elts[pc + 2].type;
7726b725ae77Skettenis if (noside == EVAL_SKIP)
7727b725ae77Skettenis goto nosideret;
7728b725ae77Skettenis else if (noside == EVAL_AVOID_SIDE_EFFECTS)
7729b725ae77Skettenis return value_zero (type, not_lval);
7730b725ae77Skettenis else
7731b725ae77Skettenis return value_val_atr (type, arg1);
7732*11efff7fSkettenis
7733b725ae77Skettenis case BINOP_EXP:
7734b725ae77Skettenis arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7735b725ae77Skettenis arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7736b725ae77Skettenis if (noside == EVAL_SKIP)
7737b725ae77Skettenis goto nosideret;
7738b725ae77Skettenis else if (noside == EVAL_AVOID_SIDE_EFFECTS)
7739b725ae77Skettenis return value_zero (VALUE_TYPE (arg1), not_lval);
7740b725ae77Skettenis else
7741b725ae77Skettenis return value_binop (arg1, arg2, op);
7742b725ae77Skettenis
7743b725ae77Skettenis case UNOP_PLUS:
7744b725ae77Skettenis arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7745b725ae77Skettenis if (noside == EVAL_SKIP)
7746b725ae77Skettenis goto nosideret;
7747b725ae77Skettenis else
7748b725ae77Skettenis return arg1;
7749b725ae77Skettenis
7750b725ae77Skettenis case UNOP_ABS:
7751b725ae77Skettenis arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7752b725ae77Skettenis if (noside == EVAL_SKIP)
7753b725ae77Skettenis goto nosideret;
7754b725ae77Skettenis if (value_less (arg1, value_zero (VALUE_TYPE (arg1), not_lval)))
7755b725ae77Skettenis return value_neg (arg1);
7756b725ae77Skettenis else
7757b725ae77Skettenis return arg1;
7758b725ae77Skettenis
7759b725ae77Skettenis case UNOP_IND:
7760b725ae77Skettenis if (expect_type && TYPE_CODE (expect_type) == TYPE_CODE_PTR)
7761*11efff7fSkettenis expect_type = TYPE_TARGET_TYPE (ada_check_typedef (expect_type));
7762b725ae77Skettenis arg1 = evaluate_subexp (expect_type, exp, pos, noside);
7763b725ae77Skettenis if (noside == EVAL_SKIP)
7764b725ae77Skettenis goto nosideret;
7765*11efff7fSkettenis type = ada_check_typedef (VALUE_TYPE (arg1));
7766b725ae77Skettenis if (noside == EVAL_AVOID_SIDE_EFFECTS)
7767b725ae77Skettenis {
7768*11efff7fSkettenis if (ada_is_array_descriptor_type (type))
7769b725ae77Skettenis /* GDB allows dereferencing GNAT array descriptors. */
7770b725ae77Skettenis {
7771b725ae77Skettenis struct type *arrType = ada_type_of_array (arg1, 0);
7772b725ae77Skettenis if (arrType == NULL)
7773b725ae77Skettenis error ("Attempt to dereference null array pointer.");
7774b725ae77Skettenis return value_at_lazy (arrType, 0, NULL);
7775b725ae77Skettenis }
7776b725ae77Skettenis else if (TYPE_CODE (type) == TYPE_CODE_PTR
7777b725ae77Skettenis || TYPE_CODE (type) == TYPE_CODE_REF
7778b725ae77Skettenis /* In C you can dereference an array to get the 1st elt. */
7779b725ae77Skettenis || TYPE_CODE (type) == TYPE_CODE_ARRAY)
7780*11efff7fSkettenis {
7781*11efff7fSkettenis type = to_static_fixed_type
7782*11efff7fSkettenis (ada_aligned_type
7783*11efff7fSkettenis (ada_check_typedef (TYPE_TARGET_TYPE (type))));
7784*11efff7fSkettenis check_size (type);
7785*11efff7fSkettenis return value_zero (type, lval_memory);
7786*11efff7fSkettenis }
7787b725ae77Skettenis else if (TYPE_CODE (type) == TYPE_CODE_INT)
7788b725ae77Skettenis /* GDB allows dereferencing an int. */
7789b725ae77Skettenis return value_zero (builtin_type_int, lval_memory);
7790b725ae77Skettenis else
7791b725ae77Skettenis error ("Attempt to take contents of a non-pointer value.");
7792b725ae77Skettenis }
7793*11efff7fSkettenis arg1 = ada_coerce_ref (arg1); /* FIXME: What is this for?? */
7794*11efff7fSkettenis type = ada_check_typedef (VALUE_TYPE (arg1));
7795b725ae77Skettenis
7796*11efff7fSkettenis if (ada_is_array_descriptor_type (type))
7797b725ae77Skettenis /* GDB allows dereferencing GNAT array descriptors. */
7798b725ae77Skettenis return ada_coerce_to_simple_array (arg1);
7799b725ae77Skettenis else
7800b725ae77Skettenis return ada_value_ind (arg1);
7801b725ae77Skettenis
7802b725ae77Skettenis case STRUCTOP_STRUCT:
7803b725ae77Skettenis tem = longest_to_int (exp->elts[pc + 1].longconst);
7804b725ae77Skettenis (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1);
7805b725ae77Skettenis arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
7806b725ae77Skettenis if (noside == EVAL_SKIP)
7807b725ae77Skettenis goto nosideret;
7808b725ae77Skettenis if (noside == EVAL_AVOID_SIDE_EFFECTS)
7809*11efff7fSkettenis {
7810*11efff7fSkettenis struct type *type1 = VALUE_TYPE (arg1);
7811*11efff7fSkettenis if (ada_is_tagged_type (type1, 1))
7812*11efff7fSkettenis {
7813*11efff7fSkettenis type = ada_lookup_struct_elt_type (type1,
7814b725ae77Skettenis &exp->elts[pc + 2].string,
7815*11efff7fSkettenis 1, 1, NULL);
7816*11efff7fSkettenis if (type == NULL)
7817*11efff7fSkettenis /* In this case, we assume that the field COULD exist
7818*11efff7fSkettenis in some extension of the type. Return an object of
7819*11efff7fSkettenis "type" void, which will match any formal
7820*11efff7fSkettenis (see ada_type_match). */
7821*11efff7fSkettenis return value_zero (builtin_type_void, lval_memory);
7822*11efff7fSkettenis }
7823*11efff7fSkettenis else
7824*11efff7fSkettenis type =
7825*11efff7fSkettenis ada_lookup_struct_elt_type (type1, &exp->elts[pc + 2].string, 1,
7826*11efff7fSkettenis 0, NULL);
7827*11efff7fSkettenis
7828*11efff7fSkettenis return value_zero (ada_aligned_type (type), lval_memory);
7829*11efff7fSkettenis }
7830*11efff7fSkettenis else
7831*11efff7fSkettenis return
7832*11efff7fSkettenis ada_to_fixed_value (unwrap_value
7833*11efff7fSkettenis (ada_value_struct_elt
7834*11efff7fSkettenis (arg1, &exp->elts[pc + 2].string, "record")));
7835b725ae77Skettenis case OP_TYPE:
7836b725ae77Skettenis /* The value is not supposed to be used. This is here to make it
7837b725ae77Skettenis easier to accommodate expressions that contain types. */
7838b725ae77Skettenis (*pos) += 2;
7839b725ae77Skettenis if (noside == EVAL_SKIP)
7840b725ae77Skettenis goto nosideret;
7841b725ae77Skettenis else if (noside == EVAL_AVOID_SIDE_EFFECTS)
7842b725ae77Skettenis return allocate_value (builtin_type_void);
7843b725ae77Skettenis else
7844b725ae77Skettenis error ("Attempt to use a type name as an expression");
7845b725ae77Skettenis }
7846b725ae77Skettenis
7847b725ae77Skettenis nosideret:
7848b725ae77Skettenis return value_from_longest (builtin_type_long, (LONGEST) 1);
7849b725ae77Skettenis }
7850b725ae77Skettenis
7851b725ae77Skettenis
7852b725ae77Skettenis /* Fixed point */
7853b725ae77Skettenis
7854b725ae77Skettenis /* If TYPE encodes an Ada fixed-point type, return the suffix of the
7855b725ae77Skettenis type name that encodes the 'small and 'delta information.
7856b725ae77Skettenis Otherwise, return NULL. */
7857b725ae77Skettenis
7858b725ae77Skettenis static const char *
fixed_type_info(struct type * type)7859b725ae77Skettenis fixed_type_info (struct type *type)
7860b725ae77Skettenis {
7861b725ae77Skettenis const char *name = ada_type_name (type);
7862b725ae77Skettenis enum type_code code = (type == NULL) ? TYPE_CODE_UNDEF : TYPE_CODE (type);
7863b725ae77Skettenis
7864b725ae77Skettenis if ((code == TYPE_CODE_INT || code == TYPE_CODE_RANGE) && name != NULL)
7865b725ae77Skettenis {
7866b725ae77Skettenis const char *tail = strstr (name, "___XF_");
7867b725ae77Skettenis if (tail == NULL)
7868b725ae77Skettenis return NULL;
7869b725ae77Skettenis else
7870b725ae77Skettenis return tail + 5;
7871b725ae77Skettenis }
7872b725ae77Skettenis else if (code == TYPE_CODE_RANGE && TYPE_TARGET_TYPE (type) != type)
7873b725ae77Skettenis return fixed_type_info (TYPE_TARGET_TYPE (type));
7874b725ae77Skettenis else
7875b725ae77Skettenis return NULL;
7876b725ae77Skettenis }
7877b725ae77Skettenis
7878b725ae77Skettenis /* Returns non-zero iff TYPE represents an Ada fixed-point type. */
7879b725ae77Skettenis
7880b725ae77Skettenis int
ada_is_fixed_point_type(struct type * type)7881b725ae77Skettenis ada_is_fixed_point_type (struct type *type)
7882b725ae77Skettenis {
7883b725ae77Skettenis return fixed_type_info (type) != NULL;
7884b725ae77Skettenis }
7885b725ae77Skettenis
7886*11efff7fSkettenis /* Return non-zero iff TYPE represents a System.Address type. */
7887*11efff7fSkettenis
7888*11efff7fSkettenis int
ada_is_system_address_type(struct type * type)7889*11efff7fSkettenis ada_is_system_address_type (struct type *type)
7890*11efff7fSkettenis {
7891*11efff7fSkettenis return (TYPE_NAME (type)
7892*11efff7fSkettenis && strcmp (TYPE_NAME (type), "system__address") == 0);
7893*11efff7fSkettenis }
7894*11efff7fSkettenis
7895b725ae77Skettenis /* Assuming that TYPE is the representation of an Ada fixed-point
7896b725ae77Skettenis type, return its delta, or -1 if the type is malformed and the
7897b725ae77Skettenis delta cannot be determined. */
7898b725ae77Skettenis
7899b725ae77Skettenis DOUBLEST
ada_delta(struct type * type)7900b725ae77Skettenis ada_delta (struct type *type)
7901b725ae77Skettenis {
7902b725ae77Skettenis const char *encoding = fixed_type_info (type);
7903b725ae77Skettenis long num, den;
7904b725ae77Skettenis
7905b725ae77Skettenis if (sscanf (encoding, "_%ld_%ld", &num, &den) < 2)
7906b725ae77Skettenis return -1.0;
7907b725ae77Skettenis else
7908b725ae77Skettenis return (DOUBLEST) num / (DOUBLEST) den;
7909b725ae77Skettenis }
7910b725ae77Skettenis
7911b725ae77Skettenis /* Assuming that ada_is_fixed_point_type (TYPE), return the scaling
7912b725ae77Skettenis factor ('SMALL value) associated with the type. */
7913b725ae77Skettenis
7914b725ae77Skettenis static DOUBLEST
scaling_factor(struct type * type)7915b725ae77Skettenis scaling_factor (struct type *type)
7916b725ae77Skettenis {
7917b725ae77Skettenis const char *encoding = fixed_type_info (type);
7918b725ae77Skettenis unsigned long num0, den0, num1, den1;
7919b725ae77Skettenis int n;
7920b725ae77Skettenis
7921b725ae77Skettenis n = sscanf (encoding, "_%lu_%lu_%lu_%lu", &num0, &den0, &num1, &den1);
7922b725ae77Skettenis
7923b725ae77Skettenis if (n < 2)
7924b725ae77Skettenis return 1.0;
7925b725ae77Skettenis else if (n == 4)
7926b725ae77Skettenis return (DOUBLEST) num1 / (DOUBLEST) den1;
7927b725ae77Skettenis else
7928b725ae77Skettenis return (DOUBLEST) num0 / (DOUBLEST) den0;
7929b725ae77Skettenis }
7930b725ae77Skettenis
7931b725ae77Skettenis
7932b725ae77Skettenis /* Assuming that X is the representation of a value of fixed-point
7933b725ae77Skettenis type TYPE, return its floating-point equivalent. */
7934b725ae77Skettenis
7935b725ae77Skettenis DOUBLEST
ada_fixed_to_float(struct type * type,LONGEST x)7936b725ae77Skettenis ada_fixed_to_float (struct type *type, LONGEST x)
7937b725ae77Skettenis {
7938b725ae77Skettenis return (DOUBLEST) x *scaling_factor (type);
7939b725ae77Skettenis }
7940b725ae77Skettenis
7941b725ae77Skettenis /* The representation of a fixed-point value of type TYPE
7942b725ae77Skettenis corresponding to the value X. */
7943b725ae77Skettenis
7944b725ae77Skettenis LONGEST
ada_float_to_fixed(struct type * type,DOUBLEST x)7945b725ae77Skettenis ada_float_to_fixed (struct type *type, DOUBLEST x)
7946b725ae77Skettenis {
7947b725ae77Skettenis return (LONGEST) (x / scaling_factor (type) + 0.5);
7948b725ae77Skettenis }
7949b725ae77Skettenis
7950b725ae77Skettenis
7951b725ae77Skettenis /* VAX floating formats */
7952b725ae77Skettenis
7953b725ae77Skettenis /* Non-zero iff TYPE represents one of the special VAX floating-point
7954b725ae77Skettenis types. */
7955*11efff7fSkettenis
7956b725ae77Skettenis int
ada_is_vax_floating_type(struct type * type)7957b725ae77Skettenis ada_is_vax_floating_type (struct type *type)
7958b725ae77Skettenis {
7959b725ae77Skettenis int name_len =
7960b725ae77Skettenis (ada_type_name (type) == NULL) ? 0 : strlen (ada_type_name (type));
7961b725ae77Skettenis return
7962b725ae77Skettenis name_len > 6
7963b725ae77Skettenis && (TYPE_CODE (type) == TYPE_CODE_INT
7964b725ae77Skettenis || TYPE_CODE (type) == TYPE_CODE_RANGE)
7965*11efff7fSkettenis && strncmp (ada_type_name (type) + name_len - 6, "___XF", 5) == 0;
7966b725ae77Skettenis }
7967b725ae77Skettenis
7968b725ae77Skettenis /* The type of special VAX floating-point type this is, assuming
7969*11efff7fSkettenis ada_is_vax_floating_point. */
7970*11efff7fSkettenis
7971b725ae77Skettenis int
ada_vax_float_type_suffix(struct type * type)7972b725ae77Skettenis ada_vax_float_type_suffix (struct type *type)
7973b725ae77Skettenis {
7974b725ae77Skettenis return ada_type_name (type)[strlen (ada_type_name (type)) - 1];
7975b725ae77Skettenis }
7976b725ae77Skettenis
7977b725ae77Skettenis /* A value representing the special debugging function that outputs
7978b725ae77Skettenis VAX floating-point values of the type represented by TYPE. Assumes
7979b725ae77Skettenis ada_is_vax_floating_type (TYPE). */
7980*11efff7fSkettenis
7981b725ae77Skettenis struct value *
ada_vax_float_print_function(struct type * type)7982b725ae77Skettenis ada_vax_float_print_function (struct type *type)
7983b725ae77Skettenis {
7984b725ae77Skettenis switch (ada_vax_float_type_suffix (type))
7985b725ae77Skettenis {
7986b725ae77Skettenis case 'F':
7987b725ae77Skettenis return get_var_value ("DEBUG_STRING_F", 0);
7988b725ae77Skettenis case 'D':
7989b725ae77Skettenis return get_var_value ("DEBUG_STRING_D", 0);
7990b725ae77Skettenis case 'G':
7991b725ae77Skettenis return get_var_value ("DEBUG_STRING_G", 0);
7992b725ae77Skettenis default:
7993b725ae77Skettenis error ("invalid VAX floating-point type");
7994b725ae77Skettenis }
7995b725ae77Skettenis }
7996b725ae77Skettenis
7997b725ae77Skettenis
7998b725ae77Skettenis /* Range types */
7999b725ae77Skettenis
8000b725ae77Skettenis /* Scan STR beginning at position K for a discriminant name, and
8001b725ae77Skettenis return the value of that discriminant field of DVAL in *PX. If
8002b725ae77Skettenis PNEW_K is not null, put the position of the character beyond the
8003b725ae77Skettenis name scanned in *PNEW_K. Return 1 if successful; return 0 and do
8004b725ae77Skettenis not alter *PX and *PNEW_K if unsuccessful. */
8005b725ae77Skettenis
8006b725ae77Skettenis static int
scan_discrim_bound(char * str,int k,struct value * dval,LONGEST * px,int * pnew_k)8007b725ae77Skettenis scan_discrim_bound (char *str, int k, struct value *dval, LONGEST * px,
8008b725ae77Skettenis int *pnew_k)
8009b725ae77Skettenis {
8010b725ae77Skettenis static char *bound_buffer = NULL;
8011b725ae77Skettenis static size_t bound_buffer_len = 0;
8012b725ae77Skettenis char *bound;
8013b725ae77Skettenis char *pend;
8014b725ae77Skettenis struct value *bound_val;
8015b725ae77Skettenis
8016b725ae77Skettenis if (dval == NULL || str == NULL || str[k] == '\0')
8017b725ae77Skettenis return 0;
8018b725ae77Skettenis
8019b725ae77Skettenis pend = strstr (str + k, "__");
8020b725ae77Skettenis if (pend == NULL)
8021b725ae77Skettenis {
8022b725ae77Skettenis bound = str + k;
8023b725ae77Skettenis k += strlen (bound);
8024b725ae77Skettenis }
8025b725ae77Skettenis else
8026b725ae77Skettenis {
8027b725ae77Skettenis GROW_VECT (bound_buffer, bound_buffer_len, pend - (str + k) + 1);
8028b725ae77Skettenis bound = bound_buffer;
8029b725ae77Skettenis strncpy (bound_buffer, str + k, pend - (str + k));
8030b725ae77Skettenis bound[pend - (str + k)] = '\0';
8031b725ae77Skettenis k = pend - str;
8032b725ae77Skettenis }
8033b725ae77Skettenis
8034b725ae77Skettenis bound_val = ada_search_struct_field (bound, dval, 0, VALUE_TYPE (dval));
8035b725ae77Skettenis if (bound_val == NULL)
8036b725ae77Skettenis return 0;
8037b725ae77Skettenis
8038b725ae77Skettenis *px = value_as_long (bound_val);
8039b725ae77Skettenis if (pnew_k != NULL)
8040b725ae77Skettenis *pnew_k = k;
8041b725ae77Skettenis return 1;
8042b725ae77Skettenis }
8043b725ae77Skettenis
8044b725ae77Skettenis /* Value of variable named NAME in the current environment. If
8045b725ae77Skettenis no such variable found, then if ERR_MSG is null, returns 0, and
8046b725ae77Skettenis otherwise causes an error with message ERR_MSG. */
8047*11efff7fSkettenis
8048b725ae77Skettenis static struct value *
get_var_value(char * name,char * err_msg)8049b725ae77Skettenis get_var_value (char *name, char *err_msg)
8050b725ae77Skettenis {
8051*11efff7fSkettenis struct ada_symbol_info *syms;
8052b725ae77Skettenis int nsyms;
8053b725ae77Skettenis
8054*11efff7fSkettenis nsyms = ada_lookup_symbol_list (name, get_selected_block (0), VAR_DOMAIN,
8055*11efff7fSkettenis &syms);
8056b725ae77Skettenis
8057b725ae77Skettenis if (nsyms != 1)
8058b725ae77Skettenis {
8059b725ae77Skettenis if (err_msg == NULL)
8060b725ae77Skettenis return 0;
8061b725ae77Skettenis else
8062b725ae77Skettenis error ("%s", err_msg);
8063b725ae77Skettenis }
8064b725ae77Skettenis
8065*11efff7fSkettenis return value_of_variable (syms[0].sym, syms[0].block);
8066b725ae77Skettenis }
8067b725ae77Skettenis
8068b725ae77Skettenis /* Value of integer variable named NAME in the current environment. If
8069*11efff7fSkettenis no such variable found, returns 0, and sets *FLAG to 0. If
8070*11efff7fSkettenis successful, sets *FLAG to 1. */
8071*11efff7fSkettenis
8072b725ae77Skettenis LONGEST
get_int_var_value(char * name,int * flag)8073*11efff7fSkettenis get_int_var_value (char *name, int *flag)
8074b725ae77Skettenis {
8075*11efff7fSkettenis struct value *var_val = get_var_value (name, 0);
8076b725ae77Skettenis
8077b725ae77Skettenis if (var_val == 0)
8078b725ae77Skettenis {
8079b725ae77Skettenis if (flag != NULL)
8080b725ae77Skettenis *flag = 0;
8081b725ae77Skettenis return 0;
8082b725ae77Skettenis }
8083b725ae77Skettenis else
8084b725ae77Skettenis {
8085b725ae77Skettenis if (flag != NULL)
8086b725ae77Skettenis *flag = 1;
8087b725ae77Skettenis return value_as_long (var_val);
8088b725ae77Skettenis }
8089b725ae77Skettenis }
8090b725ae77Skettenis
8091b725ae77Skettenis
8092b725ae77Skettenis /* Return a range type whose base type is that of the range type named
8093b725ae77Skettenis NAME in the current environment, and whose bounds are calculated
8094b725ae77Skettenis from NAME according to the GNAT range encoding conventions.
8095b725ae77Skettenis Extract discriminant values, if needed, from DVAL. If a new type
8096b725ae77Skettenis must be created, allocate in OBJFILE's space. The bounds
8097b725ae77Skettenis information, in general, is encoded in NAME, the base type given in
8098b725ae77Skettenis the named range type. */
8099b725ae77Skettenis
8100b725ae77Skettenis static struct type *
to_fixed_range_type(char * name,struct value * dval,struct objfile * objfile)8101b725ae77Skettenis to_fixed_range_type (char *name, struct value *dval, struct objfile *objfile)
8102b725ae77Skettenis {
8103b725ae77Skettenis struct type *raw_type = ada_find_any_type (name);
8104b725ae77Skettenis struct type *base_type;
8105b725ae77Skettenis char *subtype_info;
8106b725ae77Skettenis
8107b725ae77Skettenis if (raw_type == NULL)
8108b725ae77Skettenis base_type = builtin_type_int;
8109b725ae77Skettenis else if (TYPE_CODE (raw_type) == TYPE_CODE_RANGE)
8110b725ae77Skettenis base_type = TYPE_TARGET_TYPE (raw_type);
8111b725ae77Skettenis else
8112b725ae77Skettenis base_type = raw_type;
8113b725ae77Skettenis
8114b725ae77Skettenis subtype_info = strstr (name, "___XD");
8115b725ae77Skettenis if (subtype_info == NULL)
8116b725ae77Skettenis return raw_type;
8117b725ae77Skettenis else
8118b725ae77Skettenis {
8119b725ae77Skettenis static char *name_buf = NULL;
8120b725ae77Skettenis static size_t name_len = 0;
8121b725ae77Skettenis int prefix_len = subtype_info - name;
8122b725ae77Skettenis LONGEST L, U;
8123b725ae77Skettenis struct type *type;
8124b725ae77Skettenis char *bounds_str;
8125b725ae77Skettenis int n;
8126b725ae77Skettenis
8127b725ae77Skettenis GROW_VECT (name_buf, name_len, prefix_len + 5);
8128b725ae77Skettenis strncpy (name_buf, name, prefix_len);
8129b725ae77Skettenis name_buf[prefix_len] = '\0';
8130b725ae77Skettenis
8131b725ae77Skettenis subtype_info += 5;
8132b725ae77Skettenis bounds_str = strchr (subtype_info, '_');
8133b725ae77Skettenis n = 1;
8134b725ae77Skettenis
8135b725ae77Skettenis if (*subtype_info == 'L')
8136b725ae77Skettenis {
8137b725ae77Skettenis if (!ada_scan_number (bounds_str, n, &L, &n)
8138b725ae77Skettenis && !scan_discrim_bound (bounds_str, n, dval, &L, &n))
8139b725ae77Skettenis return raw_type;
8140b725ae77Skettenis if (bounds_str[n] == '_')
8141b725ae77Skettenis n += 2;
8142b725ae77Skettenis else if (bounds_str[n] == '.') /* FIXME? SGI Workshop kludge. */
8143b725ae77Skettenis n += 1;
8144b725ae77Skettenis subtype_info += 1;
8145b725ae77Skettenis }
8146b725ae77Skettenis else
8147b725ae77Skettenis {
8148*11efff7fSkettenis int ok;
8149b725ae77Skettenis strcpy (name_buf + prefix_len, "___L");
8150*11efff7fSkettenis L = get_int_var_value (name_buf, &ok);
8151*11efff7fSkettenis if (!ok)
8152*11efff7fSkettenis {
8153*11efff7fSkettenis lim_warning ("Unknown lower bound, using 1.");
8154*11efff7fSkettenis L = 1;
8155*11efff7fSkettenis }
8156b725ae77Skettenis }
8157b725ae77Skettenis
8158b725ae77Skettenis if (*subtype_info == 'U')
8159b725ae77Skettenis {
8160b725ae77Skettenis if (!ada_scan_number (bounds_str, n, &U, &n)
8161b725ae77Skettenis && !scan_discrim_bound (bounds_str, n, dval, &U, &n))
8162b725ae77Skettenis return raw_type;
8163b725ae77Skettenis }
8164b725ae77Skettenis else
8165b725ae77Skettenis {
8166*11efff7fSkettenis int ok;
8167b725ae77Skettenis strcpy (name_buf + prefix_len, "___U");
8168*11efff7fSkettenis U = get_int_var_value (name_buf, &ok);
8169*11efff7fSkettenis if (!ok)
8170*11efff7fSkettenis {
8171*11efff7fSkettenis lim_warning ("Unknown upper bound, using %ld.", (long) L);
8172*11efff7fSkettenis U = L;
8173*11efff7fSkettenis }
8174b725ae77Skettenis }
8175b725ae77Skettenis
8176b725ae77Skettenis if (objfile == NULL)
8177b725ae77Skettenis objfile = TYPE_OBJFILE (base_type);
8178b725ae77Skettenis type = create_range_type (alloc_type (objfile), base_type, L, U);
8179b725ae77Skettenis TYPE_NAME (type) = name;
8180b725ae77Skettenis return type;
8181b725ae77Skettenis }
8182b725ae77Skettenis }
8183b725ae77Skettenis
8184b725ae77Skettenis /* True iff NAME is the name of a range type. */
8185*11efff7fSkettenis
8186b725ae77Skettenis int
ada_is_range_type_name(const char * name)8187b725ae77Skettenis ada_is_range_type_name (const char *name)
8188b725ae77Skettenis {
8189b725ae77Skettenis return (name != NULL && strstr (name, "___XD"));
8190b725ae77Skettenis }
8191b725ae77Skettenis
8192b725ae77Skettenis
8193b725ae77Skettenis /* Modular types */
8194b725ae77Skettenis
8195b725ae77Skettenis /* True iff TYPE is an Ada modular type. */
8196*11efff7fSkettenis
8197b725ae77Skettenis int
ada_is_modular_type(struct type * type)8198b725ae77Skettenis ada_is_modular_type (struct type *type)
8199b725ae77Skettenis {
8200*11efff7fSkettenis struct type *subranged_type = base_type (type);
8201b725ae77Skettenis
8202b725ae77Skettenis return (subranged_type != NULL && TYPE_CODE (type) == TYPE_CODE_RANGE
8203b725ae77Skettenis && TYPE_CODE (subranged_type) != TYPE_CODE_ENUM
8204b725ae77Skettenis && TYPE_UNSIGNED (subranged_type));
8205b725ae77Skettenis }
8206b725ae77Skettenis
8207b725ae77Skettenis /* Assuming ada_is_modular_type (TYPE), the modulus of TYPE. */
8208*11efff7fSkettenis
8209*11efff7fSkettenis ULONGEST
ada_modulus(struct type * type)8210b725ae77Skettenis ada_modulus (struct type * type)
8211b725ae77Skettenis {
8212*11efff7fSkettenis return (ULONGEST) TYPE_HIGH_BOUND (type) + 1;
8213b725ae77Skettenis }
8214b725ae77Skettenis
8215b725ae77Skettenis /* Operators */
8216*11efff7fSkettenis /* Information about operators given special treatment in functions
8217*11efff7fSkettenis below. */
8218*11efff7fSkettenis /* Format: OP_DEFN (<operator>, <operator length>, <# args>, <binop>). */
8219*11efff7fSkettenis
8220*11efff7fSkettenis #define ADA_OPERATORS \
8221*11efff7fSkettenis OP_DEFN (OP_VAR_VALUE, 4, 0, 0) \
8222*11efff7fSkettenis OP_DEFN (BINOP_IN_BOUNDS, 3, 2, 0) \
8223*11efff7fSkettenis OP_DEFN (TERNOP_IN_RANGE, 1, 3, 0) \
8224*11efff7fSkettenis OP_DEFN (OP_ATR_FIRST, 1, 2, 0) \
8225*11efff7fSkettenis OP_DEFN (OP_ATR_LAST, 1, 2, 0) \
8226*11efff7fSkettenis OP_DEFN (OP_ATR_LENGTH, 1, 2, 0) \
8227*11efff7fSkettenis OP_DEFN (OP_ATR_IMAGE, 1, 2, 0) \
8228*11efff7fSkettenis OP_DEFN (OP_ATR_MAX, 1, 3, 0) \
8229*11efff7fSkettenis OP_DEFN (OP_ATR_MIN, 1, 3, 0) \
8230*11efff7fSkettenis OP_DEFN (OP_ATR_MODULUS, 1, 1, 0) \
8231*11efff7fSkettenis OP_DEFN (OP_ATR_POS, 1, 2, 0) \
8232*11efff7fSkettenis OP_DEFN (OP_ATR_SIZE, 1, 1, 0) \
8233*11efff7fSkettenis OP_DEFN (OP_ATR_TAG, 1, 1, 0) \
8234*11efff7fSkettenis OP_DEFN (OP_ATR_VAL, 1, 2, 0) \
8235*11efff7fSkettenis OP_DEFN (UNOP_QUAL, 3, 1, 0) \
8236*11efff7fSkettenis OP_DEFN (UNOP_IN_RANGE, 3, 1, 0)
8237*11efff7fSkettenis
8238*11efff7fSkettenis static void
ada_operator_length(struct expression * exp,int pc,int * oplenp,int * argsp)8239*11efff7fSkettenis ada_operator_length (struct expression *exp, int pc, int *oplenp, int *argsp)
8240*11efff7fSkettenis {
8241*11efff7fSkettenis switch (exp->elts[pc - 1].opcode)
8242*11efff7fSkettenis {
8243*11efff7fSkettenis default:
8244*11efff7fSkettenis operator_length_standard (exp, pc, oplenp, argsp);
8245*11efff7fSkettenis break;
8246*11efff7fSkettenis
8247*11efff7fSkettenis #define OP_DEFN(op, len, args, binop) \
8248*11efff7fSkettenis case op: *oplenp = len; *argsp = args; break;
8249*11efff7fSkettenis ADA_OPERATORS;
8250*11efff7fSkettenis #undef OP_DEFN
8251*11efff7fSkettenis }
8252*11efff7fSkettenis }
8253*11efff7fSkettenis
8254*11efff7fSkettenis static char *
ada_op_name(enum exp_opcode opcode)8255*11efff7fSkettenis ada_op_name (enum exp_opcode opcode)
8256*11efff7fSkettenis {
8257*11efff7fSkettenis switch (opcode)
8258*11efff7fSkettenis {
8259*11efff7fSkettenis default:
8260*11efff7fSkettenis return op_name_standard (opcode);
8261*11efff7fSkettenis #define OP_DEFN(op, len, args, binop) case op: return #op;
8262*11efff7fSkettenis ADA_OPERATORS;
8263*11efff7fSkettenis #undef OP_DEFN
8264*11efff7fSkettenis }
8265*11efff7fSkettenis }
8266*11efff7fSkettenis
8267*11efff7fSkettenis /* As for operator_length, but assumes PC is pointing at the first
8268*11efff7fSkettenis element of the operator, and gives meaningful results only for the
8269*11efff7fSkettenis Ada-specific operators. */
8270*11efff7fSkettenis
8271*11efff7fSkettenis static void
ada_forward_operator_length(struct expression * exp,int pc,int * oplenp,int * argsp)8272*11efff7fSkettenis ada_forward_operator_length (struct expression *exp, int pc,
8273*11efff7fSkettenis int *oplenp, int *argsp)
8274*11efff7fSkettenis {
8275*11efff7fSkettenis switch (exp->elts[pc].opcode)
8276*11efff7fSkettenis {
8277*11efff7fSkettenis default:
8278*11efff7fSkettenis *oplenp = *argsp = 0;
8279*11efff7fSkettenis break;
8280*11efff7fSkettenis #define OP_DEFN(op, len, args, binop) \
8281*11efff7fSkettenis case op: *oplenp = len; *argsp = args; break;
8282*11efff7fSkettenis ADA_OPERATORS;
8283*11efff7fSkettenis #undef OP_DEFN
8284*11efff7fSkettenis }
8285*11efff7fSkettenis }
8286*11efff7fSkettenis
8287*11efff7fSkettenis static int
ada_dump_subexp_body(struct expression * exp,struct ui_file * stream,int elt)8288*11efff7fSkettenis ada_dump_subexp_body (struct expression *exp, struct ui_file *stream, int elt)
8289*11efff7fSkettenis {
8290*11efff7fSkettenis enum exp_opcode op = exp->elts[elt].opcode;
8291*11efff7fSkettenis int oplen, nargs;
8292*11efff7fSkettenis int pc = elt;
8293*11efff7fSkettenis int i;
8294*11efff7fSkettenis
8295*11efff7fSkettenis ada_forward_operator_length (exp, elt, &oplen, &nargs);
8296*11efff7fSkettenis
8297*11efff7fSkettenis switch (op)
8298*11efff7fSkettenis {
8299*11efff7fSkettenis /* Ada attributes ('Foo). */
8300*11efff7fSkettenis case OP_ATR_FIRST:
8301*11efff7fSkettenis case OP_ATR_LAST:
8302*11efff7fSkettenis case OP_ATR_LENGTH:
8303*11efff7fSkettenis case OP_ATR_IMAGE:
8304*11efff7fSkettenis case OP_ATR_MAX:
8305*11efff7fSkettenis case OP_ATR_MIN:
8306*11efff7fSkettenis case OP_ATR_MODULUS:
8307*11efff7fSkettenis case OP_ATR_POS:
8308*11efff7fSkettenis case OP_ATR_SIZE:
8309*11efff7fSkettenis case OP_ATR_TAG:
8310*11efff7fSkettenis case OP_ATR_VAL:
8311*11efff7fSkettenis break;
8312*11efff7fSkettenis
8313*11efff7fSkettenis case UNOP_IN_RANGE:
8314*11efff7fSkettenis case UNOP_QUAL:
8315*11efff7fSkettenis fprintf_filtered (stream, "Type @");
8316*11efff7fSkettenis gdb_print_host_address (exp->elts[pc + 1].type, stream);
8317*11efff7fSkettenis fprintf_filtered (stream, " (");
8318*11efff7fSkettenis type_print (exp->elts[pc + 1].type, NULL, stream, 0);
8319*11efff7fSkettenis fprintf_filtered (stream, ")");
8320*11efff7fSkettenis break;
8321*11efff7fSkettenis case BINOP_IN_BOUNDS:
8322*11efff7fSkettenis fprintf_filtered (stream, " (%d)", (int) exp->elts[pc + 2].longconst);
8323*11efff7fSkettenis break;
8324*11efff7fSkettenis case TERNOP_IN_RANGE:
8325*11efff7fSkettenis break;
8326*11efff7fSkettenis
8327*11efff7fSkettenis default:
8328*11efff7fSkettenis return dump_subexp_body_standard (exp, stream, elt);
8329*11efff7fSkettenis }
8330*11efff7fSkettenis
8331*11efff7fSkettenis elt += oplen;
8332*11efff7fSkettenis for (i = 0; i < nargs; i += 1)
8333*11efff7fSkettenis elt = dump_subexp (exp, stream, elt);
8334*11efff7fSkettenis
8335*11efff7fSkettenis return elt;
8336*11efff7fSkettenis }
8337*11efff7fSkettenis
8338*11efff7fSkettenis /* The Ada extension of print_subexp (q.v.). */
8339*11efff7fSkettenis
8340*11efff7fSkettenis static void
ada_print_subexp(struct expression * exp,int * pos,struct ui_file * stream,enum precedence prec)8341*11efff7fSkettenis ada_print_subexp (struct expression *exp, int *pos,
8342*11efff7fSkettenis struct ui_file *stream, enum precedence prec)
8343*11efff7fSkettenis {
8344*11efff7fSkettenis int oplen, nargs;
8345*11efff7fSkettenis int pc = *pos;
8346*11efff7fSkettenis enum exp_opcode op = exp->elts[pc].opcode;
8347*11efff7fSkettenis
8348*11efff7fSkettenis ada_forward_operator_length (exp, pc, &oplen, &nargs);
8349*11efff7fSkettenis
8350*11efff7fSkettenis switch (op)
8351*11efff7fSkettenis {
8352*11efff7fSkettenis default:
8353*11efff7fSkettenis print_subexp_standard (exp, pos, stream, prec);
8354*11efff7fSkettenis return;
8355*11efff7fSkettenis
8356*11efff7fSkettenis case OP_VAR_VALUE:
8357*11efff7fSkettenis *pos += oplen;
8358*11efff7fSkettenis fputs_filtered (SYMBOL_NATURAL_NAME (exp->elts[pc + 2].symbol), stream);
8359*11efff7fSkettenis return;
8360*11efff7fSkettenis
8361*11efff7fSkettenis case BINOP_IN_BOUNDS:
8362*11efff7fSkettenis *pos += oplen;
8363*11efff7fSkettenis print_subexp (exp, pos, stream, PREC_SUFFIX);
8364*11efff7fSkettenis fputs_filtered (" in ", stream);
8365*11efff7fSkettenis print_subexp (exp, pos, stream, PREC_SUFFIX);
8366*11efff7fSkettenis fputs_filtered ("'range", stream);
8367*11efff7fSkettenis if (exp->elts[pc + 1].longconst > 1)
8368*11efff7fSkettenis fprintf_filtered (stream, "(%ld)",
8369*11efff7fSkettenis (long) exp->elts[pc + 1].longconst);
8370*11efff7fSkettenis return;
8371*11efff7fSkettenis
8372*11efff7fSkettenis case TERNOP_IN_RANGE:
8373*11efff7fSkettenis *pos += oplen;
8374*11efff7fSkettenis if (prec >= PREC_EQUAL)
8375*11efff7fSkettenis fputs_filtered ("(", stream);
8376*11efff7fSkettenis print_subexp (exp, pos, stream, PREC_SUFFIX);
8377*11efff7fSkettenis fputs_filtered (" in ", stream);
8378*11efff7fSkettenis print_subexp (exp, pos, stream, PREC_EQUAL);
8379*11efff7fSkettenis fputs_filtered (" .. ", stream);
8380*11efff7fSkettenis print_subexp (exp, pos, stream, PREC_EQUAL);
8381*11efff7fSkettenis if (prec >= PREC_EQUAL)
8382*11efff7fSkettenis fputs_filtered (")", stream);
8383*11efff7fSkettenis return;
8384*11efff7fSkettenis
8385*11efff7fSkettenis case OP_ATR_FIRST:
8386*11efff7fSkettenis case OP_ATR_LAST:
8387*11efff7fSkettenis case OP_ATR_LENGTH:
8388*11efff7fSkettenis case OP_ATR_IMAGE:
8389*11efff7fSkettenis case OP_ATR_MAX:
8390*11efff7fSkettenis case OP_ATR_MIN:
8391*11efff7fSkettenis case OP_ATR_MODULUS:
8392*11efff7fSkettenis case OP_ATR_POS:
8393*11efff7fSkettenis case OP_ATR_SIZE:
8394*11efff7fSkettenis case OP_ATR_TAG:
8395*11efff7fSkettenis case OP_ATR_VAL:
8396*11efff7fSkettenis *pos += oplen;
8397*11efff7fSkettenis if (exp->elts[*pos].opcode == OP_TYPE)
8398*11efff7fSkettenis {
8399*11efff7fSkettenis if (TYPE_CODE (exp->elts[*pos + 1].type) != TYPE_CODE_VOID)
8400*11efff7fSkettenis LA_PRINT_TYPE (exp->elts[*pos + 1].type, "", stream, 0, 0);
8401*11efff7fSkettenis *pos += 3;
8402*11efff7fSkettenis }
8403*11efff7fSkettenis else
8404*11efff7fSkettenis print_subexp (exp, pos, stream, PREC_SUFFIX);
8405*11efff7fSkettenis fprintf_filtered (stream, "'%s", ada_attribute_name (op));
8406*11efff7fSkettenis if (nargs > 1)
8407*11efff7fSkettenis {
8408*11efff7fSkettenis int tem;
8409*11efff7fSkettenis for (tem = 1; tem < nargs; tem += 1)
8410*11efff7fSkettenis {
8411*11efff7fSkettenis fputs_filtered ((tem == 1) ? " (" : ", ", stream);
8412*11efff7fSkettenis print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
8413*11efff7fSkettenis }
8414*11efff7fSkettenis fputs_filtered (")", stream);
8415*11efff7fSkettenis }
8416*11efff7fSkettenis return;
8417*11efff7fSkettenis
8418*11efff7fSkettenis case UNOP_QUAL:
8419*11efff7fSkettenis *pos += oplen;
8420*11efff7fSkettenis type_print (exp->elts[pc + 1].type, "", stream, 0);
8421*11efff7fSkettenis fputs_filtered ("'(", stream);
8422*11efff7fSkettenis print_subexp (exp, pos, stream, PREC_PREFIX);
8423*11efff7fSkettenis fputs_filtered (")", stream);
8424*11efff7fSkettenis return;
8425*11efff7fSkettenis
8426*11efff7fSkettenis case UNOP_IN_RANGE:
8427*11efff7fSkettenis *pos += oplen;
8428*11efff7fSkettenis print_subexp (exp, pos, stream, PREC_SUFFIX);
8429*11efff7fSkettenis fputs_filtered (" in ", stream);
8430*11efff7fSkettenis LA_PRINT_TYPE (exp->elts[pc + 1].type, "", stream, 1, 0);
8431*11efff7fSkettenis return;
8432*11efff7fSkettenis }
8433*11efff7fSkettenis }
8434b725ae77Skettenis
8435b725ae77Skettenis /* Table mapping opcodes into strings for printing operators
8436b725ae77Skettenis and precedences of the operators. */
8437b725ae77Skettenis
8438b725ae77Skettenis static const struct op_print ada_op_print_tab[] = {
8439b725ae77Skettenis {":=", BINOP_ASSIGN, PREC_ASSIGN, 1},
8440b725ae77Skettenis {"or else", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
8441b725ae77Skettenis {"and then", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
8442b725ae77Skettenis {"or", BINOP_BITWISE_IOR, PREC_BITWISE_IOR, 0},
8443b725ae77Skettenis {"xor", BINOP_BITWISE_XOR, PREC_BITWISE_XOR, 0},
8444b725ae77Skettenis {"and", BINOP_BITWISE_AND, PREC_BITWISE_AND, 0},
8445b725ae77Skettenis {"=", BINOP_EQUAL, PREC_EQUAL, 0},
8446b725ae77Skettenis {"/=", BINOP_NOTEQUAL, PREC_EQUAL, 0},
8447b725ae77Skettenis {"<=", BINOP_LEQ, PREC_ORDER, 0},
8448b725ae77Skettenis {">=", BINOP_GEQ, PREC_ORDER, 0},
8449b725ae77Skettenis {">", BINOP_GTR, PREC_ORDER, 0},
8450b725ae77Skettenis {"<", BINOP_LESS, PREC_ORDER, 0},
8451b725ae77Skettenis {">>", BINOP_RSH, PREC_SHIFT, 0},
8452b725ae77Skettenis {"<<", BINOP_LSH, PREC_SHIFT, 0},
8453b725ae77Skettenis {"+", BINOP_ADD, PREC_ADD, 0},
8454b725ae77Skettenis {"-", BINOP_SUB, PREC_ADD, 0},
8455b725ae77Skettenis {"&", BINOP_CONCAT, PREC_ADD, 0},
8456b725ae77Skettenis {"*", BINOP_MUL, PREC_MUL, 0},
8457b725ae77Skettenis {"/", BINOP_DIV, PREC_MUL, 0},
8458b725ae77Skettenis {"rem", BINOP_REM, PREC_MUL, 0},
8459b725ae77Skettenis {"mod", BINOP_MOD, PREC_MUL, 0},
8460b725ae77Skettenis {"**", BINOP_EXP, PREC_REPEAT, 0},
8461b725ae77Skettenis {"@", BINOP_REPEAT, PREC_REPEAT, 0},
8462b725ae77Skettenis {"-", UNOP_NEG, PREC_PREFIX, 0},
8463b725ae77Skettenis {"+", UNOP_PLUS, PREC_PREFIX, 0},
8464b725ae77Skettenis {"not ", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
8465b725ae77Skettenis {"not ", UNOP_COMPLEMENT, PREC_PREFIX, 0},
8466b725ae77Skettenis {"abs ", UNOP_ABS, PREC_PREFIX, 0},
8467*11efff7fSkettenis {".all", UNOP_IND, PREC_SUFFIX, 1},
8468*11efff7fSkettenis {"'access", UNOP_ADDR, PREC_SUFFIX, 1},
8469*11efff7fSkettenis {"'size", OP_ATR_SIZE, PREC_SUFFIX, 1},
8470b725ae77Skettenis {NULL, 0, 0, 0}
8471b725ae77Skettenis };
8472b725ae77Skettenis
8473*11efff7fSkettenis /* Fundamental Ada Types */
8474b725ae77Skettenis
8475b725ae77Skettenis /* Create a fundamental Ada type using default reasonable for the current
8476b725ae77Skettenis target machine.
8477b725ae77Skettenis
8478b725ae77Skettenis Some object/debugging file formats (DWARF version 1, COFF, etc) do not
8479b725ae77Skettenis define fundamental types such as "int" or "double". Others (stabs or
8480b725ae77Skettenis DWARF version 2, etc) do define fundamental types. For the formats which
8481b725ae77Skettenis don't provide fundamental types, gdb can create such types using this
8482b725ae77Skettenis function.
8483b725ae77Skettenis
8484b725ae77Skettenis FIXME: Some compilers distinguish explicitly signed integral types
8485b725ae77Skettenis (signed short, signed int, signed long) from "regular" integral types
8486b725ae77Skettenis (short, int, long) in the debugging information. There is some dis-
8487b725ae77Skettenis agreement as to how useful this feature is. In particular, gcc does
8488b725ae77Skettenis not support this. Also, only some debugging formats allow the
8489b725ae77Skettenis distinction to be passed on to a debugger. For now, we always just
8490b725ae77Skettenis use "short", "int", or "long" as the type name, for both the implicit
8491b725ae77Skettenis and explicitly signed types. This also makes life easier for the
8492b725ae77Skettenis gdb test suite since we don't have to account for the differences
8493b725ae77Skettenis in output depending upon what the compiler and debugging format
8494b725ae77Skettenis support. We will probably have to re-examine the issue when gdb
8495b725ae77Skettenis starts taking it's fundamental type information directly from the
8496b725ae77Skettenis debugging information supplied by the compiler. fnf@cygnus.com */
8497b725ae77Skettenis
8498b725ae77Skettenis static struct type *
ada_create_fundamental_type(struct objfile * objfile,int typeid)8499b725ae77Skettenis ada_create_fundamental_type (struct objfile *objfile, int typeid)
8500b725ae77Skettenis {
8501b725ae77Skettenis struct type *type = NULL;
8502b725ae77Skettenis
8503b725ae77Skettenis switch (typeid)
8504b725ae77Skettenis {
8505b725ae77Skettenis default:
8506b725ae77Skettenis /* FIXME: For now, if we are asked to produce a type not in this
8507b725ae77Skettenis language, create the equivalent of a C integer type with the
8508b725ae77Skettenis name "<?type?>". When all the dust settles from the type
8509b725ae77Skettenis reconstruction work, this should probably become an error. */
8510b725ae77Skettenis type = init_type (TYPE_CODE_INT,
8511b725ae77Skettenis TARGET_INT_BIT / TARGET_CHAR_BIT,
8512b725ae77Skettenis 0, "<?type?>", objfile);
8513b725ae77Skettenis warning ("internal error: no Ada fundamental type %d", typeid);
8514b725ae77Skettenis break;
8515b725ae77Skettenis case FT_VOID:
8516b725ae77Skettenis type = init_type (TYPE_CODE_VOID,
8517b725ae77Skettenis TARGET_CHAR_BIT / TARGET_CHAR_BIT,
8518b725ae77Skettenis 0, "void", objfile);
8519b725ae77Skettenis break;
8520b725ae77Skettenis case FT_CHAR:
8521b725ae77Skettenis type = init_type (TYPE_CODE_INT,
8522b725ae77Skettenis TARGET_CHAR_BIT / TARGET_CHAR_BIT,
8523b725ae77Skettenis 0, "character", objfile);
8524b725ae77Skettenis break;
8525b725ae77Skettenis case FT_SIGNED_CHAR:
8526b725ae77Skettenis type = init_type (TYPE_CODE_INT,
8527b725ae77Skettenis TARGET_CHAR_BIT / TARGET_CHAR_BIT,
8528b725ae77Skettenis 0, "signed char", objfile);
8529b725ae77Skettenis break;
8530b725ae77Skettenis case FT_UNSIGNED_CHAR:
8531b725ae77Skettenis type = init_type (TYPE_CODE_INT,
8532b725ae77Skettenis TARGET_CHAR_BIT / TARGET_CHAR_BIT,
8533b725ae77Skettenis TYPE_FLAG_UNSIGNED, "unsigned char", objfile);
8534b725ae77Skettenis break;
8535b725ae77Skettenis case FT_SHORT:
8536b725ae77Skettenis type = init_type (TYPE_CODE_INT,
8537b725ae77Skettenis TARGET_SHORT_BIT / TARGET_CHAR_BIT,
8538b725ae77Skettenis 0, "short_integer", objfile);
8539b725ae77Skettenis break;
8540b725ae77Skettenis case FT_SIGNED_SHORT:
8541b725ae77Skettenis type = init_type (TYPE_CODE_INT,
8542b725ae77Skettenis TARGET_SHORT_BIT / TARGET_CHAR_BIT,
8543b725ae77Skettenis 0, "short_integer", objfile);
8544b725ae77Skettenis break;
8545b725ae77Skettenis case FT_UNSIGNED_SHORT:
8546b725ae77Skettenis type = init_type (TYPE_CODE_INT,
8547b725ae77Skettenis TARGET_SHORT_BIT / TARGET_CHAR_BIT,
8548b725ae77Skettenis TYPE_FLAG_UNSIGNED, "unsigned short", objfile);
8549b725ae77Skettenis break;
8550b725ae77Skettenis case FT_INTEGER:
8551b725ae77Skettenis type = init_type (TYPE_CODE_INT,
8552b725ae77Skettenis TARGET_INT_BIT / TARGET_CHAR_BIT,
8553b725ae77Skettenis 0, "integer", objfile);
8554b725ae77Skettenis break;
8555b725ae77Skettenis case FT_SIGNED_INTEGER:
8556*11efff7fSkettenis type = init_type (TYPE_CODE_INT, TARGET_INT_BIT /
8557*11efff7fSkettenis TARGET_CHAR_BIT,
8558*11efff7fSkettenis 0, "integer", objfile); /* FIXME -fnf */
8559b725ae77Skettenis break;
8560b725ae77Skettenis case FT_UNSIGNED_INTEGER:
8561b725ae77Skettenis type = init_type (TYPE_CODE_INT,
8562b725ae77Skettenis TARGET_INT_BIT / TARGET_CHAR_BIT,
8563b725ae77Skettenis TYPE_FLAG_UNSIGNED, "unsigned int", objfile);
8564b725ae77Skettenis break;
8565b725ae77Skettenis case FT_LONG:
8566b725ae77Skettenis type = init_type (TYPE_CODE_INT,
8567b725ae77Skettenis TARGET_LONG_BIT / TARGET_CHAR_BIT,
8568b725ae77Skettenis 0, "long_integer", objfile);
8569b725ae77Skettenis break;
8570b725ae77Skettenis case FT_SIGNED_LONG:
8571b725ae77Skettenis type = init_type (TYPE_CODE_INT,
8572b725ae77Skettenis TARGET_LONG_BIT / TARGET_CHAR_BIT,
8573b725ae77Skettenis 0, "long_integer", objfile);
8574b725ae77Skettenis break;
8575b725ae77Skettenis case FT_UNSIGNED_LONG:
8576b725ae77Skettenis type = init_type (TYPE_CODE_INT,
8577b725ae77Skettenis TARGET_LONG_BIT / TARGET_CHAR_BIT,
8578b725ae77Skettenis TYPE_FLAG_UNSIGNED, "unsigned long", objfile);
8579b725ae77Skettenis break;
8580b725ae77Skettenis case FT_LONG_LONG:
8581b725ae77Skettenis type = init_type (TYPE_CODE_INT,
8582b725ae77Skettenis TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
8583b725ae77Skettenis 0, "long_long_integer", objfile);
8584b725ae77Skettenis break;
8585b725ae77Skettenis case FT_SIGNED_LONG_LONG:
8586b725ae77Skettenis type = init_type (TYPE_CODE_INT,
8587b725ae77Skettenis TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
8588b725ae77Skettenis 0, "long_long_integer", objfile);
8589b725ae77Skettenis break;
8590b725ae77Skettenis case FT_UNSIGNED_LONG_LONG:
8591b725ae77Skettenis type = init_type (TYPE_CODE_INT,
8592b725ae77Skettenis TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
8593b725ae77Skettenis TYPE_FLAG_UNSIGNED, "unsigned long long", objfile);
8594b725ae77Skettenis break;
8595b725ae77Skettenis case FT_FLOAT:
8596b725ae77Skettenis type = init_type (TYPE_CODE_FLT,
8597b725ae77Skettenis TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
8598b725ae77Skettenis 0, "float", objfile);
8599b725ae77Skettenis break;
8600b725ae77Skettenis case FT_DBL_PREC_FLOAT:
8601b725ae77Skettenis type = init_type (TYPE_CODE_FLT,
8602b725ae77Skettenis TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
8603b725ae77Skettenis 0, "long_float", objfile);
8604b725ae77Skettenis break;
8605b725ae77Skettenis case FT_EXT_PREC_FLOAT:
8606b725ae77Skettenis type = init_type (TYPE_CODE_FLT,
8607b725ae77Skettenis TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
8608b725ae77Skettenis 0, "long_long_float", objfile);
8609b725ae77Skettenis break;
8610b725ae77Skettenis }
8611b725ae77Skettenis return (type);
8612b725ae77Skettenis }
8613b725ae77Skettenis
8614*11efff7fSkettenis enum ada_primitive_types {
8615*11efff7fSkettenis ada_primitive_type_int,
8616*11efff7fSkettenis ada_primitive_type_long,
8617*11efff7fSkettenis ada_primitive_type_short,
8618*11efff7fSkettenis ada_primitive_type_char,
8619*11efff7fSkettenis ada_primitive_type_float,
8620*11efff7fSkettenis ada_primitive_type_double,
8621*11efff7fSkettenis ada_primitive_type_void,
8622*11efff7fSkettenis ada_primitive_type_long_long,
8623*11efff7fSkettenis ada_primitive_type_long_double,
8624*11efff7fSkettenis ada_primitive_type_natural,
8625*11efff7fSkettenis ada_primitive_type_positive,
8626*11efff7fSkettenis ada_primitive_type_system_address,
8627*11efff7fSkettenis nr_ada_primitive_types
8628*11efff7fSkettenis };
8629*11efff7fSkettenis
8630*11efff7fSkettenis static void
ada_language_arch_info(struct gdbarch * current_gdbarch,struct language_arch_info * lai)8631*11efff7fSkettenis ada_language_arch_info (struct gdbarch *current_gdbarch,
8632*11efff7fSkettenis struct language_arch_info *lai)
8633*11efff7fSkettenis {
8634*11efff7fSkettenis const struct builtin_type *builtin = builtin_type (current_gdbarch);
8635*11efff7fSkettenis lai->primitive_type_vector
8636*11efff7fSkettenis = GDBARCH_OBSTACK_CALLOC (current_gdbarch, nr_ada_primitive_types + 1,
8637*11efff7fSkettenis struct type *);
8638*11efff7fSkettenis lai->primitive_type_vector [ada_primitive_type_int] =
8639*11efff7fSkettenis init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT,
8640*11efff7fSkettenis 0, "integer", (struct objfile *) NULL);
8641*11efff7fSkettenis lai->primitive_type_vector [ada_primitive_type_long] =
8642*11efff7fSkettenis init_type (TYPE_CODE_INT, TARGET_LONG_BIT / TARGET_CHAR_BIT,
8643*11efff7fSkettenis 0, "long_integer", (struct objfile *) NULL);
8644*11efff7fSkettenis lai->primitive_type_vector [ada_primitive_type_short] =
8645*11efff7fSkettenis init_type (TYPE_CODE_INT, TARGET_SHORT_BIT / TARGET_CHAR_BIT,
8646*11efff7fSkettenis 0, "short_integer", (struct objfile *) NULL);
8647*11efff7fSkettenis lai->string_char_type =
8648*11efff7fSkettenis lai->primitive_type_vector [ada_primitive_type_char] =
8649*11efff7fSkettenis init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
8650*11efff7fSkettenis 0, "character", (struct objfile *) NULL);
8651*11efff7fSkettenis lai->primitive_type_vector [ada_primitive_type_float] =
8652*11efff7fSkettenis init_type (TYPE_CODE_FLT, TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
8653*11efff7fSkettenis 0, "float", (struct objfile *) NULL);
8654*11efff7fSkettenis lai->primitive_type_vector [ada_primitive_type_double] =
8655*11efff7fSkettenis init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
8656*11efff7fSkettenis 0, "long_float", (struct objfile *) NULL);
8657*11efff7fSkettenis lai->primitive_type_vector [ada_primitive_type_long_long] =
8658*11efff7fSkettenis init_type (TYPE_CODE_INT, TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
8659*11efff7fSkettenis 0, "long_long_integer", (struct objfile *) NULL);
8660*11efff7fSkettenis lai->primitive_type_vector [ada_primitive_type_long_double] =
8661*11efff7fSkettenis init_type (TYPE_CODE_FLT, TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
8662*11efff7fSkettenis 0, "long_long_float", (struct objfile *) NULL);
8663*11efff7fSkettenis lai->primitive_type_vector [ada_primitive_type_natural] =
8664*11efff7fSkettenis init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT,
8665*11efff7fSkettenis 0, "natural", (struct objfile *) NULL);
8666*11efff7fSkettenis lai->primitive_type_vector [ada_primitive_type_positive] =
8667*11efff7fSkettenis init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT,
8668*11efff7fSkettenis 0, "positive", (struct objfile *) NULL);
8669*11efff7fSkettenis lai->primitive_type_vector [ada_primitive_type_void] = builtin->builtin_void;
8670*11efff7fSkettenis
8671*11efff7fSkettenis lai->primitive_type_vector [ada_primitive_type_system_address] =
8672*11efff7fSkettenis lookup_pointer_type (init_type (TYPE_CODE_VOID, 1, 0, "void",
8673*11efff7fSkettenis (struct objfile *) NULL));
8674*11efff7fSkettenis TYPE_NAME (lai->primitive_type_vector [ada_primitive_type_system_address])
8675*11efff7fSkettenis = "system__address";
8676*11efff7fSkettenis }
8677*11efff7fSkettenis
8678*11efff7fSkettenis /* Language vector */
8679*11efff7fSkettenis
8680*11efff7fSkettenis /* Not really used, but needed in the ada_language_defn. */
8681*11efff7fSkettenis
8682*11efff7fSkettenis static void
emit_char(int c,struct ui_file * stream,int quoter)8683*11efff7fSkettenis emit_char (int c, struct ui_file *stream, int quoter)
8684*11efff7fSkettenis {
8685*11efff7fSkettenis ada_emit_char (c, stream, quoter, 1);
8686*11efff7fSkettenis }
8687*11efff7fSkettenis
8688*11efff7fSkettenis static int
parse(void)8689*11efff7fSkettenis parse (void)
8690*11efff7fSkettenis {
8691*11efff7fSkettenis warnings_issued = 0;
8692*11efff7fSkettenis return ada_parse ();
8693*11efff7fSkettenis }
8694*11efff7fSkettenis
8695*11efff7fSkettenis static const struct exp_descriptor ada_exp_descriptor = {
8696*11efff7fSkettenis ada_print_subexp,
8697*11efff7fSkettenis ada_operator_length,
8698*11efff7fSkettenis ada_op_name,
8699*11efff7fSkettenis ada_dump_subexp_body,
8700*11efff7fSkettenis ada_evaluate_subexp
8701*11efff7fSkettenis };
8702*11efff7fSkettenis
8703*11efff7fSkettenis const struct language_defn ada_language_defn = {
8704*11efff7fSkettenis "ada", /* Language name */
8705*11efff7fSkettenis language_ada,
8706*11efff7fSkettenis NULL,
8707*11efff7fSkettenis range_check_off,
8708*11efff7fSkettenis type_check_off,
8709*11efff7fSkettenis case_sensitive_on, /* Yes, Ada is case-insensitive, but
8710*11efff7fSkettenis that's not quite what this means. */
8711*11efff7fSkettenis array_row_major,
8712*11efff7fSkettenis &ada_exp_descriptor,
8713*11efff7fSkettenis parse,
8714*11efff7fSkettenis ada_error,
8715*11efff7fSkettenis resolve,
8716*11efff7fSkettenis ada_printchar, /* Print a character constant */
8717*11efff7fSkettenis ada_printstr, /* Function to print string constant */
8718*11efff7fSkettenis emit_char, /* Function to print single char (not used) */
8719*11efff7fSkettenis ada_create_fundamental_type, /* Create fundamental type in this language */
8720*11efff7fSkettenis ada_print_type, /* Print a type using appropriate syntax */
8721*11efff7fSkettenis ada_val_print, /* Print a value using appropriate syntax */
8722*11efff7fSkettenis ada_value_print, /* Print a top-level value */
8723*11efff7fSkettenis NULL, /* Language specific skip_trampoline */
8724*11efff7fSkettenis NULL, /* value_of_this */
8725*11efff7fSkettenis ada_lookup_symbol_nonlocal, /* Looking up non-local symbols. */
8726*11efff7fSkettenis basic_lookup_transparent_type, /* lookup_transparent_type */
8727*11efff7fSkettenis ada_la_decode, /* Language specific symbol demangler */
8728*11efff7fSkettenis NULL, /* Language specific class_name_from_physname */
8729*11efff7fSkettenis ada_op_print_tab, /* expression operators for printing */
8730*11efff7fSkettenis 0, /* c-style arrays */
8731*11efff7fSkettenis 1, /* String lower bound */
8732*11efff7fSkettenis NULL,
8733*11efff7fSkettenis ada_get_gdb_completer_word_break_characters,
8734*11efff7fSkettenis ada_language_arch_info,
8735*11efff7fSkettenis LANG_MAGIC
8736*11efff7fSkettenis };
8737*11efff7fSkettenis
8738b725ae77Skettenis void
_initialize_ada_language(void)8739*11efff7fSkettenis _initialize_ada_language (void)
8740b725ae77Skettenis {
8741*11efff7fSkettenis add_language (&ada_language_defn);
8742*11efff7fSkettenis
8743*11efff7fSkettenis varsize_limit = 65536;
8744*11efff7fSkettenis
8745*11efff7fSkettenis obstack_init (&symbol_list_obstack);
8746*11efff7fSkettenis
8747*11efff7fSkettenis decoded_names_store = htab_create_alloc
8748*11efff7fSkettenis (256, htab_hash_string, (int (*)(const void *, const void *)) streq,
8749*11efff7fSkettenis NULL, xcalloc, xfree);
8750b725ae77Skettenis }
8751