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