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