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

# Regression test to ensure that the order of DW_AT_name and
# DW_AT_linkage_name does not affect Ada.

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 -debug.S

# Set up the DWARF for the test.

set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    global srcdir subdir srcfile

    cu {} {
	DW_TAG_compile_unit {
                {DW_AT_language @DW_LANG_Ada95}
                {DW_AT_name     $srcfile}
                {DW_AT_comp_dir /tmp}

        } {
	    declare_labels b_l

	    b_l: DW_TAG_base_type {
		{DW_AT_byte_size 1 DW_FORM_sdata}
		{DW_AT_encoding  @DW_ATE_signed}
		{DW_AT_name      bool}
	    }
	    # Here the name comes first and the linkage name second.
            DW_TAG_subprogram {
                {name system__namefirst}
		{linkage_name __gnat_namefirst}
		{MACRO_AT_range {first}}
                {type :$b_l}
	    }
	    # Here the linkage name comes first and the name second.
            DW_TAG_subprogram {
		{linkage_name __gnat_namesecond}
                {name system__namesecond}
                {MACRO_AT_range {second}}
                {type :$b_l}
	    }
	}
    }
}

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

with_test_prefix "first first" {
    gdb_test_no_output "set language ada"
    gdb_breakpoint "<__gnat_namefirst>" message
    gdb_breakpoint "<__gnat_namesecond>" message
}

# Run the test again, but this time check the symbols in the other
# order.  This ensures we are really testing all the paths --
# otherwise if the first symbol is found, it will cause symtab
# expansion, which might cause the other symbol to be found.
clean_restart ${testfile}

with_test_prefix "second first" {
    gdb_test_no_output "set language ada"
    gdb_breakpoint "<__gnat_namesecond>" message
    gdb_breakpoint "<__gnat_namefirst>" message
}
