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

# This test only works on GNU/Linux.
if { ![isnative] || [is_remote host] || ![istarget *-linux*] || [skip_shlib_tests]} {
    continue
}

load_lib prelink-support.exp

set test "break-interp"
set binprefix ${objdir}/${subdir}/${test}
# Only to get the $interp_system name.
set srcfile_test "start.c"
set binfile_test ${test}-test
set binfile_lib ${objdir}/${subdir}/${test}.so
set srcfile "${test}-main.c"
set srcfile_lib "${test}-lib.c"

if [get_compiler_info ${binfile_lib}] {
    return -1
}

# Use -soname so that the new library gets copied by build_executable_own_libs.

if {[gdb_compile_shlib ${srcdir}/${subdir}/${srcfile_lib} ${binfile_lib} [list debug ldflags=-Wl,-soname,${test}.so]] != ""} {
    return -1
}

if {[build_executable ${test}.exp $binfile_test ${srcfile_test} {}] == -1} {
    return -1
}

# Note: The separate debug info file content build-id/crc32 are not verified
# contrary to the GDB search algorithm skipping non-matching ones.
proc system_debug_get {exec} {
    global debug_root

    set exec_build_id_debug [build_id_debug_filename_get $exec]
    set debug_base "[file tail $exec].debug"
    set exec_dir [file dirname $exec]

    # isfile returns 1 even for symlinks to files.
    set retval $debug_root/$exec_build_id_debug
    if [file isfile $retval] {
	return $retval
    }
    set retval $exec_dir/$debug_base
    if [file isfile $retval] {
	return $retval
    }
    set retval $exec_dir/.debug/$debug_base
    if [file isfile $retval] {
	return $retval
    }
    set retval $debug_root/$exec_dir/$debug_base
    if [file isfile $retval] {
	return $retval
    }
    return ""
}

gdb_exit
gdb_start
set debug_root ""
set test "show debug-file-directory"
gdb_test_multiple $test $test {
    -re "The directory where separate debug symbols are searched for is \"(.*)\".\r\n$gdb_prompt $" {
	set debug_root $expect_out(1,string)
    }
}

set interp_system [section_get ${objdir}/${subdir}/$binfile_test .interp]
set interp_system_debug [system_debug_get $interp_system]
verbose -log "$interp_system has debug $interp_system_debug"

proc prelinkNO {arg {name ""}} {
    return [prelink_no $arg $name]
}

proc prelinkYES {arg {name ""}} {
    return [prelink_yes $arg $name]
}

proc strip_debug {dest} {
    set test "strip [file tail $dest]"
    set strip_program [transform strip]
    set command "exec $strip_program --strip-debug $dest"
    verbose -log "command is $command"
    if [catch $command] {
	fail $test
	return 0
    } else {
    	pass $test
	return 1
    }
}

# Implementation of reach.

proc reach_1 {func command displacement} {
    global gdb_prompt expect_out

    if {$func == "_dl_debug_state"} {
	# Breakpoint on _dl_debug_state can have problems due to its overlap
	# with the existing internal breakpoint from GDB.
	gdb_test_no_output "set stop-on-solib-events 1"
    } elseif {! [gdb_breakpoint $func allow-pending]} {
	return
    }

    set test "reach"
    set test_displacement "seen displacement message as $displacement"
    set debug_state_count 0
    gdb_test_multiple $command $test {
	-re "Using PIE \\(Position Independent Executable\\) displacement (0x\[0-9a-f\]+) " {
	    # Missing "$gdb_prompt $" is intentional.
	    if {$expect_out(1,string) == "0x0"} {
		set case "ZERO"
	    } else {
		set case "NONZERO"
	    }
	    if {$displacement == $case || $displacement == "PRESENT"} {
		pass $test_displacement
		set displacement "FOUND-$displacement"
	    } else {
		fail $test_displacement
	    }
	    exp_continue
	}
	-re "Breakpoint \[0-9\]+, \\.?$func \\(.*\\) at .*:\[0-9\]+\r\n.*$gdb_prompt $" {
	    if {$func == "_dl_debug_state"} {
		fail $test
	    } else {
		pass $test
	    }
	}
	-re "Breakpoint \[0-9\]+, \[0-9xa-f\]+ in \\.?$func \\(\\).*\r\n$gdb_prompt $" {
	    if {$func == "_dl_debug_state"} {
		fail $test
	    } else {
		pass $test
	    }
	}
	-re "Stopped due to shared library event\r\n$gdb_prompt $" {
	    if {$func == "_dl_debug_state"} {
		if {$debug_state_count == 0} {
		    # First stop does not yet relocate the _start function
		    # descriptor on ppc64.
		    set debug_state_count 1
		    send_gdb "continue\n"
		    exp_continue
		} else {
		    pass $test
		}
	    } else {
		fail $test
	    }
	}
    }
    if ![regexp {^(NONE|FOUND-.*)$} $displacement] {
	fail $test_displacement
    }

    if {$func == "_dl_debug_state"} {
	gdb_test_no_output "set stop-on-solib-events 0"
    }
}

