# Copyright 2000 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

if $tracelevel {
    strace $tracelevel
}

#
# test running programs
#
set prms_id 0
set bug_id 0

set testfile "sizeof"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

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
#

proc get_sizeof { type default } {
    global gdb_prompt
    send_gdb "print/d sizeof (${type})\n"
    gdb_expect {
	-re "\\$\[0-9\]* = (\[0-9\]*).*$gdb_prompt $" {
	    set size $expect_out(1,string)
	    pass "get sizeof ${type} ($size)"
	}
	timeout {
	    set size ${default}
	    fail "get sizeof ${type} (timeout)"
	}
    }
    return ${size}
}

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

    if [gdb_skip_stdio_test "check sizeof $type == $size"] {
	return;
    }

    set pat [string_to_regexp ${type}]
    send_gdb "next\n"
    gdb_expect {
	-re "sizeof \\(${pat}\\) == ${size}\[\r\n\].*$gdb_prompt $" {
	    pass "check sizeof ${type} == ${size}"
	}
	-re ".*$gdb_prompt $" {
	    fail "check sizeof ${type} == ${size}"
	}
	timeout {
	    fail "check sizeof ${type} == ${size} (timeout)"
	}
    }
}

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}


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