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

# A test of multi-language dictionaries, a solution to symtab/23010 et al.

load_lib dwarf.exp

# This test can only be run on targets which support DWARF.
if {![dwarf2_support]} {
    return 0
}

standard_testfile main.c .S

# Create the DWARF.  This is derived from the reproducer in the bug
# mentioned above.  This DIE tree is typical of compilations wtih
# LTO enabled.

set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    declare_labels D45d9 D5079 D5080 D50a9 D50af D5ab2 D5ac2 D5ace D5acf
    declare_labels D2135f D2216a D22171 D226c4 D226ca D244ca \
	D245da D245e6
    declare_labels D41c21 D42025 D42045 D42038 D42045 D420b5

    cu {} {
	D45d9: compile_unit {
	    {language @DW_LANG_C_plus_plus}
	    {name "SerialPortUtils.cpp"}
	} {
	    D5079: base_type {
		{byte_size 1 sdata}
		{encoding @DW_ATE_unsigned}
		{name "char"}
	    }

	    D5080: const_type {
		{type :$D5079}
	    }

	    D50a9: pointer_type {
		{byte_size 4 sdata}
		{type :$D5080}
	    }

	    D50af: const_type {
		{type :$D50a9}
	    }

	    D5ab2: subprogram {
		{external 1 flag}
		{linkage_name "_Z18SerialSyncWriteStrPKc"}
	    } {
		D5ac2: formal_parameter {
		    {name "msg"}
		    {type :$D50af}
		}
		D5ace: lexical_block {} {
		    D5acf: DW_TAG_variable {
			{name "p"}
			{type :$D50a9}
		    }
		}
	    }
	}
    }

    cu {} {
	D2135f: compile_unit {
	    {language @DW_LANG_C_plus_plus}
	    {name "Main.cpp"}
	} {
	    D2216a: base_type {
		{byte_size 1 sdata}
		{encoding @DW_ATE_unsigned_char}
		{name "char"}
	    }

	    D22171: const_type {
		{type :$D2216a}
	    }

	    D226c4: pointer_type {
		{byte_size 4 sdata}
		{type :$D22171}
	    }

	    D226ca: const_type {
		{type :$D226c4}
	    }

	    D245da: subprogram {
		{name "PrintPanicMsg"}
	    } {
		D245e6: formal_parameter {
		    {name "msg"}
		    {type :$D226ca}
		}
	    }
	}
    }

    cu {} {
       D41c21: compile_unit {
           {language @DW_LANG_C99}
           {name "<artificial>"}
       } {
           D42025: subprogram {
               {abstract_origin %$D245da}
               {low_pc 0x80b60 addr}
               {high_pc 0x6c data4}
           } {
	       D42038: formal_parameter {
		   {abstract_origin %$D245e6}
	       }

	       D42045: inlined_subroutine {
                   {abstract_origin %$D5ab2}
                   {low_pc 0x8060 addr}
                   {high_pc 0xc data4}
               } {
                   D420b5: formal_parameter {
                       {abstract_origin %$D5ac2}
                   }
               }
           }
       }
    }
}

# Build the test executable.
if {[build_executable $testfile.exp $testfile [list $asm_file $srcfile] {}] \
	== -1} {
    return -1
}

# We force the DIEs above to be read in via "-readnow".
save_vars { GDBFLAGS } {
    set GDBFLAGS "$GDBFLAGS -readnow"
    clean_restart
}
gdb_load $binfile

# All we need to do is check whether GDB is alive.  Without
# multidictionaries, it will either crash, assert, or throw an
# internal_error.
gdb_test "p 1" "= 1" "GDB is alive"

