| # Copyright (C) 2008-2022 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 GCC; see the file COPYING3. If not see |
| # <http://www.gnu.org/licenses/>. |
| |
| # Prepare to use a new set of torture options. |
| # |
| # Letting options leak from one set of tests to another can be confusing. |
| # Make sure variables are not set at the time we're called, because that |
| # would mean they were set without being cleared. |
| proc torture-init { args } { |
| global torture_without_loops global_with_loops |
| |
| if [info exists torture_without_loops] { |
| error "torture-init: torture_without_loops is not empty as expected" |
| } |
| if [info exists torture_with_loops] { |
| error "torture-init: torture_with_loops is not empty as expected" |
| } |
| } |
| |
| # Return 1 if torture options have already been set, 0 otherwise. |
| proc torture-options-exist { args } { |
| global torture_with_loops |
| return [info exists torture_with_loops] |
| } |
| |
| # Return 1 if compiler option ARG only affects loops, 0 otherwise. |
| proc contains-loop-option-p { arg } { |
| switch -glob -- $arg { |
| "*loop*" { return 1 } |
| default { return 0 } |
| } |
| } |
| |
| # Set torture options variables for tests with and without loops. |
| # |
| # Argument 0 is the list to use as torture options |
| # Argument 1 is the list to combine with the torture options. |
| # Argument 2 is the list to be appended to the torture options after |
| # combining argument 0 and 1. |
| proc set-torture-options { args } { |
| global torture_with_loops torture_without_loops |
| |
| set torture_list [lindex $args 0] |
| |
| if { [llength $args] > 1 } { |
| set other_list [lindex $args 1] |
| } else { |
| set other_list [list {}] |
| } |
| |
| set torture_with_loops "" |
| set torture_without_loops "" |
| foreach torture_opts $torture_list { |
| foreach other_opts $other_list { |
| # Remove trailing space[s] to match previous output. |
| set torture_opts [string trimright $torture_opts] |
| if ![contains-loop-option-p $torture_opts] { |
| lappend torture_without_loops "$torture_opts $other_opts" |
| } |
| lappend torture_with_loops "$torture_opts $other_opts" |
| } |
| } |
| |
| if { [llength $args] > 2 } { |
| set append_list [lindex $args 2] |
| append torture_with_loops " $append_list" |
| append torture_without_loops " $append_list" |
| } |
| } |
| |
| # Finish up after using a set of torture options. |
| # |
| # Letting options leak from one set of tests to another can be confusing. |
| # Make sure variables are set at the time we're called, and then unset |
| # them to prevent interference with other sets of tests. |
| proc torture-finish { args } { |
| global torture_without_loops torture_with_loops |
| |
| if [info exists torture_without_loops] { |
| unset torture_without_loops |
| } else { |
| error "torture-finish: torture_without_loops is not defined" |
| } |
| |
| if [info exists torture_with_loops] { |
| unset torture_with_loops |
| } else { |
| error "torture-finish: torture_with_loops is not defined" |
| } |
| } |
| |
| # Useful for debugging .exp files. |
| proc dump-torture-options { args } { |
| global torture_without_loops torture_with_loops |
| |
| if [info exists torture_without_loops] { |
| verbose "torture_without_loops = \"${torture_without_loops}\"" 1 |
| } else { |
| verbose "torture_without_loops is not defined" 1 |
| } |
| |
| if [info exists torture_with_loops] { |
| verbose "torture_with_loops = \"${torture_with_loops}\"" 1 |
| } else { |
| verbose "torture_with_loops is not defined" 1 |
| } |
| } |