# Copyright 2020-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

# 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 .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 dw2-line-number-zero.c}
	    {stmt_list $Llines DW_FORM_sec_offset}
	} {
	    subprogram {
		{external 1 flag}
		{MACRO_AT_func {main}}
	    }
	    subprogram {
		{external 1 flag}
		{MACRO_AT_func {bar1}}
	    }
	    subprogram {
		{external 1 flag}
		{MACRO_AT_func {bar2}}
	    }
	}
    }

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

	program {
	    {DW_LNE_set_address bar1_label}
	    {line 27}
	    {DW_LNS_copy}

	    {DW_LNE_set_address bar1_label_2}
	    {line 29}
	    {DW_LNS_copy}

	    {DW_LNE_set_address bar1_label_3}
	    {line 0}
	    {DW_LNS_copy}

	    {DW_LNE_set_address bar1_label_4}
	    {line 33}
	    {DW_LNS_copy}

	    {DW_LNE_set_address bar1_label_5}
	    {DW_LNE_end_sequence}


	    {DW_LNE_set_address bar2_label}
	    {line 41}
	    {DW_LNS_copy}

	    {DW_LNE_set_address bar2_label_2}
	    {line 43}
	    {DW_LNS_copy}

	    {DW_LNE_set_address bar2_label_3}
	    {line 0}
	    {DW_LNS_negate_stmt}
	    {DW_LNS_copy}
	    {DW_LNS_negate_stmt}

	    {DW_LNE_set_address bar2_label_4}
	    {line 47}
	    {DW_LNS_copy}

	    {DW_LNE_set_address bar2_label_5}
	    {DW_LNE_end_sequence}
	}
    }
}

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

if ![runto_main] {
    return -1
}

gdb_breakpoint "$srcfile:27"
gdb_continue_to_breakpoint "bar1" "\[^\r\n\]*:27\r\n.*"

gdb_test "n" "foo \\(2\\);" "bar1, 1st next"
gdb_test "n" "foo \\(4\\);" "bar1, 2nd next"

gdb_breakpoint "$srcfile:41"
gdb_continue_to_breakpoint "bar2" "\[^\r\n\]*:41\r\n.*"

gdb_test "n" "foo \\(2\\);" "bar2, 1st next"
gdb_test "n" "foo \\(4\\);" "bar2, 2nd next"

if ![runto_main] {
    return -1
}

gdb_breakpoint "bar1_label_3"
setup_kfail "gdb/nnnnn" *-*-*
gdb_continue_to_breakpoint "bar1_label_3" "bar1 \\(\\)"

gdb_breakpoint "bar2_label_3"
setup_kfail "gdb/nnnnn" *-*-*
gdb_continue_to_breakpoint "bar2_label_3" "bar2 \\(\\)"
