From a05bb1d6a1d963d14cb0bafade1e7c1072ac94a5 Mon Sep 17 00:00:00 2001 From: Matthew Pickering Date: Mon, 27 Sep 2021 16:24:57 +0100 Subject: Recompilation: Handle -plugin-package correctly If a plugins was specified using the -plugin-package-(id) flag then the module it applied to was always recompiled. The recompilation checker was previously using `findImportedModule`, which looked for packages in the HPT and then in the package database but only for modules specified using `-package`. The correct lookup function for plugins is `findPluginModule`, therefore we check normal imports with `findImportedModule` and plugins with `findPluginModule`. Fixes #20417 --- compiler/GHC/Iface/Recomp.hs | 14 +++++++++----- testsuite/tests/plugins/Makefile | 6 ++++++ testsuite/tests/plugins/T20417.stderr | 3 +++ testsuite/tests/plugins/all.T | 7 +++++++ 4 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 testsuite/tests/plugins/T20417.stderr diff --git a/compiler/GHC/Iface/Recomp.hs b/compiler/GHC/Iface/Recomp.hs index 4cc03d488d..6bbf8f58cb 100644 --- a/compiler/GHC/Iface/Recomp.hs +++ b/compiler/GHC/Iface/Recomp.hs @@ -506,11 +506,9 @@ checkMergedSignatures hsc_env mod_summary iface = do checkDependencies :: HscEnv -> ModSummary -> ModIface -> IfG RecompileRequired checkDependencies hsc_env summary iface = do - res <- liftIO $ traverse (\(mb_pkg, L _ mod) -> - let reason = ModuleChanged mod - in classify reason <$> findImportedModule fc fopts units home_unit mod (mb_pkg)) - (ms_imps summary ++ ms_srcimps summary) - case sequence (res ++ [Right (fake_ghc_prim_import)| ms_ghc_prim_import summary]) of + res_normal <- classify_import (findImportedModule fc fopts units home_unit) (ms_textual_imps summary ++ ms_srcimps summary) + res_plugin <- classify_import (\mod _ -> findPluginModule fc fopts units home_unit mod) (ms_plugin_imps summary) + case sequence (res_normal ++ res_plugin ++ [Right (fake_ghc_prim_import)| ms_ghc_prim_import summary]) of Left recomp -> return recomp Right es -> do let (hs, ps) = partitionEithers es @@ -520,6 +518,12 @@ checkDependencies hsc_env summary iface res2 <- liftIO $ check_packages allPkgDeps prev_dep_pkgs return (res1 `mappend` res2) where + + classify_import find_import imports = + liftIO $ traverse (\(mb_pkg, L _ mod) -> + let reason = ModuleChanged mod + in classify reason <$> find_import mod mb_pkg) + imports dflags = hsc_dflags hsc_env fopts = initFinderOpts dflags logger = hsc_logger hsc_env diff --git a/testsuite/tests/plugins/Makefile b/testsuite/tests/plugins/Makefile index e242a0a387..710cf827ec 100644 --- a/testsuite/tests/plugins/Makefile +++ b/testsuite/tests/plugins/Makefile @@ -146,3 +146,9 @@ plugin-recomp-change-2: "$(TEST_HC)" $(TEST_HC_OPTS) $(ghcPluginWayFlags) -v0 plugin-recomp-test.hs PluginRecompTest.hs -package-db plugin-recomp/pkg.plugins01/local.package.conf -fplugin PurePlugin "$(MAKE)" -s --no-print-directory -C plugin-recomp package.plugins01 TOP=$(TOP) RUN=-DRUN2 "$(TEST_HC)" $(TEST_HC_OPTS) $(ghcPluginWayFlags) -v0 plugin-recomp-test.hs PluginRecompTest.hs -package-db plugin-recomp/pkg.plugins01/local.package.conf -fplugin PurePlugin + +# Shouldn't recompile the module because the plugin is pure and nothing changed. +.PHONY: T20417 +T20417: + "$(TEST_HC)" $(TEST_HC_OPTS) $(ghcPluginWayFlags) -v0 plugin-recomp-test.hs -package-db plugin-recomp/pkg.plugins01/local.package.conf -hide-all-packages -package base -plugin-package plugin-recompilation-0.1 -fplugin PurePlugin + "$(TEST_HC)" $(TEST_HC_OPTS) $(ghcPluginWayFlags) -v0 plugin-recomp-test.hs -package-db plugin-recomp/pkg.plugins01/local.package.conf -hide-all-packages -package base -plugin-package plugin-recompilation-0.1 -fplugin PurePlugin diff --git a/testsuite/tests/plugins/T20417.stderr b/testsuite/tests/plugins/T20417.stderr new file mode 100644 index 0000000000..84e15cfa91 --- /dev/null +++ b/testsuite/tests/plugins/T20417.stderr @@ -0,0 +1,3 @@ +Simple Plugin Passes Queried +Got options: +Simple Plugin Pass Run diff --git a/testsuite/tests/plugins/all.T b/testsuite/tests/plugins/all.T index fc0abca043..0242ab7d93 100644 --- a/testsuite/tests/plugins/all.T +++ b/testsuite/tests/plugins/all.T @@ -240,3 +240,10 @@ test('plugin-recomp-change-2', pre_cmd('$MAKE -s --no-print-directory -C plugin-recomp package.plugins01 TOP={top}') ], makefile_test, []) + +test('T20417', + [extra_files(['plugin-recomp/', 'plugin-recomp-test.hs']), + only_ways([config.ghc_plugin_way]), + pre_cmd('$MAKE -s --no-print-directory -C plugin-recomp package.plugins01 TOP={top}') + ], + makefile_test, []) -- cgit v1.2.1