# Copyright 2009, 2011-2012 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.*"

set escapedfilename [string_to_regexp ${objdir}/${subdir}/gcore.test]

gdb_test_multiple "gcore ${objdir}/${subdir}/gcore.test" \
        "save a corefile" \
{
  -re "Saved corefile ${escapedfilename}\[\r\n\]+$gdb_prompt $" {
    pass "save a corefile"
  }
  -re "Can't create a corefile\[\r\n\]+$gdb_prompt $" {
    unsupported "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
