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

# Test to reproduce the crash described in PR 26813.
#
# When reading a list in any table in the .debug_loclists section, GDB would
# read the header at offset 0 in the section (the header of the first table).
# When the index of the list we read was greater than the number of lists of
# the first table, GDB would erroneously report that the index is invalid.
#
# So this test creates a .debug_loclists section with two tables.  The second
# table has more lists than the first one and we try to read a high index in
# the second table.

load_lib dwarf.exp

if {![dwarf2_support]} {
    return 0
}

# Test with 32-bit and 64-bit DWARF.
foreach_with_prefix is_64 {false true} {
    if { $is_64 } {
	standard_testfile .c -dw64.S
	set testfile ${testfile}-dw64
    } else {
	standard_testfile .c -dw32.S
	set testfile ${testfile}-dw32
    }

    # Get the addresses / lengths of func1 and func2.
    lassign [function_range func1 $srcdir/$subdir/$srcfile] func1_addr func1_len
    lassign [function_range func2 $srcdir/$subdir/$srcfile] func2_addr func2_len

    set asm_file [standard_output_file $srcfile2]
    Dwarf::assemble $asm_file {
	global func1_addr func1_len
	global func2_addr func2_len
	global is_64

	# The CU uses the DW_FORM_loclistx form to refer to the .debug_loclists
	# section.
	cu {
	    version 5
	    is_64 $is_64
	} {
	    declare_labels int_type

	    DW_TAG_compile_unit {
		{DW_AT_loclists_base cu_table DW_FORM_sec_offset}
	    } {
		int_type: DW_TAG_base_type {
		    {DW_AT_byte_size 4 DW_FORM_data1}
		    {DW_AT_encoding @DW_ATE_signed}
		    {DW_AT_name "int"}
		}

		DW_TAG_variable {
		    {DW_AT_name "foo"}
		    {DW_AT_location 1 DW_FORM_loclistx}
		    {DW_AT_type :$int_type}
		}

		DW_TAG_subprogram {
		    {DW_AT_name "func1"}
		    {DW_AT_low_pc $func1_addr}
		    {DW_AT_high_pc $func1_len DW_FORM_udata}
		}

		DW_TAG_subprogram {
		    {DW_AT_name "func2"}
		    {DW_AT_low_pc $func2_addr}
		    {DW_AT_high_pc $func2_len DW_FORM_udata}
		}
	    }
	}

	loclists {is-64 $is_64} {
	    # This table is unused, but exists so that the used table is not at
	    # the beginning of the section.
	    table {} {
		list_ {
		    start_length 0x1000 0x1000 { DW_OP_addr 0x100000 }
		}
	    }

	    # The lists in this table are accessed by index (DW_FORM_rnglistx).
	    table {post-header-label cu_table} {
		# This list is unused, but exists to offset the next ones.
		list_ {
		    start_length 0x1000 0x1000 { DW_OP_addr 0x100000 }
		}

		# For variable foo.
		list_ {
		    # When in func1.
		    start_length $func1_addr $func1_len {
			DW_OP_constu 0x123456
			DW_OP_stack_value
		    }

		    # When in func2.
		    start_length $func2_addr $func2_len {
			DW_OP_constu 0x234567
			DW_OP_stack_value
		    }
		}
	    }
	}
    }

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

    if { ![runto_main] } {
	return
    }

    gdb_breakpoint "func1"
    gdb_breakpoint "func2"

    gdb_continue_to_breakpoint "func1"
    with_test_prefix "at func1" {
	gdb_test "print /x foo" " = 0x123456"
    }

    gdb_continue_to_breakpoint "func2"
    with_test_prefix "at func2" {
	gdb_test "print /x foo" " = 0x234567"
    }
}
