# Copyright 2019-2023 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 . standard_testfile .cc if {[test_compiler_info gcc*] && ![supports_statement_frontiers] } { return -1 } # Compile the test source with USE_NEXT_INLINE_H defined (when # use_header is true), or not defined. proc do_test { use_header } { global srcfile testfile if { $use_header } { # This test will not pass due to poor debug information # generated by GCC (at least upto 10.x). See # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94474 return } set options {c++ debug nowarnings optimize=-O2} if { [supports_statement_frontiers] } { lappend options additional_flags=-gstatement-frontiers } if { $use_header } { lappend options additional_flags=-DUSE_NEXT_INLINE_H set executable "$testfile-with-header" set hdrfile "step-and-next-inline.h" set prefix "use_header" } else { set executable "$testfile-no-header" set hdrfile "$srcfile" set prefix "no_header" } if { [prepare_for_testing "failed to prepare" $executable \ $srcfile $options] } { return -1 } with_test_prefix $prefix { set main_location [gdb_get_line_number "Beginning of main" $srcfile] if ![runto $main_location qualified] { return } gdb_test "bt" "\\s*\\#0\\s+main.*" "in main" set line1 {\t\{} set line2 {\t if \(t != NULL} gdb_test_multiple "step" "step into get_alias_set" { -re -wrap $line1 { gdb_test "next" $line2 $gdb_test_name } -re -wrap $line2 { pass $gdb_test_name } } gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \ "not in inline 1" # It's possible that this first failure (when not using a header # file) is GCC's fault, though the remaining failures would best # be fixed by adding location views support (though it could be # that some easier heuristic could be figured out). Still, it is # not certain that the first failure wouldn't also be fixed by # having location view support, so for now it is tagged as such. set have_kfail [expr [test_compiler_info gcc*] && !$use_header] set ok 1 gdb_test_multiple "next" "next step 1" { -re -wrap "if \\(t->x != i\\)" { set ok 0 send_gdb "next\n" exp_continue } -re -wrap ".*TREE_TYPE.* != 1" { if { $ok } { pass $gdb_test_name } else { if { $have_kfail } { setup_kfail "*-*-*" symtab/25507 } fail $gdb_test_name } } } gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \ "not in inline 2" set ok 1 gdb_test_multiple "next" "next step 2" { -re -wrap "return x;" { set ok 0 send_gdb "next\n" exp_continue } -re -wrap ".*TREE_TYPE.* != 2" { if { $ok } { pass $gdb_test_name } else { if { $have_kfail } { setup_kfail "*-*-*" symtab/25507 } fail $gdb_test_name } } } gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \ "not in inline 3" set ok 1 gdb_test_multiple "next" "next step 3" { -re -wrap "return x;" { set ok 0 send_gdb "next\n" exp_continue } -re -wrap ".*TREE_TYPE.* != 3\\)" { if { $ok } { pass $gdb_test_name } else { if { $have_kfail } { setup_kfail "*-*-*" symtab/25507 } fail $gdb_test_name } } } gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \ "not in inline 4" set ok 1 gdb_test_multiple "next" "next step 4" { -re -wrap "(if \\(t != NULL|\} // get_alias_set)" { send_gdb "next\n" exp_continue } -re -wrap "return x;" { set ok 0 send_gdb "next\n" exp_continue } -re -wrap "return 0.*" { if { $ok } { pass $gdb_test_name } else { if { $have_kfail } { setup_kfail "*-*-*" symtab/25507 } fail $gdb_test_name } } } gdb_test "bt" \ "\\s*\\#0\\s+(main|get_alias_set)\[^\r\]*${srcfile}:.*" \ "not in inline 5" if {!$use_header} { # With the debug from GCC 10.x (and earlier) GDB is currently # unable to successfully complete the following tests when we # are not using a header file. kfail symtab/25507 "stepping tests" return } clean_restart ${executable} if ![runto_main] { return } gdb_test "bt" "\\s*\\#0\\s+main.*" "in main pass 2" gdb_test "step" ".*" "step into get_alias_set pass 2" gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \ "in get_alias_set pass 2" gdb_test "step" ".*TREE_TYPE.*" "step 1" gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \ "not in inline 1 pass 2" gdb_test "step" ".*if \\(t->x != i\\).*" "step 2" gdb_test "bt" "\\s*\\#0\\s+\[^\r\]*tree_check\[^\r\]*${hdrfile}:.*" \ "in inline 1 pass 2" gdb_test "step" ".*TREE_TYPE.*" "step 3" gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \ "not in inline 2 pass 2" gdb_test "step" ".*if \\(t->x != i\\).*" "step 4" gdb_test "bt" "\\s*\\#0\\s+\[^\r\]*tree_check\[^\r\]*${hdrfile}:.*" \ "in inline 2 pass 2" gdb_test "step" ".*TREE_TYPE.*" "step 5" gdb_test "bt" "\\s*\\#0\\s+get_alias_set\[^\r\]*${srcfile}:.*" \ "not in inline 3 pass 2" gdb_test "step" ".*if \\(t->x != i\\).*" "step 6" gdb_test "bt" "\\s*\\#0\\s+\[^\r\]*tree_check\[^\r\]*${hdrfile}:.*" \ "in inline 3 pass 2" gdb_test "step" "return 0.*" "step 7" gdb_test "bt" \ "\\s*\\#0\\s+(main|get_alias_set)\[^\r\]*${srcfile}:.*" \ "not in inline 4 pass 2" } } do_test 0 do_test 1