# Copyright 2014-2020 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
}

standard_testfile arr-stride.c arr-stride-dw.S

# Make some DWARF for the test.
set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    cu {} {
 	DW_TAG_compile_unit {
                {DW_AT_language @DW_LANG_Ada95}
                {DW_AT_name     foo.adb}
                {DW_AT_comp_dir /tmp}
        } {
	    declare_labels integer_label array_elt_label array_label \
                big_array_label

            integer_label: DW_TAG_base_type {
                {DW_AT_byte_size 4 DW_FORM_sdata}
                {DW_AT_encoding  @DW_ATE_signed}
                {DW_AT_name      integer}
            }

            array_elt_label: DW_TAG_subrange_type {
                {DW_AT_lower_bound 0xe0 DW_FORM_data1}
                {DW_AT_upper_bound 0x1f DW_FORM_data1}
                {DW_AT_name        pck__item}
                {DW_AT_type        :$integer_label}
            }

            DW_TAG_typedef {
                {DW_AT_name pck__table}
                {DW_AT_type :$array_label}
            }

	    array_label: DW_TAG_array_type {
		{DW_AT_name pck__table}
                {DW_AT_bit_stride 6 DW_FORM_data1}
		{DW_AT_type :$array_elt_label}
	    } {
		DW_TAG_subrange_type {
		    {DW_AT_type        :$integer_label}
		    {DW_AT_lower_bound 0 DW_FORM_data1}
		    {DW_AT_upper_bound 4 DW_FORM_data1}
		}
	    }

            DW_TAG_typedef {
                {DW_AT_name pck__big_table}
                {DW_AT_type :$big_array_label}
            }

	    big_array_label: DW_TAG_array_type {
		{DW_AT_name pck__big_table}
                {DW_AT_byte_stride 1 DW_FORM_data1}
		{DW_AT_type :$array_elt_label}
	    } {
		DW_TAG_subrange_type {
		    {DW_AT_type        :$integer_label}
		    {DW_AT_lower_bound 0 DW_FORM_data1}
		    {DW_AT_upper_bound 4 DW_FORM_data1}
		}
	    }
	}
    }
}

if { [prepare_for_testing "failed to prepare" ${testfile} \
	  [list $srcfile $asm_file] {nodebug}] } {
    return -1
}

gdb_test_no_output "set language ada"

gdb_test "ptype pck.table" \
         "type = array \\(0 \\.\\. 4\\) of pck\\.item <packed: 6-bit elements>"

gdb_test "ptype pck.big_table" \
         "type = array \\(0 \\.\\. 4\\) of pck\\.item <packed: 8-bit elements>"
