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

# Test that when following an exec, we don't try to insert breakpoints
# in the new image at the addresses the symbols had before the exec.

standard_testfile

# Build two copies of the program, each linked at a different address.
# The address of "main" in the first binary should end up being an
# unmapped address in the second binary.

set objfile ${binfile}.o
set exec1 ${binfile}1
set exec2 ${binfile}2

if { [gdb_compile [file join $srcdir $subdir $srcfile] $objfile \
	  object [list debug]] != "" } {
    untested "failed to compile"
    return -1
}

set opts1_ld [list debug ldflags=-Wl,-Ttext-segment=0x1000000]
set opts1_gold [list debug ldflags=-Wl,-Ttext=0x1000000]
set opts2_ld [list debug ldflags=-Wl,-Ttext-segment=0x2000000]
set opts2_gold [list debug ldflags=-Wl,-Ttext=0x2000000]

if { [gdb_compile $objfile $exec1 executable $opts1_ld] != "" } {
    # Old gold linker versions don't support -Ttext-segment.  Fall
    # back to -Ttext.
    if { [gdb_compile $objfile $exec1 executable $opts1_gold] != ""
	 || [gdb_compile $objfile $exec2 executable $opts2_gold] != ""} {
	untested "link failed"
	return -1
    }
} elseif { [gdb_compile $objfile $exec2 executable $opts2_ld] != "" } {
    untested "link failed"
    return -1
}

# First check whether the address of "main" in exec1 is readable in
# exec2.  If it is, then skip the test as unsupported.

clean_restart ${exec1}
if ![runto_main] then {
    fail "couldn't run to main"
    return -1
}

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

clean_restart ${exec2}
if ![runto_main] then {
    fail "couldn't run to main"
    return -1
}

set cannot_access 0
set test "probe memory access"
gdb_test_multiple "x $addr" $test {
    -re "Cannot access memory at address .*$gdb_prompt $" {
	set cannot_access 1
	pass $test
    }
    -re ".*$gdb_prompt $" {
	pass $test
    }
}

if {!$cannot_access} {
    unsupported "main address is readable in second binary"
    return
}

# The test proper.  ALWAYS_INSERTED indicates whether testing in
# "breakpoint always-inserted" mode.

proc test { always_inserted } {
    global exec1
    global gdb_prompt

    clean_restart ${exec1}

    gdb_test_no_output "set breakpoint always-inserted $always_inserted"

    if ![runto_main] then {
	fail "couldn't run to main"
	return -1
    }

    # Set a second breakpoint (whose original address also ends up
    # unmmapped after the exec), for PR 19548.
    gdb_test "break some_function" "Breakpoint .*"

    # PR17431: with always-inserted on, we'd see:
    #  (gdb) continue
    #  Continuing.
    #  Warning:
    #  Cannot insert breakpoint 1.
    #  Cannot access memory at address 0x10000ff

    # PR 19548: with more than one breakpoint, we'd see:
    #  (gdb) continue
    #  Continuing.
    #  process (...) is executing new program: (...)/execl-update-breakpoints2
    #  Error in re-setting breakpoint 1: Warning:
    #  Cannot insert breakpoint 2.
    #  Cannot access memory at address 0x1000764
    set not_nl "\[^\r\n\]*"
    set regex ""
    append regex \
	"^continue\r\n" \
	"Continuing\\.\r\n" \
	"${not_nl} is executing new program: ${not_nl}\r\n" \
	"(Reading ${not_nl} from remote target\\.\\.\\.\r\n)*" \
	"\r\n" \
	"Breakpoint 1, main.*$gdb_prompt $"
    set message "continue across exec"
    gdb_test_multiple "continue" $message {
	-re $regex {
	    pass $message
	}
    }
}

foreach always_inserted { "off" "on" } {
    with_test_prefix "always-inserted $always_inserted" {
	test $always_inserted
    }
}
