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

# Check that an out-of-range DW_LNE_end_sequence is removed from the
# line table.

load_lib dwarf.exp

# This test can only be run on targets which support DWARF-2 and use gas.
if {![dwarf2_support]} {
    verbose "Skipping $gdb_test_file_name."
    return 0
}

# The .c files use __attribute__.
if [get_compiler_info] {
    return -1
}
if !$gcc_compiled {
    verbose "Skipping $gdb_test_file_name."
    return 0
}

standard_testfile main.c -dw.S

set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    declare_labels Llines
    global srcdir subdir srcfile

    cu {} {
	compile_unit {
	    {language @DW_LANG_C}
	    {name $srcfile}
	    {stmt_list $Llines DW_FORM_sec_offset}
	} {
	    subprogram {
		{external 1 flag}
		{MACRO_AT_func {main}}
	    }
	}
    }

    lines {version 2} Llines {
	include_dir "${srcdir}/${subdir}"
	file_name "$srcfile" 1

	program {
	    {DW_LNE_set_address main_label}
	    {line 1}
	    {DW_LNS_copy}

	    {DW_LNS_advance_pc 1}
	    {DW_LNE_end_sequence}

	    {DW_LNE_set_address 0}
	    {line 2}
	    {DW_LNS_copy}

	    {DW_LNS_advance_pc 1}
	    {DW_LNE_end_sequence}
	}
    }
}

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

if ![runto_main] {
    return -1
}

set test "END with address 1 eliminated"
gdb_test_multiple "maint info line-table $srcfile$" $test {
    -re -wrap "END *0x0*1 *Y \r\n.*" {
	fail $gdb_test_name
    }
    -re -wrap "END *$hex *Y " {
	pass $gdb_test_name
    }
}
