# Copyright 2015-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 dw2-bad-mips-linkage-name.c dw2-bad-mips-linkage-name.S

# Set up the DWARF for the test.

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

    set f_result [function_range f ${srcdir}/${subdir}/${srcfile}]
    set f_start [lindex $f_result 0]
    set f_length [lindex $f_result 1]

    set g_result [function_range g ${srcdir}/${subdir}/${srcfile}]
    set g_start [lindex $g_result 0]
    set g_length [lindex $g_result 1]

    cu {} {
	DW_TAG_compile_unit {
                {DW_AT_language @DW_LANG_C}
                {DW_AT_name     dw2-bad-mips-linkage-name.c}
                {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}
	    }
            DW_TAG_subprogram {
                {name f}
                {low_pc $f_start addr}
                {high_pc "$f_start + $f_length" addr}
                {type :$b_l}
		{DW_AT_MIPS_linkage_name _Z1fv}
	    }
            DW_TAG_subprogram {
                {name g}
                {low_pc $g_start addr}
                {high_pc "$g_start + $g_length" addr}
                {type :$b_l}
		{DW_AT_MIPS_linkage_name 42 DW_FORM_data1}
	    }
	}
    }
}

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

# A successful run will have two PASSes.  A GDB that's lacking
# attribute type checking will segfault at some point.  It doesn't
# much matter what we test here, so long as we do something to make
# sure that the DWARF is read.

gdb_test "ptype f" " = bool \\(\\)"
gdb_test "ptype g" " = bool \\(\\)"
