| # Copyright 2018-2020 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/>. |
| |
| # This file is part of the gdb testsuite |
| |
| # This tests that C++ alignof works in gdb, and that it agrees with |
| # the compiler. |
| |
| if {[skip_cplus_tests]} { continue } |
| |
| # 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} |
| empty |
| bigenum |
| vstruct |
| bfstruct |
| arrstruct |
| derived |
| derived2 |
| } |
| |
| if {[has_int128_cxx]} { |
| # 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.cc] |
| set outfile [open $filename w] |
| |
| # Prologue. |
| puts $outfile { |
| template<typename T, typename U> |
| struct align_pair |
| { |
| T one; |
| U two; |
| }; |
| |
| template<typename T, typename U> |
| struct align_union |
| { |
| T one; |
| U two; |
| }; |
| |
| enum bigenum { VALUE = 0xffffffffull }; |
| |
| struct empty { }; |
| |
| struct vstruct { virtual ~vstruct() {} char c; }; |
| |
| struct bfstruct { unsigned b : 3; }; |
| |
| struct arrstruct { short fld[7]; }; |
| |
| unsigned a_int3 = alignof (int[3]); |
| |
| unsigned a_void = alignof (void); |
| |
| struct base { char c; }; |
| struct derived : public virtual base { int i; }; |
| |
| struct b2 : public virtual base { char d; }; |
| struct derived2 : public b2, derived { char e; }; |
| } |
| |
| # First emit single items. |
| foreach type $typelist { |
| set utype [join [split $type] _] |
| puts $outfile "$type item_$utype;" |
| puts $outfile "unsigned a_$utype\n = alignof ($type);" |
| puts $outfile "typedef $type t_$utype;" |
| puts $outfile "t_$utype item_t_$utype;" |
| } |
| |
| # Now emit all pairs. |
| foreach type $typelist { |
| set utype [join [split $type] _] |
| foreach inner $typelist { |
| set uinner [join [split $inner] _] |
| puts $outfile "align_pair<$type, $inner> item_${utype}_x_${uinner};" |
| puts $outfile "unsigned a_${utype}_x_${uinner}" |
| puts $outfile " = alignof (align_pair<$type, $inner>);" |
| |
| puts $outfile "align_union<$type, $inner> item_${utype}_u_${uinner};" |
| puts $outfile "unsigned a_${utype}_u_${uinner}" |
| puts $outfile " = alignof (align_union<$type, $inner>);" |
| } |
| } |
| |
| # Epilogue. |
| puts $outfile { |
| int main() { |
| return 0; |
| } |
| } |
| |
| close $outfile |
| |
| standard_testfile $filename |
| |
| if {[prepare_for_testing "failed to prepare" $testfile $srcfile \ |
| {debug nowarnings c++ additional_flags=-std=c++11}]} { |
| return -1 |
| } |
| |
| if {![runto_main]} { |
| perror "test suppressed" |
| return |
| } |
| |
| proc maybe_xfail {type} { |
| # See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69560 |
| # The g++ implementation of alignof is changing to match C11. |
| if {[is_x86_like_target] |
| && [test_compiler_info {gcc-[0-8]-*}] |
| && ($type == "double" || $type == "long long" |
| || $type == "unsigned long long")} { |
| setup_xfail *-*-* |
| } |
| } |
| |
| foreach type $typelist { |
| set utype [join [split $type] _] |
| set expected [get_integer_valueof a_$utype 0] |
| |
| maybe_xfail $type |
| gdb_test "print alignof($type)" " = $expected" |
| |
| maybe_xfail $type |
| gdb_test "print alignof(t_$utype)" " = $expected" |
| |
| maybe_xfail $type |
| gdb_test "print alignof(typeof(item_$utype))" " = $expected" |
| |
| foreach inner $typelist { |
| set uinner [join [split $inner] _] |
| set expected [get_integer_valueof a_${utype}_x_${uinner} 0] |
| gdb_test "print alignof(align_pair<${type},${inner}>)" " = $expected" |
| |
| set expected [get_integer_valueof a_${utype}_u_${uinner} 0] |
| gdb_test "print alignof(align_union<${type},${inner}>)" " = $expected" |
| } |
| } |
| |
| set expected [get_integer_valueof a_int3 0] |
| gdb_test "print alignof(int\[3\])" " = $expected" |
| set expected [get_integer_valueof a_void 0] |
| gdb_test "print alignof(void)" " = $expected" |