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

set testfile "fullname"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${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} \
			      ${objdir}/${subdir}/tmp-${srcfile}}] != 0 } {
    error "Could not create temporary file"
    return -1
}

# Build the test executable using an absolute path.
if  { [gdb_compile "${objdir}/${subdir}/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 ${objdir}/${subdir}/tmp-${srcfile}:${line} {no-message}] != 0 } {
    pass $msg
} else {
    fail $msg
}

gdb_test "break 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 ${objdir}/${subdir}/tmp-${srcfile}:${line} {no-message}] != 0 } {
    pass $msg
} else {
    fail $msg
}

# Build the test executable using a relative path.
if  { [gdb_compile "${subdir}/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 ${objdir}/${subdir}/tmp-${srcfile}:${line} {no-message}] != 0 } {
    pass $msg
} else {
    fail $msg
}

gdb_test "break 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 ${objdir}/${subdir}/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 ${subdir}
if  { [gdb_compile "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 ${objdir}/${subdir}/tmp-${srcfile}:${line} {no-message}] != 0 } {
    pass $msg
} else {
    fail $msg
}

gdb_test "break 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 ${objdir}/${subdir}/tmp-${srcfile}:${line} {no-message}] != 0 } {
    pass $msg
} else {
    fail $msg
}
