Brandon Chinn pushed to branch wip/T26961 at Glasgow Haskell Compiler / GHC
Commits:
-
9a9ae4df
by Duncan Coutts at 2026-05-05T14:44:37-04:00
-
2ad3e01e
by Duncan Coutts at 2026-05-05T14:44:37-04:00
-
8ff4fdb5
by David Eichmann at 2026-05-05T14:44:37-04:00
-
96974723
by Teo Camarasu at 2026-05-05T14:45:20-04:00
-
eff6bfaf
by Teo Camarasu at 2026-05-05T14:45:20-04:00
-
1cb1d672
by Wen Kokke at 2026-05-06T09:53:40-04:00
-
9d54dc94
by Wen Kokke at 2026-05-06T09:53:40-04:00
-
418d737b
by Wen Kokke at 2026-05-06T09:53:40-04:00
-
99f4afa4
by Wen Kokke at 2026-05-06T09:53:40-04:00
-
7e9eb8b9
by Wen Kokke at 2026-05-06T09:53:40-04:00
-
3a3045fb
by Wen Kokke at 2026-05-06T09:53:41-04:00
-
a3b339a4
by Teo Camarasu at 2026-05-06T09:54:25-04:00
-
fcd24663
by Brandon Chinn at 2026-05-07T13:26:57-07:00
-
c7466bcc
by Brandon Chinn at 2026-05-07T13:27:03-07:00
-
4d31f85d
by Brandon Chinn at 2026-05-07T13:27:04-07:00
24 changed files:
- + changelog.d/T27022
- + changelog.d/dynamic-trace-flags
- hadrian/src/Settings/Packages.hs
- libraries/base/base.cabal.in
- libraries/base/changelog.md
- + libraries/base/src/Data/RealFloat.hs
- libraries/ghci/GHCi/TH.hs
- rts/IOManager.h
- rts/Linker.c
- rts/LinkerInternals.h
- rts/RtsSymbols.c
- rts/RtsSymbols.h
- rts/Trace.c
- rts/Trace.h
- rts/include/rts/EventLogWriter.h
- rts/linker/Elf.c
- rts/sm/NonMoving.c
- testsuite/tests/interface-stability/base-exports.stdout
- testsuite/tests/interface-stability/base-exports.stdout-javascript-unknown-ghcjs
- testsuite/tests/interface-stability/base-exports.stdout-mingw32
- − testsuite/tests/interface-stability/base-exports.stdout-ws-32
- + testsuite/tests/th/T27022.hs
- + testsuite/tests/th/T27022.stdout
- testsuite/tests/th/all.T
Changes:
| 1 | +section: compiler
|
|
| 2 | +synopsis: Fix a divergence in the interaction between ``recover`` and ``putQ`` between the internal and external interpreter
|
|
| 3 | +description: The ``recover`` method in TemplateHaskell now behaves the same
|
|
| 4 | + with the internal and external interpreter.
|
|
| 5 | + In the past, when an error was encountered in a computation in a ``recover`` block,
|
|
| 6 | + the external interpreter would discard any state changes from ``putQ``,
|
|
| 7 | + whereas the internal interpreter would not.
|
|
| 8 | + This was a long-standing error in the implementation of the external interpreter.
|
|
| 9 | + Both now keep state changes from ``putQ`` in ``recover`` blocks.
|
|
| 10 | +mrs: !15994
|
|
| 11 | +issues: #27022 |
| 1 | +section: compiler
|
|
| 2 | +synopsis: Support dynamic trace flags in RTS
|
|
| 3 | +issues: #27186
|
|
| 4 | +mrs: !15936
|
|
| 5 | + |
|
| 6 | +description: {
|
|
| 7 | + The RTS API now exposes the `RUNTIME_TRACE_FLAG` type and
|
|
| 8 | + the `getTraceFlags` and `setTraceFlags` functions that can be used to
|
|
| 9 | + change the trace flags at runtime.
|
|
| 10 | +} |
| ... | ... | @@ -322,6 +322,7 @@ rtsPackageArgs = package rts ? do |
| 322 | 322 | , Profiling `wayUnit` way ? arg "-DPROFILING"
|
| 323 | 323 | , Threaded `wayUnit` way ? arg "-DTHREADED_RTS"
|
| 324 | 324 | , notM targetSupportsSMP ? arg "-optc-DNOSMP"
|
| 325 | + , isWinHost ? arg "-optl-Wl,--disable-runtime-pseudo-reloc"
|
|
| 325 | 326 | |
| 326 | 327 | -- See Note [AutoApply.cmm for vectors] in genapply/Main.hs
|
| 327 | 328 | --
|
| ... | ... | @@ -111,6 +111,7 @@ Library |
| 111 | 111 | , Data.Monoid
|
| 112 | 112 | , Data.Ord
|
| 113 | 113 | , Data.Proxy
|
| 114 | + , Data.RealFloat
|
|
| 114 | 115 | , Data.STRef
|
| 115 | 116 | , Data.STRef.Strict
|
| 116 | 117 | , Data.String
|
| ... | ... | @@ -2,6 +2,8 @@ |
| 2 | 2 | |
| 3 | 3 | ## 4.24.0.0 *TBA*
|
| 4 | 4 | * Add `Bounded` instances for `Double`, `Float`, `CDouble` and `CFloat`. ([CLC proposal #402](https://github.com/haskell/core-libraries-committee/issues/402))
|
| 5 | + * Add new `Data.RealFloat` module re-exporting `RealFloat` from `GHC.Float` ([CLC proposal #394](https://github.com/haskell/core-libraries-committee/issues/394))
|
|
| 6 | + * Add `Infinity`, `NegInfinity`, and `NaN` pattern synonyms to `Data.RealFloat` ([CLC proposal #394](https://github.com/haskell/core-libraries-committee/issues/394))
|
|
| 5 | 7 | |
| 6 | 8 | ## 4.23.0.0 *TBA*
|
| 7 | 9 | * Add `System.IO.hGetNewlineMode`. ([CLC proposal #370](https://github.com/haskell/core-libraries-committee/issues/370))
|
| 1 | +{-# LANGUAGE PatternSynonyms #-}
|
|
| 2 | +{-# LANGUAGE Safe #-}
|
|
| 3 | +{-# LANGUAGE ViewPatterns #-}
|
|
| 4 | + |
|
| 5 | +-- |
|
|
| 6 | +--
|
|
| 7 | +-- Module : Data.RealFloat
|
|
| 8 | +-- Copyright : (c) The University of Glasgow 2026
|
|
| 9 | +-- License : BSD-style (see the file libraries/base/LICENSE)
|
|
| 10 | +--
|
|
| 11 | +-- Maintainer : libraries@haskell.org
|
|
| 12 | +-- Stability : stable
|
|
| 13 | +-- Portability : portable
|
|
| 14 | +--
|
|
| 15 | + |
|
| 16 | +module Data.RealFloat (
|
|
| 17 | + RealFloat (..),
|
|
| 18 | + |
|
| 19 | + -- * Infinity + NaN
|
|
| 20 | + pattern Infinity,
|
|
| 21 | + pattern NegInfinity,
|
|
| 22 | + pattern NaN,
|
|
| 23 | +) where
|
|
| 24 | + |
|
| 25 | +import Data.Bool (Bool (..), (&&))
|
|
| 26 | +import GHC.Internal.Data.Ord ((<), (>))
|
|
| 27 | +import GHC.Internal.Float (RealFloat (..))
|
|
| 28 | +import GHC.Internal.Real ((/))
|
|
| 29 | + |
|
| 30 | +pattern Infinity :: (RealFloat a) => a
|
|
| 31 | +pattern Infinity <- ((\x -> isInfinite x && x > 0) -> True) where Infinity = 1/0
|
|
| 32 | + |
|
| 33 | +-- | Negative infinity
|
|
| 34 | +--
|
|
| 35 | +-- Provided for convenience. Could also use the following instead:
|
|
| 36 | +-- * Pattern matching: @(negate -> Infinity)@
|
|
| 37 | +-- * Expressions: @-Infinity@
|
|
| 38 | +pattern NegInfinity :: (RealFloat a) => a
|
|
| 39 | +pattern NegInfinity <- ((\x -> isInfinite x && x < 0) -> True) where NegInfinity = -1/0
|
|
| 40 | + |
|
| 41 | +-- | A pattern synonym for NaN values.
|
|
| 42 | +--
|
|
| 43 | +-- Note: Per IEEE 754, NaN is never equal to itself, thus these two snippets
|
|
| 44 | +-- have different behavior:
|
|
| 45 | +--
|
|
| 46 | +-- @
|
|
| 47 | +-- -- foo1 NaN == "a"
|
|
| 48 | +-- foo1 NaN = "a"
|
|
| 49 | +-- foo1 _ = "b"
|
|
| 50 | +--
|
|
| 51 | +-- -- foo2 NaN == "b"
|
|
| 52 | +-- foo2 x = if x == NaN then "a" else "b"
|
|
| 53 | +-- @
|
|
| 54 | +pattern NaN :: (RealFloat a) => a
|
|
| 55 | +pattern NaN <- (isNaN -> True) where NaN = 0/0 |
| ... | ... | @@ -119,7 +119,7 @@ initQState :: Pipe -> QState |
| 119 | 119 | initQState p = QState M.empty Nothing p
|
| 120 | 120 | |
| 121 | 121 | -- | The monad in which we run TH computations on the server
|
| 122 | -newtype GHCiQ a = GHCiQ { runGHCiQ :: QState -> IO (a, QState) }
|
|
| 122 | +newtype GHCiQ a = GHCiQ { runGHCiQ :: IORef QState -> IO a }
|
|
| 123 | 123 | |
| 124 | 124 | -- | The exception thrown by "fail" in the GHCiQ monad
|
| 125 | 125 | data GHCiQException = GHCiQException QState String
|
| ... | ... | @@ -128,52 +128,54 @@ data GHCiQException = GHCiQException QState String |
| 128 | 128 | instance Exception GHCiQException
|
| 129 | 129 | |
| 130 | 130 | instance Functor GHCiQ where
|
| 131 | - fmap f (GHCiQ s) = GHCiQ $ fmap (\(x,s') -> (f x,s')) . s
|
|
| 131 | + fmap f (GHCiQ m) = GHCiQ $ fmap f . m
|
|
| 132 | 132 | |
| 133 | 133 | instance Applicative GHCiQ where
|
| 134 | 134 | f <*> a = GHCiQ $ \s ->
|
| 135 | - do (f',s') <- runGHCiQ f s
|
|
| 136 | - (a',s'') <- runGHCiQ a s'
|
|
| 137 | - return (f' a', s'')
|
|
| 138 | - pure x = GHCiQ (\s -> return (x,s))
|
|
| 135 | + do f' <- runGHCiQ f s
|
|
| 136 | + a' <- runGHCiQ a s
|
|
| 137 | + return $ f' a'
|
|
| 138 | + pure x = GHCiQ $ \_ -> return x
|
|
| 139 | 139 | |
| 140 | 140 | instance Monad GHCiQ where
|
| 141 | 141 | m >>= f = GHCiQ $ \s ->
|
| 142 | - do (m', s') <- runGHCiQ m s
|
|
| 143 | - (a, s'') <- runGHCiQ (f m') s'
|
|
| 144 | - return (a, s'')
|
|
| 142 | + do m' <- runGHCiQ m s
|
|
| 143 | + a <- runGHCiQ (f m') s
|
|
| 144 | + return a
|
|
| 145 | 145 | |
| 146 | 146 | instance MonadFail GHCiQ where
|
| 147 | - fail err = GHCiQ $ \s -> throwIO (GHCiQException s err)
|
|
| 147 | + fail err = GHCiQ $ \sRef -> readIORef sRef >>= \s -> throwIO (GHCiQException s err)
|
|
| 148 | 148 | |
| 149 | 149 | getState :: GHCiQ QState
|
| 150 | -getState = GHCiQ $ \s -> return (s,s)
|
|
| 150 | +getState = GHCiQ $ \sRef -> readIORef sRef
|
|
| 151 | 151 | |
| 152 | 152 | noLoc :: TH.Loc
|
| 153 | 153 | noLoc = TH.Loc "<no file>" "<no package>" "<no module>" (0,0) (0,0)
|
| 154 | 154 | |
| 155 | 155 | -- | Send a 'THMessage' to GHC and return the result.
|
| 156 | 156 | ghcCmd :: Binary a => THMessage (THResult a) -> GHCiQ a
|
| 157 | -ghcCmd m = GHCiQ $ \s -> do
|
|
| 157 | +ghcCmd m = GHCiQ $ \sRef -> do
|
|
| 158 | + s <- readIORef sRef
|
|
| 158 | 159 | r <- remoteTHCall (qsPipe s) m
|
| 159 | 160 | case r of
|
| 160 | 161 | THException str -> throwIO (GHCiQException s str)
|
| 161 | - THComplete res -> return (res, s)
|
|
| 162 | + THComplete res -> return res
|
|
| 162 | 163 | |
| 163 | 164 | instance MonadIO GHCiQ where
|
| 164 | - liftIO m = GHCiQ $ \s -> fmap (,s) m
|
|
| 165 | + liftIO m = GHCiQ $ \_ -> m
|
|
| 165 | 166 | |
| 166 | 167 | instance TH.Quasi GHCiQ where
|
| 167 | 168 | qNewName str = ghcCmd (NewName str)
|
| 168 | 169 | qReport isError msg = ghcCmd (Report isError msg)
|
| 169 | 170 | |
| 170 | 171 | -- See Note [TH recover with -fexternal-interpreter] in GHC.Tc.Gen.Splice
|
| 171 | - qRecover (GHCiQ h) a = GHCiQ $ \s -> mask $ \unmask -> do
|
|
| 172 | + qRecover (GHCiQ h) a = GHCiQ $ \sRef -> mask $ \unmask -> do
|
|
| 173 | + s <- readIORef sRef
|
|
| 172 | 174 | remoteTHCall (qsPipe s) StartRecover
|
| 173 | - e <- try $ unmask $ runGHCiQ (a <* ghcCmd FailIfErrs) s
|
|
| 175 | + e <- try $ unmask $ runGHCiQ (a <* ghcCmd FailIfErrs) sRef
|
|
| 174 | 176 | remoteTHCall (qsPipe s) (EndRecover (isLeft e))
|
| 175 | 177 | case e of
|
| 176 | - Left GHCiQException{} -> h s
|
|
| 178 | + Left GHCiQException{} -> h sRef
|
|
| 177 | 179 | Right r -> return r
|
| 178 | 180 | qLookupName isType occ = ghcCmd (LookupName isType occ)
|
| 179 | 181 | qReify name = ghcCmd (Reify name)
|
| ... | ... | @@ -200,15 +202,16 @@ instance TH.Quasi GHCiQ where |
| 200 | 202 | qAddTempFile suffix = ghcCmd (AddTempFile suffix)
|
| 201 | 203 | qAddTopDecls decls = ghcCmd (AddTopDecls decls)
|
| 202 | 204 | qAddForeignFilePath lang fp = ghcCmd (AddForeignFilePath lang fp)
|
| 203 | - qAddModFinalizer fin = GHCiQ (\s -> mkRemoteRef fin >>= return . (, s)) >>=
|
|
| 205 | + qAddModFinalizer fin = GHCiQ (\_ -> mkRemoteRef fin) >>=
|
|
| 204 | 206 | ghcCmd . AddModFinalizer
|
| 205 | 207 | qAddCorePlugin str = ghcCmd (AddCorePlugin str)
|
| 206 | - qGetQ = GHCiQ $ \s ->
|
|
| 208 | + qGetQ = do
|
|
| 209 | + s <- getState
|
|
| 207 | 210 | let lookup :: forall a. Typeable a => Map TypeRep Dynamic -> Maybe a
|
| 208 | 211 | lookup m = fromDynamic =<< M.lookup (typeOf (undefined::a)) m
|
| 209 | - in return (lookup (qsMap s), s)
|
|
| 210 | - qPutQ k = GHCiQ $ \s ->
|
|
| 211 | - return ((), s { qsMap = M.insert (typeOf k) (toDyn k) (qsMap s) })
|
|
| 212 | + return $ lookup (qsMap s)
|
|
| 213 | + qPutQ k = GHCiQ $ \sRef ->
|
|
| 214 | + modifyIORef' sRef (\s -> s { qsMap = M.insert (typeOf k) (toDyn k) (qsMap s) })
|
|
| 212 | 215 | qIsExtEnabled x = ghcCmd (IsExtEnabled x)
|
| 213 | 216 | qExtsEnabled = ghcCmd ExtsEnabled
|
| 214 | 217 | qPutDoc l s = ghcCmd (PutDoc l s)
|
| ... | ... | @@ -231,7 +234,8 @@ runModFinalizerRefs pipe rstate qrefs = do |
| 231 | 234 | qs <- mapM localRef qrefs
|
| 232 | 235 | qstateref <- localRef rstate
|
| 233 | 236 | qstate <- readIORef qstateref
|
| 234 | - _ <- runGHCiQ (TH.runQ $ sequence_ qs) qstate { qsPipe = pipe }
|
|
| 237 | + qstate' <- newIORef $ qstate { qsPipe = pipe }
|
|
| 238 | + _ <- runGHCiQ (TH.runQ $ sequence_ qs) qstate'
|
|
| 235 | 239 | return ()
|
| 236 | 240 | |
| 237 | 241 | -- | The implementation of the 'RunTH' message
|
| ... | ... | @@ -267,8 +271,6 @@ runTHQ |
| 267 | 271 | -> IO ByteString
|
| 268 | 272 | runTHQ pipe rstate mb_loc ghciq = do
|
| 269 | 273 | qstateref <- localRef rstate
|
| 270 | - qstate <- readIORef qstateref
|
|
| 271 | - let st = qstate { qsLocation = mb_loc, qsPipe = pipe }
|
|
| 272 | - (r,new_state) <- runGHCiQ (TH.runQ ghciq) st
|
|
| 273 | - writeIORef qstateref new_state
|
|
| 274 | + modifyIORef' qstateref (\qstate -> qstate { qsLocation = mb_loc, qsPipe = pipe })
|
|
| 275 | + r <- runGHCiQ (TH.runQ ghciq) qstateref
|
|
| 274 | 276 | return $! LB.toStrict (runPut (put r)) |
| ... | ... | @@ -21,6 +21,15 @@ |
| 21 | 21 | |
| 22 | 22 | #include "sm/GC.h" // for evac_fn
|
| 23 | 23 | |
| 24 | +#if defined(mingw32_HOST_OS)
|
|
| 25 | +/* Global var (only on Windows) that is exported (hence before BeginPrivate.h)
|
|
| 26 | + * to be shared with the I/O code in the base library to tell us which style
|
|
| 27 | + * of I/O manager we are using: one that uses the Windows native API HANDLEs,
|
|
| 28 | + * or one that uses Posix style fds.
|
|
| 29 | + */
|
|
| 30 | +extern bool rts_IOManagerIsWin32Native;
|
|
| 31 | +#endif
|
|
| 32 | + |
|
| 24 | 33 | #include "BeginPrivate.h"
|
| 25 | 34 | |
| 26 | 35 | /* The ./configure gives us a set of CPP flags, one for each named I/O manager:
|
| ... | ... | @@ -160,14 +169,6 @@ typedef enum { |
| 160 | 169 | /* Global var to tell us which I/O manager impl we are using */
|
| 161 | 170 | extern IOManagerType iomgr_type;
|
| 162 | 171 | |
| 163 | -#if defined(mingw32_HOST_OS)
|
|
| 164 | -/* Global var (only on Windows) that is exported to be shared with the I/O code
|
|
| 165 | - * in the base library to tell us which style of I/O manager we are using: one
|
|
| 166 | - * that uses the Windows native API HANDLEs, or one that uses Posix style fds.
|
|
| 167 | - */
|
|
| 168 | -extern bool rts_IOManagerIsWin32Native;
|
|
| 169 | -#endif
|
|
| 170 | - |
|
| 171 | 172 | |
| 172 | 173 | /* The CapIOManager is the per-capability data structure belonging to the I/O
|
| 173 | 174 | * manager. It is defined in full in IOManagerInternals.h. The opaque forward
|
| ... | ... | @@ -478,16 +478,7 @@ initLinker_ (int retain_cafs) |
| 478 | 478 | symhash = allocStrHashTable();
|
| 479 | 479 | |
| 480 | 480 | /* populate the symbol table with stuff from the RTS */
|
| 481 | - IF_DEBUG(linker, debugBelch("populating linker symbol table with built-in RTS symbols\n"));
|
|
| 482 | - for (const RtsSymbolVal *sym = rtsSyms; sym->lbl != NULL; sym++) {
|
|
| 483 | - IF_DEBUG(linker, debugBelch("initLinker: inserting rts symbol %s, %p\n", sym->lbl, sym->addr));
|
|
| 484 | - if (! ghciInsertSymbolTable(WSTR("(GHCi built-in symbols)"),
|
|
| 485 | - symhash, sym->lbl, sym->addr,
|
|
| 486 | - sym->strength, sym->type, 0, NULL)) {
|
|
| 487 | - barf("ghciInsertSymbolTable failed");
|
|
| 488 | - }
|
|
| 489 | - }
|
|
| 490 | - IF_DEBUG(linker, debugBelch("done with built-in RTS symbols\n"));
|
|
| 481 | + initLinkerRtsSyms(symhash);
|
|
| 491 | 482 | |
| 492 | 483 | /* Add extra symbols. rtsExtraSyms() is a weakly defined symbol in the rts,
|
| 493 | 484 | * that can be overrided by linking in an object with a corresponding
|
| ... | ... | @@ -502,4 +502,6 @@ ObjectCode* mkOc( ObjectType type, pathchar *path, char *image, int imageSize, |
| 502 | 502 | void initSegment(Segment *s, void *start, size_t size, SegmentProt prot, int n_sections);
|
| 503 | 503 | void freeSegments(ObjectCode *oc);
|
| 504 | 504 | |
| 505 | +void initLinkerRtsSyms(StrHashTable *symhash);
|
|
| 506 | + |
|
| 505 | 507 | #include "EndPrivate.h" |
| ... | ... | @@ -9,6 +9,8 @@ |
| 9 | 9 | #include "ghcplatform.h"
|
| 10 | 10 | #include "Rts.h"
|
| 11 | 11 | #include "RtsSymbols.h"
|
| 12 | +#include "LinkerInternals.h"
|
|
| 13 | +#include "PathUtils.h"
|
|
| 12 | 14 | |
| 13 | 15 | #include "TopHandler.h"
|
| 14 | 16 | #include "HsFFI.h"
|
| ... | ... | @@ -51,6 +53,20 @@ extern char **environ; |
| 51 | 53 | |
| 52 | 54 | /* -----------------------------------------------------------------------------
|
| 53 | 55 | * Symbols to be inserted into the RTS symbol table.
|
| 56 | + *
|
|
| 57 | + * Note [Naming Scheme for Symbol Macros]
|
|
| 58 | + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
| 59 | + *
|
|
| 60 | + * SymI_*: symbol is internal to the RTS. It resides in an object
|
|
| 61 | + * file/library that is linked into the RTS library (as a static
|
|
| 62 | + * archive or dynamic shared library).
|
|
| 63 | + * SymE_*: symbol is external to the RTS library. It might be linked
|
|
| 64 | + * dynamically.
|
|
| 65 | + *
|
|
| 66 | + * Sym*_HasProto : the symbol prototype is imported in an include file
|
|
| 67 | + * or defined explicitly
|
|
| 68 | + * Sym*_NeedsProto: the symbol is undefined and we add a dummy
|
|
| 69 | + * default proto extern void sym(void);
|
|
| 54 | 70 | */
|
| 55 | 71 | |
| 56 | 72 | #define Maybe_Stable_Names SymI_HasProto(stg_mkWeakzh) \
|
| ... | ... | @@ -162,7 +178,7 @@ extern char **environ; |
| 162 | 178 | SymI_HasProto(stg_asyncWritezh) \
|
| 163 | 179 | SymI_HasProto(stg_asyncDoProczh) \
|
| 164 | 180 | SymI_HasProto(rts_InstallConsoleEvent) \
|
| 165 | - SymI_HasProto(rts_IOManagerIsWin32Native) \
|
|
| 181 | + SymI_HasDataProto(rts_IOManagerIsWin32Native) \
|
|
| 166 | 182 | SymI_HasProto(rts_ConsoleHandlerDone) \
|
| 167 | 183 | SymI_NeedsProto(__mingw_module_is_dll) \
|
| 168 | 184 | RTS_WIN64_ONLY(SymI_NeedsProto(___chkstk_ms)) \
|
| ... | ... | @@ -524,7 +540,12 @@ extern char **environ; |
| 524 | 540 | SymI_HasProto(__word_encodeFloat) \
|
| 525 | 541 | SymI_HasDataProto(stg_atomicallyzh) \
|
| 526 | 542 | SymI_HasProto(barf) \
|
| 543 | + SymI_HasProto(startEventLogging) \
|
|
| 544 | + SymI_HasProto(endEventLogging) \
|
|
| 527 | 545 | SymI_HasProto(flushEventLog) \
|
| 546 | + SymI_HasProto(flushEventLog) \
|
|
| 547 | + SymI_HasProto(getTraceFlag) \
|
|
| 548 | + SymI_HasProto(setTraceFlag) \
|
|
| 528 | 549 | SymI_HasProto(deRefStablePtr) \
|
| 529 | 550 | SymI_HasProto(debugBelch) \
|
| 530 | 551 | SymI_HasProto(errorBelch) \
|
| ... | ... | @@ -914,7 +935,7 @@ extern char **environ; |
| 914 | 935 | SymI_HasProto(freeExecPage) \
|
| 915 | 936 | SymI_HasProto(getAllocations) \
|
| 916 | 937 | SymI_HasProto(revertCAFs) \
|
| 917 | - SymI_HasProto(RtsFlags) \
|
|
| 938 | + SymI_HasDataProto(RtsFlags) \
|
|
| 918 | 939 | SymI_NeedsDataProto(rts_breakpoint_io_action) \
|
| 919 | 940 | SymI_NeedsDataProto(rts_stop_next_breakpoint) \
|
| 920 | 941 | SymI_NeedsDataProto(rts_stop_on_exception) \
|
| ... | ... | @@ -925,9 +946,9 @@ extern char **environ; |
| 925 | 946 | SymI_NeedsProto(rts_enableStopAfterReturn) \
|
| 926 | 947 | SymI_NeedsProto(rts_disableStopAfterReturn) \
|
| 927 | 948 | SymI_HasProto(stopTimer) \
|
| 928 | - SymI_HasProto(n_capabilities) \
|
|
| 929 | - SymI_HasProto(max_n_capabilities) \
|
|
| 930 | - SymI_HasProto(enabled_capabilities) \
|
|
| 949 | + SymI_HasDataProto(n_capabilities) \
|
|
| 950 | + SymI_HasDataProto(max_n_capabilities) \
|
|
| 951 | + SymI_HasDataProto(enabled_capabilities) \
|
|
| 931 | 952 | SymI_HasDataProto(stg_traceEventzh) \
|
| 932 | 953 | SymI_HasDataProto(stg_traceMarkerzh) \
|
| 933 | 954 | SymI_HasDataProto(stg_traceBinaryEventzh) \
|
| ... | ... | @@ -1145,12 +1166,27 @@ extern char **environ; |
| 1145 | 1166 | SymI_HasProto(hs_word2float64)
|
| 1146 | 1167 | |
| 1147 | 1168 | |
| 1148 | -/* entirely bogus claims about types of these symbols */
|
|
| 1149 | -#define SymI_NeedsProto(vvv) extern void vvv(void);
|
|
| 1150 | -#define SymI_NeedsDataProto(vvv) extern StgWord vvv[];
|
|
| 1151 | -#define SymE_NeedsProto(vvv) SymI_NeedsProto(vvv);
|
|
| 1152 | -#define SymE_NeedsDataProto(vvv) SymI_NeedsDataProto(vvv);
|
|
| 1153 | -#define SymE_HasProto(vvv) SymI_HasProto(vvv);
|
|
| 1169 | +/* Declare prototypes for the symbols that need it, so we can refer
|
|
| 1170 | + * to them in the rtsSyms table below.
|
|
| 1171 | + *
|
|
| 1172 | + * In particular, for the external ones (SymE_*) we use the dllimport attribute
|
|
| 1173 | + * to indicate that (on Windows) they come from external DLLs. This attribute
|
|
| 1174 | + * is ignored on other platforms.
|
|
| 1175 | + *
|
|
| 1176 | + * The claims about the types of these symbols are entirely bogus.
|
|
| 1177 | + */
|
|
| 1178 | +#if defined(mingw32_HOST_OS) && defined(DYNAMIC)
|
|
| 1179 | +#define DLLIMPORT __attribute__((dllimport))
|
|
| 1180 | +#else
|
|
| 1181 | +#define DLLIMPORT /**/
|
|
| 1182 | +#endif
|
|
| 1183 | + |
|
| 1184 | +#define SymI_NeedsProto(vvv) extern void vvv(void);
|
|
| 1185 | +#define SymI_NeedsDataProto(vvv) extern StgWord vvv[];
|
|
| 1186 | +#define SymE_NeedsProto(vvv) extern DLLIMPORT void vvv(void);
|
|
| 1187 | +#define SymE_NeedsDataProto(vvv) extern DLLIMPORT StgWord vvv[];
|
|
| 1188 | + |
|
| 1189 | +#define SymE_HasProto(vvv) /**/
|
|
| 1154 | 1190 | #define SymI_HasProto(vvv) /**/
|
| 1155 | 1191 | #define SymI_HasDataProto(vvv) /**/
|
| 1156 | 1192 | #define SymI_HasProto_redirect(vvv,xxx,strength,ty) /**/
|
| ... | ... | @@ -1179,6 +1215,8 @@ RTS_SYMBOLS_PRIM |
| 1179 | 1215 | #undef SymE_NeedsProto
|
| 1180 | 1216 | #undef SymE_NeedsDataProto
|
| 1181 | 1217 | |
| 1218 | +/* See Note [Naming Scheme for Symbol Macros] */
|
|
| 1219 | + |
|
| 1182 | 1220 | #define SymI_HasProto(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \
|
| 1183 | 1221 | (void*)(&(vvv)), STRENGTH_NORMAL, SYM_TYPE_CODE },
|
| 1184 | 1222 | #define SymI_HasDataProto(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \
|
| ... | ... | @@ -1199,7 +1237,16 @@ RTS_SYMBOLS_PRIM |
| 1199 | 1237 | { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \
|
| 1200 | 1238 | (void*)(&(xxx)), strength, ty },
|
| 1201 | 1239 | |
| 1202 | -RtsSymbolVal rtsSyms[] = {
|
|
| 1240 | + |
|
| 1241 | + |
|
| 1242 | +/* Initialize (if not already initialized) and return an array of symbols with stuff from the RTS. */
|
|
| 1243 | +void initLinkerRtsSyms (StrHashTable *symhash) {
|
|
| 1244 | + /* The address of data symbols with the dllimport attribute are not
|
|
| 1245 | + * compile-time constants and so cannot be used in constant initialisers.
|
|
| 1246 | + * For this reason, rtsSyms is a local variable within this function
|
|
| 1247 | + * rather than a global constant (as it was historically).
|
|
| 1248 | + */
|
|
| 1249 | + const RtsSymbolVal rtsSyms[] = {
|
|
| 1203 | 1250 | RTS_SYMBOLS
|
| 1204 | 1251 | RTS_RET_SYMBOLS
|
| 1205 | 1252 | RTS_POSIX_ONLY_SYMBOLS
|
| ... | ... | @@ -1214,7 +1261,20 @@ RtsSymbolVal rtsSyms[] = { |
| 1214 | 1261 | RTS_SYMBOLS_PRIM
|
| 1215 | 1262 | SymI_HasDataProto(nonmoving_write_barrier_enabled)
|
| 1216 | 1263 | { 0, 0, STRENGTH_NORMAL, SYM_TYPE_CODE } /* sentinel */
|
| 1217 | -};
|
|
| 1264 | + };
|
|
| 1265 | + |
|
| 1266 | + IF_DEBUG(linker, debugBelch("populating linker symbol table with built-in RTS symbols\n"));
|
|
| 1267 | + for (const RtsSymbolVal *sym = rtsSyms; sym->lbl != NULL; sym++) {
|
|
| 1268 | + IF_DEBUG(linker, debugBelch("initLinker: inserting rts symbol %s, %p\n", sym->lbl, sym->addr));
|
|
| 1269 | + if (! ghciInsertSymbolTable(WSTR("(GHCi built-in symbols)"),
|
|
| 1270 | + symhash, sym->lbl, sym->addr,
|
|
| 1271 | + sym->strength, sym->type, 0, NULL)) {
|
|
| 1272 | + barf("ghciInsertSymbolTable failed");
|
|
| 1273 | + }
|
|
| 1274 | + }
|
|
| 1275 | + IF_DEBUG(linker, debugBelch("done with built-in RTS symbols\n"));
|
|
| 1276 | +}
|
|
| 1277 | + |
|
| 1218 | 1278 | |
| 1219 | 1279 | |
| 1220 | 1280 | // Note [Extra RTS symbols]
|
| ... | ... | @@ -46,8 +46,6 @@ typedef struct _RtsSymbolVal { |
| 46 | 46 | SymType type;
|
| 47 | 47 | } RtsSymbolVal;
|
| 48 | 48 | |
| 49 | -extern RtsSymbolVal rtsSyms[];
|
|
| 50 | - |
|
| 51 | 49 | extern RtsSymbolVal* __attribute__((weak)) rtsExtraSyms(void);
|
| 52 | 50 | |
| 53 | 51 | /* See Note [_iob_func symbol]. */
|
| ... | ... | @@ -29,14 +29,54 @@ |
| 29 | 29 | #include <unistd.h>
|
| 30 | 30 | #endif
|
| 31 | 31 | |
| 32 | -// events
|
|
| 33 | -uint8_t TRACE_sched;
|
|
| 34 | -uint8_t TRACE_gc;
|
|
| 35 | -uint8_t TRACE_nonmoving_gc;
|
|
| 36 | -uint8_t TRACE_spark_sampled;
|
|
| 37 | -uint8_t TRACE_spark_full;
|
|
| 38 | -uint8_t TRACE_user;
|
|
| 39 | -uint8_t TRACE_cap;
|
|
| 32 | +RUNTIME_TRACE_FLAG_CACHE RuntimeTraceFlagCache = {0};
|
|
| 33 | + |
|
| 34 | +bool getTraceFlag(RUNTIME_TRACE_FLAG flag) {
|
|
| 35 | + switch (flag) {
|
|
| 36 | + case TRACE_SCHEDULER:
|
|
| 37 | + return RuntimeTraceFlagCache.scheduler;
|
|
| 38 | + case TRACE_GC:
|
|
| 39 | + return RuntimeTraceFlagCache.gc;
|
|
| 40 | + case TRACE_NONMOVING_GC:
|
|
| 41 | + return RuntimeTraceFlagCache.nonmoving_gc;
|
|
| 42 | + case TRACE_SPARK_SAMPLED:
|
|
| 43 | + return RuntimeTraceFlagCache.spark_sampled;
|
|
| 44 | + case TRACE_SPARK_FULL:
|
|
| 45 | + return RuntimeTraceFlagCache.spark_full;
|
|
| 46 | + case TRACE_USER:
|
|
| 47 | + return RuntimeTraceFlagCache.user;
|
|
| 48 | + case TRACE_CAP:
|
|
| 49 | + return RuntimeTraceFlagCache.cap;
|
|
| 50 | + default:
|
|
| 51 | + return false;
|
|
| 52 | + }
|
|
| 53 | +}
|
|
| 54 | + |
|
| 55 | +void setTraceFlag(RUNTIME_TRACE_FLAG flag, bool value) {
|
|
| 56 | + switch (flag) {
|
|
| 57 | + case TRACE_SCHEDULER:
|
|
| 58 | + RuntimeTraceFlagCache.scheduler = value;
|
|
| 59 | + break;
|
|
| 60 | + case TRACE_GC:
|
|
| 61 | + RuntimeTraceFlagCache.gc = value;
|
|
| 62 | + break;
|
|
| 63 | + case TRACE_NONMOVING_GC:
|
|
| 64 | + RuntimeTraceFlagCache.nonmoving_gc = value;
|
|
| 65 | + break;
|
|
| 66 | + case TRACE_SPARK_SAMPLED:
|
|
| 67 | + RuntimeTraceFlagCache.spark_sampled = value;
|
|
| 68 | + break;
|
|
| 69 | + case TRACE_SPARK_FULL:
|
|
| 70 | + RuntimeTraceFlagCache.spark_full = value;
|
|
| 71 | + break;
|
|
| 72 | + case TRACE_USER:
|
|
| 73 | + RuntimeTraceFlagCache.user = value;
|
|
| 74 | + break;
|
|
| 75 | + case TRACE_CAP:
|
|
| 76 | + RuntimeTraceFlagCache.cap = value;
|
|
| 77 | + break;
|
|
| 78 | + }
|
|
| 79 | +}
|
|
| 40 | 80 | |
| 41 | 81 | #if defined(THREADED_RTS)
|
| 42 | 82 | static Mutex trace_utx;
|
| ... | ... | @@ -51,43 +91,41 @@ static void traceCap_stderr(Capability *cap, char *msg, ...); |
| 51 | 91 | --------------------------------------------------------------------------- */
|
| 52 | 92 | |
| 53 | 93 | /*
|
| 54 | - * Update the TRACE_* globals. Must be called whenever RtsFlags.TraceFlags is
|
|
| 55 | - * modified.
|
|
| 94 | + * Initialise the runtime trace flags from RtsFlags.TraceFlags.
|
|
| 56 | 95 | */
|
| 57 | -static void updateTraceFlagCache (void)
|
|
| 58 | -{
|
|
| 59 | - // -Ds turns on scheduler tracing too
|
|
| 60 | - TRACE_sched =
|
|
| 61 | - RtsFlags.TraceFlags.scheduler ||
|
|
| 62 | - RtsFlags.DebugFlags.scheduler;
|
|
| 63 | - |
|
| 64 | - // -Dg turns on gc tracing too
|
|
| 65 | - TRACE_gc =
|
|
| 66 | - RtsFlags.TraceFlags.gc ||
|
|
| 67 | - RtsFlags.DebugFlags.gc ||
|
|
| 68 | - RtsFlags.DebugFlags.scheduler;
|
|
| 69 | - |
|
| 70 | - TRACE_nonmoving_gc =
|
|
| 71 | - RtsFlags.TraceFlags.nonmoving_gc;
|
|
| 72 | - |
|
| 73 | - TRACE_spark_sampled =
|
|
| 74 | - RtsFlags.TraceFlags.sparks_sampled;
|
|
| 75 | - |
|
| 76 | - // -Dr turns on full spark tracing
|
|
| 77 | - TRACE_spark_full =
|
|
| 78 | - RtsFlags.TraceFlags.sparks_full ||
|
|
| 79 | - RtsFlags.DebugFlags.sparks;
|
|
| 80 | - |
|
| 81 | - TRACE_user =
|
|
| 82 | - RtsFlags.TraceFlags.user;
|
|
| 83 | - |
|
| 84 | - // We trace cap events if we're tracing anything else
|
|
| 85 | - TRACE_cap =
|
|
| 86 | - TRACE_sched ||
|
|
| 87 | - TRACE_gc ||
|
|
| 88 | - TRACE_spark_sampled ||
|
|
| 89 | - TRACE_spark_full ||
|
|
| 90 | - TRACE_user;
|
|
| 96 | +static void updateTraceFlagCache(void) {
|
|
| 97 | + // -Ds turns on scheduler tracing too
|
|
| 98 | + RuntimeTraceFlagCache.scheduler =
|
|
| 99 | + RtsFlags.TraceFlags.scheduler ||
|
|
| 100 | + RtsFlags.DebugFlags.scheduler;
|
|
| 101 | + |
|
| 102 | + // -Dg turns on gc tracing too
|
|
| 103 | + RuntimeTraceFlagCache.gc =
|
|
| 104 | + RtsFlags.TraceFlags.gc ||
|
|
| 105 | + RtsFlags.DebugFlags.gc ||
|
|
| 106 | + RtsFlags.DebugFlags.scheduler;
|
|
| 107 | + |
|
| 108 | + RuntimeTraceFlagCache.nonmoving_gc =
|
|
| 109 | + RtsFlags.TraceFlags.nonmoving_gc;
|
|
| 110 | + |
|
| 111 | + RuntimeTraceFlagCache.spark_sampled =
|
|
| 112 | + RtsFlags.TraceFlags.sparks_sampled;
|
|
| 113 | + |
|
| 114 | + // -Dr turns on full spark tracing
|
|
| 115 | + RuntimeTraceFlagCache.spark_full =
|
|
| 116 | + RtsFlags.TraceFlags.sparks_full ||
|
|
| 117 | + RtsFlags.DebugFlags.sparks;
|
|
| 118 | + |
|
| 119 | + RuntimeTraceFlagCache.user =
|
|
| 120 | + RtsFlags.TraceFlags.user;
|
|
| 121 | + |
|
| 122 | + // We trace cap events if we're tracing anything else
|
|
| 123 | + RuntimeTraceFlagCache.cap =
|
|
| 124 | + TRACE_sched ||
|
|
| 125 | + TRACE_gc ||
|
|
| 126 | + TRACE_spark_sampled ||
|
|
| 127 | + TRACE_spark_full ||
|
|
| 128 | + TRACE_user;
|
|
| 91 | 129 | }
|
| 92 | 130 | |
| 93 | 131 | void initTracing (void)
|
| ... | ... | @@ -880,59 +918,65 @@ void traceThreadLabel_(Capability *cap, |
| 880 | 918 | }
|
| 881 | 919 | }
|
| 882 | 920 | |
| 883 | -void traceConcMarkBegin(void)
|
|
| 921 | +void traceNonmovingGcEvent_ (EventTypeNum tag)
|
|
| 884 | 922 | {
|
| 885 | - if (eventlog_enabled)
|
|
| 886 | - postEventNoCap(EVENT_CONC_MARK_BEGIN);
|
|
| 923 | +#if defined(DEBUG)
|
|
| 924 | + if (RtsFlags.TraceFlags.tracing == TRACE_STDERR) {
|
|
| 925 | + /* nothing - no string representation for nonmoving GC events */
|
|
| 926 | + } else
|
|
| 927 | +#endif
|
|
| 928 | + {
|
|
| 929 | + /* currently most non-moving GC events are nullary events */
|
|
| 930 | + postEventNoCap(tag);
|
|
| 931 | + }
|
|
| 887 | 932 | }
|
| 888 | 933 | |
| 889 | -void traceConcMarkEnd(StgWord32 marked_obj_count)
|
|
| 934 | +void traceConcMarkEnd_(StgWord32 marked_obj_count)
|
|
| 890 | 935 | {
|
| 891 | - if (eventlog_enabled)
|
|
| 936 | +#if defined(DEBUG)
|
|
| 937 | + if (RtsFlags.TraceFlags.tracing == TRACE_STDERR) {
|
|
| 938 | + /* nothing - no string representation for nonmoving GC events */
|
|
| 939 | + } else
|
|
| 940 | +#endif
|
|
| 941 | + {
|
|
| 892 | 942 | postConcMarkEnd(marked_obj_count);
|
| 943 | + }
|
|
| 893 | 944 | }
|
| 894 | 945 | |
| 895 | -void traceConcSyncBegin(void)
|
|
| 896 | -{
|
|
| 897 | - if (eventlog_enabled)
|
|
| 898 | - postEventNoCap(EVENT_CONC_SYNC_BEGIN);
|
|
| 899 | -}
|
|
| 900 | - |
|
| 901 | -void traceConcSyncEnd(void)
|
|
| 902 | -{
|
|
| 903 | - if (eventlog_enabled)
|
|
| 904 | - postEventNoCap(EVENT_CONC_SYNC_END);
|
|
| 905 | -}
|
|
| 906 | - |
|
| 907 | -void traceConcSweepBegin(void)
|
|
| 908 | -{
|
|
| 909 | - if (eventlog_enabled)
|
|
| 910 | - postEventNoCap(EVENT_CONC_SWEEP_BEGIN);
|
|
| 911 | -}
|
|
| 912 | - |
|
| 913 | -void traceConcSweepEnd(void)
|
|
| 914 | -{
|
|
| 915 | - if (eventlog_enabled)
|
|
| 916 | - postEventNoCap(EVENT_CONC_SWEEP_END);
|
|
| 917 | -}
|
|
| 918 | - |
|
| 919 | -void traceConcUpdRemSetFlush(Capability *cap)
|
|
| 946 | +void traceConcUpdRemSetFlush_(Capability *cap)
|
|
| 920 | 947 | {
|
| 921 | - if (eventlog_enabled)
|
|
| 948 | +#if defined(DEBUG)
|
|
| 949 | + if (RtsFlags.TraceFlags.tracing == TRACE_STDERR) {
|
|
| 950 | + /* nothing - no string representation for nonmoving GC events */
|
|
| 951 | + } else
|
|
| 952 | +#endif
|
|
| 953 | + {
|
|
| 922 | 954 | postConcUpdRemSetFlush(cap);
|
| 955 | + }
|
|
| 923 | 956 | }
|
| 924 | 957 | |
| 925 | -void traceNonmovingHeapCensus(uint16_t blk_size,
|
|
| 926 | - const struct NonmovingAllocCensus *census)
|
|
| 958 | +void traceNonmovingHeapCensus_(uint16_t blk_size, const struct NonmovingAllocCensus *census)
|
|
| 927 | 959 | {
|
| 928 | - if (eventlog_enabled && TRACE_nonmoving_gc)
|
|
| 960 | +#if defined(DEBUG)
|
|
| 961 | + if (RtsFlags.TraceFlags.tracing == TRACE_STDERR) {
|
|
| 962 | + /* nothing - no string representation for nonmoving GC events */
|
|
| 963 | + } else
|
|
| 964 | +#endif
|
|
| 965 | + {
|
|
| 929 | 966 | postNonmovingHeapCensus(blk_size, census);
|
| 967 | + }
|
|
| 930 | 968 | }
|
| 931 | 969 | |
| 932 | -void traceNonmovingPrunedSegments(uint32_t pruned_segments, uint32_t free_segments)
|
|
| 970 | +void traceNonmovingPrunedSegments_(uint32_t pruned_segments, uint32_t free_segments)
|
|
| 933 | 971 | {
|
| 934 | - if (eventlog_enabled && TRACE_nonmoving_gc)
|
|
| 972 | +#if defined(DEBUG)
|
|
| 973 | + if (RtsFlags.TraceFlags.tracing == TRACE_STDERR) {
|
|
| 974 | + /* nothing - no string representation for nonmoving GC events */
|
|
| 975 | + } else
|
|
| 976 | +#endif
|
|
| 977 | + {
|
|
| 935 | 978 | postNonmovingPrunedSegments(pruned_segments, free_segments);
|
| 979 | + }
|
|
| 936 | 980 | }
|
| 937 | 981 | |
| 938 | 982 | void traceThreadStatus_ (StgTSO *tso USED_IF_DEBUG)
|
| ... | ... | @@ -70,16 +70,35 @@ enum CapsetType { CapsetTypeCustom = CAPSET_TYPE_CUSTOM, |
| 70 | 70 | #define DEBUG_continuation RtsFlags.DebugFlags.continuation
|
| 71 | 71 | #define DEBUG_iomanager RtsFlags.DebugFlags.iomanager
|
| 72 | 72 | |
| 73 | -// Event-enabled flags
|
|
| 74 | -// These semantically booleans but we use a dense packing to minimize their
|
|
| 75 | -// cache impact.
|
|
| 76 | -extern uint8_t TRACE_sched;
|
|
| 77 | -extern uint8_t TRACE_gc;
|
|
| 78 | -extern uint8_t TRACE_nonmoving_gc;
|
|
| 79 | -extern uint8_t TRACE_spark_sampled;
|
|
| 80 | -extern uint8_t TRACE_spark_full;
|
|
| 81 | -extern uint8_t TRACE_cap;
|
|
| 82 | -/* extern uint8_t TRACE_user; */ // only used in Trace.c
|
|
| 73 | +// These trace flags are shorthand for the members of the RuntimeTraceFlagCache
|
|
| 74 | +// struct. Within the RTS, these should be treated as read-only variables.
|
|
| 75 | +#define TRACE_sched ((const bool)RuntimeTraceFlagCache.scheduler)
|
|
| 76 | +#define TRACE_gc ((const bool)RuntimeTraceFlagCache.gc)
|
|
| 77 | +#define TRACE_nonmoving_gc ((const bool)RuntimeTraceFlagCache.nonmoving_gc)
|
|
| 78 | +#define TRACE_spark_sampled ((const bool)RuntimeTraceFlagCache.spark_sampled)
|
|
| 79 | +#define TRACE_spark_full ((const bool)RuntimeTraceFlagCache.spark_full)
|
|
| 80 | +#define TRACE_user ((const bool)RuntimeTraceFlagCache.user)
|
|
| 81 | +#define TRACE_cap ((const bool)RuntimeTraceFlagCache.cap)
|
|
| 82 | + |
|
| 83 | +/*
|
|
| 84 | + * Runtime trace flags.
|
|
| 85 | + */
|
|
| 86 | +typedef struct {
|
|
| 87 | + bool scheduler;
|
|
| 88 | + bool gc;
|
|
| 89 | + bool nonmoving_gc;
|
|
| 90 | + bool spark_sampled;
|
|
| 91 | + bool spark_full;
|
|
| 92 | + bool user;
|
|
| 93 | + bool cap;
|
|
| 94 | +} RUNTIME_TRACE_FLAG_CACHE;
|
|
| 95 | + |
|
| 96 | +/*
|
|
| 97 | + * These flags should be used to determine whether or not some value should
|
|
| 98 | + * be traced at runtime, rather than the values in RtsFlags. These flags can
|
|
| 99 | + * be modified at runtime using setTraceFlag in `rts/EventLogWriter.h`.
|
|
| 100 | + */
|
|
| 101 | +extern RUNTIME_TRACE_FLAG_CACHE RuntimeTraceFlagCache;
|
|
| 83 | 102 | |
| 84 | 103 | // -----------------------------------------------------------------------------
|
| 85 | 104 | // Posting events
|
| ... | ... | @@ -136,6 +155,52 @@ void traceGcEvent_ (Capability *cap, EventTypeNum tag); |
| 136 | 155 | |
| 137 | 156 | void traceGcEventAtT_ (Capability *cap, StgWord64 ts, EventTypeNum tag);
|
| 138 | 157 | |
| 158 | +/*
|
|
| 159 | + * Record a nonmoving GC event.
|
|
| 160 | + */
|
|
| 161 | +#define traceConcMarkBegin() \
|
|
| 162 | + if (RTS_UNLIKELY(TRACE_nonmoving_gc)) { \
|
|
| 163 | + traceNonmovingGcEvent_(EVENT_CONC_MARK_BEGIN); \
|
|
| 164 | + }
|
|
| 165 | +#define traceConcMarkEnd(marked_obj_count) \
|
|
| 166 | + if (RTS_UNLIKELY(TRACE_nonmoving_gc)) { \
|
|
| 167 | + traceConcMarkEnd_(marked_obj_count); \
|
|
| 168 | + }
|
|
| 169 | +#define traceConcSyncBegin() \
|
|
| 170 | + if (RTS_UNLIKELY(TRACE_nonmoving_gc)) { \
|
|
| 171 | + traceNonmovingGcEvent_(EVENT_CONC_SYNC_BEGIN); \
|
|
| 172 | + }
|
|
| 173 | +#define traceConcSyncEnd() \
|
|
| 174 | + if (RTS_UNLIKELY(TRACE_nonmoving_gc)) { \
|
|
| 175 | + traceNonmovingGcEvent_(EVENT_CONC_SYNC_END); \
|
|
| 176 | + }
|
|
| 177 | +#define traceConcSweepBegin() \
|
|
| 178 | + if (RTS_UNLIKELY(TRACE_nonmoving_gc)) { \
|
|
| 179 | + traceNonmovingGcEvent_(EVENT_CONC_SWEEP_BEGIN); \
|
|
| 180 | + }
|
|
| 181 | +#define traceConcSweepEnd() \
|
|
| 182 | + if (RTS_UNLIKELY(TRACE_nonmoving_gc)) { \
|
|
| 183 | + traceNonmovingGcEvent_(EVENT_CONC_SWEEP_END); \
|
|
| 184 | + }
|
|
| 185 | +#define traceConcUpdRemSetFlush(cap) \
|
|
| 186 | + if (RTS_UNLIKELY(TRACE_nonmoving_gc)) { \
|
|
| 187 | + traceConcUpdRemSetFlush_(cap); \
|
|
| 188 | + }
|
|
| 189 | +#define traceNonmovingHeapCensus(blk_size, census) \
|
|
| 190 | + if (RTS_UNLIKELY(TRACE_nonmoving_gc)) { \
|
|
| 191 | + traceNonmovingHeapCensus_(blk_size, census); \
|
|
| 192 | + }
|
|
| 193 | +#define traceNonmovingPrunedSegments(pruned_segments, free_segments) \
|
|
| 194 | + if (RTS_UNLIKELY(TRACE_nonmoving_gc)) { \
|
|
| 195 | + traceNonmovingPrunedSegments_(pruned_segments, free_segments); \
|
|
| 196 | + }
|
|
| 197 | + |
|
| 198 | +void traceNonmovingGcEvent_ (EventTypeNum tag);
|
|
| 199 | +void traceConcMarkEnd_(StgWord32 marked_obj_count);
|
|
| 200 | +void traceConcUpdRemSetFlush_(Capability *cap);
|
|
| 201 | +void traceNonmovingHeapCensus_(uint16_t blk_size, const struct NonmovingAllocCensus *census);
|
|
| 202 | +void traceNonmovingPrunedSegments_(uint32_t pruned_segments, uint32_t free_segments);
|
|
| 203 | + |
|
| 139 | 204 | /*
|
| 140 | 205 | * Record a heap event
|
| 141 | 206 | */
|
| ... | ... | @@ -321,17 +386,6 @@ void traceProfSampleCostCentre(Capability *cap, |
| 321 | 386 | void traceProfBegin(void);
|
| 322 | 387 | #endif /* PROFILING */
|
| 323 | 388 | |
| 324 | -void traceConcMarkBegin(void);
|
|
| 325 | -void traceConcMarkEnd(StgWord32 marked_obj_count);
|
|
| 326 | -void traceConcSyncBegin(void);
|
|
| 327 | -void traceConcSyncEnd(void);
|
|
| 328 | -void traceConcSweepBegin(void);
|
|
| 329 | -void traceConcSweepEnd(void);
|
|
| 330 | -void traceConcUpdRemSetFlush(Capability *cap);
|
|
| 331 | -void traceNonmovingHeapCensus(uint16_t blk_size,
|
|
| 332 | - const struct NonmovingAllocCensus *census);
|
|
| 333 | -void traceNonmovingPrunedSegments(uint32_t pruned_segments, uint32_t free_segments);
|
|
| 334 | - |
|
| 335 | 389 | void traceIPE(const InfoProvEnt *ipe);
|
| 336 | 390 | void flushTrace(void);
|
| 337 | 391 | |
| ... | ... | @@ -384,6 +438,7 @@ void flushTrace(void); |
| 384 | 438 | #define traceConcSweepEnd() /* nothing */
|
| 385 | 439 | #define traceConcUpdRemSetFlush(cap) /* nothing */
|
| 386 | 440 | #define traceNonmovingHeapCensus(blk_size, census) /* nothing */
|
| 441 | +#define traceNonmovingPrunedSegments(pruned_segments, free_segments) /* nothing */
|
|
| 387 | 442 | |
| 388 | 443 | #define flushTrace() /* nothing */
|
| 389 | 444 |
| ... | ... | @@ -78,3 +78,34 @@ void endEventLogging(void); |
| 78 | 78 | * Flush the eventlog. cap can be NULL if one is not held.
|
| 79 | 79 | */
|
| 80 | 80 | void flushEventLog(Capability **cap);
|
| 81 | + |
|
| 82 | +/*
|
|
| 83 | + * An enumeration for the runtime trace flags.
|
|
| 84 | + */
|
|
| 85 | +typedef enum {
|
|
| 86 | + TRACE_SCHEDULER,
|
|
| 87 | + TRACE_GC,
|
|
| 88 | + TRACE_NONMOVING_GC,
|
|
| 89 | + TRACE_SPARK_SAMPLED,
|
|
| 90 | + TRACE_SPARK_FULL,
|
|
| 91 | + TRACE_USER,
|
|
| 92 | + TRACE_CAP,
|
|
| 93 | +} RUNTIME_TRACE_FLAG;
|
|
| 94 | + |
|
| 95 | +/*
|
|
| 96 | + * Get the value of the given runtime trace flag.
|
|
| 97 | + *
|
|
| 98 | + * Warning: The trace flag cache is not thread-safe. After initialisation, the
|
|
| 99 | + * RTS never writes to these values, but concurrently using getTraceFlag and
|
|
| 100 | + * setTraceFlag for the same flag is a race condition.
|
|
| 101 | + */
|
|
| 102 | +bool getTraceFlag(RUNTIME_TRACE_FLAG flag);
|
|
| 103 | + |
|
| 104 | +/*
|
|
| 105 | + * Set the value of the given runtime trace flag.
|
|
| 106 | + *
|
|
| 107 | + * Warning: The trace flag cache is not thread-safe. After initialisation, the
|
|
| 108 | + * RTS never writes to these values. However, inconsistent reads may lead to
|
|
| 109 | + * incorrect tracing for a short time after setting a trace flag.
|
|
| 110 | + */
|
|
| 111 | +void setTraceFlag(RUNTIME_TRACE_FLAG flag, bool value); |
| ... | ... | @@ -76,18 +76,6 @@ |
| 76 | 76 | *
|
| 77 | 77 | * See bug #781
|
| 78 | 78 | * See thread http://www.haskell.org/pipermail/cvs-ghc/2007-September/038458.html
|
| 79 | - *
|
|
| 80 | - * Naming Scheme for Symbol Macros
|
|
| 81 | - *
|
|
| 82 | - * SymI_*: symbol is internal to the RTS. It resides in an object
|
|
| 83 | - * file/library that is statically.
|
|
| 84 | - * SymE_*: symbol is external to the RTS library. It might be linked
|
|
| 85 | - * dynamically.
|
|
| 86 | - *
|
|
| 87 | - * Sym*_HasProto : the symbol prototype is imported in an include file
|
|
| 88 | - * or defined explicitly
|
|
| 89 | - * Sym*_NeedsProto: the symbol is undefined and we add a dummy
|
|
| 90 | - * default proto extern void sym(void);
|
|
| 91 | 79 | */
|
| 92 | 80 | #define X86_64_ELF_NONPIC_HACK (!RtsFlags.MiscFlags.linkerAlwaysPic)
|
| 93 | 81 |
| ... | ... | @@ -1339,7 +1339,7 @@ concurrent_marking: |
| 1339 | 1339 | nonmovingPrintAllocatorCensus(!concurrent);
|
| 1340 | 1340 | #endif
|
| 1341 | 1341 | #if defined(TRACING)
|
| 1342 | - if (RtsFlags.TraceFlags.nonmoving_gc)
|
|
| 1342 | + if (RTS_UNLIKELY(TRACE_nonmoving_gc))
|
|
| 1343 | 1343 | nonmovingTraceAllocatorCensus();
|
| 1344 | 1344 | #endif
|
| 1345 | 1345 |
| ... | ... | @@ -1597,6 +1597,29 @@ module Data.Ratio where |
| 1597 | 1597 | denominator :: forall a. Ratio a -> a
|
| 1598 | 1598 | numerator :: forall a. Ratio a -> a
|
| 1599 | 1599 | |
| 1600 | +module Data.RealFloat where
|
|
| 1601 | + -- Safety: Safe
|
|
| 1602 | + pattern Infinity :: forall a. RealFloat a => a
|
|
| 1603 | + pattern NaN :: forall a. RealFloat a => a
|
|
| 1604 | + pattern NegInfinity :: forall a. RealFloat a => a
|
|
| 1605 | + type RealFloat :: * -> Constraint
|
|
| 1606 | + class (GHC.Internal.Real.RealFrac a, GHC.Internal.Float.Floating a) => RealFloat a where
|
|
| 1607 | + floatRadix :: a -> GHC.Internal.Bignum.Integer.Integer
|
|
| 1608 | + floatDigits :: a -> GHC.Internal.Types.Int
|
|
| 1609 | + floatRange :: a -> (GHC.Internal.Types.Int, GHC.Internal.Types.Int)
|
|
| 1610 | + decodeFloat :: a -> (GHC.Internal.Bignum.Integer.Integer, GHC.Internal.Types.Int)
|
|
| 1611 | + encodeFloat :: GHC.Internal.Bignum.Integer.Integer -> GHC.Internal.Types.Int -> a
|
|
| 1612 | + exponent :: a -> GHC.Internal.Types.Int
|
|
| 1613 | + significand :: a -> a
|
|
| 1614 | + scaleFloat :: GHC.Internal.Types.Int -> a -> a
|
|
| 1615 | + isNaN :: a -> GHC.Internal.Types.Bool
|
|
| 1616 | + isInfinite :: a -> GHC.Internal.Types.Bool
|
|
| 1617 | + isDenormalized :: a -> GHC.Internal.Types.Bool
|
|
| 1618 | + isNegativeZero :: a -> GHC.Internal.Types.Bool
|
|
| 1619 | + isIEEE :: a -> GHC.Internal.Types.Bool
|
|
| 1620 | + atan2 :: a -> a -> a
|
|
| 1621 | + {-# MINIMAL floatRadix, floatDigits, floatRange, decodeFloat, encodeFloat, isNaN, isInfinite, isDenormalized, isNegativeZero, isIEEE #-}
|
|
| 1622 | + |
|
| 1600 | 1623 | module Data.STRef where
|
| 1601 | 1624 | -- Safety: Safe
|
| 1602 | 1625 | type role STRef nominal representational
|
| ... | ... | @@ -11960,6 +11983,8 @@ instance forall k (f :: k -> *) (a :: k). GHC.Internal.Enum.Enum (f a) => GHC.In |
| 11960 | 11983 | instance forall k (f :: k -> *) (a :: k). GHC.Internal.Enum.Enum (f a) => GHC.Internal.Enum.Enum (GHC.Internal.Data.Monoid.Ap f a) -- Defined in ‘GHC.Internal.Data.Monoid’
|
| 11961 | 11984 | instance forall a. (GHC.Internal.Enum.Enum a, GHC.Internal.Enum.Bounded a, GHC.Internal.Classes.Eq a) => GHC.Internal.Enum.Enum (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 11962 | 11985 | instance forall a. GHC.Internal.Real.Integral a => GHC.Internal.Enum.Enum (GHC.Internal.Real.Ratio a) -- Defined in ‘GHC.Internal.Real’
|
| 11986 | +instance GHC.Internal.Enum.Enum GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 11987 | +instance GHC.Internal.Enum.Enum GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 11963 | 11988 | instance forall a. GHC.Internal.Enum.Enum a => GHC.Internal.Enum.Enum (Data.Semigroup.First a) -- Defined in ‘Data.Semigroup’
|
| 11964 | 11989 | instance forall a. GHC.Internal.Enum.Enum a => GHC.Internal.Enum.Enum (Data.Semigroup.Last a) -- Defined in ‘Data.Semigroup’
|
| 11965 | 11990 | instance forall a. GHC.Internal.Enum.Enum a => GHC.Internal.Enum.Enum (Data.Semigroup.Max a) -- Defined in ‘Data.Semigroup’
|
| ... | ... | @@ -11999,8 +12024,6 @@ instance GHC.Internal.Enum.Enum GHC.Internal.Foreign.C.Types.CUSeconds -- Define |
| 11999 | 12024 | instance GHC.Internal.Enum.Enum GHC.Internal.Foreign.C.Types.CUShort -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12000 | 12025 | instance GHC.Internal.Enum.Enum GHC.Internal.Foreign.C.Types.CWchar -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12001 | 12026 | instance GHC.Internal.Enum.Enum GHC.Internal.ByteOrder.ByteOrder -- Defined in ‘GHC.Internal.ByteOrder’
|
| 12002 | -instance GHC.Internal.Enum.Enum GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12003 | -instance GHC.Internal.Enum.Enum GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12004 | 12027 | instance GHC.Internal.Enum.Enum GHC.Internal.Generics.Associativity -- Defined in ‘GHC.Internal.Generics’
|
| 12005 | 12028 | instance GHC.Internal.Enum.Enum GHC.Internal.Generics.DecidedStrictness -- Defined in ‘GHC.Internal.Generics’
|
| 12006 | 12029 | instance GHC.Internal.Enum.Enum GHC.Internal.Generics.SourceStrictness -- Defined in ‘GHC.Internal.Generics’
|
| ... | ... | @@ -12047,18 +12070,18 @@ instance forall k1 k2 (f :: k1 -> *) (g :: k2 -> k1) (a :: k2). GHC.Internal.Flo |
| 12047 | 12070 | instance forall a b. GHC.Internal.Float.Floating a => GHC.Internal.Float.Floating (Data.Functor.Contravariant.Op a b) -- Defined in ‘Data.Functor.Contravariant’
|
| 12048 | 12071 | instance forall a. GHC.Internal.Float.Floating a => GHC.Internal.Float.Floating (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
| 12049 | 12072 | instance forall a. GHC.Internal.Float.Floating a => GHC.Internal.Float.Floating (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 12050 | -instance GHC.Internal.Float.Floating GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12051 | -instance GHC.Internal.Float.Floating GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12052 | 12073 | instance GHC.Internal.Float.Floating GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
| 12053 | 12074 | instance GHC.Internal.Float.Floating GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
| 12075 | +instance GHC.Internal.Float.Floating GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12076 | +instance GHC.Internal.Float.Floating GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12054 | 12077 | instance forall k a (b :: k). GHC.Internal.Float.RealFloat a => GHC.Internal.Float.RealFloat (GHC.Internal.Data.Functor.Const.Const a b) -- Defined in ‘GHC.Internal.Data.Functor.Const’
|
| 12055 | 12078 | instance forall k1 k2 (f :: k1 -> *) (g :: k2 -> k1) (a :: k2). GHC.Internal.Float.RealFloat (f (g a)) => GHC.Internal.Float.RealFloat (Data.Functor.Compose.Compose f g a) -- Defined in ‘Data.Functor.Compose’
|
| 12056 | 12079 | instance forall a. GHC.Internal.Float.RealFloat a => GHC.Internal.Float.RealFloat (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
| 12057 | 12080 | instance forall a. GHC.Internal.Float.RealFloat a => GHC.Internal.Float.RealFloat (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 12058 | -instance GHC.Internal.Float.RealFloat GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12059 | -instance GHC.Internal.Float.RealFloat GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12060 | 12081 | instance GHC.Internal.Float.RealFloat GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
| 12061 | 12082 | instance GHC.Internal.Float.RealFloat GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
| 12083 | +instance GHC.Internal.Float.RealFloat GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12084 | +instance GHC.Internal.Float.RealFloat GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12062 | 12085 | instance forall k a (b :: k). GHC.Internal.Foreign.Storable.Storable a => GHC.Internal.Foreign.Storable.Storable (GHC.Internal.Data.Functor.Const.Const a b) -- Defined in ‘GHC.Internal.Data.Functor.Const’
|
| 12063 | 12086 | instance forall a. GHC.Internal.Foreign.Storable.Storable a => GHC.Internal.Foreign.Storable.Storable (Data.Complex.Complex a) -- Defined in ‘Data.Complex’
|
| 12064 | 12087 | instance forall a. GHC.Internal.Foreign.Storable.Storable a => GHC.Internal.Foreign.Storable.Storable (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
| ... | ... | @@ -12387,6 +12410,8 @@ instance forall a. GHC.Internal.Num.Num a => GHC.Internal.Num.Num (GHC.Internal. |
| 12387 | 12410 | instance forall (f :: * -> *) a. (GHC.Internal.Base.Applicative f, GHC.Internal.Num.Num a) => GHC.Internal.Num.Num (GHC.Internal.Data.Monoid.Ap f a) -- Defined in ‘GHC.Internal.Data.Monoid’
|
| 12388 | 12411 | instance forall a. GHC.Internal.Num.Num a => GHC.Internal.Num.Num (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 12389 | 12412 | instance forall a. GHC.Internal.Real.Integral a => GHC.Internal.Num.Num (GHC.Internal.Real.Ratio a) -- Defined in ‘GHC.Internal.Real’
|
| 12413 | +instance GHC.Internal.Num.Num GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12414 | +instance GHC.Internal.Num.Num GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12390 | 12415 | instance forall a. GHC.Internal.Num.Num a => GHC.Internal.Num.Num (Data.Semigroup.Max a) -- Defined in ‘Data.Semigroup’
|
| 12391 | 12416 | instance forall a. GHC.Internal.Num.Num a => GHC.Internal.Num.Num (Data.Semigroup.Min a) -- Defined in ‘Data.Semigroup’
|
| 12392 | 12417 | instance GHC.Internal.Num.Num GHC.Internal.Word.Word16 -- Defined in ‘GHC.Internal.Word’
|
| ... | ... | @@ -12421,8 +12446,6 @@ instance GHC.Internal.Num.Num GHC.Internal.Foreign.C.Types.CULong -- Defined in |
| 12421 | 12446 | instance GHC.Internal.Num.Num GHC.Internal.Foreign.C.Types.CUSeconds -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12422 | 12447 | instance GHC.Internal.Num.Num GHC.Internal.Foreign.C.Types.CUShort -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12423 | 12448 | instance GHC.Internal.Num.Num GHC.Internal.Foreign.C.Types.CWchar -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12424 | -instance GHC.Internal.Num.Num GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12425 | -instance GHC.Internal.Num.Num GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12426 | 12449 | instance GHC.Internal.Num.Num GHC.Internal.Types.Int -- Defined in ‘GHC.Internal.Num’
|
| 12427 | 12450 | instance GHC.Internal.Num.Num GHC.Internal.Bignum.Integer.Integer -- Defined in ‘GHC.Internal.Num’
|
| 12428 | 12451 | instance GHC.Internal.Num.Num GHC.Internal.Bignum.Natural.Natural -- Defined in ‘GHC.Internal.Num’
|
| ... | ... | @@ -12564,10 +12587,10 @@ instance forall a b. GHC.Internal.Real.Fractional a => GHC.Internal.Real.Fractio |
| 12564 | 12587 | instance forall a. GHC.Internal.Real.Fractional a => GHC.Internal.Real.Fractional (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
| 12565 | 12588 | instance forall a. GHC.Internal.Real.Fractional a => GHC.Internal.Real.Fractional (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 12566 | 12589 | instance forall a. GHC.Internal.Real.Integral a => GHC.Internal.Real.Fractional (GHC.Internal.Real.Ratio a) -- Defined in ‘GHC.Internal.Real’
|
| 12567 | -instance GHC.Internal.Real.Fractional GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12568 | -instance GHC.Internal.Real.Fractional GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12569 | 12590 | instance GHC.Internal.Real.Fractional GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
| 12570 | 12591 | instance GHC.Internal.Real.Fractional GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
| 12592 | +instance GHC.Internal.Real.Fractional GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12593 | +instance GHC.Internal.Real.Fractional GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12571 | 12594 | instance forall k a (b :: k). GHC.Internal.Real.Integral a => GHC.Internal.Real.Integral (GHC.Internal.Data.Functor.Const.Const a b) -- Defined in ‘GHC.Internal.Data.Functor.Const’
|
| 12572 | 12595 | instance forall k1 k2 (f :: k1 -> *) (g :: k2 -> k1) (a :: k2). GHC.Internal.Real.Integral (f (g a)) => GHC.Internal.Real.Integral (Data.Functor.Compose.Compose f g a) -- Defined in ‘Data.Functor.Compose’
|
| 12573 | 12596 | instance forall a. GHC.Internal.Real.Integral a => GHC.Internal.Real.Integral (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
| ... | ... | @@ -12619,6 +12642,8 @@ instance GHC.Internal.Real.Real GHC.Internal.Bignum.Integer.Integer -- Defined i |
| 12619 | 12642 | instance GHC.Internal.Real.Real GHC.Internal.Bignum.Natural.Natural -- Defined in ‘GHC.Internal.Real’
|
| 12620 | 12643 | instance forall a. GHC.Internal.Real.Integral a => GHC.Internal.Real.Real (GHC.Internal.Real.Ratio a) -- Defined in ‘GHC.Internal.Real’
|
| 12621 | 12644 | instance GHC.Internal.Real.Real GHC.Internal.Types.Word -- Defined in ‘GHC.Internal.Real’
|
| 12645 | +instance GHC.Internal.Real.Real GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12646 | +instance GHC.Internal.Real.Real GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12622 | 12647 | instance GHC.Internal.Real.Real GHC.Internal.Word.Word16 -- Defined in ‘GHC.Internal.Word’
|
| 12623 | 12648 | instance GHC.Internal.Real.Real GHC.Internal.Word.Word32 -- Defined in ‘GHC.Internal.Word’
|
| 12624 | 12649 | instance GHC.Internal.Real.Real GHC.Internal.Word.Word64 -- Defined in ‘GHC.Internal.Word’
|
| ... | ... | @@ -12651,18 +12676,16 @@ instance GHC.Internal.Real.Real GHC.Internal.Foreign.C.Types.CULong -- Defined i |
| 12651 | 12676 | instance GHC.Internal.Real.Real GHC.Internal.Foreign.C.Types.CUSeconds -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12652 | 12677 | instance GHC.Internal.Real.Real GHC.Internal.Foreign.C.Types.CUShort -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12653 | 12678 | instance GHC.Internal.Real.Real GHC.Internal.Foreign.C.Types.CWchar -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12654 | -instance GHC.Internal.Real.Real GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12655 | -instance GHC.Internal.Real.Real GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12656 | 12679 | instance forall k a (b :: k). GHC.Internal.Real.RealFrac a => GHC.Internal.Real.RealFrac (GHC.Internal.Data.Functor.Const.Const a b) -- Defined in ‘GHC.Internal.Data.Functor.Const’
|
| 12657 | 12680 | instance forall k (a :: k). Data.Fixed.HasResolution a => GHC.Internal.Real.RealFrac (Data.Fixed.Fixed a) -- Defined in ‘Data.Fixed’
|
| 12658 | 12681 | instance forall k1 k2 (f :: k1 -> *) (g :: k2 -> k1) (a :: k2). GHC.Internal.Real.RealFrac (f (g a)) => GHC.Internal.Real.RealFrac (Data.Functor.Compose.Compose f g a) -- Defined in ‘Data.Functor.Compose’
|
| 12659 | 12682 | instance forall a. GHC.Internal.Real.RealFrac a => GHC.Internal.Real.RealFrac (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
| 12660 | 12683 | instance forall a. GHC.Internal.Real.RealFrac a => GHC.Internal.Real.RealFrac (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 12661 | 12684 | instance forall a. GHC.Internal.Real.Integral a => GHC.Internal.Real.RealFrac (GHC.Internal.Real.Ratio a) -- Defined in ‘GHC.Internal.Real’
|
| 12662 | -instance GHC.Internal.Real.RealFrac GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12663 | -instance GHC.Internal.Real.RealFrac GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12664 | 12685 | instance GHC.Internal.Real.RealFrac GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
| 12665 | 12686 | instance GHC.Internal.Real.RealFrac GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
| 12687 | +instance GHC.Internal.Real.RealFrac GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12688 | +instance GHC.Internal.Real.RealFrac GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12666 | 12689 | instance forall k a (b :: k). GHC.Internal.Show.Show a => GHC.Internal.Show.Show (GHC.Internal.Data.Functor.Const.Const a b) -- Defined in ‘GHC.Internal.Data.Functor.Const’
|
| 12667 | 12690 | instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (GHC.Internal.Functor.ZipList.ZipList a) -- Defined in ‘GHC.Internal.Functor.ZipList’
|
| 12668 | 12691 | instance GHC.Internal.Show.Show GHC.Internal.Conc.Sync.BlockReason -- Defined in ‘GHC.Internal.Conc.Sync’
|
| ... | ... | @@ -12776,6 +12799,8 @@ instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (GHC.Inter |
| 12776 | 12799 | instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 12777 | 12800 | instance GHC.Internal.Show.Show GHC.Internal.Real.FractionalExponentBase -- Defined in ‘GHC.Internal.Real’
|
| 12778 | 12801 | instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (GHC.Internal.Real.Ratio a) -- Defined in ‘GHC.Internal.Real’
|
| 12802 | +instance GHC.Internal.Show.Show GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12803 | +instance GHC.Internal.Show.Show GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12779 | 12804 | instance forall a b. (GHC.Internal.Show.Show a, GHC.Internal.Show.Show b) => GHC.Internal.Show.Show (Data.Semigroup.Arg a b) -- Defined in ‘Data.Semigroup’
|
| 12780 | 12805 | instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Data.Semigroup.First a) -- Defined in ‘Data.Semigroup’
|
| 12781 | 12806 | instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Data.Semigroup.Last a) -- Defined in ‘Data.Semigroup’
|
| ... | ... | @@ -12831,8 +12856,6 @@ instance GHC.Internal.Show.Show ghc-internal-10.100.0:GHC.Internal.Event.Manager |
| 12831 | 12856 | instance GHC.Internal.Show.Show ghc-internal-10.100.0:GHC.Internal.Event.Manager.State -- Defined in ‘ghc-internal-10.100.0:GHC.Internal.Event.Manager’
|
| 12832 | 12857 | instance GHC.Internal.Show.Show ghc-internal-10.100.0:GHC.Internal.Event.TimerManager.State -- Defined in ‘ghc-internal-10.100.0:GHC.Internal.Event.TimerManager’
|
| 12833 | 12858 | instance GHC.Internal.Show.Show GHC.Internal.Fingerprint.Type.Fingerprint -- Defined in ‘GHC.Internal.Fingerprint.Type’
|
| 12834 | -instance GHC.Internal.Show.Show GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12835 | -instance GHC.Internal.Show.Show GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12836 | 12859 | instance forall k (f :: k -> *) (g :: k -> *) (p :: k). (GHC.Internal.Show.Show (f p), GHC.Internal.Show.Show (g p)) => GHC.Internal.Show.Show ((GHC.Internal.Generics.:*:) f g p) -- Defined in ‘GHC.Internal.Generics’
|
| 12837 | 12860 | instance forall k (f :: k -> *) (g :: k -> *) (p :: k). (GHC.Internal.Show.Show (f p), GHC.Internal.Show.Show (g p)) => GHC.Internal.Show.Show ((GHC.Internal.Generics.:+:) f g p) -- Defined in ‘GHC.Internal.Generics’
|
| 12838 | 12861 | instance forall k2 k1 (f :: k2 -> *) (g :: k1 -> k2) (p :: k1). GHC.Internal.Show.Show (f (g p)) => GHC.Internal.Show.Show ((GHC.Internal.Generics.:.:) f g p) -- Defined in ‘GHC.Internal.Generics’
|
| ... | ... | @@ -1597,6 +1597,29 @@ module Data.Ratio where |
| 1597 | 1597 | denominator :: forall a. Ratio a -> a
|
| 1598 | 1598 | numerator :: forall a. Ratio a -> a
|
| 1599 | 1599 | |
| 1600 | +module Data.RealFloat where
|
|
| 1601 | + -- Safety: Safe
|
|
| 1602 | + pattern Infinity :: forall a. RealFloat a => a
|
|
| 1603 | + pattern NaN :: forall a. RealFloat a => a
|
|
| 1604 | + pattern NegInfinity :: forall a. RealFloat a => a
|
|
| 1605 | + type RealFloat :: * -> Constraint
|
|
| 1606 | + class (GHC.Internal.Real.RealFrac a, GHC.Internal.Float.Floating a) => RealFloat a where
|
|
| 1607 | + floatRadix :: a -> GHC.Internal.Bignum.Integer.Integer
|
|
| 1608 | + floatDigits :: a -> GHC.Internal.Types.Int
|
|
| 1609 | + floatRange :: a -> (GHC.Internal.Types.Int, GHC.Internal.Types.Int)
|
|
| 1610 | + decodeFloat :: a -> (GHC.Internal.Bignum.Integer.Integer, GHC.Internal.Types.Int)
|
|
| 1611 | + encodeFloat :: GHC.Internal.Bignum.Integer.Integer -> GHC.Internal.Types.Int -> a
|
|
| 1612 | + exponent :: a -> GHC.Internal.Types.Int
|
|
| 1613 | + significand :: a -> a
|
|
| 1614 | + scaleFloat :: GHC.Internal.Types.Int -> a -> a
|
|
| 1615 | + isNaN :: a -> GHC.Internal.Types.Bool
|
|
| 1616 | + isInfinite :: a -> GHC.Internal.Types.Bool
|
|
| 1617 | + isDenormalized :: a -> GHC.Internal.Types.Bool
|
|
| 1618 | + isNegativeZero :: a -> GHC.Internal.Types.Bool
|
|
| 1619 | + isIEEE :: a -> GHC.Internal.Types.Bool
|
|
| 1620 | + atan2 :: a -> a -> a
|
|
| 1621 | + {-# MINIMAL floatRadix, floatDigits, floatRange, decodeFloat, encodeFloat, isNaN, isInfinite, isDenormalized, isNegativeZero, isIEEE #-}
|
|
| 1622 | + |
|
| 1600 | 1623 | module Data.STRef where
|
| 1601 | 1624 | -- Safety: Safe
|
| 1602 | 1625 | type role STRef nominal representational
|
| ... | ... | @@ -11987,6 +12010,8 @@ instance forall k (f :: k -> *) (a :: k). GHC.Internal.Enum.Enum (f a) => GHC.In |
| 11987 | 12010 | instance forall k (f :: k -> *) (a :: k). GHC.Internal.Enum.Enum (f a) => GHC.Internal.Enum.Enum (GHC.Internal.Data.Monoid.Ap f a) -- Defined in ‘GHC.Internal.Data.Monoid’
|
| 11988 | 12011 | instance forall a. (GHC.Internal.Enum.Enum a, GHC.Internal.Enum.Bounded a, GHC.Internal.Classes.Eq a) => GHC.Internal.Enum.Enum (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 11989 | 12012 | instance forall a. GHC.Internal.Real.Integral a => GHC.Internal.Enum.Enum (GHC.Internal.Real.Ratio a) -- Defined in ‘GHC.Internal.Real’
|
| 12013 | +instance GHC.Internal.Enum.Enum GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12014 | +instance GHC.Internal.Enum.Enum GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 11990 | 12015 | instance forall a. GHC.Internal.Enum.Enum a => GHC.Internal.Enum.Enum (Data.Semigroup.First a) -- Defined in ‘Data.Semigroup’
|
| 11991 | 12016 | instance forall a. GHC.Internal.Enum.Enum a => GHC.Internal.Enum.Enum (Data.Semigroup.Last a) -- Defined in ‘Data.Semigroup’
|
| 11992 | 12017 | instance forall a. GHC.Internal.Enum.Enum a => GHC.Internal.Enum.Enum (Data.Semigroup.Max a) -- Defined in ‘Data.Semigroup’
|
| ... | ... | @@ -12026,8 +12051,6 @@ instance GHC.Internal.Enum.Enum GHC.Internal.Foreign.C.Types.CUSeconds -- Define |
| 12026 | 12051 | instance GHC.Internal.Enum.Enum GHC.Internal.Foreign.C.Types.CUShort -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12027 | 12052 | instance GHC.Internal.Enum.Enum GHC.Internal.Foreign.C.Types.CWchar -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12028 | 12053 | instance GHC.Internal.Enum.Enum GHC.Internal.ByteOrder.ByteOrder -- Defined in ‘GHC.Internal.ByteOrder’
|
| 12029 | -instance GHC.Internal.Enum.Enum GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12030 | -instance GHC.Internal.Enum.Enum GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12031 | 12054 | instance GHC.Internal.Enum.Enum GHC.Internal.Generics.Associativity -- Defined in ‘GHC.Internal.Generics’
|
| 12032 | 12055 | instance GHC.Internal.Enum.Enum GHC.Internal.Generics.DecidedStrictness -- Defined in ‘GHC.Internal.Generics’
|
| 12033 | 12056 | instance GHC.Internal.Enum.Enum GHC.Internal.Generics.SourceStrictness -- Defined in ‘GHC.Internal.Generics’
|
| ... | ... | @@ -12076,18 +12099,18 @@ instance forall k1 k2 (f :: k1 -> *) (g :: k2 -> k1) (a :: k2). GHC.Internal.Flo |
| 12076 | 12099 | instance forall a b. GHC.Internal.Float.Floating a => GHC.Internal.Float.Floating (Data.Functor.Contravariant.Op a b) -- Defined in ‘Data.Functor.Contravariant’
|
| 12077 | 12100 | instance forall a. GHC.Internal.Float.Floating a => GHC.Internal.Float.Floating (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
| 12078 | 12101 | instance forall a. GHC.Internal.Float.Floating a => GHC.Internal.Float.Floating (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 12079 | -instance GHC.Internal.Float.Floating GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12080 | -instance GHC.Internal.Float.Floating GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12081 | 12102 | instance GHC.Internal.Float.Floating GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
| 12082 | 12103 | instance GHC.Internal.Float.Floating GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
| 12104 | +instance GHC.Internal.Float.Floating GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12105 | +instance GHC.Internal.Float.Floating GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12083 | 12106 | instance forall k a (b :: k). GHC.Internal.Float.RealFloat a => GHC.Internal.Float.RealFloat (GHC.Internal.Data.Functor.Const.Const a b) -- Defined in ‘GHC.Internal.Data.Functor.Const’
|
| 12084 | 12107 | instance forall k1 k2 (f :: k1 -> *) (g :: k2 -> k1) (a :: k2). GHC.Internal.Float.RealFloat (f (g a)) => GHC.Internal.Float.RealFloat (Data.Functor.Compose.Compose f g a) -- Defined in ‘Data.Functor.Compose’
|
| 12085 | 12108 | instance forall a. GHC.Internal.Float.RealFloat a => GHC.Internal.Float.RealFloat (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
| 12086 | 12109 | instance forall a. GHC.Internal.Float.RealFloat a => GHC.Internal.Float.RealFloat (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 12087 | -instance GHC.Internal.Float.RealFloat GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12088 | -instance GHC.Internal.Float.RealFloat GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12089 | 12110 | instance GHC.Internal.Float.RealFloat GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
| 12090 | 12111 | instance GHC.Internal.Float.RealFloat GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
| 12112 | +instance GHC.Internal.Float.RealFloat GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12113 | +instance GHC.Internal.Float.RealFloat GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12091 | 12114 | instance forall k a (b :: k). GHC.Internal.Foreign.Storable.Storable a => GHC.Internal.Foreign.Storable.Storable (GHC.Internal.Data.Functor.Const.Const a b) -- Defined in ‘GHC.Internal.Data.Functor.Const’
|
| 12092 | 12115 | instance forall a. GHC.Internal.Foreign.Storable.Storable a => GHC.Internal.Foreign.Storable.Storable (Data.Complex.Complex a) -- Defined in ‘Data.Complex’
|
| 12093 | 12116 | instance forall a. GHC.Internal.Foreign.Storable.Storable a => GHC.Internal.Foreign.Storable.Storable (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
| ... | ... | @@ -12416,6 +12439,8 @@ instance forall a. GHC.Internal.Num.Num a => GHC.Internal.Num.Num (GHC.Internal. |
| 12416 | 12439 | instance forall (f :: * -> *) a. (GHC.Internal.Base.Applicative f, GHC.Internal.Num.Num a) => GHC.Internal.Num.Num (GHC.Internal.Data.Monoid.Ap f a) -- Defined in ‘GHC.Internal.Data.Monoid’
|
| 12417 | 12440 | instance forall a. GHC.Internal.Num.Num a => GHC.Internal.Num.Num (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 12418 | 12441 | instance forall a. GHC.Internal.Real.Integral a => GHC.Internal.Num.Num (GHC.Internal.Real.Ratio a) -- Defined in ‘GHC.Internal.Real’
|
| 12442 | +instance GHC.Internal.Num.Num GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12443 | +instance GHC.Internal.Num.Num GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12419 | 12444 | instance forall a. GHC.Internal.Num.Num a => GHC.Internal.Num.Num (Data.Semigroup.Max a) -- Defined in ‘Data.Semigroup’
|
| 12420 | 12445 | instance forall a. GHC.Internal.Num.Num a => GHC.Internal.Num.Num (Data.Semigroup.Min a) -- Defined in ‘Data.Semigroup’
|
| 12421 | 12446 | instance GHC.Internal.Num.Num GHC.Internal.Word.Word16 -- Defined in ‘GHC.Internal.Word’
|
| ... | ... | @@ -12450,8 +12475,6 @@ instance GHC.Internal.Num.Num GHC.Internal.Foreign.C.Types.CULong -- Defined in |
| 12450 | 12475 | instance GHC.Internal.Num.Num GHC.Internal.Foreign.C.Types.CUSeconds -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12451 | 12476 | instance GHC.Internal.Num.Num GHC.Internal.Foreign.C.Types.CUShort -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12452 | 12477 | instance GHC.Internal.Num.Num GHC.Internal.Foreign.C.Types.CWchar -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12453 | -instance GHC.Internal.Num.Num GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12454 | -instance GHC.Internal.Num.Num GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12455 | 12478 | instance GHC.Internal.Num.Num GHC.Internal.Types.Int -- Defined in ‘GHC.Internal.Num’
|
| 12456 | 12479 | instance GHC.Internal.Num.Num GHC.Internal.Bignum.Integer.Integer -- Defined in ‘GHC.Internal.Num’
|
| 12457 | 12480 | instance GHC.Internal.Num.Num GHC.Internal.Bignum.Natural.Natural -- Defined in ‘GHC.Internal.Num’
|
| ... | ... | @@ -12593,10 +12616,10 @@ instance forall a b. GHC.Internal.Real.Fractional a => GHC.Internal.Real.Fractio |
| 12593 | 12616 | instance forall a. GHC.Internal.Real.Fractional a => GHC.Internal.Real.Fractional (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
| 12594 | 12617 | instance forall a. GHC.Internal.Real.Fractional a => GHC.Internal.Real.Fractional (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 12595 | 12618 | instance forall a. GHC.Internal.Real.Integral a => GHC.Internal.Real.Fractional (GHC.Internal.Real.Ratio a) -- Defined in ‘GHC.Internal.Real’
|
| 12596 | -instance GHC.Internal.Real.Fractional GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12597 | -instance GHC.Internal.Real.Fractional GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12598 | 12619 | instance GHC.Internal.Real.Fractional GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
| 12599 | 12620 | instance GHC.Internal.Real.Fractional GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
| 12621 | +instance GHC.Internal.Real.Fractional GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12622 | +instance GHC.Internal.Real.Fractional GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12600 | 12623 | instance forall k a (b :: k). GHC.Internal.Real.Integral a => GHC.Internal.Real.Integral (GHC.Internal.Data.Functor.Const.Const a b) -- Defined in ‘GHC.Internal.Data.Functor.Const’
|
| 12601 | 12624 | instance forall k1 k2 (f :: k1 -> *) (g :: k2 -> k1) (a :: k2). GHC.Internal.Real.Integral (f (g a)) => GHC.Internal.Real.Integral (Data.Functor.Compose.Compose f g a) -- Defined in ‘Data.Functor.Compose’
|
| 12602 | 12625 | instance forall a. GHC.Internal.Real.Integral a => GHC.Internal.Real.Integral (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
| ... | ... | @@ -12648,6 +12671,8 @@ instance GHC.Internal.Real.Real GHC.Internal.Bignum.Integer.Integer -- Defined i |
| 12648 | 12671 | instance GHC.Internal.Real.Real GHC.Internal.Bignum.Natural.Natural -- Defined in ‘GHC.Internal.Real’
|
| 12649 | 12672 | instance forall a. GHC.Internal.Real.Integral a => GHC.Internal.Real.Real (GHC.Internal.Real.Ratio a) -- Defined in ‘GHC.Internal.Real’
|
| 12650 | 12673 | instance GHC.Internal.Real.Real GHC.Internal.Types.Word -- Defined in ‘GHC.Internal.Real’
|
| 12674 | +instance GHC.Internal.Real.Real GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12675 | +instance GHC.Internal.Real.Real GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12651 | 12676 | instance GHC.Internal.Real.Real GHC.Internal.Word.Word16 -- Defined in ‘GHC.Internal.Word’
|
| 12652 | 12677 | instance GHC.Internal.Real.Real GHC.Internal.Word.Word32 -- Defined in ‘GHC.Internal.Word’
|
| 12653 | 12678 | instance GHC.Internal.Real.Real GHC.Internal.Word.Word64 -- Defined in ‘GHC.Internal.Word’
|
| ... | ... | @@ -12680,18 +12705,16 @@ instance GHC.Internal.Real.Real GHC.Internal.Foreign.C.Types.CULong -- Defined i |
| 12680 | 12705 | instance GHC.Internal.Real.Real GHC.Internal.Foreign.C.Types.CUSeconds -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12681 | 12706 | instance GHC.Internal.Real.Real GHC.Internal.Foreign.C.Types.CUShort -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12682 | 12707 | instance GHC.Internal.Real.Real GHC.Internal.Foreign.C.Types.CWchar -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12683 | -instance GHC.Internal.Real.Real GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12684 | -instance GHC.Internal.Real.Real GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12685 | 12708 | instance forall k a (b :: k). GHC.Internal.Real.RealFrac a => GHC.Internal.Real.RealFrac (GHC.Internal.Data.Functor.Const.Const a b) -- Defined in ‘GHC.Internal.Data.Functor.Const’
|
| 12686 | 12709 | instance forall k (a :: k). Data.Fixed.HasResolution a => GHC.Internal.Real.RealFrac (Data.Fixed.Fixed a) -- Defined in ‘Data.Fixed’
|
| 12687 | 12710 | instance forall k1 k2 (f :: k1 -> *) (g :: k2 -> k1) (a :: k2). GHC.Internal.Real.RealFrac (f (g a)) => GHC.Internal.Real.RealFrac (Data.Functor.Compose.Compose f g a) -- Defined in ‘Data.Functor.Compose’
|
| 12688 | 12711 | instance forall a. GHC.Internal.Real.RealFrac a => GHC.Internal.Real.RealFrac (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
| 12689 | 12712 | instance forall a. GHC.Internal.Real.RealFrac a => GHC.Internal.Real.RealFrac (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 12690 | 12713 | instance forall a. GHC.Internal.Real.Integral a => GHC.Internal.Real.RealFrac (GHC.Internal.Real.Ratio a) -- Defined in ‘GHC.Internal.Real’
|
| 12691 | -instance GHC.Internal.Real.RealFrac GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12692 | -instance GHC.Internal.Real.RealFrac GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12693 | 12714 | instance GHC.Internal.Real.RealFrac GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
| 12694 | 12715 | instance GHC.Internal.Real.RealFrac GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
| 12716 | +instance GHC.Internal.Real.RealFrac GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12717 | +instance GHC.Internal.Real.RealFrac GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12695 | 12718 | instance forall k a (b :: k). GHC.Internal.Show.Show a => GHC.Internal.Show.Show (GHC.Internal.Data.Functor.Const.Const a b) -- Defined in ‘GHC.Internal.Data.Functor.Const’
|
| 12696 | 12719 | instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (GHC.Internal.Functor.ZipList.ZipList a) -- Defined in ‘GHC.Internal.Functor.ZipList’
|
| 12697 | 12720 | instance GHC.Internal.Show.Show GHC.Internal.Conc.Sync.BlockReason -- Defined in ‘GHC.Internal.Conc.Sync’
|
| ... | ... | @@ -12805,6 +12828,8 @@ instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (GHC.Inter |
| 12805 | 12828 | instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 12806 | 12829 | instance GHC.Internal.Show.Show GHC.Internal.Real.FractionalExponentBase -- Defined in ‘GHC.Internal.Real’
|
| 12807 | 12830 | instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (GHC.Internal.Real.Ratio a) -- Defined in ‘GHC.Internal.Real’
|
| 12831 | +instance GHC.Internal.Show.Show GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12832 | +instance GHC.Internal.Show.Show GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12808 | 12833 | instance forall a b. (GHC.Internal.Show.Show a, GHC.Internal.Show.Show b) => GHC.Internal.Show.Show (Data.Semigroup.Arg a b) -- Defined in ‘Data.Semigroup’
|
| 12809 | 12834 | instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Data.Semigroup.First a) -- Defined in ‘Data.Semigroup’
|
| 12810 | 12835 | instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Data.Semigroup.Last a) -- Defined in ‘Data.Semigroup’
|
| ... | ... | @@ -12853,8 +12878,6 @@ instance forall a. GHC.Internal.Show.Show (GHC.Internal.Foreign.C.ConstPtr.Const |
| 12853 | 12878 | instance forall a b. (GHC.Internal.Ix.Ix a, GHC.Internal.Show.Show a, GHC.Internal.Show.Show b) => GHC.Internal.Show.Show (GHC.Internal.Arr.Array a b) -- Defined in ‘GHC.Internal.Arr’
|
| 12854 | 12879 | instance GHC.Internal.Show.Show GHC.Internal.ByteOrder.ByteOrder -- Defined in ‘GHC.Internal.ByteOrder’
|
| 12855 | 12880 | instance GHC.Internal.Show.Show GHC.Internal.Fingerprint.Type.Fingerprint -- Defined in ‘GHC.Internal.Fingerprint.Type’
|
| 12856 | -instance GHC.Internal.Show.Show GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12857 | -instance GHC.Internal.Show.Show GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12858 | 12881 | instance forall k (f :: k -> *) (g :: k -> *) (p :: k). (GHC.Internal.Show.Show (f p), GHC.Internal.Show.Show (g p)) => GHC.Internal.Show.Show ((GHC.Internal.Generics.:*:) f g p) -- Defined in ‘GHC.Internal.Generics’
|
| 12859 | 12882 | instance forall k (f :: k -> *) (g :: k -> *) (p :: k). (GHC.Internal.Show.Show (f p), GHC.Internal.Show.Show (g p)) => GHC.Internal.Show.Show ((GHC.Internal.Generics.:+:) f g p) -- Defined in ‘GHC.Internal.Generics’
|
| 12860 | 12883 | instance forall k2 k1 (f :: k2 -> *) (g :: k1 -> k2) (p :: k1). GHC.Internal.Show.Show (f (g p)) => GHC.Internal.Show.Show ((GHC.Internal.Generics.:.:) f g p) -- Defined in ‘GHC.Internal.Generics’
|
| ... | ... | @@ -1597,6 +1597,29 @@ module Data.Ratio where |
| 1597 | 1597 | denominator :: forall a. Ratio a -> a
|
| 1598 | 1598 | numerator :: forall a. Ratio a -> a
|
| 1599 | 1599 | |
| 1600 | +module Data.RealFloat where
|
|
| 1601 | + -- Safety: Safe
|
|
| 1602 | + pattern Infinity :: forall a. RealFloat a => a
|
|
| 1603 | + pattern NaN :: forall a. RealFloat a => a
|
|
| 1604 | + pattern NegInfinity :: forall a. RealFloat a => a
|
|
| 1605 | + type RealFloat :: * -> Constraint
|
|
| 1606 | + class (GHC.Internal.Real.RealFrac a, GHC.Internal.Float.Floating a) => RealFloat a where
|
|
| 1607 | + floatRadix :: a -> GHC.Internal.Bignum.Integer.Integer
|
|
| 1608 | + floatDigits :: a -> GHC.Internal.Types.Int
|
|
| 1609 | + floatRange :: a -> (GHC.Internal.Types.Int, GHC.Internal.Types.Int)
|
|
| 1610 | + decodeFloat :: a -> (GHC.Internal.Bignum.Integer.Integer, GHC.Internal.Types.Int)
|
|
| 1611 | + encodeFloat :: GHC.Internal.Bignum.Integer.Integer -> GHC.Internal.Types.Int -> a
|
|
| 1612 | + exponent :: a -> GHC.Internal.Types.Int
|
|
| 1613 | + significand :: a -> a
|
|
| 1614 | + scaleFloat :: GHC.Internal.Types.Int -> a -> a
|
|
| 1615 | + isNaN :: a -> GHC.Internal.Types.Bool
|
|
| 1616 | + isInfinite :: a -> GHC.Internal.Types.Bool
|
|
| 1617 | + isDenormalized :: a -> GHC.Internal.Types.Bool
|
|
| 1618 | + isNegativeZero :: a -> GHC.Internal.Types.Bool
|
|
| 1619 | + isIEEE :: a -> GHC.Internal.Types.Bool
|
|
| 1620 | + atan2 :: a -> a -> a
|
|
| 1621 | + {-# MINIMAL floatRadix, floatDigits, floatRange, decodeFloat, encodeFloat, isNaN, isInfinite, isDenormalized, isNegativeZero, isIEEE #-}
|
|
| 1622 | + |
|
| 1600 | 1623 | module Data.STRef where
|
| 1601 | 1624 | -- Safety: Safe
|
| 1602 | 1625 | type role STRef nominal representational
|
| ... | ... | @@ -12218,6 +12241,8 @@ instance forall k (f :: k -> *) (a :: k). GHC.Internal.Enum.Enum (f a) => GHC.In |
| 12218 | 12241 | instance forall k (f :: k -> *) (a :: k). GHC.Internal.Enum.Enum (f a) => GHC.Internal.Enum.Enum (GHC.Internal.Data.Monoid.Ap f a) -- Defined in ‘GHC.Internal.Data.Monoid’
|
| 12219 | 12242 | instance forall a. (GHC.Internal.Enum.Enum a, GHC.Internal.Enum.Bounded a, GHC.Internal.Classes.Eq a) => GHC.Internal.Enum.Enum (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 12220 | 12243 | instance forall a. GHC.Internal.Real.Integral a => GHC.Internal.Enum.Enum (GHC.Internal.Real.Ratio a) -- Defined in ‘GHC.Internal.Real’
|
| 12244 | +instance GHC.Internal.Enum.Enum GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12245 | +instance GHC.Internal.Enum.Enum GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12221 | 12246 | instance forall a. GHC.Internal.Enum.Enum a => GHC.Internal.Enum.Enum (Data.Semigroup.First a) -- Defined in ‘Data.Semigroup’
|
| 12222 | 12247 | instance forall a. GHC.Internal.Enum.Enum a => GHC.Internal.Enum.Enum (Data.Semigroup.Last a) -- Defined in ‘Data.Semigroup’
|
| 12223 | 12248 | instance forall a. GHC.Internal.Enum.Enum a => GHC.Internal.Enum.Enum (Data.Semigroup.Max a) -- Defined in ‘Data.Semigroup’
|
| ... | ... | @@ -12258,8 +12283,6 @@ instance GHC.Internal.Enum.Enum GHC.Internal.Foreign.C.Types.CUShort -- Defined |
| 12258 | 12283 | instance GHC.Internal.Enum.Enum GHC.Internal.Foreign.C.Types.CWchar -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12259 | 12284 | instance GHC.Internal.Enum.Enum GHC.Internal.ByteOrder.ByteOrder -- Defined in ‘GHC.Internal.ByteOrder’
|
| 12260 | 12285 | instance GHC.Internal.Enum.Enum GHC.Internal.Event.Windows.ConsoleEvent.ConsoleEvent -- Defined in ‘GHC.Internal.Event.Windows.ConsoleEvent’
|
| 12261 | -instance GHC.Internal.Enum.Enum GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12262 | -instance GHC.Internal.Enum.Enum GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12263 | 12286 | instance GHC.Internal.Enum.Enum GHC.Internal.Generics.Associativity -- Defined in ‘GHC.Internal.Generics’
|
| 12264 | 12287 | instance GHC.Internal.Enum.Enum GHC.Internal.Generics.DecidedStrictness -- Defined in ‘GHC.Internal.Generics’
|
| 12265 | 12288 | instance GHC.Internal.Enum.Enum GHC.Internal.Generics.SourceStrictness -- Defined in ‘GHC.Internal.Generics’
|
| ... | ... | @@ -12306,18 +12329,18 @@ instance forall k1 k2 (f :: k1 -> *) (g :: k2 -> k1) (a :: k2). GHC.Internal.Flo |
| 12306 | 12329 | instance forall a b. GHC.Internal.Float.Floating a => GHC.Internal.Float.Floating (Data.Functor.Contravariant.Op a b) -- Defined in ‘Data.Functor.Contravariant’
|
| 12307 | 12330 | instance forall a. GHC.Internal.Float.Floating a => GHC.Internal.Float.Floating (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
| 12308 | 12331 | instance forall a. GHC.Internal.Float.Floating a => GHC.Internal.Float.Floating (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 12309 | -instance GHC.Internal.Float.Floating GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12310 | -instance GHC.Internal.Float.Floating GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12311 | 12332 | instance GHC.Internal.Float.Floating GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
| 12312 | 12333 | instance GHC.Internal.Float.Floating GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
| 12334 | +instance GHC.Internal.Float.Floating GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12335 | +instance GHC.Internal.Float.Floating GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12313 | 12336 | instance forall k a (b :: k). GHC.Internal.Float.RealFloat a => GHC.Internal.Float.RealFloat (GHC.Internal.Data.Functor.Const.Const a b) -- Defined in ‘GHC.Internal.Data.Functor.Const’
|
| 12314 | 12337 | instance forall k1 k2 (f :: k1 -> *) (g :: k2 -> k1) (a :: k2). GHC.Internal.Float.RealFloat (f (g a)) => GHC.Internal.Float.RealFloat (Data.Functor.Compose.Compose f g a) -- Defined in ‘Data.Functor.Compose’
|
| 12315 | 12338 | instance forall a. GHC.Internal.Float.RealFloat a => GHC.Internal.Float.RealFloat (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
| 12316 | 12339 | instance forall a. GHC.Internal.Float.RealFloat a => GHC.Internal.Float.RealFloat (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 12317 | -instance GHC.Internal.Float.RealFloat GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12318 | -instance GHC.Internal.Float.RealFloat GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12319 | 12340 | instance GHC.Internal.Float.RealFloat GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
| 12320 | 12341 | instance GHC.Internal.Float.RealFloat GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
| 12342 | +instance GHC.Internal.Float.RealFloat GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12343 | +instance GHC.Internal.Float.RealFloat GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12321 | 12344 | instance forall k a (b :: k). GHC.Internal.Foreign.Storable.Storable a => GHC.Internal.Foreign.Storable.Storable (GHC.Internal.Data.Functor.Const.Const a b) -- Defined in ‘GHC.Internal.Data.Functor.Const’
|
| 12322 | 12345 | instance forall a. GHC.Internal.Foreign.Storable.Storable a => GHC.Internal.Foreign.Storable.Storable (Data.Complex.Complex a) -- Defined in ‘Data.Complex’
|
| 12323 | 12346 | instance forall a. GHC.Internal.Foreign.Storable.Storable a => GHC.Internal.Foreign.Storable.Storable (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
| ... | ... | @@ -12658,6 +12681,8 @@ instance forall a. GHC.Internal.Num.Num a => GHC.Internal.Num.Num (GHC.Internal. |
| 12658 | 12681 | instance forall (f :: * -> *) a. (GHC.Internal.Base.Applicative f, GHC.Internal.Num.Num a) => GHC.Internal.Num.Num (GHC.Internal.Data.Monoid.Ap f a) -- Defined in ‘GHC.Internal.Data.Monoid’
|
| 12659 | 12682 | instance forall a. GHC.Internal.Num.Num a => GHC.Internal.Num.Num (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 12660 | 12683 | instance forall a. GHC.Internal.Real.Integral a => GHC.Internal.Num.Num (GHC.Internal.Real.Ratio a) -- Defined in ‘GHC.Internal.Real’
|
| 12684 | +instance GHC.Internal.Num.Num GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12685 | +instance GHC.Internal.Num.Num GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12661 | 12686 | instance forall a. GHC.Internal.Num.Num a => GHC.Internal.Num.Num (Data.Semigroup.Max a) -- Defined in ‘Data.Semigroup’
|
| 12662 | 12687 | instance forall a. GHC.Internal.Num.Num a => GHC.Internal.Num.Num (Data.Semigroup.Min a) -- Defined in ‘Data.Semigroup’
|
| 12663 | 12688 | instance GHC.Internal.Num.Num GHC.Internal.Word.Word16 -- Defined in ‘GHC.Internal.Word’
|
| ... | ... | @@ -12692,8 +12717,6 @@ instance GHC.Internal.Num.Num GHC.Internal.Foreign.C.Types.CULong -- Defined in |
| 12692 | 12717 | instance GHC.Internal.Num.Num GHC.Internal.Foreign.C.Types.CUSeconds -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12693 | 12718 | instance GHC.Internal.Num.Num GHC.Internal.Foreign.C.Types.CUShort -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12694 | 12719 | instance GHC.Internal.Num.Num GHC.Internal.Foreign.C.Types.CWchar -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12695 | -instance GHC.Internal.Num.Num GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12696 | -instance GHC.Internal.Num.Num GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12697 | 12720 | instance GHC.Internal.Num.Num GHC.Internal.Types.Int -- Defined in ‘GHC.Internal.Num’
|
| 12698 | 12721 | instance GHC.Internal.Num.Num GHC.Internal.Bignum.Integer.Integer -- Defined in ‘GHC.Internal.Num’
|
| 12699 | 12722 | instance GHC.Internal.Num.Num GHC.Internal.Bignum.Natural.Natural -- Defined in ‘GHC.Internal.Num’
|
| ... | ... | @@ -12836,10 +12859,10 @@ instance forall a b. GHC.Internal.Real.Fractional a => GHC.Internal.Real.Fractio |
| 12836 | 12859 | instance forall a. GHC.Internal.Real.Fractional a => GHC.Internal.Real.Fractional (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
| 12837 | 12860 | instance forall a. GHC.Internal.Real.Fractional a => GHC.Internal.Real.Fractional (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 12838 | 12861 | instance forall a. GHC.Internal.Real.Integral a => GHC.Internal.Real.Fractional (GHC.Internal.Real.Ratio a) -- Defined in ‘GHC.Internal.Real’
|
| 12839 | -instance GHC.Internal.Real.Fractional GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12840 | -instance GHC.Internal.Real.Fractional GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12841 | 12862 | instance GHC.Internal.Real.Fractional GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
| 12842 | 12863 | instance GHC.Internal.Real.Fractional GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
| 12864 | +instance GHC.Internal.Real.Fractional GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12865 | +instance GHC.Internal.Real.Fractional GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12843 | 12866 | instance forall k a (b :: k). GHC.Internal.Real.Integral a => GHC.Internal.Real.Integral (GHC.Internal.Data.Functor.Const.Const a b) -- Defined in ‘GHC.Internal.Data.Functor.Const’
|
| 12844 | 12867 | instance forall k1 k2 (f :: k1 -> *) (g :: k2 -> k1) (a :: k2). GHC.Internal.Real.Integral (f (g a)) => GHC.Internal.Real.Integral (Data.Functor.Compose.Compose f g a) -- Defined in ‘Data.Functor.Compose’
|
| 12845 | 12868 | instance forall a. GHC.Internal.Real.Integral a => GHC.Internal.Real.Integral (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
| ... | ... | @@ -12891,6 +12914,8 @@ instance GHC.Internal.Real.Real GHC.Internal.Bignum.Integer.Integer -- Defined i |
| 12891 | 12914 | instance GHC.Internal.Real.Real GHC.Internal.Bignum.Natural.Natural -- Defined in ‘GHC.Internal.Real’
|
| 12892 | 12915 | instance forall a. GHC.Internal.Real.Integral a => GHC.Internal.Real.Real (GHC.Internal.Real.Ratio a) -- Defined in ‘GHC.Internal.Real’
|
| 12893 | 12916 | instance GHC.Internal.Real.Real GHC.Internal.Types.Word -- Defined in ‘GHC.Internal.Real’
|
| 12917 | +instance GHC.Internal.Real.Real GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12918 | +instance GHC.Internal.Real.Real GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12894 | 12919 | instance GHC.Internal.Real.Real GHC.Internal.Word.Word16 -- Defined in ‘GHC.Internal.Word’
|
| 12895 | 12920 | instance GHC.Internal.Real.Real GHC.Internal.Word.Word32 -- Defined in ‘GHC.Internal.Word’
|
| 12896 | 12921 | instance GHC.Internal.Real.Real GHC.Internal.Word.Word64 -- Defined in ‘GHC.Internal.Word’
|
| ... | ... | @@ -12923,18 +12948,16 @@ instance GHC.Internal.Real.Real GHC.Internal.Foreign.C.Types.CULong -- Defined i |
| 12923 | 12948 | instance GHC.Internal.Real.Real GHC.Internal.Foreign.C.Types.CUSeconds -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12924 | 12949 | instance GHC.Internal.Real.Real GHC.Internal.Foreign.C.Types.CUShort -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12925 | 12950 | instance GHC.Internal.Real.Real GHC.Internal.Foreign.C.Types.CWchar -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
| 12926 | -instance GHC.Internal.Real.Real GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 12927 | -instance GHC.Internal.Real.Real GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 12928 | 12951 | instance forall k a (b :: k). GHC.Internal.Real.RealFrac a => GHC.Internal.Real.RealFrac (GHC.Internal.Data.Functor.Const.Const a b) -- Defined in ‘GHC.Internal.Data.Functor.Const’
|
| 12929 | 12952 | instance forall k (a :: k). Data.Fixed.HasResolution a => GHC.Internal.Real.RealFrac (Data.Fixed.Fixed a) -- Defined in ‘Data.Fixed’
|
| 12930 | 12953 | instance forall k1 k2 (f :: k1 -> *) (g :: k2 -> k1) (a :: k2). GHC.Internal.Real.RealFrac (f (g a)) => GHC.Internal.Real.RealFrac (Data.Functor.Compose.Compose f g a) -- Defined in ‘Data.Functor.Compose’
|
| 12931 | 12954 | instance forall a. GHC.Internal.Real.RealFrac a => GHC.Internal.Real.RealFrac (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.Functor.Identity’
|
| 12932 | 12955 | instance forall a. GHC.Internal.Real.RealFrac a => GHC.Internal.Real.RealFrac (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 12933 | 12956 | instance forall a. GHC.Internal.Real.Integral a => GHC.Internal.Real.RealFrac (GHC.Internal.Real.Ratio a) -- Defined in ‘GHC.Internal.Real’
|
| 12934 | -instance GHC.Internal.Real.RealFrac GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12935 | -instance GHC.Internal.Real.RealFrac GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12936 | 12957 | instance GHC.Internal.Real.RealFrac GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
| 12937 | 12958 | instance GHC.Internal.Real.RealFrac GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
| 12959 | +instance GHC.Internal.Real.RealFrac GHC.Internal.Foreign.C.Types.CDouble -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12960 | +instance GHC.Internal.Real.RealFrac GHC.Internal.Foreign.C.Types.CFloat -- Defined in ‘GHC.Internal.Foreign.C.Types’
|
|
| 12938 | 12961 | instance forall k a (b :: k). GHC.Internal.Show.Show a => GHC.Internal.Show.Show (GHC.Internal.Data.Functor.Const.Const a b) -- Defined in ‘GHC.Internal.Data.Functor.Const’
|
| 12939 | 12962 | instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (GHC.Internal.Functor.ZipList.ZipList a) -- Defined in ‘GHC.Internal.Functor.ZipList’
|
| 12940 | 12963 | instance GHC.Internal.Show.Show GHC.Internal.Conc.Sync.BlockReason -- Defined in ‘GHC.Internal.Conc.Sync’
|
| ... | ... | @@ -13048,6 +13071,8 @@ instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (GHC.Inter |
| 13048 | 13071 | instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
|
| 13049 | 13072 | instance GHC.Internal.Show.Show GHC.Internal.Real.FractionalExponentBase -- Defined in ‘GHC.Internal.Real’
|
| 13050 | 13073 | instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (GHC.Internal.Real.Ratio a) -- Defined in ‘GHC.Internal.Real’
|
| 13074 | +instance GHC.Internal.Show.Show GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 13075 | +instance GHC.Internal.Show.Show GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 13051 | 13076 | instance forall a b. (GHC.Internal.Show.Show a, GHC.Internal.Show.Show b) => GHC.Internal.Show.Show (Data.Semigroup.Arg a b) -- Defined in ‘Data.Semigroup’
|
| 13052 | 13077 | instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Data.Semigroup.First a) -- Defined in ‘Data.Semigroup’
|
| 13053 | 13078 | instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Data.Semigroup.Last a) -- Defined in ‘Data.Semigroup’
|
| ... | ... | @@ -13100,8 +13125,6 @@ instance forall a. GHC.Internal.Show.Show a => GHC.Internal.Show.Show (GHC.Inter |
| 13100 | 13125 | instance GHC.Internal.Show.Show GHC.Internal.Event.Windows.HandleKey -- Defined in ‘GHC.Internal.Event.Windows’
|
| 13101 | 13126 | instance GHC.Internal.Show.Show GHC.Internal.Event.Windows.FFI.IOCP -- Defined in ‘GHC.Internal.Event.Windows.FFI’
|
| 13102 | 13127 | instance GHC.Internal.Show.Show GHC.Internal.Fingerprint.Type.Fingerprint -- Defined in ‘GHC.Internal.Fingerprint.Type’
|
| 13103 | -instance GHC.Internal.Show.Show GHC.Internal.Types.Double -- Defined in ‘GHC.Internal.Float’
|
|
| 13104 | -instance GHC.Internal.Show.Show GHC.Internal.Types.Float -- Defined in ‘GHC.Internal.Float’
|
|
| 13105 | 13128 | instance forall k (f :: k -> *) (g :: k -> *) (p :: k). (GHC.Internal.Show.Show (f p), GHC.Internal.Show.Show (g p)) => GHC.Internal.Show.Show ((GHC.Internal.Generics.:*:) f g p) -- Defined in ‘GHC.Internal.Generics’
|
| 13106 | 13129 | instance forall k (f :: k -> *) (g :: k -> *) (p :: k). (GHC.Internal.Show.Show (f p), GHC.Internal.Show.Show (g p)) => GHC.Internal.Show.Show ((GHC.Internal.Generics.:+:) f g p) -- Defined in ‘GHC.Internal.Generics’
|
| 13107 | 13130 | instance forall k2 k1 (f :: k2 -> *) (g :: k1 -> k2) (p :: k1). GHC.Internal.Show.Show (f (g p)) => GHC.Internal.Show.Show ((GHC.Internal.Generics.:.:) f g p) -- Defined in ‘GHC.Internal.Generics’
|
| 1 | +{-# LANGUAGE TemplateHaskell #-}
|
|
| 2 | +-- | This tests the behaviour of TH's recover method.
|
|
| 3 | +-- It should behave the same in the internal and external interperter.
|
|
| 4 | +-- In the past, they have diverged, and the external interpreter would roll back the state of putQ/getQ whereas the internal interpreter would not.
|
|
| 5 | +module Main where
|
|
| 6 | + |
|
| 7 | +import Language.Haskell.TH.Syntax
|
|
| 8 | +main = print $(putQ "0" >> recover (pure ()) (putQ "42" >> fail "oops") >> getQ @String >>= lift ) |
| 1 | +Just "42" |
| ... | ... | @@ -650,3 +650,4 @@ test('GadtConSigs_th_dump1', normal, compile, ['-v0 -ddump-splices -dsuppress-un |
| 650 | 650 | test('T26099', normal, compile_fail, [''])
|
| 651 | 651 | test('T8306_th', only_ways(['ghci']), ghci_script, ['T8306_th.script'])
|
| 652 | 652 | test('T26862_th', only_ways(['ghci']), ghci_script, ['T26862_th.script'])
|
| 653 | +test('T27022', normal, compile_and_run, ['']) |