X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fada-lang.c;h=6956909badf766c72955002dff9f1706f3841308;hb=346d1dfebdbc5b7c8ce7d84f9250cbb8f4ec3e6c;hp=a10d8005a09eccc5764827d9f1e71fc45a59a111;hpb=ee01b6652ad55437e777fb7e6b1745782dc205a4;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index a10d8005a0..6956909bad 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -357,7 +357,8 @@ static struct cmd_list_element *maint_show_ada_cmdlist; static void maint_set_ada_cmd (char *args, int from_tty) { - help_list (maint_set_ada_cmdlist, "maintenance set ada ", -1, gdb_stdout); + help_list (maint_set_ada_cmdlist, "maintenance set ada ", all_commands, + gdb_stdout); } /* Implement the "maintenance show ada" (prefix) command. */ @@ -793,6 +794,7 @@ min_of_type (struct type *t) LONGEST ada_discrete_type_high_bound (struct type *type) { + type = resolve_dynamic_type (type, 0); switch (TYPE_CODE (type)) { case TYPE_CODE_RANGE: @@ -813,6 +815,7 @@ ada_discrete_type_high_bound (struct type *type) LONGEST ada_discrete_type_low_bound (struct type *type) { + type = resolve_dynamic_type (type, 0); switch (TYPE_CODE (type)) { case TYPE_CODE_RANGE: @@ -894,7 +897,7 @@ enum language ada_update_initial_language (enum language lang) { if (lookup_minimal_symbol ("adainit", (const char *) NULL, - (struct objfile *) NULL) != NULL) + (struct objfile *) NULL).minsym != NULL) return language_ada; return lang; @@ -907,7 +910,7 @@ ada_update_initial_language (enum language lang) char * ada_main_name (void) { - struct minimal_symbol *msym; + struct bound_minimal_symbol msym; static char *main_program_name = NULL; /* For Ada, the name of the main procedure is stored in a specific @@ -917,12 +920,12 @@ ada_main_name (void) in Ada. */ msym = lookup_minimal_symbol (ADA_MAIN_PROGRAM_SYMBOL_NAME, NULL, NULL); - if (msym != NULL) + if (msym.minsym != NULL) { CORE_ADDR main_program_name_addr; int err_code; - main_program_name_addr = SYMBOL_VALUE_ADDRESS (msym); + main_program_name_addr = BMSYMBOL_VALUE_ADDRESS (msym); if (main_program_name_addr == 0) error (_("Invalid address for Ada main program name.")); @@ -1981,9 +1984,9 @@ ada_type_of_array (struct value *arr, int bounds) struct value *high = desc_one_bound (descriptor, arity, 1); arity -= 1; - create_range_type (range_type, value_type (low), - longest_to_int (value_as_long (low)), - longest_to_int (value_as_long (high))); + create_static_range_type (range_type, value_type (low), + longest_to_int (value_as_long (low)), + longest_to_int (value_as_long (high))); elt_type = create_array_type (array_type, elt_type, range_type); if (ada_is_unconstrained_packed_array_type (value_type (arr))) @@ -2250,14 +2253,14 @@ decode_constrained_packed_array (struct value *arr) { struct type *type; - arr = ada_coerce_ref (arr); - - /* If our value is a pointer, then dererence it. Make sure that - this operation does not cause the target type to be fixed, as - this would indirectly cause this array to be decoded. The rest - of the routine assumes that the array hasn't been decoded yet, - so we use the basic "value_ind" routine to perform the dereferencing, - as opposed to using "ada_value_ind". */ + /* If our value is a pointer, then dereference it. Likewise if + the value is a reference. Make sure that this operation does not + cause the target type to be fixed, as this would indirectly cause + this array to be decoded. The rest of the routine assumes that + the array hasn't been decoded yet, so we use the basic "coerce_ref" + 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) arr = value_ind (arr); @@ -2406,6 +2409,7 @@ ada_value_primitive_packed_val (struct value *obj, const gdb_byte *valaddr, else if (VALUE_LVAL (obj) == lval_memory && value_lazy (obj)) { v = value_at (type, value_address (obj)); + type = value_type (v); bytes = (unsigned char *) alloca (len); read_memory (value_address (v) + offset, bytes, len); } @@ -2754,9 +2758,10 @@ ada_value_slice_from_ptr (struct value *array_ptr, struct type *type, CORE_ADDR base = value_as_address (array_ptr) + ((low - ada_discrete_type_low_bound (TYPE_INDEX_TYPE (type0))) * TYPE_LENGTH (TYPE_TARGET_TYPE (type0))); - struct type *index_type = - create_range_type (NULL, TYPE_TARGET_TYPE (TYPE_INDEX_TYPE (type0)), - low, high); + struct type *index_type + = create_static_range_type (NULL, + TYPE_TARGET_TYPE (TYPE_INDEX_TYPE (type0)), + low, high); struct type *slice_type = create_array_type (NULL, TYPE_TARGET_TYPE (type0), index_type); @@ -2768,8 +2773,8 @@ static struct value * ada_value_slice (struct value *array, int low, int high) { struct type *type = ada_check_typedef (value_type (array)); - struct type *index_type = - create_range_type (NULL, TYPE_INDEX_TYPE (type), low, high); + struct type *index_type + = create_static_range_type (NULL, TYPE_INDEX_TYPE (type), low, high); struct type *slice_type = create_array_type (NULL, TYPE_TARGET_TYPE (type), index_type); @@ -2980,9 +2985,9 @@ static struct value * empty_array (struct type *arr_type, int low) { struct type *arr_type0 = ada_check_typedef (arr_type); - struct type *index_type = - create_range_type (NULL, TYPE_TARGET_TYPE (TYPE_INDEX_TYPE (arr_type0)), - low, low - 1); + struct type *index_type + = create_static_range_type + (NULL, TYPE_TARGET_TYPE (TYPE_INDEX_TYPE (arr_type0)), low, low - 1); struct type *elt_type = ada_array_element_type (arr_type0, 1); return allocate_value (create_array_type (NULL, elt_type, index_type)); @@ -4163,7 +4168,7 @@ parse_old_style_renaming (struct type *type, static struct value * ada_read_renaming_var_value (struct symbol *renaming_sym, - struct block *block) + const struct block *block) { const char *sym_name; struct expression *expr; @@ -4661,7 +4666,7 @@ ada_lookup_simple_minsym (const char *name) ALL_MSYMBOLS (objfile, msymbol) { - if (match_name (SYMBOL_LINKAGE_NAME (msymbol), name, wild_match_p) + if (match_name (MSYMBOL_LINKAGE_NAME (msymbol), name, wild_match_p) && MSYMBOL_TYPE (msymbol) != mst_solib_trampoline) { result.minsym = msymbol; @@ -6128,7 +6133,7 @@ ada_make_symbol_completion_list (const char *text0, const char *word, struct symtab *s; struct minimal_symbol *msymbol; struct objfile *objfile; - struct block *b, *surrounding_static_block = 0; + const struct block *b, *surrounding_static_block = 0; int i; struct block_iterator iter; struct cleanup *old_chain = make_cleanup (null_cleanup, NULL); @@ -6182,7 +6187,7 @@ ada_make_symbol_completion_list (const char *text0, const char *word, ALL_MSYMBOLS (objfile, msymbol) { QUIT; - symbol_completion_add (&completions, SYMBOL_LINKAGE_NAME (msymbol), + symbol_completion_add (&completions, MSYMBOL_LINKAGE_NAME (msymbol), text, text_len, text0, word, wild_match_p, encoded_p); } @@ -7347,7 +7352,11 @@ ada_which_variant_applies (struct type *var_type, struct type *outer_type, struct value *discrim; LONGEST discrim_val; - outer = value_from_contents_and_address (outer_type, outer_valaddr, 0); + /* 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; @@ -7886,7 +7895,14 @@ ada_template_to_fixed_record_type_1 (struct type *type, GDB may fail to allocate a value for it. So check the size first before creating the value. */ check_size (rtype); - dval = value_from_contents_and_address (rtype, valaddr, address); + /* 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. */ + dval = value_from_contents_and_address_unresolved (rtype, + valaddr, + address); + rtype = value_type (dval); } else dval = dval0; @@ -7989,7 +8005,14 @@ ada_template_to_fixed_record_type_1 (struct type *type, off = TYPE_FIELD_BITPOS (rtype, variant_field); if (dval0 == NULL) - dval = value_from_contents_and_address (rtype, valaddr, address); + { + /* 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. */ + dval = value_from_contents_and_address_unresolved (rtype, valaddr, + address); + rtype = value_type (dval); + } else dval = dval0; @@ -8130,7 +8153,10 @@ to_record_with_fixed_variant_part (struct type *type, const gdb_byte *valaddr, return type; if (dval0 == NULL) - dval = value_from_contents_and_address (type, valaddr, address); + { + dval = value_from_contents_and_address (type, valaddr, address); + type = value_type (dval); + } else dval = dval0; @@ -8428,6 +8454,7 @@ ada_to_fixed_type_1 (struct type *type, const gdb_byte *valaddr, value_from_contents_and_address (fixed_record_type, valaddr, address); + fixed_record_type = value_type (obj); if (real_type != NULL) return to_fixed_record_type (real_type, NULL, @@ -9878,6 +9905,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, enum exp_opcode op; int tem; int pc; + int preeval_pos; struct value *arg1 = NULL, *arg2 = NULL, *arg3; struct type *type; int nargs, oplen; @@ -10111,7 +10139,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) == TYPE_CODE_REF && ada_is_tagged_type (TYPE_TARGET_TYPE (type), 0))) { /* Tagged types are a little special in the fact that the real @@ -10159,10 +10187,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, } *pos += 4; - return value_zero - (to_static_fixed_type - (static_unwrap_type (SYMBOL_TYPE (exp->elts[pc + 2].symbol))), - not_lval); + return value_zero (to_static_fixed_type (type), not_lval); } else { @@ -10713,6 +10738,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, return arg1; case UNOP_IND: + preeval_pos = *pos; arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; @@ -10733,10 +10759,26 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, /* In C you can dereference an array to get the 1st elt. */ || TYPE_CODE (type) == TYPE_CODE_ARRAY) { - type = to_static_fixed_type - (ada_aligned_type - (ada_check_typedef (TYPE_TARGET_TYPE (type)))); - check_size (type); + /* 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) + && ada_is_tagged_type (TYPE_TARGET_TYPE (type), 0)) + { + arg1 = evaluate_subexp (NULL_TYPE, exp, &preeval_pos, + EVAL_NORMAL); + type = value_type (ada_value_ind (arg1)); + } + else + { + type = to_static_fixed_type + (ada_aligned_type + (ada_check_typedef (TYPE_TARGET_TYPE (type)))); + } + check_size (type); return value_zero (type, lval_memory); } else if (TYPE_CODE (type) == TYPE_CODE_INT) @@ -10780,6 +10822,7 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, case STRUCTOP_STRUCT: 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); if (noside == EVAL_SKIP) goto nosideret; @@ -10792,13 +10835,21 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, type = ada_lookup_struct_elt_type (type1, &exp->elts[pc + 2].string, 1, 1, NULL); + + /* If the field is not found, check if it exists in the + extension of this object's type. This means that we + need to evaluate completely the expression. */ + if (type == NULL) - /* In this case, we assume that the field COULD exist - in some extension of the type. Return an object of - "type" void, which will match any formal - (see ada_type_match). */ - return value_zero (builtin_type (exp->gdbarch)->builtin_void, - lval_memory); + { + arg1 = evaluate_subexp (NULL_TYPE, exp, &preeval_pos, + EVAL_NORMAL); + arg1 = ada_value_struct_elt (arg1, + &exp->elts[pc + 2].string, + 0); + arg1 = unwrap_value (arg1); + type = value_type (ada_to_fixed_value (arg1)); + } } else type = @@ -11093,9 +11144,8 @@ to_fixed_range_type (struct type *raw_type, struct value *dval) if (L < INT_MIN || U > INT_MAX) return raw_type; else - return create_range_type (alloc_type_copy (raw_type), raw_type, - ada_discrete_type_low_bound (raw_type), - ada_discrete_type_high_bound (raw_type)); + return create_static_range_type (alloc_type_copy (raw_type), raw_type, + L, U); } else { @@ -11158,7 +11208,8 @@ to_fixed_range_type (struct type *raw_type, struct value *dval) } } - type = create_range_type (alloc_type_copy (raw_type), base_type, L, U); + type = create_static_range_type (alloc_type_copy (raw_type), + base_type, L, U); TYPE_NAME (type) = name; return type; } @@ -11222,7 +11273,19 @@ ada_modulus (struct type *type) variants of the runtime, we use a sniffer that will determine the runtime variant used by the program being debugged. */ -/* Ada's standard exceptions. */ +/* Ada's standard exceptions. + + The Ada 83 standard also defined Numeric_Error. But there so many + situations where it was unclear from the Ada 83 Reference Manual + (RM) whether Constraint_Error or Numeric_Error should be raised, + that the ARG (Ada Rapporteur Group) eventually issued a Binding + Interpretation saying that anytime the RM says that Numeric_Error + should be raised, the implementation may raise Constraint_Error. + Ada 95 went one step further and pretty much removed Numeric_Error + from the list of standard exceptions (it made it a renaming of + Constraint_Error, to help preserve compatibility when compiling + an Ada83 compiler). As such, we do not include Numeric_Error from + this list of standard exceptions. */ static char *standard_exc[] = { "constraint_error", @@ -11317,10 +11380,10 @@ ada_has_this_exception_support (const struct exception_support_info *einfo) the name of the exception being raised (this name is printed in the catchpoint message, and is also used when trying to catch a specific exception). We do not handle this case for now. */ - struct minimal_symbol *msym + struct bound_minimal_symbol msym = lookup_minimal_symbol (einfo->catch_exception_sym, NULL, NULL); - if (msym && MSYMBOL_TYPE (msym) != mst_solib_trampoline) + if (msym.minsym && MSYMBOL_TYPE (msym.minsym) != mst_solib_trampoline) error (_("Your Ada runtime appears to be missing some debugging " "information.\nCannot insert Ada exception catchpoint " "in this configuration.")); @@ -12673,7 +12736,7 @@ ada_add_standard_exceptions (regex_t *preg, VEC(ada_exc_info) **exceptions) if (msymbol.minsym != NULL) { struct ada_exc_info info - = {standard_exc[i], SYMBOL_VALUE_ADDRESS (msymbol.minsym)}; + = {standard_exc[i], BMSYMBOL_VALUE_ADDRESS (msymbol)}; VEC_safe_push (ada_exc_info, *exceptions, &info); } @@ -12695,7 +12758,7 @@ static void ada_add_exceptions_from_frame (regex_t *preg, struct frame_info *frame, VEC(ada_exc_info) **exceptions) { - struct block *block = get_frame_block (frame, 0); + const struct block *block = get_frame_block (frame, 0); while (block != 0) { @@ -12756,7 +12819,7 @@ ada_add_global_exceptions (regex_t *preg, VEC(ada_exc_info) **exceptions) ALL_PRIMARY_SYMTABS (objfile, s) { - struct blockvector *bv = BLOCKVECTOR (s); + const struct blockvector *bv = BLOCKVECTOR (s); int i; for (i = GLOBAL_BLOCK; i <= STATIC_BLOCK; i++) @@ -13349,10 +13412,10 @@ emit_char (int c, struct type *type, struct ui_file *stream, int quoter) } static int -parse (void) +parse (struct parser_state *ps) { warnings_issued = 0; - return ada_parse (); + return ada_parse (ps); } static const struct exp_descriptor ada_exp_descriptor = { @@ -13381,7 +13444,7 @@ ada_get_symbol_name_cmp (const char *lookup_name) static struct value * ada_read_var_value (struct symbol *var, struct frame_info *frame) { - struct block *frame_block = NULL; + const struct block *frame_block = NULL; struct symbol *renaming_sym = NULL; /* The only case where default_read_var_value is not sufficient @@ -13455,7 +13518,7 @@ set_ada_command (char *arg, int from_tty) { printf_unfiltered (_(\ "\"set ada\" must be followed by the name of a setting.\n")); - help_list (set_ada_list, "set ada ", -1, gdb_stdout); + help_list (set_ada_list, "set ada ", all_commands, gdb_stdout); } /* Implement the "show ada" prefix command. */