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