# Copyright 2008-2012 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
}
