# Copyright 2010-2013 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] || [target_info exists use_gdb_stub]
     || ![istarget *-linux*] || [skip_shlib_tests]} {
    continue
}

load_lib prelink-support.exp

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

if [get_compiler_info] {
    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 [standard_output_file $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
    }
}

# The marker function for the standard runtime linker interface is
# _dl_debug_state.  The probes-based interface has no specific marker
# function; the probe we will stop on (init_start) is in dl_main so we
# check for that.

set solib_bp {(_dl_debug_state|dl_main)}

# Implementation of reach.

proc reach_1 {func command displacement} {
    global gdb_prompt expect_out solib_bp

    if {$func == $solib_bp} {
	# 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\]+, \\.?(__GI_)?$func \\(.*\\) at .*:\[0-9\]+\r\n.*$gdb_prompt $" {
	    if {$func == $solib_bp} {
		fail $test
	    } else {
		pass $test
	    }
	}
	-re "Breakpoint \[0-9\]+, \[0-9xa-f\]+ in \\.?(__GI_)?$func \\(\\).*\r\n$gdb_prompt $" {
	    if {$func == $solib_bp} {
		fail $test
	    } else {
		pass $test
	    }
	}
	-re "Stopped due to (spurious )?shared library event.*\r\n$gdb_prompt $" {
	    if {$func == $solib_bp} {
		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 == $solib_bp} {
	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} {
    with_test_prefix "reach-$func" {
	reach_1 $func $command $displacement
    }
}

proc test_core {file displacement} {
    with_test_prefix "core" {
	global srcdir subdir gdb_prompt expect_out

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

	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"
    }
}

proc test_attach_gdb {file pid displacement prefix} {
    with_test_prefix "$prefix" {
	global gdb_prompt expect_out

	gdb_exit
	gdb_start

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

	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
    }
}

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

    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 $exec $pid $displacement "attach"
    } else {
	# These could be rather passed as arguments.
	global 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.
	    #
	    # `(wrong library or version mismatch?)' messages are printed for
	    # $binfile_lib on platforms converting REL->RELA relocations by
	    # prelink (such as on i386).  There is no reliable way to verify
	    # the library file matches the running library in such case but
	    # GDB at least attempts to set the right displacement.  We test
	    # `libfunc' is present in the backtrace and therefore the
	    # displacement has been guessed right.

	    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 inferior_exited_re solib_bp

    # 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 binfile_test

	# ld.so needs some executable to run to reach _dl_debug_state.
	gdb_test_no_output "set args [standard_output_file $binfile_test]" \
	    "set args OBJDIR/${subdir}/$binfile_test"
    }

    reach $solib_bp "run" $displacement

    gdb_test "bt" "#0 +\[^\r\n\]*\\m(__GI_)?$solib_bp\\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 $solib_bp "run" $displacement

    if $ifmain {
	test_core $file $displacement

	test_attach $file $displacement
    }

    if !$trynosym {
	return
    }

    with_test_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 $solib_bp 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 "$inferior_exited_re (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
	    }
	}
    }
}

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

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

	with_test_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
	    }

	    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

			with_test_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
	}
    }
}
