720d1a4025
This patch enhances the debugger to distinguish between fat pointers that represent either: array types, or array access types. In the latter case, the object/type is encoded as a typedef type pointing to the fat pointer. The first part of the change is to adjust ada_check_typedef to avoid stripping the typedef layer when it points to a fat pointer. The rest of the patch is adjustments required in various places to deal with the fact that the type is uses might now be a typedef. gdb/ChangeLog: * ada-lang.h (ada_coerce_to_simple_array): Add declaration. * ada-lang.c (ada_typedef_target_type): New function. (desc_base_type): Add handling of fat pointer typedefs. (ada_coerce_to_simple_array): Make non-static. (decode_packed_array_bitsize): Add handling of fat pointer typedefs. Add assertion. (ada_template_to_fixed_record_type_1, ada_to_fixed_type) (ada_check_typedef): Add handling of fat pointer typedefs. (ada_evaluate_subexp) [OP_FUNCALL]: Likewise. * ada-typeprint.c (ada_print_type): Add handling of fat pointer typedefs. * ada-valprint.c (ada_val_print_1): Convert fat pointers that are not array accesses to simple arrays rather than simple array pointers. (ada_value_print): In the case of array descriptors, do not print the value type description unless it is an array access. gdb/testsuite/ChangeLog: * gdb.ada/lang_switch.exp: Correct expected parameter value. gdb/doc/ChangeLog: * gdb.texinfo (Ada Glitches): Remove paragraph describing the occasional case where the debugger prints an array address instead of the array itself.
58 lines
1.9 KiB
Text
58 lines
1.9 KiB
Text
# Copyright 2008, 2009, 2010 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 <http://www.gnu.org/licenses/>.
|
|
|
|
if $tracelevel then {
|
|
strace $tracelevel
|
|
}
|
|
|
|
load_lib "ada.exp"
|
|
|
|
set testdir "lang_switch"
|
|
set testfile "${testdir}/lang_switch"
|
|
set cfile "${testdir}/foo"
|
|
set adasrcfile ${srcdir}/${subdir}/${testfile}.adb
|
|
set csrcfile ${srcdir}/${subdir}/${cfile}.c
|
|
set cobject ${objdir}/${subdir}/${cfile}.o
|
|
set binfile ${objdir}/${subdir}/${testfile}
|
|
|
|
file mkdir ${objdir}/${subdir}/${testdir}
|
|
gdb_compile "${csrcfile}" "${cobject}" object [list debug]
|
|
if {[gdb_compile_ada "${adasrcfile}" "${binfile}" executable [list debug]] != "" } {
|
|
return -1
|
|
}
|
|
|
|
gdb_exit
|
|
gdb_start
|
|
gdb_reinitialize_dir $srcdir/$subdir
|
|
gdb_load ${binfile}
|
|
|
|
set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.c]
|
|
runto "foo.c:$bp_location"
|
|
|
|
gdb_test_no_output "set print frame-arguments all"
|
|
|
|
# Make sure that the language is switched to Ada for the second frame
|
|
# by checking the string parameter.
|
|
gdb_test "bt" \
|
|
".*#1.*lang_switch\\.ada_procedure\\s*\\(msg=\"msg\"\\).*" \
|
|
"backtrace"
|
|
|
|
# Now, make sure that the language doesn't get automatically switched
|
|
# if the current language is not "auto".
|
|
gdb_test "set lang c"
|
|
gdb_test "bt" \
|
|
".*#1.*lang_switch\\.ada_procedure\\s*\\(msg={.*\\).*" \
|
|
"backtrace"
|
|
|