# Copyright 2015-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 .S

# Set up the DWARF for the test.

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

    cu {} {
	DW_TAG_compile_unit {
                {DW_AT_language @DW_LANG_C_plus_plus}
                {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}
	    }
            DW_TAG_subprogram {
                {MACRO_AT_func {f}}
                {type :$b_l}
		{DW_AT_MIPS_linkage_name _Z1fv}
	    }
            DW_TAG_subprogram {
                {MACRO_AT_func {g}}
                {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 \\(void\\)"
gdb_test "ptype g" " = bool \\(void\\)"
