# Copyright 2009 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 testcase checks if the "show architecture" command works properly.

load_lib cell.exp

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

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 ${ppu_bin}] {
  return -1
}

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

# No programm running, default architecture should be powerpc:common.
gdb_test "show architecture" \
	 "The target architecture is set automatically.*currently powerpc:common.*" \
	 "startup architecture is powerpc:common"

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

# In PPU thread, architecture should be powerpc:common.
gdb_test "show architecture" \
	 "The target architecture is set automatically.*currently powerpc:common.*" \
	 "ppu architecture is powerpc:common"

# Switch to SPU thread.
cont_spu_main
check_spu_arch ""

# Remember thread ID of first thread to hit SPU main.
send_gdb "thread\n"
gdb_expect 10 {
    -re "Current thread is (\[0-9\]*) .*\r\n$gdb_prompt $" {
	pass "Retrieve current thread"
	set thread_id $expect_out(1,string)
    }
    -re "$gdb_prompt $" {
	fail "Retrieve current thread"
	return 0
    }
    timeout {
	fail "Retrieve current thread (timed out)"
	return 0
    }
}

# Stress Test: Switching from PPU- to SPU-Thread and back 'rep' times.
set rep 100
for {set i 0} {$i < $rep} {incr i} {
  # Switch to PPU Thread.
  gdb_test "t 1" \
	   "Switching to thread 1.*" \
	   "switch back to thread 1 (PPU) #$i"
  # In PPU Thread, architecture should again be powerpc:common.
  gdb_test "show architecture" \
	   "The target architecture is set automatically.*currently powerpc:common.*" \
	   "ppu architecture is powerpc:common again #$i"
  # Thread switching to SPU.
  gdb_test "t $thread_id" \
	   "Switching to thread $thread_id.*at.*$spu_file.c.*" \
	   "switch back to thread $thread_id (spu) #$i"
  # Standing in SPU thread again, architecture should be spu:256K again.
  check_spu_arch "spu architecture is spu256K again #$i"
}
# End of Stress Test loop

gdb_exit

return 0
