1#!/usr/local/bin/bash
2# Copyright (C) 2017 Red Hat, Inc.
3# This file is part of elfutils.
4#
5# This file is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation; either version 3 of the License, or
8# (at your option) any later version.
9#
10# elfutils is distributed in the hope that it will be useful, but
11# WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18. $srcdir/test-subr.sh
19
20# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77589
21#
22# program repro
23#   type small_stride
24#      character*40 long_string
25#      integer      small_pad
26#   end type small_stride
27#   type(small_stride), dimension (20), target :: unpleasant
28#   character*40, pointer, dimension(:):: c40pt
29#   integer i
30#   do i = 0,19
31#      unpleasant(i+1)%small_pad = i+1
32#      unpleasant(i+1)%long_string = char (ichar('0') + i) // '-hello'
33#   end do
34#   c40pt => unpleasant%long_string
35#   print *, c40pt  ! break-here
36# end program repro
37#
38# Needs GCC7+
39# gfortran -o testfile-stridex dwarf-stridex.f90 -Wall -g
40
41testfiles testfile-stridex
42
43testrun_compare ${abs_top_builddir}/tests/varlocs --exprlocs -e testfile-stridex <<\EOF
44module 'testfile-stridex'
45[b] CU 'dwarf-stridex.f90'@400717
46  producer (strp)
47  language (data1)
48  identifier_case (data1)
49  name (strp)
50  comp_dir (strp)
51  low_pc (addr)
52  high_pc (data8)
53  stmt_list (sec_offset)
54  [2e] base_type "integer(kind=8)"
55    byte_size (data1)
56    encoding (data1)
57    name (strp)
58  [35] structure_type "small_stride"
59    name (strp)
60    byte_size (data1)
61    decl_file (data1)
62    decl_line (data1)
63    sibling (ref4)
64    [41] member "long_string"
65      name (strp)
66      decl_file (data1)
67      decl_line (data1)
68      type (ref4)
69      data_member_location (data1) {plus_uconst(0)}
70    [4d] member "small_pad"
71      name (strp)
72      decl_file (data1)
73      decl_line (data1)
74      type (ref4)
75      data_member_location (data1) {plus_uconst(40)}
76  [5a] string_type
77    byte_size (data1)
78  [5c] base_type "integer(kind=4)"
79    byte_size (data1)
80    encoding (data1)
81    name (strp)
82  [63] const_type
83    type (ref4)
84  [68] subprogram "main"
85    external (flag_present)
86    name (strp)
87    decl_file (data1)
88    decl_line (data1)
89    type (ref4)
90    low_pc (addr)
91    high_pc (data8)
92    frame_base (exprloc) {call_frame_cfa {bregx(7,8)}}
93    GNU_all_tail_call_sites (flag_present)
94    sibling (ref4)
95    [89] formal_parameter "argc"
96      name (strp)
97      decl_file (data1)
98      decl_line (data1)
99      type (ref4)
100      location (exprloc) {fbreg(-20)}
101    [97] formal_parameter "argv"
102      name (strp)
103      decl_file (data1)
104      decl_line (data1)
105      type (ref4)
106      location (exprloc) {fbreg(-32), deref}
107  [a7] pointer_type
108    byte_size (data1)
109    type (ref4)
110  [ad] base_type "character(kind=1)"
111    byte_size (data1)
112    encoding (data1)
113    name (strp)
114  [b4] subprogram "repro"
115    name (strp)
116    decl_file (data1)
117    decl_line (data1)
118    main_subprogram (flag_present)
119    calling_convention (data1)
120    low_pc (addr)
121    high_pc (data8)
122    frame_base (exprloc) {call_frame_cfa {bregx(7,8)}}
123    GNU_all_tail_call_sites (flag_present)
124    sibling (ref4)
125    [d2] variable "c40pt"
126      name (strp)
127      decl_file (data1)
128      decl_line (data1)
129      type (ref4)
130      location (exprloc) {fbreg(-128)}
131    [e1] variable "span.0"
132      name (strp)
133      type (ref4)
134      artificial (flag_present)
135      location (exprloc) {fbreg(-80)}
136    [ee] variable "i"
137      name (string)
138      decl_file (data1)
139      decl_line (data1)
140      type (ref4)
141      location (exprloc) {fbreg(-68)}
142    [fb] variable "unpleasant"
143      name (strp)
144      decl_file (data1)
145      decl_line (data1)
146      type (ref4)
147      location (exprloc) {fbreg(-1008)}
148    [10a] lexical_block
149      low_pc (addr)
150      high_pc (data8)
151      sibling (ref4)
152      [11f] lexical_block
153        low_pc (addr)
154        high_pc (data8)
155    [131] lexical_block
156      low_pc (addr)
157      high_pc (data8)
158      [142] lexical_block
159        low_pc (addr)
160        high_pc (data8)
161        [153] lexical_block
162          low_pc (addr)
163          high_pc (data8)
164  [167] array_type
165    data_location (exprloc) {push_object_address, deref}
166    associated (exprloc) {push_object_address, deref, lit0, ne}
167    type (ref4)
168    sibling (ref4)
169    [178] subrange_type
170      lower_bound (exprloc) {push_object_address, plus_uconst(32), deref}
171      upper_bound (exprloc) {push_object_address, plus_uconst(40), deref}
172      byte_stride (exprloc) {push_object_address, plus_uconst(24), deref, GNU_variable_value([e1]) {fbreg(-80)}, mul}
173  [18f] array_type
174    type (ref4)
175    [194] subrange_type
176      type (ref4)
177      upper_bound (sdata)
178EOF
179
180exit 0
181