# Copyright 2014-2021 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 {
    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 {
    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 {
	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)*" \
	"(?:.Thread debugging using .*? enabled.\r\nUsing .*? library .*?\\.\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
    }
}
