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

# This test only works on GNU/Linux.
if { ![isnative] || [is_remote host] || [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]
clean_restart $interp_system
set dl_main_found 0
gdb_test_multiple "info addr dl_main" "" {
    -re -wrap "Symbol \"dl_main\" is a function at address $hex\\." {
	set dl_main_found 1
    }
    -re -wrap "Symbol \"dl_main\" is at $hex in a file compiled without debugging\\." {
	set dl_main_found 1
    }
    -re -wrap "No symbol \"dl_main\" in current context\\." {
    }
}

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.
#
# The optional ITERATION parameter is used in order to make unique
# test prefixes, when calling this proc with the same FUNC name
# provide a unique ITERATION value for each call.
proc reach {func command displacement {iteration 1}} {
    set prefix "reach-$func"
    if { $iteration > 1 } {
	set prefix "$prefix-$iteration"
    }
    with_test_prefix $prefix {
	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_no_output "set verbose off"

	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 .*" "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_no_output "set verbose off"

	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 test_spawn_id [remote_spawn host $command]
    if { $test_spawn_id < 0 || $test_spawn_id == "" } {
	perror "Spawning $command failed."
	fail $test
	return
    }
    set pid [spawn_id_get_pid $test_spawn_id]
    gdb_expect {
	-re "sleeping\r\n" {
	    pass $test
	}
	eof {
	    fail "$test (eof)"
	    wait -i $test_spawn_id
	    return
	}
	timeout {
	    fail "$test (timeout)"
	    kill_wait_spawned_process $test_spawn_id
	    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
    }

    kill_wait_spawned_process $test_spawn_id
}

proc test_ld {file ifmain trynosym displacement} {
    global srcdir subdir gdb_prompt expect_out inferior_exited_re solib_bp
    global hex dl_main_found

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

    with_test_prefix "first backtrace" {
	gdb_test_no_output "set verbose off"
	gdb_test_multiple "bt" "dl bt" {
	    -re -wrap "#0 +\[^\r\n\]*\\m(__GI_)?$solib_bp\\M.*" {
		pass $gdb_test_name
	    }
	    -re -wrap "#0  ($hex) .*" {
		if { $dl_main_found } {
		    fail $gdb_test_name
		} else {
		    set pc $expect_out(1,string)
		    regsub "0x0*" $pc "" pc
		    gdb_test "p /x 0x$pc" ".*"
		    gdb_test_multiple "info probes stap rtld" $gdb_test_name {
			-re -wrap "(?:init_start|init_complete) +0x0*$pc .*" {
			    pass $gdb_test_name
			}
			-re -wrap "" {
			    fail $gdb_test_name
			}
		    }
		}
	    }
	}
	gdb_test_no_output "set verbose on"
    }

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

	reach "libfunc" continue "NONE"

	with_test_prefix "second backtrace" {
	    gdb_test_no_output "set verbose off"
	    gdb_test "bt" "#0 +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#1 +\[^\r\n\]*\\mmain\\M.*" "main bt"
	    gdb_test_no_output "set verbose on"
	}
    }

    # 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 2
    gdb_test_no_output "set verbose off"

    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 3

	    # 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 ""
	    set info_line [join [list \
				     "\r\n" "\[\t\]" "0x\[0-9af\]+" " - " \
				     "0x\[0-9af\]+" " @ " "0x\[0-9af\]+"  \
				     " is " "\[^\r\n\]+"] ""]
	    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
			}
			-re $info_line {
			    # Avoid timeout with check-read1
			    exp_continue
			}
		    }
		}
	    }

	    # `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
	    }
	}
	gdb_test_no_output "set verbose off"
    }
}

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

foreach_with_prefix ldprelink {NO YES} {
    foreach_with_prefix 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

	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 "[file tail $interp], second time"] {
	    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_with_prefix binprelink {NO YES} {
	    foreach_with_prefix 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_with_prefix 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 opts "ldflags=-Wl,$binfile_lib,-rpath,[file dirname $binfile_lib]"
		    if {$binsepdebug != "NO"} {
			lappend opts {debug}
		    }
		    if {$binpie != "NO"} {
			lappend opts {pie}
		    } else {
			# Debian9/Ubuntu16.10 onwards default to PIE enabled. Ensure it is disabled.
			lappend opts {nopie}
		    }

		    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]} {
			# In order to make test names unique wrap the core of this if block
			# with a test prefix.  Some of the tests performed in the if
			# condition are repeated within this body.
			with_test_prefix "INNER" {
			    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
    }
}
