# Copyright 2009-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/>.
#
# Contributed by Markus Deuling <deuling@de.ibm.com>.
#
# Testsuite for Cell Broadband Engine combined debugger
# This testcases tests mixed-architecture core file support

load_lib cell.exp

set testfile "coremaker"
set ppu_file "coremaker"
set ppu_src ${srcdir}/${subdir}/${ppu_file}.c
set ppu_bin ${objdir}/${subdir}/${ppu_file}
set spu_file "coremaker-spu"
set spu_src ${srcdir}/${subdir}/${spu_file}.c
set spu_bin ${objdir}/${subdir}/${spu_file}

if {![isnative]} then {
    return 0
}

if {[skip_cell_tests]} {
    return 0
}

# Compile SPU binary.
if { [gdb_compile_cell_spu $spu_src $spu_bin executable {debug}]  != "" } {
  unsupported "Compiling spu binary failed."
  return -1
}
# Compile PPU binary.
if { [gdb_cell_embedspu $spu_bin $spu_bin-embed.o {debug}]  != "" } {
  unsupported "Embedding spu binary failed."
  return -1
}
if { [gdb_compile_cell_ppu [list $ppu_src $spu_bin-embed.o] $ppu_bin executable {debug}] != "" } {
  unsupported "Compiling ppu binary failed."
  return -1
}

if [get_compiler_info] {
  return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${ppu_bin}

if ![runto_main] then {
  fail "Can't run to main"
  return 0
}

delete_breakpoints

gdb_test "continue" ".*Aborted.*"

if {![gdb_gcore_cmd "${objdir}/${subdir}/gcore.test" \
	  "save a corefile"]} {
    return -1
}

# Now restart gdb and load the corefile.
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${ppu_bin}

send_gdb "core-file $objdir/$subdir/gcore.test\n"
gdb_expect {
    -re "Core was generated by .*coremaker.*\r\n\#0  .*\(\).*\r\n$gdb_prompt $" {
	pass "core-file command"
    }
    -re "Core was generated by .*\r\n\#0  .*\(\).*\r\n$gdb_prompt $" {
	pass "core-file command (with bad program name)"
    }
    -re ".*$gdb_prompt $"	{ fail "core-file command" }
    timeout			{ fail "(timeout) core-file command" }
}

gdb_test "t 6" "Switching to thread 6.*"
gdb_test "backtrace" ".*abort.*main.*at.*$ppu_file.c.*"

for {set thread_id 1} {$thread_id < 6} {incr thread_id} {
  gdb_test "t $thread_id" \
           "Switching to thread $thread_id.*" \
           "switch to thread $thread_id"
  gdb_test "backtrace" \
	   ".*terminal_func.*factorial_func.*value=1.*factorial_func.*value=2.*factorial_func.*value=3.*factorial_func.*value=4.*factorial_func.*value=5.*factorial_func.*value=6.*main.*speid.*argp.*envp.*at.*$spu_file.c.*<cross-architecture call>.*spe_context_run.*spe_thread.*at.*$ppu_file.c.*" \
	   "backtrace in thread $thread_id"
}

gdb_exit

return 0
