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

# This file tests setting breakpoints according to the full path of a
# source file.

standard_testfile

# We rely on being able to copy things around.

if { [is_remote host] } {
    untested "setting breakpoints by full path"
    return -1
}

# Create a temporary file in the build directory.  Use a different
# filename in case ${srcdir} == ${objdir}.
if { [catch {file copy -force ${srcdir}/${subdir}/${srcfile} \
			      [standard_output_file tmp-${srcfile}]}] != 0 } {
    error "Could not create temporary file"
    return -1
}

# Build the test executable using an absolute path.
if  { [gdb_compile [standard_output_file tmp-${srcfile}] "${binfile}" executable {debug}] != "" } {
    return -1
}

# Unlike most GDB tests, we do not use gdb_reinitialize_dir in this script. 
# We're testing GDB's ability to find files in other ways.

# Get the line number.

set line [gdb_get_line_number "set breakpoint 1 here"]

# Initialize GDB after getting the line number, to make sure
# symbols aren't loaded.

gdb_exit
gdb_start
gdb_load ${binfile}

set msg "set breakpoint by full path before loading symbols - built absolute"
if { [gdb_breakpoint [standard_output_file tmp-${srcfile}]:${line} {no-message}] != 0 } {
    pass $msg
} else {
    fail $msg
}

gdb_test "break -q main" \
	 "Breakpoint.*at.*line.*" "set breakpoint at main - built absolute"

set msg "set breakpoint by full path after loading symbols - built absolute"
if { [gdb_breakpoint [standard_output_file tmp-${srcfile}]:${line} {no-message}] != 0 } {
    pass $msg
} else {
    fail $msg
}

# Build the test executable using a relative path.
if  { [gdb_compile [relative_filename [pwd] [standard_output_file tmp-${srcfile}]] \
	   "${binfile}" executable {debug}] != "" } {
    return -1
}

gdb_exit
gdb_start
gdb_load ${binfile}

set msg "set breakpoint by full path before loading symbols - built relative"
if { [gdb_breakpoint [standard_output_file tmp-${srcfile}]:${line} {no-message}] != 0 } {
    pass $msg
} else {
    fail $msg
}

gdb_test "break -q main" \
	 "Breakpoint.*at.*line.*" "set breakpoint at main - built relative"

set msg "set breakpoint by full path after loading symbols - built relative"
if { [gdb_breakpoint [standard_output_file tmp-${srcfile}]:${line} {no-message}] != 0 } {
    pass $msg
} else {
    fail $msg
}

# Build the test executable using relative paths not relative to the directory
# we'll run GDB from.

set save_pwd [pwd]
cd [standard_output_file {}]
if  { [gdb_compile [standard_output_file tmp-${srcfile}] "${testfile}" \
	   executable {debug}] != "" } {
    cd $save_pwd
    return -1
}
cd $save_pwd

gdb_exit
gdb_start
gdb_load ${binfile}

set msg "set breakpoint by full path before loading symbols - built other"
if { [gdb_breakpoint [standard_output_file tmp-${srcfile}]:${line} {no-message}] != 0 } {
    pass $msg
} else {
    fail $msg
}

gdb_test "break -q main" \
	 "Breakpoint.*at.*line.*" "set breakpoint at main - built other"

set msg "set breakpoint by full path after loading symbols - built other"
if { [gdb_breakpoint [standard_output_file tmp-${srcfile}]:${line} {no-message}] != 0 } {
    pass $msg
} else {
    fail $msg
}
