summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSylvain Henry <sylvain@haskus.fr>2022-12-16 15:17:19 +0100
committerMarge Bot <ben+marge-bot@smart-cactus.org>2023-01-18 01:55:10 -0500
commit06036d931f51554305ba10add47e702d959619be (patch)
tree19d5f03f31f83c2791638a449be54bf7286a7ed6
parentf4d50bafb7e14f76273aaf6f634815d5628ccc86 (diff)
downloadhaskell-06036d931f51554305ba10add47e702d959619be.tar.gz
testsuite: req_smp --> req_target_smp, req_ghc_smp
See #22630 and !9552 This commit: - splits req_smp into req_target_smp and req_ghc_smp - changes the testsuite driver to calculate req_ghc_smp - changes a handful of tests to use req_target_smp instead of req_smp - changes a handful of tests to use req_host_smp when needed The problem: - the problem this solves is the ambiguity surrounding req_smp - on master req_smp was used to express the constraint that the program being compiled supports smp _and_ that the host RTS (i.e., the RTS used to compile the program) supported smp. Normally that is fine, but in cross compilation this is not always the case as was discovered in #22630. The solution: - Differentiate the two constraints: - use req_target_smp to say the RTS the compiled program is linked with (and the platform) supports smp - use req_host_smp to say the RTS the host is linked with supports smp WIP: fix req_smp (target vs ghc) add flag to separate bootstrapper split req_smp -> req_target_smp and req_ghc_smp update tests smp flags cleanup and add some docstrings only set ghc_with_smp to bootstrapper on S1 or CC Only set ghc_with_smp to bootstrapperWithSMP of when testing stage 1 and cross compiling test the RTS in config/ghc not hadrian re-add ghc_with_smp fix and align req names fix T11760 to use req_host_smp test the rts directly, avoid python 3.5 limitation test the compiler in a try block align out of tree and in tree withSMP flags mark failing tests as host req smp testsuite: req_host_smp --> req_ghc_smp Fix ghc vs host, fix ghc_with_smp leftover
-rw-r--r--hadrian/src/Settings/Builders/RunTest.hs15
-rw-r--r--libraries/base/tests/all.T2
-rw-r--r--testsuite/config/ghc49
-rw-r--r--testsuite/driver/testglobals.py7
-rw-r--r--testsuite/driver/testlib.py16
-rw-r--r--testsuite/mk/test.mk4
-rw-r--r--testsuite/tests/codeGen/should_run/all.T2
-rw-r--r--testsuite/tests/concurrent/T13615/all.T2
-rw-r--r--testsuite/tests/concurrent/should_run/all.T8
-rw-r--r--testsuite/tests/driver/T14075/all.T2
-rw-r--r--testsuite/tests/driver/T20030/test1/all.T3
-rw-r--r--testsuite/tests/driver/j-space/all.T2
-rw-r--r--testsuite/tests/driver/t22391/all.T2
-rw-r--r--testsuite/tests/ffi/should_run/all.T2
-rw-r--r--testsuite/tests/rts/all.T14
-rw-r--r--testsuite/tests/typecheck/should_fail/all.T2
16 files changed, 88 insertions, 44 deletions
diff --git a/hadrian/src/Settings/Builders/RunTest.hs b/hadrian/src/Settings/Builders/RunTest.hs
index 614d972b75..78099544d9 100644
--- a/hadrian/src/Settings/Builders/RunTest.hs
+++ b/hadrian/src/Settings/Builders/RunTest.hs
@@ -68,8 +68,8 @@ data TestCompilerArgs = TestCompilerArgs{
, withInterpreter :: Bool
, unregisterised :: Bool
, tables_next_to_code :: Bool
- , withSMP :: Bool
- , debugAssertions :: Bool
+ , targetWithSMP :: Bool -- does the target support SMP
+ , debugAssertions :: Bool
-- ^ Whether the compiler has debug assertions enabled,
-- corresponding to the -DDEBUG option.
, profiled :: Bool
@@ -100,7 +100,7 @@ inTreeCompilerArgs stg = do
withInterpreter <- ghcWithInterpreter
unregisterised <- flag GhcUnregisterised
tables_next_to_code <- flag TablesNextToCode
- withSMP <- targetSupportsSMP
+ targetWithSMP <- targetSupportsSMP
debugAssertions <- ($ succStage stg) . ghcDebugAssertions <$> flavour
profiled <- ghcProfiled <$> flavour <*> pure stg
@@ -145,8 +145,8 @@ outOfTreeCompilerArgs = do
withNativeCodeGen <- getBooleanSetting TestGhcWithNativeCodeGen
withInterpreter <- getBooleanSetting TestGhcWithInterpreter
unregisterised <- getBooleanSetting TestGhcUnregisterised
- tables_next_to_code <- getBooleanSetting TestGhcTablesNextToCode
- withSMP <- getBooleanSetting TestGhcWithSMP
+ tables_next_to_code <- getBooleanSetting TestGhcUnregisterised
+ targetWithSMP <- targetSupportsSMP
debugAssertions <- getBooleanSetting TestGhcDebugged
os <- getTestSetting TestHostOS
@@ -202,7 +202,7 @@ runTestBuilderArgs = builder Testsuite ? do
bignumBackend <- getBignumBackend
bignumCheck <- getBignumCheck
- keepFiles <- expr (testKeepFiles <$> userSetting defaultTestArgs)
+ keepFiles <- expr (testKeepFiles <$> userSetting defaultTestArgs)
accept <- expr (testAccept <$> userSetting defaultTestArgs)
(acceptPlatform, acceptOS) <- expr . liftIO $
@@ -262,8 +262,7 @@ runTestBuilderArgs = builder Testsuite ? do
, arg "-e", arg $ asBool "ghc_with_dynamic_rts=" (hasDynamicRts)
, arg "-e", arg $ asBool "ghc_with_threaded_rts=" (hasThreadedRts)
, arg "-e", arg $ asBool "config.have_fast_bignum=" (bignumBackend /= "native" && not bignumCheck)
- , arg "-e", arg $ asBool "ghc_with_smp=" withSMP
-
+ , arg "-e", arg $ asBool "target_with_smp=" targetWithSMP
, arg "-e", arg $ "config.ghc_dynamic=" ++ show hasDynamic
, arg "-e", arg $ "config.leading_underscore=" ++ show leadingUnderscore
diff --git a/libraries/base/tests/all.T b/libraries/base/tests/all.T
index c96a3d1f43..2b253ceca8 100644
--- a/libraries/base/tests/all.T
+++ b/libraries/base/tests/all.T
@@ -240,7 +240,7 @@ test('T11555', normal, compile_and_run, [''])
test('T12494', normal, compile_and_run, [''])
test('T12852', [when(opsys('mingw32'), skip), js_broken(22374)], compile_and_run, [''])
test('lazySTexamples', normal, compile_and_run, [''])
-test('T11760', req_smp, compile_and_run, ['-threaded -with-rtsopts=-N2'])
+test('T11760', [req_ghc_smp, req_target_smp], compile_and_run, ['-threaded -with-rtsopts=-N2'])
test('T12874', normal, compile_and_run, [''])
test('T13191',
[ collect_stats('bytes allocated', 5)
diff --git a/testsuite/config/ghc b/testsuite/config/ghc
index 8916ffa3a9..85c8b27c9e 100644
--- a/testsuite/config/ghc
+++ b/testsuite/config/ghc
@@ -43,10 +43,12 @@ if ghc_with_native_codegen:
if config.have_interp:
config.run_ways.append('ghci')
+# we read the 'Support SMP' setting from the ghcconfig file. This dictates
+# whether the target supports smp
if ghc_with_threaded_rts:
config.run_ways.append('threaded1')
- if ghc_with_smp:
- config.have_smp = True
+ if target_with_smp:
+ config.target_has_smp = True
config.run_ways.append('threaded2')
if config.speed == 0:
config.run_ways.append('nonmoving_thr')
@@ -210,31 +212,52 @@ def get_compiler_info():
# See Note [Replacing backward slashes in config.libdir].
config.libdir = config.libdir.replace('\\', '/')
- def test_compile(flags) -> bool:
+ def test_compile(flags):
"""
- Check whether GHC can compile in the given way.
- This is used as a proxy to determine, e.g., whether
- profiled libraries were built.
+ Check whether GHC can compile in the given way. This is used as a
+ proxy to determine, e.g., whether profiled libraries were built, or
+ whether the host RTS supports smp.
"""
import tempfile
import textwrap
+
+ res = False
+
with tempfile.TemporaryDirectory() as d:
src = Path(d) / 'test.hs'
src.write_text(textwrap.dedent('''
module Main where
main = putStrLn "Hello World!"
'''))
- p = subprocess.run(
+ try:
+ p = subprocess.run(
'{} -v0 {} -o test '.format(config.compiler, src) + ' '.join(flags),
shell=True,
cwd=d,
- stderr=None if config.verbose >= 3 else subprocess.DEVNULL)
- res = p.returncode
- return res == 0
+ stderr=None if config.verbose >= 3 else subprocess.DEVNULL
+ )
+
+ except Exception as err:
+ print("Exception thrown in testsuite/config/ghc.get_compiler_info: %s", err)
+
+ else:
+ res = p.returncode == 0
+
+ return res
+
+ def compiler_supports_way(flags):
+ return test_compile(flags)
+
+ # Test the Host RTS to determine if it supports SMP. For cross compilers the
+ # Host /= Target, so we cannot determine from the ghcconfig file if the host
+ # itself supports smp. To support smp the host must be linked with an RTS
+ # built with 'defined(THREADED_RTS) && !defined(NO_SMP)'. Thus we directly
+ # query the RTS the host is linked with.
+ config.ghc_has_smp = test_compile(["+RTS", "-N"])
- config.have_vanilla = test_compile([])
- config.have_dynamic = test_compile(['-dynamic'])
- config.have_profiling = test_compile(['-prof'])
+ config.have_vanilla = compiler_supports_way([])
+ config.have_dynamic = compiler_supports_way(['-dynamic'])
+ config.have_profiling = compiler_supports_way(['-prof'])
if config.have_profiling:
config.compile_ways.append('profasm')
diff --git a/testsuite/driver/testglobals.py b/testsuite/driver/testglobals.py
index ea0b03b3c1..8c52f7f148 100644
--- a/testsuite/driver/testglobals.py
+++ b/testsuite/driver/testglobals.py
@@ -147,8 +147,11 @@ class TestConfig:
# Is the compiler dynamically linked?
self.ghc_dynamic = False
- # Do we have SMP support?
- self.have_smp = False
+ # Does the host RTS have SMP support?
+ self.ghc_has_smp = True
+
+ # Does the target have SMP support?
+ self.target_has_smp = True
# Is gdb available?
self.have_gdb = False
diff --git a/testsuite/driver/testlib.py b/testsuite/driver/testlib.py
index aa738e96e2..bc83038d2b 100644
--- a/testsuite/driver/testlib.py
+++ b/testsuite/driver/testlib.py
@@ -296,8 +296,20 @@ def req_th( name, opts ):
if ghc_dynamic():
return _omit_ways(name, opts, ['profasm', 'profthreaded'])
-def req_smp( name, opts ):
- if not config.have_smp:
+def req_ghc_smp( name, opts ):
+ """
+ Mark a test as requiring GHC to be linked with an RTS that supports smp.
+ """
+ if not config.ghc_has_smp:
+ opts.skip = True
+
+def req_target_smp( name, opts ):
+ """
+ Mark a test as requiring smp when run on the target. If the target does
+ not support smp, then mark the test as an expected fail. Use this when the
+ test needs to run with smp support.
+ """
+ if not config.target_has_smp:
opts.expect = 'fail'
def ignore_stdout(name, opts):
diff --git a/testsuite/mk/test.mk b/testsuite/mk/test.mk
index 201d52d1dd..7c654df9ae 100644
--- a/testsuite/mk/test.mk
+++ b/testsuite/mk/test.mk
@@ -164,9 +164,9 @@ CABAL_PLUGIN_BUILD = --enable-library-vanilla --disable-shared
endif
ifeq "$(GhcWithSMP)" "YES"
-RUNTEST_OPTS += -e ghc_with_smp=True
+RUNTEST_OPTS += -e target_with_smp=True
else
-RUNTEST_OPTS += -e ghc_with_smp=False
+RUNTEST_OPTS += -e target_with_smp=False
endif
ifeq "$(GhcWithRtsLinker)" "YES"
diff --git a/testsuite/tests/codeGen/should_run/all.T b/testsuite/tests/codeGen/should_run/all.T
index 416eb4ecfd..de68abcd44 100644
--- a/testsuite/tests/codeGen/should_run/all.T
+++ b/testsuite/tests/codeGen/should_run/all.T
@@ -156,7 +156,7 @@ test('T10246', normal, compile_and_run, [''])
test('T9533', normal, compile_and_run, [''])
test('T9533b', normal, compile_and_run, [''])
test('T9533c', normal, compile_and_run, [''])
-test('T10414', [only_ways(['threaded2']), extra_ways(['threaded2']), req_smp],
+test('T10414', [only_ways(['threaded2']), extra_ways(['threaded2']), req_target_smp, req_ghc_smp],
compile_and_run, ['-feager-blackholing'])
test('T10521', normal, compile_and_run, [''])
test('T10521b', normal, compile_and_run, [''])
diff --git a/testsuite/tests/concurrent/T13615/all.T b/testsuite/tests/concurrent/T13615/all.T
index a6541d2a23..243ef8549f 100644
--- a/testsuite/tests/concurrent/T13615/all.T
+++ b/testsuite/tests/concurrent/T13615/all.T
@@ -1,7 +1,7 @@
test('T13615',
[when(fast(), skip),
when(unregisterised(), skip),
- req_smp, # needs -N support
+ req_target_smp, # needs -N support
only_ways(threaded_ways),
extra_files(['Parallel.hs', 'Memo.hs']),
# Decrease stack chunk size and lots of capabilities to increase failure
diff --git a/testsuite/tests/concurrent/should_run/all.T b/testsuite/tests/concurrent/should_run/all.T
index 3631cc8e88..047f70e6d8 100644
--- a/testsuite/tests/concurrent/should_run/all.T
+++ b/testsuite/tests/concurrent/should_run/all.T
@@ -240,7 +240,9 @@ test('setnumcapabilities001',
[ only_ways(['threaded1','threaded2', 'nonmoving_thr', 'profthreaded']),
extra_run_opts('8 12 2000'),
when(have_thread_sanitizer(), expect_broken(18808)),
- req_smp ],
+ req_target_smp,
+ req_ghc_smp
+ ],
compile_and_run, [''])
test('T21651',
@@ -248,7 +250,9 @@ test('T21651',
when(opsys('mingw32'),skip), # uses POSIX pipes
when(opsys('darwin'),extra_run_opts('8 12 2000 100')),
unless(opsys('darwin'),extra_run_opts('8 12 2000 200')), # darwin runners complain of too many open files
- req_smp ],
+ req_target_smp,
+ req_ghc_smp
+ ],
compile_and_run, [''])
test('hs_try_putmvar001',
diff --git a/testsuite/tests/driver/T14075/all.T b/testsuite/tests/driver/T14075/all.T
index 16f0e482f9..b7f7a39072 100644
--- a/testsuite/tests/driver/T14075/all.T
+++ b/testsuite/tests/driver/T14075/all.T
@@ -1,6 +1,6 @@
test('T14075',
[ extra_files(['F.hs', 'F.hs-boot', 'O.hs', 'V.hs', 'V.hs-boot'])
- , req_smp # uses ghc --make -j2
+ , req_ghc_smp # uses ghc --make -j2
, js_broken(22261)
],
makefile_test, [])
diff --git a/testsuite/tests/driver/T20030/test1/all.T b/testsuite/tests/driver/T20030/test1/all.T
index b1d4309065..2e121dbded 100644
--- a/testsuite/tests/driver/T20030/test1/all.T
+++ b/testsuite/tests/driver/T20030/test1/all.T
@@ -9,6 +9,7 @@ test('T20030_test1j',
[ extra_files([ 'A.hs-boot' , 'A.hs' , 'B.hs' , 'C.hs-boot' , 'C.hs'
, 'D.hs' , 'E.hs-boot' , 'E.hs' , 'F.hs' , 'G.hs' , 'H.hs'
, 'I.hs', 'J.hs-boot', 'J.hs', 'K.hs' ])
- , req_smp
+ , req_target_smp
+ , req_ghc_smp
],
multimod_compile, ['I.hs K.hs', '-v1 -j'])
diff --git a/testsuite/tests/driver/j-space/all.T b/testsuite/tests/driver/j-space/all.T
index 7864ebf73a..9d7e4c89f0 100644
--- a/testsuite/tests/driver/j-space/all.T
+++ b/testsuite/tests/driver/j-space/all.T
@@ -1 +1 @@
-test('jspace', [extra_files(['genJspace']), req_smp], makefile_test, ['jspace'])
+test('jspace', [extra_files(['genJspace']), req_target_smp, req_ghc_smp], makefile_test, ['jspace'])
diff --git a/testsuite/tests/driver/t22391/all.T b/testsuite/tests/driver/t22391/all.T
index f8a3d2fb3c..a1769856ad 100644
--- a/testsuite/tests/driver/t22391/all.T
+++ b/testsuite/tests/driver/t22391/all.T
@@ -1,5 +1,5 @@
test('t22391', [extra_files(['src'])],
multimod_compile, ['Lib', '-v1 -Wall -fhide-source-paths -isrc -fdefer-diagnostics'])
-test('t22391j', [req_smp, extra_files(['src'])],
+test('t22391j', [req_target_smp, req_ghc_smp, extra_files(['src'])],
multimod_compile, ['Lib', '-v1 -Wall -fhide-source-paths -isrc -fdefer-diagnostics -j2'])
diff --git a/testsuite/tests/ffi/should_run/all.T b/testsuite/tests/ffi/should_run/all.T
index 3cece482b2..f2270fc2ab 100644
--- a/testsuite/tests/ffi/should_run/all.T
+++ b/testsuite/tests/ffi/should_run/all.T
@@ -235,7 +235,7 @@ test('T17471', [omit_ways(['ghci']), req_c], compile_and_run,
['T17471_c.c -optc-D -optcFOO'])
test('IncallAffinity',
- [req_smp, only_ways(['threaded1', 'threaded2']),
+ [req_target_smp, req_ghc_smp, only_ways(['threaded1', 'threaded2']),
# Unregisterised build doesn't support
when(unregisterised(), skip),
req_c],
diff --git a/testsuite/tests/rts/all.T b/testsuite/tests/rts/all.T
index 2b8ce66e3e..21114cb3de 100644
--- a/testsuite/tests/rts/all.T
+++ b/testsuite/tests/rts/all.T
@@ -287,7 +287,7 @@ test('stablename001', expect_fail_for(['hpc']), compile_and_run, [''])
test('T7815', [ multi_cpu_race,
extra_run_opts('50000 +RTS -N2 -RTS'),
- req_smp,
+ req_target_smp, req_ghc_smp,
only_ways(['threaded1', 'threaded2']) ], compile_and_run, [''] )
# ignore_stderr because it contains a unique:
@@ -306,10 +306,10 @@ test('T7919', [ when(fast(), skip)
test('T8035', normal, compile_and_run, [''])
-test('T8209', [ req_smp, only_ways(threaded_ways), ignore_stdout ],
+test('T8209', [ req_target_smp, req_ghc_smp, only_ways(threaded_ways), ignore_stdout ],
compile_and_run, [''])
-test('T8242', [ req_smp, only_ways(threaded_ways), ignore_stdout ],
+test('T8242', [ req_target_smp, req_ghc_smp, only_ways(threaded_ways), ignore_stdout ],
compile_and_run, [''])
test('T8124', [ only_ways(threaded_ways), omit_ways(['ghci']),
@@ -330,7 +330,8 @@ test('T9078', only_ways(['threaded1']), compile_and_run, [''])
test('T10017', [ when(opsys('mingw32'), skip)
, when(unregisterised(), skip)
- , req_smp
+ , req_target_smp
+ , req_ghc_smp
, only_ways(threaded_ways), extra_run_opts('+RTS -N2 -RTS') ], compile_and_run, [''])
test('T11108', normal, compile_and_run, [''])
@@ -403,7 +404,7 @@ test('T11788', [ when(ghc_dynamic(), skip)
, req_interp
], makefile_test, ['T11788'])
-test('T10296a', [req_smp], makefile_test, ['T10296a'])
+test('T10296a', [req_ghc_smp], makefile_test, ['T10296a'])
test('T10296b', [only_ways(['threaded2'])], compile_and_run, [''])
@@ -457,7 +458,8 @@ test('alloccounter1', js_broken(22261), compile_and_run,
test('nursery-chunks1',
[ extra_run_opts('4 100 +RTS -n32k -A1m -RTS')
- , req_smp
+ , req_ghc_smp
+ , req_target_smp
, only_ways(['threaded1','threaded2'])
],
compile_and_run,
diff --git a/testsuite/tests/typecheck/should_fail/all.T b/testsuite/tests/typecheck/should_fail/all.T
index 61514e725b..bfb7b311a0 100644
--- a/testsuite/tests/typecheck/should_fail/all.T
+++ b/testsuite/tests/typecheck/should_fail/all.T
@@ -412,7 +412,7 @@ test('T11990a', normal, compile_fail, [''])
test('T11990b', normal, compile_fail, [''])
test('T12035', [], multimod_compile_fail, ['T12035', '-v0'])
test('T12035j', [ extra_files(['T12035.hs', 'T12035a.hs', 'T12035.hs-boot'])
- , req_smp
+ , req_ghc_smp
, js_broken(22261)
], multimod_compile_fail, ['T12035', '-j2 -v0'])
test('T12045b', normal, compile_fail, [''])