# Copyright 2010, 2011 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/>.

# The problem was due to amd64_skip_prologue attempting to access inferior
# memory before the PIE (Position Independent Executable) gets relocated.

if ![istarget *-linux*] {
    continue
}

# Remote protocol does not support follow-exec notifications.

if [is_remote target] {
    continue
}

set testfile "pie-execl"
set srcfile ${testfile}.c
set executable1 ${testfile}1
set executable2 ${testfile}2
set binfile1 ${objdir}/${subdir}/${executable1}
set binfile2 ${objdir}/${subdir}/${executable2}
set binfile2_test_msg OBJDIR/${subdir}/${executable2}

# Use conditional compilation according to `BIN' as GDB remembers the source
# file name of the breakpoint.

set opts [list debug {additional_flags=-fPIE -pie}]
if {[build_executable ${testfile}.exp $executable1 $srcfile [concat $opts {additional_flags=-DBIN=1}]] == ""
    || [build_executable ${testfile}.exp $executable2 $srcfile [concat $opts {additional_flags=-DBIN=2}]] == ""} {
    return -1
}

clean_restart ${executable1}

gdb_test_no_output "set args ${binfile2}" "set args ${binfile2_test_msg}"

if ![runto_main] {
    return -1
}

# Do not stop on `main' after re-exec.
delete_breakpoints

gdb_breakpoint "pie_execl_marker"
gdb_test "info breakpoints" ".*" ""

set addr1 ""
set test "pie_execl_marker address first"
gdb_test_multiple "p/x &pie_execl_marker" $test {
    -re " = (0x\[0-9a-f\]+)\r\n$gdb_prompt $" {
	set addr1 $expect_out(1,string)
	pass $test
    }
}
verbose -log "addr1 is $addr1"

set test "continue"
gdb_test_multiple $test $test {
    -re "Error in re-setting breakpoint" {
	fail $test
    }
    -re "Cannot access memory" {
	fail $test
    }
    -re "pie-execl: re-exec.*executing new program.*\r\nBreakpoint \[0-9\]+,\[^\r\n\]* pie_execl_marker .*\r\n$gdb_prompt $" {
	pass $test
    }
}

gdb_test "info breakpoints" ".*" ""

set addr2 ""
set test "pie_execl_marker address second"
gdb_test_multiple "p/x &pie_execl_marker" $test {
    -re " = (0x\[0-9a-f\]+)\r\n$gdb_prompt $" {
	set addr2 $expect_out(1,string)
	pass $test
    }
}
verbose -log "addr2 is $addr2"

# Ensure we cannot get a false PASS and the inferior has really changed.
set test "pie_execl_marker address has changed"
if [string equal $addr1 $addr2] {
    fail $test
} else {
    pass $test
}
