| # Copyright 2011-2020 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/>. | |
| 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 main.c | |
| proc test { dwarf_version offset_size addr_size ref_addr_size two_cu } { | |
| global testfile srcfile | |
| set name "d${dwarf_version}o${offset_size}a${addr_size}r${ref_addr_size}t${two_cu}" | |
| # Make some DWARF for the test. | |
| set asm_file [standard_output_file ${testfile}-${name}.S] | |
| Dwarf::assemble $asm_file { | |
| upvar dwarf_version dwarf_version | |
| upvar addr_size addr_size | |
| upvar offset_size offset_size | |
| upvar ref_addr_size ref_addr_size | |
| upvar two_cu two_cu | |
| set is_64 [expr { $offset_size == 4 ? 0 : 1 }] | |
| cu { | |
| version $dwarf_version | |
| addr_size $addr_size | |
| is_64 $is_64 | |
| } { | |
| compile_unit { | |
| { producer "GNU C 4.4.3" } | |
| { language @DW_LANG_C89 } | |
| { name 1.c } | |
| } { | |
| declare_labels struct_label variable_label int_label pointer_label | |
| int_label: base_type { | |
| { byte_size 4 DW_FORM_sdata } | |
| { DW_AT_encoding @DW_ATE_signed } | |
| { name int } | |
| } | |
| struct_label: structure_type { | |
| { name s } | |
| { byte_size 4 sdata } | |
| } { | |
| member { | |
| { name f } | |
| { type :$int_label } | |
| { data_member_location 0 data1 } | |
| } | |
| } | |
| pointer_label: pointer_type { | |
| { byte_size $Dwarf::_cu_addr_size sdata } | |
| { type :$struct_label } | |
| } | |
| variable_label: DW_TAG_variable { | |
| { name v } | |
| { location { | |
| DW_OP_implicit_value 0x1 0x1 0x1 0x1 | |
| } SPECIAL_expr} | |
| { type :$struct_label "DW_FORM_ref$ref_addr_size" } | |
| } | |
| if { !$two_cu } { | |
| subprogram { | |
| { name main } | |
| { low_pc main addr } | |
| { high_pc "main+0x100" addr } | |
| { type :$int_label } | |
| { external 1 flag } | |
| } { | |
| DW_TAG_variable { | |
| { name p } | |
| { location { | |
| GNU_implicit_pointer $variable_label 0 | |
| } SPECIAL_expr } | |
| { type :$pointer_label "DW_FORM_ref$ref_addr_size" } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| if { $two_cu } { | |
| cu { | |
| version $dwarf_version | |
| addr_size $addr_size | |
| is_64 $is_64 | |
| } { | |
| compile_unit { | |
| { producer "GNU C 4.4.3" } | |
| { language @DW_LANG_C89 } | |
| { name 1.c } | |
| } { | |
| subprogram { | |
| { name main } | |
| { low_pc main addr } | |
| { high_pc "main+0x100" addr } | |
| { type %$int_label } | |
| { external 1 flag } | |
| } { | |
| DW_TAG_variable { | |
| { name p } | |
| { location { | |
| GNU_implicit_pointer $variable_label 0 | |
| } SPECIAL_expr } | |
| { type %$pointer_label } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| # 32-bit targets do not support any of the testcases; keep quiet there. | |
| set opts {quiet} | |
| set executable ${testfile}-${name} | |
| if [prepare_for_testing "failed to prepare" $executable "${asm_file} ${srcfile}" $opts] { | |
| return -1 | |
| } | |
| if ![runto_main] { | |
| return -1 | |
| } | |
| gdb_test "p/x p->f" " = 0x1010101" $name | |
| } | |
| # DWARF_VERSION OFFSET_SIZE ADDR_SIZE REF_ADDR_SIZE TWO_CU | |
| test 2 8 4 4 0 | |
| test 2 4 8 8 0 | |
| test 3 8 4 8 0 | |
| test 3 4 8 4 0 | |
| test 2 8 4 4 1 | |
| test 2 4 8 8 1 | |
| test 3 8 4 8 1 | |
| test 3 4 8 4 1 |