seqaid: Dynamic strictness control, including space leak repair
Seqaid is a GHC plugin providing non-invasive auto-instrumentation of Haskell projects, for dynamic strictness (and parallelism) control. This will soon include optimisation for automated space leak relief using minimal strictification. [The optimiser is still in development however.]
Refer to the seqaid homepage for more information.
Please share your comments on this reddit discussion.
[Skip to Readme]
|Versions [faq]||0.1.1, 0.1.2, 0.1.3, 0.1.4, 0.1.5, 0.1.6.0, 0.1.7.0, 0.2.0.0, 0.2.1.0, 0.2.1.1, 0.3.0.0, 0.3.0.1, 0.4.0.0|
|Dependencies||array (>=0.4 && <0.6), base (==4.*), Cabal (>=1.10), containers (==0.5.*), cpphs (>=1.14), deepseq-bounded (>=0.6 && <0.8), directory (==1.2.*), exceptions (==0.5.*), filepath (==1.3.*), ghc (>=7.6 && <7.10), ghc-paths (==0.1.*), mtl (==2.*), process (==1.*), regex-base (<=0.93.2), regex-pcre (<=0.94.4), syb (<=0.4.2), template-haskell (==2.9.*), temporary (==1.2.*), transformers (==0.3.*) [details]|
|Author||Andrew G. Seniuk|
|Maintainer||Andrew Seniuk <email@example.com>|
|Uploaded||by AndrewSeniuk at Sat Jan 31 15:54:19 UTC 2015|
|Downloads||6146 total (428 in the last 30 days)|
|Rating||(no votes yet) [estimated by Bayesian average]|
Docs uploaded by user
Build status unknown [no reports yet]
(Still broken for GHC 7.10.) Until I learn how to test GHC version in the .cabal file, we need a flag, since some build-depends must be excluded completely. (CPP testing GLASGOW_HASKELL is then used the rest of the way, in the source files.)
If we can prevent inlining of injected binds (without requiring user edits), that would probably be a good trade-off in terms of lost optimiser opportunities in exchange for assurance that the bind won't be inlined. This didn't work, and is a poor solution anyway.
Like NFDATAN_ONLY, but for newer Seqable module.
Actually this is just preparatory, haven't gone down this road far yet. (We would like a TH.Type to Type.Type conversion function in the GHC API. Then we'd just send the list of Type.Type for direct use by the Core-plugin downstream).
Rather than choose types to seqinj for based on the types of the top-level binds, use seqaidpp to parse the types from seqaid.config. This stays on perpetually, finally, and could be removed soon.
If True, then TH will be used as it has been, to blanket-inject all top-level functions (at least, those not explicitly or implicitly excluded). Now, if False, only RHS's with result types in the "types" list for the module (in seqaid.config) will be wrapped (again, at least those not explicitly or implicitly excluded).
This is the only working mode so far. (And it only works when tested on the "leaky" package.) The switch exists to exclude hashable/hashtables deps (and subdeps) from the first release, while I can continue to work on this aspect in the development head.
When set, seqaidDispatch emits status lines periodically.
If have to inject a class and instance anyway to evade DCE, no need for the old top-level seqinj_ declarations (we hope...). (But it turned out they were all still needed.)
To simplify debugging.
Include Typeable instance for (show . typeOf) in seqaidDispatch
Non-manual flag to allow the build system to try cpphs first, and if that fails, then to try system-wide cpp (typically GNU). I've actually toggled the default, so the build system will try for a system-wide cpp first, and failing that, will try to use cpphs, installing it if necessary. I prefer cpp. I am not getting my most invaluable -Wundef option with cpphs using -optP-Wundef -optP--cpp in my ghc-options. Does cpphs implement it? Not sure...
Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info
For package maintainers and hackage trustees