# Copyright 2010-2023 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.
require !use_gdb_stub isnative allow_shlib_tests
require {!is_remote host}
require {istarget *-linux*}

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"

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

    clean_restart
    # Clear it to never find any separate debug infos in $debug_root.
    gdb_test_no_output "set debug-file-directory"
    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" ".*" "p /x \$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.

	clean_restart
	# Clear it to never find any separate debug infos in $debug_root.
	gdb_test_no_output "set debug-file-directory"

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