# Copyright 2016-2019 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 . # Test accessing "non-variable" variables, i.e., variables which are # optimized to a constant DWARF location expression and/or # partially/fully optimized out. load_lib dwarf.exp if {![dwarf2_support]} { return 0 } standard_testfile main.c nonvar-access-dw.S # Make some DWARF for the test. set asm_file [standard_output_file $srcfile2] Dwarf::assemble $asm_file { global srcdir subdir srcfile set range [function_range main ${srcdir}/${subdir}/${srcfile}] set main_start [lindex $range 0] set main_length [lindex $range 1] cu {} { compile_unit { {DW_AT_name main.c} } { declare_labels int_type_label char_type_label \ struct_s_label struct_t_label array_a9_label \ char_ptr_label implicit_a_label stack_b_label int_type_label: base_type { {name "int"} {encoding @DW_ATE_signed} {byte_size 4 DW_FORM_sdata} } char_type_label: base_type { {name "char"} {encoding @DW_ATE_unsigned} {byte_size 1 DW_FORM_sdata} } char_ptr_label: pointer_type { {type :$char_type_label} } struct_s_label: structure_type { {name s} {byte_size 4 DW_FORM_sdata} } { member { {name a} {type :$int_type_label} {data_member_location 0 DW_FORM_udata} {bit_size 8 DW_FORM_udata} } member { {name b} {type :$int_type_label} {data_bit_offset 8 DW_FORM_udata} {bit_size 24 DW_FORM_udata} } } struct_t_label: structure_type { {name t} {byte_size 4 DW_FORM_sdata} } { member { {name a} {type :$int_type_label} {data_member_location 0 DW_FORM_udata} {bit_size 9 DW_FORM_udata} } member { {name b} {type :$int_type_label} {data_bit_offset 9 DW_FORM_udata} {bit_size 23 DW_FORM_udata} } } array_a9_label: array_type { {type :$char_type_label} } { subrange_type { {type :$int_type_label} {upper_bound 8 DW_FORM_udata} } } DW_TAG_subprogram { {name main} {DW_AT_external 1 flag} {low_pc [gdb_target_symbol main] DW_FORM_addr} {high_pc "$main_start + $main_length" DW_FORM_addr} } { # Simple variable without location. DW_TAG_variable { {name undef_int} {type :$int_type_label} } # Struct variable without location. DW_TAG_variable { {name undef_s} {type :$struct_s_label} } # Composite location: byte-aligned pieces. DW_TAG_variable { {name def_s} {type :$struct_s_label} {location { const1u 0 stack_value bit_piece 8 0 const1s -1 stack_value bit_piece 24 0 } SPECIAL_expr} } # Composite location: non-byte-aligned pieces. DW_TAG_variable { {name def_t} {type :$struct_t_label} {location { const2s -184 stack_value bit_piece 9 0 const4u 1752286 stack_value bit_piece 23 0 } SPECIAL_expr} } # Composite location with some empty pieces. DW_TAG_variable { {name part_def_a} {type :$array_a9_label} {location { piece 3 const4u 0xf1927314 stack_value piece 4 piece 2 } SPECIAL_expr} } # Implicit location: immediate value. DW_TAG_variable { {name def_implicit_s} {type :$struct_s_label} {location { implicit_value 0x12 0x34 0x56 0x78 } SPECIAL_expr} } # Implicit location: immediate value for whole array, with # excess bytes. implicit_a_label: DW_TAG_variable { {name def_implicit_a} {type :$array_a9_label} {location { implicit_value 0x1 0x12 0x23 0x34 0x45 \ 0x56 0x67 0x78 0x89 0x9a 0xab } SPECIAL_expr} } # Implicit pointer into immediate value. DW_TAG_variable { {name implicit_a_ptr} {type :$char_ptr_label} {location { implicit_pointer $implicit_a_label 5 } SPECIAL_expr} } # Stack-value location. stack_b_label: DW_TAG_variable { {name def_stack_b} {type :$struct_t_label} {location { const4u 0x1a2b3c4d stack_value } SPECIAL_expr} } # Implicit pointer into stack value. DW_TAG_variable { {name implicit_b_ptr} {type :$char_ptr_label} {location { implicit_pointer $stack_b_label 1 } SPECIAL_expr} } } } } } if { [prepare_for_testing "failed to prepare" ${testfile} \ [list $srcfile $asm_file] {nodebug}] } { return -1 } if ![runto_main] { return -1 } # Determine byte order. set endian [get_endianness] # Byte-aligned objects with simple location descriptions. switch $endian { big {set val 0x345678} little {set val 0x785634} } gdb_test "print/x def_implicit_s" " = \\{a = 0x12, b = $val\\}" gdb_test "print/x def_implicit_s.b" " = $val" gdb_test "print/x def_implicit_a" \ " = \\{0x1, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89\\}" gdb_test "print/x def_implicit_a\[5\]" " = 0x56" gdb_test "print/x *(char (*)\[5\]) implicit_a_ptr" \ " = \\{0x56, 0x67, 0x78, 0x89, 0x9a\\}" switch $endian { big {set val "a = 52, b = 2833485"} little {set val "a = 77, b = 857502"} } gdb_test "print def_stack_b" " = \\{$val\\}" switch $endian {big {set val 0x2b} little {set val 0x3c}} gdb_test "print/x *implicit_b_ptr" " = $val" # Byte-aligned fields, pieced together from DWARF stack values. gdb_test "print def_s" " = \\{a = 0, b = -1\\}" switch $endian { big {set val 0x92} little {set val 0x73} } gdb_test "print/x part_def_a\[4\]" " = $val" gdb_test "print/x part_def_a\[8\]" " = " # Non-byte-aligned fields, pieced together from DWARF stack values. gdb_test "print def_t" " = \\{a = -184, b = 1752286\\}" # Simple variable without location. gdb_test "print undef_int" " = " # Member of a structure without location. gdb_test "print undef_s.a" " = "