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