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