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

standard_testfile .c -dw.S

# We need to know the size of integer and address types in order
# to write some of the debugging info we'd like to generate.
#
# For that, we ask GDB by debugging our data-loc.c program.
# Any program would do, but since we already have data-loc.c
# specifically for this testcase, might as well use that.

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

# 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_label array_ptr_label
	    set int_size [get_sizeof "int" 4]
	    set voidp_size [get_sizeof "void *" 96]

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

	    array_label: DW_TAG_array_type {
		{DW_AT_name foo__array_type}
		{DW_AT_type :$integer_label}
                {DW_AT_data_location {
                    DW_OP_push_object_address
                    DW_OP_deref
                } SPECIAL_expr}
                {external 1 flag}
	    } {
		DW_TAG_subrange_type {
		    {DW_AT_type        :$integer_label}
                    {DW_AT_lower_bound {
                        DW_OP_push_object_address
                        DW_OP_plus_uconst $voidp_size
                        DW_OP_deref
                        DW_OP_deref_size $int_size
                    } SPECIAL_expr}
                    {DW_AT_upper_bound {
                        DW_OP_push_object_address
                        DW_OP_plus_uconst $voidp_size
                        DW_OP_deref
                        DW_OP_plus_uconst $int_size
                        DW_OP_deref_size $int_size
                    } SPECIAL_expr}
		}
	    }
            array_ptr_label: DW_TAG_typedef {
                {DW_AT_name foo__array_type}
                {DW_AT_type :$array_label}
            }
            DW_TAG_variable {
                {DW_AT_name foo__three}
                {DW_AT_type :$array_label}
                {DW_AT_location {
                    DW_OP_addr [gdb_target_symbol table_1]
                } SPECIAL_expr}
                {external 1 flag}
            }
            DW_TAG_variable {
                {DW_AT_name foo__three_tdef}
                {DW_AT_type :$array_ptr_label}
                {DW_AT_location {
                    DW_OP_addr [gdb_target_symbol table_1]
                } SPECIAL_expr}
                {external 1 flag}
            }
            DW_TAG_variable {
                {DW_AT_name foo__five}
                {DW_AT_type :$array_label}
                {DW_AT_location {
                    DW_OP_addr [gdb_target_symbol table_2]
                } SPECIAL_expr}
                {external 1 flag}
            }
            DW_TAG_variable {
                {DW_AT_name foo__five_tdef}
                {DW_AT_type :$array_ptr_label}
                {DW_AT_location {
                    DW_OP_addr [gdb_target_symbol table_2]
                } SPECIAL_expr}
                {external 1 flag}
            }
	}
    }
}

# Now that we've generated the DWARF debugging info, rebuild our
# program using our debug info instead of the info generated by
# the compiler.

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

if ![runto_main] {
    return -1
}

gdb_test_no_output "set language ada"

# foo.three

gdb_test "print foo.three" \
         " = \\(1, 2, 3\\)"

gdb_test "ptype foo.three" \
         "type = array \\(<>\\) of integer"

gdb_test "print foo.three(1)" \
         " = 1"

gdb_test "print foo.three(2)" \
         " = 2"

gdb_test "print foo.three(3)" \
         " = 3"

gdb_test "print foo.three'first" \
         " = 1"

gdb_test "print foo.three'last" \
         " = 3"

gdb_test "print foo.three'length" \
         " = 3"

# foo.three_tdef

gdb_test "print foo.three_tdef.all" \
         " = \\(1, 2, 3\\)"

gdb_test "ptype foo.three_tdef" \
         "type = access array \\(<>\\) of integer"

gdb_test "print foo.three_tdef(1)" \
         " = 1"

gdb_test "print foo.three_tdef(2)" \
         " = 2"

gdb_test "print foo.three_tdef(3)" \
         " = 3"

gdb_test "print foo.three_tdef'first" \
         " = 1"

gdb_test "print foo.three_tdef'last" \
         " = 3"

gdb_test "print foo.three_tdef'length" \
         " = 3"

gdb_test "print foo.five" \
         " = \\(2 => 5, 8, 13, 21, 34\\)"

gdb_test "ptype foo.five" \
         "type = array \\(<>\\) of integer"

gdb_test "ptype foo.array_type" \
         "type = array \\(<>\\) of integer"

# foo.five

gdb_test "print foo.five(2)" \
         " = 5"

gdb_test "print foo.five(3)" \
         " = 8"

gdb_test "print foo.five(4)" \
         " = 13"

gdb_test "print foo.five(5)" \
         " = 21"

gdb_test "print foo.five(6)" \
         " = 34"

gdb_test "print foo.five'first" \
         " = 2"

gdb_test "print foo.five'last" \
         " = 6"

gdb_test "print foo.five'length" \
         " = 5"

# foo.five_tdef

gdb_test "print foo.five_tdef.all" \
         " = \\(2 => 5, 8, 13, 21, 34\\)"

gdb_test "ptype foo.five_tdef" \
         "type = access array \\(<>\\) of integer"

gdb_test "print foo.five_tdef(2)" \
         " = 5"

gdb_test "print foo.five_tdef(3)" \
         " = 8"

gdb_test "print foo.five_tdef(4)" \
         " = 13"

gdb_test "print foo.five_tdef(5)" \
         " = 21"

gdb_test "print foo.five_tdef(6)" \
         " = 34"

gdb_test "print foo.five_tdef'first" \
         " = 2"

gdb_test "print foo.five_tdef'last" \
         " = 6"

gdb_test "print foo.five_tdef'length" \
         " = 5"
