# This testcase is part of GDB, the GNU debugger.

# Copyright 2000, 2002-2005, 2007-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/>.

if [target_info exists gdb,noinferiorio] {
    verbose "Skipping fileio.exp because of no fileio capabilities."
    continue
}

#
# test running programs
#

set testfile "sizeof"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested sizeof.exp
     return -1
}

if [get_compiler_info ${binfile}] {
    return -1;
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

#
# set it up at a breakpoint so we can play with the variable values
#

if ![runto_main] then {
    perror "couldn't run to breakpoint"
    continue
}

#
# Query GDB for the size of various types
#

gdb_test "next"

set sizeof_char [get_sizeof "char" 1]
set sizeof_short [get_sizeof "short" 2]
set sizeof_int [get_sizeof "int" 4]
set sizeof_long [get_sizeof "long" 4]
set sizeof_long_long [get_sizeof "long long" 8]

set sizeof_data_ptr [get_sizeof "void *" 4]
set sizeof_func_ptr [get_sizeof "void (*)(void)" 4]

set sizeof_float [get_sizeof "float" 4]
set sizeof_double [get_sizeof "double" 8]
set sizeof_long_double [get_sizeof "long double" 8]

#
# Compare GDB's idea of types with the running program
#

proc check_sizeof { type size } {
    global gdb_prompt

    set pat [string_to_regexp "sizeof (${type}) == ${size}"]
    gdb_test "next" "${pat}\[\r\n\]+\[0-9\].*"  "check sizeof \"$type\""
}

check_sizeof "char" ${sizeof_char}
check_sizeof "short" ${sizeof_short}
check_sizeof "int" ${sizeof_int}
check_sizeof "long" ${sizeof_long}
check_sizeof "long long" ${sizeof_long_long}

check_sizeof "void *" ${sizeof_data_ptr}
check_sizeof "void (*)(void)" ${sizeof_func_ptr}

check_sizeof "float" ${sizeof_float}
check_sizeof "double" ${sizeof_double}
check_sizeof "long double" ${sizeof_long_double}

proc check_valueof { exp val } {
    global gdb_prompt

    set pat [string_to_regexp "valueof (${exp}) == ${val}"]
    gdb_test "next" "${pat}\[\r\n\]+\[0-9\].*" "check valueof \"$exp\""
}

# Check that GDB and the target agree over the sign of a character.

set signof_byte [get_integer_valueof "'\\377'" -1]
set signof_char [get_integer_valueof "(int) (char) -1" -1]
set signof_signed_char [get_integer_valueof "(int) (signed char) -1" -1]
set signof_unsigned_char [get_integer_valueof "(int) (unsigned char) -1" -1]

check_valueof "'\\377'" ${signof_byte}
check_valueof "(int) (char) -1" ${signof_char}
check_valueof "(int) (signed char) -1" ${signof_signed_char}
check_valueof "(int) (unsigned char) -1" ${signof_unsigned_char}

proc check_padding { fmt type val } {
    global gdb_prompt
    gdb_test_no_output "set padding_${type}.v = ${val}"
    gdb_test "print padding_${type}.p1" "= \"The quick brown \""
    gdb_test "print${fmt} padding_${type}.v" "= ${val}"
    gdb_test "print padding_${type}.p2" "\"The quick brown \".*"
}

# Check that GDB is managing to store a value in a struct field
# without corrupting the fields immediately adjacent to it.

check_padding "/d" "char" 1
check_padding "/d" "short" 2
check_padding "/d" "int" 4
check_padding "/d" "long" 4
check_padding "/d" "long_long" 8

# use multiples of two which can be represented exactly
check_padding "/f" "float" 1
check_padding "/f" "double" 2
check_padding "/f" "long_double" 4

#
# For reference, dump out the entire architecture
#
# The output is very long so use a while loop to consume it
send_gdb "maint print arch\n"
set ok 1
while { $ok } {
    gdb_expect {
	-re ".*dump" {
	    #pass "maint print arch $ok"
	    #set ok [expr $ok + 1]
	}
	-re "$gdb_prompt $" {
	    pass "maint print arch"
	    set ok 0
	}
	timeout {
	    fail "maint print arch (timeout)"
	    set ok 0
	}
    }
}
