# Copyright 2008-2024 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 and being able to set
# breakpoints by full path.
require {!is_remote host}

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

clean_restart $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
}

clean_restart $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.

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

clean_restart $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
}
