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

# Test corrupt DWARF input
# PR gdb/15827

load_lib dwarf.exp

if {![dwarf2_support]} {
    return 0
}

standard_testfile main.c .S

# Make the DWARF used for the test.
#
# Here we put DW_AT_sibling DIEs into the output which
# point off into la-la land.  The whole purpose is to simulate
# corrupt DWARF information and make sure that GDB can handle it
# without crashing.

set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    cu {} {
	compile_unit {} {
	    declare_labels int_label

	    int_label: base_type {
		{byte_size 4 sdata}
		{name "int"}
	    }

	    enumeration_type {
		{name "ENUM"}
		{byte_size 4 sdata}
	    } {
		enumerator {
		    {name "A"}
		    {const_value 0 sdata}
		}
		enumerator {
		    {name "B"}
		    {const_value 1 sdata}
		    {sibling 12345678 DW_FORM_ref4}
		} {
		    base_type {
			{byte_size 1 sdata}
			{name "char"}
		    }
		}
		array_type {
		    {type :$int_label}
		    {sibling 12345678 DW_FORM_ref4}
		}
	    }
	}
    }
}

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

gdb_test "print 1" "= 1" "recover from corrupt DWARF"
