# Copyright 2020-2022 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 DW_AT_location attributes referencing the .debug_loclists section using
# the DW_FORM_sec_offset form.

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 functions.
    lassign [function_range func1 $srcdir/$subdir/$srcfile] func1_addr func1_len
    lassign [function_range func2 $srcdir/$subdir/$srcfile] func2_addr func2_len
    lassign [function_range func3 $srcdir/$subdir/$srcfile] func3_addr func3_len
    lassign [function_range func4 $srcdir/$subdir/$srcfile] func4_addr func4_len
    lassign [function_range func5 $srcdir/$subdir/$srcfile] func5_addr func5_len
    lassign [function_range func6 $srcdir/$subdir/$srcfile] func6_addr func6_len

    set asm_file [standard_output_file $srcfile2]
    Dwarf::assemble $asm_file {
	global func1_addr func1_len
	global func2_addr func2_len
	global func3_addr func3_len
	global func4_addr func4_len
	global func5_addr func5_len
	global func6_addr func6_len
	global is_64

	declare_labels cu_range_list foo_range_list

	# This CU uses the DW_FORM_sec_offset form to refer to the .debug_rnglists
	# section.
	cu {
	    version 5
	    is_64 $is_64
	} {
	    declare_labels int_type1
	    declare_labels int_type2
	    declare_labels int_type3
	    declare_labels foo_location_list
	    declare_labels bar_location_list
	    declare_labels baz_location_list

	    DW_TAG_compile_unit {
	    } {
		int_type1: 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 $foo_location_list DW_FORM_sec_offset}
		    {DW_AT_type :$int_type1}
		}

		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}
		}
	    }
	}

	# This CU uses the DW_FORM_sec_offset form to refer to the
	# .debug_loclists section, but also has the DW_AT_loclists_base
	# attribute present.  The DW_AT_loclists_base is not used to interpret
	# the DW_AT_location value, but it should also do no harm.
	cu {
	    version 5
	    is_64 $is_64
	} {
	    DW_TAG_compile_unit {
		{DW_AT_loclists_base cu2_table DW_FORM_sec_offset}
	    } {
		int_type2: 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 "bar"}
		    {DW_AT_location $bar_location_list DW_FORM_sec_offset}
		    {DW_AT_type :$int_type2}
		}

		DW_TAG_subprogram {
		    {DW_AT_name "func3"}
		    {DW_AT_low_pc $func3_addr}
		    {DW_AT_high_pc $func3_len DW_FORM_udata}
		}

		DW_TAG_subprogram {
		    {DW_AT_name "func4"}
		    {DW_AT_low_pc $func4_addr}
		    {DW_AT_high_pc $func4_len DW_FORM_udata}
		}
	    }
	}

	# This CU uses the DW_FORM_sec_offset form to refer to the
	# .debug_loclists section.  The corresponding contribution in the
	# .debug_loclists section has no offset array.
	cu {
	    version 5
	    is_64 $is_64
	} {
	    DW_TAG_compile_unit {
	    } {
		int_type3: 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 "baz"}
		    {DW_AT_location $baz_location_list DW_FORM_sec_offset}
		    {DW_AT_type :$int_type3}
		}

		DW_TAG_subprogram {
		    {DW_AT_name "func5"}
		    {DW_AT_low_pc $func5_addr}
		    {DW_AT_high_pc $func5_len DW_FORM_udata}
		}

		DW_TAG_subprogram {
		    {DW_AT_name "func6"}
		    {DW_AT_low_pc $func6_addr}
		    {DW_AT_high_pc $func6_len DW_FORM_udata}
		}
	    }
	}

	loclists {is-64 $is_64} {
	    # The lists in this table are accessed by direct offset
	    # (DW_FORM_sec_offset).
	    table {} {
		foo_location_list: list_ {
		    start_length $func1_addr $func1_len {
			DW_OP_constu 0x123456
			DW_OP_stack_value
		    }

		    start_length $func2_addr $func2_len {
			DW_OP_constu 0x234567
			DW_OP_stack_value
		    }
		}
	    }

	    table {post-header-label cu2_table} {
		bar_location_list: list_ {
		    start_length $func3_addr $func3_len {
			DW_OP_constu 0x345678
			DW_OP_stack_value
		    }

		    start_length $func4_addr $func4_len {
			DW_OP_constu 0x456789
			DW_OP_stack_value
		    }
		}
	    }

	    table {with-offset-array false} {
		baz_location_list: list_ {
		    start_length $func5_addr $func5_len {
			DW_OP_constu 0x567890
			DW_OP_stack_value
		    }

		    start_length $func6_addr $func6_len {
			DW_OP_constu 0x678901
			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_breakpoint "func3"
    gdb_breakpoint "func4"
    gdb_breakpoint "func5"
    gdb_breakpoint "func6"

    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"
    }

    gdb_continue_to_breakpoint "func3"
    with_test_prefix "at func3" {
	gdb_test "print /x bar" " = 0x345678"
    }

    gdb_continue_to_breakpoint "func4"
    with_test_prefix "at func4" {
	gdb_test "print /x bar" " = 0x456789"
    }

    gdb_continue_to_breakpoint "func5"
    with_test_prefix "at func5" {
	gdb_test "print /x baz" " = 0x567890"
    }

    gdb_continue_to_breakpoint "func6"
    with_test_prefix "at func6" {
	gdb_test "print /x baz" " = 0x678901"
    }
}
