# Copyright 2014-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]} {
    return 0
}

standard_testfile

set sources \
    [list \
	 ${testfile}.c \
	 ${testfile}-hello.c \
	 ${testfile}-world.c]
set sources [lmap i $sources { string cat "${srcdir}/${subdir}/" $i }]
lassign [function_range hello $sources] \
    hello_start hello_len
lassign [function_range world $sources] \
    world_start world_len

set sources \
    [list \
	 ${testfile}.c \
	 ${testfile}-hello-dbg.S \
	 ${testfile}-hello.c \
	 ${testfile}-world-dbg.S \
	 ${testfile}-world.c]
set flags \
    [list \
	 "nodebug" \
	 "additional_flags=\"-DHELLO_START=$hello_start\"" \
	 "additional_flags=\"-DHELLO_END=$hello_start + $hello_len\"" \
	 "additional_flags=\"-DWORLD_START=$world_start\"" \
	 "additional_flags=\"-DWORLD_END=$world_start + $world_len\""]
set executable ${testfile}
if {[build_executable ${testfile}.exp ${executable} $sources $flags] == -1} {
    return -1
}

clean_restart $executable

gdb_test "break hello" \
    "Breakpoint $decimal at $hex: file .*dw2-abs-hi-pc-hello\\.c, line 24\\."

gdb_test "break world" \
    "Breakpoint $decimal at $hex: file .*dw2-abs-hi-pc-world\\.c, line 24\\."
