# 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/>.

# Tests to cover DW_AT_count attribute in subranges.

load_lib dwarf.exp

# Only run on targets which support dwarf and gas.
if { ![dwarf2_support] } {
    return 0
}

standard_testfile main.c count.S

set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    cu {} {
	compile_unit {{language @DW_LANG_C99}} {
	    declare_labels char_label array_label array_label2 static_array_label

	    char_label: base_type {
		{name char}
		{encoding @DW_ATE_signed}
		{byte_size 1 DW_FORM_sdata}
	    }

	    array_label: array_type {
		{type :$char_label}
	    } {
		subrange_type {
		    {count {DW_OP_lit5} SPECIAL_expr}
		    {type :$char_label}
		}
	    }

	    array_label2: array_type {
		{type :$char_label}
	    } {
		subrange_type {
		    {count {DW_OP_lit1} SPECIAL_expr}
		    {type :$char_label}
		}
	    }

	    static_array_label: array_type {
		{type :$char_label}
	    } {
		subrange_type {
		    {count 5 DW_FORM_sdata}
		    {type :$char_label}
		}
	    }

	    DW_TAG_variable {
		{name array2}
		{type :$array_label2}
		{const_value 65 DW_FORM_udata}
	    }

	    DW_TAG_variable {
		{name array}
		{type :$array_label}
		{const_value hello DW_FORM_block1}
	    }

	    DW_TAG_variable {
		{name static_array}
		{type :$static_array_label}
		{const_value world DW_FORM_block1}
	    }
	}
    }
}

if { [gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile}1.o \
	  object {nodebug}] != "" } {
    return -1
}

if { [gdb_compile $asm_file ${binfile}2.o object {nodebug}] != "" } {
    return -1
}

if { [gdb_compile [list ${binfile}1.o ${binfile}2.o] \
	  "${binfile}" executable {}] != "" } {
    return -1
}

global GDBFLAGS
set saved_gdbflags $GDBFLAGS
set GDBFLAGS [concat $GDBFLAGS " -readnow"]
clean_restart ${testfile}
set GDBFLAGS $saved_gdbflags

if ![runto_main] {
    perror "couldn't run to main"
    return -1
}

gdb_test "ptype array" "type = char \\\[5\\\]"
gdb_test "whatis array" "type = char \\\[5\\\]"
gdb_test "print array" " = \"hello\""
gdb_test "print sizeof array" " = 5"

gdb_test "ptype array2" "type = char \\\[1\\\]"
gdb_test "whatis array2" "type = char \\\[1\\\]"
gdb_test "print array2" " = \"A\""
gdb_test "print sizeof array2" " = 1"

gdb_test "ptype static_array" "type = char \\\[5\\\]"
gdb_test "whatis static_array" "type = char \\\[5\\\]"
gdb_test "print static_array" " = \"world\""
gdb_test "print sizeof static_array" " = 5"