# `runto' does not check we stopped really at the function we specified.
# DISPLACEMENT can be "NONE" for no message to be present, "ZERO" for
# displacement of 0 bytes to be present, "NONZERO" for displacement of non-0
# bytes to be present and "PRESENT" if both "ZERO" and "NONZERO" are valid.
proc reach {func command displacement} {
    global pf_prefix
    set old_ldprefix $pf_prefix
    lappend pf_prefix "reach-$func:"

    reach_1 $func $command $displacement

    set pf_prefix $old_ldprefix
}

proc test_core {file displacement} {
    global srcdir subdir gdb_prompt expect_out

    set corefile [core_find $file {} "segv"]
    if {$corefile == ""} {
	return
    }

    global pf_prefix
    set old_ldprefix $pf_prefix
    lappend pf_prefix "core:"

    gdb_exit
    gdb_start
    # Clear it to never find any separate debug infos in $debug_root.
    gdb_test_no_output "set debug-file-directory" \
	"set debug-file-directory for core"
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load $file

    # Print the "PIE (Position Independent Executable) displacement" message.
    gdb_test_no_output "set verbose on"

    set test "core loaded"
    set test_displacement "seen displacement message as $displacement"
    gdb_test_multiple "core-file $corefile" $test {
	-re "Using PIE \\(Position Independent Executable\\) displacement (0x\[0-9a-f\]+) " {
	    # Missing "$gdb_prompt $" is intentional.
	    if {$expect_out(1,string) == "0x0"} {
		set case "ZERO"
	    } else {
		set case "NONZERO"
	    }
	    if {$displacement == $case || $displacement == "PRESENT"} {
		pass $test_displacement
		set displacement "FOUND-$displacement"
	    } else {
		fail $test_displacement
	    }
	    exp_continue
	}
	-re "Core was generated by .*\r\n#0 .*$gdb_prompt $" {
	    # Do not check the binary filename as it may be truncated.
	    pass $test
	}
    }
    if ![regexp {^(NONE|FOUND-.*)$} $displacement] {
	fail $test_displacement
    }

    gdb_test "bt" "#\[0-9\]+ +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#\[0-9\]+ +\[^\r\n\]*\\mmain\\M.*" "core main bt"

    set pf_prefix $old_ldprefix
}

proc test_attach_gdb {file pid displacement prefix} {
    global gdb_prompt expect_out

    global pf_prefix
    set old_ldprefix $pf_prefix
    lappend pf_prefix "$prefix:"

    gdb_exit
    gdb_start

    # Print the "PIE (Position Independent Executable) displacement" message.
    gdb_test_no_output "set verbose on"

    if {$file != ""} {
	gdb_test "file $file" "Reading symbols from .*done\\." "file"
    }

    set test "attach"
    gdb_test_multiple "attach $pid" $test {
	-re "Attaching to (program: .*, )?process $pid\r\n" {
	    # Missing "$gdb_prompt $" is intentional.
	    pass $test
	}
    }

    set test "attach final prompt"
    set test_displacement "seen displacement message as $displacement"
    gdb_test_multiple "" $test {
	-re "Using PIE \\(Position Independent Executable\\) displacement (0x\[0-9a-f\]+) " {
	    # Missing "$gdb_prompt $" is intentional.
	    if {$expect_out(1,string) == "0x0"} {
		set case "ZERO"
	    } else {
		set case "NONZERO"
	    }
	    if {$displacement == $case || $displacement == "PRESENT"} {
		pass $test_displacement
		set displacement "FOUND-$displacement"
	    } else {
		fail $test_displacement
	    }
	    exp_continue
	}
	-re "$gdb_prompt $" {
	    pass $test
	}
    }
    if ![regexp {^(NONE|FOUND-.*)$} $displacement] {
	fail $test_displacement
    }

    gdb_test "bt" "#\[0-9\]+ +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#\[0-9\]+ +\[^\r\n\]*\\mmain\\M.*" "attach main bt"
    gdb_exit

    set pf_prefix $old_ldprefix
}

