123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- # Copyright 2017-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 the symbol needs check mechanism if it assumes that faking
- # reads from a target is a safe thing to do.
- #
- # In particular, the test uses a relative branch DWARF operation to
- # hide a register read. If the target reads are indeed faked, the
- # result returned will be wrong.
- load_lib dwarf.exp
- # This test can only be run on targets which support DWARF-2 and use gas.
- if {![dwarf2_support]} {
- return 0
- }
- # Choose suitable integer registers for the test.
- set dwarf_regnum 0
- if { [is_aarch64_target] } {
- set regname x0
- } elseif { [is_aarch32_target]
- || [istarget "s390*-*-*" ]
- || [istarget "powerpc*-*-*"]
- || [istarget "rs6000*-*-aix*"] } {
- set regname r0
- } elseif { [is_x86_like_target] } {
- set regname eax
- } elseif { [is_amd64_regs_target] } {
- set regname rax
- } else {
- verbose "Skipping ${gdb_test_file_name}."
- return
- }
- standard_testfile symbol_needs_eval.c ${gdb_test_file_name}-dw.S
- # Make some DWARF for the test.
- set asm_file [standard_output_file $srcfile2]
- Dwarf::assemble $asm_file {
- global dwarf_regnum regname
- set exec_mask_var [gdb_target_symbol exec_mask]
- cu {} {
- DW_TAG_compile_unit {
- {DW_AT_name symbol_needs_eval.c}
- {DW_AT_comp_dir /tmp}
- } {
- declare_labels int_type_label
- # define int type
- int_type_label: DW_TAG_base_type {
- {DW_AT_name "int"}
- {DW_AT_encoding @DW_ATE_signed}
- {DW_AT_byte_size 4 DW_FORM_sdata}
- }
- # define artificial variable a
- DW_TAG_variable {
- {DW_AT_name a}
- {DW_AT_type :$int_type_label}
- {DW_AT_location {
- DW_OP_addr $exec_mask_var
- DW_OP_deref
- # conditional jump to DW_OP_bregx
- DW_OP_bra 4
- DW_OP_lit0
- # jump to DW_OP_stack_value
- DW_OP_skip 3
- DW_OP_bregx $dwarf_regnum 0
- DW_OP_stack_value
- } SPECIAL_expr}
- {external 1 flag}
- }
- }
- }
- }
- if { [prepare_for_testing ${testfile}.exp ${testfile} \
- [list $srcfile $asm_file] {nodebug}] } {
- return -1
- }
- # The variable's location expression requires a frame,
- # so an error should be reported.
- gdb_test "print/d a" "No frame selected." "variable a can't be printed"
- if ![runto_main] {
- return -1
- }
- gdb_test_no_output "set var \$$regname = 2" "init reg to 2"
- gdb_test "print/d a" " = 2" "a == 2"
|