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

global inferior_spawn_id
global gdb_spawn_id

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

# In remote mode we cannot use the 'set args' command, and this
# test requires it.
if { [target_info exists gdb_protocol] } then {
    if { [target_info gdb_protocol] == "remote" } then {
	continue
    }
}

standard_testfile .c
set executable1 ${testfile}1
set executable2 ${testfile}2
set binfile1 ${binfile}1
set binfile2 ${binfile}2
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}]] == -1
    || [build_executable ${testfile}.exp $executable2 $srcfile [concat $opts {additional_flags=-DBIN=2}]] == -1} {
    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"
set matches_found 0
gdb_test_multiple $test $test {
    -re "Error in re-setting breakpoint" {
	fail $test
    }
    -re "Cannot access memory" {
	fail $test
    }
    -i "$inferior_spawn_id" -re "pie-execl: re-exec" {
	# output from inferior
        incr matches_found
	if { $matches_found == 2 } {
	    pass $test
	} else {
	    exp_continue
	}
    }
    -i "$gdb_spawn_id"
    -re "executing new program.*\r\nBreakpoint \[0-9\]+,\[^\r\n\]* pie_execl_marker .*\r\n$gdb_prompt $" {
	# output from gdb
        incr matches_found
	if { $matches_found == 2 } {
	    pass $test
	} else {
	    exp_continue
	}
    }
}

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
}
