1# This testcase is part of GDB, the GNU debugger. 2 3# Copyright 2000, 2002, 2003, 2004 Free Software Foundation, Inc. 4 5# This program is free software; you can redistribute it and/or modify 6# it under the terms of the GNU General Public License as published by 7# the Free Software Foundation; either version 2 of the License, or 8# (at your option) any later version. 9# 10# This program is distributed in the hope that it will be useful, 11# but WITHOUT ANY WARRANTY; without even the implied warranty of 12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13# GNU General Public License for more details. 14# 15# You should have received a copy of the GNU General Public License 16# along with this program; if not, write to the Free Software 17# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 19if [target_info exists gdb,noinferiorio] { 20 verbose "Skipping fileio.exp because of no fileio capabilities." 21 continue 22} 23 24if $tracelevel { 25 strace $tracelevel 26} 27 28# 29# test running programs 30# 31set prms_id 0 32set bug_id 0 33 34set testfile "sizeof" 35set srcfile ${testfile}.c 36set binfile ${objdir}/${subdir}/${testfile} 37if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { 38 gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." 39} 40 41if [get_compiler_info ${binfile}] { 42 return -1; 43} 44 45gdb_exit 46gdb_start 47gdb_reinitialize_dir $srcdir/$subdir 48gdb_load ${binfile} 49 50# 51# set it up at a breakpoint so we can play with the variable values 52# 53 54if ![runto_main] then { 55 perror "couldn't run to breakpoint" 56 continue 57} 58 59# 60# Query GDB for the size of various types 61# 62 63proc get_valueof { fmt exp default } { 64 global gdb_prompt 65 66 set test "get valueof \"${exp}\"" 67 set val ${default} 68 gdb_test_multiple "print${fmt} ${exp}" "$test" { 69 -re "\\$\[0-9\]* = (\[-\]*\[0-9\]*).*$gdb_prompt $" { 70 set val $expect_out(1,string) 71 pass "$test ($val)" 72 } 73 } 74 return ${val} 75} 76 77proc get_sizeof { type default } { 78 return [get_valueof "/d" "sizeof (${type})" $default] 79} 80 81gdb_test "next" 82 83set sizeof_char [get_sizeof "char" 1] 84set sizeof_short [get_sizeof "short" 2] 85set sizeof_int [get_sizeof "int" 4] 86set sizeof_long [get_sizeof "long" 4] 87set sizeof_long_long [get_sizeof "long long" 8] 88 89set sizeof_data_ptr [get_sizeof "void *" 4] 90set sizeof_func_ptr [get_sizeof "void (*)(void)" 4] 91 92set sizeof_float [get_sizeof "float" 4] 93set sizeof_double [get_sizeof "double" 8] 94set sizeof_long_double [get_sizeof "long double" 8] 95 96# 97# Compare GDB's idea of types with the running program 98# 99 100proc check_sizeof { type size } { 101 global gdb_prompt 102 103 set pat [string_to_regexp "sizeof (${type}) == ${size}"] 104 gdb_test "next" "${pat}\[\r\n\]+\[0-9\].*" "check sizeof \"$type\"" 105} 106 107check_sizeof "char" ${sizeof_char} 108check_sizeof "short" ${sizeof_short} 109check_sizeof "int" ${sizeof_int} 110check_sizeof "long" ${sizeof_long} 111check_sizeof "long long" ${sizeof_long_long} 112 113check_sizeof "void *" ${sizeof_data_ptr} 114check_sizeof "void (*)(void)" ${sizeof_func_ptr} 115 116check_sizeof "float" ${sizeof_float} 117check_sizeof "double" ${sizeof_double} 118check_sizeof "long double" ${sizeof_long_double} 119 120proc check_valueof { exp val } { 121 global gdb_prompt 122 123 set pat [string_to_regexp "valueof (${exp}) == ${val}"] 124 gdb_test "next" "${pat}\[\r\n\]+\[0-9\].*" "check valueof \"$exp\"" 125} 126 127# Check that GDB and the target agree over the sign of a character. 128 129set signof_byte [get_valueof "/d" "'\\377'" -1] 130set signof_char [get_valueof "/d" "(int) (char) -1" -1] 131set signof_signed_char [get_valueof "/d" "(int) (signed char) -1" -1] 132set signof_unsigned_char [get_valueof "/d" "(int) (unsigned char) -1" -1] 133 134check_valueof "'\\\\377'" ${signof_byte} 135check_valueof "(int) (char) -1" ${signof_char} 136check_valueof "(int) (signed char) -1" ${signof_signed_char} 137check_valueof "(int) (unsigned char) -1" ${signof_unsigned_char} 138 139proc check_padding { fmt type val } { 140 global gdb_prompt 141 gdb_test "set padding_${type}.v = ${val}" 142 gdb_test "print padding_${type}.p1" "= \"The quick brown \"" 143 gdb_test "print${fmt} padding_${type}.v" "= ${val}" 144 gdb_test "print padding_${type}.p2" "\"The quick brown \".*" 145} 146 147# Check that GDB is managing to store a value in a struct field 148# without corrupting the fields immediately adjacent to it. 149 150check_padding "/d" "char" 1 151check_padding "/d" "short" 2 152check_padding "/d" "int" 4 153check_padding "/d" "long" 4 154check_padding "/d" "long_long" 8 155 156# use multiples of two which can be represented exactly 157check_padding "/f" "float" 1 158check_padding "/f" "double" 2 159check_padding "/f" "long_double" 4 160 161# 162# For reference, dump out the entire architecture 163# 164# The output is very long so use a while loop to consume it 165send_gdb "maint print arch\n" 166set ok 1 167while { $ok } { 168 gdb_expect { 169 -re ".*dump" { 170 #pass "maint print arch $ok" 171 #set ok [expr $ok + 1] 172 } 173 -re "$gdb_prompt $" { 174 pass "maint print arch" 175 set ok 0 176 } 177 timeout { 178 fail "maint print arch (timeout)" 179 set ok 0 180 } 181 } 182} 183