#! /bin/sh
# Copyright (C) 2017 Red Hat, Inc.
# This file is part of elfutils.
#
# This file 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.
#
# elfutils 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/>.
. $srcdir/test-subr.sh
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77589
#
# program repro
# type small_stride
# character*40 long_string
# integer small_pad
# end type small_stride
# type(small_stride), dimension (20), target :: unpleasant
# character*40, pointer, dimension(:):: c40pt
# integer i
# do i = 0,19
# unpleasant(i+1)%small_pad = i+1
# unpleasant(i+1)%long_string = char (ichar('0') + i) // '-hello'
# end do
# c40pt => unpleasant%long_string
# print *, c40pt ! break-here
# end program repro
#
# Needs GCC7+
# gfortran -o testfile-stridex dwarf-stridex.f90 -Wall -g
testfiles testfile-stridex
testrun_compare ${abs_top_builddir}/tests/varlocs --exprlocs -e testfile-stridex <<\EOF
module 'testfile-stridex'
[b] CU 'dwarf-stridex.f90'@400717
producer (strp)
language (data1)
identifier_case (data1)
name (strp)
comp_dir (strp)
low_pc (addr)
high_pc (data8)
stmt_list (sec_offset)
[2e] base_type "integer(kind=8)"
byte_size (data1)
encoding (data1)
name (strp)
[35] structure_type "small_stride"
name (strp)
byte_size (data1)
decl_file (data1)
decl_line (data1)
sibling (ref4)
[41] member "long_string"
name (strp)
decl_file (data1)
decl_line (data1)
type (ref4)
data_member_location (data1) {plus_uconst(0)}
[4d] member "small_pad"
name (strp)
decl_file (data1)
decl_line (data1)
type (ref4)
data_member_location (data1) {plus_uconst(40)}
[5a] string_type
byte_size (data1)
[5c] base_type "integer(kind=4)"
byte_size (data1)
encoding (data1)
name (strp)
[63] const_type
type (ref4)
[68] subprogram "main"
external (flag_present)
name (strp)
decl_file (data1)
decl_line (data1)
type (ref4)
low_pc (addr)
high_pc (data8)
frame_base (exprloc) {call_frame_cfa {bregx(7,8)}}
GNU_all_tail_call_sites (flag_present)
sibling (ref4)
[89] formal_parameter "argc"
name (strp)
decl_file (data1)
decl_line (data1)
type (ref4)
location (exprloc) {fbreg(-20)}
[97] formal_parameter "argv"
name (strp)
decl_file (data1)
decl_line (data1)
type (ref4)
location (exprloc) {fbreg(-32), deref}
[a7] pointer_type
byte_size (data1)
type (ref4)
[ad] base_type "character(kind=1)"
byte_size (data1)
encoding (data1)
name (strp)
[b4] subprogram "repro"
name (strp)
decl_file (data1)
decl_line (data1)
main_subprogram (flag_present)
calling_convention (data1)
low_pc (addr)
high_pc (data8)
frame_base (exprloc) {call_frame_cfa {bregx(7,8)}}
GNU_all_tail_call_sites (flag_present)
sibling (ref4)
[d2] variable "c40pt"
name (strp)
decl_file (data1)
decl_line (data1)
type (ref4)
location (exprloc) {fbreg(-128)}
[e1] variable "span.0"
name (strp)
type (ref4)
artificial (flag_present)
location (exprloc) {fbreg(-80)}
[ee] variable "i"
name (string)
decl_file (data1)
decl_line (data1)
type (ref4)
location (exprloc) {fbreg(-68)}
[fb] variable "unpleasant"
name (strp)
decl_file (data1)
decl_line (data1)
type (ref4)
location (exprloc) {fbreg(-1008)}
[10a] lexical_block
low_pc (addr)
high_pc (data8)
sibling (ref4)
[11f] lexical_block
low_pc (addr)
high_pc (data8)
[131] lexical_block
low_pc (addr)
high_pc (data8)
[142] lexical_block
low_pc (addr)
high_pc (data8)
[153] lexical_block
low_pc (addr)
high_pc (data8)
[167] array_type
data_location (exprloc) {push_object_address, deref}
associated (exprloc) {push_object_address, deref, lit0, ne}
type (ref4)
sibling (ref4)
[178] subrange_type
lower_bound (exprloc) {push_object_address, plus_uconst(32), deref}
upper_bound (exprloc) {push_object_address, plus_uconst(40), deref}
byte_stride (exprloc) {push_object_address, plus_uconst(24), deref, GNU_variable_value([e1]) {fbreg(-80)}, mul}
[18f] array_type
type (ref4)
[194] subrange_type
type (ref4)
upper_bound (sdata)
EOF
exit 0