# 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 data-loc.c data-loc-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]

            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 [get_sizeof "void *" 96]
                        DW_OP_deref
                        DW_OP_deref_size [get_sizeof "int" 4]
                    } SPECIAL_expr}
                    {DW_AT_upper_bound {
                        DW_OP_push_object_address
                        DW_OP_plus_uconst [get_sizeof "void *" 96]
                        DW_OP_deref
                        DW_OP_plus_uconst [get_sizeof "int" 4]
                        DW_OP_deref_size [get_sizeof "int" 4]
                    } 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 \\(1 .. 3\\) 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" \
         " = \\(1, 2, 3\\)"

gdb_test "ptype foo.three_tdef" \
         "type = array \\(1 .. 3\\) 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 \\(2 .. 6\\) 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" \
         " = \\(2 => 5, 8, 13, 21, 34\\)"

gdb_test "ptype foo.five_tdef" \
         "type = array \\(2 .. 6\\) of integer"

gdb_test "ptype foo.array_type" \
         "type = 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"

gdb_test_no_output "set lang c"

# foo__three

gdb_test "print foo__three" \
         " = \\{1, 2, 3\\}"

gdb_test "ptype foo__three" \
         "type = integer \\\[3\\\]"

# foo__three_tdef

gdb_test "print foo__three_tdef" \
         " = \\{1, 2, 3\\}"

gdb_test "ptype foo__three_tdef" \
         "type = integer \\\[3\\\]"

# foo__five

gdb_test "print foo__five" \
         " = \\{5, 8, 13, 21, 34\\}"

gdb_test "ptype foo__five" \
         "type = integer \\\[5\\\]"

# foo__five_tdef

gdb_test "print foo__five_tdef" \
         " = \\{5, 8, 13, 21, 34\\}"

gdb_test "ptype foo__five_tdef" \
         "type = integer \\\[5\\\]"

gdb_test "ptype foo__array_type" \
         "type = integer \\\[variable length\\\]"
