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

# 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 ldflags=-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
}
