# Copyright 2013-2021 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 <http://www.gnu.org/licenses/>.

load_lib dwarf.exp

# This test can only be run on targets which support DWARF-2 and use gas.
if {![dwarf2_support]} {
    return 0  
}

if { [skip_cplus_tests] } { continue }

standard_testfile main.c -dw.S

# Make some DWARF for the test.
set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    # Creating a CU with 4-byte addresses lets this test link on both
    # 32- and 64-bit machines.
    cu { addr_size 4 } {
 	compile_unit {} {
	    declare_labels byte_label size_type_label array_label
	    declare_labels var_label ptr_label

	    byte_label: base_type {
		{name byte}
		{encoding @DW_ATE_signed}
		{byte_size 1 DW_FORM_sdata}
	    }

	    size_type_label: base_type {
		{name sizetype}
		{encoding @DW_ATE_unsigned}
		{byte_size 4 DW_FORM_sdata}
	    }

	    array_label: array_type {
		{type :$byte_label}
	    } {
		subrange_type {
		    {type :$size_type_label}
		    {upper_bound 7 DW_FORM_data1}
		}
	    }

	    var_label: DW_TAG_variable {
		{name b}
		{type :$array_label}
		{const_value rstuvwxy DW_FORM_block1}
	    }

	    ptr_label: pointer_type {
		{byte_size 4 DW_FORM_sdata}
		{type :$byte_label}
	    }

	    DW_TAG_variable {
		{name c}
		{type :$ptr_label}
		{location {
		    GNU_implicit_pointer $var_label 0
		} SPECIAL_expr}
	    }

	    DW_TAG_variable {
		{name d}
		{type :$ptr_label}
		{location {
		    GNU_implicit_pointer $var_label 2
		} SPECIAL_expr}
	    }
	}
    }
}

if { [build_executable ${testfile}.exp ${testfile} \
	  [list $srcfile $asm_file] {nodebug}] } {
    return -1
}

# We need --readnow because otherwise we never read in the CU we
# created above.
set saved_gdbflags $GDBFLAGS
set GDBFLAGS "$GDBFLAGS -readnow"
clean_restart ${testfile}
set GDBFLAGS $saved_gdbflags

if ![runto_main] {
    return -1
}

gdb_test "print *c" " = 114 'r'"
gdb_test "print d\[-2\]" " = 114 'r'"
