1# Copyright 2013-2021 Free Software Foundation, Inc.
2
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16load_lib dwarf.exp
17
18# This test can only be run on targets which support DWARF-2 and use gas.
19if {![dwarf2_support]} {
20    return 0
21}
22
23if { [skip_cplus_tests] } { continue }
24
25standard_testfile main.c -dw.S
26
27# Make some DWARF for the test.
28set asm_file [standard_output_file $srcfile2]
29
30Dwarf::assemble $asm_file {
31    # Using a funny address size here and in the pointer type lets us
32    # also check for a sign-extension bug in the
33    # DW_OP_GNU_implicit_pointer code.
34    cu { addr_size 2 } {
35 	compile_unit {} {
36	    declare_labels struct_label short_type_label
37	    declare_labels char_type_label ptr_label
38	    declare_labels var_label
39
40	    struct_label: structure_type {
41		{name S}
42		{byte_size 4 DW_FORM_sdata}
43	    } {
44		member {
45		    {name a}
46		    {type :$short_type_label}
47		    {data_member_location 0 DW_FORM_sdata}
48		}
49		member {
50		    {name b}
51		    {type :$char_type_label}
52		    {data_member_location 2 DW_FORM_sdata}
53		}
54		member {
55		    {name c}
56		    {type :$char_type_label}
57		    {data_member_location 3 DW_FORM_sdata}
58		}
59	    }
60
61	    short_type_label: base_type {
62		{name "short int"}
63		{encoding @DW_ATE_signed}
64		{byte_size 2 DW_FORM_sdata}
65	    }
66
67	    char_type_label: base_type {
68		{name "signed char"}
69		{encoding @DW_ATE_signed}
70		{byte_size 1 DW_FORM_sdata}
71	    }
72
73	    # See comment above to understand the pointer size.
74	    ptr_label: pointer_type {
75		{byte_size 2 DW_FORM_sdata}
76		{type :$char_type_label}
77	    }
78
79	    var_label: DW_TAG_variable {
80		{name s}
81		{type :$struct_label}
82		{location {
83		    const2u 0x5678
84		    stack_value
85		    piece 2
86		    const1u 2
87		    stack_value
88		    piece 1
89		    const1u 3
90		    stack_value
91		    piece 1
92		} SPECIAL_expr}
93	    }
94
95	    DW_TAG_variable {
96		{name p}
97		{type :$ptr_label}
98		{location {
99		    GNU_implicit_pointer $var_label 2
100		} SPECIAL_expr}
101	    }
102	}
103    }
104}
105
106if { [build_executable ${testfile}.exp ${testfile} \
107	  [list $srcfile $asm_file] {nodebug}] } {
108    return -1
109}
110
111# We need --readnow because otherwise we never read in the CU we
112# created above.
113set saved_gdbflags $GDBFLAGS
114set GDBFLAGS "$GDBFLAGS -readnow"
115clean_restart ${testfile}
116set GDBFLAGS $saved_gdbflags
117
118if ![runto_main] {
119    return -1
120}
121
122# Determine byte order.
123set endian [get_endianness]
124
125# Access the second byte of s through an implicit pointer to the third
126# byte of s, using a negative offset.  Compare that to the second byte of
127# the short integer 0x5678 in target byte order.
128switch $endian { little {set val 0x56} big {set val 0x78} }
129gdb_test "p/x p\[-1\]" " = $val"
130