old-cross-binutils/gdb/testsuite/lib/cell.exp
Ulrich Weigand 4e83a1e776 Report UNRESOLVED on failures while detecting Cell/B.E.
The gdb.cell testcases use the predicate skip_cell_tests defined in
lib/cell.exp to determine whether Cell/B.E. test cases ought to be
run. This tests verifies that we have a toolchain that supports
generating combined Cell/B.E. binaries, and that the target machine
actually is a Cell/B.E.

In order to do so, a small test program is built and run (under the
debugger).  Any failure is taken as a sign that we don't have a
Cell/B.E. machine and the tests are to be skipped.

This has the unfortunate effect that a serious bug in GDB that causes
internal compiler errors even on the trivial test program does not
lead to any failures in the testsuite, since now all gdb.cell test
are simply skipped.

This patch changes skip_cell_tests to at least report UNRESOLVED
in cases where execution of the test program fails in unexpected
ways.

testsuite/ChangeLog:

	* lib/cell.exp (skip_cell_tests): Report UNRESOLVED on unexpected
	failures to run the test program under GDB.
2015-08-27 19:06:03 +02:00

181 lines
5.9 KiB
Text

# Copyright 2009-2015 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/>.
#
# Contributed by Markus Deuling <deuling@de.ibm.com>.
#
# Support library for testing the combined debugger for Linux
# on the Cell Broadband Engine.
# Compile SPU objects.
proc gdb_compile_cell_spu {source dest type options} {
global board
# Save and unset multilib flags; these are not appropriate
# for the SPU compiler.
set board [target_info name]
set save_multilib_flag [board_info $board multilib_flags]
unset_board_info "multilib_flags"
set options_spu [concat $options [list compiler=spu-gcc]]
set ccout [gdb_compile $source $dest $type $options_spu]
set_board_info multilib_flags $save_multilib_flag
return $ccout
}
# Compile PPU objects. This is just like gdb_compile_pthreads, except that we
# always add the libspe2 library for compiling Cell/B.E. programs.
proc gdb_compile_cell_ppu {source dest type options} {
# We do not need to try multiple names for the pthread library
# -lpthread works on all Cell/B.E. systems
set lib "-lspe2 -lpthread"
set options_ppu [concat $options [list libs=$lib]]
return [gdb_compile $source $dest $type $options_ppu]
}
# Embed SPU executable into a PPU object.
proc gdb_cell_embedspu {source dest options} {
global CC_FOR_TARGET
if [info exists CC_FOR_TARGET] {
set compiler $CC_FOR_TARGET
} else {
set compiler [board_info [target_info name] compiler]
}
# We assume the PPU compiler is called gcc or ppu-gcc,
# and find the appropriate embedspu based on that.
regsub gcc "$compiler" embedspu embedspu
# Determine default embedded symbol name from source filename.
set path [split "$source" /]
set filename [lindex $path [expr [llength $path] - 1]]
regsub -all -- "\[-\.\]" "$filename" "_" symbol
set options_embed [concat $options [list compiler=$embedspu]]
return [gdb_compile "$symbol $source $dest" "" none $options_embed]
}
# Run a test on the target to see if it supports Cell/B.E. hardware.
# Return 0 if so, 1 if it does not.
gdb_caching_proc skip_cell_tests {
global srcdir subdir gdb_prompt inferior_exited_re
set me "skip_cell_tests"
# Set up, compile, and execute a combined Cell/B.E. test program.
# Include the current process ID in the file names to prevent conflicts
# with invocations for multiple testsuites.
set src [standard_temp_file cell[pid].c]
set exe [standard_temp_file cell[pid].x]
set src_spu [standard_temp_file cell[pid]-spu.c]
set exe_spu [standard_temp_file cell[pid]-spu.x]
set f [open $src "w"]
puts $f "#include <libspe2.h>"
puts $f "extern spe_program_handle_t cell[pid]_spu_x;"
puts $f "int main (void) {"
puts $f "unsigned int entry = SPE_DEFAULT_ENTRY;"
puts $f "spe_context_ptr_t ctx = spe_context_create (0, NULL);"
puts $f "spe_program_load (ctx, &cell[pid]_spu_x);"
puts $f "return spe_context_run (ctx, &entry, 0, NULL, NULL, NULL); }"
close $f
set f [open $src_spu "w"]
puts $f "int main (void) { return 0; }"
close $f
verbose "$me: compiling testfile $src" 2
set compile_flags {debug nowarnings quiet}
set skip 0
if { [gdb_compile_cell_spu $src_spu $exe_spu executable $compile_flags] != "" } {
verbose "$me: compiling spu binary failed, returning 1" 2
set skip 1
}
if { ! $skip && [gdb_cell_embedspu $exe_spu $exe_spu-embed.o $compile_flags] != "" } {
verbose "$me: embedding spu binary failed, returning 1" 2
set skip 1
}
if { ! $skip && [gdb_compile_cell_ppu [list $src $exe_spu-embed.o] $exe executable $compile_flags] != "" } {
verbose "$me: compiling ppu binary failed, returning 1" 2
set skip 1
}
file delete $src
file delete $src_spu
file delete $exe_spu
file delete $exe_spu-embed.o
if { $skip } {
return 1
}
# Compilation succeeded so now run it via gdb.
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load "$exe"
gdb_run_cmd
gdb_expect {
-re ".*$inferior_exited_re normally.*${gdb_prompt} $" {
verbose -log "\n$me: Cell/B.E. hardware detected"
set result 0
}
-re ".*$inferior_exited_re with code.*${gdb_prompt} $" {
verbose -log "\n$me: Cell/B.E. hardware not detected"
set result 1
}
default {
unresolved "$me: unexpected failure"
set result 1
}
}
gdb_exit
remote_file build delete $exe
verbose "$me: returning $result" 2
return $result
}
# Delete all breakpoints and stop on the next new SPU thread
proc cont_spu_main { } {
delete_breakpoints
gdb_test "set spu stop-on-load on"
gdb_test "continue" \
"Continuing.*Temporary breakpoint .*main .*" \
"continue to SPU main"
}
# Continue to MARKER
proc c_to { marker srcfile } {
set line [gdb_get_line_number $marker $srcfile]
gdb_test "break $line" \
"Breakpoint.*at.*file.*$srcfile.*line $line.*" \
"break $line"
gdb_test "continue" \
"Continuing.*Breakpoint.*at.*$srcfile.*$line.*" \
"continue to $line"
}
# Check if the current thread has SPU architecture
proc check_spu_arch { msg } {
if { $msg == "" } {
set msg "spu architecture is spu256K"
}
gdb_test "show architecture" \
"The target architecture is set automatically.*currently spu:256K.*" \
$msg
}