proc test_attach {file displacement {relink_args ""}} {
    global board_info

    gdb_exit

    set test "sleep function started"

    set command "${file} sleep"
    set res [remote_spawn host $command];
    if { $res < 0 || $res == "" } {
	perror "Spawning $command failed."
	fail $test
	return
    }
    set pid [exp_pid -i $res]
    gdb_expect {
	-re "sleeping\r\n" {
	    pass $test
	}
	eof {
	    fail "$test (eof)"
	    return
	}
	timeout {
	    fail "$test (timeout)"
	    return
	}
    }

    if {$relink_args == ""} {
	test_attach_gdb "" $pid $displacement "attach"
    } else {
	# These could be rather passed as arguments.
	global exec interp_saved interp

	foreach relink {YES NO} {
	    # Formerly this test was testing only prelinking of $EXEC.  As the
	    # prelink command automatically prelinks all of $EXEC's libraries,
	    # even $INTERP got prelinked.  Therefore, we formerly had to
	    # `[file_copy $interp_saved $interp]' to make $INTERP not affected
	    # by this prelinking of $EXEC.
	    #
	    # But now we need to test even prelinking of $INTERP.  We could
	    # create a separate test to test just the $INTERP prelinking.  For
	    # test simplicity, we merged this test and the test above by not
	    # restoring $INTERP after $EXEC prelink.  $INTERP gets restored
	    # later below.

	    if [prelink$relink $relink_args [file tail $exec]] {
		# /proc/PID/exe cannot be loaded as it is "EXECNAME (deleted)".
		test_attach_gdb $exec $pid $displacement "attach-relink$relink"
	    }
	}
	file_copy $interp_saved $interp
    }

    remote_exec host "kill -9 $pid"
}

proc test_ld {file ifmain trynosym displacement} {
    global srcdir subdir gdb_prompt expect_out

    # First test normal `file'-command loaded $FILE with symbols.

    gdb_exit
    gdb_start
    # Clear it to never find any separate debug infos in $debug_root.
    gdb_test_no_output "set debug-file-directory"
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load $file

    # Print the "PIE (Position Independent Executable) displacement" message.
    gdb_test_no_output "set verbose on"

    # We want to test the re-run of a PIE in the case where the executable
    # is loaded with a different displacement, but disable-randomization
    # prevents that from happening.  So turn it off.
    gdb_test "set disable-randomization off"

    if $ifmain {
	gdb_test_no_output "set args segv"
    } else {
	global objdir binfile_test

	# ld.so needs some executable to run to reach _dl_debug_state.
	gdb_test_no_output "set args ${objdir}/${subdir}/$binfile_test"
    }

    reach "_dl_debug_state" "run" $displacement

    gdb_test "bt" "#0 +\[^\r\n\]*\\m_dl_debug_state\\M.*" "dl bt"

    if $ifmain {
	reach "main" continue "NONE"

	reach "libfunc" continue "NONE"

	gdb_test "bt" "#0 +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#1 +\[^\r\n\]*\\mmain\\M.*" "main bt"
    }

    # Try re-run if the new PIE displacement takes effect.
    gdb_test "kill" "" "kill" {Kill the program being debugged\? \(y or n\) } "y"
    reach "_dl_debug_state" "run" $displacement

    if $ifmain {
	test_core $file $displacement

	test_attach $file $displacement
    }

    if !$trynosym {
	return
    }

    global pf_prefix
    set old_ldprefix $pf_prefix
    lappend pf_prefix "symbol-less:"

    # Test also `exec-file'-command loaded $FILE - therefore without symbols.
    # SYMBOL_OBJFILE is not available and only EXEC_BFD must be used.

    gdb_exit
    gdb_start
    # Clear it to never find any separate debug infos in $debug_root.
    gdb_test_no_output "set debug-file-directory"
    gdb_reinitialize_dir $srcdir/$subdir

    # Print the "PIE (Position Independent Executable) displacement" message.
    gdb_test_no_output "set verbose on"

    # Test no (error) message has been printed by `exec-file'.
    set escapedfile [string_to_regexp $file]
    gdb_test "exec-file $file" "exec-file $escapedfile" "load"

    if $ifmain {
	reach "_dl_debug_state" run $displacement

	# Use two separate gdb_test_multiple statements to avoid timeouts due
	# to slow processing of wildcard capturing long output
	set test "info files"
	set entrynohex ""
	gdb_test_multiple $test $test {
	    -re "\r\n\[\t \]*Entry point:\[\t \]*0x(\[0-9a-f\]+)\r\n" {
		set entrynohex $expect_out(1,string)
		gdb_test_multiple "" $test {
		    -re "\r\n$gdb_prompt $" {
			pass $test
		    }
		}
	    }
	}

	# `info sym' cannot be tested for .opd as the binary may not have
	# symbols.
	if {[istarget powerpc64-*] && [is_lp64_target]} {
	    set test "convert entry point"
	    gdb_test_multiple "p *(void(*)(void) *) 0x$entrynohex" $test {
		-re " =( \\(\[^0-9\]*\\))? 0x(\[0-9a-f\]+)( < \[^\r\n\]*)?\r\n$gdb_prompt $" {
		    set entrynohex $expect_out(2,string)
		    pass $test
		}
	    }
	}
	if {$entrynohex != ""} {
	    gdb_test "break *0x$entrynohex" "" "break at entry point"
	    gdb_test "continue" "\r\nBreakpoint \[0-9\]+, 0x0*$entrynohex in .*" "entry point reached"
	}
    } else {
	# There is no symbol to break at ld.so.  Moreover it can exit with an
	# error code.

	set test "ld.so exit"
	set test_displacement "seen displacement message as $displacement"
	gdb_test_multiple "run" $test {
	    -re "Using PIE \\(Position Independent Executable\\) displacement (0x\[0-9a-f\]+) " {
		# Missing "$gdb_prompt $" is intentional.
		if {$expect_out(1,string) == "0x0"} {
		    set case "ZERO"
		} else {
		    set case "NONZERO"
		}
		if {$displacement == $case || $displacement == "PRESENT"} {
		    pass $test_displacement
		    set displacement "FOUND-$displacement"
		} else {
		    fail $test_displacement
		}
		exp_continue
	    }
	    -re "Program exited (normally|with code \[0-9\]+)\\.\r\n$gdb_prompt $" {
		# Do not check the binary filename as it may be truncated.
		pass $test
	    }
	}
	if ![regexp {^(NONE|FOUND-.*)$} $displacement] {
	    fail $test_displacement
	}
    }

    set pf_prefix $old_ldprefix
}

