Add -fghci-leak-check to check for space leaks
[ghc.git] / testsuite / config / ghc
1 import re
2
3 # Testsuite configuration setup for GHC
4 #
5 # This file is Python source
6 #
7 config.compiler              = 'ghc'
8 config.compiler_always_flags = ghc_compiler_always_flags.split()
9
10 config.haddock               = 'haddock'
11 config.hp2ps                 = 'hp2ps'
12 config.hpc                   = 'hpc'
13 config.gs                    = 'gs'
14 config.confdir               = '.'
15
16 # By default, the 'normal' and 'hpc' ways are enabled. In addition, certain
17 # ways are enabled automatically if this GHC supports them. Ways that fall in
18 # this group are 'optasm', 'optllvm', 'profasm', 'threaded1', 'threaded2',
19 # 'profthreaded', 'ghci', and whichever of 'static/dyn' is not this GHC's
20 # default mode. Other ways should be set explicitly from .T files.
21 config.compile_ways       = ['normal', 'hpc']
22 config.run_ways           = ['normal', 'hpc']
23
24 # ways that are not enabled by default, but can always be invoked explicitly
25 config.other_ways         = ['prof', 'normal_h',
26                              'prof_hc_hb','prof_hb',
27                              'prof_hd','prof_hy','prof_hr',
28                              'sanity',
29                              'threaded1_ls', 'threaded2_hT', 'debug_numa',
30                              'llvm', 'debugllvm',
31                              'profllvm', 'profoptllvm', 'profthreadedllvm',
32                              'debug',
33                              'ghci-ext', 'ghci-ext-prof',
34                              'ext-interp']
35
36 if (ghc_with_native_codegen == 1):
37     config.compile_ways.append('optasm')
38     config.run_ways.append('optasm')
39
40 if config.have_profiling:
41     config.compile_ways.append('profasm')
42     config.run_ways.append('profasm')
43
44 if config.have_interp:
45     config.run_ways.append('ghci')
46
47 if (ghc_with_threaded_rts == 1):
48     config.run_ways.append('threaded1')
49     if (ghc_with_smp == 1):
50         config.have_smp = True
51         config.run_ways.append('threaded2')
52
53 if (ghc_with_dynamic_rts == 1):
54     config.have_shared_libs = True
55
56 if config.ghc_dynamic_by_default and config.have_vanilla == 1:
57     config.run_ways.append('static')
58 else:
59     if (ghc_with_dynamic_rts == 1):
60         config.run_ways.append('dyn')
61
62 if (config.have_profiling and ghc_with_threaded_rts == 1):
63     config.run_ways.append('profthreaded')
64
65 if (ghc_with_llvm == 1 and not config.unregisterised):
66     config.compile_ways.append('optllvm')
67     config.run_ways.append('optllvm')
68
69 config.way_flags = {
70     'normal'       : [],
71     'normal_h'     : [],
72     'g1'           : [],
73     'nursery_chunks' : [],
74     'debug_numa'   : ['-threaded', '-debug'],
75     'optasm'       : ['-O', '-fasm'],
76     'llvm'         : ['-fllvm'],
77     'optllvm'      : ['-O', '-fllvm'],
78     'debugllvm'    : ['-fllvm', '-keep-llvm-files'],
79     'prof'         : ['-prof', '-static', '-fprof-auto', '-fasm'],
80     'prof_no_auto' : ['-prof', '-static', '-fasm'],
81     'profasm'      : ['-O', '-prof', '-static', '-fprof-auto'],
82     'profthreaded' : ['-O', '-prof', '-static', '-fprof-auto', '-threaded'],
83     'ghci'         : ['--interactive', '-v0', '-ignore-dot-ghci', '-fno-ghci-history', '-fghci-leak-check', '+RTS', '-I0.1', '-RTS'],
84     'sanity'       : ['-debug'],
85     'threaded1'    : ['-threaded', '-debug'],
86     'threaded1_ls' : ['-threaded', '-debug'],
87     'threaded2'    : ['-O', '-threaded', '-eventlog'],
88     'threaded2_hT' : ['-O', '-threaded'],
89     'hpc'          : ['-O', '-fhpc'],
90     'prof_hc_hb'   : ['-O', '-prof', '-static', '-fprof-auto'],
91     'prof_hb'      : ['-O', '-prof', '-static', '-fprof-auto'],
92     'prof_hd'      : ['-O', '-prof', '-static', '-fprof-auto'],
93     'prof_hy'      : ['-O', '-prof', '-static', '-fprof-auto'],
94     'prof_hr'      : ['-O', '-prof', '-static', '-fprof-auto'],
95     'dyn'          : ['-O', '-dynamic'],
96     'static'       : ['-O', '-static'],
97     'debug'        : ['-O', '-g', '-dannot-lint'],
98     # llvm variants...
99     'profllvm'         : ['-prof', '-static', '-fprof-auto', '-fllvm'],
100     'profoptllvm'      : ['-O', '-prof', '-static', '-fprof-auto', '-fllvm'],
101     'profthreadedllvm' : ['-O', '-prof', '-static', '-fprof-auto', '-threaded', '-fllvm'],
102     'ghci-ext'         : ['--interactive', '-v0', '-ignore-dot-ghci', '-fno-ghci-history', '-fexternal-interpreter', '+RTS', '-I0.1', '-RTS'],
103     'ghci-ext-prof'    : ['--interactive', '-v0', '-ignore-dot-ghci', '-fno-ghci-history', '-fexternal-interpreter', '-prof', '+RTS', '-I0.1', '-RTS'],
104     'ext-interp' : ['-fexternal-interpreter'],
105    }
106
107 config.way_rts_flags = {
108     'normal'       : [],
109     'normal_h'     : ['-h'], # works without -prof
110     'g1'           : ['-G1'],
111     'nursery_chunks' : ['-n32k'],
112     'debug_numa'   : ['-N2', '--debug-numa=2'],
113     'optasm'       : [],
114     'llvm'         : [],
115     'optllvm'      : [],
116     'debugllvm'    : [],
117     'prof'         : ['-p'],
118     'prof_no_auto' : ['-p'],
119     'profasm'      : ['-hc', '-p'], # test heap profiling too
120     'profthreaded' : ['-p'],
121     'ghci'         : [],
122     'sanity'       : ['-DS'],
123     'threaded1'    : [],
124     'threaded1_ls' : ['-ls'],
125     'threaded2'    : ['-N2 -ls'],
126     'threaded2_hT' : ['-N2', '-hT'],
127     'hpc'          : [],
128     'prof_hc_hb'   : ['-hc -hbvoid'],
129     'prof_hb'      : ['-hb'],
130     'prof_hd'      : ['-hd'],
131     'prof_hy'      : ['-hy'],
132     'prof_hr'      : ['-hr'],
133     'dyn'          : [],
134     'static'       : [],
135     'debug'        : [],
136     # llvm variants...
137     'profllvm'         : ['-p'],
138     'profoptllvm'      : ['-hc', '-p'],
139     'profthreadedllvm' : ['-p'],
140     'ghci-ext'         : [],
141     'ghci-ext-prof'    : [],
142     'ext-interp'       : [],
143    }
144
145 # Useful classes of ways that can be used with only_ways(), omit_ways() and
146 # expect_broken_for().
147
148 prof_ways     = [x[0] for x in config.way_flags.items()
149                       if '-prof' in x[1]]
150
151 threaded_ways = [x[0] for x in config.way_flags.items()
152                       if '-threaded' in x[1] or 'ghci' == x[0]]
153
154 opt_ways      = [x[0] for x in config.way_flags.items()
155                       if '-O' in x[1]]
156
157 llvm_ways     = [x[0] for x in config.way_flags.items()
158                       if '-fflvm' in x[1]]
159
160 def get_compiler_info():
161     s = getStdout([config.compiler, '--info']).decode('utf8')
162     s = re.sub('[\r\n]', '', s)
163     compilerInfoDict = dict(eval(s))
164     s = getStdout([config.compiler, '+RTS', '--info']).decode('utf8')
165     s = re.sub('[\r\n]', '', s)
166     rtsInfoDict = dict(eval(s))
167
168     # external interpreter needs RTS linker support
169     # If the field is not present (GHC 8.0 and earlier), assume we don't
170     # have -fexternal-interpreter (though GHC 8.0 actually does)
171     # so we can still run most tests.
172     config.have_ext_interp = compilerInfoDict.get("target has RTS linker", "NO") == "YES"
173
174     # See Note [Replacing backward slashes in config.libdir].
175     config.libdir = compilerInfoDict['LibDir'].replace('\\', '/')
176
177     if re.match(".*_p(_.*|$)", rtsInfoDict["RTS way"]):
178         config.compiler_profiled = True
179     else:
180         config.compiler_profiled = False
181
182     try:
183         config.package_conf_cache_file = compilerInfoDict["Global Package DB"] + '/package.cache'
184     except:
185         config.package_conf_cache_file = ''
186
187     # See Note [WayFlags]
188     if config.ghc_dynamic:
189         config.ghc_th_way_flags = "-dynamic"
190         config.ghci_way_flags   = "-dynamic"
191         config.plugin_way_flags = "-dynamic"
192         config.ghc_th_way       = "dyn"
193         config.ghc_plugin_way   = "dyn"
194     elif config.compiler_profiled:
195         config.ghc_th_way_flags = "-prof"
196         config.ghci_way_flags   = "-prof"
197         config.plugin_way_flags = "-prof"
198         config.ghc_th_way       = "prof"
199         config.ghc_plugin_way   = "prof"
200     else:
201         config.ghc_th_way_flags = "-static"
202         config.ghci_way_flags   = "-static"
203         config.plugin_way_flags = "-static"
204         config.ghc_th_way       = "normal"
205         config.ghc_plugin_way   = "normal"
206
207 # Note [Replacing backward slashes in config.libdir]
208
209 # We *do* need to replace backslashes in config.libdir, for the following
210 # reason:
211 #
212 # * Tests use config.libdir as follows:
213 #
214 #     extra_run_opts('"' + config.libdir + '"')
215 #
216 #   The double quotes are there because config.libdir might contain
217 #   spaces.
218 #
219 # * This string is then written /as is/ to <testname>.genscript in
220 #   testlib.interpreter_run:
221 #
222 #     script.write(':set args ' + opts.extra_run_opts + '\n')
223 #
224 # * But GHCi expects the arguments to ':set args' to be proper Haskell
225 #   strings (when they are quoted), with backslashes escaped. Since
226 #   config.libdir contains single backslash characters, tests such as T5313
227 #   will fail for WAY=ghci with "Pattern match failure in do expression".
228 #
229 # Arguably the above code for writing `:set args` should be smarter. This
230 # is tricky to get right though, because in GHCI `:set args foo\bar` (no
231 # double quotes) works perfectly fine, and is interpreted as the Haskell
232 # string "foo\\bar". Therefore, simply escaping all backward slashes in
233 # opts.extra_run_opts before concatenating it with ':set args' is not right
234 # either.
235 #
236 # Replacing backslashes to forward slashes in config.libdir works around the
237 # problem.