# 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 testcases tests setting and deleting breakpoints on PPU and SPU.

load_lib cell.exp

set testfile "break"
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}

# Delete breakpoints before starting the application. The debugger
# shouldn't prompt for anything.
gdb_test "delete breakpoints" \
	 "" \
	 "No prompt when deleting non-existing breakpoints"

gdb_test "break main" \
	 "Breakpoint.*at.* file .*$testfile.c, line.*" \
	 "breakpoint main in ppu"

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

delete_breakpoints

# Re-set breakpoint at main in PPU binary.
gdb_test "break main" \
	 "Breakpoint.*at.* file .*$testfile.c, line.*" \
	 "breakpoint function"

# Set breakpoint in SPU binary.
send_gdb "break $spu_file.c:10\n"
gdb_expect {
  -re ".*$spu_file.c.*Make breakpoint pending.*y or \\\[n\\\]. $" {
    gdb_test "y" "Breakpoint.*$spu_file.*pending." "set pending breakpoint"
  }
  timeout { fail "Timeout while setting breakpoint in spu binary" }
}

# Check breakpoints.
gdb_test "info break" \
	 "Num\[ \]+Type\[ \]+Disp\[ \]+Enb\[ \]+Address\[ \]+What.*
\[0-9\]+\[\t \]+breakpoint     keep y.*in main at.*$testfile.c.*
\[0-9\]+\[\t \]+breakpoint     keep y.*PENDING.*$spu_file.c:10.*" \
	 "breakpoint info"

gdb_test "continue" \
	 "Continuing.*Switching to Thread.*Breakpoint.*main.*at.*$spu_file.c.*" \
	 "continuing to spu thread"

gdb_exit

return 0