# Create separate binaries for each testcase - to make the possible reported
# problem reproducible after the whole test run finishes.

set old_ldprefix $pf_prefix
foreach ldprelink {NO YES} {
    foreach ldsepdebug {NO IN SEP} {
	# Skip running the ldsepdebug test if we do not have system separate
	# debug info available.
	if {$interp_system_debug == "" && $ldsepdebug == "SEP"} {
	    continue
	}

	set ldname "LDprelink${ldprelink}debug${ldsepdebug}"
	set interp $binprefix-$ldname

	# prelink needs to always prelink all the dependencies to do any file
	# modifications of its files.  ld.so also needs all the dependencies to
	# be prelinked to omit the relocation process.  In-memory file offsets
	# are not dependent whether ld.so went the prelink way or through the
	# relocation process.
	#
	# For GDB we are not interested whether prelink succeeds as it is
	# transparent to GDB.  GDB is being tested for differences of file
	# offsets vs. in-memory offsets.  So we have to prelink even ld.so for
	# the BIN modification to happen but we need to restore the original
	# possibly unprelinked ld.so to test all the combinations for GDB.
	set interp_saved ${interp}-saved

	set pf_prefix $old_ldprefix
	lappend pf_prefix "$ldname:"

	if {$ldsepdebug == "NO"} {
	    file_copy $interp_system $interp
	    # Never call strip-debug before unprelink:
	    # prelink: ...: Section .note.gnu.build-id created after prelinking
	    if ![prelinkNO $interp] {
		continue
	    }
	    strip_debug $interp
	} elseif {$ldsepdebug == "IN" && $interp_system_debug == ""} {
	    file_copy $interp_system $interp
	} elseif {$ldsepdebug == "IN" && $interp_system_debug != ""} {
	    file_copy $interp_system $interp
	    file_copy $interp_system_debug "${interp}.debug"
	    # eu-unstrip: DWARF data in '...' not adjusted for prelinking bias; consider prelink -u
	    if {![prelinkNO $interp] || ![prelinkNO "${interp}.debug"]} {
		continue
	    }
	    set test "eu-unstrip unprelinked:[file tail $interp_system] + [file tail $interp_system_debug] to [file tail $interp]"
	    set command "exec eu-unstrip -o $interp $interp ${interp}.debug"
	    verbose -log "command is $command"
	    if [catch $command] {
		setup_xfail *-*-*
		fail $test
		continue
	    } else {
		pass $test
	    }
	} elseif {$ldsepdebug == "SEP" && $interp_system_debug == ""} {
	    file_copy $interp_system $interp
	    # eu-unstrip: DWARF data in '...' not adjusted for prelinking bias; consider prelink -u
	    if ![prelinkNO $interp] {
		continue
	    }
	    gdb_gnu_strip_debug $interp
	} elseif {$ldsepdebug == "SEP" && $interp_system_debug != ""} {
	    file_copy $interp_system $interp
	    file_copy $interp_system_debug "${interp}.debug"
	}

	if {$ldsepdebug == "SEP"} {
	    if ![prelinkNO "${interp}.debug"] {
		continue
	    }
	} else {
	    file delete "${interp}.debug"
	}

	if ![prelink$ldprelink $interp] {
	    continue
	}
	if {$ldprelink == "NO"} {
	    set displacement "NONZERO"
	} else {
	    # x86* kernel loads prelinked PIE binary at its prelinked address
	    # but ppc* kernel loads it at a random address.  prelink normally
	    # skips PIE binaries during the system scan.
	    set displacement "PRESENT"
	}
	test_ld $interp 0 [expr {$ldsepdebug == "NO"}] $displacement

	if ![file_copy $interp $interp_saved] {
	    continue
	}
	set old_binprefix $pf_prefix
	foreach binprelink {NO YES} {
	    foreach binsepdebug {NO IN SEP} {
		# "ATTACH" is like "YES" but it is modified during run.
		# It cannot be used for problem reproducibility after the
		# testcase ends.
		foreach binpie {NO YES ATTACH} {
		    # This combination is not possible, non-PIE (fixed address)
		    # binary cannot be prelinked to any (other) address.
		    if {$binprelink == "YES" && $binpie == "NO"} {
			continue
		    }

		    set binname "BINprelink${binprelink}debug${binsepdebug}pie${binpie}"
		    set exec $binprefix-$binname

		    set pf_prefix $old_binprefix
		    lappend pf_prefix "$binname:"

		    set opts "ldflags=-Wl,$binfile_lib,-rpath,[file dirname $binfile_lib]"
		    if {$binsepdebug != "NO"} {
			lappend opts {debug}
		    }
		    if {$binpie != "NO"} {
			lappend opts {additional_flags=-fPIE -pie}
		    }

		    set dir ${exec}.d
		    set relink_args [build_executable_own_libs ${test}.exp [file tail $exec] $srcfile $opts $interp $dir]
		    if {$relink_args == ""} {
			continue;
		    }

		    if {$binsepdebug == "SEP"} {
			gdb_gnu_strip_debug $exec
		    }

		    if {$binpie == "NO"} {
			set displacement "NONE"
		    } elseif {$binprelink == "NO"} {
			set displacement "NONZERO"
		    } else {
			# x86* kernel loads prelinked PIE binary at its
			# prelinked address but ppc* kernel loads it at
			# a random address.  prelink normally skips PIE
			# binaries during the system scan.
			set displacement "PRESENT"
		    }

		    if {[prelink$binprelink $relink_args [file tail $exec]]
		        && [file_copy $interp_saved $interp]} {
			if {$binpie != "ATTACH"} {
			    test_ld $exec 1 [expr {$binsepdebug == "NO"}] $displacement
			} else {
			    # If the file has been randomly prelinked it must
			    # be "NONZERO".  We could see "ZERO" only if it was
			    # unprelinked and it is now running at the same
			    # address - which is 0 but executable can never run
			    # at address 0.

			    set displacement "NONZERO"
			    test_attach $exec $displacement $relink_args

			    # ATTACH means that executables and libraries have
			    # been modified after they have been run.  They
			    # cannot be reused for problem reproducibility after
			    # the testcase ends in the ATTACH case.  Therefore
			    # they are rather deleted not to confuse after the
			    # run finishes.
			    set exec_debug [system_debug_get $exec]
			    if {$exec_debug != ""} {
				# `file delete [glob "${exec_debug}*"]' does not work.
				foreach f [glob "${exec_debug}*"] {
				    file delete $f
				}
			    }
			    file delete -force $dir
			    # `file delete [glob "${exec}*"]' does not work.
			    foreach f [glob "${exec}*"] {
				file delete $f
			    }
			}
		    }
		}
	    }
	}

	file delete $interp_saved
    }
}
set pf_prefix $old_ldprefix
