# Copyright 2018 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 . # This file is part of the gdb testsuite # This tests that C11 _Alignof works in gdb, and that it agrees with # the compiler. # The types we're going to test. set typelist { char {unsigned char} short {unsigned short} int {unsigned int} long {unsigned long} {long long} {unsigned long long} float double {long double} } if {[has_int128_c]} { # Note we don't check "unsigned __int128" yet because at least gcc # canonicalizes the name to "__int128 unsigned", and there isn't a # c-exp.y production for this. # https://sourceware.org/bugzilla/show_bug.cgi?id=20991 lappend typelist __int128 } # Create the test file. set filename [standard_output_file align.c] set outfile [open $filename w] # Prologue. puts -nonewline $outfile "#define DEF(T,U) struct align_pair_ ## T ## _x_ ## U " puts $outfile "{ T one; U two; }" puts $outfile "unsigned a_void = _Alignof(void);" # First emit single items. foreach type $typelist { set utype [join [split $type] _] if {$type != $utype} { puts $outfile "typedef $type $utype;" } puts $outfile "$type item_$utype;" puts $outfile "unsigned a_$utype\n = _Alignof ($type);" set utype [join [split $type] _] } # Now emit all pairs. foreach type $typelist { set utype [join [split $type] _] foreach inner $typelist { set uinner [join [split $inner] _] puts $outfile "DEF ($utype, $uinner);" set joined "${utype}_x_${uinner}" puts $outfile "struct align_pair_$joined item_${joined};" puts $outfile "unsigned a_${joined}" puts $outfile " = _Alignof (struct align_pair_${joined});" } } # Epilogue. puts $outfile { int main() { return 0; } } close $outfile standard_testfile $filename if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug}]} { return -1 } if {![runto_main]} { perror "test suppressed" return } foreach type $typelist { set utype [join [split $type] _] set expected [get_integer_valueof a_$utype 0] gdb_test "print _Alignof($type)" " = $expected" foreach inner $typelist { set uinner [join [split $inner] _] set expected [get_integer_valueof a_${utype}_x_${uinner} 0] gdb_test "print _Alignof(struct align_pair_${utype}_x_${uinner})" \ " = $expected" } } set expected [get_integer_valueof a_void 0] gdb_test "print _Alignof(void)" " = $expected"