mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-09-09 19:12:24 +08:00

Convert the gdb.cp/call-method-register.exp test to make use of the DWARF assembler. The existing gdb.cp/call-method-register.exp test relies on a GCC extension - forcing a local variable into a particular named register. This means that the test will only work with Clang, and, as we have to name the register into which the variable will be placed, will only work for those targets where we've selected a suitable register, currently this is x86-64, i386, and ppc64. By switching to the DWARF assembler, the test will work with gcc and clang, and should work on most, if not all, architectures. The test creates a small structure, something that can fit within a register, and then tries to call a method on the structure from within GDB. This should fail because GDB can't take the address of the in register structure (for the `this` pointer). As the test is for a failure case, then we don't really care _which_ register the structure is in, and I take advantage of this for the DWARF assembler test, I just declare that the variable is in DW_OP_reg0, whatever that might be. I've tested the new test on x86-64, ppc, aarch64, and risc-v, and the test runs, and passes on all these architectures, which is already more than we used to cover. Additionally, on x86-64, I've tested with Clang and gcc, and the test runs and passed with both compilers. Reviewed-By: Lancelot SIX <lancelot.six@amd.com>
111 lines
2.7 KiB
Plaintext
111 lines
2.7 KiB
Plaintext
# Copyright 1992-2022 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/>.
|
|
|
|
# Test callling a method on a variable that has been put in a
|
|
# register.
|
|
|
|
if { [skip_cplus_tests] } { continue }
|
|
|
|
load_lib "cp-support.exp"
|
|
load_lib dwarf.exp
|
|
|
|
standard_testfile .cc -dw.S
|
|
|
|
if {[prepare_for_testing "failed to prepare" $testfile $srcfile \
|
|
{debug c++}]} {
|
|
return -1
|
|
}
|
|
|
|
set asm_file [standard_output_file $srcfile2]
|
|
Dwarf::assemble $asm_file {
|
|
|
|
set main_result \
|
|
[function_range main ${::srcdir}/${::subdir}/${::srcfile}]
|
|
set main_start [lindex $main_result 0]
|
|
set main_length [lindex $main_result 1]
|
|
|
|
cu {} {
|
|
compile_unit {
|
|
{DW_AT_language @DW_LANG_C_plus_plus}
|
|
{DW_AT_name $::srcfile}
|
|
{DW_AT_comp_dir /tmp}
|
|
} {
|
|
declare_labels int_type_label struct_type_label \
|
|
struct_ptr_type_label
|
|
set ptr_size [get_sizeof "void *" 96]
|
|
|
|
DW_TAG_subprogram {
|
|
{name main}
|
|
{low_pc $main_start addr}
|
|
{high_pc $main_length data8}
|
|
{DW_AT_type :$int_type_label}
|
|
}
|
|
|
|
int_type_label: DW_TAG_base_type {
|
|
{DW_AT_byte_size 4 DW_FORM_sdata}
|
|
{DW_AT_encoding @DW_ATE_signed}
|
|
{DW_AT_name int}
|
|
}
|
|
|
|
struct_type_label: DW_TAG_structure_type {
|
|
{DW_AT_byte_size 4 DW_FORM_sdata}
|
|
{DW_AT_name small}
|
|
} {
|
|
member {
|
|
{name xxx}
|
|
{type :$int_type_label}
|
|
{data_member_location 0 data1}
|
|
}
|
|
subprogram {
|
|
{name yyy}
|
|
{type :$int_type_label}
|
|
} {
|
|
formal_parameter {
|
|
{type :$struct_ptr_type_label}
|
|
{artificial 1 flag_present}
|
|
}
|
|
}
|
|
}
|
|
|
|
struct_ptr_type_label: DW_TAG_pointer_type {
|
|
{DW_AT_byte_size $ptr_size DW_FORM_data1}
|
|
{type :$struct_type_label}
|
|
}
|
|
|
|
DW_TAG_variable {
|
|
{DW_AT_name global_var}
|
|
{DW_AT_type :$struct_type_label}
|
|
{DW_AT_location {
|
|
DW_OP_reg0
|
|
} SPECIAL_expr}
|
|
{external 1 flag}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if { [prepare_for_testing "failed to prepare" ${testfile} \
|
|
[list $srcfile $asm_file] {nodebug}] } {
|
|
return -1
|
|
}
|
|
|
|
if ![runto_main] {
|
|
return -1
|
|
}
|
|
|
|
gdb_test "print global_var.yyy ()" \
|
|
"Address requested for identifier \"global_var\" which is in register .*" \
|
|
"call method on register local"
|