1# Copyright 2013-2020 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
16# Test PR 18258.
17
18load_lib dwarf.exp
19
20# This test can only be run on targets which support DWARF-2 and use gas.
21if {![dwarf2_support]} {
22    return 0
23}
24
25standard_testfile opaque-type-lookup.c opaque-type-lookup-1.S opaque-type-lookup-2.c
26
27# Create the DWARF.
28set asm_file [standard_output_file $srcfile2]
29Dwarf::assemble $asm_file {
30    declare_labels partial_unit_defining_a partial_unit_defining_b
31    declare_labels partial_unit_with_opaque
32    declare_labels struct_a_label struct_b_label
33    declare_labels opaque_struct_a_label opaque_struct_b_label
34    declare_labels char_type1_label char_type2_label
35
36    # The partial units are laid out so we're not dependent on the order that
37    # they appear in compunit_symtab.includes.  We need the one with the
38    # opaque definition to appear first to gdb, so we put it in the middle.
39    # Either the handling of variable_a or variable_b will be broken (in an
40    # unpatched gdb).
41    #
42    # However, once a partial unit with a non-opaque type is read in we can
43    # no longer see the bug as gdb will keep looking until it eventually gets
44    # to the defining partial unit, setting aside the symbol lookup cache.
45    # So heads up!
46
47    cu {} {
48	compile_unit {
49	    {language @DW_LANG_C}
50	    {name opaque_before}
51	} {
52	    imported_unit {
53		{import $partial_unit_with_opaque ref_addr}
54	    }
55
56	    imported_unit {
57		{import $partial_unit_defining_a ref_addr}
58	    }
59	}
60    }
61
62    cu {} {
63	compile_unit {
64	    {language @DW_LANG_C}
65	    {name opaque_after}
66	} {
67	    imported_unit {
68		{import $partial_unit_defining_b ref_addr}
69	    }
70
71	    imported_unit {
72		{import $partial_unit_with_opaque ref_addr}
73	    }
74	}
75    }
76
77    cu {} {
78	partial_unit_with_opaque: partial_unit {
79	    {name "partial_unit_with_opaque"}
80	} {
81	    # Normally gdb doesn't add opaque types to the symbol table
82	    # but there are times when it will, and in order to exercise
83	    # this bug we need this entry in the symbol table.
84	    # By giving it a size of 1 we achieve this.
85
86	    opaque_struct_a_label: structure_type {
87		{name struct_a}
88		{declaration 1 flag}
89		{byte_size 1 DW_FORM_sdata}
90	    }
91
92	    opaque_struct_b_label: structure_type {
93		{name struct_b}
94		{declaration 1 flag}
95		{byte_size 1 DW_FORM_sdata}
96	    }
97
98	    DW_TAG_variable {
99		{name variable_a}
100		{type :$opaque_struct_a_label}
101		{external 1 flag}
102		{declaration 1 flag}
103	    }
104
105	    DW_TAG_variable {
106		{name variable_b}
107		{type :$opaque_struct_b_label}
108		{external 1 flag}
109		{declaration 1 flag}
110	    }
111	}
112    }
113
114    cu {} {
115	partial_unit_defining_a: partial_unit {
116	    {name "partial_unit_defining_a"}
117	} {
118	    char_type1_label: base_type {
119		{name "signed char"}
120		{encoding @DW_ATE_signed}
121		{byte_size 1 DW_FORM_sdata}
122	    }
123
124	    struct_a_label: structure_type {
125		{name struct_a}
126		{byte_size 1 DW_FORM_sdata}
127	    } {
128		member {
129		    {name xyz}
130		    {type :$char_type1_label}
131		    {data_member_location 0 DW_FORM_sdata}
132		}
133	    }
134
135	    DW_TAG_variable {
136		{name variable_a}
137		{type :$struct_a_label}
138		{external 1 flag}
139		{linkage_name variable_a}
140	    }
141	}
142    }
143
144    cu {} {
145	partial_unit_defining_b: partial_unit {
146	    {name "partial_unit_defining_b"}
147	} {
148	    char_type2_label: base_type {
149		{name "signed char"}
150		{encoding @DW_ATE_signed}
151		{byte_size 1 DW_FORM_sdata}
152	    }
153
154	    struct_b_label: structure_type {
155		{name struct_b}
156		{byte_size 1 DW_FORM_sdata}
157	    } {
158		member {
159		    {name xyz}
160		    {type :$char_type2_label}
161		    {data_member_location 0 DW_FORM_sdata}
162		}
163	    }
164
165	    DW_TAG_variable {
166		{name variable_b}
167		{type :$struct_b_label}
168		{external 1 flag}
169		{linkage_name variable_b}
170	    }
171	}
172    }
173
174    # GDB expands the symbol table with main at start up,
175    # so keep this separate.
176    cu {} {
177	compile_unit {
178	    {language @DW_LANG_C}
179	    {name main}
180	} {
181	    subprogram {
182		{MACRO_AT_func { main }}
183	    }
184	}
185    }
186}
187
188if [prepare_for_testing "failed to prepare" $testfile "${asm_file} ${srcfile} ${srcfile3}" {nodebug}] {
189    return -1
190}
191
192if ![runto_main] {
193    return -1
194}
195
196gdb_test "p variable_a" " = {xyz = 97 'a'}"
197gdb_test "p variable_b" " = {xyz = 98 'b'}"
198