X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fada-lang.c;h=f13866ed58fa5497a0f82ea3a49c653a1cef2f79;hb=6791b1172abea5867268c95a460aba1c66c2b6b0;hp=3289a8e5c8eef918370afe44298808210f9b864e;hpb=d5a22e77b56529eade787419ea80a7e9e7d2aa6f;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 3289a8e5c8..f13866ed58 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -1,6 +1,6 @@ /* Ada language support routines for GDB, the GNU debugger. - Copyright (C) 1992-2019 Free Software Foundation, Inc. + Copyright (C) 1992-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -196,6 +196,8 @@ static LONGEST pos_atr (struct value *); static struct value *value_pos_atr (struct type *, struct value *); +static struct value *val_atr (struct type *, LONGEST); + static struct value *value_val_atr (struct type *, struct value *); static struct symbol *standard_lookup (const char *, const struct block *, @@ -204,9 +206,6 @@ static struct symbol *standard_lookup (const char *, const struct block *, static struct value *ada_search_struct_field (const char *, struct value *, int, struct type *); -static struct value *ada_value_primitive_field (struct value *, int, int, - struct type *); - static int find_struct_field (const char *, struct type *, int, struct type **, int *, int *, int *, int *); @@ -216,9 +215,6 @@ static int ada_resolve_function (struct block_symbol *, int, static int ada_is_direct_array_type (struct type *); -static void ada_language_arch_info (struct gdbarch *, - struct language_arch_info *); - static struct value *ada_index_struct_field (int, struct value *, int, struct type *); @@ -332,23 +328,6 @@ static const char *known_auxiliary_function_name_patterns[] = { static struct cmd_list_element *maint_set_ada_cmdlist; static struct cmd_list_element *maint_show_ada_cmdlist; -/* Implement the "maintenance set ada" (prefix) command. */ - -static void -maint_set_ada_cmd (const char *args, int from_tty) -{ - help_list (maint_set_ada_cmdlist, "maintenance set ada ", all_commands, - gdb_stdout); -} - -/* Implement the "maintenance show ada" (prefix) command. */ - -static void -maint_show_ada_cmd (const char *args, int from_tty) -{ - cmd_show_list (maint_show_ada_cmdlist, from_tty, ""); -} - /* The "maintenance ada set/show ignore-descriptive-type" value. */ static bool ada_ignore_descriptive_types_p = false; @@ -471,7 +450,7 @@ get_ada_pspace_data (struct program_space *pspace) static struct type * ada_typedef_target_type (struct type *type) { - while (TYPE_CODE (type) == TYPE_CODE_TYPEDEF) + while (type->code () == TYPE_CODE_TYPEDEF) type = TYPE_TARGET_TYPE (type); return type; } @@ -509,33 +488,6 @@ add_angle_brackets (const char *str) return string_printf ("<%s>", str); } -static const char * -ada_get_gdb_completer_word_break_characters (void) -{ - return ada_completer_word_break_characters; -} - -/* Print an array element index using the Ada syntax. */ - -static void -ada_print_array_index (struct value *index_value, struct ui_file *stream, - const struct value_print_options *options) -{ - LA_VALUE_PRINT (index_value, stream, options); - fprintf_filtered (stream, " => "); -} - -/* la_watch_location_expression for Ada. */ - -static gdb::unique_xmalloc_ptr -ada_watch_location_expression (struct type *type, CORE_ADDR addr) -{ - type = check_typedef (TYPE_TARGET_TYPE (check_typedef (type))); - std::string name = type_to_string (type); - return gdb::unique_xmalloc_ptr - (xstrprintf ("{%s} %s", name.c_str (), core_addr_to_string (addr))); -} - /* Assuming V points to an array of S objects, make sure that it contains at least M objects, updating V and S as necessary. */ @@ -591,13 +543,13 @@ ada_get_field_index (const struct type *type, const char *field_name, int fieldno; struct type *struct_type = check_typedef ((struct type *) type); - for (fieldno = 0; fieldno < TYPE_NFIELDS (struct_type); fieldno++) + for (fieldno = 0; fieldno < struct_type->num_fields (); fieldno++) if (field_name_match (TYPE_FIELD_NAME (struct_type, fieldno), field_name)) return fieldno; if (!maybe_missing) error (_("Unable to find field %s in struct %s. Aborting"), - field_name, TYPE_NAME (struct_type)); + field_name, struct_type->name ()); return -1; } @@ -769,13 +721,27 @@ min_of_type (struct type *t) LONGEST ada_discrete_type_high_bound (struct type *type) { - type = resolve_dynamic_type (type, NULL, 0); - switch (TYPE_CODE (type)) + type = resolve_dynamic_type (type, {}, 0); + switch (type->code ()) { case TYPE_CODE_RANGE: - return TYPE_HIGH_BOUND (type); + { + const dynamic_prop &high = type->bounds ()->high; + + if (high.kind () == PROP_CONST) + return high.const_val (); + else + { + gdb_assert (high.kind () == PROP_UNDEFINED); + + /* This happens when trying to evaluate a type's dynamic bound + without a live target. There is nothing relevant for us to + return here, so return 0. */ + return 0; + } + } case TYPE_CODE_ENUM: - return TYPE_FIELD_ENUMVAL (type, TYPE_NFIELDS (type) - 1); + return TYPE_FIELD_ENUMVAL (type, type->num_fields () - 1); case TYPE_CODE_BOOL: return 1; case TYPE_CODE_CHAR: @@ -790,11 +756,25 @@ ada_discrete_type_high_bound (struct type *type) LONGEST ada_discrete_type_low_bound (struct type *type) { - type = resolve_dynamic_type (type, NULL, 0); - switch (TYPE_CODE (type)) + type = resolve_dynamic_type (type, {}, 0); + switch (type->code ()) { case TYPE_CODE_RANGE: - return TYPE_LOW_BOUND (type); + { + const dynamic_prop &low = type->bounds ()->low; + + if (low.kind () == PROP_CONST) + return low.const_val (); + else + { + gdb_assert (low.kind () == PROP_UNDEFINED); + + /* This happens when trying to evaluate a type's dynamic bound + without a live target. There is nothing relevant for us to + return here, so return 0. */ + return 0; + } + } case TYPE_CODE_ENUM: return TYPE_FIELD_ENUMVAL (type, 0); case TYPE_CODE_BOOL: @@ -813,7 +793,7 @@ ada_discrete_type_low_bound (struct type *type) static struct type * get_base_type (struct type *type) { - while (type != NULL && TYPE_CODE (type) == TYPE_CODE_RANGE) + while (type != NULL && type->code () == TYPE_CODE_RANGE) { if (type == TYPE_TARGET_TYPE (type) || TYPE_TARGET_TYPE (type) == NULL) return type; @@ -834,9 +814,9 @@ ada_get_decoded_value (struct value *value) if (ada_is_array_descriptor_type (type) || (ada_is_constrained_packed_array_type (type) - && TYPE_CODE (type) != TYPE_CODE_PTR)) + && type->code () != TYPE_CODE_PTR)) { - if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF) /* array access type. */ + if (type->code () == TYPE_CODE_TYPEDEF) /* array access type. */ value = ada_coerce_to_simple_array_ptr (value); else value = ada_coerce_to_simple_array (value); @@ -896,18 +876,11 @@ ada_main_name (void) if (msym.minsym != NULL) { - CORE_ADDR main_program_name_addr; - int err_code; - - main_program_name_addr = BMSYMBOL_VALUE_ADDRESS (msym); + CORE_ADDR main_program_name_addr = BMSYMBOL_VALUE_ADDRESS (msym); if (main_program_name_addr == 0) error (_("Invalid address for Ada main program name.")); - target_read_string (main_program_name_addr, &main_program_name, - 1024, &err_code); - - if (err_code != 0) - return NULL; + main_program_name = target_read_string (main_program_name_addr, 1024); return main_program_name.get (); } @@ -1016,17 +989,17 @@ ada_encode (const char *decoded) to next call. */ static char * -ada_fold_name (const char *name) +ada_fold_name (gdb::string_view name) { static char *fold_buffer = NULL; static size_t fold_buffer_size = 0; - int len = strlen (name); + int len = name.size (); GROW_VECT (fold_buffer, fold_buffer_size, len + 1); if (name[0] == '\'') { - strncpy (fold_buffer, name + 1, len - 2); + strncpy (fold_buffer, name.data () + 1, len - 2); fold_buffer[len - 2] = '\000'; } else @@ -1376,7 +1349,7 @@ ada_decode_symbol (const struct general_symbol_info *arg) if (!gsymbol->ada_mangled) { - std::string decoded = ada_decode (gsymbol->name); + std::string decoded = ada_decode (gsymbol->linkage_name ()); struct obstack *obstack = gsymbol->language_specific.obstack; gsymbol->ada_mangled = 1; @@ -1408,45 +1381,6 @@ ada_la_decode (const char *encoded, int options) return xstrdup (ada_decode (encoded).c_str ()); } -/* Implement la_sniff_from_mangled_name for Ada. */ - -static int -ada_sniff_from_mangled_name (const char *mangled, char **out) -{ - std::string demangled = ada_decode (mangled); - - *out = NULL; - - if (demangled != mangled && demangled[0] != '<') - { - /* Set the gsymbol language to Ada, but still return 0. - Two reasons for that: - - 1. For Ada, we prefer computing the symbol's decoded name - on the fly rather than pre-compute it, in order to save - memory (Ada projects are typically very large). - - 2. There are some areas in the definition of the GNAT - encoding where, with a bit of bad luck, we might be able - to decode a non-Ada symbol, generating an incorrect - demangled name (Eg: names ending with "TB" for instance - are identified as task bodies and so stripped from - the decoded name returned). - - Returning 1, here, but not setting *DEMANGLED, helps us get a - little bit of the best of both worlds. Because we're last, - we should not affect any of the other languages that were - able to demangle the symbol before us; we get to correctly - tag Ada symbols as such; and even if we incorrectly tagged a - non-Ada symbol, which should be rare, any routing through the - Ada language should be transparent (Ada tries to behave much - like C/C++ with non-Ada symbols). */ - return 1; - } - - return 0; -} - /* Arrays */ @@ -1481,7 +1415,7 @@ ada_fixup_array_indexes_type (struct type *index_desc_type) if (index_desc_type == NULL) return; - gdb_assert (TYPE_NFIELDS (index_desc_type) > 0); + gdb_assert (index_desc_type->num_fields () > 0); /* Check if INDEX_DESC_TYPE follows the older encoding (it is sufficient to check one field only, no need to check them all). If not, return @@ -1490,34 +1424,22 @@ ada_fixup_array_indexes_type (struct type *index_desc_type) If our INDEX_DESC_TYPE was generated using the older encoding, the field type should be a meaningless integer type whose name is not equal to the field name. */ - if (TYPE_NAME (TYPE_FIELD_TYPE (index_desc_type, 0)) != NULL - && strcmp (TYPE_NAME (TYPE_FIELD_TYPE (index_desc_type, 0)), + if (index_desc_type->field (0).type ()->name () != NULL + && strcmp (index_desc_type->field (0).type ()->name (), TYPE_FIELD_NAME (index_desc_type, 0)) == 0) return; /* Fixup each field of INDEX_DESC_TYPE. */ - for (i = 0; i < TYPE_NFIELDS (index_desc_type); i++) + for (i = 0; i < index_desc_type->num_fields (); i++) { const char *name = TYPE_FIELD_NAME (index_desc_type, i); struct type *raw_type = ada_check_typedef (ada_find_any_type (name)); if (raw_type) - TYPE_FIELD_TYPE (index_desc_type, i) = raw_type; + index_desc_type->field (i).set_type (raw_type); } } -/* Names of MAX_ADA_DIMENS bounds in P_BOUNDS fields of array descriptors. */ - -static const char *bound_name[] = { - "LB0", "UB0", "LB1", "UB1", "LB2", "UB2", "LB3", "UB3", - "LB4", "UB4", "LB5", "UB5", "LB6", "UB6", "LB7", "UB7" -}; - -/* Maximum number of array dimensions we are prepared to handle. */ - -#define MAX_ADA_DIMENS (sizeof(bound_name) / (2*sizeof(char *))) - - /* The desc_* routines return primitive portions of array descriptors (fat pointers). */ @@ -1530,12 +1452,12 @@ desc_base_type (struct type *type) if (type == NULL) return NULL; type = ada_check_typedef (type); - if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF) + if (type->code () == TYPE_CODE_TYPEDEF) type = ada_typedef_target_type (type); if (type != NULL - && (TYPE_CODE (type) == TYPE_CODE_PTR - || TYPE_CODE (type) == TYPE_CODE_REF)) + && (type->code () == TYPE_CODE_PTR + || type->code () == TYPE_CODE_REF)) return ada_check_typedef (TYPE_TARGET_TYPE (type)); else return type; @@ -1583,7 +1505,7 @@ thin_data_pntr (struct value *val) data_type = lookup_pointer_type (data_type); - if (TYPE_CODE (type) == TYPE_CODE_PTR) + if (type->code () == TYPE_CODE_PTR) return value_cast (data_type, value_copy (val)); else return value_from_longest (data_type, value_address (val)); @@ -1595,7 +1517,7 @@ static int is_thick_pntr (struct type *type) { type = desc_base_type (type); - return (type != NULL && TYPE_CODE (type) == TYPE_CODE_STRUCT + return (type != NULL && type->code () == TYPE_CODE_STRUCT && lookup_struct_elt_type (type, "P_BOUNDS", 1) != NULL); } @@ -1620,7 +1542,7 @@ desc_bounds_type (struct type *type) if (r != NULL) return ada_check_typedef (r); } - else if (TYPE_CODE (type) == TYPE_CODE_STRUCT) + else if (type->code () == TYPE_CODE_STRUCT) { r = lookup_struct_elt_type (type, "P_BOUNDS", 1); if (r != NULL) @@ -1649,7 +1571,7 @@ desc_bounds (struct value *arr) /* NOTE: The following calculation is not really kosher, but since desc_type is an XVE-encoded type (and shouldn't be), the correct calculation is a real pain. FIXME (and fix GCC). */ - if (TYPE_CODE (type) == TYPE_CODE_PTR) + if (type->code () == TYPE_CODE_PTR) addr = value_as_long (arr); else addr = value_address (arr); @@ -1666,7 +1588,7 @@ desc_bounds (struct value *arr) struct type *p_bounds_type = value_type (p_bounds); if (p_bounds_type - && TYPE_CODE (p_bounds_type) == TYPE_CODE_PTR) + && p_bounds_type->code () == TYPE_CODE_PTR) { struct type *target_type = TYPE_TARGET_TYPE (p_bounds_type); @@ -1704,7 +1626,7 @@ fat_pntr_bounds_bitsize (struct type *type) if (TYPE_FIELD_BITSIZE (type, 1) > 0) return TYPE_FIELD_BITSIZE (type, 1); else - return 8 * TYPE_LENGTH (ada_check_typedef (TYPE_FIELD_TYPE (type, 1))); + return 8 * TYPE_LENGTH (ada_check_typedef (type->field (1).type ())); } /* If TYPE is the type of an array descriptor (fat or thin pointer) or a @@ -1719,13 +1641,13 @@ desc_data_target_type (struct type *type) /* NOTE: The following is bogus; see comment in desc_bounds. */ if (is_thin_pntr (type)) - return desc_base_type (TYPE_FIELD_TYPE (thin_descriptor_type (type), 1)); + return desc_base_type (thin_descriptor_type (type)->field (1).type ()); else if (is_thick_pntr (type)) { struct type *data_type = lookup_struct_elt_type (type, "P_ARRAY", 1); if (data_type - && TYPE_CODE (ada_check_typedef (data_type)) == TYPE_CODE_PTR) + && ada_check_typedef (data_type)->code () == TYPE_CODE_PTR) return ada_check_typedef (TYPE_TARGET_TYPE (data_type)); } @@ -1770,7 +1692,7 @@ fat_pntr_data_bitsize (struct type *type) if (TYPE_FIELD_BITSIZE (type, 0) > 0) return TYPE_FIELD_BITSIZE (type, 0); else - return TARGET_CHAR_BIT * TYPE_LENGTH (TYPE_FIELD_TYPE (type, 0)); + return TARGET_CHAR_BIT * TYPE_LENGTH (type->field (0).type ()); } /* If BOUNDS is an array-bounds structure (or pointer to one), return @@ -1780,7 +1702,10 @@ fat_pntr_data_bitsize (struct type *type) static struct value * desc_one_bound (struct value *bounds, int i, int which) { - return value_struct_elt (&bounds, NULL, bound_name[2 * i + which - 2], NULL, + char bound_name[20]; + xsnprintf (bound_name, sizeof (bound_name), "%cB%d", + which ? 'U' : 'L', i - 1); + return value_struct_elt (&bounds, NULL, bound_name, NULL, _("Bad GNAT array descriptor bounds")); } @@ -1806,7 +1731,7 @@ desc_bound_bitsize (struct type *type, int i, int which) if (TYPE_FIELD_BITSIZE (type, 2 * i + which - 2) > 0) return TYPE_FIELD_BITSIZE (type, 2 * i + which - 2); else - return 8 * TYPE_LENGTH (TYPE_FIELD_TYPE (type, 2 * i + which - 2)); + return 8 * TYPE_LENGTH (type->field (2 * i + which - 2).type ()); } /* If TYPE is the type of an array-bounds structure, the type of its @@ -1817,8 +1742,12 @@ desc_index_type (struct type *type, int i) { type = desc_base_type (type); - if (TYPE_CODE (type) == TYPE_CODE_STRUCT) - return lookup_struct_elt_type (type, bound_name[2 * i - 2], 1); + if (type->code () == TYPE_CODE_STRUCT) + { + char bound_name[20]; + xsnprintf (bound_name, sizeof (bound_name), "LB%d", i - 1); + return lookup_struct_elt_type (type, bound_name, 1); + } else return NULL; } @@ -1832,7 +1761,7 @@ desc_arity (struct type *type) type = desc_base_type (type); if (type != NULL) - return TYPE_NFIELDS (type) / 2; + return type->num_fields () / 2; return 0; } @@ -1846,7 +1775,7 @@ ada_is_direct_array_type (struct type *type) if (type == NULL) return 0; type = ada_check_typedef (type); - return (TYPE_CODE (type) == TYPE_CODE_ARRAY + return (type->code () == TYPE_CODE_ARRAY || ada_is_array_descriptor_type (type)); } @@ -1856,9 +1785,9 @@ ada_is_direct_array_type (struct type *type) static int ada_is_array_type (struct type *type) { - while (type != NULL - && (TYPE_CODE (type) == TYPE_CODE_PTR - || TYPE_CODE (type) == TYPE_CODE_REF)) + while (type != NULL + && (type->code () == TYPE_CODE_PTR + || type->code () == TYPE_CODE_REF)) type = TYPE_TARGET_TYPE (type); return ada_is_direct_array_type (type); } @@ -1871,10 +1800,10 @@ ada_is_simple_array_type (struct type *type) if (type == NULL) return 0; type = ada_check_typedef (type); - return (TYPE_CODE (type) == TYPE_CODE_ARRAY - || (TYPE_CODE (type) == TYPE_CODE_PTR - && TYPE_CODE (ada_check_typedef (TYPE_TARGET_TYPE (type))) - == TYPE_CODE_ARRAY)); + return (type->code () == TYPE_CODE_ARRAY + || (type->code () == TYPE_CODE_PTR + && (ada_check_typedef (TYPE_TARGET_TYPE (type))->code () + == TYPE_CODE_ARRAY))); } /* Non-zero iff TYPE belongs to a GNAT array descriptor. */ @@ -1888,7 +1817,7 @@ ada_is_array_descriptor_type (struct type *type) return 0; type = ada_check_typedef (type); return (data_type != NULL - && TYPE_CODE (data_type) == TYPE_CODE_ARRAY + && data_type->code () == TYPE_CODE_ARRAY && desc_arity (desc_bounds_type (type)) > 0); } @@ -1902,7 +1831,7 @@ ada_is_bogus_array_descriptor (struct type *type) { return type != NULL - && TYPE_CODE (type) == TYPE_CODE_STRUCT + && type->code () == TYPE_CODE_STRUCT && (lookup_struct_elt_type (type, "P_BOUNDS", 1) != NULL || lookup_struct_elt_type (type, "P_ARRAY", 1) != NULL) && !ada_is_array_descriptor_type (type); @@ -2098,7 +2027,7 @@ decode_packed_array_bitsize (struct type *type) /* Access to arrays implemented as fat pointers are encoded as a typedef of the fat pointer type. We need the name of the fat pointer type to do the decoding, so strip the typedef layer. */ - if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF) + if (type->code () == TYPE_CODE_TYPEDEF) type = ada_typedef_target_type (type); raw_name = ada_type_name (ada_check_typedef (type)); @@ -2148,15 +2077,15 @@ constrained_packed_array_type (struct type *type, long *elt_bits) LONGEST low_bound, high_bound; type = ada_check_typedef (type); - if (TYPE_CODE (type) != TYPE_CODE_ARRAY) + if (type->code () != TYPE_CODE_ARRAY) return type; index_type_desc = ada_find_parallel_type (type, "___XA"); if (index_type_desc) - index_type = to_fixed_range_type (TYPE_FIELD_TYPE (index_type_desc, 0), + index_type = to_fixed_range_type (index_type_desc->field (0).type (), NULL); else - index_type = TYPE_INDEX_TYPE (type); + index_type = type->index_type (); new_type = alloc_type_copy (type); new_elt_type = @@ -2164,9 +2093,9 @@ constrained_packed_array_type (struct type *type, long *elt_bits) elt_bits); create_array_type (new_type, new_elt_type, index_type); TYPE_FIELD_BITSIZE (new_type, 0) = *elt_bits; - TYPE_NAME (new_type) = ada_type_name (type); + new_type->set_name (ada_type_name (type)); - if ((TYPE_CODE (check_typedef (index_type)) == TYPE_CODE_RANGE + if ((check_typedef (index_type)->code () == TYPE_CODE_RANGE && is_dynamic_type (check_typedef (index_type))) || get_discrete_bounds (index_type, &low_bound, &high_bound) < 0) low_bound = high_bound = 0; @@ -2217,7 +2146,7 @@ decode_constrained_packed_array_type (struct type *type) } shadow_type = check_typedef (shadow_type); - if (TYPE_CODE (shadow_type) != TYPE_CODE_ARRAY) + if (shadow_type->code () != TYPE_CODE_ARRAY) { lim_warning (_("could not understand bounds " "information on packed array")); @@ -2247,7 +2176,7 @@ decode_constrained_packed_array (struct value *arr) and "value_ind" routines to perform the dereferencing, as opposed to using "ada_coerce_ref" or "ada_value_ind". */ arr = coerce_ref (arr); - if (TYPE_CODE (ada_check_typedef (value_type (arr))) == TYPE_CODE_PTR) + if (ada_check_typedef (value_type (arr))->code () == TYPE_CODE_PTR) arr = value_ind (arr); type = decode_constrained_packed_array_type (value_type (arr)); @@ -2303,14 +2232,14 @@ value_subscript_packed (struct value *arr, int arity, struct value **ind) elt_type = ada_check_typedef (value_type (arr)); for (i = 0; i < arity; i += 1) { - if (TYPE_CODE (elt_type) != TYPE_CODE_ARRAY + if (elt_type->code () != TYPE_CODE_ARRAY || TYPE_FIELD_BITSIZE (elt_type, 0) == 0) error (_("attempt to do packed indexing of " "something other than a packed array")); else { - struct type *range_type = TYPE_INDEX_TYPE (elt_type); + struct type *range_type = elt_type->index_type (); LONGEST lowerbound, upperbound; LONGEST idx; @@ -2342,14 +2271,14 @@ value_subscript_packed (struct value *arr, int arity, struct value **ind) static int has_negatives (struct type *type) { - switch (TYPE_CODE (type)) + switch (type->code ()) { default: return 0; case TYPE_CODE_INT: return !TYPE_UNSIGNED (type); case TYPE_CODE_RANGE: - return TYPE_LOW_BOUND (type) - TYPE_RANGE_DATA (type)->bias < 0; + return type->bounds ()->low.const_val () - type->bounds ()->bias < 0; } } @@ -2525,7 +2454,7 @@ ada_value_primitive_packed_val (struct value *obj, const gdb_byte *valaddr, staging.data (), staging.size (), is_big_endian, has_negatives (type), is_scalar); - type = resolve_dynamic_type (type, staging.data (), 0); + type = resolve_dynamic_type (type, staging, 0); if (TYPE_LENGTH (type) < (bit_size + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT) { /* This happens when the length of the object is dynamic, @@ -2627,8 +2556,8 @@ ada_value_assign (struct value *toval, struct value *fromval) if (VALUE_LVAL (toval) == lval_memory && bits > 0 - && (TYPE_CODE (type) == TYPE_CODE_FLT - || TYPE_CODE (type) == TYPE_CODE_STRUCT)) + && (type->code () == TYPE_CODE_FLT + || type->code () == TYPE_CODE_STRUCT)) { int len = (value_bitpos (toval) + bits + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT; @@ -2637,7 +2566,7 @@ ada_value_assign (struct value *toval, struct value *fromval) struct value *val; CORE_ADDR to_addr = value_address (toval); - if (TYPE_CODE (type) == TYPE_CODE_FLT) + if (type->code () == TYPE_CODE_FLT) fromval = value_cast (type, fromval); read_memory (to_addr, buffer, len); @@ -2718,7 +2647,7 @@ value_assign_to_component (struct value *container, struct value *component, bool ada_is_access_to_unconstrained_array (struct type *type) { - return (TYPE_CODE (type) == TYPE_CODE_TYPEDEF + return (type->code () == TYPE_CODE_TYPEDEF && is_thick_pntr (ada_typedef_target_type (type))); } @@ -2736,7 +2665,7 @@ ada_value_subscript (struct value *arr, int arity, struct value **ind) elt = ada_coerce_to_simple_array (arr); elt_type = ada_check_typedef (value_type (elt)); - if (TYPE_CODE (elt_type) == TYPE_CODE_ARRAY + if (elt_type->code () == TYPE_CODE_ARRAY && TYPE_FIELD_BITSIZE (elt_type, 0) > 0) return value_subscript_packed (elt, arity, ind); @@ -2744,13 +2673,13 @@ ada_value_subscript (struct value *arr, int arity, struct value **ind) { struct type *saved_elt_type = TYPE_TARGET_TYPE (elt_type); - if (TYPE_CODE (elt_type) != TYPE_CODE_ARRAY) + if (elt_type->code () != TYPE_CODE_ARRAY) error (_("too many subscripts (%d expected)"), k); elt = value_subscript (elt, pos_atr (ind[k])); if (ada_is_access_to_unconstrained_array (saved_elt_type) - && TYPE_CODE (value_type (elt)) != TYPE_CODE_TYPEDEF) + && value_type (elt)->code () != TYPE_CODE_TYPEDEF) { /* The element is a typedef to an unconstrained array, except that the value_subscript call stripped the @@ -2793,22 +2722,20 @@ ada_value_ptr_subscript (struct value *arr, int arity, struct value **ind) struct type *type = check_typedef (value_enclosing_type (array_ind)); - if (TYPE_CODE (type) == TYPE_CODE_ARRAY + if (type->code () == TYPE_CODE_ARRAY && TYPE_FIELD_BITSIZE (type, 0) > 0) return value_subscript_packed (array_ind, arity, ind); for (k = 0; k < arity; k += 1) { LONGEST lwb, upb; - struct value *lwb_value; - if (TYPE_CODE (type) != TYPE_CODE_ARRAY) + if (type->code () != TYPE_CODE_ARRAY) error (_("too many subscripts (%d expected)"), k); arr = value_cast (lookup_pointer_type (TYPE_TARGET_TYPE (type)), value_copy (arr)); - get_discrete_bounds (TYPE_INDEX_TYPE (type), &lwb, &upb); - lwb_value = value_from_longest (value_type(ind[k]), lwb); - arr = value_ptradd (arr, pos_atr (ind[k]) - pos_atr (lwb_value)); + get_discrete_bounds (type->index_type (), &lwb, &upb); + arr = value_ptradd (arr, pos_atr (ind[k]) - lwb); type = TYPE_TARGET_TYPE (type); } @@ -2824,14 +2751,14 @@ ada_value_slice_from_ptr (struct value *array_ptr, struct type *type, int low, int high) { struct type *type0 = ada_check_typedef (type); - struct type *base_index_type = TYPE_TARGET_TYPE (TYPE_INDEX_TYPE (type0)); + struct type *base_index_type = TYPE_TARGET_TYPE (type0->index_type ()); struct type *index_type = create_static_range_type (NULL, base_index_type, low, high); struct type *slice_type = create_array_type_with_stride (NULL, TYPE_TARGET_TYPE (type0), index_type, - get_dyn_prop (DYN_PROP_BYTE_STRIDE, type0), + type0->dyn_prop (DYN_PROP_BYTE_STRIDE), TYPE_FIELD_BITSIZE (type0, 0)); - int base_low = ada_discrete_type_low_bound (TYPE_INDEX_TYPE (type0)); + int base_low = ada_discrete_type_low_bound (type0->index_type ()); LONGEST base_low_pos, low_pos; CORE_ADDR base; @@ -2854,12 +2781,12 @@ static struct value * ada_value_slice (struct value *array, int low, int high) { struct type *type = ada_check_typedef (value_type (array)); - struct type *base_index_type = TYPE_TARGET_TYPE (TYPE_INDEX_TYPE (type)); + struct type *base_index_type = TYPE_TARGET_TYPE (type->index_type ()); struct type *index_type - = create_static_range_type (NULL, TYPE_INDEX_TYPE (type), low, high); + = create_static_range_type (NULL, type->index_type (), low, high); struct type *slice_type = create_array_type_with_stride (NULL, TYPE_TARGET_TYPE (type), index_type, - get_dyn_prop (DYN_PROP_BYTE_STRIDE, type), + type->dyn_prop (DYN_PROP_BYTE_STRIDE), TYPE_FIELD_BITSIZE (type, 0)); LONGEST low_pos, high_pos; @@ -2891,10 +2818,10 @@ ada_array_arity (struct type *type) type = desc_base_type (type); arity = 0; - if (TYPE_CODE (type) == TYPE_CODE_STRUCT) + if (type->code () == TYPE_CODE_STRUCT) return desc_arity (desc_bounds_type (type)); else - while (TYPE_CODE (type) == TYPE_CODE_ARRAY) + while (type->code () == TYPE_CODE_ARRAY) { arity += 1; type = ada_check_typedef (TYPE_TARGET_TYPE (type)); @@ -2913,7 +2840,7 @@ ada_array_element_type (struct type *type, int nindices) { type = desc_base_type (type); - if (TYPE_CODE (type) == TYPE_CODE_STRUCT) + if (type->code () == TYPE_CODE_STRUCT) { int k; struct type *p_array_type; @@ -2934,9 +2861,9 @@ ada_array_element_type (struct type *type, int nindices) } return p_array_type; } - else if (TYPE_CODE (type) == TYPE_CODE_ARRAY) + else if (type->code () == TYPE_CODE_ARRAY) { - while (nindices != 0 && TYPE_CODE (type) == TYPE_CODE_ARRAY) + while (nindices != 0 && type->code () == TYPE_CODE_ARRAY) { type = TYPE_TARGET_TYPE (type); nindices -= 1; @@ -2969,11 +2896,11 @@ ada_index_type (struct type *type, int n, const char *name) for (i = 1; i < n; i += 1) type = TYPE_TARGET_TYPE (type); - result_type = TYPE_TARGET_TYPE (TYPE_INDEX_TYPE (type)); + result_type = TYPE_TARGET_TYPE (type->index_type ()); /* FIXME: The stabs type r(0,0);bound;bound in an array type has a target type of TYPE_CODE_UNDEF. We compensate here, but perhaps stabsread.c would make more sense. */ - if (result_type && TYPE_CODE (result_type) == TYPE_CODE_UNDEF) + if (result_type && result_type->code () == TYPE_CODE_UNDEF) result_type = NULL; } else @@ -3006,7 +2933,7 @@ ada_array_bound_from_type (struct type *arr_type, int n, int which) if (arr_type == NULL || !ada_is_simple_array_type (arr_type)) return (LONGEST) - which; - if (TYPE_CODE (arr_type) == TYPE_CODE_PTR) + if (arr_type->code () == TYPE_CODE_PTR) type = TYPE_TARGET_TYPE (arr_type); else type = arr_type; @@ -3025,7 +2952,7 @@ ada_array_bound_from_type (struct type *arr_type, int n, int which) } if (index_type_desc != NULL) - index_type = to_fixed_range_type (TYPE_FIELD_TYPE (index_type_desc, n - 1), + index_type = to_fixed_range_type (index_type_desc->field (n - 1).type (), NULL); else { @@ -3034,7 +2961,7 @@ ada_array_bound_from_type (struct type *arr_type, int n, int which) for (i = 1; i < n; i++) elt_type = check_typedef (TYPE_TARGET_TYPE (elt_type)); - index_type = TYPE_INDEX_TYPE (elt_type); + index_type = elt_type->index_type (); } return @@ -3053,7 +2980,7 @@ ada_array_bound (struct value *arr, int n, int which) { struct type *arr_type; - if (TYPE_CODE (check_typedef (value_type (arr))) == TYPE_CODE_PTR) + if (check_typedef (value_type (arr))->code () == TYPE_CODE_PTR) arr = value_ind (arr); arr_type = value_enclosing_type (arr); @@ -3077,7 +3004,7 @@ ada_array_length (struct value *arr, int n) struct type *arr_type, *index_type; int low, high; - if (TYPE_CODE (check_typedef (value_type (arr))) == TYPE_CODE_PTR) + if (check_typedef (value_type (arr))->code () == TYPE_CODE_PTR) arr = value_ind (arr); arr_type = value_enclosing_type (arr); @@ -3100,7 +3027,7 @@ ada_array_length (struct value *arr, int n) if (index_type != NULL) { struct type *base_type; - if (TYPE_CODE (index_type) == TYPE_CODE_RANGE) + if (index_type->code () == TYPE_CODE_RANGE) base_type = TYPE_TARGET_TYPE (index_type); else base_type = index_type; @@ -3121,7 +3048,7 @@ empty_array (struct type *arr_type, int low, int high) struct type *arr_type0 = ada_check_typedef (arr_type); struct type *index_type = create_static_range_type - (NULL, TYPE_TARGET_TYPE (TYPE_INDEX_TYPE (arr_type0)), low, + (NULL, TYPE_TARGET_TYPE (arr_type0->index_type ()), low, high < low ? low - 1 : high); struct type *elt_type = ada_array_element_type (arr_type0, 1); @@ -3228,25 +3155,25 @@ ada_print_symbol_signature (struct ui_file *stream, struct symbol *sym, fprintf_filtered (stream, "%s", sym->print_name ()); if (!print_signatures || type == NULL - || TYPE_CODE (type) != TYPE_CODE_FUNC) + || type->code () != TYPE_CODE_FUNC) return; - if (TYPE_NFIELDS (type) > 0) + if (type->num_fields () > 0) { int i; fprintf_filtered (stream, " ("); - for (i = 0; i < TYPE_NFIELDS (type); ++i) + for (i = 0; i < type->num_fields (); ++i) { if (i > 0) fprintf_filtered (stream, "; "); - ada_print_type (TYPE_FIELD_TYPE (type, i), NULL, stream, -1, 0, + ada_print_type (type->field (i).type (), NULL, stream, -1, 0, flags); } fprintf_filtered (stream, ")"); } if (TYPE_TARGET_TYPE (type) != NULL - && TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID) + && TYPE_TARGET_TYPE (type)->code () != TYPE_CODE_VOID) { fprintf_filtered (stream, " return "); ada_print_type (TYPE_TARGET_TYPE (type), NULL, stream, -1, 0, flags); @@ -3409,7 +3336,7 @@ See set/show multiple-symbol.")); int is_enumeral = (SYMBOL_CLASS (syms[i].symbol) == LOC_CONST && SYMBOL_TYPE (syms[i].symbol) != NULL - && TYPE_CODE (SYMBOL_TYPE (syms[i].symbol)) == TYPE_CODE_ENUM); + && SYMBOL_TYPE (syms[i].symbol)->code () == TYPE_CODE_ENUM); struct symtab *symtab = NULL; if (SYMBOL_OBJFILE_OWNED (syms[i].symbol)) @@ -3425,7 +3352,7 @@ See set/show multiple-symbol.")); SYMBOL_LINE (syms[i].symbol)); } else if (is_enumeral - && TYPE_NAME (SYMBOL_TYPE (syms[i].symbol)) != NULL) + && SYMBOL_TYPE (syms[i].symbol)->name () != NULL) { printf_filtered (("[%d] "), i + first_choice); ada_print_type (SYMBOL_TYPE (syms[i].symbol), NULL, @@ -3461,28 +3388,6 @@ See set/show multiple-symbol.")); return n_chosen; } -/* Same as evaluate_type (*EXP), but resolves ambiguous symbol - references (marked by OP_VAR_VALUE nodes in which the symbol has an - undefined namespace) and converts operators that are - user-defined into appropriate function calls. If CONTEXT_TYPE is - non-null, it provides a preferred result type [at the moment, only - type void has any effect---causing procedures to be preferred over - functions in calls]. A null CONTEXT_TYPE indicates that a non-void - return type is preferred. May change (expand) *EXP. */ - -static void -resolve (expression_up *expp, int void_context_p, int parse_completion, - innermost_block_tracker *tracker) -{ - struct type *context_type = NULL; - int pc = 0; - - if (void_context_p) - context_type = builtin_type ((*expp)->gdbarch)->builtin_void; - - resolve_subexp (expp, &pc, 1, context_type, parse_completion, tracker); -} - /* Resolve the operator of the subexpression beginning at position *POS of *EXPP. "Resolving" consists of replacing the symbols that have undefined namespaces in OP_VAR_VALUE nodes @@ -3745,7 +3650,7 @@ resolve_subexp (expression_up *expp, int *pos, int deprocedure_p, } if (deprocedure_p - && (TYPE_CODE (SYMBOL_TYPE (exp->elts[pc + 2].symbol)) + && (SYMBOL_TYPE (exp->elts[pc + 2].symbol)->code () == TYPE_CODE_FUNC)) { replace_operator_with_call (expp, pc, 0, 4, @@ -3858,17 +3763,17 @@ ada_type_match (struct type *ftype, struct type *atype, int may_deref) ftype = ada_check_typedef (ftype); atype = ada_check_typedef (atype); - if (TYPE_CODE (ftype) == TYPE_CODE_REF) + if (ftype->code () == TYPE_CODE_REF) ftype = TYPE_TARGET_TYPE (ftype); - if (TYPE_CODE (atype) == TYPE_CODE_REF) + if (atype->code () == TYPE_CODE_REF) atype = TYPE_TARGET_TYPE (atype); - switch (TYPE_CODE (ftype)) + switch (ftype->code ()) { default: - return TYPE_CODE (ftype) == TYPE_CODE (atype); + return ftype->code () == atype->code (); case TYPE_CODE_PTR: - if (TYPE_CODE (atype) == TYPE_CODE_PTR) + if (atype->code () == TYPE_CODE_PTR) return ada_type_match (TYPE_TARGET_TYPE (ftype), TYPE_TARGET_TYPE (atype), 0); else @@ -3877,7 +3782,7 @@ ada_type_match (struct type *ftype, struct type *atype, int may_deref) case TYPE_CODE_INT: case TYPE_CODE_ENUM: case TYPE_CODE_RANGE: - switch (TYPE_CODE (atype)) + switch (atype->code ()) { case TYPE_CODE_INT: case TYPE_CODE_ENUM: @@ -3888,20 +3793,20 @@ ada_type_match (struct type *ftype, struct type *atype, int may_deref) } case TYPE_CODE_ARRAY: - return (TYPE_CODE (atype) == TYPE_CODE_ARRAY + return (atype->code () == TYPE_CODE_ARRAY || ada_is_array_descriptor_type (atype)); case TYPE_CODE_STRUCT: if (ada_is_array_descriptor_type (ftype)) - return (TYPE_CODE (atype) == TYPE_CODE_ARRAY + return (atype->code () == TYPE_CODE_ARRAY || ada_is_array_descriptor_type (atype)); else - return (TYPE_CODE (atype) == TYPE_CODE_STRUCT + return (atype->code () == TYPE_CODE_STRUCT && !ada_is_array_descriptor_type (atype)); case TYPE_CODE_UNION: case TYPE_CODE_FLT: - return (TYPE_CODE (atype) == TYPE_CODE (ftype)); + return (atype->code () == ftype->code ()); } } @@ -3917,12 +3822,12 @@ ada_args_match (struct symbol *func, struct value **actuals, int n_actuals) struct type *func_type = SYMBOL_TYPE (func); if (SYMBOL_CLASS (func) == LOC_CONST - && TYPE_CODE (func_type) == TYPE_CODE_ENUM) + && func_type->code () == TYPE_CODE_ENUM) return (n_actuals == 0); - else if (func_type == NULL || TYPE_CODE (func_type) != TYPE_CODE_FUNC) + else if (func_type == NULL || func_type->code () != TYPE_CODE_FUNC) return 0; - if (TYPE_NFIELDS (func_type) != n_actuals) + if (func_type->num_fields () != n_actuals) return 0; for (i = 0; i < n_actuals; i += 1) @@ -3931,8 +3836,7 @@ ada_args_match (struct symbol *func, struct value **actuals, int n_actuals) return 0; else { - struct type *ftype = ada_check_typedef (TYPE_FIELD_TYPE (func_type, - i)); + struct type *ftype = ada_check_typedef (func_type->field (i).type ()); struct type *atype = ada_check_typedef (value_type (actuals[i])); if (!ada_type_match (ftype, atype, 1)) @@ -3955,7 +3859,7 @@ return_match (struct type *func_type, struct type *context_type) if (func_type == NULL) return 1; - if (TYPE_CODE (func_type) == TYPE_CODE_FUNC) + if (func_type->code () == TYPE_CODE_FUNC) return_type = get_base_type (TYPE_TARGET_TYPE (func_type)); else return_type = get_base_type (func_type); @@ -3964,12 +3868,12 @@ return_match (struct type *func_type, struct type *context_type) context_type = get_base_type (context_type); - if (TYPE_CODE (return_type) == TYPE_CODE_ENUM) + if (return_type->code () == TYPE_CODE_ENUM) return context_type == NULL || return_type == context_type; else if (context_type == NULL) - return TYPE_CODE (return_type) != TYPE_CODE_VOID; + return return_type->code () != TYPE_CODE_VOID; else - return TYPE_CODE (return_type) == TYPE_CODE (context_type); + return return_type->code () == context_type->code (); } @@ -4074,7 +3978,7 @@ numeric_type_p (struct type *type) return 0; else { - switch (TYPE_CODE (type)) + switch (type->code ()) { case TYPE_CODE_INT: case TYPE_CODE_FLT: @@ -4097,7 +4001,7 @@ integer_type_p (struct type *type) return 0; else { - switch (TYPE_CODE (type)) + switch (type->code ()) { case TYPE_CODE_INT: return 1; @@ -4119,7 +4023,7 @@ scalar_type_p (struct type *type) return 0; else { - switch (TYPE_CODE (type)) + switch (type->code ()) { case TYPE_CODE_INT: case TYPE_CODE_RANGE: @@ -4141,7 +4045,7 @@ discrete_type_p (struct type *type) return 0; else { - switch (TYPE_CODE (type)) + switch (type->code ()) { case TYPE_CODE_INT: case TYPE_CODE_RANGE: @@ -4362,26 +4266,26 @@ ada_value_struct_elt (struct value *arg, const char *name, int no_err) v = NULL; t1 = t = ada_check_typedef (value_type (arg)); - if (TYPE_CODE (t) == TYPE_CODE_REF) + if (t->code () == TYPE_CODE_REF) { t1 = TYPE_TARGET_TYPE (t); if (t1 == NULL) goto BadValue; t1 = ada_check_typedef (t1); - if (TYPE_CODE (t1) == TYPE_CODE_PTR) + if (t1->code () == TYPE_CODE_PTR) { arg = coerce_ref (arg); t = t1; } } - while (TYPE_CODE (t) == TYPE_CODE_PTR) + while (t->code () == TYPE_CODE_PTR) { t1 = TYPE_TARGET_TYPE (t); if (t1 == NULL) goto BadValue; t1 = ada_check_typedef (t1); - if (TYPE_CODE (t1) == TYPE_CODE_PTR) + if (t1->code () == TYPE_CODE_PTR) { arg = value_ind (arg); t = t1; @@ -4390,7 +4294,7 @@ ada_value_struct_elt (struct value *arg, const char *name, int no_err) break; } - if (TYPE_CODE (t1) != TYPE_CODE_STRUCT && TYPE_CODE (t1) != TYPE_CODE_UNION) + if (t1->code () != TYPE_CODE_STRUCT && t1->code () != TYPE_CODE_UNION) goto BadValue; if (t1 == t) @@ -4401,7 +4305,7 @@ ada_value_struct_elt (struct value *arg, const char *name, int no_err) struct type *field_type; CORE_ADDR address; - if (TYPE_CODE (t) == TYPE_CODE_PTR) + if (t->code () == TYPE_CODE_PTR) address = value_address (ada_value_ind (arg)); else address = value_address (ada_coerce_ref (arg)); @@ -4413,7 +4317,7 @@ ada_value_struct_elt (struct value *arg, const char *name, int no_err) a reference should mostly be transparent to the user. */ if (ada_is_tagged_type (t1, 0) - || (TYPE_CODE (t1) == TYPE_CODE_REF + || (t1->code () == TYPE_CODE_REF && ada_is_tagged_type (TYPE_TARGET_TYPE (t1), 0))) { /* We first try to find the searched field in the current type. @@ -4440,7 +4344,7 @@ ada_value_struct_elt (struct value *arg, const char *name, int no_err) { if (bit_size != 0) { - if (TYPE_CODE (t) == TYPE_CODE_REF) + if (t->code () == TYPE_CODE_REF) arg = ada_coerce_ref (arg); else arg = ada_value_ind (arg); @@ -4477,24 +4381,24 @@ ada_convert_actual (struct value *actual, struct type *formal_type0) struct type *actual_type = ada_check_typedef (value_type (actual)); struct type *formal_type = ada_check_typedef (formal_type0); struct type *formal_target = - TYPE_CODE (formal_type) == TYPE_CODE_PTR + formal_type->code () == TYPE_CODE_PTR ? ada_check_typedef (TYPE_TARGET_TYPE (formal_type)) : formal_type; struct type *actual_target = - TYPE_CODE (actual_type) == TYPE_CODE_PTR + actual_type->code () == TYPE_CODE_PTR ? ada_check_typedef (TYPE_TARGET_TYPE (actual_type)) : actual_type; if (ada_is_array_descriptor_type (formal_target) - && TYPE_CODE (actual_target) == TYPE_CODE_ARRAY) + && actual_target->code () == TYPE_CODE_ARRAY) return make_array_descriptor (formal_type, actual); - else if (TYPE_CODE (formal_type) == TYPE_CODE_PTR - || TYPE_CODE (formal_type) == TYPE_CODE_REF) + else if (formal_type->code () == TYPE_CODE_PTR + || formal_type->code () == TYPE_CODE_REF) { struct value *result; - if (TYPE_CODE (formal_target) == TYPE_CODE_ARRAY + if (formal_target->code () == TYPE_CODE_ARRAY && ada_is_array_descriptor_type (actual_target)) result = desc_data (actual); - else if (TYPE_CODE (formal_type) != TYPE_CODE_PTR) + else if (formal_type->code () != TYPE_CODE_PTR) { if (VALUE_LVAL (actual) != lval_memory) { @@ -4513,7 +4417,7 @@ ada_convert_actual (struct value *actual, struct type *formal_type0) return actual; return value_cast_pointers (formal_type, result, 0); } - else if (TYPE_CODE (actual_type) == TYPE_CODE_PTR) + else if (actual_type->code () == TYPE_CODE_PTR) return ada_value_ind (actual); else if (ada_is_aligner_type (formal_type)) { @@ -4582,20 +4486,20 @@ make_array_descriptor (struct type *type, struct value *arr) modify_field (value_type (descriptor), value_contents_writeable (descriptor), value_pointer (ensure_lval (arr), - TYPE_FIELD_TYPE (desc_type, 0)), + desc_type->field (0).type ()), fat_pntr_data_bitpos (desc_type), fat_pntr_data_bitsize (desc_type)); modify_field (value_type (descriptor), value_contents_writeable (descriptor), value_pointer (bounds, - TYPE_FIELD_TYPE (desc_type, 1)), + desc_type->field (1).type ()), fat_pntr_bounds_bitpos (desc_type), fat_pntr_bounds_bitsize (desc_type)); descriptor = ensure_lval (descriptor); - if (TYPE_CODE (type) == TYPE_CODE_PTR) + if (type->code () == TYPE_CODE_PTR) return value_addr (descriptor); else return descriptor; @@ -4710,7 +4614,6 @@ cache_symbol (const char *name, domain_enum domain, struct symbol *sym, struct ada_symbol_cache *sym_cache = ada_get_symbol_cache (current_program_space); int h; - char *copy; struct cache_entry *e; /* Symbols for builtin types don't have a block. @@ -4733,9 +4636,7 @@ cache_symbol (const char *name, domain_enum domain, struct symbol *sym, e = XOBNEW (&sym_cache->cache_space, cache_entry); e->next = sym_cache->root[h]; sym_cache->root[h] = e; - e->name = copy - = (char *) obstack_alloc (&sym_cache->cache_space, strlen (name) + 1); - strcpy (copy, name); + e->name = obstack_strdup (&sym_cache->cache_space, name); e->sym = sym; e->domain = domain; e->block = block; @@ -4784,8 +4685,8 @@ is_nonfunction (struct block_symbol syms[], int n) int i; for (i = 0; i < n; i += 1) - if (TYPE_CODE (SYMBOL_TYPE (syms[i].symbol)) != TYPE_CODE_FUNC - && (TYPE_CODE (SYMBOL_TYPE (syms[i].symbol)) != TYPE_CODE_ENUM + if (SYMBOL_TYPE (syms[i].symbol)->code () != TYPE_CODE_FUNC + && (SYMBOL_TYPE (syms[i].symbol)->code () != TYPE_CODE_ENUM || SYMBOL_CLASS (syms[i].symbol) != LOC_CONST)) return 1; @@ -4801,10 +4702,10 @@ equiv_types (struct type *type0, struct type *type1) if (type0 == type1) return 1; if (type0 == NULL || type1 == NULL - || TYPE_CODE (type0) != TYPE_CODE (type1)) + || type0->code () != type1->code ()) return 0; - if ((TYPE_CODE (type0) == TYPE_CODE_STRUCT - || TYPE_CODE (type0) == TYPE_CODE_ENUM) + if ((type0->code () == TYPE_CODE_STRUCT + || type0->code () == TYPE_CODE_ENUM) && ada_type_name (type0) != NULL && ada_type_name (type1) != NULL && strcmp (ada_type_name (type0), ada_type_name (type1)) == 0) return 1; @@ -4837,7 +4738,7 @@ lesseq_defined_than (struct symbol *sym0, struct symbol *sym1) int len0 = strlen (name0); return - TYPE_CODE (type0) == TYPE_CODE (type1) + type0->code () == type1->code () && (equiv_types (type0, type1) || (len0 < strlen (name1) && strncmp (name0, name1, len0) == 0 && startswith (name1 + len0, "___XV"))); @@ -4986,7 +4887,7 @@ is_nondebugging_type (struct type *type) This function assumes that TYPE1 and TYPE2 are both TYPE_CODE_ENUM types and that their number of enumerals is identical (in other - words, TYPE_NFIELDS (type1) == TYPE_NFIELDS (type2)). */ + words, type1->num_fields () == type2->num_fields ()). */ static int ada_identical_enum_types_p (struct type *type1, struct type *type2) @@ -4999,13 +4900,13 @@ ada_identical_enum_types_p (struct type *type1, struct type *type2) underlying value and name. */ /* All enums in the type should have an identical underlying value. */ - for (i = 0; i < TYPE_NFIELDS (type1); i++) + for (i = 0; i < type1->num_fields (); i++) if (TYPE_FIELD_ENUMVAL (type1, i) != TYPE_FIELD_ENUMVAL (type2, i)) return 0; /* All enumerals should also have the same name (modulo any numerical suffix). */ - for (i = 0; i < TYPE_NFIELDS (type1); i++) + for (i = 0; i < type1->num_fields (); i++) { const char *name_1 = TYPE_FIELD_NAME (type1, i); const char *name_2 = TYPE_FIELD_NAME (type2, i); @@ -5058,7 +4959,7 @@ symbols_are_identical_enums (const std::vector &syms) /* Quick check: All symbols should have an enum type. */ for (i = 0; i < syms.size (); i++) - if (TYPE_CODE (SYMBOL_TYPE (syms[i].symbol)) != TYPE_CODE_ENUM) + if (SYMBOL_TYPE (syms[i].symbol)->code () != TYPE_CODE_ENUM) return 0; /* Quick check: They should all have the same value. */ @@ -5068,8 +4969,8 @@ symbols_are_identical_enums (const std::vector &syms) /* Quick check: They should all have the same number of enumerals. */ for (i = 1; i < syms.size (); i++) - if (TYPE_NFIELDS (SYMBOL_TYPE (syms[i].symbol)) - != TYPE_NFIELDS (SYMBOL_TYPE (syms[0].symbol))) + if (SYMBOL_TYPE (syms[i].symbol)->num_fields () + != SYMBOL_TYPE (syms[0].symbol)->num_fields ()) return 0; /* All the sanity checks passed, so we might have a set of @@ -5146,8 +5047,8 @@ remove_extra_symbols (std::vector *syms) if (remove_p) syms->erase (syms->begin () + i); - - i += 1; + else + i += 1; } /* If all the remaining symbols are identical enumerals, then @@ -5181,7 +5082,7 @@ xget_renaming_scope (struct type *renaming_type) So, to extract the scope, we search for the "___XR" extension, and then backtrack until we find the first "__". */ - const char *name = TYPE_NAME (renaming_type); + const char *name = renaming_type->name (); const char *suffix = strstr (name, "___XR"); const char *last; @@ -5660,8 +5561,8 @@ add_nonlocal_symbols (struct obstack *obstackp, if (num_defns_collected (obstackp) == 0 && global && !is_wild_match) { const char *name = ada_lookup_name (lookup_name); - lookup_name_info name1 (std::string ("<_ada_") + name + '>', - symbol_name_match_type::FULL); + std::string bracket_name = std::string ("<_ada_") + name + '>'; + lookup_name_info name1 (bracket_name, symbol_name_match_type::FULL); for (objfile *objfile : current_program_space->objfiles ()) { @@ -5722,7 +5623,7 @@ ada_add_all_symbols (struct obstack *obstackp, else { /* In the !full_search case we're are being called by - ada_iterate_over_symbols, and we don't want to search + iterate_over_symbols, and we don't want to search superblocks. */ ada_add_block_symbols (obstackp, block, lookup_name, domain, NULL); } @@ -5823,28 +5724,6 @@ ada_lookup_symbol_list (const char *name, const struct block *block, return ada_lookup_symbol_list_worker (lookup_name, block, domain, results, 1); } -/* Implementation of the la_iterate_over_symbols method. */ - -static bool -ada_iterate_over_symbols - (const struct block *block, const lookup_name_info &name, - domain_enum domain, - gdb::function_view callback) -{ - int ndefs, i; - std::vector results; - - ndefs = ada_lookup_symbol_list_worker (name, block, domain, &results, 0); - - for (i = 0; i < ndefs; ++i) - { - if (!callback (&results[i])) - return false; - } - - return true; -} - /* The result is as for ada_lookup_symbol_list with FULL_SEARCH set to 1, but choosing the first symbol found if there are multiple choices. @@ -5891,46 +5770,6 @@ ada_lookup_symbol (const char *name, const struct block *block0, return info; } -static struct block_symbol -ada_lookup_symbol_nonlocal (const struct language_defn *langdef, - const char *name, - const struct block *block, - const domain_enum domain) -{ - struct block_symbol sym; - - sym = ada_lookup_symbol (name, block_static_block (block), domain); - if (sym.symbol != NULL) - return sym; - - /* If we haven't found a match at this point, try the primitive - types. In other languages, this search is performed before - searching for global symbols in order to short-circuit that - global-symbol search if it happens that the name corresponds - to a primitive type. But we cannot do the same in Ada, because - it is perfectly legitimate for a program to declare a type which - has the same name as a standard type. If looking up a type in - that situation, we have traditionally ignored the primitive type - in favor of user-defined types. This is why, unlike most other - languages, we search the primitive types this late and only after - having searched the global symbols without success. */ - - if (domain == VAR_DOMAIN) - { - struct gdbarch *gdbarch; - - if (block == NULL) - gdbarch = target_gdbarch (); - else - gdbarch = block_gdbarch (block); - sym.symbol = language_lookup_primitive_type_as_symbol (langdef, gdbarch, name); - if (sym.symbol != NULL) - return sym; - } - - return {}; -} - /* True iff STR is a possible encoded suffix of a normal Ada name that is to be ignored for matching purposes. Suffixes of parallel @@ -6220,8 +6059,7 @@ ada_add_block_symbols (struct obstack *obstackp, sym != NULL; sym = block_iter_match_next (lookup_name, &iter)) { - if (symbol_matches_domain (SYMBOL_LANGUAGE (sym), - SYMBOL_DOMAIN (sym), domain)) + if (symbol_matches_domain (sym->language (), SYMBOL_DOMAIN (sym), domain)) { if (SYMBOL_CLASS (sym) != LOC_UNRESOLVED) { @@ -6260,7 +6098,7 @@ ada_add_block_symbols (struct obstack *obstackp, ALL_BLOCK_SYMBOLS (block, iter, sym) { - if (symbol_matches_domain (SYMBOL_LANGUAGE (sym), + if (symbol_matches_domain (sym->language (), SYMBOL_DOMAIN (sym), domain)) { int cmp; @@ -6389,134 +6227,6 @@ ada_lookup_name_info::matches return true; } -/* Add the list of possible symbol names completing TEXT to TRACKER. - WORD is the entire command on which completion is made. */ - -static void -ada_collect_symbol_completion_matches (completion_tracker &tracker, - complete_symbol_mode mode, - symbol_name_match_type name_match_type, - const char *text, const char *word, - enum type_code code) -{ - struct symbol *sym; - const struct block *b, *surrounding_static_block = 0; - struct block_iterator iter; - - gdb_assert (code == TYPE_CODE_UNDEF); - - lookup_name_info lookup_name (text, name_match_type, true); - - /* First, look at the partial symtab symbols. */ - expand_symtabs_matching (NULL, - lookup_name, - NULL, - NULL, - ALL_DOMAIN); - - /* At this point scan through the misc symbol vectors and add each - symbol you find to the list. Eventually we want to ignore - anything that isn't a text symbol (everything else will be - handled by the psymtab code above). */ - - for (objfile *objfile : current_program_space->objfiles ()) - { - for (minimal_symbol *msymbol : objfile->msymbols ()) - { - QUIT; - - if (completion_skip_symbol (mode, msymbol)) - continue; - - language symbol_language = MSYMBOL_LANGUAGE (msymbol); - - /* Ada minimal symbols won't have their language set to Ada. If - we let completion_list_add_name compare using the - default/C-like matcher, then when completing e.g., symbols in a - package named "pck", we'd match internal Ada symbols like - "pckS", which are invalid in an Ada expression, unless you wrap - them in '<' '>' to request a verbatim match. - - Unfortunately, some Ada encoded names successfully demangle as - C++ symbols (using an old mangling scheme), such as "name__2Xn" - -> "Xn::name(void)" and thus some Ada minimal symbols end up - with the wrong language set. Paper over that issue here. */ - if (symbol_language == language_auto - || symbol_language == language_cplus) - symbol_language = language_ada; - - completion_list_add_name (tracker, - symbol_language, - msymbol->linkage_name (), - lookup_name, text, word); - } - } - - /* Search upwards from currently selected frame (so that we can - complete on local vars. */ - - for (b = get_selected_block (0); b != NULL; b = BLOCK_SUPERBLOCK (b)) - { - if (!BLOCK_SUPERBLOCK (b)) - surrounding_static_block = b; /* For elmin of dups */ - - ALL_BLOCK_SYMBOLS (b, iter, sym) - { - if (completion_skip_symbol (mode, sym)) - continue; - - completion_list_add_name (tracker, - SYMBOL_LANGUAGE (sym), - sym->linkage_name (), - lookup_name, text, word); - } - } - - /* Go through the symtabs and check the externs and statics for - symbols which match. */ - - for (objfile *objfile : current_program_space->objfiles ()) - { - for (compunit_symtab *s : objfile->compunits ()) - { - QUIT; - b = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (s), GLOBAL_BLOCK); - ALL_BLOCK_SYMBOLS (b, iter, sym) - { - if (completion_skip_symbol (mode, sym)) - continue; - - completion_list_add_name (tracker, - SYMBOL_LANGUAGE (sym), - sym->linkage_name (), - lookup_name, text, word); - } - } - } - - for (objfile *objfile : current_program_space->objfiles ()) - { - for (compunit_symtab *s : objfile->compunits ()) - { - QUIT; - b = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (s), STATIC_BLOCK); - /* Don't do this block twice. */ - if (b == surrounding_static_block) - continue; - ALL_BLOCK_SYMBOLS (b, iter, sym) - { - if (completion_skip_symbol (mode, sym)) - continue; - - completion_list_add_name (tracker, - SYMBOL_LANGUAGE (sym), - sym->linkage_name (), - lookup_name, text, word); - } - } - } -} - /* Field Access */ /* Return non-zero if TYPE is a pointer to the GNAT dispatch table used @@ -6527,10 +6237,10 @@ ada_is_dispatch_table_ptr_type (struct type *type) { const char *name; - if (TYPE_CODE (type) != TYPE_CODE_PTR) + if (type->code () != TYPE_CODE_PTR) return 0; - name = TYPE_NAME (TYPE_TARGET_TYPE (type)); + name = TYPE_TARGET_TYPE (type)->name (); if (name == NULL) return 0; @@ -6542,7 +6252,7 @@ ada_is_dispatch_table_ptr_type (struct type *type) static int ada_is_interface_tag (struct type *type) { - const char *name = TYPE_NAME (type); + const char *name = type->name (); if (name == NULL) return 0; @@ -6556,7 +6266,7 @@ ada_is_interface_tag (struct type *type) int ada_is_ignored_field (struct type *type, int field_num) { - if (field_num < 0 || field_num > TYPE_NFIELDS (type)) + if (field_num < 0 || field_num > type->num_fields ()) return 1; /* Check the name of that field. */ @@ -6583,8 +6293,8 @@ ada_is_ignored_field (struct type *type, int field_num) /* If this is the dispatch table of a tagged type or an interface tag, then ignore. */ if (ada_is_tagged_type (type, 1) - && (ada_is_dispatch_table_ptr_type (TYPE_FIELD_TYPE (type, field_num)) - || ada_is_interface_tag (TYPE_FIELD_TYPE (type, field_num)))) + && (ada_is_dispatch_table_ptr_type (type->field (field_num).type ()) + || ada_is_interface_tag (type->field (field_num).type ()))) return 1; /* Not a special field, so it should not be ignored. */ @@ -6607,7 +6317,7 @@ ada_is_tag_type (struct type *type) { type = ada_check_typedef (type); - if (type == NULL || TYPE_CODE (type) != TYPE_CODE_PTR) + if (type == NULL || type->code () != TYPE_CODE_PTR) return 0; else { @@ -6671,10 +6381,10 @@ value_tag_from_contents_and_address (struct type *type, static struct type * type_from_tag (struct value *tag) { - const char *type_name = ada_tag_name (tag); + gdb::unique_xmalloc_ptr type_name = ada_tag_name (tag); if (type_name != NULL) - return ada_find_any_type (ada_encode (type_name)); + return ada_find_any_type (ada_encode (type_name.get ())); return NULL; } @@ -6697,8 +6407,7 @@ ada_tag_value_at_base_address (struct value *obj) /* It is the responsability of the caller to deref pointers. */ - if (TYPE_CODE (obj_type) == TYPE_CODE_PTR - || TYPE_CODE (obj_type) == TYPE_CODE_REF) + if (obj_type->code () == TYPE_CODE_PTR || obj_type->code () == TYPE_CODE_REF) return obj; tag = ada_value_tag (obj); @@ -6823,37 +6532,41 @@ ada_get_tsd_from_tag (struct value *tag) /* Given the TSD of a tag (type-specific data), return a string containing the name of the associated type. - The returned value is good until the next call. May return NULL - if we are unable to determine the tag name. */ + May return NULL if we are unable to determine the tag name. */ -static char * +static gdb::unique_xmalloc_ptr ada_tag_name_from_tsd (struct value *tsd) { - static char name[1024]; char *p; struct value *val; val = ada_value_struct_elt (tsd, "expanded_name", 1); if (val == NULL) return NULL; - read_memory_string (value_as_address (val), name, sizeof (name) - 1); - for (p = name; *p != '\0'; p += 1) - if (isalpha (*p)) - *p = tolower (*p); - return name; + gdb::unique_xmalloc_ptr buffer + = target_read_string (value_as_address (val), INT_MAX); + if (buffer == nullptr) + return nullptr; + + for (p = buffer.get (); *p != '\0'; ++p) + { + if (isalpha (*p)) + *p = tolower (*p); + } + + return buffer; } /* The type name of the dynamic type denoted by the 'tag value TAG, as a C string. Return NULL if the TAG is not an Ada tag, or if we were unable to - determine the name of that tag. The result is good until the next - call. */ + determine the name of that tag. */ -const char * +gdb::unique_xmalloc_ptr ada_tag_name (struct value *tag) { - char *name = NULL; + gdb::unique_xmalloc_ptr name; if (!ada_is_tag_type (value_type (tag))) return NULL; @@ -6890,16 +6603,16 @@ ada_parent_type (struct type *type) type = ada_check_typedef (type); - if (type == NULL || TYPE_CODE (type) != TYPE_CODE_STRUCT) + if (type == NULL || type->code () != TYPE_CODE_STRUCT) return NULL; - for (i = 0; i < TYPE_NFIELDS (type); i += 1) + for (i = 0; i < type->num_fields (); i += 1) if (ada_is_parent_field (type, i)) { - struct type *parent_type = TYPE_FIELD_TYPE (type, i); + struct type *parent_type = type->field (i).type (); /* If the _parent field is a pointer, then dereference it. */ - if (TYPE_CODE (parent_type) == TYPE_CODE_PTR) + if (parent_type->code () == TYPE_CODE_PTR) parent_type = TYPE_TARGET_TYPE (parent_type); /* If there is a parallel XVS type, get the actual base type. */ parent_type = ada_get_base_type (parent_type); @@ -6964,11 +6677,11 @@ ada_is_variant_part (struct type *type, int field_num) if (!ADA_TYPE_P (type)) return 0; - struct type *field_type = TYPE_FIELD_TYPE (type, field_num); + struct type *field_type = type->field (field_num).type (); - return (TYPE_CODE (field_type) == TYPE_CODE_UNION - || (is_dynamic_field (type, field_num) - && (TYPE_CODE (TYPE_TARGET_TYPE (field_type)) + return (field_type->code () == TYPE_CODE_UNION + || (is_dynamic_field (type, field_num) + && (TYPE_TARGET_TYPE (field_type)->code () == TYPE_CODE_UNION))); } @@ -7011,7 +6724,7 @@ ada_variant_discrim_name (struct type *type0) const char *discrim_end; const char *discrim_start; - if (TYPE_CODE (type0) == TYPE_CODE_PTR) + if (type0->code () == TYPE_CODE_PTR) type = TYPE_TARGET_TYPE (type0); else type = type0; @@ -7146,14 +6859,14 @@ ada_in_variant (LONGEST val, struct type *type, int field_num) fields. FIELDNO says which field. Differs from value_primitive_field only in that it can handle packed values of arbitrary type. */ -static struct value * +struct value * ada_value_primitive_field (struct value *arg1, int offset, int fieldno, struct type *arg_type) { struct type *type; arg_type = ada_check_typedef (arg_type); - type = TYPE_FIELD_TYPE (arg_type, fieldno); + type = arg_type->field (fieldno).type (); /* Handle packed fields. It might be that the field is not packed relative to its containing structure, but the structure itself is @@ -7256,7 +6969,7 @@ find_struct_field (const char *name, struct type *type, int offset, if (bit_size_p != NULL) *bit_size_p = 0; - for (i = 0; i < TYPE_NFIELDS (type); i += 1) + for (i = 0; i < type->num_fields (); i += 1) { int bit_pos = TYPE_FIELD_BITPOS (type, i); int fld_offset = offset + bit_pos / 8; @@ -7284,7 +6997,7 @@ find_struct_field (const char *name, struct type *type, int offset, int bit_size = TYPE_FIELD_BITSIZE (type, i); if (field_type_p != NULL) - *field_type_p = TYPE_FIELD_TYPE (type, i); + *field_type_p = type->field (i).type (); if (byte_offset_p != NULL) *byte_offset_p = fld_offset; if (bit_offset_p != NULL) @@ -7295,7 +7008,7 @@ find_struct_field (const char *name, struct type *type, int offset, } else if (ada_is_wrapper_field (type, i)) { - if (find_struct_field (name, TYPE_FIELD_TYPE (type, i), fld_offset, + if (find_struct_field (name, type->field (i).type (), fld_offset, field_type_p, byte_offset_p, bit_offset_p, bit_size_p, index_p)) return 1; @@ -7306,11 +7019,11 @@ find_struct_field (const char *name, struct type *type, int offset, fixed type?? */ int j; struct type *field_type - = ada_check_typedef (TYPE_FIELD_TYPE (type, i)); + = ada_check_typedef (type->field (i).type ()); - for (j = 0; j < TYPE_NFIELDS (field_type); j += 1) + for (j = 0; j < field_type->num_fields (); j += 1) { - if (find_struct_field (name, TYPE_FIELD_TYPE (field_type, j), + if (find_struct_field (name, field_type->field (j).type (), fld_offset + TYPE_FIELD_BITPOS (field_type, j) / 8, field_type_p, byte_offset_p, @@ -7330,7 +7043,7 @@ find_struct_field (const char *name, struct type *type, int offset, int bit_pos = TYPE_FIELD_BITPOS (type, parent_offset); int fld_offset = offset + bit_pos / 8; - if (find_struct_field (name, TYPE_FIELD_TYPE (type, parent_offset), + if (find_struct_field (name, type->field (parent_offset).type (), fld_offset, field_type_p, byte_offset_p, bit_offset_p, bit_size_p, index_p)) return 1; @@ -7368,7 +7081,7 @@ ada_search_struct_field (const char *name, struct value *arg, int offset, int parent_offset = -1; type = ada_check_typedef (type); - for (i = 0; i < TYPE_NFIELDS (type); i += 1) + for (i = 0; i < type->num_fields (); i += 1) { const char *t_field_name = TYPE_FIELD_NAME (type, i); @@ -7397,7 +7110,7 @@ ada_search_struct_field (const char *name, struct value *arg, int offset, struct value *v = /* Do not let indent join lines here. */ ada_search_struct_field (name, arg, offset + TYPE_FIELD_BITPOS (type, i) / 8, - TYPE_FIELD_TYPE (type, i)); + type->field (i).type ()); if (v != NULL) return v; @@ -7407,17 +7120,16 @@ ada_search_struct_field (const char *name, struct value *arg, int offset, { /* PNH: Do we ever get here? See find_struct_field. */ int j; - struct type *field_type = ada_check_typedef (TYPE_FIELD_TYPE (type, - i)); + struct type *field_type = ada_check_typedef (type->field (i).type ()); int var_offset = offset + TYPE_FIELD_BITPOS (type, i) / 8; - for (j = 0; j < TYPE_NFIELDS (field_type); j += 1) + for (j = 0; j < field_type->num_fields (); j += 1) { struct value *v = ada_search_struct_field /* Force line break. */ (name, arg, var_offset + TYPE_FIELD_BITPOS (field_type, j) / 8, - TYPE_FIELD_TYPE (field_type, j)); + field_type->field (j).type ()); if (v != NULL) return v; @@ -7432,7 +7144,7 @@ ada_search_struct_field (const char *name, struct value *arg, int offset, { struct value *v = ada_search_struct_field ( name, arg, offset + TYPE_FIELD_BITPOS (type, parent_offset) / 8, - TYPE_FIELD_TYPE (type, parent_offset)); + type->field (parent_offset).type ()); if (v != NULL) return v; @@ -7469,7 +7181,7 @@ ada_index_struct_field_1 (int *index_p, struct value *arg, int offset, int i; type = ada_check_typedef (type); - for (i = 0; i < TYPE_NFIELDS (type); i += 1) + for (i = 0; i < type->num_fields (); i += 1) { if (TYPE_FIELD_NAME (type, i) == NULL) continue; @@ -7478,7 +7190,7 @@ ada_index_struct_field_1 (int *index_p, struct value *arg, int offset, struct value *v = /* Do not let indent join lines here. */ ada_index_struct_field_1 (index_p, arg, offset + TYPE_FIELD_BITPOS (type, i) / 8, - TYPE_FIELD_TYPE (type, i)); + type->field (i).type ()); if (v != NULL) return v; @@ -7544,15 +7256,14 @@ ada_lookup_struct_elt_type (struct type *type, const char *name, int refok, while (1) { type = ada_check_typedef (type); - if (TYPE_CODE (type) != TYPE_CODE_PTR - && TYPE_CODE (type) != TYPE_CODE_REF) + if (type->code () != TYPE_CODE_PTR && type->code () != TYPE_CODE_REF) break; type = TYPE_TARGET_TYPE (type); } if (type == NULL - || (TYPE_CODE (type) != TYPE_CODE_STRUCT - && TYPE_CODE (type) != TYPE_CODE_UNION)) + || (type->code () != TYPE_CODE_STRUCT + && type->code () != TYPE_CODE_UNION)) { if (noerr) return NULL; @@ -7563,7 +7274,7 @@ ada_lookup_struct_elt_type (struct type *type, const char *name, int refok, type = to_static_fixed_type (type); - for (i = 0; i < TYPE_NFIELDS (type); i += 1) + for (i = 0; i < type->num_fields (); i += 1) { const char *t_field_name = TYPE_FIELD_NAME (type, i); struct type *t; @@ -7586,11 +7297,11 @@ ada_lookup_struct_elt_type (struct type *type, const char *name, int refok, } else if (field_name_match (t_field_name, name)) - return TYPE_FIELD_TYPE (type, i); + return type->field (i).type (); else if (ada_is_wrapper_field (type, i)) { - t = ada_lookup_struct_elt_type (TYPE_FIELD_TYPE (type, i), name, + t = ada_lookup_struct_elt_type (type->field (i).type (), name, 0, 1); if (t != NULL) return t; @@ -7599,10 +7310,9 @@ ada_lookup_struct_elt_type (struct type *type, const char *name, int refok, else if (ada_is_variant_part (type, i)) { int j; - struct type *field_type = ada_check_typedef (TYPE_FIELD_TYPE (type, - i)); + struct type *field_type = ada_check_typedef (type->field (i).type ()); - for (j = TYPE_NFIELDS (field_type) - 1; j >= 0; j -= 1) + for (j = field_type->num_fields () - 1; j >= 0; j -= 1) { /* FIXME pnh 2008/01/26: We check for a field that is NOT wrapped in a struct, since the compiler sometimes @@ -7612,10 +7322,9 @@ ada_lookup_struct_elt_type (struct type *type, const char *name, int refok, if (v_field_name != NULL && field_name_match (v_field_name, name)) - t = TYPE_FIELD_TYPE (field_type, j); + t = field_type->field (j).type (); else - t = ada_lookup_struct_elt_type (TYPE_FIELD_TYPE (field_type, - j), + t = ada_lookup_struct_elt_type (field_type->field (j).type (), name, 0, 1); if (t != NULL) @@ -7632,7 +7341,7 @@ ada_lookup_struct_elt_type (struct type *type, const char *name, int refok, { struct type *t; - t = ada_lookup_struct_elt_type (TYPE_FIELD_TYPE (type, parent_offset), + t = ada_lookup_struct_elt_type (type->field (parent_offset).type (), name, 0, 1); if (t != NULL) return t; @@ -7665,33 +7374,28 @@ is_unchecked_variant (struct type *var_type, struct type *outer_type) /* Assuming that VAR_TYPE is the type of a variant part of a record (a union), - within a value of type OUTER_TYPE that is stored in GDB at - OUTER_VALADDR, determine which variant clause (field number in VAR_TYPE, + within OUTER, determine which variant clause (field number in VAR_TYPE, numbering from 0) is applicable. Returns -1 if none are. */ int -ada_which_variant_applies (struct type *var_type, struct type *outer_type, - const gdb_byte *outer_valaddr) +ada_which_variant_applies (struct type *var_type, struct value *outer) { int others_clause; int i; const char *discrim_name = ada_variant_discrim_name (var_type); - struct value *outer; struct value *discrim; LONGEST discrim_val; /* Using plain value_from_contents_and_address here causes problems because we will end up trying to resolve a type that is currently being constructed. */ - outer = value_from_contents_and_address_unresolved (outer_type, - outer_valaddr, 0); discrim = ada_value_struct_elt (outer, discrim_name, 1); if (discrim == NULL) return -1; discrim_val = value_as_long (discrim); others_clause = -1; - for (i = 0; i < TYPE_NFIELDS (var_type); i += 1) + for (i = 0; i < var_type->num_fields (); i += 1) { if (ada_is_others_clause (var_type, i)) others_clause = i; @@ -7760,7 +7464,7 @@ ada_value_ind (struct value *val0) static struct value * ada_coerce_ref (struct value *val0) { - if (TYPE_CODE (value_type (val0)) == TYPE_CODE_REF) + if (value_type (val0)->code () == TYPE_CODE_REF) { struct value *val = val0; @@ -7775,15 +7479,6 @@ ada_coerce_ref (struct value *val0) return val0; } -/* Return OFF rounded upward if necessary to a multiple of - ALIGNMENT (a power of 2). */ - -static unsigned int -align_value (unsigned int off, unsigned int alignment) -{ - return (off + alignment - 1) & ~(alignment - 1); -} - /* Return the bit alignment required for field #F of template type TYPE. */ static unsigned int @@ -7870,11 +7565,11 @@ ada_prefer_type (struct type *type0, struct type *type1) return 1; else if (type0 == NULL) return 0; - else if (TYPE_CODE (type1) == TYPE_CODE_VOID) + else if (type1->code () == TYPE_CODE_VOID) return 1; - else if (TYPE_CODE (type0) == TYPE_CODE_VOID) + else if (type0->code () == TYPE_CODE_VOID) return 0; - else if (TYPE_NAME (type1) == NULL && TYPE_NAME (type0) != NULL) + else if (type1->name () == NULL && type0->name () != NULL) return 1; else if (ada_is_constrained_packed_array_type (type0)) return 1; @@ -7883,8 +7578,8 @@ ada_prefer_type (struct type *type0, struct type *type1) return 1; else { - const char *type0_name = TYPE_NAME (type0); - const char *type1_name = TYPE_NAME (type1); + const char *type0_name = type0->name (); + const char *type1_name = type1->name (); if (type0_name != NULL && strstr (type0_name, "___XR") != NULL && (type1_name == NULL || strstr (type1_name, "___XR") == NULL)) @@ -7901,7 +7596,7 @@ ada_type_name (struct type *type) { if (type == NULL) return NULL; - return TYPE_NAME (type); + return type->name (); } /* Search the list of "descriptive" types associated to TYPE for a type @@ -8012,7 +7707,7 @@ dynamic_template_type (struct type *type) { type = ada_check_typedef (type); - if (type == NULL || TYPE_CODE (type) != TYPE_CODE_STRUCT + if (type == NULL || type->code () != TYPE_CODE_STRUCT || ada_type_name (type) == NULL) return NULL; else @@ -8035,7 +7730,7 @@ is_dynamic_field (struct type *templ_type, int field_num) const char *name = TYPE_FIELD_NAME (templ_type, field_num); return name != NULL - && TYPE_CODE (TYPE_FIELD_TYPE (templ_type, field_num)) == TYPE_CODE_PTR + && templ_type->field (field_num).type ()->code () == TYPE_CODE_PTR && strstr (name, "___XVL") != NULL; } @@ -8047,10 +7742,10 @@ variant_field_index (struct type *type) { int f; - if (type == NULL || TYPE_CODE (type) != TYPE_CODE_STRUCT) + if (type == NULL || type->code () != TYPE_CODE_STRUCT) return -1; - for (f = 0; f < TYPE_NFIELDS (type); f += 1) + for (f = 0; f < type->num_fields (); f += 1) { if (ada_is_variant_part (type, f)) return f; @@ -8065,11 +7760,9 @@ empty_record (struct type *templ) { struct type *type = alloc_type_copy (templ); - TYPE_CODE (type) = TYPE_CODE_STRUCT; - TYPE_NFIELDS (type) = 0; - TYPE_FIELDS (type) = NULL; + type->set_code (TYPE_CODE_STRUCT); INIT_NONE_SPECIFIC (type); - TYPE_NAME (type) = ""; + type->set_name (""); TYPE_LENGTH (type) = 0; return type; } @@ -8110,24 +7803,23 @@ ada_template_to_fixed_record_type_1 (struct type *type, to be processed: unless keep_dynamic_fields, this includes only fields whose position and length are static will be processed. */ if (keep_dynamic_fields) - nfields = TYPE_NFIELDS (type); + nfields = type->num_fields (); else { nfields = 0; - while (nfields < TYPE_NFIELDS (type) + while (nfields < type->num_fields () && !ada_is_variant_part (type, nfields) && !is_dynamic_field (type, nfields)) nfields++; } rtype = alloc_type_copy (type); - TYPE_CODE (rtype) = TYPE_CODE_STRUCT; + rtype->set_code (TYPE_CODE_STRUCT); INIT_NONE_SPECIFIC (rtype); - TYPE_NFIELDS (rtype) = nfields; - TYPE_FIELDS (rtype) = (struct field *) - TYPE_ALLOC (rtype, nfields * sizeof (struct field)); - memset (TYPE_FIELDS (rtype), 0, sizeof (struct field) * nfields); - TYPE_NAME (rtype) = ada_type_name (type); + rtype->set_num_fields (nfields); + rtype->set_fields + ((struct field *) TYPE_ZALLOC (rtype, nfields * sizeof (struct field))); + rtype->set_name (ada_type_name (type)); TYPE_FIXED_INSTANCE (rtype) = 1; off = 0; @@ -8136,9 +7828,9 @@ ada_template_to_fixed_record_type_1 (struct type *type, for (f = 0; f < nfields; f += 1) { - off = align_value (off, field_alignment (type, f)) + off = align_up (off, field_alignment (type, f)) + TYPE_FIELD_BITPOS (type, f); - SET_FIELD_BITPOS (TYPE_FIELD (rtype, f), off); + SET_FIELD_BITPOS (rtype->field (f), off); TYPE_FIELD_BITSIZE (rtype, f) = 0; if (ada_is_variant_part (type, f)) @@ -8151,7 +7843,7 @@ ada_template_to_fixed_record_type_1 (struct type *type, const gdb_byte *field_valaddr = valaddr; CORE_ADDR field_address = address; struct type *field_type = - TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, f)); + TYPE_TARGET_TYPE (type->field (f).type ()); if (dval0 == NULL) { @@ -8210,7 +7902,7 @@ ada_template_to_fixed_record_type_1 (struct type *type, record size. */ ada_ensure_varsize_limit (field_type); - TYPE_FIELD_TYPE (rtype, f) = field_type; + rtype->field (f).set_type (field_type); TYPE_FIELD_NAME (rtype, f) = TYPE_FIELD_NAME (type, f); /* The multiplication can potentially overflow. But because the field length has been size-checked just above, and @@ -8219,7 +7911,7 @@ ada_template_to_fixed_record_type_1 (struct type *type, adding overflow recovery code to this already complex code, we just assume that it's not going to happen. */ fld_bit_len = - TYPE_LENGTH (TYPE_FIELD_TYPE (rtype, f)) * TARGET_CHAR_BIT; + TYPE_LENGTH (rtype->field (f).type ()) * TARGET_CHAR_BIT; } else { @@ -8233,20 +7925,20 @@ ada_template_to_fixed_record_type_1 (struct type *type, structure, the typedef is the only clue which allows us to distinguish between the two options. Stripping it would prevent us from printing this field appropriately. */ - TYPE_FIELD_TYPE (rtype, f) = TYPE_FIELD_TYPE (type, f); + rtype->field (f).set_type (type->field (f).type ()); TYPE_FIELD_NAME (rtype, f) = TYPE_FIELD_NAME (type, f); if (TYPE_FIELD_BITSIZE (type, f) > 0) fld_bit_len = TYPE_FIELD_BITSIZE (rtype, f) = TYPE_FIELD_BITSIZE (type, f); else { - struct type *field_type = TYPE_FIELD_TYPE (type, f); + struct type *field_type = type->field (f).type (); /* We need to be careful of typedefs when computing the length of our field. If this is a typedef, get the length of the target type, not the length of the typedef. */ - if (TYPE_CODE (field_type) == TYPE_CODE_TYPEDEF) + if (field_type->code () == TYPE_CODE_TYPEDEF) field_type = ada_typedef_target_type (field_type); fld_bit_len = @@ -8257,7 +7949,7 @@ ada_template_to_fixed_record_type_1 (struct type *type, bit_len = off + fld_bit_len; off += fld_bit_len; TYPE_LENGTH (rtype) = - align_value (bit_len, TARGET_CHAR_BIT) / TARGET_CHAR_BIT; + align_up (bit_len, TARGET_CHAR_BIT) / TARGET_CHAR_BIT; } /* We handle the variant part, if any, at the end because of certain @@ -8284,26 +7976,26 @@ ada_template_to_fixed_record_type_1 (struct type *type, branch_type = to_fixed_variant_branch_type - (TYPE_FIELD_TYPE (type, variant_field), + (type->field (variant_field).type (), cond_offset_host (valaddr, off / TARGET_CHAR_BIT), cond_offset_target (address, off / TARGET_CHAR_BIT), dval); if (branch_type == NULL) { - for (f = variant_field + 1; f < TYPE_NFIELDS (rtype); f += 1) - TYPE_FIELDS (rtype)[f - 1] = TYPE_FIELDS (rtype)[f]; - TYPE_NFIELDS (rtype) -= 1; + for (f = variant_field + 1; f < rtype->num_fields (); f += 1) + rtype->field (f - 1) = rtype->field (f); + rtype->set_num_fields (rtype->num_fields () - 1); } else { - TYPE_FIELD_TYPE (rtype, variant_field) = branch_type; + rtype->field (variant_field).set_type (branch_type); TYPE_FIELD_NAME (rtype, variant_field) = "S"; fld_bit_len = - TYPE_LENGTH (TYPE_FIELD_TYPE (rtype, variant_field)) * + TYPE_LENGTH (rtype->field (variant_field).type ()) * TARGET_CHAR_BIT; if (off + fld_bit_len > bit_len) bit_len = off + fld_bit_len; TYPE_LENGTH (rtype) = - align_value (bit_len, TARGET_CHAR_BIT) / TARGET_CHAR_BIT; + align_up (bit_len, TARGET_CHAR_BIT) / TARGET_CHAR_BIT; } } @@ -8315,17 +8007,17 @@ ada_template_to_fixed_record_type_1 (struct type *type, the current RTYPE length might be good enough for our purposes. */ if (TYPE_LENGTH (type) <= 0) { - if (TYPE_NAME (rtype)) + if (rtype->name ()) warning (_("Invalid type size for `%s' detected: %s."), - TYPE_NAME (rtype), pulongest (TYPE_LENGTH (type))); + rtype->name (), pulongest (TYPE_LENGTH (type))); else warning (_("Invalid type size for detected: %s."), pulongest (TYPE_LENGTH (type))); } else { - TYPE_LENGTH (rtype) = align_value (TYPE_LENGTH (rtype), - TYPE_LENGTH (type)); + TYPE_LENGTH (rtype) = align_up (TYPE_LENGTH (rtype), + TYPE_LENGTH (type)); } value_free_to_mark (mark); @@ -8371,7 +8063,7 @@ template_to_static_fixed_type (struct type *type0) /* Don't clone TYPE0 until we are sure we are going to need a copy. */ type = type0; - nfields = TYPE_NFIELDS (type0); + nfields = type0->num_fields (); /* Whether or not we cloned TYPE0, cache the result so that we don't do recompute all over next time. */ @@ -8379,7 +8071,7 @@ template_to_static_fixed_type (struct type *type0) for (f = 0; f < nfields; f += 1) { - struct type *field_type = TYPE_FIELD_TYPE (type0, f); + struct type *field_type = type0->field (f).type (); struct type *new_type; if (is_dynamic_field (type0, f)) @@ -8396,18 +8088,22 @@ template_to_static_fixed_type (struct type *type0) if (type == type0) { TYPE_TARGET_TYPE (type0) = type = alloc_type_copy (type0); - TYPE_CODE (type) = TYPE_CODE (type0); + type->set_code (type0->code ()); INIT_NONE_SPECIFIC (type); - TYPE_NFIELDS (type) = nfields; - TYPE_FIELDS (type) = (struct field *) - TYPE_ALLOC (type, nfields * sizeof (struct field)); - memcpy (TYPE_FIELDS (type), TYPE_FIELDS (type0), + type->set_num_fields (nfields); + + field *fields = + ((struct field *) + TYPE_ALLOC (type, nfields * sizeof (struct field))); + memcpy (fields, type0->fields (), sizeof (struct field) * nfields); - TYPE_NAME (type) = ada_type_name (type0); + type->set_fields (fields); + + type->set_name (ada_type_name (type0)); TYPE_FIXED_INSTANCE (type) = 1; TYPE_LENGTH (type) = 0; } - TYPE_FIELD_TYPE (type, f) = new_type; + type->field (f).set_type (new_type); TYPE_FIELD_NAME (type, f) = TYPE_FIELD_NAME (type0, f); } } @@ -8430,7 +8126,7 @@ to_record_with_fixed_variant_part (struct type *type, const gdb_byte *valaddr, struct value *dval; struct type *rtype; struct type *branch_type; - int nfields = TYPE_NFIELDS (type); + int nfields = type->num_fields (); int variant_field = variant_field_index (type); if (variant_field == -1) @@ -8445,19 +8141,21 @@ to_record_with_fixed_variant_part (struct type *type, const gdb_byte *valaddr, dval = dval0; rtype = alloc_type_copy (type); - TYPE_CODE (rtype) = TYPE_CODE_STRUCT; + rtype->set_code (TYPE_CODE_STRUCT); INIT_NONE_SPECIFIC (rtype); - TYPE_NFIELDS (rtype) = nfields; - TYPE_FIELDS (rtype) = + rtype->set_num_fields (nfields); + + field *fields = (struct field *) TYPE_ALLOC (rtype, nfields * sizeof (struct field)); - memcpy (TYPE_FIELDS (rtype), TYPE_FIELDS (type), - sizeof (struct field) * nfields); - TYPE_NAME (rtype) = ada_type_name (type); + memcpy (fields, type->fields (), sizeof (struct field) * nfields); + rtype->set_fields (fields); + + rtype->set_name (ada_type_name (type)); TYPE_FIXED_INSTANCE (rtype) = 1; TYPE_LENGTH (rtype) = TYPE_LENGTH (type); branch_type = to_fixed_variant_branch_type - (TYPE_FIELD_TYPE (type, variant_field), + (type->field (variant_field).type (), cond_offset_host (valaddr, TYPE_FIELD_BITPOS (type, variant_field) / TARGET_CHAR_BIT), @@ -8469,17 +8167,17 @@ to_record_with_fixed_variant_part (struct type *type, const gdb_byte *valaddr, int f; for (f = variant_field + 1; f < nfields; f += 1) - TYPE_FIELDS (rtype)[f - 1] = TYPE_FIELDS (rtype)[f]; - TYPE_NFIELDS (rtype) -= 1; + rtype->field (f - 1) = rtype->field (f); + rtype->set_num_fields (rtype->num_fields () - 1); } else { - TYPE_FIELD_TYPE (rtype, variant_field) = branch_type; + rtype->field (variant_field).set_type (branch_type); TYPE_FIELD_NAME (rtype, variant_field) = "S"; TYPE_FIELD_BITSIZE (rtype, variant_field) = 0; TYPE_LENGTH (rtype) += TYPE_LENGTH (branch_type); } - TYPE_LENGTH (rtype) -= TYPE_LENGTH (TYPE_FIELD_TYPE (type, variant_field)); + TYPE_LENGTH (rtype) -= TYPE_LENGTH (type->field (variant_field).type ()); value_free_to_mark (mark); return rtype; @@ -8547,7 +8245,7 @@ to_fixed_variant_branch_type (struct type *var_type0, const gdb_byte *valaddr, struct type *templ_type; struct type *var_type; - if (TYPE_CODE (var_type0) == TYPE_CODE_PTR) + if (var_type0->code () == TYPE_CODE_PTR) var_type = TYPE_TARGET_TYPE (var_type0); else var_type = var_type0; @@ -8559,22 +8257,20 @@ to_fixed_variant_branch_type (struct type *var_type0, const gdb_byte *valaddr, if (is_unchecked_variant (var_type, value_type (dval))) return var_type0; - which = - ada_which_variant_applies (var_type, - value_type (dval), value_contents (dval)); + which = ada_which_variant_applies (var_type, dval); if (which < 0) return empty_record (var_type); else if (is_dynamic_field (var_type, which)) return to_fixed_record_type - (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (var_type, which)), + (TYPE_TARGET_TYPE (var_type->field (which).type ()), valaddr, address, dval); - else if (variant_field_index (TYPE_FIELD_TYPE (var_type, which)) >= 0) + else if (variant_field_index (var_type->field (which).type ()) >= 0) return to_fixed_record_type - (TYPE_FIELD_TYPE (var_type, which), valaddr, address, dval); + (var_type->field (which).type (), valaddr, address, dval); else - return TYPE_FIELD_TYPE (var_type, which); + return var_type->field (which).type (); } /* Assuming RANGE_TYPE is a TYPE_CODE_RANGE, return nonzero if @@ -8589,10 +8285,10 @@ ada_is_redundant_range_encoding (struct type *range_type, int n; LONGEST lo, hi; - gdb_assert (TYPE_CODE (range_type) == TYPE_CODE_RANGE); + gdb_assert (range_type->code () == TYPE_CODE_RANGE); - if (TYPE_CODE (get_base_type (range_type)) - != TYPE_CODE (get_base_type (encoding_type))) + if (get_base_type (range_type)->code () + != get_base_type (encoding_type)->code ()) { /* The compiler probably used a simple base type to describe the range type instead of the range's actual base type, @@ -8605,23 +8301,23 @@ ada_is_redundant_range_encoding (struct type *range_type, if (is_dynamic_type (range_type)) return 0; - if (TYPE_NAME (encoding_type) == NULL) + if (encoding_type->name () == NULL) return 0; - bounds_str = strstr (TYPE_NAME (encoding_type), "___XDLU_"); + bounds_str = strstr (encoding_type->name (), "___XDLU_"); if (bounds_str == NULL) return 0; n = 8; /* Skip "___XDLU_". */ if (!ada_scan_number (bounds_str, n, &lo, &n)) return 0; - if (TYPE_LOW_BOUND (range_type) != lo) + if (range_type->bounds ()->low.const_val () != lo) return 0; n += 2; /* Skip the "__" separator between the two bounds. */ if (!ada_scan_number (bounds_str, n, &hi, &n)) return 0; - if (TYPE_HIGH_BOUND (range_type) != hi) + if (range_type->bounds ()->high.const_val () != hi) return 0; return 1; @@ -8638,10 +8334,10 @@ ada_is_redundant_index_type_desc (struct type *array_type, struct type *this_layer = check_typedef (array_type); int i; - for (i = 0; i < TYPE_NFIELDS (desc_type); i++) + for (i = 0; i < desc_type->num_fields (); i++) { - if (!ada_is_redundant_range_encoding (TYPE_INDEX_TYPE (this_layer), - TYPE_FIELD_TYPE (desc_type, i))) + if (!ada_is_redundant_range_encoding (this_layer->index_type (), + desc_type->field (i).type ())) return 0; this_layer = check_typedef (TYPE_TARGET_TYPE (this_layer)); } @@ -8734,7 +8430,7 @@ to_fixed_array_type (struct type *type0, struct value *dval, result = type0; else result = create_array_type (alloc_type_copy (type0), - elt_type, TYPE_INDEX_TYPE (type0)); + elt_type, type0->index_type ()); } else { @@ -8742,7 +8438,7 @@ to_fixed_array_type (struct type *type0, struct value *dval, struct type *elt_type0; elt_type0 = type0; - for (i = TYPE_NFIELDS (index_type_desc); i > 0; i -= 1) + for (i = index_type_desc->num_fields (); i > 0; i -= 1) elt_type0 = TYPE_TARGET_TYPE (elt_type0); /* NOTE: result---the fixed version of elt_type0---should never @@ -8760,10 +8456,10 @@ to_fixed_array_type (struct type *type0, struct value *dval, ada_to_fixed_type (ada_check_typedef (elt_type0), 0, 0, dval, 1); elt_type0 = type0; - for (i = TYPE_NFIELDS (index_type_desc) - 1; i >= 0; i -= 1) + for (i = index_type_desc->num_fields () - 1; i >= 0; i -= 1) { struct type *range_type = - to_fixed_range_type (TYPE_FIELD_TYPE (index_type_desc, i), dval); + to_fixed_range_type (index_type_desc->field (i).type (), dval); result = create_array_type (alloc_type_copy (elt_type0), result, range_type); @@ -8776,7 +8472,7 @@ to_fixed_array_type (struct type *type0, struct value *dval, /* We want to preserve the type name. This can be useful when trying to get the type name of a value that has already been printed (for instance, if the user did "print VAR; whatis $". */ - TYPE_NAME (result) = TYPE_NAME (type0); + result->set_name (type0->name ()); if (constrained_packed_array_p) { @@ -8820,7 +8516,7 @@ ada_to_fixed_type_1 (struct type *type, const gdb_byte *valaddr, if (!HAVE_GNAT_AUX_INFO (type)) return type; - switch (TYPE_CODE (type)) + switch (type->code ()) { default: return type; @@ -8968,7 +8664,7 @@ ada_to_fixed_type (struct type *type, const gdb_byte *valaddr, only in that situation. But this seems unnecessary so far, probably because we call check_typedef/ada_check_typedef pretty much everywhere. */ - if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF + if (type->code () == TYPE_CODE_TYPEDEF && (TYPE_MAIN_TYPE (ada_typedef_target_type (type)) == TYPE_MAIN_TYPE (fixed_type))) return type; @@ -8992,7 +8688,7 @@ to_static_fixed_type (struct type *type0) type0 = ada_check_typedef (type0); - switch (TYPE_CODE (type0)) + switch (type0->code ()) { default: return type0; @@ -9018,9 +8714,9 @@ static_unwrap_type (struct type *type) { if (ada_is_aligner_type (type)) { - struct type *type1 = TYPE_FIELD_TYPE (ada_check_typedef (type), 0); + struct type *type1 = ada_check_typedef (type)->field (0).type (); if (ada_type_name (type1) == NULL) - TYPE_NAME (type1) = ada_type_name (type); + type1->set_name (ada_type_name (type)); return static_unwrap_type (type1); } @@ -9065,13 +8761,13 @@ ada_check_typedef (struct type *type) return type; type = check_typedef (type); - if (type == NULL || TYPE_CODE (type) != TYPE_CODE_ENUM + if (type == NULL || type->code () != TYPE_CODE_ENUM || !TYPE_STUB (type) - || TYPE_NAME (type) == NULL) + || type->name () == NULL) return type; else { - const char *name = TYPE_NAME (type); + const char *name = type->name (); struct type *type1 = ada_find_any_type (name); if (type1 == NULL) @@ -9081,7 +8777,7 @@ ada_check_typedef (struct type *type) stubs pointing to arrays, as we don't create symbols for array types, only for the typedef-to-array types). If that's the case, strip the typedef layer. */ - if (TYPE_CODE (type1) == TYPE_CODE_TYPEDEF) + if (type1->code () == TYPE_CODE_TYPEDEF) type1 = ada_check_typedef (type1); return type1; @@ -9184,6 +8880,21 @@ value_pos_atr (struct type *type, struct value *arg) /* Evaluate the TYPE'VAL attribute applied to ARG. */ +static struct value * +val_atr (struct type *type, LONGEST val) +{ + gdb_assert (discrete_type_p (type)); + if (type->code () == TYPE_CODE_RANGE) + type = TYPE_TARGET_TYPE (type); + if (type->code () == TYPE_CODE_ENUM) + { + if (val < 0 || val >= type->num_fields ()) + error (_("argument to 'VAL out of range")); + val = TYPE_FIELD_ENUMVAL (type, val); + } + return value_from_longest (type, val); +} + static struct value * value_val_atr (struct type *type, struct value *arg) { @@ -9192,16 +8903,7 @@ value_val_atr (struct type *type, struct value *arg) if (!integer_type_p (value_type (arg))) error (_("'VAL requires integral argument")); - if (TYPE_CODE (type) == TYPE_CODE_ENUM) - { - long pos = value_as_long (arg); - - if (pos < 0 || pos >= TYPE_NFIELDS (type)) - error (_("argument to 'VAL out of range")); - return value_from_longest (type, TYPE_FIELD_ENUMVAL (type, pos)); - } - else - return value_from_longest (type, value_as_long (arg)); + return val_atr (type, value_as_long (arg)); } @@ -9218,15 +8920,15 @@ ada_is_character_type (struct type *type) /* If the type code says it's a character, then assume it really is, and don't check any further. */ - if (TYPE_CODE (type) == TYPE_CODE_CHAR) + if (type->code () == TYPE_CODE_CHAR) return true; /* Otherwise, assume it's a character type iff it is a discrete type with a known character type name. */ name = ada_type_name (type); return (name != NULL - && (TYPE_CODE (type) == TYPE_CODE_INT - || TYPE_CODE (type) == TYPE_CODE_RANGE) + && (type->code () == TYPE_CODE_INT + || type->code () == TYPE_CODE_RANGE) && (strcmp (name, "character") == 0 || strcmp (name, "wide_character") == 0 || strcmp (name, "wide_wide_character") == 0 @@ -9240,7 +8942,7 @@ ada_is_string_type (struct type *type) { type = ada_check_typedef (type); if (type != NULL - && TYPE_CODE (type) != TYPE_CODE_PTR + && type->code () != TYPE_CODE_PTR && (ada_is_simple_array_type (type) || ada_is_array_descriptor_type (type)) && ada_array_arity (type) == 1) @@ -9276,8 +8978,8 @@ ada_is_aligner_type (struct type *type) if (!trust_pad_over_xvs && ada_find_parallel_type (type, "___XVS") != NULL) return 0; - return (TYPE_CODE (type) == TYPE_CODE_STRUCT - && TYPE_NFIELDS (type) == 1 + return (type->code () == TYPE_CODE_STRUCT + && type->num_fields () == 1 && strcmp (TYPE_FIELD_NAME (type, 0), "F") == 0); } @@ -9290,7 +8992,7 @@ ada_get_base_type (struct type *raw_type) struct type *real_type_namer; struct type *raw_real_type; - if (raw_type == NULL || TYPE_CODE (raw_type) != TYPE_CODE_STRUCT) + if (raw_type == NULL || raw_type->code () != TYPE_CODE_STRUCT) return raw_type; if (ada_is_aligner_type (raw_type)) @@ -9310,11 +9012,11 @@ ada_get_base_type (struct type *raw_type) real_type_namer = ada_find_parallel_type (raw_type, "___XVS"); if (real_type_namer == NULL - || TYPE_CODE (real_type_namer) != TYPE_CODE_STRUCT - || TYPE_NFIELDS (real_type_namer) != 1) + || real_type_namer->code () != TYPE_CODE_STRUCT + || real_type_namer->num_fields () != 1) return raw_type; - if (TYPE_CODE (TYPE_FIELD_TYPE (real_type_namer, 0)) != TYPE_CODE_REF) + if (real_type_namer->field (0).type ()->code () != TYPE_CODE_REF) { /* This is an older encoding form where the base type needs to be looked up by name. We prefer the newer encoding because it is @@ -9327,7 +9029,7 @@ ada_get_base_type (struct type *raw_type) } /* The field in our XVS type is a reference to the base type. */ - return TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (real_type_namer, 0)); + return TYPE_TARGET_TYPE (real_type_namer->field (0).type ()); } /* The type of value designated by TYPE, with all aligners removed. */ @@ -9336,7 +9038,7 @@ struct type * ada_aligned_type (struct type *type) { if (ada_is_aligner_type (type)) - return ada_aligned_type (TYPE_FIELD_TYPE (type, 0)); + return ada_aligned_type (type->field (0).type ()); else return ada_get_base_type (type); } @@ -9349,7 +9051,7 @@ const gdb_byte * ada_aligned_value_addr (struct type *type, const gdb_byte *valaddr) { if (ada_is_aligner_type (type)) - return ada_aligned_value_addr (TYPE_FIELD_TYPE (type, 0), + return ada_aligned_value_addr (type->field (0).type (), valaddr + TYPE_FIELD_BITPOS (type, 0) / TARGET_CHAR_BIT); @@ -9445,7 +9147,7 @@ ada_enum_name (const char *name) static struct value * evaluate_subexp_type (struct expression *exp, int *pos) { - return evaluate_subexp (NULL_TYPE, exp, pos, EVAL_AVOID_SIDE_EFFECTS); + return evaluate_subexp (nullptr, exp, pos, EVAL_AVOID_SIDE_EFFECTS); } /* If VAL is wrapped in an aligner or subtype wrapper, return the @@ -9462,7 +9164,7 @@ unwrap_value (struct value *val) struct type *val_type = ada_check_typedef (value_type (v)); if (ada_type_name (val_type) == NULL) - TYPE_NAME (val_type) = ada_type_name (type); + val_type->set_name (ada_type_name (type)); return unwrap_value (v); } @@ -9502,7 +9204,7 @@ cast_to_fixed (struct type *type, struct value *arg) return arg; struct value *scale = ada_scaling_factor (type); - if (ada_is_fixed_point_type (value_type (arg))) + if (ada_is_gnat_encoded_fixed_point_type (value_type (arg))) arg = cast_from_fixed (value_type (scale), arg); else arg = value_cast (value_type (scale), arg); @@ -9553,9 +9255,9 @@ ada_promote_array_of_integrals (struct type *type, struct value *val) /* Verify that both val and type are arrays of scalars, and that the size of val's elements is smaller than the size of type's element. */ - gdb_assert (TYPE_CODE (type) == TYPE_CODE_ARRAY); + gdb_assert (type->code () == TYPE_CODE_ARRAY); gdb_assert (is_integral_type (TYPE_TARGET_TYPE (type))); - gdb_assert (TYPE_CODE (value_type (val)) == TYPE_CODE_ARRAY); + gdb_assert (value_type (val)->code () == TYPE_CODE_ARRAY); gdb_assert (is_integral_type (TYPE_TARGET_TYPE (value_type (val)))); gdb_assert (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > TYPE_LENGTH (TYPE_TARGET_TYPE (value_type (val)))); @@ -9591,15 +9293,15 @@ coerce_for_assign (struct type *type, struct value *val) type2 = ada_check_typedef (type2); type = ada_check_typedef (type); - if (TYPE_CODE (type2) == TYPE_CODE_PTR - && TYPE_CODE (type) == TYPE_CODE_ARRAY) + if (type2->code () == TYPE_CODE_PTR + && type->code () == TYPE_CODE_ARRAY) { val = ada_value_ind (val); type2 = value_type (val); } - if (TYPE_CODE (type2) == TYPE_CODE_ARRAY - && TYPE_CODE (type) == TYPE_CODE_ARRAY) + if (type2->code () == TYPE_CODE_ARRAY + && type->code () == TYPE_CODE_ARRAY) { if (!ada_same_array_size_p (type, type2)) error (_("cannot assign arrays of different length")); @@ -9634,8 +9336,8 @@ ada_value_binop (struct value *arg1, struct value *arg2, enum exp_opcode op) type1 = get_base_type (ada_check_typedef (value_type (arg1))); type2 = get_base_type (ada_check_typedef (value_type (arg2))); - if (TYPE_CODE (type1) != TYPE_CODE_INT - || TYPE_CODE (type2) != TYPE_CODE_INT) + if (type1->code () != TYPE_CODE_INT + || type2->code () != TYPE_CODE_INT) return value_binop (arg1, arg2, op); switch (op) @@ -9699,8 +9401,8 @@ ada_value_equal (struct value *arg1, struct value *arg2) arg1_type = ada_check_typedef (value_type (arg1)); arg2_type = ada_check_typedef (value_type (arg2)); - if (TYPE_CODE (arg1_type) != TYPE_CODE_ARRAY - || TYPE_CODE (arg2_type) != TYPE_CODE_ARRAY) + if (arg1_type->code () != TYPE_CODE_ARRAY + || arg2_type->code () != TYPE_CODE_ARRAY) error (_("Attempt to compare array with non-array")); /* FIXME: The following works only for types whose representations use all bits (no padding or undefined bits) @@ -9754,7 +9456,7 @@ assign_component (struct value *container, struct value *lhs, LONGEST index, struct value *elt; struct type *lhs_type = check_typedef (value_type (lhs)); - if (TYPE_CODE (lhs_type) == TYPE_CODE_ARRAY) + if (lhs_type->code () == TYPE_CODE_ARRAY) { struct type *index_type = builtin_type (exp->gdbarch)->builtin_int; struct value *index_val = value_from_longest (index_type, index); @@ -9818,10 +9520,10 @@ assign_aggregate (struct value *container, { lhs = ada_coerce_to_simple_array (lhs); lhs_type = check_typedef (value_type (lhs)); - low_index = TYPE_ARRAY_LOWER_BOUND_VALUE (lhs_type); - high_index = TYPE_ARRAY_UPPER_BOUND_VALUE (lhs_type); + low_index = lhs_type->bounds ()->low.const_val (); + high_index = lhs_type->bounds ()->high.const_val (); } - else if (TYPE_CODE (lhs_type) == TYPE_CODE_STRUCT) + else if (lhs_type->code () == TYPE_CODE_STRUCT) { low_index = 0; high_index = num_visible_fields (lhs_type) - 1; @@ -10050,10 +9752,10 @@ ada_value_cast (struct type *type, struct value *arg2) if (type == ada_check_typedef (value_type (arg2))) return arg2; - if (ada_is_fixed_point_type (type)) + if (ada_is_gnat_encoded_fixed_point_type (type)) return cast_to_fixed (type, arg2); - if (ada_is_fixed_point_type (value_type (arg2))) + if (ada_is_gnat_encoded_fixed_point_type (value_type (arg2))) return cast_from_fixed (type, arg2); return value_cast (type, arg2); @@ -10415,8 +10117,8 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, result = evaluate_subexp_standard (expect_type, exp, pos, noside); /* The result type will have code OP_STRING, bashed there from OP_ARRAY. Bash it back. */ - if (TYPE_CODE (value_type (result)) == TYPE_CODE_STRING) - TYPE_CODE (value_type (result)) = TYPE_CODE_ARRAY; + if (value_type (result)->code () == TYPE_CODE_STRING) + value_type (result)->set_code (TYPE_CODE_ARRAY); return result; } @@ -10431,7 +10133,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, return ada_evaluate_subexp (type, exp, pos, noside); case BINOP_ASSIGN: - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + arg1 = evaluate_subexp (nullptr, exp, pos, noside); if (exp->elts[*pos].opcode == OP_AGGREGATE) { arg1 = assign_aggregate (arg1, arg1, exp, pos, noside); @@ -10453,9 +10155,9 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, { /* Nothing. */ } - else if (ada_is_fixed_point_type (value_type (arg1))) + else if (ada_is_gnat_encoded_fixed_point_type (value_type (arg1))) arg2 = cast_to_fixed (value_type (arg1), arg2); - else if (ada_is_fixed_point_type (value_type (arg2))) + else if (ada_is_gnat_encoded_fixed_point_type (value_type (arg2))) error (_("Fixed-point values must be assigned to fixed-point variables")); else @@ -10467,23 +10169,23 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, arg2 = evaluate_subexp_with_coercion (exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; - if (TYPE_CODE (value_type (arg1)) == TYPE_CODE_PTR) + if (value_type (arg1)->code () == TYPE_CODE_PTR) return (value_from_longest (value_type (arg1), value_as_long (arg1) + value_as_long (arg2))); - if (TYPE_CODE (value_type (arg2)) == TYPE_CODE_PTR) + if (value_type (arg2)->code () == TYPE_CODE_PTR) return (value_from_longest (value_type (arg2), value_as_long (arg1) + value_as_long (arg2))); - if ((ada_is_fixed_point_type (value_type (arg1)) - || ada_is_fixed_point_type (value_type (arg2))) + if ((ada_is_gnat_encoded_fixed_point_type (value_type (arg1)) + || ada_is_gnat_encoded_fixed_point_type (value_type (arg2))) && value_type (arg1) != value_type (arg2)) error (_("Operands of fixed-point addition must have the same type")); /* Do the addition, and cast the result to the type of the first argument. We cannot cast the result to a reference type, so if ARG1 is a reference type, find its underlying type. */ type = value_type (arg1); - while (TYPE_CODE (type) == TYPE_CODE_REF) + while (type->code () == TYPE_CODE_REF) type = TYPE_TARGET_TYPE (type); binop_promote (exp->language_defn, exp->gdbarch, &arg1, &arg2); return value_cast (type, value_binop (arg1, arg2, BINOP_ADD)); @@ -10493,16 +10195,16 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, arg2 = evaluate_subexp_with_coercion (exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; - if (TYPE_CODE (value_type (arg1)) == TYPE_CODE_PTR) + if (value_type (arg1)->code () == TYPE_CODE_PTR) return (value_from_longest (value_type (arg1), value_as_long (arg1) - value_as_long (arg2))); - if (TYPE_CODE (value_type (arg2)) == TYPE_CODE_PTR) + if (value_type (arg2)->code () == TYPE_CODE_PTR) return (value_from_longest (value_type (arg2), value_as_long (arg1) - value_as_long (arg2))); - if ((ada_is_fixed_point_type (value_type (arg1)) - || ada_is_fixed_point_type (value_type (arg2))) + if ((ada_is_gnat_encoded_fixed_point_type (value_type (arg1)) + || ada_is_gnat_encoded_fixed_point_type (value_type (arg2))) && value_type (arg1) != value_type (arg2)) error (_("Operands of fixed-point subtraction " "must have the same type")); @@ -10510,7 +10212,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, argument. We cannot cast the result to a reference type, so if ARG1 is a reference type, find its underlying type. */ type = value_type (arg1); - while (TYPE_CODE (type) == TYPE_CODE_REF) + while (type->code () == TYPE_CODE_REF) type = TYPE_TARGET_TYPE (type); binop_promote (exp->language_defn, exp->gdbarch, &arg1, &arg2); return value_cast (type, value_binop (arg1, arg2, BINOP_SUB)); @@ -10519,8 +10221,8 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, case BINOP_DIV: case BINOP_REM: case BINOP_MOD: - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); - arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + arg1 = evaluate_subexp (nullptr, exp, pos, noside); + arg2 = evaluate_subexp (nullptr, exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; else if (noside == EVAL_AVOID_SIDE_EFFECTS) @@ -10531,9 +10233,9 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, else { type = builtin_type (exp->gdbarch)->builtin_double; - if (ada_is_fixed_point_type (value_type (arg1))) + if (ada_is_gnat_encoded_fixed_point_type (value_type (arg1))) arg1 = cast_from_fixed (type, arg1); - if (ada_is_fixed_point_type (value_type (arg2))) + if (ada_is_gnat_encoded_fixed_point_type (value_type (arg2))) arg2 = cast_from_fixed (type, arg2); binop_promote (exp->language_defn, exp->gdbarch, &arg1, &arg2); return ada_value_binop (arg1, arg2, op); @@ -10541,7 +10243,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, case BINOP_EQUAL: case BINOP_NOTEQUAL: - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + arg1 = evaluate_subexp (nullptr, exp, pos, noside); arg2 = evaluate_subexp (value_type (arg1), exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; @@ -10558,10 +10260,10 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, return value_from_longest (type, (LONGEST) tem); case UNOP_NEG: - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + arg1 = evaluate_subexp (nullptr, exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; - else if (ada_is_fixed_point_type (value_type (arg1))) + else if (ada_is_gnat_encoded_fixed_point_type (value_type (arg1))) return value_cast (value_type (arg1), value_neg (arg1)); else { @@ -10587,8 +10289,8 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, { struct value *val; - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, EVAL_AVOID_SIDE_EFFECTS); - *pos = pc; + arg1 = evaluate_subexp (nullptr, exp, pos, EVAL_AVOID_SIDE_EFFECTS); + *pos = pc; val = evaluate_subexp_standard (expect_type, exp, pos, noside); return value_cast (value_type (arg1), val); @@ -10619,7 +10321,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, The latter should be shown as usual (as a pointer), whereas a reference should mostly be transparent to the user. */ if (ada_is_tagged_type (type, 0) - || (TYPE_CODE (type) == TYPE_CODE_REF + || (type->code () == TYPE_CODE_REF && ada_is_tagged_type (TYPE_TARGET_TYPE (type), 0))) { /* Tagged types are a little special in the fact that the real @@ -10639,9 +10341,9 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, a fixed type would result in the loss of that type name, thus preventing us from printing the name of the ancestor type in the type description. */ - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, EVAL_NORMAL); + arg1 = evaluate_subexp (nullptr, exp, pos, EVAL_NORMAL); - if (TYPE_CODE (type) != TYPE_CODE_REF) + if (type->code () != TYPE_CODE_REF) { struct type *actual_type; @@ -10674,9 +10376,9 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, For instance, a case statement in a variant record would be replaced by the relevant components based on the actual value of the discriminants. */ - if ((TYPE_CODE (type) == TYPE_CODE_STRUCT + if ((type->code () == TYPE_CODE_STRUCT && dynamic_template_type (type) != NULL) - || (TYPE_CODE (type) == TYPE_CODE_UNION + || (type->code () == TYPE_CODE_UNION && ada_find_parallel_type (type, "___XVU") != NULL)) { *pos += 4; @@ -10702,8 +10404,8 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, else { for (tem = 0; tem <= nargs; tem += 1) - argvec[tem] = evaluate_subexp (NULL_TYPE, exp, pos, noside); - argvec[tem] = 0; + argvec[tem] = evaluate_subexp (nullptr, exp, pos, noside); + argvec[tem] = 0; if (noside == EVAL_SKIP) goto nosideret; @@ -10712,13 +10414,13 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, if (ada_is_constrained_packed_array_type (desc_base_type (value_type (argvec[0])))) argvec[0] = ada_coerce_to_simple_array (argvec[0]); - else if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_ARRAY + else if (value_type (argvec[0])->code () == TYPE_CODE_ARRAY && TYPE_FIELD_BITSIZE (value_type (argvec[0]), 0) != 0) /* This is a packed array that has already been fixed, and therefore already coerced to a simple array. Nothing further to do. */ ; - else if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_REF) + else if (value_type (argvec[0])->code () == TYPE_CODE_REF) { /* Make sure we dereference references so that all the code below feels like it's really handling the referenced value. Wrapping @@ -10726,7 +10428,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, well. */ argvec[0] = ada_to_fixed_value (coerce_ref (argvec[0])); } - else if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_ARRAY + else if (value_type (argvec[0])->code () == TYPE_CODE_ARRAY && VALUE_LVAL (argvec[0]) == lval_memory) argvec[0] = value_addr (argvec[0]); @@ -10735,12 +10437,12 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, /* Ada allows us to implicitly dereference arrays when subscripting them. So, if this is an array typedef (encoding use for array access types encoded as fat pointers), strip it now. */ - if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF) + if (type->code () == TYPE_CODE_TYPEDEF) type = ada_typedef_target_type (type); - if (TYPE_CODE (type) == TYPE_CODE_PTR) + if (type->code () == TYPE_CODE_PTR) { - switch (TYPE_CODE (ada_check_typedef (TYPE_TARGET_TYPE (type)))) + switch (ada_check_typedef (TYPE_TARGET_TYPE (type))->code ()) { case TYPE_CODE_FUNC: type = ada_check_typedef (TYPE_TARGET_TYPE (type)); @@ -10759,7 +10461,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, } } - switch (TYPE_CODE (type)) + switch (type->code ()) { case TYPE_CODE_FUNC: if (noside == EVAL_AVOID_SIDE_EFFECTS) @@ -10832,12 +10534,12 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, case TERNOP_SLICE: { - struct value *array = evaluate_subexp (NULL_TYPE, exp, pos, noside); - struct value *low_bound_val = - evaluate_subexp (NULL_TYPE, exp, pos, noside); - struct value *high_bound_val = - evaluate_subexp (NULL_TYPE, exp, pos, noside); - LONGEST low_bound; + struct value *array = evaluate_subexp (nullptr, exp, pos, noside); + struct value *low_bound_val + = evaluate_subexp (nullptr, exp, pos, noside); + struct value *high_bound_val + = evaluate_subexp (nullptr, exp, pos, noside); + LONGEST low_bound; LONGEST high_bound; low_bound_val = coerce_ref (low_bound_val); @@ -10850,7 +10552,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, /* If this is a reference to an aligner type, then remove all the aligners. */ - if (TYPE_CODE (value_type (array)) == TYPE_CODE_REF + if (value_type (array)->code () == TYPE_CODE_REF && ada_is_aligner_type (TYPE_TARGET_TYPE (value_type (array)))) TYPE_TARGET_TYPE (value_type (array)) = ada_aligned_type (TYPE_TARGET_TYPE (value_type (array))); @@ -10860,8 +10562,8 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, /* If this is a reference to an array or an array lvalue, convert to a pointer. */ - if (TYPE_CODE (value_type (array)) == TYPE_CODE_REF - || (TYPE_CODE (value_type (array)) == TYPE_CODE_ARRAY + if (value_type (array)->code () == TYPE_CODE_REF + || (value_type (array)->code () == TYPE_CODE_ARRAY && VALUE_LVAL (array) == lval_memory)) array = value_addr (array); @@ -10875,8 +10577,8 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, /* If we have more than one level of pointer indirection, dereference the value until we get only one level. */ - while (TYPE_CODE (value_type (array)) == TYPE_CODE_PTR - && (TYPE_CODE (TYPE_TARGET_TYPE (value_type (array))) + while (value_type (array)->code () == TYPE_CODE_PTR + && (TYPE_TARGET_TYPE (value_type (array))->code () == TYPE_CODE_PTR)) array = value_ind (array); @@ -10887,7 +10589,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, if (!ada_is_simple_array_type (value_type (array))) error (_("cannot take slice of non-array")); - if (TYPE_CODE (ada_check_typedef (value_type (array))) + if (ada_check_typedef (value_type (array))->code () == TYPE_CODE_PTR) { struct type *type0 = ada_check_typedef (value_type (array)); @@ -10915,13 +10617,13 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, case UNOP_IN_RANGE: (*pos) += 2; - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + arg1 = evaluate_subexp (nullptr, exp, pos, noside); type = check_typedef (exp->elts[pc + 1].type); if (noside == EVAL_SKIP) goto nosideret; - switch (TYPE_CODE (type)) + switch (type->code ()) { default: lim_warning (_("Membership test incompletely implemented; " @@ -10930,8 +10632,10 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, return value_from_longest (type, (LONGEST) 1); case TYPE_CODE_RANGE: - arg2 = value_from_longest (type, TYPE_LOW_BOUND (type)); - arg3 = value_from_longest (type, TYPE_HIGH_BOUND (type)); + arg2 = value_from_longest (type, + type->bounds ()->low.const_val ()); + arg3 = value_from_longest (type, + type->bounds ()->high.const_val ()); binop_promote (exp->language_defn, exp->gdbarch, &arg1, &arg2); binop_promote (exp->language_defn, exp->gdbarch, &arg1, &arg3); type = language_bool_type (exp->language_defn, exp->gdbarch); @@ -10945,8 +10649,8 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, case BINOP_IN_BOUNDS: (*pos) += 2; - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); - arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + arg1 = evaluate_subexp (nullptr, exp, pos, noside); + arg2 = evaluate_subexp (nullptr, exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; @@ -10977,9 +10681,9 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, || value_equal (arg2, arg1))); case TERNOP_IN_RANGE: - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); - arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside); - arg3 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + arg1 = evaluate_subexp (nullptr, exp, pos, noside); + arg2 = evaluate_subexp (nullptr, exp, pos, noside); + arg3 = evaluate_subexp (nullptr, exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; @@ -11002,14 +10706,14 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, if (exp->elts[*pos].opcode == OP_TYPE) { - evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP); - arg1 = NULL; + evaluate_subexp (nullptr, exp, pos, EVAL_SKIP); + arg1 = NULL; type_arg = check_typedef (exp->elts[pc + 2].type); } else { - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); - type_arg = NULL; + arg1 = evaluate_subexp (nullptr, exp, pos, noside); + type_arg = NULL; } if (exp->elts[*pos].opcode != OP_LONG) @@ -11084,7 +10788,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, const char *name = ada_type_name (type_arg); range_type = NULL; - if (name != NULL && TYPE_CODE (type_arg) != TYPE_CODE_ENUM) + if (name != NULL && type_arg->code () != TYPE_CODE_ENUM) range_type = to_fixed_range_type (type_arg, NULL); if (range_type == NULL) range_type = type_arg; @@ -11102,7 +10806,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, error (_("the 'length attribute applies only to array types")); } } - else if (TYPE_CODE (type_arg) == TYPE_CODE_FLT) + else if (type_arg->code () == TYPE_CODE_FLT) error (_("unimplemented type attribute")); else { @@ -11139,7 +10843,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, } case OP_ATR_TAG: - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + arg1 = evaluate_subexp (nullptr, exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; @@ -11150,9 +10854,9 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, case OP_ATR_MIN: case OP_ATR_MAX: - evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP); - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); - arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + evaluate_subexp (nullptr, exp, pos, EVAL_SKIP); + arg1 = evaluate_subexp (nullptr, exp, pos, noside); + arg2 = evaluate_subexp (nullptr, exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; else if (noside == EVAL_AVOID_SIDE_EFFECTS) @@ -11168,8 +10872,8 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, { struct type *type_arg = check_typedef (exp->elts[pc + 2].type); - evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP); - if (noside == EVAL_SKIP) + evaluate_subexp (nullptr, exp, pos, EVAL_SKIP); + if (noside == EVAL_SKIP) goto nosideret; if (!ada_is_modular_type (type_arg)) @@ -11181,8 +10885,8 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, case OP_ATR_POS: - evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP); - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + evaluate_subexp (nullptr, exp, pos, EVAL_SKIP); + arg1 = evaluate_subexp (nullptr, exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; type = builtin_type (exp->gdbarch)->builtin_int; @@ -11192,13 +10896,13 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, return value_pos_atr (type, arg1); case OP_ATR_SIZE: - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + arg1 = evaluate_subexp (nullptr, exp, pos, noside); type = value_type (arg1); /* If the argument is a reference, then dereference its type, since the user is really asking for the size of the actual object, not the size of the pointer. */ - if (TYPE_CODE (type) == TYPE_CODE_REF) + if (type->code () == TYPE_CODE_REF) type = TYPE_TARGET_TYPE (type); if (noside == EVAL_SKIP) @@ -11210,8 +10914,8 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, TARGET_CHAR_BIT * TYPE_LENGTH (type)); case OP_ATR_VAL: - evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP); - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + evaluate_subexp (nullptr, exp, pos, EVAL_SKIP); + arg1 = evaluate_subexp (nullptr, exp, pos, noside); type = exp->elts[pc + 2].type; if (noside == EVAL_SKIP) goto nosideret; @@ -11221,8 +10925,8 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, return value_val_atr (type, arg1); case BINOP_EXP: - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); - arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + arg1 = evaluate_subexp (nullptr, exp, pos, noside); + arg2 = evaluate_subexp (nullptr, exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; else if (noside == EVAL_AVOID_SIDE_EFFECTS) @@ -11240,14 +10944,14 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, } case UNOP_PLUS: - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + arg1 = evaluate_subexp (nullptr, exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; else return arg1; case UNOP_ABS: - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + arg1 = evaluate_subexp (nullptr, exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; unop_promote (exp->language_defn, exp->gdbarch, &arg1); @@ -11258,7 +10962,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, case UNOP_IND: preeval_pos = *pos; - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + arg1 = evaluate_subexp (nullptr, exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; type = ada_check_typedef (value_type (arg1)); @@ -11273,22 +10977,22 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, error (_("Attempt to dereference null array pointer.")); return value_at_lazy (arrType, 0); } - else if (TYPE_CODE (type) == TYPE_CODE_PTR - || TYPE_CODE (type) == TYPE_CODE_REF + else if (type->code () == TYPE_CODE_PTR + || type->code () == TYPE_CODE_REF /* In C you can dereference an array to get the 1st elt. */ - || TYPE_CODE (type) == TYPE_CODE_ARRAY) + || type->code () == TYPE_CODE_ARRAY) { /* As mentioned in the OP_VAR_VALUE case, tagged types can only be determined by inspecting the object's tag. This means that we need to evaluate completely the expression in order to get its type. */ - if ((TYPE_CODE (type) == TYPE_CODE_REF - || TYPE_CODE (type) == TYPE_CODE_PTR) + if ((type->code () == TYPE_CODE_REF + || type->code () == TYPE_CODE_PTR) && ada_is_tagged_type (TYPE_TARGET_TYPE (type), 0)) { - arg1 = evaluate_subexp (NULL_TYPE, exp, &preeval_pos, - EVAL_NORMAL); + arg1 + = evaluate_subexp (nullptr, exp, &preeval_pos, EVAL_NORMAL); type = value_type (ada_value_ind (arg1)); } else @@ -11300,7 +11004,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, ada_ensure_varsize_limit (type); return value_zero (type, lval_memory); } - else if (TYPE_CODE (type) == TYPE_CODE_INT) + else if (type->code () == TYPE_CODE_INT) { /* GDB allows dereferencing an int. */ if (expect_type == NULL) @@ -11319,7 +11023,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, arg1 = ada_coerce_ref (arg1); /* FIXME: What is this for?? */ type = ada_check_typedef (value_type (arg1)); - if (TYPE_CODE (type) == TYPE_CODE_INT) + if (type->code () == TYPE_CODE_INT) /* GDB allows dereferencing an int. If we were given the expect_type, then use that as the target type. Otherwise, assume that the target type is an int. */ @@ -11342,7 +11046,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, tem = longest_to_int (exp->elts[pc + 1].longconst); (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1); preeval_pos = *pos; - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + arg1 = evaluate_subexp (nullptr, exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; if (noside == EVAL_AVOID_SIDE_EFFECTS) @@ -11361,8 +11065,8 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, if (type == NULL) { - arg1 = evaluate_subexp (NULL_TYPE, exp, &preeval_pos, - EVAL_NORMAL); + arg1 + = evaluate_subexp (nullptr, exp, &preeval_pos, EVAL_NORMAL); arg1 = ada_value_struct_elt (arg1, &exp->elts[pc + 2].string, 0); @@ -11433,10 +11137,10 @@ nosideret: Otherwise, return NULL. */ static const char * -fixed_type_info (struct type *type) +gnat_encoded_fixed_type_info (struct type *type) { const char *name = ada_type_name (type); - enum type_code code = (type == NULL) ? TYPE_CODE_UNDEF : TYPE_CODE (type); + enum type_code code = (type == NULL) ? TYPE_CODE_UNDEF : type->code (); if ((code == TYPE_CODE_INT || code == TYPE_CODE_RANGE) && name != NULL) { @@ -11448,7 +11152,7 @@ fixed_type_info (struct type *type) return tail + 5; } else if (code == TYPE_CODE_RANGE && TYPE_TARGET_TYPE (type) != type) - return fixed_type_info (TYPE_TARGET_TYPE (type)); + return gnat_encoded_fixed_type_info (TYPE_TARGET_TYPE (type)); else return NULL; } @@ -11456,9 +11160,9 @@ fixed_type_info (struct type *type) /* Returns non-zero iff TYPE represents an Ada fixed-point type. */ int -ada_is_fixed_point_type (struct type *type) +ada_is_gnat_encoded_fixed_point_type (struct type *type) { - return fixed_type_info (type) != NULL; + return gnat_encoded_fixed_type_info (type) != NULL; } /* Return non-zero iff TYPE represents a System.Address type. */ @@ -11466,8 +11170,7 @@ ada_is_fixed_point_type (struct type *type) int ada_is_system_address_type (struct type *type) { - return (TYPE_NAME (type) - && strcmp (TYPE_NAME (type), "system__address") == 0); + return (type->name () && strcmp (type->name (), "system__address") == 0); } /* Assuming that TYPE is the representation of an Ada fixed-point @@ -11485,9 +11188,9 @@ ada_scaling_type (struct type *type) delta cannot be determined. */ struct value * -ada_delta (struct type *type) +gnat_encoded_fixed_point_delta (struct type *type) { - const char *encoding = fixed_type_info (type); + const char *encoding = gnat_encoded_fixed_type_info (type); struct type *scale_type = ada_scaling_type (type); long long num, den; @@ -11499,13 +11202,13 @@ ada_delta (struct type *type) value_from_longest (scale_type, den), BINOP_DIV); } -/* Assuming that ada_is_fixed_point_type (TYPE), return the scaling - factor ('SMALL value) associated with the type. */ +/* Assuming that ada_is_gnat_encoded_fixed_point_type (TYPE), return + the scaling factor ('SMALL value) associated with the type. */ struct value * ada_scaling_factor (struct type *type) { - const char *encoding = fixed_type_info (type); + const char *encoding = gnat_encoded_fixed_type_info (type); struct type *scale_type = ada_scaling_type (type); long long num0, den0, num1, den1; @@ -11635,14 +11338,14 @@ to_fixed_range_type (struct type *raw_type, struct value *dval) const char *subtype_info; gdb_assert (raw_type != NULL); - gdb_assert (TYPE_NAME (raw_type) != NULL); + gdb_assert (raw_type->name () != NULL); - if (TYPE_CODE (raw_type) == TYPE_CODE_RANGE) + if (raw_type->code () == TYPE_CODE_RANGE) base_type = TYPE_TARGET_TYPE (raw_type); else base_type = raw_type; - name = TYPE_NAME (raw_type); + name = raw_type->name (); subtype_info = strstr (name, "___XD"); if (subtype_info == NULL) { @@ -11716,7 +11419,7 @@ to_fixed_range_type (struct type *raw_type, struct value *dval) to match the size of the base_type, which is not what we want. Set it back to the original range type's length. */ TYPE_LENGTH (type) = TYPE_LENGTH (raw_type); - TYPE_NAME (type) = name; + type->set_name (name); return type; } } @@ -11739,8 +11442,8 @@ ada_is_modular_type (struct type *type) { struct type *subranged_type = get_base_type (type); - return (subranged_type != NULL && TYPE_CODE (type) == TYPE_CODE_RANGE - && TYPE_CODE (subranged_type) == TYPE_CODE_INT + return (subranged_type != NULL && type->code () == TYPE_CODE_RANGE + && subranged_type->code () == TYPE_CODE_INT && TYPE_UNSIGNED (subranged_type)); } @@ -11749,7 +11452,14 @@ ada_is_modular_type (struct type *type) ULONGEST ada_modulus (struct type *type) { - return (ULONGEST) TYPE_HIGH_BOUND (type) + 1; + const dynamic_prop &high = type->bounds ()->high; + + if (high.kind () == PROP_CONST) + return (ULONGEST) high.const_val () + 1; + + /* If TYPE is unresolved, the high bound might be a location list. Return + 0, for lack of a better value to return. */ + return 0; } @@ -12222,7 +11932,8 @@ ada_exception_message_1 (void) return NULL; gdb::unique_xmalloc_ptr e_msg ((char *) xmalloc (e_msg_len + 1)); - read_memory_string (value_address (e_msg_val), e_msg.get (), e_msg_len + 1); + read_memory (value_address (e_msg_val), (gdb_byte *) e_msg.get (), + e_msg_len); e_msg.get ()[e_msg_len] = '\0'; return e_msg; @@ -13117,7 +12828,7 @@ catch_assert_command (const char *arg_entry, int from_tty, static int ada_is_exception_sym (struct symbol *sym) { - const char *type_name = TYPE_NAME (SYMBOL_TYPE (sym)); + const char *type_name = SYMBOL_TYPE (sym)->name (); return (SYMBOL_CLASS (sym) != LOC_TYPEDEF && SYMBOL_CLASS (sym) != LOC_BLOCK @@ -13702,7 +13413,7 @@ ada_print_subexp (struct expression *exp, int *pos, case OP_ATR_VAL: if (exp->elts[*pos].opcode == OP_TYPE) { - if (TYPE_CODE (exp->elts[*pos + 1].type) != TYPE_CODE_VOID) + if (exp->elts[*pos + 1].type->code () != TYPE_CODE_VOID) LA_PRINT_TYPE (exp->elts[*pos + 1].type, "", stream, 0, 0, &type_print_raw_options); *pos += 3; @@ -13832,88 +13543,9 @@ enum ada_primitive_types { nr_ada_primitive_types }; -static void -ada_language_arch_info (struct gdbarch *gdbarch, - struct language_arch_info *lai) -{ - const struct builtin_type *builtin = builtin_type (gdbarch); - - lai->primitive_type_vector - = GDBARCH_OBSTACK_CALLOC (gdbarch, nr_ada_primitive_types + 1, - struct type *); - - lai->primitive_type_vector [ada_primitive_type_int] - = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), - 0, "integer"); - lai->primitive_type_vector [ada_primitive_type_long] - = arch_integer_type (gdbarch, gdbarch_long_bit (gdbarch), - 0, "long_integer"); - lai->primitive_type_vector [ada_primitive_type_short] - = arch_integer_type (gdbarch, gdbarch_short_bit (gdbarch), - 0, "short_integer"); - lai->string_char_type - = lai->primitive_type_vector [ada_primitive_type_char] - = arch_character_type (gdbarch, TARGET_CHAR_BIT, 0, "character"); - lai->primitive_type_vector [ada_primitive_type_float] - = arch_float_type (gdbarch, gdbarch_float_bit (gdbarch), - "float", gdbarch_float_format (gdbarch)); - lai->primitive_type_vector [ada_primitive_type_double] - = arch_float_type (gdbarch, gdbarch_double_bit (gdbarch), - "long_float", gdbarch_double_format (gdbarch)); - lai->primitive_type_vector [ada_primitive_type_long_long] - = arch_integer_type (gdbarch, gdbarch_long_long_bit (gdbarch), - 0, "long_long_integer"); - lai->primitive_type_vector [ada_primitive_type_long_double] - = arch_float_type (gdbarch, gdbarch_long_double_bit (gdbarch), - "long_long_float", gdbarch_long_double_format (gdbarch)); - lai->primitive_type_vector [ada_primitive_type_natural] - = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), - 0, "natural"); - lai->primitive_type_vector [ada_primitive_type_positive] - = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), - 0, "positive"); - lai->primitive_type_vector [ada_primitive_type_void] - = builtin->builtin_void; - - lai->primitive_type_vector [ada_primitive_type_system_address] - = lookup_pointer_type (arch_type (gdbarch, TYPE_CODE_VOID, TARGET_CHAR_BIT, - "void")); - TYPE_NAME (lai->primitive_type_vector [ada_primitive_type_system_address]) - = "system__address"; - - /* Create the equivalent of the System.Storage_Elements.Storage_Offset - type. This is a signed integral type whose size is the same as - the size of addresses. */ - { - unsigned int addr_length = TYPE_LENGTH - (lai->primitive_type_vector [ada_primitive_type_system_address]); - - lai->primitive_type_vector [ada_primitive_type_storage_offset] - = arch_integer_type (gdbarch, addr_length * HOST_CHAR_BIT, 0, - "storage_offset"); - } - - lai->bool_type_symbol = NULL; - lai->bool_type_default = builtin->builtin_bool; -} /* Language vector */ -/* Not really used, but needed in the ada_language_defn. */ - -static void -emit_char (int c, struct type *type, struct ui_file *stream, int quoter) -{ - ada_emit_char (c, type, stream, quoter, 1); -} - -static int -parse (struct parser_state *ps) -{ - warnings_issued = 0; - return ada_parse (ps); -} - static const struct exp_descriptor ada_exp_descriptor = { ada_print_subexp, ada_operator_length, @@ -13957,14 +13589,16 @@ do_exact_match (const char *symbol_search_name, ada_lookup_name_info::ada_lookup_name_info (const lookup_name_info &lookup_name) { - const std::string &user_name = lookup_name.name (); + gdb::string_view user_name = lookup_name.name (); if (user_name[0] == '<') { if (user_name.back () == '>') - m_encoded_name = user_name.substr (1, user_name.size () - 2); + m_encoded_name + = gdb::to_string (user_name.substr (1, user_name.size () - 2)); else - m_encoded_name = user_name.substr (1, user_name.size () - 1); + m_encoded_name + = gdb::to_string (user_name.substr (1, user_name.size () - 1)); m_encoded_p = true; m_verbatim_p = true; m_wild_match_p = false; @@ -13974,19 +13608,19 @@ ada_lookup_name_info::ada_lookup_name_info (const lookup_name_info &lookup_name) { m_verbatim_p = false; - m_encoded_p = user_name.find ("__") != std::string::npos; + m_encoded_p = user_name.find ("__") != gdb::string_view::npos; if (!m_encoded_p) { - const char *folded = ada_fold_name (user_name.c_str ()); + const char *folded = ada_fold_name (user_name); const char *encoded = ada_encode_1 (folded, false); if (encoded != NULL) m_encoded_name = encoded; else - m_encoded_name = user_name; + m_encoded_name = gdb::to_string (user_name); } else - m_encoded_name = user_name; + m_encoded_name = gdb::to_string (user_name); /* Handle the 'package Standard' special case. See description of m_standard_p. */ @@ -14033,12 +13667,12 @@ literal_symbol_name_matcher (const char *symbol_search_name, const lookup_name_info &lookup_name, completion_match_result *comp_match_res) { - const std::string &name = lookup_name.name (); + gdb::string_view name_view = lookup_name.name (); - int cmp = (lookup_name.completion_mode () - ? strncmp (symbol_search_name, name.c_str (), name.size ()) - : strcmp (symbol_search_name, name.c_str ())); - if (cmp == 0) + if (lookup_name.completion_mode () + ? (strncmp (symbol_search_name, name_view.data (), + name_view.size ()) == 0) + : symbol_search_name == name_view) { if (comp_match_res != NULL) comp_match_res->set_match (symbol_search_name); @@ -14048,7 +13682,7 @@ literal_symbol_name_matcher (const char *symbol_search_name, return false; } -/* Implement the "la_get_symbol_name_matcher" language_defn method for +/* Implement the "get_symbol_name_matcher" language_defn method for Ada. */ static symbol_name_matcher_ftype * @@ -14070,32 +13704,15 @@ ada_get_symbol_name_matcher (const lookup_name_info &lookup_name) } } -/* Implement the "la_read_var_value" language_defn method for Ada. */ - -static struct value * -ada_read_var_value (struct symbol *var, const struct block *var_block, - struct frame_info *frame) -{ - /* The only case where default_read_var_value is not sufficient - is when VAR is a renaming... */ - if (frame != nullptr) - { - const struct block *frame_block = get_frame_block (frame, NULL); - if (frame_block != nullptr && ada_is_renaming_symbol (var)) - return ada_read_renaming_var_value (var, frame_block); - } - - /* This is a typical case where we expect the default_read_var_value - function to work. */ - return default_read_var_value (var, var_block, frame); -} - static const char *ada_extensions[] = { ".adb", ".ads", ".a", ".ada", ".dg", NULL }; -extern const struct language_defn ada_language_defn = { +/* Constant data that describes the Ada language. */ + +extern const struct language_data ada_language_data = +{ "ada", /* Language name */ "Ada", language_ada, @@ -14106,65 +13723,488 @@ extern const struct language_defn ada_language_defn = { macro_expansion_no, ada_extensions, &ada_exp_descriptor, - parse, - resolve, - ada_printchar, /* Print a character constant */ - ada_printstr, /* Function to print string constant */ - emit_char, /* Function to print single char (not used) */ - ada_print_type, /* Print a type using appropriate syntax */ - ada_print_typedef, /* Print a typedef using appropriate syntax */ - ada_val_print, /* Print a value using appropriate syntax */ - ada_value_print, /* Print a top-level value */ - ada_read_var_value, /* la_read_var_value */ - NULL, /* Language specific skip_trampoline */ NULL, /* name_of_this */ true, /* la_store_sym_names_in_linkage_form_p */ - ada_lookup_symbol_nonlocal, /* Looking up non-local symbols. */ - basic_lookup_transparent_type, /* lookup_transparent_type */ - ada_la_decode, /* Language specific symbol demangler */ - ada_sniff_from_mangled_name, - NULL, /* Language specific - class_name_from_physname */ ada_op_print_tab, /* expression operators for printing */ 0, /* c-style arrays */ 1, /* String lower bound */ - ada_get_gdb_completer_word_break_characters, - ada_collect_symbol_completion_matches, - ada_language_arch_info, - ada_print_array_index, - default_pass_by_reference, - ada_watch_location_expression, - ada_get_symbol_name_matcher, /* la_get_symbol_name_matcher */ - ada_iterate_over_symbols, - default_search_name_hash, &ada_varobj_ops, - NULL, - NULL, - ada_is_string_type, "(...)" /* la_struct_too_deep_ellipsis */ }; -/* Command-list for the "set/show ada" prefix command. */ -static struct cmd_list_element *set_ada_list; -static struct cmd_list_element *show_ada_list; +/* Class representing the Ada language. */ -/* Implement the "set ada" prefix command. */ - -static void -set_ada_command (const char *arg, int from_tty) +class ada_language : public language_defn { - printf_unfiltered (_(\ -"\"set ada\" must be followed by the name of a setting.\n")); - help_list (set_ada_list, "set ada ", all_commands, gdb_stdout); -} +public: + ada_language () + : language_defn (language_ada, ada_language_data) + { /* Nothing. */ } -/* Implement the "show ada" prefix command. */ + /* Print an array element index using the Ada syntax. */ -static void -show_ada_command (const char *args, int from_tty) -{ - cmd_show_list (show_ada_list, from_tty, ""); -} + void print_array_index (struct type *index_type, + LONGEST index, + struct ui_file *stream, + const value_print_options *options) const override + { + struct value *index_value = val_atr (index_type, index); + + LA_VALUE_PRINT (index_value, stream, options); + fprintf_filtered (stream, " => "); + } + + /* Implement the "read_var_value" language_defn method for Ada. */ + + struct value *read_var_value (struct symbol *var, + const struct block *var_block, + struct frame_info *frame) const override + { + /* The only case where default_read_var_value is not sufficient + is when VAR is a renaming... */ + if (frame != nullptr) + { + const struct block *frame_block = get_frame_block (frame, NULL); + if (frame_block != nullptr && ada_is_renaming_symbol (var)) + return ada_read_renaming_var_value (var, frame_block); + } + + /* This is a typical case where we expect the default_read_var_value + function to work. */ + return language_defn::read_var_value (var, var_block, frame); + } + + /* See language.h. */ + void language_arch_info (struct gdbarch *gdbarch, + struct language_arch_info *lai) const override + { + const struct builtin_type *builtin = builtin_type (gdbarch); + + lai->primitive_type_vector + = GDBARCH_OBSTACK_CALLOC (gdbarch, nr_ada_primitive_types + 1, + struct type *); + + lai->primitive_type_vector [ada_primitive_type_int] + = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), + 0, "integer"); + lai->primitive_type_vector [ada_primitive_type_long] + = arch_integer_type (gdbarch, gdbarch_long_bit (gdbarch), + 0, "long_integer"); + lai->primitive_type_vector [ada_primitive_type_short] + = arch_integer_type (gdbarch, gdbarch_short_bit (gdbarch), + 0, "short_integer"); + lai->string_char_type + = lai->primitive_type_vector [ada_primitive_type_char] + = arch_character_type (gdbarch, TARGET_CHAR_BIT, 0, "character"); + lai->primitive_type_vector [ada_primitive_type_float] + = arch_float_type (gdbarch, gdbarch_float_bit (gdbarch), + "float", gdbarch_float_format (gdbarch)); + lai->primitive_type_vector [ada_primitive_type_double] + = arch_float_type (gdbarch, gdbarch_double_bit (gdbarch), + "long_float", gdbarch_double_format (gdbarch)); + lai->primitive_type_vector [ada_primitive_type_long_long] + = arch_integer_type (gdbarch, gdbarch_long_long_bit (gdbarch), + 0, "long_long_integer"); + lai->primitive_type_vector [ada_primitive_type_long_double] + = arch_float_type (gdbarch, gdbarch_long_double_bit (gdbarch), + "long_long_float", gdbarch_long_double_format (gdbarch)); + lai->primitive_type_vector [ada_primitive_type_natural] + = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), + 0, "natural"); + lai->primitive_type_vector [ada_primitive_type_positive] + = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), + 0, "positive"); + lai->primitive_type_vector [ada_primitive_type_void] + = builtin->builtin_void; + + lai->primitive_type_vector [ada_primitive_type_system_address] + = lookup_pointer_type (arch_type (gdbarch, TYPE_CODE_VOID, TARGET_CHAR_BIT, + "void")); + lai->primitive_type_vector [ada_primitive_type_system_address] + ->set_name ("system__address"); + + /* Create the equivalent of the System.Storage_Elements.Storage_Offset + type. This is a signed integral type whose size is the same as + the size of addresses. */ + { + unsigned int addr_length = TYPE_LENGTH + (lai->primitive_type_vector [ada_primitive_type_system_address]); + + lai->primitive_type_vector [ada_primitive_type_storage_offset] + = arch_integer_type (gdbarch, addr_length * HOST_CHAR_BIT, 0, + "storage_offset"); + } + + lai->bool_type_symbol = NULL; + lai->bool_type_default = builtin->builtin_bool; + } + + /* See language.h. */ + + bool iterate_over_symbols + (const struct block *block, const lookup_name_info &name, + domain_enum domain, + gdb::function_view callback) const override + { + std::vector results; + + ada_lookup_symbol_list_worker (name, block, domain, &results, 0); + for (block_symbol &sym : results) + { + if (!callback (&sym)) + return false; + } + + return true; + } + + /* See language.h. */ + bool sniff_from_mangled_name (const char *mangled, + char **out) const override + { + std::string demangled = ada_decode (mangled); + + *out = NULL; + + if (demangled != mangled && demangled[0] != '<') + { + /* Set the gsymbol language to Ada, but still return 0. + Two reasons for that: + + 1. For Ada, we prefer computing the symbol's decoded name + on the fly rather than pre-compute it, in order to save + memory (Ada projects are typically very large). + + 2. There are some areas in the definition of the GNAT + encoding where, with a bit of bad luck, we might be able + to decode a non-Ada symbol, generating an incorrect + demangled name (Eg: names ending with "TB" for instance + are identified as task bodies and so stripped from + the decoded name returned). + + Returning true, here, but not setting *DEMANGLED, helps us get + a little bit of the best of both worlds. Because we're last, + we should not affect any of the other languages that were + able to demangle the symbol before us; we get to correctly + tag Ada symbols as such; and even if we incorrectly tagged a + non-Ada symbol, which should be rare, any routing through the + Ada language should be transparent (Ada tries to behave much + like C/C++ with non-Ada symbols). */ + return true; + } + + return false; + } + + /* See language.h. */ + + char *demangle (const char *mangled, int options) const override + { + return ada_la_decode (mangled, options); + } + + /* See language.h. */ + + void print_type (struct type *type, const char *varstring, + struct ui_file *stream, int show, int level, + const struct type_print_options *flags) const override + { + ada_print_type (type, varstring, stream, show, level, flags); + } + + /* See language.h. */ + + const char *word_break_characters (void) const override + { + return ada_completer_word_break_characters; + } + + /* See language.h. */ + + void collect_symbol_completion_matches (completion_tracker &tracker, + complete_symbol_mode mode, + symbol_name_match_type name_match_type, + const char *text, const char *word, + enum type_code code) const override + { + struct symbol *sym; + const struct block *b, *surrounding_static_block = 0; + struct block_iterator iter; + + gdb_assert (code == TYPE_CODE_UNDEF); + + lookup_name_info lookup_name (text, name_match_type, true); + + /* First, look at the partial symtab symbols. */ + expand_symtabs_matching (NULL, + lookup_name, + NULL, + NULL, + ALL_DOMAIN); + + /* At this point scan through the misc symbol vectors and add each + symbol you find to the list. Eventually we want to ignore + anything that isn't a text symbol (everything else will be + handled by the psymtab code above). */ + + for (objfile *objfile : current_program_space->objfiles ()) + { + for (minimal_symbol *msymbol : objfile->msymbols ()) + { + QUIT; + + if (completion_skip_symbol (mode, msymbol)) + continue; + + language symbol_language = msymbol->language (); + + /* Ada minimal symbols won't have their language set to Ada. If + we let completion_list_add_name compare using the + default/C-like matcher, then when completing e.g., symbols in a + package named "pck", we'd match internal Ada symbols like + "pckS", which are invalid in an Ada expression, unless you wrap + them in '<' '>' to request a verbatim match. + + Unfortunately, some Ada encoded names successfully demangle as + C++ symbols (using an old mangling scheme), such as "name__2Xn" + -> "Xn::name(void)" and thus some Ada minimal symbols end up + with the wrong language set. Paper over that issue here. */ + if (symbol_language == language_auto + || symbol_language == language_cplus) + symbol_language = language_ada; + + completion_list_add_name (tracker, + symbol_language, + msymbol->linkage_name (), + lookup_name, text, word); + } + } + + /* Search upwards from currently selected frame (so that we can + complete on local vars. */ + + for (b = get_selected_block (0); b != NULL; b = BLOCK_SUPERBLOCK (b)) + { + if (!BLOCK_SUPERBLOCK (b)) + surrounding_static_block = b; /* For elmin of dups */ + + ALL_BLOCK_SYMBOLS (b, iter, sym) + { + if (completion_skip_symbol (mode, sym)) + continue; + + completion_list_add_name (tracker, + sym->language (), + sym->linkage_name (), + lookup_name, text, word); + } + } + + /* Go through the symtabs and check the externs and statics for + symbols which match. */ + + for (objfile *objfile : current_program_space->objfiles ()) + { + for (compunit_symtab *s : objfile->compunits ()) + { + QUIT; + b = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (s), GLOBAL_BLOCK); + ALL_BLOCK_SYMBOLS (b, iter, sym) + { + if (completion_skip_symbol (mode, sym)) + continue; + + completion_list_add_name (tracker, + sym->language (), + sym->linkage_name (), + lookup_name, text, word); + } + } + } + + for (objfile *objfile : current_program_space->objfiles ()) + { + for (compunit_symtab *s : objfile->compunits ()) + { + QUIT; + b = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (s), STATIC_BLOCK); + /* Don't do this block twice. */ + if (b == surrounding_static_block) + continue; + ALL_BLOCK_SYMBOLS (b, iter, sym) + { + if (completion_skip_symbol (mode, sym)) + continue; + + completion_list_add_name (tracker, + sym->language (), + sym->linkage_name (), + lookup_name, text, word); + } + } + } + } + + /* See language.h. */ + + gdb::unique_xmalloc_ptr watch_location_expression + (struct type *type, CORE_ADDR addr) const override + { + type = check_typedef (TYPE_TARGET_TYPE (check_typedef (type))); + std::string name = type_to_string (type); + return gdb::unique_xmalloc_ptr + (xstrprintf ("{%s} %s", name.c_str (), core_addr_to_string (addr))); + } + + /* See language.h. */ + + void value_print (struct value *val, struct ui_file *stream, + const struct value_print_options *options) const override + { + return ada_value_print (val, stream, options); + } + + /* See language.h. */ + + void value_print_inner + (struct value *val, struct ui_file *stream, int recurse, + const struct value_print_options *options) const override + { + return ada_value_print_inner (val, stream, recurse, options); + } + + /* See language.h. */ + + struct block_symbol lookup_symbol_nonlocal + (const char *name, const struct block *block, + const domain_enum domain) const override + { + struct block_symbol sym; + + sym = ada_lookup_symbol (name, block_static_block (block), domain); + if (sym.symbol != NULL) + return sym; + + /* If we haven't found a match at this point, try the primitive + types. In other languages, this search is performed before + searching for global symbols in order to short-circuit that + global-symbol search if it happens that the name corresponds + to a primitive type. But we cannot do the same in Ada, because + it is perfectly legitimate for a program to declare a type which + has the same name as a standard type. If looking up a type in + that situation, we have traditionally ignored the primitive type + in favor of user-defined types. This is why, unlike most other + languages, we search the primitive types this late and only after + having searched the global symbols without success. */ + + if (domain == VAR_DOMAIN) + { + struct gdbarch *gdbarch; + + if (block == NULL) + gdbarch = target_gdbarch (); + else + gdbarch = block_gdbarch (block); + sym.symbol + = language_lookup_primitive_type_as_symbol (this, gdbarch, name); + if (sym.symbol != NULL) + return sym; + } + + return {}; + } + + /* See language.h. */ + + int parser (struct parser_state *ps) const override + { + warnings_issued = 0; + return ada_parse (ps); + } + + /* See language.h. + + Same as evaluate_type (*EXP), but resolves ambiguous symbol references + (marked by OP_VAR_VALUE nodes in which the symbol has an undefined + namespace) and converts operators that are user-defined into + appropriate function calls. If CONTEXT_TYPE is non-null, it provides + a preferred result type [at the moment, only type void has any + effect---causing procedures to be preferred over functions in calls]. + A null CONTEXT_TYPE indicates that a non-void return type is + preferred. May change (expand) *EXP. */ + + void post_parser (expression_up *expp, int void_context_p, int completing, + innermost_block_tracker *tracker) const override + { + struct type *context_type = NULL; + int pc = 0; + + if (void_context_p) + context_type = builtin_type ((*expp)->gdbarch)->builtin_void; + + resolve_subexp (expp, &pc, 1, context_type, completing, tracker); + } + + /* See language.h. */ + + void emitchar (int ch, struct type *chtype, + struct ui_file *stream, int quoter) const override + { + ada_emit_char (ch, chtype, stream, quoter, 1); + } + + /* See language.h. */ + + void printchar (int ch, struct type *chtype, + struct ui_file *stream) const override + { + ada_printchar (ch, chtype, stream); + } + + /* See language.h. */ + + void printstr (struct ui_file *stream, struct type *elttype, + const gdb_byte *string, unsigned int length, + const char *encoding, int force_ellipses, + const struct value_print_options *options) const override + { + ada_printstr (stream, elttype, string, length, encoding, + force_ellipses, options); + } + + /* See language.h. */ + + void print_typedef (struct type *type, struct symbol *new_symbol, + struct ui_file *stream) const override + { + ada_print_typedef (type, new_symbol, stream); + } + + /* See language.h. */ + + bool is_string_type_p (struct type *type) const override + { + return ada_is_string_type (type); + } + + +protected: + /* See language.h. */ + + symbol_name_matcher_ftype *get_symbol_name_matcher_inner + (const lookup_name_info &lookup_name) const override + { + return ada_get_symbol_name_matcher (lookup_name); + } +}; + +/* Single instance of the Ada language class. */ + +static ada_language ada_language_defn; + +/* Command-list for the "set/show ada" prefix command. */ +static struct cmd_list_element *set_ada_list; +static struct cmd_list_element *show_ada_list; static void initialize_ada_catchpoint_ops (void) @@ -14230,18 +14270,19 @@ ada_free_objfile_observer (struct objfile *objfile) ada_clear_symbol_cache (); } +void _initialize_ada_language (); void -_initialize_ada_language (void) +_initialize_ada_language () { initialize_ada_catchpoint_ops (); - add_prefix_cmd ("ada", no_class, set_ada_command, - _("Prefix command for changing Ada-specific settings."), - &set_ada_list, "set ada ", 0, &setlist); + add_basic_prefix_cmd ("ada", no_class, + _("Prefix command for changing Ada-specific settings."), + &set_ada_list, "set ada ", 0, &setlist); - add_prefix_cmd ("ada", no_class, show_ada_command, - _("Generic command for showing Ada-specific settings."), - &show_ada_list, "show ada ", 0, &showlist); + add_show_prefix_cmd ("ada", no_class, + _("Generic command for showing Ada-specific settings."), + &show_ada_list, "show ada ", 0, &showlist); add_setshow_boolean_cmd ("trust-PAD-over-XVS", class_obscure, &trust_pad_over_xvs, _("\ @@ -14318,15 +14359,15 @@ Usage: info exceptions [REGEXP]\n\ If a regular expression is passed as an argument, only those matching\n\ the regular expression are listed.")); - add_prefix_cmd ("ada", class_maintenance, maint_set_ada_cmd, - _("Set Ada maintenance-related variables."), - &maint_set_ada_cmdlist, "maintenance set ada ", - 0/*allow-unknown*/, &maintenance_set_cmdlist); + add_basic_prefix_cmd ("ada", class_maintenance, + _("Set Ada maintenance-related variables."), + &maint_set_ada_cmdlist, "maintenance set ada ", + 0/*allow-unknown*/, &maintenance_set_cmdlist); - add_prefix_cmd ("ada", class_maintenance, maint_show_ada_cmd, - _("Show Ada maintenance-related variables."), - &maint_show_ada_cmdlist, "maintenance show ada ", - 0/*allow-unknown*/, &maintenance_show_cmdlist); + add_show_prefix_cmd ("ada", class_maintenance, + _("Show Ada maintenance-related variables."), + &maint_show_ada_cmdlist, "maintenance show ada ", + 0/*allow-unknown*/, &maintenance_show_cmdlist); add_setshow_boolean_cmd ("ignore-descriptive-types", class_maintenance,