1# Copyright (C) 2008-2016 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 3 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with GCC; see the file COPYING3. If not see 15# <http://www.gnu.org/licenses/>. 16 17# Prepare to use a new set of torture options. 18# 19# Letting options leak from one set of tests to another can be confusing. 20# Make sure variables are not set at the time we're called, because that 21# would mean they were set without being cleared. 22proc torture-init { args } { 23 global torture_without_loops global_with_loops 24 25 if [info exists torture_without_loops] { 26 error "torture-init: torture_without_loops is not empty as expected" 27 } 28 if [info exists torture_with_loops] { 29 error "torture-init: torture_with_loops is not empty as expected" 30 } 31} 32 33# Return 1 if torture options have already been set, 0 otherwise. 34proc torture-options-exist { args } { 35 global torture_with_loops 36 return [info exists torture_with_loops] 37} 38 39# Return 1 if compiler option ARG only affects loops, 0 otherwise. 40proc contains-loop-option-p { arg } { 41 switch -glob -- $arg { 42 "*loop*" { return 1 } 43 default { return 0 } 44 } 45} 46 47# Set torture options variables for tests with and without loops. 48# 49# Argument 0 is the list to use as torture options 50# Argument 1 is the list to combine with the torture options. 51# Argument 2 is the list to be appended to the torture options after 52# combining argument 0 and 1. 53proc set-torture-options { args } { 54 global torture_with_loops torture_without_loops 55 56 set torture_list [lindex $args 0] 57 58 if { [llength $args] > 1 } { 59 set other_list [lindex $args 1] 60 } else { 61 set other_list [list {}] 62 } 63 64 set torture_with_loops "" 65 set torture_without_loops "" 66 foreach torture_opts $torture_list { 67 foreach other_opts $other_list { 68 # Remove trailing space[s] to match previous output. 69 set torture_opts [string trimright $torture_opts] 70 if ![contains-loop-option-p $torture_opts] { 71 lappend torture_without_loops "$torture_opts $other_opts" 72 } 73 lappend torture_with_loops "$torture_opts $other_opts" 74 } 75 } 76 77 if { [llength $args] > 2 } { 78 set append_list [lindex $args 2] 79 append torture_with_loops " $append_list" 80 append torture_without_loops " $append_list" 81 } 82} 83 84# Finish up after using a set of torture options. 85# 86# Letting options leak from one set of tests to another can be confusing. 87# Make sure variables are set at the time we're called, and then unset 88# them to prevent interference with other sets of tests. 89proc torture-finish { args } { 90 global torture_without_loops torture_with_loops 91 92 if [info exists torture_without_loops] { 93 unset torture_without_loops 94 } else { 95 error "torture-finish: torture_without_loops is not defined" 96 } 97 98 if [info exists torture_with_loops] { 99 unset torture_with_loops 100 } else { 101 error "torture-finish: torture_with_loops is not defined" 102 } 103} 104 105# Useful for debugging .exp files. 106proc dump-torture-options { args } { 107 global torture_without_loops torture_with_loops 108 109 if [info exists torture_without_loops] { 110 verbose "torture_without_loops = \"${torture_without_loops}\"" 1 111 } else { 112 verbose "torture_without_loops is not defined" 1 113 } 114 115 if [info exists torture_with_loops] { 116 verbose "torture_with_loops = \"${torture_with_loops}\"" 1 117 } else { 118 verbose "torture_with_loops is not defined" 1 119 } 120} 121