# Copyright 2020-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 main-foo.c .S

# Make some DWARF for the test.
set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    cu {} {
	compile_unit {
	    {DW_AT_language @DW_LANG_C}
	    {DW_AT_name main.c}
	} {
	    structure_type {
		{name s}
		{signature 0x0000000000000001 ref_sig8}
		{declaration 1 flag}
	    }
	    DW_TAG_subprogram {
		{MACRO_AT_func {main}}
	    }
	}
    }

    cu {} {
	compile_unit {
	    {DW_AT_language @DW_LANG_C}
	    {DW_AT_name     foo.c}
	} {
	    structure_type {
		{name s}
		{signature 0x0000000000000002 ref_sig8}
		{declaration 1 flag}
	    }
	    DW_TAG_subprogram {
		{MACRO_AT_func {foo}}
	    }
	}
    }

    tu {} 0x0000000000000001 the_type_i {
	type_unit {} {
	    declare_labels int_type

	    the_type_i: structure_type {
		{name s}
		{byte_size 4 sdata}
	    } {
		member {
		    {name i}
		    {type :$int_type}
		}
	    }
	    int_type: base_type {
		{name int}
		{encoding @DW_ATE_signed}
		{byte_size 4 sdata}
	    }
	}
    }

    tu {} 0x0000000000000002 the_type_j {
	type_unit {} {
	    declare_labels int_type

	    the_type_j: structure_type {
		{name s}
		{byte_size 4 sdata}
	    } {
		member {
		    {name j}
		    {type :$int_type}
		}
	    }
	    int_type: base_type {
		{name int}
		{encoding @DW_ATE_signed}
		{byte_size 4 sdata}
	    }
	}
    }
}

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

set struct_s_i_re \
    [multi_line \
	 "type = struct s {" \
	 "    int i;" \
	 "}"]
set struct_s_j_re \
    [multi_line \
	 "type = struct s {" \
	 "    int j;" \
	 "}"]

if ![runto_main] {
    return -1
}

gdb_test "ptype struct s" $struct_s_i_re \
    "struct s with int i"

gdb_breakpoint "foo"
gdb_continue_to_breakpoint "foo"

gdb_test "ptype struct s" $struct_s_j_re \
    "struct s with int j"
