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

load_lib dwarf.exp

# Check psymtabs addrmaps generated from DW_AT_ranges of functions.

# This test can only be run on targets which support DWARF-2 and use gas.
if {![dwarf2_support]} {
    unsupported "dwarf2 support required for this test"
    return 0
}

standard_testfile -main.c .c -dw.S

# We need to know the size of integer and address types in order to
# write some of the debugging info we'd like to generate.
#
# For that, we ask GDB by debugging our test program.  Any program
# would do, but since we already have it specifically for this
# testcase, might as well use that.

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

set asm_file [standard_output_file $srcfile3]
Dwarf::assemble $asm_file {
    global srcdir subdir srcfile srcfile2
    declare_labels integer_label func_ranges_label
    set int_size [get_sizeof "int" 4]

    # Find start address and length for our functions.
    set sources  [list ${srcdir}/${subdir}/$srcfile ${srcdir}/${subdir}/$srcfile2]

    lassign [function_range foo $sources] \
	foo_start foo_len
    set foo_end "$foo_start + $foo_len"

    lassign [function_range foo_low $sources] \
	foo_low_start foo_low_len
    set foo_low_end "$foo_low_start + $foo_low_len"

    lassign [function_range bar $sources] \
	bar_start bar_len
    set bar_end "$bar_start + $bar_len"

    lassign [function_range baz $sources] \
	baz_start baz_len
    set baz_end "$baz_start + $baz_len"

    cu {} {
	compile_unit {
	    {language @DW_LANG_C}
	    {name dw-ranges-psym.c}
	    {low_pc 0 addr}
	} {
	    integer_label: DW_TAG_base_type {
		{DW_AT_byte_size $int_size DW_FORM_sdata}
		{DW_AT_encoding  @DW_ATE_signed}
		{DW_AT_name      integer}
	    }
	    subprogram {
		{external 1 flag}
		{name foo}
		{ranges ${func_ranges_label} DW_FORM_sec_offset}
	    }
	    subprogram {
		{external 1 flag}
		{name bar}
		{low_pc $bar_start addr}
		{high_pc $bar_len DW_FORM_data4}
	    }
	    subprogram {
		{external 1 flag}
		{name baz}
		{low_pc $baz_start addr}
		{high_pc $baz_len DW_FORM_data4}
	    }
	}
    }

    # Generate ranges data.  Create a hole at $foo_low_start + 1" .. $foo_low_end.
    ranges {is_64 [is_64_target]} {
	func_ranges_label: sequence {
	    range $foo_start $foo_end
	    range $foo_low_start "$foo_low_start + 1"
	    #range "$foo_low_start + 1" $foo_low_end
	}
    }
}

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

clean_restart

gdb_load_no_complaints $binfile

if ![runto_main] {
    return -1
}

# Generate backtrace from baz, that visits the hole in the addrmap.  If
# the hole is there in the symbol table, but not the partial symbol table,
# we run into:
# (gdb) bt
# warning: (Internal error: pc 0x555555554619 in read in psymtab, \
#    but not in symtab.)
# ...
# (gdb) 

gdb_test "break baz" \
    "Breakpoint.*at.*"

gdb_test "continue"

set re "warning: \\(Internal error: pc $hex in read in psymtab, but not in symtab\\.\\)"
gdb_test_multiple "bt" "" {
    -re -wrap "$re.*" {
	fail $gdb_test_name
    }
    -re -wrap "" {
	pass $gdb_test_name
    }
}
