diff options
-rw-r--r-- | hadrian/src/Context.hs | 3 | ||||
-rw-r--r-- | hadrian/src/Context/Path.hs | 5 | ||||
-rw-r--r-- | hadrian/src/Rules/Documentation.hs | 5 | ||||
-rw-r--r-- | hadrian/src/Settings/Builders/Haddock.hs | 4 | ||||
-rw-r--r-- | hadrian/src/Settings/Builders/RunTest.hs | 6 | ||||
-rw-r--r-- | rules/haddock.mk | 2 | ||||
-rw-r--r-- | testsuite/driver/testglobals.py | 5 | ||||
-rw-r--r-- | testsuite/driver/testlib.py | 16 | ||||
-rw-r--r-- | testsuite/mk/test.mk | 2 | ||||
-rw-r--r-- | testsuite/tests/perf/haddock/all.T | 36 |
10 files changed, 62 insertions, 22 deletions
diff --git a/hadrian/src/Context.hs b/hadrian/src/Context.hs index 7c7bb124ff..0676743ee5 100644 --- a/hadrian/src/Context.hs +++ b/hadrian/src/Context.hs @@ -8,7 +8,8 @@ module Context ( -- * Paths contextDir, buildPath, buildDir, pkgInplaceConfig, pkgSetupConfigFile, pkgHaddockFile, pkgRegisteredLibraryFile, pkgLibraryFile, pkgGhciLibraryFile, - pkgConfFile, objectPath, contextPath, getContextPath, libPath, distDir + pkgConfFile, objectPath, contextPath, getContextPath, libPath, distDir, + haddockStatsFilesDir ) where import Base diff --git a/hadrian/src/Context/Path.hs b/hadrian/src/Context/Path.hs index 4bc9d9be34..e5a82710ab 100644 --- a/hadrian/src/Context/Path.hs +++ b/hadrian/src/Context/Path.hs @@ -41,3 +41,8 @@ buildPath context = buildRoot <&> (-/- buildDir context) -- | The expression that evaluates to the build path of the current 'Context'. getBuildPath :: Expr Context b FilePath getBuildPath = expr . buildPath =<< getContext + +-- | Path to the directory containing haddock timing files, used by +-- the haddock perf tests. +haddockStatsFilesDir :: Action FilePath +haddockStatsFilesDir = (-/- "stage1" -/- "haddock-timing-files") <$> buildRoot diff --git a/hadrian/src/Rules/Documentation.hs b/hadrian/src/Rules/Documentation.hs index a70b4d5c9d..9991f01708 100644 --- a/hadrian/src/Rules/Documentation.hs +++ b/hadrian/src/Rules/Documentation.hs @@ -205,7 +205,12 @@ buildPackageDocumentation = do -- TODO: Pass the correct way from Rules via Context. dynamicPrograms <- dynamicGhcPrograms =<< flavour let haddockWay = if dynamicPrograms then dynamic else vanilla + statsFilesDir <- haddockStatsFilesDir + createDirectory statsFilesDir build $ target (context {way = haddockWay}) (Haddock BuildPackage) srcs [file] + produces [ + statsFilesDir </> pkgName (Context.package context) <.> "t" + ] data PkgDocTarget = DotHaddock PackageName | HaddockPrologue PackageName deriving (Eq, Show) diff --git a/hadrian/src/Settings/Builders/Haddock.hs b/hadrian/src/Settings/Builders/Haddock.hs index 65c703160c..b01b8a2459 100644 --- a/hadrian/src/Settings/Builders/Haddock.hs +++ b/hadrian/src/Settings/Builders/Haddock.hs @@ -35,13 +35,13 @@ haddockBuilderArgs = mconcat output <- getOutput pkg <- getPackage root <- getBuildRoot - path <- getBuildPath context <- getContext version <- expr $ pkgVersion pkg synopsis <- expr $ pkgSynopsis pkg deps <- getContextData depNames haddocks <- expr $ haddockDependencies context hVersion <- expr $ pkgVersion haddock + statsDir <- expr $ haddockStatsFilesDir ghcOpts <- haddockGhcArgs mconcat [ arg "--verbosity=0" @@ -66,6 +66,6 @@ haddockBuilderArgs = mconcat , pure [ "--optghc=" ++ opt | opt <- ghcOpts, not ("--package-db" `isInfixOf` opt) ] , getInputs , arg "+RTS" - , arg $ "-t" ++ path -/- "haddock.t" + , arg $ "-t" ++ (statsDir -/- pkgName pkg ++ ".t") , arg "--machine-readable" , arg "-RTS" ] ] diff --git a/hadrian/src/Settings/Builders/RunTest.hs b/hadrian/src/Settings/Builders/RunTest.hs index 6cc11f8aef..63e3dfd6c9 100644 --- a/hadrian/src/Settings/Builders/RunTest.hs +++ b/hadrian/src/Settings/Builders/RunTest.hs @@ -85,11 +85,14 @@ runTestBuilderArgs = builder RunTest ? do wordsize <- getTestSetting TestWORDSIZE top <- expr $ topDirectory ghcFlags <- expr runTestGhcFlags - timeoutProg <- expr buildRoot <&> (-/- timeoutPath) cmdrootdirs <- expr (testRootDirs <$> userSetting defaultTestArgs) let defaultRootdirs = ("testsuite" -/- "tests") : libTests rootdirs | null cmdrootdirs = defaultRootdirs | otherwise = cmdrootdirs + root <- expr buildRoot + let timeoutProg = root -/- timeoutPath + statsFilesDir <- expr haddockStatsFilesDir + -- See #16087 let ghcBuiltByLlvm = False -- TODO: Implement this check @@ -134,6 +137,7 @@ runTestBuilderArgs = builder RunTest ? do , arg "--config", arg $ "gs=gs" -- Use the default value as in test.mk , arg "--config", arg $ "timeout_prog=" ++ show (top -/- timeoutProg) + , arg "--config", arg $ "stats_files_dir=" ++ statsFilesDir , arg $ "--threads=" ++ show threads , getTestArgs -- User-provided arguments from command line. ] diff --git a/rules/haddock.mk b/rules/haddock.mk index f0d686194f..a0e4f1724a 100644 --- a/rules/haddock.mk +++ b/rules/haddock.mk @@ -76,7 +76,7 @@ endif $$($1_$2_HS_SRCS) \ $$($1_$2_EXTRA_HADDOCK_SRCS) \ $$(EXTRA_HADDOCK_OPTS) \ - +RTS -t"$1/$2/haddock.t" --machine-readable + +RTS -t"$$(TOP)/testsuite/tests/perf/haddock/$$($1_PACKAGE).t" --machine-readable # --no-tmp-comp-dir above is important: it saves a few minutes in a # validate. This flag lets Haddock use the pre-compiled object files diff --git a/testsuite/driver/testglobals.py b/testsuite/driver/testglobals.py index b28477c769..ababefba19 100644 --- a/testsuite/driver/testglobals.py +++ b/testsuite/driver/testglobals.py @@ -139,6 +139,11 @@ class TestConfig: # terminal supports colors self.supports_colors = False + # Where to look up runtime stats produced by haddock, needed for + # the haddock perf tests in testsuite/tests/perf/haddock/. + # See Note [Haddock runtime stats files] at the bottom of this file. + self.stats_files_dir = '/please_set_stats_files_dir' + global config config = TestConfig() diff --git a/testsuite/driver/testlib.py b/testsuite/driver/testlib.py index dc8b1b85f1..d0bd98015d 100644 --- a/testsuite/driver/testlib.py +++ b/testsuite/driver/testlib.py @@ -67,7 +67,6 @@ def isStatsTest(): opts = getTestOpts() return opts.is_stats_test - # This can be called at the top of a file of tests, to set default test options # for the following tests. def setTestOpts( f ): @@ -1211,7 +1210,11 @@ def multi_compile_and_run( name, way, top_mod, extra_mods, extra_hc_opts ): def stats( name, way, stats_file ): opts = getTestOpts() - return check_stats(name, way, stats_file, opts.stats_range_fields) + return check_stats(name, way, in_testdir(stats_file), opts.stats_range_fields) + +def static_stats( name, way, stats_file ): + opts = getTestOpts() + return check_stats(name, way, in_statsdir(stats_file), opts.stats_range_fields) def metric_dict(name, way, metric, value): return Perf.PerfStat( @@ -1234,7 +1237,7 @@ def check_stats(name, way, stats_file, range_fields): result = passed() if range_fields: try: - f = open(in_testdir(stats_file)) + f = open(stats_file) except IOError as e: return failBecause(str(e)) stats_file_contents = f.read() @@ -1357,7 +1360,7 @@ def simple_build(name, way, extra_hc_opts, should_fail, top_mod, link, addsuf, b # ToDo: if the sub-shell was killed by ^C, then exit if isCompilerStatsTest(): - statsResult = check_stats(name, way, stats_file, opts.stats_range_fields) + statsResult = check_stats(name, way, in_testdir(stats_file), opts.stats_range_fields) if badResult(statsResult): return statsResult @@ -1442,7 +1445,7 @@ def simple_run(name, way, prog, extra_run_opts): if check_prof and not check_prof_ok(name, way): return failBecause('bad profile') - return check_stats(name, way, stats_file, opts.stats_range_fields) + return check_stats(name, way, in_testdir(stats_file), opts.stats_range_fields) def rts_flags(way): args = config.way_rts_flags.get(way, []) @@ -2103,6 +2106,9 @@ def in_testdir(name, suffix=''): def in_srcdir(name, suffix=''): return os.path.join(getTestOpts().srcdir, add_suffix(name, suffix)) +def in_statsdir(name, suffix=''): + return os.path.join(config.stats_files_dir, add_suffix(name, suffix)) + # Finding the sample output. The filename is of the form # # <test>.stdout[-ws-<wordsize>][-<platform>|-<os>] diff --git a/testsuite/mk/test.mk b/testsuite/mk/test.mk index b1d716fd77..6860974c54 100644 --- a/testsuite/mk/test.mk +++ b/testsuite/mk/test.mk @@ -278,6 +278,8 @@ RUNTEST_OPTS += \ --config 'gs=$(call quote_path,$(GS))' \ --config 'timeout_prog=$(call quote_path,$(TIMEOUT_PROGRAM))' +RUNTEST_OPTS += --config 'stats_files_dir=$(TOP)/tests/perf/haddock' + RUNTEST_OPTS += -e "config.stage=$(GhcStage)" ifneq "$(METRICS_FILE)" "" diff --git a/testsuite/tests/perf/haddock/all.T b/testsuite/tests/perf/haddock/all.T index fca30366f9..929a7fd972 100644 --- a/testsuite/tests/perf/haddock/all.T +++ b/testsuite/tests/perf/haddock/all.T @@ -1,27 +1,39 @@ +# Note [Haddock runtime stats files] +# +# When one of the build systems builds a complete GHC distribution, +# haddock gets built and then used to generate .haddock files for each +# library. For that last step, both build systems pass an extra +# `+RTS -t<some path>.t` to record runtime statistics to the given path. +# +# Those .t files are then used by a few haddock perf tests (which all live +# under testsuite/tests/perf/haddock/). Since each build system needs to produce +# those files in different places, the testsuite driver takes the directory +# under which those files are placed as a configuration parameter, +# `config.stats_files_dir`. Each individual test then specifies the name of +# the (runtime statistics) file against which some checks are to be performed, +# in addition to declaring the test's type to be `static_stats`. + # We do not add peak_megabytes_allocated and max_bytes_used to these tests, as # they are somewhat unreliable, and it is harder to re-run these numbers to # detect outliers, as described in Note [residency]. See #9556. test('haddock.base', - [extra_files(['../../../../libraries/base/dist-install/haddock.t']), - unless(in_tree_compiler(), skip), req_haddock + [unless(in_tree_compiler(), skip), req_haddock ,collect_stats('bytes allocated',5) ], - stats, - ['haddock.t']) + static_stats, + ['base.t']) test('haddock.Cabal', - [extra_files(['../../../../libraries/Cabal/Cabal/dist-install/haddock.t']), - unless(in_tree_compiler(), skip), req_haddock + [unless(in_tree_compiler(), skip), req_haddock ,collect_stats('bytes allocated',5) ], - stats, - ['haddock.t']) + static_stats, + ['Cabal.t']) test('haddock.compiler', - [extra_files(['../../../../compiler/stage2/haddock.t']), - unless(in_tree_compiler(), skip), req_haddock + [unless(in_tree_compiler(), skip), req_haddock ,collect_stats('bytes allocated',10) ], - stats, - ['haddock.t']) + static_stats, + ['ghc.t']) |