xref: /openbsd-src/gnu/usr.bin/binutils/gdb/ada-lang.c (revision 11efff7f3ac2b3cfeff0c0cddc14294d9b3aca4f)
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