diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5e65e5fbf2..4023472349 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2017-12-18 Joel Brobecker + + * ada-lang.c (ada_to_fixed_type_1): Rethrow errors with + a more detailed exception message when getting an exception + while trying to read the value of an XVZ variable. + * ada-valprint.c (ada_val_print): Only catch RETURN_MASK_ERROR + exceptions. Print an error message when an exception is caught. + 2017-12-18 Joel Brobecker * ada-lang.c (assign_component): Strip any TYPE_CODE_TYPEDEF diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 14a0bd63a3..dad2b17794 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -9101,11 +9101,28 @@ ada_to_fixed_type_1 (struct type *type, const gdb_byte *valaddr, const char *name = ada_type_name (fixed_record_type); char *xvz_name = (char *) alloca (strlen (name) + 7 /* "___XVZ\0" */); + bool xvz_found = false; LONGEST size; xsnprintf (xvz_name, strlen (name) + 7, "%s___XVZ", name); - if (get_int_var_value (xvz_name, size) - && TYPE_LENGTH (fixed_record_type) != size) + TRY + { + xvz_found = get_int_var_value (xvz_name, size); + } + CATCH (except, RETURN_MASK_ERROR) + { + /* We found the variable, but somehow failed to read + its value. Rethrow the same error, but with a little + bit more information, to help the user understand + what went wrong (Eg: the variable might have been + optimized out). */ + throw_error (except.error, + _("unable to read value of %s (%s)"), + xvz_name, except.message); + } + END_CATCH + + if (xvz_found && TYPE_LENGTH (fixed_record_type) != size) { fixed_record_type = copy_type (fixed_record_type); TYPE_LENGTH (fixed_record_type) = size; diff --git a/gdb/ada-valprint.c b/gdb/ada-valprint.c index 91dc301af5..b4a48ce515 100644 --- a/gdb/ada-valprint.c +++ b/gdb/ada-valprint.c @@ -1168,16 +1168,16 @@ ada_val_print (struct type *type, struct value *val, const struct value_print_options *options) { - - /* XXX: this catches QUIT/ctrl-c as well. Isn't that busted? */ TRY { ada_val_print_1 (type, embedded_offset, address, stream, recurse, val, options, current_language); } - CATCH (except, RETURN_MASK_ALL) + CATCH (except, RETURN_MASK_ERROR) { + fprintf_filtered (stream, _(""), + except.message); } END_CATCH } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index c074186c6b..51c9864185 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-12-18 Joel Brobecker + + * gdb.dwarf2/ada-valprint-error.c: New file. + * gdb.dwarf2/ada-valprint-error.exp: New file. + 2017-12-18 Joel Brobecker * gdb.ada/assign_arr: New testcase. diff --git a/gdb/testsuite/gdb.dwarf2/ada-valprint-error.c b/gdb/testsuite/gdb.dwarf2/ada-valprint-error.c new file mode 100644 index 0000000000..4f04ab73fa --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/ada-valprint-error.c @@ -0,0 +1,23 @@ +/* Copyright 2017 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +int buffer[] = {0, 0}; +void *fd__global = &buffer; + +int +main (void) +{ + return 0; +} diff --git a/gdb/testsuite/gdb.dwarf2/ada-valprint-error.exp b/gdb/testsuite/gdb.dwarf2/ada-valprint-error.exp new file mode 100644 index 0000000000..192b0cbec2 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/ada-valprint-error.exp @@ -0,0 +1,115 @@ +# Copyright 2017 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +load_lib dwarf.exp + +# This test can only be run on targets which support DWARF-2 and use gas. +if {![dwarf2_support]} { + return 0 +} + +standard_testfile ada-valprint-error.c ada-valprint-error-dw.S + +# We need to know the size of integer and address types in order +# to write some of the debugging info we'd like to generate. +# +# For that, we ask GDB by debugging our ada-valprint-error.c program. +# Any program would do, but since we already have ada-valprint-error.c +# specifically for this testcase, might as well use that. + +if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } { + untested ${testfile}.exp + return -1 +} + +# Make some DWARF for the test. +set asm_file [standard_output_file $srcfile2] +Dwarf::assemble $asm_file { + cu {} { + DW_TAG_compile_unit { + {DW_AT_language @DW_LANG_Ada95} + {DW_AT_name fd.adb} + {DW_AT_comp_dir /tmp} + } { + declare_labels array_elt_label integer_label array_label \ + typedef_label ref_type_label + set ptr_size [get_sizeof "void *" 96] + set int_size [get_sizeof "int" 4] + + # A structure with no size attribute, to mimick structures + # in Ada that have a dynamic size... + array_elt_label: structure_type { + {name fd__Tints_doubledC} + {artificial 1 DW_FORM_flag_present} + } + + # ... and a corresponding XVZ variable, supposed to be there + # to provide the actual size. Except that, in this case, + # the variable has no address, to simulate the fact that + # it has been optimized out (which the compiler can do, + # even if it at the expense of debuggability). + DW_TAG_variable { + {name fd__Tints_doubledC___XVZ} + {DW_AT_type :$integer_label} + {artificial 1 DW_FORM_flag_present} + } + + integer_label: DW_TAG_base_type { + {DW_AT_byte_size $int_size DW_FORM_sdata} + {DW_AT_encoding @DW_ATE_signed} + {DW_AT_name integer} + } + + array_label: DW_TAG_array_type { + {DW_AT_name fd__ints_doubled} + {DW_AT_type :$array_elt_label} + } { + DW_TAG_subrange_type { + {DW_AT_type :$integer_label} + {DW_AT_upper_bound 2 DW_FORM_data1} + } + } + + typedef_label: DW_TAG_typedef { + {DW_AT_name fd__ints_doubled} + {DW_AT_type :$array_label} + } + + ref_type_label: DW_TAG_reference_type { + {DW_AT_byte_size $ptr_size DW_FORM_sdata} + {DW_AT_type :$typedef_label} + } + + DW_TAG_variable { + {name fd__global} + {DW_AT_type :$ref_type_label} + {DW_AT_location { + DW_OP_addr [gdb_target_symbol fd__global] + } SPECIAL_expr} + {external 1 flag} + } + + } + } +} + +if { [prepare_for_testing ${testfile}.exp ${testfile} \ + [list $srcfile $asm_file] {nodebug}] } { + return -1 +} + +gdb_test_no_output "set language ada" + +gdb_test "print fd.global" \ + " = "