1# Copyright (C) 2008-2018 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