# Copyright 2009-2013 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
# Check size of data types both on PPU and SPU.

load_lib cell.exp

set ppu_file "size"
set ppu_src ${srcdir}/${subdir}/${ppu_file}.c
set ppu_bin ${objdir}/${subdir}/${ppu_file}
set spu_file "size-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
}


# Ask GDB about the sizes of data types.  This has
# to be done in PPU thread and SPU thread.
proc get_gdb_size { type } {
  global gdb_prompt

  set val "0"
  gdb_test_multiple "print/d sizeof(${type})" "get sizeof(${type})" {
    -re "\\$\[0-9\]* = (\[-\]*\[0-9\]*).*$gdb_prompt $" {
	set val $expect_out(1,string)
	pass "get sizeof ($type) = $val"
    }
  }
  return ${val}
}

# Compare sizes from GDB and sizeof().
proc size_compare { type gdb_size } {
  set expr [string_to_regexp "sizeof(${type})=${gdb_size}"]
  gdb_test "next" \
           ".*" \
           "next"
  # Checks against string_to_regexp fails in remote testing.
  if ![is_remote target] {
    gdb_test "next" \
             "${expr}.*" \
             "check sizeof \"$type\" \"$gdb_size\" "
  } else {
    gdb_test "next" ".*" "check sizeof deactivate in remote testing"
  }
}

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
}

# Compare sizes.
size_compare "char" [get_gdb_size "char"]
size_compare "short" [get_gdb_size "short"]
size_compare "int" [get_gdb_size "int"]
size_compare "long" [get_gdb_size "long"]
size_compare "long long" [get_gdb_size "long long"]
size_compare "float" [get_gdb_size "float"]
size_compare "double" [get_gdb_size "double"]
size_compare "long double" [get_gdb_size "long double"]

# Continue to SPU thread.
cont_spu_main
check_spu_arch ""

# Compare sizes in SPU thread.
size_compare "char" [get_gdb_size "char"]
size_compare "short" [get_gdb_size "short"]
size_compare "int" [get_gdb_size "int"]
size_compare "long" [get_gdb_size "long"]
size_compare "long long" [get_gdb_size "long long"]
size_compare "float" [get_gdb_size "float"]
size_compare "double" [get_gdb_size "double"]
size_compare "long double" [get_gdb_size "long double"]

gdb_exit
return 0
