[Git][ghc/ghc][wip/romes/hadrian-cross-stage2-rebase_SVEN_FINAL] Fix stripping: Not for >= Stage2 cross-compiled
by Sven Tennie (@supersven) 26 Feb '26
by Sven Tennie (@supersven) 26 Feb '26
26 Feb '26
Sven Tennie pushed to branch wip/romes/hadrian-cross-stage2-rebase_SVEN_FINAL at Glasgow Haskell Compiler / GHC
Commits:
f4503bbf by Sven Tennie at 2026-02-26T21:30:52+00:00
Fix stripping: Not for >= Stage2 cross-compiled
- - - - -
1 changed file:
- hadrian/src/Settings/Builders/Cabal.hs
Changes:
=====================================
hadrian/src/Settings/Builders/Cabal.hs
=====================================
@@ -90,9 +90,10 @@ commonCabalArgs stage = do
-- we might have issues with stripping on Windows, as I can't see a
-- consumer of 'stripCmdPath'.
-- TODO: See https://github.com/snowleopard/hadrian/issues/549.
- -- TODO: MP should check per-stage rather than a global CrossCompiling, but not going to cause bugs
- flag CrossCompiling ? pure [ "--disable-executable-stripping"
- , "--disable-library-stripping" ]
+ -- Do not try to strip cross-compiled libs, we can't do this, yet.
+ andM [flag CrossCompiling, pure (stage >= Stage2)] ?
+ pure [ "--disable-executable-stripping"
+ , "--disable-library-stripping" ]
-- We don't want to strip the debug RTS
, S.package rts ? pure [ "--disable-executable-stripping"
, "--disable-library-stripping" ]
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/f4503bbfdb2415c4175b79c2f11d6ba…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/f4503bbfdb2415c4175b79c2f11d6ba…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][wip/romes/hadrian-cross-stage2-rebase_SVEN_FINAL] 3 commits: Cleanup inTreeCompilerArgs
by Sven Tennie (@supersven) 26 Feb '26
by Sven Tennie (@supersven) 26 Feb '26
26 Feb '26
Sven Tennie pushed to branch wip/romes/hadrian-cross-stage2-rebase_SVEN_FINAL at Glasgow Haskell Compiler / GHC
Commits:
66c56061 by Sven Tennie at 2026-02-26T20:59:39+00:00
Cleanup inTreeCompilerArgs
- - - - -
43662196 by Sven Tennie at 2026-02-26T20:59:39+00:00
Cleanup isOptional
- - - - -
122df994 by Sven Tennie at 2026-02-26T21:16:44+00:00
Fix stripping: Not for >= Stage2 cross-compiled
- - - - -
3 changed files:
- hadrian/src/Builder.hs
- hadrian/src/Settings/Builders/Cabal.hs
- hadrian/src/Settings/Builders/RunTest.hs
Changes:
=====================================
hadrian/src/Builder.hs
=====================================
@@ -415,8 +415,7 @@ isOptional target = \case
Alex -> True
-- Most ar implemententions no longer need ranlib, but some still do
Ranlib {} -> not $ Toolchain.arNeedsRanlib (tgtAr target)
- -- TODO: Use stage argument
- JsCpp {} -> not $ (archOS_arch . tgtArchOs) target == ArchJavaScript -- ArchWasm32 too?
+ JsCpp {} -> (archOS_arch . tgtArchOs) target /= ArchJavaScript -- ArchWasm32 too?
_ -> False
-- | Determine the location of a system 'Builder'.
=====================================
hadrian/src/Settings/Builders/Cabal.hs
=====================================
@@ -90,9 +90,10 @@ commonCabalArgs stage = do
-- we might have issues with stripping on Windows, as I can't see a
-- consumer of 'stripCmdPath'.
-- TODO: See https://github.com/snowleopard/hadrian/issues/549.
- -- TODO: MP should check per-stage rather than a global CrossCompiling, but not going to cause bugs
- flag CrossCompiling ? pure [ "--disable-executable-stripping"
- , "--disable-library-stripping" ]
+ -- Do not try to strip cross-compiled libs, we can't do this, yet.
+ andM [flag CrossCompiling, pure (stage >= Stage2)]] ?
+ pure [ "--disable-executable-stripping"
+ , "--disable-library-stripping" ]
-- We don't want to strip the debug RTS
, S.package rts ? pure [ "--disable-executable-stripping"
, "--disable-library-stripping" ]
=====================================
hadrian/src/Settings/Builders/RunTest.hs
=====================================
@@ -105,50 +105,49 @@ allowHaveLLVM = not . (`elem` ["wasm32", "javascript"])
--
inTreeCompilerArgs :: Stage -> Action TestCompilerArgs
inTreeCompilerArgs stg = do
- -- TODO: executable and library stage would be clearer
cross <- crossStage stg
- let ghcStage = succStage stg
- pkgCacheStage = if cross then ghcStage else stg
+ let executableStage = succStage stg
+ libraryStage = if cross then executableStage else stg
(hasDynamicRts, hasThreadedRts) <- do
- ways <- interpretInContext (vanillaContext ghcStage rts) getRtsWays
+ ways <- interpretInContext (vanillaContext executableStage rts) getRtsWays
return (dynamic `elem` ways, threaded `elem` ways)
- hasDynamic <- (wayUnit Dynamic) . Context.Type.way <$> (programContext stg ghc)
- leadingUnderscore <- queryTargetTarget ghcStage tgtSymbolsHaveLeadingUnderscore
- withInterpreter <- ghcWithInterpreter ghcStage
- unregisterised <- queryTargetTarget ghcStage tgtUnregisterised
- tables_next_to_code <- queryTargetTarget ghcStage tgtTablesNextToCode
- targetWithSMP <- targetSupportsSMP ghcStage
- interpForceDyn <- targetRTSLinkerOnlySupportsSharedLibs ghcStage
-
- debugAssertions <- ghcDebugAssertions <$> flavour <*> pure ghcStage
- debugged <- ghcDebugged <$> flavour <*> pure ghcStage
- profiled <- ghcProfiled <$> flavour <*> pure ghcStage
+ hasDynamic <- wayUnit Dynamic . Context.Type.way <$> programContext stg ghc
+ leadingUnderscore <- queryTargetTarget executableStage tgtSymbolsHaveLeadingUnderscore
+ withInterpreter <- ghcWithInterpreter executableStage
+ unregisterised <- queryTargetTarget executableStage tgtUnregisterised
+ tables_next_to_code <- queryTargetTarget executableStage tgtTablesNextToCode
+ targetWithSMP <- targetSupportsSMP executableStage
+ interpForceDyn <- targetRTSLinkerOnlySupportsSharedLibs executableStage
+
+ debugAssertions <- ghcDebugAssertions <$> flavour <*> pure executableStage
+ debugged <- ghcDebugged <$> flavour <*> pure executableStage
+ profiled <- ghcProfiled <$> flavour <*> pure executableStage
os <- queryHostTarget queryOS
- arch <- queryTargetTarget ghcStage queryArch
+ arch <- queryTargetTarget executableStage queryArch
let codegen_arches = ["x86_64", "i386", "powerpc", "powerpc64", "powerpc64le", "aarch64", "wasm32", "riscv64", "loongarch64"]
let withNativeCodeGen
| unregisterised = False
| arch `elem` codegen_arches = True
| otherwise = False
- platform <- queryTargetTarget ghcStage targetPlatformTriple
- wordsize <- show @Int . (*8) <$> queryTargetTarget ghcStage (wordSize2Bytes . tgtWordSize)
+ platform <- queryTargetTarget executableStage targetPlatformTriple
+ wordsize <- show @Int . (*8) <$> queryTargetTarget executableStage (wordSize2Bytes . tgtWordSize)
- llc_cmd <- queryTargetTarget ghcStage tgtLlc
- llvm_as_cmd <- queryTargetTarget ghcStage tgtLlvmAs
+ llc_cmd <- queryTargetTarget executableStage tgtLlc
+ llvm_as_cmd <- queryTargetTarget executableStage tgtLlvmAs
let have_llvm = allowHaveLLVM arch && all isJust [llc_cmd, llvm_as_cmd]
top <- topDirectory
pkgConfCacheFile <- System.FilePath.normalise . (top -/-)
- <$> (packageDbPath (PackageDbLoc pkgCacheStage Final) <&> (-/- "package.cache"))
+ <$> (packageDbPath (PackageDbLoc libraryStage Final) <&> (-/- "package.cache"))
libdir <- System.FilePath.normalise . (top -/-)
- <$> stageLibPath pkgCacheStage
+ <$> stageLibPath libraryStage
-- For this information, we need to query ghc --info, however, that would
-- require building ghc, which we don't want to do here. Therefore, the
-- logic from `platformHasRTSLinker` is duplicated here.
- let rtsLinker = not $ arch `elem` ["powerpc", "powerpc64", "powerpc64le", "s390x", "loongarch64", "javascript"]
+ let rtsLinker = arch `notElem` ["powerpc", "powerpc64", "powerpc64le", "s390x", "loongarch64", "javascript"]
return TestCompilerArgs{..}
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/8dc900bb1a28b16c8bee5f16cfe675…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/8dc900bb1a28b16c8bee5f16cfe675…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][wip/jeltsch/system-io-uncovering] Remove in-package dependencies on `GHC.Internal.System.IO`
by Wolfgang Jeltsch (@jeltsch) 26 Feb '26
by Wolfgang Jeltsch (@jeltsch) 26 Feb '26
26 Feb '26
Wolfgang Jeltsch pushed to branch wip/jeltsch/system-io-uncovering at Glasgow Haskell Compiler / GHC
Commits:
416e4108 by Wolfgang Jeltsch at 2026-02-26T20:58:09+02:00
Remove in-package dependencies on `GHC.Internal.System.IO`
This contribution eliminates all dependencies on
`GHC.Internal.System.IO` from within `ghc-internal`. It comprises the
following changes:
* Make `GHC.Internal.Fingerprint` independent of I/O support
* Tighten the dependencies of `GHC.Internal.Data.Version`
* Move some `IsString` instance declarations into `base`
* Move the `* -> *` `Heap.Closure` instances into `ghc-heap`
* Move some code that needs `System.IO` to `template-haskell`
* Tighten the dependencies of `GHC.Internal.TH.Monad`
* Move the `GHC.ResponseFile` implementation into `base`
* Move the `System.Exit` implementation into `base`
* Move the `GHCi.Helpers` implementation into `base`
* Move the `System.IO.OS` implementation into `base`
- - - - -
20 changed files:
- libraries/base/src/GHC/Fingerprint.hs
- libraries/base/src/GHC/GHCi/Helpers.hs
- libraries/base/src/GHC/ResponseFile.hs
- libraries/base/src/System/Exit.hs
- libraries/base/src/System/IO/OS.hs
- libraries/ghc-heap/GHC/Exts/Heap/Closures.hs
- libraries/ghc-internal/ghc-internal.cabal.in
- libraries/ghc-internal/src/GHC/Internal/Data/Version.hs
- libraries/ghc-internal/src/GHC/Internal/Fingerprint.hs
- − libraries/ghc-internal/src/GHC/Internal/GHCi/Helpers.hs
- libraries/ghc-internal/src/GHC/Internal/Heap/Closures.hs
- − libraries/ghc-internal/src/GHC/Internal/ResponseFile.hs
- − libraries/ghc-internal/src/GHC/Internal/System/Exit.hs
- − libraries/ghc-internal/src/GHC/Internal/System/IO/OS.hs
- libraries/ghc-internal/src/GHC/Internal/TH/Monad.hs
- libraries/template-haskell/Language/Haskell/TH/Syntax.hs
- testsuite/tests/interface-stability/ghc-experimental-exports.stdout
- testsuite/tests/interface-stability/ghc-experimental-exports.stdout-mingw32
- testsuite/tests/plugins/plugins10.stdout
- testsuite/tests/typecheck/should_fail/T12921.stderr
Changes:
=====================================
libraries/base/src/GHC/Fingerprint.hs
=====================================
@@ -9,3 +9,45 @@ module GHC.Fingerprint (
) where
import GHC.Internal.Fingerprint
+
+import Data.Function (($))
+import Control.Monad (return, when)
+import Data.Bool (not, (&&))
+import Data.List ((++))
+import Data.Maybe (Maybe (Nothing, Just))
+import Data.Int (Int)
+import Data.Word (Word8)
+import Data.Eq ((/=))
+import Text.Show (show)
+import System.IO
+ (
+ IO,
+ FilePath,
+ IOMode (ReadMode),
+ withBinaryFile,
+ hGetBuf,
+ hIsEOF
+ )
+import Foreign.Ptr (Ptr)
+import GHC.Err (errorWithoutStackTrace)
+
+-- | Computes the hash of a given file.
+-- This function runs in constant memory.
+--
+-- @since base-4.7.0.0
+getFileHash :: FilePath -> IO Fingerprint
+getFileHash path = withBinaryFile path ReadMode $ \ hdl ->
+ let
+ readChunk :: Ptr Word8 -> Int -> IO (Maybe Int)
+ readChunk bufferPtr bufferSize = do
+ chunkSize <- hGetBuf hdl bufferPtr bufferSize
+ isFinished <- hIsEOF hdl
+ when (chunkSize /= bufferSize && not isFinished)
+ (
+ errorWithoutStackTrace $
+ "GHC.Fingerprint.getFileHash: could only read " ++
+ show chunkSize ++
+ " bytes, but more are available"
+ )
+ return (if isFinished then Just chunkSize else Nothing)
+ in fingerprintBufferedStream readChunk
=====================================
libraries/base/src/GHC/GHCi/Helpers.hs
=====================================
@@ -24,4 +24,30 @@ module GHC.GHCi.Helpers
evalWrapper
) where
-import GHC.Internal.GHCi.Helpers
\ No newline at end of file
+import Data.String (String)
+import System.IO
+ (
+ IO,
+ BufferMode (NoBuffering),
+ hSetBuffering,
+ hFlush,
+ stdin,
+ stdout,
+ stderr
+ )
+import System.Environment (withProgName, withArgs)
+
+disableBuffering :: IO ()
+disableBuffering = do
+ hSetBuffering stdin NoBuffering
+ hSetBuffering stdout NoBuffering
+ hSetBuffering stderr NoBuffering
+
+flushAll :: IO ()
+flushAll = do
+ hFlush stdout
+ hFlush stderr
+
+evalWrapper :: String -> [String] -> IO a -> IO a
+evalWrapper progName args m =
+ withProgName progName (withArgs args m)
=====================================
libraries/base/src/GHC/ResponseFile.hs
=====================================
@@ -1,3 +1,4 @@
+{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE Safe #-}
-- |
@@ -19,4 +20,145 @@ module GHC.ResponseFile (
expandResponse
) where
-import GHC.Internal.ResponseFile
+import Control.Monad (return, (>>=), mapM)
+import Control.Exception (IOException, catch)
+import Data.Function (($), (.))
+import Data.Bool (Bool (False, True), otherwise, not, (||))
+import Data.Char (Char, isSpace)
+import Data.List ((++), map, filter, concat, reverse)
+import Data.String (String, unlines)
+import Data.Functor (fmap)
+import Data.Foldable (null, foldl')
+import Data.Eq ((==))
+import Text.Show (show)
+import System.Environment (getArgs)
+import System.IO (IO, hPutStrLn, readFile, stderr)
+import System.Exit (exitFailure)
+
+{-|
+Like 'getArgs', but can also read arguments supplied via response files.
+
+
+For example, consider a program @foo@:
+
+@
+main :: IO ()
+main = do
+ args <- getArgsWithResponseFiles
+ putStrLn (show args)
+@
+
+
+And a response file @args.txt@:
+
+@
+--one 1
+--\'two\' 2
+--"three" 3
+@
+
+Then the result of invoking @foo@ with @args.txt@ is:
+
+> > ./foo @args.txt
+> ["--one","1","--two","2","--three","3"]
+
+-}
+getArgsWithResponseFiles :: IO [String]
+getArgsWithResponseFiles = getArgs >>= expandResponse
+
+-- | Given a string of concatenated strings, separate each by removing
+-- a layer of /quoting/ and\/or /escaping/ of certain characters.
+--
+-- These characters are: any whitespace, single quote, double quote,
+-- and the backslash character. The backslash character always
+-- escapes (i.e., passes through without further consideration) the
+-- character which follows. Characters can also be escaped in blocks
+-- by quoting (i.e., surrounding the blocks with matching pairs of
+-- either single- or double-quotes which are not themselves escaped).
+--
+-- Any whitespace which appears outside of either of the quoting and
+-- escaping mechanisms, is interpreted as having been added by this
+-- special concatenation process to designate where the boundaries
+-- are between the original, un-concatenated list of strings. These
+-- added whitespace characters are removed from the output.
+--
+-- > unescapeArgs "hello\\ \\\"world\\\"\n" == ["hello \"world\""]
+unescapeArgs :: String -> [String]
+unescapeArgs = filter (not . null) . unescape
+
+-- | Given a list of strings, concatenate them into a single string
+-- with escaping of certain characters, and the addition of a newline
+-- between each string. The escaping is done by adding a single
+-- backslash character before any whitespace, single quote, double
+-- quote, or backslash character, so this escaping character must be
+-- removed. Unescaped whitespace (in this case, newline) is part
+-- of this "transport" format to indicate the end of the previous
+-- string and the start of a new string.
+--
+-- While 'unescapeArgs' allows using quoting (i.e., convenient
+-- escaping of many characters) by having matching sets of single- or
+-- double-quotes,'escapeArgs' does not use the quoting mechanism,
+-- and thus will always escape any whitespace, quotes, and
+-- backslashes.
+--
+-- > escapeArgs ["hello \"world\""] == "hello\\ \\\"world\\\"\n"
+escapeArgs :: [String] -> String
+escapeArgs = unlines . map escapeArg
+
+-- | Arguments which look like @\@foo@ will be replaced with the
+-- contents of file @foo@. A gcc-like syntax for response files arguments
+-- is expected. This must re-constitute the argument list by doing an
+-- inverse of the escaping mechanism done by the calling-program side.
+--
+-- We quit if the file is not found or reading somehow fails.
+-- (A convenience routine for haddock or possibly other clients)
+expandResponse :: [String] -> IO [String]
+expandResponse = fmap concat . mapM expand
+ where
+ expand :: String -> IO [String]
+ expand ('@':f) = readFileExc f >>= return . unescapeArgs
+ expand x = return [x]
+
+ readFileExc f =
+ readFile f `catch` \(e :: IOException) -> do
+ hPutStrLn stderr $ "Error while expanding response file: " ++ show e
+ exitFailure
+
+data Quoting = NoneQ | SngQ | DblQ
+
+unescape :: String -> [String]
+unescape args = reverse . map reverse $ go args NoneQ False [] []
+ where
+ -- n.b., the order of these cases matters; these are cribbed from gcc
+ -- case 1: end of input
+ go [] _q _bs a as = a:as
+ -- case 2: back-slash escape in progress
+ go (c:cs) q True a as = go cs q False (c:a) as
+ -- case 3: no back-slash escape in progress, but got a back-slash
+ go (c:cs) q False a as
+ | '\\' == c = go cs q True a as
+ -- case 4: single-quote escaping in progress
+ go (c:cs) SngQ False a as
+ | '\'' == c = go cs NoneQ False a as
+ | otherwise = go cs SngQ False (c:a) as
+ -- case 5: double-quote escaping in progress
+ go (c:cs) DblQ False a as
+ | '"' == c = go cs NoneQ False a as
+ | otherwise = go cs DblQ False (c:a) as
+ -- case 6: no escaping is in progress
+ go (c:cs) NoneQ False a as
+ | isSpace c = go cs NoneQ False [] (a:as)
+ | '\'' == c = go cs SngQ False a as
+ | '"' == c = go cs DblQ False a as
+ | otherwise = go cs NoneQ False (c:a) as
+
+escapeArg :: String -> String
+escapeArg = reverse . foldl' escape []
+
+escape :: String -> Char -> String
+escape cs c
+ | isSpace c
+ || '\\' == c
+ || '\'' == c
+ || '"' == c = c:'\\':cs -- n.b., our caller must reverse the result
+ | otherwise = c:cs
=====================================
libraries/base/src/System/Exit.hs
=====================================
@@ -21,4 +21,67 @@ module System.Exit
die
) where
-import GHC.Internal.System.Exit
\ No newline at end of file
+import GHC.IO.Exception
+ (
+ IOErrorType (InvalidArgument),
+ IOException (IOError),
+ ExitCode (ExitSuccess, ExitFailure)
+ )
+import Control.Monad ((>>))
+import Control.Exception (throwIO, ioError)
+import Data.Bool (otherwise)
+import Data.Maybe (Maybe (Nothing))
+import Data.String (String)
+import Data.Eq ((/=))
+import System.IO (IO, hPutStrLn, stderr)
+
+-- ---------------------------------------------------------------------------
+-- exitWith
+
+-- | Computation 'exitWith' @code@ throws 'ExitCode' @code@.
+-- Normally this terminates the program, returning @code@ to the
+-- program's caller.
+--
+-- On program termination, the standard 'Handle's 'stdout' and
+-- 'stderr' are flushed automatically; any other buffered 'Handle's
+-- need to be flushed manually, otherwise the buffered data will be
+-- discarded.
+--
+-- A program that fails in any other way is treated as if it had
+-- called 'exitFailure'.
+-- A program that terminates successfully without calling 'exitWith'
+-- explicitly is treated as if it had called 'exitWith' 'ExitSuccess'.
+--
+-- As an 'ExitCode' is an 'Control.Exception.Exception', it can be
+-- caught using the functions of "Control.Exception". This means that
+-- cleanup computations added with 'GHC.Internal.Control.Exception.bracket' (from
+-- "Control.Exception") are also executed properly on 'exitWith'.
+--
+-- Note: in GHC, 'exitWith' should be called from the main program
+-- thread in order to exit the process. When called from another
+-- thread, 'exitWith' will throw an 'ExitCode' as normal, but the
+-- exception will not cause the process itself to exit.
+--
+exitWith :: ExitCode -> IO a
+exitWith ExitSuccess = throwIO ExitSuccess
+exitWith code@(ExitFailure n)
+ | n /= 0 = throwIO code
+ | otherwise = ioError (IOError Nothing InvalidArgument "exitWith" "ExitFailure 0" Nothing Nothing)
+
+-- | The computation 'exitFailure' is equivalent to
+-- 'exitWith' @(@'ExitFailure' /exitfail/@)@,
+-- where /exitfail/ is implementation-dependent.
+exitFailure :: IO a
+exitFailure = exitWith (ExitFailure 1)
+
+-- | The computation 'exitSuccess' is equivalent to
+-- 'exitWith' 'ExitSuccess', It terminates the program
+-- successfully.
+exitSuccess :: IO a
+exitSuccess = exitWith ExitSuccess
+
+-- | Write given error message to `stderr` and terminate with `exitFailure`.
+--
+-- @since base-4.8.0.0
+die :: String -> IO a
+die err = hPutStrLn stderr err >> exitFailure
=====================================
libraries/base/src/System/IO/OS.hs
=====================================
@@ -1,4 +1,6 @@
{-# LANGUAGE Safe #-}
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE RankNTypes #-}
{-|
This module bridges between Haskell handles and underlying operating-system
@@ -21,17 +23,293 @@ module System.IO.OS
)
where
-import GHC.Internal.System.IO.OS
+import Control.Monad (return)
+import Control.Concurrent.MVar (MVar)
+import Control.Exception (mask)
+import Data.Function (const, (.), ($))
+import Data.Functor (fmap)
+import Data.Maybe (Maybe (Nothing), maybe)
+#if defined(mingw32_HOST_OS)
+import Data.Bool (otherwise)
+import Data.Maybe (Maybe (Just))
+#endif
+import Data.List ((++))
+import Data.String (String)
+import Data.Typeable (Typeable, cast)
+import System.IO (IO)
+import GHC.IO.FD (fdFD)
+#if defined(mingw32_HOST_OS)
+import GHC.IO.Windows.Handle
(
- withFileDescriptorReadingBiased,
- withFileDescriptorWritingBiased,
- withWindowsHandleReadingBiased,
- withWindowsHandleWritingBiased,
- withFileDescriptorReadingBiasedRaw,
- withFileDescriptorWritingBiasedRaw,
- withWindowsHandleReadingBiasedRaw,
- withWindowsHandleWritingBiasedRaw
+ NativeHandle,
+ ConsoleHandle,
+ IoHandle,
+ toHANDLE
)
+#endif
+import GHC.IO.Handle.Types
+ (
+ Handle (FileHandle, DuplexHandle),
+ Handle__ (Handle__, haDevice)
+ )
+import GHC.IO.Handle.Internals (withHandle_', flushBuffer)
+import GHC.IO.Exception
+ (
+ IOErrorType (InappropriateType),
+ IOException (IOError),
+ ioException
+ )
+import Foreign.Ptr (Ptr)
+import Foreign.C.Types (CInt)
+
+-- * Obtaining POSIX file descriptors and Windows handles
+
+{-|
+ Executes a user-provided action on an operating-system handle that underlies
+ a Haskell handle. Before the user-provided action is run, user-defined
+ preparation based on the handle state that contains the operating-system
+ handle is performed. While the user-provided action is executed, further
+ operations on the Haskell handle are blocked to a degree that interference
+ with this action is prevented.
+
+ See [below](#with-ref-caveats) for caveats regarding this operation.
+-}
+withOSHandle :: String
+ -- ^ The name of the overall operation
+ -> (Handle -> MVar Handle__)
+ {-^
+ Obtaining of the handle state variable that holds the
+ operating-system handle
+ -}
+ -> (forall d. Typeable d => d -> IO a)
+ -- ^ Conversion of a device into an operating-system handle
+ -> (Handle__ -> IO ())
+ -- ^ The preparation
+ -> Handle
+ -- ^ The Haskell handle to use
+ -> (a -> IO r)
+ -- ^ The action to execute on the operating-system handle
+ -> IO r
+withOSHandle opName handleStateVar getOSHandle prepare handle act
+ = mask $ \ withOriginalMaskingState ->
+ withHandleState $ \ handleState@Handle__ {haDevice = dev} -> do
+ osHandle <- getOSHandle dev
+ prepare handleState
+ withOriginalMaskingState $ act osHandle
+ where
+
+ withHandleState = withHandle_' opName handle (handleStateVar handle)
+{-
+ The 'withHandle_'' operation, which we use here, already performs masking.
+ Still, we have to employ 'mask', in order do obtain the operation that
+ restores the original masking state. The user-provided action should be
+ executed with this original masking state, as there is no inherent reason to
+ generally perform it with masking in place. The masking that 'withHandle_''
+ performs is only for safely accessing handle state and thus constitutes an
+ implementation detail; it has nothing to do with the user-provided action.
+-}
+{-
+ The order of actions in 'withOSHandle' is such that any exception from
+ 'getOSHandle' is thrown before the user-defined preparation is performed.
+-}
+
+{-|
+ Obtains the handle state variable that underlies a handle or specifically
+ the handle state variable for reading if the handle uses different state
+ variables for reading and writing.
+-}
+handleStateVarReadingBiased :: Handle -> MVar Handle__
+handleStateVarReadingBiased (FileHandle _ var) = var
+handleStateVarReadingBiased (DuplexHandle _ readingVar _) = readingVar
+
+{-|
+ Obtains the handle state variable that underlies a handle or specifically
+ the handle state variable for writing if the handle uses different state
+ variables for reading and writing.
+-}
+handleStateVarWritingBiased :: Handle -> MVar Handle__
+handleStateVarWritingBiased (FileHandle _ var) = var
+handleStateVarWritingBiased (DuplexHandle _ _ writingVar) = writingVar
+
+{-|
+ Yields the result of another operation if that operation succeeded, and
+ otherwise throws an exception that signals that the other operation failed
+ because some Haskell handle does not use an operating-system handle of a
+ required type.
+-}
+requiringOSHandleOfType :: String
+ -- ^ The name of the operating-system handle type
+ -> Maybe a
+ {-^
+ The result of the other operation if it succeeded
+ -}
+ -> IO a
+requiringOSHandleOfType osHandleTypeName
+ = maybe (ioException osHandleOfTypeRequired) return
+ where
+
+ osHandleOfTypeRequired :: IOException
+ osHandleOfTypeRequired
+ = IOError Nothing
+ InappropriateType
+ ""
+ ("handle does not use " ++ osHandleTypeName ++ "s")
+ Nothing
+ Nothing
+
+{-|
+ Obtains the POSIX file descriptor of a device if the device contains one,
+ and throws an exception otherwise.
+-}
+getFileDescriptor :: Typeable d => d -> IO CInt
+getFileDescriptor = requiringOSHandleOfType "POSIX file descriptor" .
+ fmap fdFD . cast
+
+{-|
+ Obtains the Windows handle of a device if the device contains one, and
+ throws an exception otherwise.
+-}
+getWindowsHandle :: Typeable d => d -> IO (Ptr ())
+getWindowsHandle = requiringOSHandleOfType "Windows handle" .
+ toMaybeWindowsHandle
+ where
+
+ toMaybeWindowsHandle :: Typeable d => d -> Maybe (Ptr ())
+#if defined(mingw32_HOST_OS)
+ toMaybeWindowsHandle dev
+ | Just nativeHandle <- cast dev :: Maybe (IoHandle NativeHandle)
+ = Just (toHANDLE nativeHandle)
+ | Just consoleHandle <- cast dev :: Maybe (IoHandle ConsoleHandle)
+ = Just (toHANDLE consoleHandle)
+ | otherwise
+ = Nothing
+ {-
+ This is inspired by the implementation of
+ 'System.Win32.Types.withHandleToHANDLENative'.
+ -}
+#else
+ toMaybeWindowsHandle _ = Nothing
+#endif
+
+{-|
+ Executes a user-provided action on the POSIX file descriptor that underlies
+ a handle or specifically on the POSIX file descriptor for reading if the
+ handle uses different file descriptors for reading and writing. The
+ Haskell-managed buffers related to the file descriptor are flushed before
+ the user-provided action is run. While this action is executed, further
+ operations on the handle are blocked to a degree that interference with this
+ action is prevented.
+
+ If the handle does not use POSIX file descriptors, an exception is thrown.
+
+ See [below](#with-ref-caveats) for caveats regarding this operation.
+-}
+withFileDescriptorReadingBiased :: Handle -> (CInt -> IO r) -> IO r
+withFileDescriptorReadingBiased = withOSHandle "withFileDescriptorReadingBiased"
+ handleStateVarReadingBiased
+ getFileDescriptor
+ flushBuffer
+
+{-|
+ Executes a user-provided action on the POSIX file descriptor that underlies
+ a handle or specifically on the POSIX file descriptor for writing if the
+ handle uses different file descriptors for reading and writing. The
+ Haskell-managed buffers related to the file descriptor are flushed before
+ the user-provided action is run. While this action is executed, further
+ operations on the handle are blocked to a degree that interference with this
+ action is prevented.
+
+ If the handle does not use POSIX file descriptors, an exception is thrown.
+
+ See [below](#with-ref-caveats) for caveats regarding this operation.
+-}
+withFileDescriptorWritingBiased :: Handle -> (CInt -> IO r) -> IO r
+withFileDescriptorWritingBiased = withOSHandle "withFileDescriptorWritingBiased"
+ handleStateVarWritingBiased
+ getFileDescriptor
+ flushBuffer
+
+{-|
+ Executes a user-provided action on the Windows handle that underlies a
+ Haskell handle or specifically on the Windows handle for reading if the
+ Haskell handle uses different Windows handles for reading and writing. The
+ Haskell-managed buffers related to the Windows handle are flushed before the
+ user-provided action is run. While this action is executed, further
+ operations on the Haskell handle are blocked to a degree that interference
+ with this action is prevented.
+
+ If the Haskell handle does not use Windows handles, an exception is thrown.
+
+ See [below](#with-ref-caveats) for caveats regarding this operation.
+-}
+withWindowsHandleReadingBiased :: Handle -> (Ptr () -> IO r) -> IO r
+withWindowsHandleReadingBiased = withOSHandle "withWindowsHandleReadingBiased"
+ handleStateVarReadingBiased
+ getWindowsHandle
+ flushBuffer
+
+{-|
+ Executes a user-provided action on the Windows handle that underlies a
+ Haskell handle or specifically on the Windows handle for writing if the
+ Haskell handle uses different Windows handles for reading and writing. The
+ Haskell-managed buffers related to the Windows handle are flushed before the
+ user-provided action is run. While this action is executed, further
+ operations on the Haskell handle are blocked to a degree that interference
+ with this action is prevented.
+
+ If the Haskell handle does not use Windows handles, an exception is thrown.
+
+ See [below](#with-ref-caveats) for caveats regarding this operation.
+-}
+withWindowsHandleWritingBiased :: Handle -> (Ptr () -> IO r) -> IO r
+withWindowsHandleWritingBiased = withOSHandle "withWindowsHandleWritingBiased"
+ handleStateVarWritingBiased
+ getWindowsHandle
+ flushBuffer
+
+{-|
+ Like 'withFileDescriptorReadingBiased' except that Haskell-managed buffers
+ are not flushed.
+-}
+withFileDescriptorReadingBiasedRaw :: Handle -> (CInt -> IO r) -> IO r
+withFileDescriptorReadingBiasedRaw
+ = withOSHandle "withFileDescriptorReadingBiasedRaw"
+ handleStateVarReadingBiased
+ getFileDescriptor
+ (const $ return ())
+
+{-|
+ Like 'withFileDescriptorWritingBiased' except that Haskell-managed buffers
+ are not flushed.
+-}
+withFileDescriptorWritingBiasedRaw :: Handle -> (CInt -> IO r) -> IO r
+withFileDescriptorWritingBiasedRaw
+ = withOSHandle "withFileDescriptorWritingBiasedRaw"
+ handleStateVarWritingBiased
+ getFileDescriptor
+ (const $ return ())
+
+{-|
+ Like 'withWindowsHandleReadingBiased' except that Haskell-managed buffers
+ are not flushed.
+-}
+withWindowsHandleReadingBiasedRaw :: Handle -> (Ptr () -> IO r) -> IO r
+withWindowsHandleReadingBiasedRaw
+ = withOSHandle "withWindowsHandleReadingBiasedRaw"
+ handleStateVarReadingBiased
+ getWindowsHandle
+ (const $ return ())
+
+{-|
+ Like 'withWindowsHandleWritingBiased' except that Haskell-managed buffers
+ are not flushed.
+-}
+withWindowsHandleWritingBiasedRaw :: Handle -> (Ptr () -> IO r) -> IO r
+withWindowsHandleWritingBiasedRaw
+ = withOSHandle "withWindowsHandleWritingBiasedRaw"
+ handleStateVarWritingBiased
+ getWindowsHandle
+ (const $ return ())
-- ** Caveats
=====================================
libraries/ghc-heap/GHC/Exts/Heap/Closures.hs
=====================================
@@ -1,10 +1,5 @@
{-# LANGUAGE CPP #-}
-{-# LANGUAGE ForeignFunctionInterface #-}
-{-# LANGUAGE GHCForeignImportPrim #-}
-{-# LANGUAGE MagicHash #-}
-{-# LANGUAGE RecordWildCards #-}
-{-# LANGUAGE UnliftedFFITypes #-}
-{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE DeriveTraversable #-}
-- Late cost centres introduce a thunk in the asBox function, which leads to
-- an additional wrapper being added to any value placed inside a box.
@@ -42,3 +37,23 @@ module GHC.Exts.Heap.Closures (
) where
import GHC.Internal.Heap.Closures
+
+import GHC.Internal.Data.Functor
+import GHC.Internal.Data.Foldable
+import GHC.Internal.Data.Traversable
+
+deriving instance Functor GenClosure
+deriving instance Foldable GenClosure
+deriving instance Traversable GenClosure
+
+deriving instance Functor GenStgStackClosure
+deriving instance Foldable GenStgStackClosure
+deriving instance Traversable GenStgStackClosure
+
+deriving instance Functor GenStackField
+deriving instance Foldable GenStackField
+deriving instance Traversable GenStackField
+
+deriving instance Functor GenStackFrame
+deriving instance Foldable GenStackFrame
+deriving instance Traversable GenStackFrame
=====================================
libraries/ghc-internal/ghc-internal.cabal.in
=====================================
@@ -228,7 +228,6 @@ Library
GHC.Internal.ForeignPtr
GHC.Internal.Functor.ZipList
GHC.Internal.GHCi
- GHC.Internal.GHCi.Helpers
GHC.Internal.Generics
GHC.Internal.Heap.Closures
GHC.Internal.Heap.Constants
@@ -284,7 +283,6 @@ Library
GHC.Internal.Read
GHC.Internal.Real
GHC.Internal.Records
- GHC.Internal.ResponseFile
GHC.Internal.RTS.Flags
GHC.Internal.RTS.Flags.Test
GHC.Internal.ST
@@ -323,10 +321,8 @@ Library
GHC.Internal.Numeric.Natural
GHC.Internal.System.Environment
GHC.Internal.System.Environment.Blank
- GHC.Internal.System.Exit
GHC.Internal.System.IO
GHC.Internal.System.IO.Error
- GHC.Internal.System.IO.OS
GHC.Internal.System.Mem
GHC.Internal.System.Mem.StableName
GHC.Internal.System.Posix.Internals
=====================================
libraries/ghc-internal/src/GHC/Internal/Data/Version.hs
=====================================
@@ -41,8 +41,7 @@ import GHC.Internal.Data.Eq
import GHC.Internal.Int ( Int )
import GHC.Internal.Data.List ( map, sort, concat, concatMap, intersperse, (++) )
import GHC.Internal.Data.Ord
-import GHC.Internal.Data.String ( String )
-import GHC.Internal.Base ( Applicative(..), (&&) )
+import GHC.Internal.Base ( Applicative(..), (&&), String )
import GHC.Internal.Generics
import GHC.Internal.Unicode ( isDigit, isAlphaNum )
import GHC.Internal.Read
=====================================
libraries/ghc-internal/src/GHC/Internal/Fingerprint.hs
=====================================
@@ -16,23 +16,22 @@ module GHC.Internal.Fingerprint (
fingerprintData,
fingerprintString,
fingerprintFingerprints,
- getFileHash
+ fingerprintBufferedStream
) where
import GHC.Internal.IO
import GHC.Internal.Base
import GHC.Internal.Bits
import GHC.Internal.Num
+import GHC.Internal.Data.Maybe
import GHC.Internal.List
import GHC.Internal.Real
import GHC.Internal.Word
-import GHC.Internal.Show
import GHC.Internal.Ptr
import GHC.Internal.Foreign.C.Types
import GHC.Internal.Foreign.Marshal.Alloc
import GHC.Internal.Foreign.Marshal.Array
import GHC.Internal.Foreign.Storable
-import GHC.Internal.System.IO
import GHC.Internal.Fingerprint.Type
@@ -71,41 +70,27 @@ fingerprintString str = unsafeDupablePerformIO $
fromIntegral (w32 `shiftR` 8),
fromIntegral w32]
--- | Computes the hash of a given file.
--- This function loops over the handle, running in constant memory.
---
--- @since base-4.7.0.0
-getFileHash :: FilePath -> IO Fingerprint
-getFileHash path = withBinaryFile path ReadMode $ \h ->
+-- | Reads data in chunks and computes its hash.
+-- This function runs in constant memory.
+fingerprintBufferedStream :: (Ptr Word8 -> Int -> IO (Maybe Int))
+ -> IO Fingerprint
+fingerprintBufferedStream readChunk =
allocaBytes SIZEOF_STRUCT_MD5CONTEXT $ \pctxt -> do
c_MD5Init pctxt
-
- processChunks h (\buf size -> c_MD5Update pctxt buf (fromIntegral size))
-
+ allocaBytes _BUFSIZE $ \arrPtr ->
+ let loop = do
+ maybeRemainderSize <- readChunk arrPtr _BUFSIZE
+ c_MD5Update pctxt
+ arrPtr
+ (fromIntegral (fromMaybe _BUFSIZE maybeRemainderSize))
+ when (isNothing maybeRemainderSize) loop
+ in loop
allocaBytes 16 $ \pdigest -> do
c_MD5Final pdigest pctxt
peek (castPtr pdigest :: Ptr Fingerprint)
-
where
_BUFSIZE = 4096
- -- Loop over _BUFSIZE sized chunks read from the handle,
- -- passing the callback a block of bytes and its size.
- processChunks :: Handle -> (Ptr Word8 -> Int -> IO ()) -> IO ()
- processChunks h f = allocaBytes _BUFSIZE $ \arrPtr ->
-
- let loop = do
- count <- hGetBuf h arrPtr _BUFSIZE
- eof <- hIsEOF h
- when (count /= _BUFSIZE && not eof) $ errorWithoutStackTrace $
- "GHC.Internal.Fingerprint.getFileHash: only read " ++ show count ++ " bytes"
-
- f arrPtr count
-
- when (not eof) loop
-
- in loop
-
data MD5Context
foreign import ccall unsafe "__hsbase_MD5Init"
=====================================
libraries/ghc-internal/src/GHC/Internal/GHCi/Helpers.hs deleted
=====================================
@@ -1,44 +0,0 @@
-{-# LANGUAGE Trustworthy #-}
-
------------------------------------------------------------------------------
--- |
--- Module : GHC.Internal.GHCi.Helpers
--- Copyright : (c) The GHC Developers
--- License : see libraries/base/LICENSE
---
--- Maintainer : ghc-devs(a)haskell.org
--- Stability : internal
--- Portability : non-portable (GHC Extensions)
---
--- Various helpers used by the GHCi shell.
---
--- /The API of this module is unstable and not meant to be consumed by the general public./
--- If you absolutely must depend on it, make sure to use a tight upper
--- bound, e.g., @base < 4.X@ rather than @base < 5@, because the interface can
--- change rapidly without much warning.
---
------------------------------------------------------------------------------
-
-module GHC.Internal.GHCi.Helpers
- ( disableBuffering, flushAll
- , evalWrapper
- ) where
-
-import GHC.Internal.Base
-import GHC.Internal.System.IO
-import GHC.Internal.System.Environment
-
-disableBuffering :: IO ()
-disableBuffering = do
- hSetBuffering stdin NoBuffering
- hSetBuffering stdout NoBuffering
- hSetBuffering stderr NoBuffering
-
-flushAll :: IO ()
-flushAll = do
- hFlush stdout
- hFlush stderr
-
-evalWrapper :: String -> [String] -> IO a -> IO a
-evalWrapper progName args m =
- withProgName progName (withArgs args m)
=====================================
libraries/ghc-internal/src/GHC/Internal/Heap/Closures.hs
=====================================
@@ -5,7 +5,6 @@
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE UnliftedFFITypes #-}
{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE DeriveTraversable #-}
-- Late cost centres introduce a thunk in the asBox function, which leads to
-- an additional wrapper being added to any value placed inside a box.
-- This can be removed once our boot compiler is no longer affected by #25212
@@ -69,8 +68,7 @@ in the profiling way. (#15197)
import GHC.Internal.Heap.ProfInfo.Types
import GHC.Internal.Data.Bits
-import GHC.Internal.Data.Foldable (Foldable, toList)
-import GHC.Internal.Data.Traversable (Traversable)
+import GHC.Internal.Data.Foldable (toList)
import GHC.Internal.Int
import GHC.Internal.Num
import GHC.Internal.Real
@@ -383,7 +381,7 @@ data GenClosure b
-- or an Int#).
| UnknownTypeWordSizedPrimitive
{ wordVal :: !Word }
- deriving (Show, Generic, Functor, Foldable, Traversable)
+ deriving (Show, Generic)
-- | Get the info table for a heap closure, or Nothing for a prim value
--
@@ -500,7 +498,7 @@ data GenStgStackClosure b = GenStgStackClosure
, ssc_stack_size :: !Word32 -- ^ stack size in *words*
, ssc_stack :: ![GenStackFrame b]
}
- deriving (Foldable, Functor, Generic, Show, Traversable)
+ deriving (Generic, Show)
type StackField = GenStackField Box
@@ -510,7 +508,7 @@ data GenStackField b
= StackWord !Word
-- | A pointer field
| StackBox !b
- deriving (Foldable, Functor, Generic, Show, Traversable)
+ deriving (Generic, Show)
type StackFrame = GenStackFrame Box
@@ -579,7 +577,7 @@ data GenStackFrame b =
{ info_tbl :: !StgInfoTable
, annotation :: !b
}
- deriving (Foldable, Functor, Generic, Show, Traversable)
+ deriving (Generic, Show)
data PrimType
= PInt
=====================================
libraries/ghc-internal/src/GHC/Internal/ResponseFile.hs deleted
=====================================
@@ -1,163 +0,0 @@
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE Trustworthy #-}
-
------------------------------------------------------------------------------
--- |
--- Module : GHC.Internal.ResponseFile
--- License : BSD-style (see the file LICENSE)
---
--- Maintainer : libraries(a)haskell.org
--- Stability : internal
--- Portability : portable
---
--- GCC style response files.
---
--- @since base-4.12.0.0
-----------------------------------------------------------------------------
-
--- Migrated from Haddock.
-
-module GHC.Internal.ResponseFile (
- getArgsWithResponseFiles,
- unescapeArgs,
- escapeArgs, escapeArg,
- expandResponse
- ) where
-
-import GHC.Internal.Control.Exception
-import GHC.Internal.Data.Foldable (Foldable(..))
-import GHC.Internal.Base
-import GHC.Internal.Unicode (isSpace)
-import GHC.Internal.Data.List (filter, unlines, concat, reverse)
-import GHC.Internal.Text.Show (show)
-import GHC.Internal.System.Environment (getArgs)
-import GHC.Internal.System.Exit (exitFailure)
-import GHC.Internal.System.IO
-
-{-|
-Like 'getArgs', but can also read arguments supplied via response files.
-
-
-For example, consider a program @foo@:
-
-@
-main :: IO ()
-main = do
- args <- getArgsWithResponseFiles
- putStrLn (show args)
-@
-
-
-And a response file @args.txt@:
-
-@
---one 1
---\'two\' 2
---"three" 3
-@
-
-Then the result of invoking @foo@ with @args.txt@ is:
-
-> > ./foo @args.txt
-> ["--one","1","--two","2","--three","3"]
-
--}
-getArgsWithResponseFiles :: IO [String]
-getArgsWithResponseFiles = getArgs >>= expandResponse
-
--- | Given a string of concatenated strings, separate each by removing
--- a layer of /quoting/ and\/or /escaping/ of certain characters.
---
--- These characters are: any whitespace, single quote, double quote,
--- and the backslash character. The backslash character always
--- escapes (i.e., passes through without further consideration) the
--- character which follows. Characters can also be escaped in blocks
--- by quoting (i.e., surrounding the blocks with matching pairs of
--- either single- or double-quotes which are not themselves escaped).
---
--- Any whitespace which appears outside of either of the quoting and
--- escaping mechanisms, is interpreted as having been added by this
--- special concatenation process to designate where the boundaries
--- are between the original, un-concatenated list of strings. These
--- added whitespace characters are removed from the output.
---
--- > unescapeArgs "hello\\ \\\"world\\\"\n" == ["hello \"world\""]
-unescapeArgs :: String -> [String]
-unescapeArgs = filter (not . null) . unescape
-
--- | Given a list of strings, concatenate them into a single string
--- with escaping of certain characters, and the addition of a newline
--- between each string. The escaping is done by adding a single
--- backslash character before any whitespace, single quote, double
--- quote, or backslash character, so this escaping character must be
--- removed. Unescaped whitespace (in this case, newline) is part
--- of this "transport" format to indicate the end of the previous
--- string and the start of a new string.
---
--- While 'unescapeArgs' allows using quoting (i.e., convenient
--- escaping of many characters) by having matching sets of single- or
--- double-quotes,'escapeArgs' does not use the quoting mechanism,
--- and thus will always escape any whitespace, quotes, and
--- backslashes.
---
--- > escapeArgs ["hello \"world\""] == "hello\\ \\\"world\\\"\n"
-escapeArgs :: [String] -> String
-escapeArgs = unlines . map escapeArg
-
--- | Arguments which look like @\@foo@ will be replaced with the
--- contents of file @foo@. A gcc-like syntax for response files arguments
--- is expected. This must re-constitute the argument list by doing an
--- inverse of the escaping mechanism done by the calling-program side.
---
--- We quit if the file is not found or reading somehow fails.
--- (A convenience routine for haddock or possibly other clients)
-expandResponse :: [String] -> IO [String]
-expandResponse = fmap concat . mapM expand
- where
- expand :: String -> IO [String]
- expand ('@':f) = readFileExc f >>= return . unescapeArgs
- expand x = return [x]
-
- readFileExc f =
- readFile f `catch` \(e :: IOException) -> do
- hPutStrLn stderr $ "Error while expanding response file: " ++ show e
- exitFailure
-
-data Quoting = NoneQ | SngQ | DblQ
-
-unescape :: String -> [String]
-unescape args = reverse . map reverse $ go args NoneQ False [] []
- where
- -- n.b., the order of these cases matters; these are cribbed from gcc
- -- case 1: end of input
- go [] _q _bs a as = a:as
- -- case 2: back-slash escape in progress
- go (c:cs) q True a as = go cs q False (c:a) as
- -- case 3: no back-slash escape in progress, but got a back-slash
- go (c:cs) q False a as
- | '\\' == c = go cs q True a as
- -- case 4: single-quote escaping in progress
- go (c:cs) SngQ False a as
- | '\'' == c = go cs NoneQ False a as
- | otherwise = go cs SngQ False (c:a) as
- -- case 5: double-quote escaping in progress
- go (c:cs) DblQ False a as
- | '"' == c = go cs NoneQ False a as
- | otherwise = go cs DblQ False (c:a) as
- -- case 6: no escaping is in progress
- go (c:cs) NoneQ False a as
- | isSpace c = go cs NoneQ False [] (a:as)
- | '\'' == c = go cs SngQ False a as
- | '"' == c = go cs DblQ False a as
- | otherwise = go cs NoneQ False (c:a) as
-
-escapeArg :: String -> String
-escapeArg = reverse . foldl' escape []
-
-escape :: String -> Char -> String
-escape cs c
- | isSpace c
- || '\\' == c
- || '\'' == c
- || '"' == c = c:'\\':cs -- n.b., our caller must reverse the result
- | otherwise = c:cs
=====================================
libraries/ghc-internal/src/GHC/Internal/System/Exit.hs deleted
=====================================
@@ -1,81 +0,0 @@
-{-# LANGUAGE Trustworthy #-}
-
------------------------------------------------------------------------------
--- |
--- Module : GHC.Internal.System.Exit
--- Copyright : (c) The University of Glasgow 2001
--- License : BSD-style (see the file libraries/base/LICENSE)
---
--- Maintainer : libraries(a)haskell.org
--- Stability : provisional
--- Portability : portable
---
--- Exiting the program.
---
------------------------------------------------------------------------------
-
-module GHC.Internal.System.Exit
- (
- ExitCode(ExitSuccess,ExitFailure)
- , exitWith
- , exitFailure
- , exitSuccess
- , die
- ) where
-
-import GHC.Internal.System.IO
-
-import GHC.Internal.Base
-import GHC.Internal.IO
-import GHC.Internal.IO.Exception
-
--- ---------------------------------------------------------------------------
--- exitWith
-
--- | Computation 'exitWith' @code@ throws 'ExitCode' @code@.
--- Normally this terminates the program, returning @code@ to the
--- program's caller.
---
--- On program termination, the standard 'Handle's 'stdout' and
--- 'stderr' are flushed automatically; any other buffered 'Handle's
--- need to be flushed manually, otherwise the buffered data will be
--- discarded.
---
--- A program that fails in any other way is treated as if it had
--- called 'exitFailure'.
--- A program that terminates successfully without calling 'exitWith'
--- explicitly is treated as if it had called 'exitWith' 'ExitSuccess'.
---
--- As an 'ExitCode' is an 'Control.Exception.Exception', it can be
--- caught using the functions of "Control.Exception". This means that
--- cleanup computations added with 'GHC.Internal.Control.Exception.bracket' (from
--- "Control.Exception") are also executed properly on 'exitWith'.
---
--- Note: in GHC, 'exitWith' should be called from the main program
--- thread in order to exit the process. When called from another
--- thread, 'exitWith' will throw an 'ExitCode' as normal, but the
--- exception will not cause the process itself to exit.
---
-exitWith :: ExitCode -> IO a
-exitWith ExitSuccess = throwIO ExitSuccess
-exitWith code@(ExitFailure n)
- | n /= 0 = throwIO code
- | otherwise = ioError (IOError Nothing InvalidArgument "exitWith" "ExitFailure 0" Nothing Nothing)
-
--- | The computation 'exitFailure' is equivalent to
--- 'exitWith' @(@'ExitFailure' /exitfail/@)@,
--- where /exitfail/ is implementation-dependent.
-exitFailure :: IO a
-exitFailure = exitWith (ExitFailure 1)
-
--- | The computation 'exitSuccess' is equivalent to
--- 'exitWith' 'ExitSuccess', It terminates the program
--- successfully.
-exitSuccess :: IO a
-exitSuccess = exitWith ExitSuccess
-
--- | Write given error message to `stderr` and terminate with `exitFailure`.
---
--- @since base-4.8.0.0
-die :: String -> IO a
-die err = hPutStrLn stderr err >> exitFailure
=====================================
libraries/ghc-internal/src/GHC/Internal/System/IO/OS.hs deleted
=====================================
@@ -1,323 +0,0 @@
-{-# LANGUAGE Trustworthy #-}
-{-# LANGUAGE CPP #-}
-{-# LANGUAGE RankNTypes #-}
-
-{-|
- This module bridges between Haskell handles and underlying operating-system
- features.
--}
-module GHC.Internal.System.IO.OS
-(
- -- * Obtaining file descriptors and Windows handles
- withFileDescriptorReadingBiased,
- withFileDescriptorWritingBiased,
- withWindowsHandleReadingBiased,
- withWindowsHandleWritingBiased,
- withFileDescriptorReadingBiasedRaw,
- withFileDescriptorWritingBiasedRaw,
- withWindowsHandleReadingBiasedRaw,
- withWindowsHandleWritingBiasedRaw
-
- -- ** Caveats
- -- $with-ref-caveats
-)
-where
-
-#if defined(mingw32_HOST_OS)
-import GHC.Internal.Base (otherwise)
-#endif
-import GHC.Internal.Control.Monad (return)
-import GHC.Internal.Control.Concurrent.MVar (MVar)
-import GHC.Internal.Control.Exception (mask)
-import GHC.Internal.Data.Function (const, (.), ($))
-import GHC.Internal.Data.Functor (fmap)
-import GHC.Internal.Data.Maybe (Maybe (Nothing), maybe)
-#if defined(mingw32_HOST_OS)
-import GHC.Internal.Data.Maybe (Maybe (Just))
-#endif
-import GHC.Internal.Data.List ((++))
-import GHC.Internal.Data.String (String)
-import GHC.Internal.Data.Typeable (Typeable, cast)
-import GHC.Internal.System.IO (IO)
-import GHC.Internal.IO.FD (fdFD)
-#if defined(mingw32_HOST_OS)
-import GHC.Internal.IO.Windows.Handle
- (
- NativeHandle,
- ConsoleHandle,
- IoHandle,
- toHANDLE
- )
-#endif
-import GHC.Internal.IO.Handle.Types
- (
- Handle (FileHandle, DuplexHandle),
- Handle__ (Handle__, haDevice)
- )
-import GHC.Internal.IO.Handle.Internals (withHandle_', flushBuffer)
-import GHC.Internal.IO.Exception
- (
- IOErrorType (InappropriateType),
- IOException (IOError),
- ioException
- )
-import GHC.Internal.Foreign.Ptr (Ptr)
-import GHC.Internal.Foreign.C.Types (CInt)
-
--- * Obtaining POSIX file descriptors and Windows handles
-
-{-|
- Executes a user-provided action on an operating-system handle that underlies
- a Haskell handle. Before the user-provided action is run, user-defined
- preparation based on the handle state that contains the operating-system
- handle is performed. While the user-provided action is executed, further
- operations on the Haskell handle are blocked to a degree that interference
- with this action is prevented.
-
- See [below](#with-ref-caveats) for caveats regarding this operation.
--}
-withOSHandle :: String
- -- ^ The name of the overall operation
- -> (Handle -> MVar Handle__)
- {-^
- Obtaining of the handle state variable that holds the
- operating-system handle
- -}
- -> (forall d. Typeable d => d -> IO a)
- -- ^ Conversion of a device into an operating-system handle
- -> (Handle__ -> IO ())
- -- ^ The preparation
- -> Handle
- -- ^ The Haskell handle to use
- -> (a -> IO r)
- -- ^ The action to execute on the operating-system handle
- -> IO r
-withOSHandle opName handleStateVar getOSHandle prepare handle act
- = mask $ \ withOriginalMaskingState ->
- withHandleState $ \ handleState@Handle__ {haDevice = dev} -> do
- osHandle <- getOSHandle dev
- prepare handleState
- withOriginalMaskingState $ act osHandle
- where
-
- withHandleState = withHandle_' opName handle (handleStateVar handle)
-{-
- The 'withHandle_'' operation, which we use here, already performs masking.
- Still, we have to employ 'mask', in order do obtain the operation that
- restores the original masking state. The user-provided action should be
- executed with this original masking state, as there is no inherent reason to
- generally perform it with masking in place. The masking that 'withHandle_''
- performs is only for safely accessing handle state and thus constitutes an
- implementation detail; it has nothing to do with the user-provided action.
--}
-{-
- The order of actions in 'withOSHandle' is such that any exception from
- 'getOSHandle' is thrown before the user-defined preparation is performed.
--}
-
-{-|
- Obtains the handle state variable that underlies a handle or specifically
- the handle state variable for reading if the handle uses different state
- variables for reading and writing.
--}
-handleStateVarReadingBiased :: Handle -> MVar Handle__
-handleStateVarReadingBiased (FileHandle _ var) = var
-handleStateVarReadingBiased (DuplexHandle _ readingVar _) = readingVar
-
-{-|
- Obtains the handle state variable that underlies a handle or specifically
- the handle state variable for writing if the handle uses different state
- variables for reading and writing.
--}
-handleStateVarWritingBiased :: Handle -> MVar Handle__
-handleStateVarWritingBiased (FileHandle _ var) = var
-handleStateVarWritingBiased (DuplexHandle _ _ writingVar) = writingVar
-
-{-|
- Yields the result of another operation if that operation succeeded, and
- otherwise throws an exception that signals that the other operation failed
- because some Haskell handle does not use an operating-system handle of a
- required type.
--}
-requiringOSHandleOfType :: String
- -- ^ The name of the operating-system handle type
- -> Maybe a
- {-^
- The result of the other operation if it succeeded
- -}
- -> IO a
-requiringOSHandleOfType osHandleTypeName
- = maybe (ioException osHandleOfTypeRequired) return
- where
-
- osHandleOfTypeRequired :: IOException
- osHandleOfTypeRequired
- = IOError Nothing
- InappropriateType
- ""
- ("handle does not use " ++ osHandleTypeName ++ "s")
- Nothing
- Nothing
-
-{-|
- Obtains the POSIX file descriptor of a device if the device contains one,
- and throws an exception otherwise.
--}
-getFileDescriptor :: Typeable d => d -> IO CInt
-getFileDescriptor = requiringOSHandleOfType "POSIX file descriptor" .
- fmap fdFD . cast
-
-{-|
- Obtains the Windows handle of a device if the device contains one, and
- throws an exception otherwise.
--}
-getWindowsHandle :: Typeable d => d -> IO (Ptr ())
-getWindowsHandle = requiringOSHandleOfType "Windows handle" .
- toMaybeWindowsHandle
- where
-
- toMaybeWindowsHandle :: Typeable d => d -> Maybe (Ptr ())
-#if defined(mingw32_HOST_OS)
- toMaybeWindowsHandle dev
- | Just nativeHandle <- cast dev :: Maybe (IoHandle NativeHandle)
- = Just (toHANDLE nativeHandle)
- | Just consoleHandle <- cast dev :: Maybe (IoHandle ConsoleHandle)
- = Just (toHANDLE consoleHandle)
- | otherwise
- = Nothing
- {-
- This is inspired by the implementation of
- 'System.Win32.Types.withHandleToHANDLENative'.
- -}
-#else
- toMaybeWindowsHandle _ = Nothing
-#endif
-
-{-|
- Executes a user-provided action on the POSIX file descriptor that underlies
- a handle or specifically on the POSIX file descriptor for reading if the
- handle uses different file descriptors for reading and writing. The
- Haskell-managed buffers related to the file descriptor are flushed before
- the user-provided action is run. While this action is executed, further
- operations on the handle are blocked to a degree that interference with this
- action is prevented.
-
- If the handle does not use POSIX file descriptors, an exception is thrown.
-
- See [below](#with-ref-caveats) for caveats regarding this operation.
--}
-withFileDescriptorReadingBiased :: Handle -> (CInt -> IO r) -> IO r
-withFileDescriptorReadingBiased = withOSHandle "withFileDescriptorReadingBiased"
- handleStateVarReadingBiased
- getFileDescriptor
- flushBuffer
-
-{-|
- Executes a user-provided action on the POSIX file descriptor that underlies
- a handle or specifically on the POSIX file descriptor for writing if the
- handle uses different file descriptors for reading and writing. The
- Haskell-managed buffers related to the file descriptor are flushed before
- the user-provided action is run. While this action is executed, further
- operations on the handle are blocked to a degree that interference with this
- action is prevented.
-
- If the handle does not use POSIX file descriptors, an exception is thrown.
-
- See [below](#with-ref-caveats) for caveats regarding this operation.
--}
-withFileDescriptorWritingBiased :: Handle -> (CInt -> IO r) -> IO r
-withFileDescriptorWritingBiased = withOSHandle "withFileDescriptorWritingBiased"
- handleStateVarWritingBiased
- getFileDescriptor
- flushBuffer
-
-{-|
- Executes a user-provided action on the Windows handle that underlies a
- Haskell handle or specifically on the Windows handle for reading if the
- Haskell handle uses different Windows handles for reading and writing. The
- Haskell-managed buffers related to the Windows handle are flushed before the
- user-provided action is run. While this action is executed, further
- operations on the Haskell handle are blocked to a degree that interference
- with this action is prevented.
-
- If the Haskell handle does not use Windows handles, an exception is thrown.
-
- See [below](#with-ref-caveats) for caveats regarding this operation.
--}
-withWindowsHandleReadingBiased :: Handle -> (Ptr () -> IO r) -> IO r
-withWindowsHandleReadingBiased = withOSHandle "withWindowsHandleReadingBiased"
- handleStateVarReadingBiased
- getWindowsHandle
- flushBuffer
-
-{-|
- Executes a user-provided action on the Windows handle that underlies a
- Haskell handle or specifically on the Windows handle for writing if the
- Haskell handle uses different Windows handles for reading and writing. The
- Haskell-managed buffers related to the Windows handle are flushed before the
- user-provided action is run. While this action is executed, further
- operations on the Haskell handle are blocked to a degree that interference
- with this action is prevented.
-
- If the Haskell handle does not use Windows handles, an exception is thrown.
-
- See [below](#with-ref-caveats) for caveats regarding this operation.
--}
-withWindowsHandleWritingBiased :: Handle -> (Ptr () -> IO r) -> IO r
-withWindowsHandleWritingBiased = withOSHandle "withWindowsHandleWritingBiased"
- handleStateVarWritingBiased
- getWindowsHandle
- flushBuffer
-
-{-|
- Like 'withFileDescriptorReadingBiased' except that Haskell-managed buffers
- are not flushed.
--}
-withFileDescriptorReadingBiasedRaw :: Handle -> (CInt -> IO r) -> IO r
-withFileDescriptorReadingBiasedRaw
- = withOSHandle "withFileDescriptorReadingBiasedRaw"
- handleStateVarReadingBiased
- getFileDescriptor
- (const $ return ())
-
-{-|
- Like 'withFileDescriptorWritingBiased' except that Haskell-managed buffers
- are not flushed.
--}
-withFileDescriptorWritingBiasedRaw :: Handle -> (CInt -> IO r) -> IO r
-withFileDescriptorWritingBiasedRaw
- = withOSHandle "withFileDescriptorWritingBiasedRaw"
- handleStateVarWritingBiased
- getFileDescriptor
- (const $ return ())
-
-{-|
- Like 'withWindowsHandleReadingBiased' except that Haskell-managed buffers
- are not flushed.
--}
-withWindowsHandleReadingBiasedRaw :: Handle -> (Ptr () -> IO r) -> IO r
-withWindowsHandleReadingBiasedRaw
- = withOSHandle "withWindowsHandleReadingBiasedRaw"
- handleStateVarReadingBiased
- getWindowsHandle
- (const $ return ())
-
-{-|
- Like 'withWindowsHandleWritingBiased' except that Haskell-managed buffers
- are not flushed.
--}
-withWindowsHandleWritingBiasedRaw :: Handle -> (Ptr () -> IO r) -> IO r
-withWindowsHandleWritingBiasedRaw
- = withOSHandle "withWindowsHandleWritingBiasedRaw"
- handleStateVarWritingBiased
- getWindowsHandle
- (const $ return ())
-
--- ** Caveats
-
-{-$with-ref-caveats
- #with-ref-caveats#This subsection is just a dummy, whose purpose is to serve
- as the target of the hyperlinks above. The real documentation of the caveats
- is in the /Caveats/ subsection in the @base@ module @System.IO.OS@, which
- re-exports the above operations.
--}
=====================================
libraries/ghc-internal/src/GHC/Internal/TH/Monad.hs
=====================================
@@ -26,17 +26,19 @@ module GHC.Internal.TH.Monad
import Prelude
import Data.Data hiding (Fixity(..))
import Data.IORef
-import System.IO.Unsafe ( unsafePerformIO )
+import System.IO.Unsafe (unsafePerformIO)
import Control.Monad.IO.Class (MonadIO (..))
-import System.IO ( hPutStrLn, stderr )
+import System.IO (FilePath, hPutStrLn, stderr)
import qualified Data.Kind as Kind (Type)
-import GHC.Types (TYPE, RuntimeRep(..))
+import GHC.Types (TYPE, RuntimeRep(..))
#else
import GHC.Internal.Base hiding (NonEmpty(..),Type, Module, sequence)
import GHC.Internal.Data.Data hiding (Fixity(..))
import GHC.Internal.Data.Traversable
import GHC.Internal.IORef
-import GHC.Internal.System.IO
+import GHC.Internal.IO (FilePath)
+import GHC.Internal.IO.Handle.Text (hPutStrLn)
+import GHC.Internal.IO.StdHandles (stderr)
import GHC.Internal.Data.Foldable
import GHC.Internal.Data.Typeable
import GHC.Internal.Control.Monad.IO.Class
@@ -819,38 +821,6 @@ addTempFile suffix = Q (qAddTempFile suffix)
addTopDecls :: [Dec] -> Q ()
addTopDecls ds = Q (qAddTopDecls ds)
-
--- | Emit a foreign file which will be compiled and linked to the object for
--- the current module. Currently only languages that can be compiled with
--- the C compiler are supported, and the flags passed as part of -optc will
--- be also applied to the C compiler invocation that will compile them.
---
--- Note that for non-C languages (for example C++) @extern "C"@ directives
--- must be used to get symbols that we can access from Haskell.
---
--- To get better errors, it is recommended to use #line pragmas when
--- emitting C files, e.g.
---
--- > {-# LANGUAGE CPP #-}
--- > ...
--- > addForeignSource LangC $ unlines
--- > [ "#line " ++ show (__LINE__ + 1) ++ " " ++ show __FILE__
--- > , ...
--- > ]
-addForeignSource :: ForeignSrcLang -> String -> Q ()
-addForeignSource lang src = do
- let suffix = case lang of
- LangC -> "c"
- LangCxx -> "cpp"
- LangObjc -> "m"
- LangObjcxx -> "mm"
- LangAsm -> "s"
- LangJs -> "js"
- RawObject -> "a"
- path <- addTempFile suffix
- runIO $ writeFile path src
- addForeignFilePath lang path
-
-- | Same as 'addForeignSource', but expects to receive a path pointing to the
-- foreign file instead of a 'String' of its contents. Consider using this in
-- conjunction with 'addTempFile'.
=====================================
libraries/template-haskell/Language/Haskell/TH/Syntax.hs
=====================================
@@ -209,7 +209,7 @@ import Data.List.NonEmpty (NonEmpty(..))
import GHC.Lexeme ( startsVarSym, startsVarId )
-- This module completely re-exports 'GHC.Boot.TH.Syntax',
--- and exports additionally functions that depend on filepath.
+-- and exports additionally functions that depend on @filepath@ or @System.IO@.
-- |
addForeignFile :: ForeignSrcLang -> String -> Q ()
@@ -218,6 +218,37 @@ addForeignFile = addForeignSource
"Use 'Language.Haskell.TH.Syntax.addForeignSource' instead"
#-} -- deprecated in 8.6
+-- | Emit a foreign file which will be compiled and linked to the object for
+-- the current module. Currently only languages that can be compiled with
+-- the C compiler are supported, and the flags passed as part of -optc will
+-- be also applied to the C compiler invocation that will compile them.
+--
+-- Note that for non-C languages (for example C++) @extern "C"@ directives
+-- must be used to get symbols that we can access from Haskell.
+--
+-- To get better errors, it is recommended to use #line pragmas when
+-- emitting C files, e.g.
+--
+-- > {-# LANGUAGE CPP #-}
+-- > ...
+-- > addForeignSource LangC $ unlines
+-- > [ "#line " ++ show (__LINE__ + 1) ++ " " ++ show __FILE__
+-- > , ...
+-- > ]
+addForeignSource :: ForeignSrcLang -> String -> Q ()
+addForeignSource lang src = do
+ let suffix = case lang of
+ LangC -> "c"
+ LangCxx -> "cpp"
+ LangObjc -> "m"
+ LangObjcxx -> "mm"
+ LangAsm -> "s"
+ LangJs -> "js"
+ RawObject -> "a"
+ path <- addTempFile suffix
+ runIO $ writeFile path src
+ addForeignFilePath lang path
+
-- | The input is a filepath, which if relative is offset by the package root.
makeRelativeToProject :: FilePath -> Q FilePath
makeRelativeToProject fp | isRelative fp = do
=====================================
testsuite/tests/interface-stability/ghc-experimental-exports.stdout
=====================================
@@ -11190,8 +11190,6 @@ instance forall a. GHC.Internal.Classes.Ord (GHC.Internal.Ptr.FunPtr a) -- Defin
instance forall a. GHC.Internal.Classes.Ord (GHC.Internal.Ptr.Ptr a) -- Defined in ‘GHC.Internal.Ptr’
instance forall a. GHC.Internal.Classes.Ord a => GHC.Internal.Classes.Ord (GHC.Internal.Base.NonEmpty a) -- Defined in ‘GHC.Internal.Base’
instance GHC.Internal.Classes.Ord GHC.Internal.Base.Void -- Defined in ‘GHC.Internal.Base’
-instance forall a k (b :: k). GHC.Internal.Data.String.IsString a => GHC.Internal.Data.String.IsString (GHC.Internal.Data.Functor.Const.Const a b) -- Defined in ‘GHC.Internal.Data.String’
-instance forall a. GHC.Internal.Data.String.IsString a => GHC.Internal.Data.String.IsString (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.String’
instance forall a. (a ~ GHC.Internal.Types.Char) => GHC.Internal.Data.String.IsString [a] -- Defined in ‘GHC.Internal.Data.String’
instance forall a. GHC.Internal.Enum.Bounded a => GHC.Internal.Enum.Bounded (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
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’
=====================================
testsuite/tests/interface-stability/ghc-experimental-exports.stdout-mingw32
=====================================
@@ -11193,8 +11193,6 @@ instance forall a. GHC.Internal.Classes.Ord (GHC.Internal.Ptr.FunPtr a) -- Defin
instance forall a. GHC.Internal.Classes.Ord (GHC.Internal.Ptr.Ptr a) -- Defined in ‘GHC.Internal.Ptr’
instance forall a. GHC.Internal.Classes.Ord a => GHC.Internal.Classes.Ord (GHC.Internal.Base.NonEmpty a) -- Defined in ‘GHC.Internal.Base’
instance GHC.Internal.Classes.Ord GHC.Internal.Base.Void -- Defined in ‘GHC.Internal.Base’
-instance forall a k (b :: k). GHC.Internal.Data.String.IsString a => GHC.Internal.Data.String.IsString (GHC.Internal.Data.Functor.Const.Const a b) -- Defined in ‘GHC.Internal.Data.String’
-instance forall a. GHC.Internal.Data.String.IsString a => GHC.Internal.Data.String.IsString (GHC.Internal.Data.Functor.Identity.Identity a) -- Defined in ‘GHC.Internal.Data.String’
instance forall a. (a ~ GHC.Internal.Types.Char) => GHC.Internal.Data.String.IsString [a] -- Defined in ‘GHC.Internal.Data.String’
instance forall a. GHC.Internal.Enum.Bounded a => GHC.Internal.Enum.Bounded (GHC.Internal.Data.Ord.Down a) -- Defined in ‘GHC.Internal.Data.Ord’
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’
=====================================
testsuite/tests/plugins/plugins10.stdout
=====================================
@@ -2,6 +2,7 @@ parsePlugin()
interfacePlugin: Prelude
interfacePlugin: Language.Haskell.TH
interfacePlugin: Language.Haskell.TH.Quote
+interfacePlugin: Data.List
interfacePlugin: GHC.Internal.Base
interfacePlugin: GHC.Internal.Data.NonEmpty
interfacePlugin: GHC.Internal.Float
=====================================
testsuite/tests/typecheck/should_fail/T12921.stderr
=====================================
@@ -24,8 +24,6 @@ T12921.hs:4:16: error: [GHC-39999]
Potentially matching instance:
instance (a ~ Char) => GHC.Internal.Data.String.IsString [a]
-- Defined in ‘GHC.Internal.Data.String’
- ...plus two instances involving out-of-scope types
- (use -fprint-potential-instances to see them all)
• In the annotation:
{-# ANN module "HLint: ignore Reduce duplication" #-}
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/416e4108d537bc8c3fe2f55b4207ef1…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/416e4108d537bc8c3fe2f55b4207ef1…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][wip/marge_bot_batch_merge_job] 3 commits: Fix -fcheck-prim-bounds for non constant args (#26958)
by Marge Bot (@marge-bot) 26 Feb '26
by Marge Bot (@marge-bot) 26 Feb '26
26 Feb '26
Marge Bot pushed to branch wip/marge_bot_batch_merge_job at Glasgow Haskell Compiler / GHC
Commits:
dde22f97 by Sylvain Henry at 2026-02-26T13:14:03-05:00
Fix -fcheck-prim-bounds for non constant args (#26958)
Previously we were only checking bounds for constant (literal)
arguments!
I've refactored the code to simplify the generation of out-of-line Cmm
code for the primop composed of some inline code + some call to an
external Cmm function.
- - - - -
9543f010 by Vladislav Zavialov at 2026-02-26T13:47:09-05:00
Check for negative type literals in the type checker (#26861)
GHC disallows negative type literals (e.g., -1), as tested by T8306 and
T8412. This check is currently performed in the renamer:
rnHsTyLit tyLit@(HsNumTy x i) = do
when (i < 0) $
addErr $ TcRnNegativeNumTypeLiteral tyLit
However, this check can be bypassed using RequiredTypeArguments
(see the new test case T26861). Prior to this patch, such programs
caused the compiler to hang instead of reporting a proper error.
This patch addresses the issue by adding an equivalent check in
the type checker, namely in tcHsType.
The diff is deliberately minimal to facilitate backporting. A more
comprehensive rework of HsTyLit is planned for a separate commit.
- - - - -
21828b58 by Vladislav Zavialov at 2026-02-26T13:47:10-05:00
Consistent pretty-printing of HsString, HsIsString, HsStrTy
Factor out a helper to pretty-print string literals, thus fixing newline
handling for overloaded string literals and type literals.
Test cases: T26860ppr T26860ppr_overloaded T26860ppr_tylit
Follow up to ddf1434ff9bb08cfef3c93f23de6b83ec698aa27
- - - - -
14 changed files:
- compiler/GHC/Hs/Lit.hs
- compiler/GHC/Hs/Type.hs
- compiler/GHC/StgToCmm/Prim.hs
- compiler/GHC/Tc/Gen/HsType.hs
- + testsuite/tests/codeGen/should_fail/T26958.hs
- testsuite/tests/codeGen/should_fail/all.T
- + testsuite/tests/parser/should_fail/T26860ppr_overloaded.hs
- + testsuite/tests/parser/should_fail/T26860ppr_overloaded.stderr
- + testsuite/tests/parser/should_fail/T26860ppr_tylit.hs
- + testsuite/tests/parser/should_fail/T26860ppr_tylit.stderr
- testsuite/tests/parser/should_fail/all.T
- + testsuite/tests/typecheck/should_fail/T26861.hs
- + testsuite/tests/typecheck/should_fail/T26861.stderr
- testsuite/tests/typecheck/should_fail/all.T
Changes:
=====================================
compiler/GHC/Hs/Lit.hs
=====================================
@@ -21,7 +21,7 @@ import GHC.Prelude
import {-# SOURCE #-} GHC.Hs.Expr( pprExpr )
-import GHC.Data.FastString (unpackFS)
+import GHC.Data.FastString (FastString, unpackFS)
import GHC.Types.Basic (PprPrec(..), topPrec )
import GHC.Core.Ppr ( {- instance OutputableBndr TyVar -} )
import GHC.Types.SourceText
@@ -209,10 +209,7 @@ Equivalently it's True if
instance IsPass p => Outputable (HsLit (GhcPass p)) where
ppr (HsChar st c) = pprWithSourceText st (pprHsChar c)
ppr (HsCharPrim st c) = pprWithSourceText st (pprPrimChar c)
- ppr (HsString st s) =
- case st of
- NoSourceText -> pprHsString s
- SourceText src -> vcat $ map text $ split '\n' (unpackFS src)
+ ppr (HsString st s) = pprHsStringLit st s
ppr (HsStringPrim st s) = pprWithSourceText st (pprHsBytes s)
ppr (HsInt _ i)
= pprWithSourceText (il_text i) (integer (il_value i))
@@ -233,6 +230,10 @@ instance IsPass p => Outputable (HsLit (GhcPass p)) where
(HsInteger st i _) -> pprWithSourceText st (integer i)
(HsRat f _) -> ppr f
+pprHsStringLit :: SourceText -> FastString -> SDoc
+pprHsStringLit NoSourceText s = pprHsString s
+pprHsStringLit (SourceText src) _ = vcat $ map text $ split '\n' (unpackFS src)
+
-- in debug mode, print the expression that it's resolved to, too
instance OutputableBndrId p
=> Outputable (HsOverLit (GhcPass p)) where
@@ -242,7 +243,7 @@ instance OutputableBndrId p
instance Outputable OverLitVal where
ppr (HsIntegral i) = pprWithSourceText (il_text i) (integer (il_value i))
ppr (HsFractional f) = ppr f
- ppr (HsIsString st s) = pprWithSourceText st (pprHsString s)
+ ppr (HsIsString st s) = pprHsStringLit st s
negateOverLitVal :: OverLitVal -> OverLitVal
negateOverLitVal (HsIntegral i) = HsIntegral (negateIntegralLit i)
=====================================
compiler/GHC/Hs/Type.hs
=====================================
@@ -116,6 +116,7 @@ import GHC.Core.Ppr ( pprOccWithTick)
import GHC.Core.Type
import GHC.Core.Multiplicity( pprArrowWithMultiplicity )
import GHC.Hs.Doc
+import GHC.Hs.Lit (pprHsStringLit)
import GHC.Generics (Generic, Generically(..))
import GHC.Types.Basic
import GHC.Types.SrcLoc
@@ -1346,7 +1347,7 @@ instance (OutputableBndrId pass) => OutputableBndr (GenLocated SrcSpan (FieldOcc
ppr_tylit :: (HsTyLit (GhcPass p)) -> SDoc
ppr_tylit (HsNumTy source i) = pprWithSourceText source (integer i)
-ppr_tylit (HsStrTy source s) = pprWithSourceText source (text (show s))
+ppr_tylit (HsStrTy source s) = pprHsStringLit source s
ppr_tylit (HsCharTy source c) = pprWithSourceText source (text (show c))
pprAnonWildCard :: SDoc
=====================================
compiler/GHC/StgToCmm/Prim.hs
=====================================
@@ -87,17 +87,27 @@ cgOpApp (StgPrimCallOp primcall) args _res_ty
; emitCall (NativeNodeCall, NativeReturn) fun cmm_args }
cmmPrimOpApp :: StgToCmmConfig -> PrimOp -> [CmmExpr] -> Maybe Type -> FCode ReturnKind
-cmmPrimOpApp cfg primop cmm_args mres_ty =
- case emitPrimOp cfg primop cmm_args of
- PrimopCmmEmit_Internal f ->
- let
- -- if the result type isn't explicitly given, we directly use the
- -- result type of the primop.
- res_ty = fromMaybe (primOpResultType primop) mres_ty
- in emitReturn =<< f res_ty
- PrimopCmmEmit_External -> do
- let fun = CmmLit (CmmLabel (mkRtsPrimOpLabel primop))
- emitCall (NativeNodeCall, NativeReturn) fun cmm_args
+cmmPrimOpApp cfg primop cmm_args mres_ty = do
+ let PrimopCmmEmit _inline f = emitPrimOp cfg primop cmm_args
+ let
+ -- if the result type isn't explicitly given, we directly use the
+ -- result type of the primop.
+ res_ty = fromMaybe (primOpResultType primop) mres_ty
+ f res_ty
+
+externalPrimop :: PrimOp -> [CmmExpr] -> PrimopCmmEmit
+externalPrimop primop args = outOfLinePrimop (callExternalPrimop primop args)
+
+outOfLinePrimop :: FCode ReturnKind -> PrimopCmmEmit
+outOfLinePrimop code = PrimopCmmEmit
+ { primopCmmInline = False
+ , primopCmmCode = \_res_ty -> code
+ }
+
+callExternalPrimop :: PrimOp -> [CmmExpr] -> FCode ReturnKind
+callExternalPrimop primop args = do
+ let fun = CmmLit (CmmLabel (mkRtsPrimOpLabel primop))
+ emitCall (NativeNodeCall, NativeReturn) fun args
-- | Interpret the argument as an unsigned value, assuming the value
@@ -121,8 +131,7 @@ asUnsigned w n = n .&. (bit (widthInBits w) - 1)
shouldInlinePrimOp :: StgToCmmConfig -> PrimOp -> [CmmExpr] -> Bool
shouldInlinePrimOp cfg op args = case emitPrimOp cfg op args of
- PrimopCmmEmit_External -> False
- PrimopCmmEmit_Internal _ -> True
+ PrimopCmmEmit inline _ -> inline
-- TODO: Several primop implementations (e.g. 'doNewByteArrayOp') use
-- ByteOff (or some other fixed width signed type) to represent
@@ -153,103 +162,135 @@ emitPrimOp cfg primop =
NewByteArrayOp_Char -> \case
[(CmmLit (CmmInt n w))]
| asUnsigned w n <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] -> doNewByteArrayOp res (fromInteger n)
- _ -> PrimopCmmEmit_External
+ -> inlinePrimop $ \ [res] -> doNewByteArrayOp res (fromInteger n)
+ args -> externalPrimop primop args
NewArrayOp -> \case
[(CmmLit (CmmInt n w)), init]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \[res] -> doNewArrayOp res (arrPtrsRep platform (fromInteger n)) mkMAP_DIRTY_infoLabel
+ -> inlinePrimop $ \[res] -> doNewArrayOp res (arrPtrsRep platform (fromInteger n)) mkMAP_DIRTY_infoLabel
[ (mkIntExpr platform (fromInteger n),
fixedHdrSize profile + pc_OFFSET_StgMutArrPtrs_ptrs (platformConstants platform))
, (mkIntExpr platform (nonHdrSizeW (arrPtrsRep platform (fromInteger n))),
fixedHdrSize profile + pc_OFFSET_StgMutArrPtrs_size (platformConstants platform))
]
(fromInteger n) init
- _ -> PrimopCmmEmit_External
+ args -> externalPrimop primop args
CopyArrayOp -> \case
[src, src_off, dst, dst_off, (CmmLit (CmmInt n _))] ->
- opIntoRegs $ \ [] -> doCopyArrayOp src src_off dst dst_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ inlinePrimop $ \ [] -> doCopyArrayOp src src_off dst dst_off (fromInteger n)
+ [src, src_off, dst, dst_off, n] ->
+ outOfLinePrimop $ do
+ profile <- getProfile
+ platform <- getPlatform
+ whenCheckBounds $ ifNonZero n $ do
+ emitRangeBoundsCheck src_off n (ptrArraySize platform profile src)
+ emitRangeBoundsCheck dst_off n (ptrArraySize platform profile dst)
+ callExternalPrimop CopyArrayOp [src, src_off, dst, dst_off, n]
+ _ -> panic "CopyArrayOp"
CopyMutableArrayOp -> \case
[src, src_off, dst, dst_off, (CmmLit (CmmInt n _))] ->
- opIntoRegs $ \ [] -> doCopyMutableArrayOp src src_off dst dst_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ inlinePrimop $ \ [] -> doCopyMutableArrayOp src src_off dst dst_off (fromInteger n)
+ [src, src_off, dst, dst_off, n] ->
+ outOfLinePrimop $ do
+ profile <- getProfile
+ platform <- getPlatform
+ whenCheckBounds $ ifNonZero n $ do
+ emitRangeBoundsCheck src_off n (ptrArraySize platform profile src)
+ emitRangeBoundsCheck dst_off n (ptrArraySize platform profile dst)
+ callExternalPrimop CopyMutableArrayOp [src, src_off, dst, dst_off, n]
+ _ -> panic "CopyMutableArrayOp"
CloneArrayOp -> \case
[src, src_off, (CmmLit (CmmInt n w))]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] -> emitCloneArray mkMAP_FROZEN_CLEAN_infoLabel res src src_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ -> inlinePrimop $ \ [res] -> emitCloneArray mkMAP_FROZEN_CLEAN_infoLabel res src src_off (fromInteger n)
+ args -> externalPrimop primop args
CloneMutableArrayOp -> \case
[src, src_off, (CmmLit (CmmInt n w))]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] -> emitCloneArray mkMAP_DIRTY_infoLabel res src src_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ -> inlinePrimop $ \ [res] -> emitCloneArray mkMAP_DIRTY_infoLabel res src src_off (fromInteger n)
+ args -> externalPrimop primop args
FreezeArrayOp -> \case
[src, src_off, (CmmLit (CmmInt n w))]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] -> emitCloneArray mkMAP_FROZEN_CLEAN_infoLabel res src src_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ -> inlinePrimop $ \ [res] -> emitCloneArray mkMAP_FROZEN_CLEAN_infoLabel res src src_off (fromInteger n)
+ args -> externalPrimop primop args
ThawArrayOp -> \case
[src, src_off, (CmmLit (CmmInt n w))]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] -> emitCloneArray mkMAP_DIRTY_infoLabel res src src_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ -> inlinePrimop $ \ [res] -> emitCloneArray mkMAP_DIRTY_infoLabel res src src_off (fromInteger n)
+ args -> externalPrimop primop args
NewSmallArrayOp -> \case
[(CmmLit (CmmInt n w)), init]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] ->
+ -> inlinePrimop $ \ [res] ->
doNewArrayOp res (smallArrPtrsRep (fromInteger n)) mkSMAP_DIRTY_infoLabel
[ (mkIntExpr platform (fromInteger n),
fixedHdrSize profile + pc_OFFSET_StgSmallMutArrPtrs_ptrs (platformConstants platform))
]
(fromInteger n) init
- _ -> PrimopCmmEmit_External
+ args -> externalPrimop primop args
CopySmallArrayOp -> \case
[src, src_off, dst, dst_off, (CmmLit (CmmInt n _))] ->
- opIntoRegs $ \ [] -> doCopySmallArrayOp src src_off dst dst_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ inlinePrimop $ \ [] -> doCopySmallArrayOp src src_off dst dst_off (fromInteger n)
+ [src, src_off, dst, dst_off, n] ->
+ outOfLinePrimop $ do
+ profile <- getProfile
+ platform <- getPlatform
+ whenCheckBounds $ ifNonZero n $ do
+ emitRangeBoundsCheck src_off n (smallPtrArraySize platform profile src)
+ emitRangeBoundsCheck dst_off n (smallPtrArraySize platform profile dst)
+ callExternalPrimop CopySmallArrayOp [src, src_off, dst, dst_off, n]
+ _ -> panic "CopySmallArrayOp"
CopySmallMutableArrayOp -> \case
[src, src_off, dst, dst_off, (CmmLit (CmmInt n _))] ->
- opIntoRegs $ \ [] -> doCopySmallMutableArrayOp src src_off dst dst_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ inlinePrimop $ \ [] -> doCopySmallMutableArrayOp src src_off dst dst_off (fromInteger n)
+ [src, src_off, dst, dst_off, n] ->
+ outOfLinePrimop $ do
+ profile <- getProfile
+ platform <- getPlatform
+ whenCheckBounds $ ifNonZero n $ do
+ emitRangeBoundsCheck src_off n (smallPtrArraySize platform profile src)
+ emitRangeBoundsCheck dst_off n (smallPtrArraySize platform profile dst)
+ callExternalPrimop CopySmallMutableArrayOp [src, src_off, dst, dst_off, n]
+ _ -> panic "CopySmallMutableArrayOp"
CloneSmallArrayOp -> \case
[src, src_off, (CmmLit (CmmInt n w))]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] -> emitCloneSmallArray mkSMAP_FROZEN_CLEAN_infoLabel res src src_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ -> inlinePrimop $ \ [res] -> emitCloneSmallArray mkSMAP_FROZEN_CLEAN_infoLabel res src src_off (fromInteger n)
+ args -> externalPrimop primop args
CloneSmallMutableArrayOp -> \case
[src, src_off, (CmmLit (CmmInt n w))]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] -> emitCloneSmallArray mkSMAP_DIRTY_infoLabel res src src_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ -> inlinePrimop $ \ [res] -> emitCloneSmallArray mkSMAP_DIRTY_infoLabel res src src_off (fromInteger n)
+ args -> externalPrimop primop args
FreezeSmallArrayOp -> \case
[src, src_off, (CmmLit (CmmInt n w))]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] -> emitCloneSmallArray mkSMAP_FROZEN_CLEAN_infoLabel res src src_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ -> inlinePrimop $ \ [res] -> emitCloneSmallArray mkSMAP_FROZEN_CLEAN_infoLabel res src src_off (fromInteger n)
+ args -> externalPrimop primop args
ThawSmallArrayOp -> \case
[src, src_off, (CmmLit (CmmInt n w))]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] -> emitCloneSmallArray mkSMAP_DIRTY_infoLabel res src src_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ -> inlinePrimop $ \ [res] -> emitCloneSmallArray mkSMAP_DIRTY_infoLabel res src src_off (fromInteger n)
+ args -> externalPrimop primop args
-- First we handle various awkward cases specially.
- ParOp -> \[arg] -> opIntoRegs $ \[res] ->
+ ParOp -> \[arg] -> inlinePrimop $ \[res] ->
-- for now, just implement this in a C function
-- later, we might want to inline it.
emitCCall
@@ -257,7 +298,7 @@ emitPrimOp cfg primop =
(CmmLit (CmmLabel (mkForeignLabel (fsLit "newSpark") ForeignLabelInExternalPackage IsFunction)))
[(baseExpr platform, AddrHint), (arg,AddrHint)]
- SparkOp -> \[arg] -> opIntoRegs $ \[res] -> do
+ SparkOp -> \[arg] -> inlinePrimop $ \[res] -> do
-- returns the value of arg in res. We're going to therefore
-- refer to arg twice (once to pass to newSpark(), and once to
-- assign to res), so put it in a temporary.
@@ -269,24 +310,24 @@ emitPrimOp cfg primop =
[(baseExpr platform, AddrHint), ((CmmReg (CmmLocal tmp)), AddrHint)]
emitAssign (CmmLocal res) (CmmReg (CmmLocal tmp))
- GetCCSOfOp -> \[arg] -> opIntoRegs $ \[res] -> do
+ GetCCSOfOp -> \[arg] -> inlinePrimop $ \[res] -> do
let
val
| profileIsProfiling profile = costCentreFrom platform (cmmUntag platform arg)
| otherwise = CmmLit (zeroCLit platform)
emitAssign (CmmLocal res) val
- GetCurrentCCSOp -> \[_] -> opIntoRegs $ \[res] ->
+ GetCurrentCCSOp -> \[_] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (cccsExpr platform)
- MyThreadIdOp -> \[] -> opIntoRegs $ \[res] ->
+ MyThreadIdOp -> \[] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (currentTSOExpr platform)
- ReadMutVarOp -> \[mutv] -> opIntoRegs $ \[res] ->
+ ReadMutVarOp -> \[mutv] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_AtomicRead (wordWidth platform) MemOrderAcquire)
[ cmmOffsetW platform mutv (fixedHdrSizeW profile) ]
- WriteMutVarOp -> \[mutv, var] -> opIntoRegs $ \[] -> do
+ WriteMutVarOp -> \[mutv, var] -> inlinePrimop $ \[] -> do
old_val <- CmmLocal <$> newTemp (cmmExprType platform var)
emitAssign old_val (cmmLoadIndexW platform mutv (fixedHdrSizeW profile) (gcWord platform))
@@ -299,14 +340,14 @@ emitPrimOp cfg primop =
[ cmmOffsetW platform mutv (fixedHdrSizeW profile), var ]
emitDirtyMutVar mutv (CmmReg old_val)
- AtomicSwapMutVarOp -> \[mutv, val] -> opIntoRegs $ \[res] -> do
+ AtomicSwapMutVarOp -> \[mutv, val] -> inlinePrimop $ \[res] -> do
let dst = cmmOffsetW platform mutv (fixedHdrSizeW profile)
emitPrimCall [res] (MO_Xchg (wordWidth platform)) [dst, val]
emitDirtyMutVar mutv (CmmReg (CmmLocal res))
-- #define sizzeofByteArrayzh(r,a) \
-- r = ((StgArrBytes *)(a))->bytes
- SizeofByteArrayOp -> \[arg] -> opIntoRegs $ \[res] ->
+ SizeofByteArrayOp -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (byteArraySize platform profile arg)
-- #define sizzeofMutableByteArrayzh(r,a) \
@@ -315,37 +356,37 @@ emitPrimOp cfg primop =
-- #define getSizzeofMutableByteArrayzh(r,a) \
-- r = ((StgArrBytes *)(a))->bytes
- GetSizeofMutableByteArrayOp -> \[arg] -> opIntoRegs $ \[res] ->
+ GetSizeofMutableByteArrayOp -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (byteArraySize platform profile arg)
-- #define touchzh(o) /* nothing */
- TouchOp -> \args@[_] -> opIntoRegs $ \res@[] ->
+ TouchOp -> \args@[_] -> inlinePrimop $ \res@[] ->
emitPrimCall res MO_Touch args
-- #define byteArrayContentszh(r,a) r = BYTE_ARR_CTS(a)
- ByteArrayContents_Char -> \[arg] -> opIntoRegs $ \[res] ->
+ ByteArrayContents_Char -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (cmmOffsetB platform arg (arrWordsHdrSize profile))
-- #define mutableByteArrayContentszh(r,a) r = BYTE_ARR_CTS(a)
- MutableByteArrayContents_Char -> \[arg] -> opIntoRegs $ \[res] ->
+ MutableByteArrayContents_Char -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (cmmOffsetB platform arg (arrWordsHdrSize profile))
-- #define stableNameToIntzh(r,s) (r = ((StgStableName *)s)->sn)
- StableNameToIntOp -> \[arg] -> opIntoRegs $ \[res] ->
+ StableNameToIntOp -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (cmmLoadIndexW platform arg (fixedHdrSizeW profile) (bWord platform))
EqStablePtrOp -> opTranslate (mo_wordEq platform)
- ReallyUnsafePtrEqualityOp -> \[arg1, arg2] -> opIntoRegs $ \[res] ->
+ ReallyUnsafePtrEqualityOp -> \[arg1, arg2] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (CmmMachOp (mo_wordEq platform) [arg1,arg2])
-- #define addrToHValuezh(r,a) r=(P_)a
- AddrToAnyOp -> \[arg] -> opIntoRegs $ \[res] ->
+ AddrToAnyOp -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) arg
-- #define hvalueToAddrzh(r, a) r=(W_)a
- AnyToAddrOp -> \[arg] -> opIntoRegs $ \[res] ->
+ AnyToAddrOp -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) arg
{- Freezing arrays-of-ptrs requires changing an info table, for the
@@ -358,45 +399,45 @@ emitPrimOp cfg primop =
-- SET_INFO((StgClosure *)a,&stg_MUT_ARR_PTRS_FROZEN_DIRTY_info);
-- r = a;
-- }
- UnsafeFreezeArrayOp -> \[arg] -> opIntoRegs $ \[res] ->
+ UnsafeFreezeArrayOp -> \[arg] -> inlinePrimop $ \[res] ->
emit $ catAGraphs
[ setInfo arg (CmmLit (CmmLabel mkMAP_FROZEN_DIRTY_infoLabel)),
mkAssign (CmmLocal res) arg ]
- UnsafeFreezeSmallArrayOp -> \[arg] -> opIntoRegs $ \[res] ->
+ UnsafeFreezeSmallArrayOp -> \[arg] -> inlinePrimop $ \[res] ->
emit $ catAGraphs
[ setInfo arg (CmmLit (CmmLabel mkSMAP_FROZEN_DIRTY_infoLabel)),
mkAssign (CmmLocal res) arg ]
-- #define unsafeFreezzeByteArrayzh(r,a) r=(a)
- UnsafeFreezeByteArrayOp -> \[arg] -> opIntoRegs $ \[res] ->
+ UnsafeFreezeByteArrayOp -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) arg
-- #define unsafeThawByteArrayzh(r,a) r=(a)
- UnsafeThawByteArrayOp -> \[arg] -> opIntoRegs $ \[res] ->
+ UnsafeThawByteArrayOp -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) arg
-- Reading/writing pointer arrays
- ReadArrayOp -> \[obj, ix] -> opIntoRegs $ \[res] ->
+ ReadArrayOp -> \[obj, ix] -> inlinePrimop $ \[res] ->
doReadPtrArrayOp res obj ix
- IndexArrayOp -> \[obj, ix] -> opIntoRegs $ \[res] ->
+ IndexArrayOp -> \[obj, ix] -> inlinePrimop $ \[res] ->
doReadPtrArrayOp res obj ix
- WriteArrayOp -> \[obj, ix, v] -> opIntoRegs $ \[] ->
+ WriteArrayOp -> \[obj, ix, v] -> inlinePrimop $ \[] ->
doWritePtrArrayOp obj ix v
- ReadSmallArrayOp -> \[obj, ix] -> opIntoRegs $ \[res] ->
+ ReadSmallArrayOp -> \[obj, ix] -> inlinePrimop $ \[res] ->
doReadSmallPtrArrayOp res obj ix
- IndexSmallArrayOp -> \[obj, ix] -> opIntoRegs $ \[res] ->
+ IndexSmallArrayOp -> \[obj, ix] -> inlinePrimop $ \[res] ->
doReadSmallPtrArrayOp res obj ix
- WriteSmallArrayOp -> \[obj,ix,v] -> opIntoRegs $ \[] ->
+ WriteSmallArrayOp -> \[obj,ix,v] -> inlinePrimop $ \[] ->
doWriteSmallPtrArrayOp obj ix v
-- Getting the size of pointer arrays
- SizeofArrayOp -> \[arg] -> opIntoRegs $ \[res] ->
+ SizeofArrayOp -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (ptrArraySize platform profile arg)
SizeofMutableArrayOp -> emitPrimOp cfg SizeofArrayOp
- SizeofSmallArrayOp -> \[arg] -> opIntoRegs $ \[res] ->
+ SizeofSmallArrayOp -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (smallPtrArraySize platform profile arg)
SizeofSmallMutableArrayOp -> emitPrimOp cfg SizeofSmallArrayOp
@@ -404,550 +445,550 @@ emitPrimOp cfg primop =
-- IndexXXXoffAddr
- IndexOffAddrOp_Char -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Char -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp (Just (mo_u_8ToWord platform)) b8 res args
- IndexOffAddrOp_WideChar -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_WideChar -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp (Just (mo_u_32ToWord platform)) b32 res args
- IndexOffAddrOp_Int -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Int -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing (bWord platform) res args
- IndexOffAddrOp_Word -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing (bWord platform) res args
- IndexOffAddrOp_Addr -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Addr -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing (bWord platform) res args
- IndexOffAddrOp_Float -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Float -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing f32 res args
- IndexOffAddrOp_Double -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Double -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing f64 res args
- IndexOffAddrOp_StablePtr -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_StablePtr -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing (bWord platform) res args
- IndexOffAddrOp_Int8 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Int8 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b8 res args
- IndexOffAddrOp_Int16 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Int16 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b16 res args
- IndexOffAddrOp_Int32 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Int32 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b32 res args
- IndexOffAddrOp_Int64 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Int64 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b64 res args
- IndexOffAddrOp_Word8 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b8 res args
- IndexOffAddrOp_Word16 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word16 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b16 res args
- IndexOffAddrOp_Word32 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word32 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b32 res args
- IndexOffAddrOp_Word64 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word64 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b64 res args
-- ReadXXXoffAddr, which are identical, for our purposes, to IndexXXXoffAddr.
- ReadOffAddrOp_Char -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Char -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp (Just (mo_u_8ToWord platform)) b8 res args
- ReadOffAddrOp_WideChar -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_WideChar -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp (Just (mo_u_32ToWord platform)) b32 res args
- ReadOffAddrOp_Int -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Int -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing (bWord platform) res args
- ReadOffAddrOp_Word -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing (bWord platform) res args
- ReadOffAddrOp_Addr -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Addr -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing (bWord platform) res args
- ReadOffAddrOp_Float -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Float -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing f32 res args
- ReadOffAddrOp_Double -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Double -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing f64 res args
- ReadOffAddrOp_StablePtr -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_StablePtr -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing (bWord platform) res args
- ReadOffAddrOp_Int8 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Int8 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b8 res args
- ReadOffAddrOp_Int16 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Int16 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b16 res args
- ReadOffAddrOp_Int32 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Int32 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b32 res args
- ReadOffAddrOp_Int64 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Int64 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b64 res args
- ReadOffAddrOp_Word8 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b8 res args
- ReadOffAddrOp_Word16 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word16 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b16 res args
- ReadOffAddrOp_Word32 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word32 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b32 res args
- ReadOffAddrOp_Word64 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word64 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b64 res args
-- IndexWord8OffAddrAsXXX
- IndexOffAddrOp_Word8AsChar -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsChar -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs (Just (mo_u_8ToWord platform)) b8 b8 res args
- IndexOffAddrOp_Word8AsWideChar -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsWideChar -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs (Just (mo_u_32ToWord platform)) b32 b8 res args
- IndexOffAddrOp_Word8AsInt -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsInt -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing (bWord platform) b8 res args
- IndexOffAddrOp_Word8AsWord -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsWord -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing (bWord platform) b8 res args
- IndexOffAddrOp_Word8AsAddr -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsAddr -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing (bWord platform) b8 res args
- IndexOffAddrOp_Word8AsFloat -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsFloat -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing f32 b8 res args
- IndexOffAddrOp_Word8AsDouble -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsDouble -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing f64 b8 res args
- IndexOffAddrOp_Word8AsStablePtr -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsStablePtr -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing (bWord platform) b8 res args
- IndexOffAddrOp_Word8AsInt16 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsInt16 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b16 b8 res args
- IndexOffAddrOp_Word8AsInt32 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsInt32 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b32 b8 res args
- IndexOffAddrOp_Word8AsInt64 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsInt64 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b64 b8 res args
- IndexOffAddrOp_Word8AsWord16 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsWord16 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b16 b8 res args
- IndexOffAddrOp_Word8AsWord32 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsWord32 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b32 b8 res args
- IndexOffAddrOp_Word8AsWord64 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsWord64 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b64 b8 res args
-- ReadWord8OffAddrAsXXX, identical to IndexWord8OffAddrAsXXX
- ReadOffAddrOp_Word8AsChar -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsChar -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs (Just (mo_u_8ToWord platform)) b8 b8 res args
- ReadOffAddrOp_Word8AsWideChar -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsWideChar -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs (Just (mo_u_32ToWord platform)) b32 b8 res args
- ReadOffAddrOp_Word8AsInt -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsInt -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing (bWord platform) b8 res args
- ReadOffAddrOp_Word8AsWord -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsWord -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing (bWord platform) b8 res args
- ReadOffAddrOp_Word8AsAddr -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsAddr -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing (bWord platform) b8 res args
- ReadOffAddrOp_Word8AsFloat -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsFloat -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing f32 b8 res args
- ReadOffAddrOp_Word8AsDouble -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsDouble -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing f64 b8 res args
- ReadOffAddrOp_Word8AsStablePtr -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsStablePtr -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing (bWord platform) b8 res args
- ReadOffAddrOp_Word8AsInt16 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsInt16 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b16 b8 res args
- ReadOffAddrOp_Word8AsInt32 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsInt32 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b32 b8 res args
- ReadOffAddrOp_Word8AsInt64 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsInt64 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b64 b8 res args
- ReadOffAddrOp_Word8AsWord16 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsWord16 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b16 b8 res args
- ReadOffAddrOp_Word8AsWord32 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsWord32 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b32 b8 res args
- ReadOffAddrOp_Word8AsWord64 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsWord64 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b64 b8 res args
-- WriteWord8ArrayAsXXX
- WriteOffAddrOp_Word8AsChar -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsChar -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp (Just (mo_WordTo8 platform)) b8 res args
- WriteOffAddrOp_Word8AsWideChar -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsWideChar -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp (Just (mo_WordTo32 platform)) b8 res args
- WriteOffAddrOp_Word8AsInt -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsInt -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsWord -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsWord -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsAddr -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsAddr -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsFloat -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsFloat -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsDouble -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsDouble -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsStablePtr -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsStablePtr -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsInt16 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsInt16 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsInt32 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsInt32 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsInt64 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsInt64 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsWord16 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsWord16 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsWord32 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsWord32 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsWord64 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsWord64 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
-- IndexXXXArray
- IndexByteArrayOp_Char -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Char -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp (Just (mo_u_8ToWord platform)) b8 res args
- IndexByteArrayOp_WideChar -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_WideChar -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp (Just (mo_u_32ToWord platform)) b32 res args
- IndexByteArrayOp_Int -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Int -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing (bWord platform) res args
- IndexByteArrayOp_Word -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing (bWord platform) res args
- IndexByteArrayOp_Addr -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Addr -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing (bWord platform) res args
- IndexByteArrayOp_Float -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Float -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing f32 res args
- IndexByteArrayOp_Double -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Double -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing f64 res args
- IndexByteArrayOp_StablePtr -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_StablePtr -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing (bWord platform) res args
- IndexByteArrayOp_Int8 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Int8 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b8 res args
- IndexByteArrayOp_Int16 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Int16 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b16 res args
- IndexByteArrayOp_Int32 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Int32 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b32 res args
- IndexByteArrayOp_Int64 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Int64 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b64 res args
- IndexByteArrayOp_Word8 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b8 res args
- IndexByteArrayOp_Word16 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word16 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b16 res args
- IndexByteArrayOp_Word32 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word32 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b32 res args
- IndexByteArrayOp_Word64 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word64 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b64 res args
-- ReadXXXArray, identical to IndexXXXArray.
- ReadByteArrayOp_Char -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Char -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp (Just (mo_u_8ToWord platform)) b8 res args
- ReadByteArrayOp_WideChar -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_WideChar -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp (Just (mo_u_32ToWord platform)) b32 res args
- ReadByteArrayOp_Int -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Int -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing (bWord platform) res args
- ReadByteArrayOp_Word -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing (bWord platform) res args
- ReadByteArrayOp_Addr -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Addr -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing (bWord platform) res args
- ReadByteArrayOp_Float -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Float -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing f32 res args
- ReadByteArrayOp_Double -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Double -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing f64 res args
- ReadByteArrayOp_StablePtr -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_StablePtr -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing (bWord platform) res args
- ReadByteArrayOp_Int8 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Int8 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b8 res args
- ReadByteArrayOp_Int16 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Int16 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b16 res args
- ReadByteArrayOp_Int32 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Int32 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b32 res args
- ReadByteArrayOp_Int64 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Int64 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b64 res args
- ReadByteArrayOp_Word8 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b8 res args
- ReadByteArrayOp_Word16 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word16 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b16 res args
- ReadByteArrayOp_Word32 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word32 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b32 res args
- ReadByteArrayOp_Word64 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word64 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b64 res args
-- IndexWord8ArrayAsXXX
- IndexByteArrayOp_Word8AsChar -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsChar -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs (Just (mo_u_8ToWord platform)) b8 b8 res args
- IndexByteArrayOp_Word8AsWideChar -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsWideChar -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs (Just (mo_u_32ToWord platform)) b32 b8 res args
- IndexByteArrayOp_Word8AsInt -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsInt -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing (bWord platform) b8 res args
- IndexByteArrayOp_Word8AsWord -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsWord -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing (bWord platform) b8 res args
- IndexByteArrayOp_Word8AsAddr -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsAddr -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing (bWord platform) b8 res args
- IndexByteArrayOp_Word8AsFloat -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsFloat -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing f32 b8 res args
- IndexByteArrayOp_Word8AsDouble -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsDouble -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing f64 b8 res args
- IndexByteArrayOp_Word8AsStablePtr -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsStablePtr -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing (bWord platform) b8 res args
- IndexByteArrayOp_Word8AsInt16 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsInt16 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b16 b8 res args
- IndexByteArrayOp_Word8AsInt32 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsInt32 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b32 b8 res args
- IndexByteArrayOp_Word8AsInt64 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsInt64 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b64 b8 res args
- IndexByteArrayOp_Word8AsWord16 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsWord16 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b16 b8 res args
- IndexByteArrayOp_Word8AsWord32 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsWord32 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b32 b8 res args
- IndexByteArrayOp_Word8AsWord64 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsWord64 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b64 b8 res args
-- ReadInt8ArrayAsXXX, identical to IndexInt8ArrayAsXXX
- ReadByteArrayOp_Word8AsChar -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsChar -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs (Just (mo_u_8ToWord platform)) b8 b8 res args
- ReadByteArrayOp_Word8AsWideChar -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsWideChar -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs (Just (mo_u_32ToWord platform)) b32 b8 res args
- ReadByteArrayOp_Word8AsInt -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsInt -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing (bWord platform) b8 res args
- ReadByteArrayOp_Word8AsWord -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsWord -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing (bWord platform) b8 res args
- ReadByteArrayOp_Word8AsAddr -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsAddr -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing (bWord platform) b8 res args
- ReadByteArrayOp_Word8AsFloat -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsFloat -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing f32 b8 res args
- ReadByteArrayOp_Word8AsDouble -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsDouble -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing f64 b8 res args
- ReadByteArrayOp_Word8AsStablePtr -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsStablePtr -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing (bWord platform) b8 res args
- ReadByteArrayOp_Word8AsInt16 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsInt16 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b16 b8 res args
- ReadByteArrayOp_Word8AsInt32 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsInt32 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b32 b8 res args
- ReadByteArrayOp_Word8AsInt64 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsInt64 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b64 b8 res args
- ReadByteArrayOp_Word8AsWord16 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsWord16 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b16 b8 res args
- ReadByteArrayOp_Word8AsWord32 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsWord32 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b32 b8 res args
- ReadByteArrayOp_Word8AsWord64 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsWord64 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b64 b8 res args
-- WriteXXXoffAddr
- WriteOffAddrOp_Char -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Char -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp (Just (mo_WordTo8 platform)) b8 res args
- WriteOffAddrOp_WideChar -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_WideChar -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp (Just (mo_WordTo32 platform)) b32 res args
- WriteOffAddrOp_Int -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Int -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing (bWord platform) res args
- WriteOffAddrOp_Word -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing (bWord platform) res args
- WriteOffAddrOp_Addr -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Addr -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing (bWord platform) res args
- WriteOffAddrOp_Float -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Float -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing f32 res args
- WriteOffAddrOp_Double -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Double -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing f64 res args
- WriteOffAddrOp_StablePtr -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_StablePtr -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing (bWord platform) res args
- WriteOffAddrOp_Int8 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Int8 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Int16 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Int16 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b16 res args
- WriteOffAddrOp_Int32 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Int32 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b32 res args
- WriteOffAddrOp_Int64 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Int64 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b64 res args
- WriteOffAddrOp_Word8 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word16 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word16 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b16 res args
- WriteOffAddrOp_Word32 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word32 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b32 res args
- WriteOffAddrOp_Word64 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word64 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b64 res args
-- WriteXXXArray
- WriteByteArrayOp_Char -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Char -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp (Just (mo_WordTo8 platform)) b8 res args
- WriteByteArrayOp_WideChar -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_WideChar -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp (Just (mo_WordTo32 platform)) b32 res args
- WriteByteArrayOp_Int -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Int -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing (bWord platform) res args
- WriteByteArrayOp_Word -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing (bWord platform) res args
- WriteByteArrayOp_Addr -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Addr -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing (bWord platform) res args
- WriteByteArrayOp_Float -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Float -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing f32 res args
- WriteByteArrayOp_Double -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Double -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing f64 res args
- WriteByteArrayOp_StablePtr -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_StablePtr -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing (bWord platform) res args
- WriteByteArrayOp_Int8 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Int8 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Int16 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Int16 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b16 res args
- WriteByteArrayOp_Int32 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Int32 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b32 res args
- WriteByteArrayOp_Int64 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Int64 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b64 res args
- WriteByteArrayOp_Word8 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word16 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word16 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b16 res args
- WriteByteArrayOp_Word32 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word32 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b32 res args
- WriteByteArrayOp_Word64 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word64 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b64 res args
-- WriteInt8ArrayAsXXX
- WriteByteArrayOp_Word8AsChar -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsChar -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp (Just (mo_WordTo8 platform)) b8 res args
- WriteByteArrayOp_Word8AsWideChar -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsWideChar -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp (Just (mo_WordTo32 platform)) b8 res args
- WriteByteArrayOp_Word8AsInt -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsInt -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsWord -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsWord -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsAddr -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsAddr -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsFloat -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsFloat -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsDouble -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsDouble -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsStablePtr -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsStablePtr -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsInt16 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsInt16 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsInt32 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsInt32 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsInt64 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsInt64 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsWord16 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsWord16 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsWord32 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsWord32 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsWord64 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsWord64 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
-- Copying and setting byte arrays
- CopyByteArrayOp -> \[src,src_off,dst,dst_off,n] -> opIntoRegs $ \[] ->
+ CopyByteArrayOp -> \[src,src_off,dst,dst_off,n] -> inlinePrimop $ \[] ->
doCopyByteArrayOp src src_off dst dst_off n
- CopyMutableByteArrayOp -> \[src,src_off,dst,dst_off,n] -> opIntoRegs $ \[] ->
+ CopyMutableByteArrayOp -> \[src,src_off,dst,dst_off,n] -> inlinePrimop $ \[] ->
doCopyMutableByteArrayOp src src_off dst dst_off n
- CopyMutableByteArrayNonOverlappingOp -> \[src,src_off,dst,dst_off,n] -> opIntoRegs $ \[] ->
+ CopyMutableByteArrayNonOverlappingOp -> \[src,src_off,dst,dst_off,n] -> inlinePrimop $ \[] ->
doCopyMutableByteArrayNonOverlappingOp src src_off dst dst_off n
- CopyByteArrayToAddrOp -> \[src,src_off,dst,n] -> opIntoRegs $ \[] ->
+ CopyByteArrayToAddrOp -> \[src,src_off,dst,n] -> inlinePrimop $ \[] ->
doCopyByteArrayToAddrOp src src_off dst n
- CopyMutableByteArrayToAddrOp -> \[src,src_off,dst,n] -> opIntoRegs $ \[] ->
+ CopyMutableByteArrayToAddrOp -> \[src,src_off,dst,n] -> inlinePrimop $ \[] ->
doCopyMutableByteArrayToAddrOp src src_off dst n
- CopyAddrToByteArrayOp -> \[src,dst,dst_off,n] -> opIntoRegs $ \[] ->
+ CopyAddrToByteArrayOp -> \[src,dst,dst_off,n] -> inlinePrimop $ \[] ->
doCopyAddrToByteArrayOp src dst dst_off n
- CopyAddrToAddrOp -> \[src,dst,n] -> opIntoRegs $ \[] ->
+ CopyAddrToAddrOp -> \[src,dst,n] -> inlinePrimop $ \[] ->
doCopyAddrToAddrOp src dst n
- CopyAddrToAddrNonOverlappingOp -> \[src,dst,n] -> opIntoRegs $ \[] ->
+ CopyAddrToAddrNonOverlappingOp -> \[src,dst,n] -> inlinePrimop $ \[] ->
doCopyAddrToAddrNonOverlappingOp src dst n
- SetByteArrayOp -> \[ba,off,len,c] -> opIntoRegs $ \[] ->
+ SetByteArrayOp -> \[ba,off,len,c] -> inlinePrimop $ \[] ->
doSetByteArrayOp ba off len c
- SetAddrRangeOp -> \[dst,len,c] -> opIntoRegs $ \[] ->
+ SetAddrRangeOp -> \[dst,len,c] -> inlinePrimop $ \[] ->
doSetAddrRangeOp dst len c
-- Comparing byte arrays
- CompareByteArraysOp -> \[ba1,ba1_off,ba2,ba2_off,n] -> opIntoRegs $ \[res] ->
+ CompareByteArraysOp -> \[ba1,ba1_off,ba2,ba2_off,n] -> inlinePrimop $ \[res] ->
doCompareByteArraysOp res ba1 ba1_off ba2 ba2_off n
- BSwap16Op -> \[w] -> opIntoRegs $ \[res] ->
+ BSwap16Op -> \[w] -> inlinePrimop $ \[res] ->
emitBSwapCall res w W16
- BSwap32Op -> \[w] -> opIntoRegs $ \[res] ->
+ BSwap32Op -> \[w] -> inlinePrimop $ \[res] ->
emitBSwapCall res w W32
- BSwap64Op -> \[w] -> opIntoRegs $ \[res] ->
+ BSwap64Op -> \[w] -> inlinePrimop $ \[res] ->
emitBSwapCall res w W64
- BSwapOp -> \[w] -> opIntoRegs $ \[res] ->
+ BSwapOp -> \[w] -> inlinePrimop $ \[res] ->
emitBSwapCall res w (wordWidth platform)
- BRev8Op -> \[w] -> opIntoRegs $ \[res] ->
+ BRev8Op -> \[w] -> inlinePrimop $ \[res] ->
emitBRevCall res w W8
- BRev16Op -> \[w] -> opIntoRegs $ \[res] ->
+ BRev16Op -> \[w] -> inlinePrimop $ \[res] ->
emitBRevCall res w W16
- BRev32Op -> \[w] -> opIntoRegs $ \[res] ->
+ BRev32Op -> \[w] -> inlinePrimop $ \[res] ->
emitBRevCall res w W32
- BRev64Op -> \[w] -> opIntoRegs $ \[res] ->
+ BRev64Op -> \[w] -> inlinePrimop $ \[res] ->
emitBRevCall res w W64
- BRevOp -> \[w] -> opIntoRegs $ \[res] ->
+ BRevOp -> \[w] -> inlinePrimop $ \[res] ->
emitBRevCall res w (wordWidth platform)
-- Population count
- PopCnt8Op -> \[w] -> opIntoRegs $ \[res] ->
+ PopCnt8Op -> \[w] -> inlinePrimop $ \[res] ->
emitPopCntCall res w W8
- PopCnt16Op -> \[w] -> opIntoRegs $ \[res] ->
+ PopCnt16Op -> \[w] -> inlinePrimop $ \[res] ->
emitPopCntCall res w W16
- PopCnt32Op -> \[w] -> opIntoRegs $ \[res] ->
+ PopCnt32Op -> \[w] -> inlinePrimop $ \[res] ->
emitPopCntCall res w W32
- PopCnt64Op -> \[w] -> opIntoRegs $ \[res] ->
+ PopCnt64Op -> \[w] -> inlinePrimop $ \[res] ->
emitPopCntCall res w W64
- PopCntOp -> \[w] -> opIntoRegs $ \[res] ->
+ PopCntOp -> \[w] -> inlinePrimop $ \[res] ->
emitPopCntCall res w (wordWidth platform)
-- Parallel bit deposit
- Pdep8Op -> \[src, mask] -> opIntoRegs $ \[res] ->
+ Pdep8Op -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPdepCall res src mask W8
- Pdep16Op -> \[src, mask] -> opIntoRegs $ \[res] ->
+ Pdep16Op -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPdepCall res src mask W16
- Pdep32Op -> \[src, mask] -> opIntoRegs $ \[res] ->
+ Pdep32Op -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPdepCall res src mask W32
- Pdep64Op -> \[src, mask] -> opIntoRegs $ \[res] ->
+ Pdep64Op -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPdepCall res src mask W64
- PdepOp -> \[src, mask] -> opIntoRegs $ \[res] ->
+ PdepOp -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPdepCall res src mask (wordWidth platform)
-- Parallel bit extract
- Pext8Op -> \[src, mask] -> opIntoRegs $ \[res] ->
+ Pext8Op -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPextCall res src mask W8
- Pext16Op -> \[src, mask] -> opIntoRegs $ \[res] ->
+ Pext16Op -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPextCall res src mask W16
- Pext32Op -> \[src, mask] -> opIntoRegs $ \[res] ->
+ Pext32Op -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPextCall res src mask W32
- Pext64Op -> \[src, mask] -> opIntoRegs $ \[res] ->
+ Pext64Op -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPextCall res src mask W64
- PextOp -> \[src, mask] -> opIntoRegs $ \[res] ->
+ PextOp -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPextCall res src mask (wordWidth platform)
-- count leading zeros
- Clz8Op -> \[w] -> opIntoRegs $ \[res] ->
+ Clz8Op -> \[w] -> inlinePrimop $ \[res] ->
emitClzCall res w W8
- Clz16Op -> \[w] -> opIntoRegs $ \[res] ->
+ Clz16Op -> \[w] -> inlinePrimop $ \[res] ->
emitClzCall res w W16
- Clz32Op -> \[w] -> opIntoRegs $ \[res] ->
+ Clz32Op -> \[w] -> inlinePrimop $ \[res] ->
emitClzCall res w W32
- Clz64Op -> \[w] -> opIntoRegs $ \[res] ->
+ Clz64Op -> \[w] -> inlinePrimop $ \[res] ->
emitClzCall res w W64
- ClzOp -> \[w] -> opIntoRegs $ \[res] ->
+ ClzOp -> \[w] -> inlinePrimop $ \[res] ->
emitClzCall res w (wordWidth platform)
-- count trailing zeros
- Ctz8Op -> \[w] -> opIntoRegs $ \[res] ->
+ Ctz8Op -> \[w] -> inlinePrimop $ \[res] ->
emitCtzCall res w W8
- Ctz16Op -> \[w] -> opIntoRegs $ \[res] ->
+ Ctz16Op -> \[w] -> inlinePrimop $ \[res] ->
emitCtzCall res w W16
- Ctz32Op -> \[w] -> opIntoRegs $ \[res] ->
+ Ctz32Op -> \[w] -> inlinePrimop $ \[res] ->
emitCtzCall res w W32
- Ctz64Op -> \[w] -> opIntoRegs $ \[res] ->
+ Ctz64Op -> \[w] -> inlinePrimop $ \[res] ->
emitCtzCall res w W64
- CtzOp -> \[w] -> opIntoRegs $ \[res] ->
+ CtzOp -> \[w] -> inlinePrimop $ \[res] ->
emitCtzCall res w (wordWidth platform)
-- Unsigned int to floating point conversions
- WordToFloatOp -> \[w] -> opIntoRegs $ \[res] ->
+ WordToFloatOp -> \[w] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_UF_Conv W32) [w]
- WordToDoubleOp -> \[w] -> opIntoRegs $ \[res] ->
+ WordToDoubleOp -> \[w] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_UF_Conv W64) [w]
-- Atomic operations
- InterlockedExchange_Addr -> \[src, value] -> opIntoRegs $ \[res] ->
+ InterlockedExchange_Addr -> \[src, value] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_Xchg (wordWidth platform)) [src, value]
- InterlockedExchange_Word -> \[src, value] -> opIntoRegs $ \[res] ->
+ InterlockedExchange_Word -> \[src, value] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_Xchg (wordWidth platform)) [src, value]
- FetchAddAddrOp_Word -> \[addr, n] -> opIntoRegs $ \[res] ->
+ FetchAddAddrOp_Word -> \[addr, n] -> inlinePrimop $ \[res] ->
doAtomicAddrRMW res AMO_Add addr (bWord platform) n
- FetchSubAddrOp_Word -> \[addr, n] -> opIntoRegs $ \[res] ->
+ FetchSubAddrOp_Word -> \[addr, n] -> inlinePrimop $ \[res] ->
doAtomicAddrRMW res AMO_Sub addr (bWord platform) n
- FetchAndAddrOp_Word -> \[addr, n] -> opIntoRegs $ \[res] ->
+ FetchAndAddrOp_Word -> \[addr, n] -> inlinePrimop $ \[res] ->
doAtomicAddrRMW res AMO_And addr (bWord platform) n
- FetchNandAddrOp_Word -> \[addr, n] -> opIntoRegs $ \[res] ->
+ FetchNandAddrOp_Word -> \[addr, n] -> inlinePrimop $ \[res] ->
doAtomicAddrRMW res AMO_Nand addr (bWord platform) n
- FetchOrAddrOp_Word -> \[addr, n] -> opIntoRegs $ \[res] ->
+ FetchOrAddrOp_Word -> \[addr, n] -> inlinePrimop $ \[res] ->
doAtomicAddrRMW res AMO_Or addr (bWord platform) n
- FetchXorAddrOp_Word -> \[addr, n] -> opIntoRegs $ \[res] ->
+ FetchXorAddrOp_Word -> \[addr, n] -> inlinePrimop $ \[res] ->
doAtomicAddrRMW res AMO_Xor addr (bWord platform) n
- AtomicReadAddrOp_Word -> \[addr] -> opIntoRegs $ \[res] ->
+ AtomicReadAddrOp_Word -> \[addr] -> inlinePrimop $ \[res] ->
doAtomicReadAddr res addr (bWord platform)
- AtomicWriteAddrOp_Word -> \[addr, val] -> opIntoRegs $ \[] ->
+ AtomicWriteAddrOp_Word -> \[addr, val] -> inlinePrimop $ \[] ->
doAtomicWriteAddr addr (bWord platform) val
- CasAddrOp_Addr -> \[dst, expected, new] -> opIntoRegs $ \[res] ->
+ CasAddrOp_Addr -> \[dst, expected, new] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_Cmpxchg (wordWidth platform)) [dst, expected, new]
- CasAddrOp_Word -> \[dst, expected, new] -> opIntoRegs $ \[res] ->
+ CasAddrOp_Word -> \[dst, expected, new] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_Cmpxchg (wordWidth platform)) [dst, expected, new]
- CasAddrOp_Word8 -> \[dst, expected, new] -> opIntoRegs $ \[res] ->
+ CasAddrOp_Word8 -> \[dst, expected, new] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_Cmpxchg W8) [dst, expected, new]
- CasAddrOp_Word16 -> \[dst, expected, new] -> opIntoRegs $ \[res] ->
+ CasAddrOp_Word16 -> \[dst, expected, new] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_Cmpxchg W16) [dst, expected, new]
- CasAddrOp_Word32 -> \[dst, expected, new] -> opIntoRegs $ \[res] ->
+ CasAddrOp_Word32 -> \[dst, expected, new] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_Cmpxchg W32) [dst, expected, new]
- CasAddrOp_Word64 -> \[dst, expected, new] -> opIntoRegs $ \[res] ->
+ CasAddrOp_Word64 -> \[dst, expected, new] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_Cmpxchg W64) [dst, expected, new]
-- SIMD primops
- (VecBroadcastOp vcat n w) -> \[e] -> opIntoRegs $ \[res] -> do
+ (VecBroadcastOp vcat n w) -> \[e] -> inlinePrimop $ \[res] -> do
checkVecCompatibility cfg vcat n w
doVecBroadcastOp ty e res
where
@@ -955,7 +996,7 @@ emitPrimOp cfg primop =
ty :: CmmType
ty = vecCmmType vcat n w
- (VecPackOp vcat n w) -> \es -> opIntoRegs $ \[res] -> do
+ (VecPackOp vcat n w) -> \es -> inlinePrimop $ \[res] -> do
checkVecCompatibility cfg vcat n w
when (es `lengthIsNot` n) $
panic "emitPrimOp: VecPackOp has wrong number of arguments"
@@ -964,7 +1005,7 @@ emitPrimOp cfg primop =
ty :: CmmType
ty = vecCmmType vcat n w
- (VecUnpackOp vcat n w) -> \[arg] -> opIntoRegs $ \res -> do
+ (VecUnpackOp vcat n w) -> \[arg] -> inlinePrimop $ \res -> do
checkVecCompatibility cfg vcat n w
when (res `lengthIsNot` n) $
panic "emitPrimOp: VecUnpackOp has wrong number of results"
@@ -973,56 +1014,56 @@ emitPrimOp cfg primop =
ty :: CmmType
ty = vecCmmType vcat n w
- (VecInsertOp vcat n w) -> \[v,e,i] -> opIntoRegs $ \[res] -> do
+ (VecInsertOp vcat n w) -> \[v,e,i] -> inlinePrimop $ \[res] -> do
checkVecCompatibility cfg vcat n w
doVecInsertOp ty v e i res
where
ty :: CmmType
ty = vecCmmType vcat n w
- (VecIndexByteArrayOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecIndexByteArrayOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doIndexByteArrayOp Nothing ty res0 args
where
ty :: CmmType
ty = vecCmmType vcat n w
- (VecReadByteArrayOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecReadByteArrayOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doIndexByteArrayOp Nothing ty res0 args
where
ty :: CmmType
ty = vecCmmType vcat n w
- (VecWriteByteArrayOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecWriteByteArrayOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doWriteByteArrayOp Nothing ty res0 args
where
ty :: CmmType
ty = vecCmmType vcat n w
- (VecIndexOffAddrOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecIndexOffAddrOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doIndexOffAddrOp Nothing ty res0 args
where
ty :: CmmType
ty = vecCmmType vcat n w
- (VecReadOffAddrOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecReadOffAddrOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doIndexOffAddrOp Nothing ty res0 args
where
ty :: CmmType
ty = vecCmmType vcat n w
- (VecWriteOffAddrOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecWriteOffAddrOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doWriteOffAddrOp Nothing ty res0 args
where
ty :: CmmType
ty = vecCmmType vcat n w
- (VecIndexScalarByteArrayOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecIndexScalarByteArrayOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doIndexByteArrayOpAs Nothing vecty ty res0 args
where
@@ -1032,7 +1073,7 @@ emitPrimOp cfg primop =
ty :: CmmType
ty = vecCmmCat vcat w
- (VecReadScalarByteArrayOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecReadScalarByteArrayOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doIndexByteArrayOpAs Nothing vecty ty res0 args
where
@@ -1042,14 +1083,14 @@ emitPrimOp cfg primop =
ty :: CmmType
ty = vecCmmCat vcat w
- (VecWriteScalarByteArrayOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecWriteScalarByteArrayOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doWriteByteArrayOp Nothing ty res0 args
where
ty :: CmmType
ty = vecCmmCat vcat w
- (VecIndexScalarOffAddrOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecIndexScalarOffAddrOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doIndexOffAddrOpAs Nothing vecty ty res0 args
where
@@ -1059,7 +1100,7 @@ emitPrimOp cfg primop =
ty :: CmmType
ty = vecCmmCat vcat w
- (VecReadScalarOffAddrOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecReadScalarOffAddrOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doIndexOffAddrOpAs Nothing vecty ty res0 args
where
@@ -1069,79 +1110,79 @@ emitPrimOp cfg primop =
ty :: CmmType
ty = vecCmmCat vcat w
- (VecWriteScalarOffAddrOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecWriteScalarOffAddrOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doWriteOffAddrOp Nothing ty res0 args
where
ty :: CmmType
ty = vecCmmCat vcat w
- VecShuffleOp vcat n w -> \ args -> opIntoRegs $ \ [res] -> do
+ VecShuffleOp vcat n w -> \ args -> inlinePrimop $ \ [res] -> do
checkVecCompatibility cfg vcat n w
doShuffleOp (vecCmmType vcat n w) args res
-- Prefetch
- PrefetchByteArrayOp3 -> \args -> opIntoRegs $ \[] ->
+ PrefetchByteArrayOp3 -> \args -> inlinePrimop $ \[] ->
doPrefetchByteArrayOp 3 args
- PrefetchMutableByteArrayOp3 -> \args -> opIntoRegs $ \[] ->
+ PrefetchMutableByteArrayOp3 -> \args -> inlinePrimop $ \[] ->
doPrefetchMutableByteArrayOp 3 args
- PrefetchAddrOp3 -> \args -> opIntoRegs $ \[] ->
+ PrefetchAddrOp3 -> \args -> inlinePrimop $ \[] ->
doPrefetchAddrOp 3 args
- PrefetchValueOp3 -> \args -> opIntoRegs $ \[] ->
+ PrefetchValueOp3 -> \args -> inlinePrimop $ \[] ->
doPrefetchValueOp 3 args
- PrefetchByteArrayOp2 -> \args -> opIntoRegs $ \[] ->
+ PrefetchByteArrayOp2 -> \args -> inlinePrimop $ \[] ->
doPrefetchByteArrayOp 2 args
- PrefetchMutableByteArrayOp2 -> \args -> opIntoRegs $ \[] ->
+ PrefetchMutableByteArrayOp2 -> \args -> inlinePrimop $ \[] ->
doPrefetchMutableByteArrayOp 2 args
- PrefetchAddrOp2 -> \args -> opIntoRegs $ \[] ->
+ PrefetchAddrOp2 -> \args -> inlinePrimop $ \[] ->
doPrefetchAddrOp 2 args
- PrefetchValueOp2 -> \args -> opIntoRegs $ \[] ->
+ PrefetchValueOp2 -> \args -> inlinePrimop $ \[] ->
doPrefetchValueOp 2 args
- PrefetchByteArrayOp1 -> \args -> opIntoRegs $ \[] ->
+ PrefetchByteArrayOp1 -> \args -> inlinePrimop $ \[] ->
doPrefetchByteArrayOp 1 args
- PrefetchMutableByteArrayOp1 -> \args -> opIntoRegs $ \[] ->
+ PrefetchMutableByteArrayOp1 -> \args -> inlinePrimop $ \[] ->
doPrefetchMutableByteArrayOp 1 args
- PrefetchAddrOp1 -> \args -> opIntoRegs $ \[] ->
+ PrefetchAddrOp1 -> \args -> inlinePrimop $ \[] ->
doPrefetchAddrOp 1 args
- PrefetchValueOp1 -> \args -> opIntoRegs $ \[] ->
+ PrefetchValueOp1 -> \args -> inlinePrimop $ \[] ->
doPrefetchValueOp 1 args
- PrefetchByteArrayOp0 -> \args -> opIntoRegs $ \[] ->
+ PrefetchByteArrayOp0 -> \args -> inlinePrimop $ \[] ->
doPrefetchByteArrayOp 0 args
- PrefetchMutableByteArrayOp0 -> \args -> opIntoRegs $ \[] ->
+ PrefetchMutableByteArrayOp0 -> \args -> inlinePrimop $ \[] ->
doPrefetchMutableByteArrayOp 0 args
- PrefetchAddrOp0 -> \args -> opIntoRegs $ \[] ->
+ PrefetchAddrOp0 -> \args -> inlinePrimop $ \[] ->
doPrefetchAddrOp 0 args
- PrefetchValueOp0 -> \args -> opIntoRegs $ \[] ->
+ PrefetchValueOp0 -> \args -> inlinePrimop $ \[] ->
doPrefetchValueOp 0 args
-- Atomic read-modify-write
- FetchAddByteArrayOp_Int -> \[mba, ix, n] -> opIntoRegs $ \[res] ->
+ FetchAddByteArrayOp_Int -> \[mba, ix, n] -> inlinePrimop $ \[res] ->
doAtomicByteArrayRMW res AMO_Add mba ix (bWord platform) n
- FetchSubByteArrayOp_Int -> \[mba, ix, n] -> opIntoRegs $ \[res] ->
+ FetchSubByteArrayOp_Int -> \[mba, ix, n] -> inlinePrimop $ \[res] ->
doAtomicByteArrayRMW res AMO_Sub mba ix (bWord platform) n
- FetchAndByteArrayOp_Int -> \[mba, ix, n] -> opIntoRegs $ \[res] ->
+ FetchAndByteArrayOp_Int -> \[mba, ix, n] -> inlinePrimop $ \[res] ->
doAtomicByteArrayRMW res AMO_And mba ix (bWord platform) n
- FetchNandByteArrayOp_Int -> \[mba, ix, n] -> opIntoRegs $ \[res] ->
+ FetchNandByteArrayOp_Int -> \[mba, ix, n] -> inlinePrimop $ \[res] ->
doAtomicByteArrayRMW res AMO_Nand mba ix (bWord platform) n
- FetchOrByteArrayOp_Int -> \[mba, ix, n] -> opIntoRegs $ \[res] ->
+ FetchOrByteArrayOp_Int -> \[mba, ix, n] -> inlinePrimop $ \[res] ->
doAtomicByteArrayRMW res AMO_Or mba ix (bWord platform) n
- FetchXorByteArrayOp_Int -> \[mba, ix, n] -> opIntoRegs $ \[res] ->
+ FetchXorByteArrayOp_Int -> \[mba, ix, n] -> inlinePrimop $ \[res] ->
doAtomicByteArrayRMW res AMO_Xor mba ix (bWord platform) n
- AtomicReadByteArrayOp_Int -> \[mba, ix] -> opIntoRegs $ \[res] ->
+ AtomicReadByteArrayOp_Int -> \[mba, ix] -> inlinePrimop $ \[res] ->
doAtomicReadByteArray res mba ix (bWord platform)
- AtomicWriteByteArrayOp_Int -> \[mba, ix, val] -> opIntoRegs $ \[] ->
+ AtomicWriteByteArrayOp_Int -> \[mba, ix, val] -> inlinePrimop $ \[] ->
doAtomicWriteByteArray mba ix (bWord platform) val
- CasByteArrayOp_Int -> \[mba, ix, old, new] -> opIntoRegs $ \[res] ->
+ CasByteArrayOp_Int -> \[mba, ix, old, new] -> inlinePrimop $ \[res] ->
doCasByteArray res mba ix (bWord platform) old new
- CasByteArrayOp_Int8 -> \[mba, ix, old, new] -> opIntoRegs $ \[res] ->
+ CasByteArrayOp_Int8 -> \[mba, ix, old, new] -> inlinePrimop $ \[res] ->
doCasByteArray res mba ix b8 old new
- CasByteArrayOp_Int16 -> \[mba, ix, old, new] -> opIntoRegs $ \[res] ->
+ CasByteArrayOp_Int16 -> \[mba, ix, old, new] -> inlinePrimop $ \[res] ->
doCasByteArray res mba ix b16 old new
- CasByteArrayOp_Int32 -> \[mba, ix, old, new] -> opIntoRegs $ \[res] ->
+ CasByteArrayOp_Int32 -> \[mba, ix, old, new] -> inlinePrimop $ \[res] ->
doCasByteArray res mba ix b32 old new
- CasByteArrayOp_Int64 -> \[mba, ix, old, new] -> opIntoRegs $ \[res] ->
+ CasByteArrayOp_Int64 -> \[mba, ix, old, new] -> inlinePrimop $ \[res] ->
doCasByteArray res mba ix b64 old new
-- The rest just translate straightforwardly
@@ -1671,7 +1712,7 @@ emitPrimOp cfg primop =
-- tagToEnum# is special: we need to pull the constructor
-- out of the table, and perform an appropriate return.
- TagToEnumOp -> \[amode] -> PrimopCmmEmit_Internal $ \res_ty -> do
+ TagToEnumOp -> \[amode] -> PrimopCmmEmit True $ \res_ty -> do
-- If you're reading this code in the attempt to figure
-- out why the compiler panic'ed here, it is probably because
-- you used tagToEnum# in a non-monomorphic setting, e.g.,
@@ -1680,7 +1721,7 @@ emitPrimOp cfg primop =
let tycon = fromMaybe (pprPanic "tagToEnum#: Applied to non-concrete type" (ppr res_ty)) (tyConAppTyCon_maybe res_ty)
massert (isEnumerationTyCon tycon)
platform <- getPlatform
- pure [tagToClosure platform tycon amode]
+ emitReturn [tagToClosure platform tycon amode]
-- Out of line primops.
-- TODO compiler need not know about these
@@ -1791,24 +1832,24 @@ emitPrimOp cfg primop =
result_info = getPrimOpResultInfo primop
opNop :: [CmmExpr] -> PrimopCmmEmit
- opNop args = opIntoRegs $ \[res] -> emitAssign (CmmLocal res) arg
+ opNop args = inlinePrimop $ \[res] -> emitAssign (CmmLocal res) arg
where [arg] = args
opNarrow
:: [CmmExpr]
-> (Width -> Width -> MachOp, Width)
-> PrimopCmmEmit
- opNarrow args (mop, rep) = opIntoRegs $ \[res] -> emitAssign (CmmLocal res) $
+ opNarrow args (mop, rep) = inlinePrimop $ \[res] -> emitAssign (CmmLocal res) $
CmmMachOp (mop rep (wordWidth platform)) [CmmMachOp (mop (wordWidth platform) rep) [arg]]
where [arg] = args
-- These primops are implemented by CallishMachOps, because they sometimes
-- turn into foreign calls depending on the backend.
opCallish :: CallishMachOp -> [CmmExpr] -> PrimopCmmEmit
- opCallish prim args = opIntoRegs $ \[res] -> emitPrimCall [res] prim args
+ opCallish prim args = inlinePrimop $ \[res] -> emitPrimCall [res] prim args
opTranslate :: MachOp -> [CmmExpr] -> PrimopCmmEmit
- opTranslate mop args = opIntoRegs $ \[res] -> do
+ opTranslate mop args = inlinePrimop $ \[res] -> do
let stmt = mkAssign (CmmLocal res) (CmmMachOp mop args)
emit stmt
@@ -1830,28 +1871,36 @@ emitPrimOp cfg primop =
:: Either CallishMachOp GenericOp
-> [CmmExpr]
-> PrimopCmmEmit
- opCallishHandledLater callOrNot args = opIntoRegs $ \res0 -> case callOrNot of
+ opCallishHandledLater callOrNot args = inlinePrimop $ \res0 -> case callOrNot of
Left op -> emit $ mkUnsafeCall (PrimTarget op) res0 args
Right gen -> gen res0 args
- opIntoRegs
- :: ([LocalReg] -- where to put the results
+ inlinePrimopWithReturnType
+ :: (Type -- return type
+ -> [LocalReg] -- where to put the results
-> FCode ())
-> PrimopCmmEmit
- opIntoRegs f = PrimopCmmEmit_Internal $ \res_ty -> do
- regs <- case result_info of
- ReturnsVoid -> pure []
- ReturnsPrim rep
- -> do reg <- newTemp (primRepCmmType platform rep)
- pure [reg]
-
- ReturnsTuple
- -> do (regs, _hints) <- newUnboxedTupleRegs res_ty
- pure regs
- f regs
- pure $ map (CmmReg . CmmLocal) regs
-
- alwaysExternal = \_ -> PrimopCmmEmit_External
+ inlinePrimopWithReturnType f = PrimopCmmEmit
+ { primopCmmInline = True
+ , primopCmmCode = \res_ty -> do
+ regs <- case result_info of
+ ReturnsVoid -> pure []
+ ReturnsPrim rep
+ -> do reg <- newTemp (primRepCmmType platform rep)
+ pure [reg]
+
+ ReturnsTuple
+ -> do (regs, _hints) <- newUnboxedTupleRegs res_ty
+ pure regs
+ f res_ty regs
+ emitReturn (map (CmmReg . CmmLocal) regs)
+ }
+
+ inlinePrimop :: ([LocalReg] -> FCode ()) -> PrimopCmmEmit
+ inlinePrimop f = inlinePrimopWithReturnType (const f)
+
+ alwaysExternal = externalPrimop primop
+
-- Note [QuotRem optimization]
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- `quot` and `rem` with constant divisor can be implemented with fast bit-ops
@@ -1898,7 +1947,7 @@ emitPrimOp cfg primop =
= case signs of
-- For fused multiply-add x * y + z, we fall back to the C implementation.
- FMAdd -> opIntoRegs $ \ [res] -> fmaCCall w res arg_x arg_y arg_z
+ FMAdd -> inlinePrimop $ \ [res] -> fmaCCall w res arg_x arg_y arg_z
-- Other fused multiply-add operations are implemented in terms of fmadd
-- This is sound: it does not lose any precision.
@@ -1913,13 +1962,17 @@ emitPrimOp cfg primop =
= CmmMachOp (MO_VF_Neg l w) [x]
fmaOp _ _ _ _ = panic "fmaOp: wrong number of arguments (expected 3)"
-data PrimopCmmEmit
- -- | Out of line fake primop that's actually just a foreign call to other
- -- (presumably) C--.
- = PrimopCmmEmit_External
- -- | Real primop turned into inline C--.
- | PrimopCmmEmit_Internal (Type -- the return type, some primops are specialized to it
- -> FCode [CmmExpr]) -- just for TagToEnum for now
+data PrimopCmmEmit = PrimopCmmEmit
+ { primopCmmInline :: !Bool
+ -- ^ Is the primop code fully inline
+ -- See Note [Inlining out-of-line primops and heap checks]
+ -- in GHC.StgToCmm.Expr
+ , primopCmmCode :: Type -> FCode ReturnKind
+ -- ^ Code for the primop.
+ -- May call external C-- functions if inline=false above.
+ -- The return type is passed, some primops are specialized to it (just
+ -- TagToEnum for now)
+ }
type GenericOp = [CmmFormal] -> [CmmActual] -> FCode ()
=====================================
compiler/GHC/Tc/Gen/HsType.hs
=====================================
@@ -1264,8 +1264,10 @@ tcHsType _ rn_ty@(HsStarTy _ _) exp_kind
= checkExpKind rn_ty liftedTypeKind liftedTypeKind exp_kind
--------- Literals
-tcHsType _ rn_ty@(HsTyLit _ (HsNumTy _ n)) exp_kind
- = do { checkWiredInTyCon naturalTyCon
+tcHsType _ rn_ty@(HsTyLit _ (HsNumTy x n)) exp_kind
+ = do { when (n < 0) $
+ addErr $ TcRnNegativeNumTypeLiteral (HsNumTy x n)
+ ; checkWiredInTyCon naturalTyCon
; checkExpKind rn_ty (mkNumLitTy n) naturalTy exp_kind }
tcHsType _ rn_ty@(HsTyLit _ (HsStrTy _ s)) exp_kind
=====================================
testsuite/tests/codeGen/should_fail/T26958.hs
=====================================
@@ -0,0 +1,15 @@
+{-# LANGUAGE MagicHash, UnboxedTuples #-}
+module Main where
+import GHC.Exts
+import GHC.IO (IO(..))
+
+-- Test that -fcheck-prim-bounds catches OOB access in copySmallArray#
+-- when the length argument is a non-literal (variable). See #26958.
+main :: IO ()
+main = IO $ \s0 ->
+ case newSmallArray# 1# () s0 of { (# s1, srcm #) ->
+ case unsafeFreezeSmallArray# srcm s1 of { (# s2, src #) ->
+ case sizeofSmallArray# src of { n# ->
+ case newSmallArray# 1# () s2 of { (# s3, dst #) ->
+ case copySmallArray# src 0# dst 5# n# s3 of
+ s4 -> (# s4, () #) }}}}
=====================================
testsuite/tests/codeGen/should_fail/all.T
=====================================
@@ -24,3 +24,4 @@ check_bounds_test('CheckBoundsCompareByteArray2') # Check first byte, 1st array
check_bounds_test('CheckBoundsCompareByteArray3') # Check negative length
check_bounds_test('CheckOverlapCopyByteArray')
check_bounds_test('CheckOverlapCopyAddrToByteArray')
+check_bounds_test('T26958')
=====================================
testsuite/tests/parser/should_fail/T26860ppr_overloaded.hs
=====================================
@@ -0,0 +1,11 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module T26860ppr_overloaded where
+
+-- Test that the error message containing the string literal is well-formatted.
+-- See also: parser/should_fail/MultilineStringsError
+x :: Int
+x = "first line \
+ \asdf\n\
+ \second line"
+
=====================================
testsuite/tests/parser/should_fail/T26860ppr_overloaded.stderr
=====================================
@@ -0,0 +1,14 @@
+T26860ppr_overloaded.hs:8:5: error: [GHC-39999]
+ • No instance for ‘GHC.Internal.Data.String.IsString Int’
+ arising from the literal ‘"first line \
+ \asdf\n\
+ \second line"’
+ • In the expression:
+ "first line \
+ \asdf\n\
+ \second line"
+ In an equation for ‘x’:
+ x = "first line \
+ \asdf\n\
+ \second line"
+
=====================================
testsuite/tests/parser/should_fail/T26860ppr_tylit.hs
=====================================
@@ -0,0 +1,13 @@
+{-# LANGUAGE DataKinds #-}
+
+module T26860ppr_tylit where
+
+import Data.Kind (Type)
+
+-- Test that the error message containing the string literal is well-formatted.
+-- See also: parser/should_fail/MultilineStringsError
+type X :: Type
+type X = "first line \
+ \asdf\n\
+ \second line"
+
=====================================
testsuite/tests/parser/should_fail/T26860ppr_tylit.stderr
=====================================
@@ -0,0 +1,11 @@
+T26860ppr_tylit.hs:10:10: error: [GHC-83865]
+ • Expected a type,
+ but ‘"first line \
+ \asdf\n\
+ \second line"’ has kind
+ ‘GHC.Internal.Types.Symbol’
+ • In the type ‘"first line \
+ \asdf\n\
+ \second line"’
+ In the type synonym declaration for ‘X’
+
=====================================
testsuite/tests/parser/should_fail/all.T
=====================================
@@ -245,3 +245,5 @@ test('T26418', normal, compile_fail, [''])
test('T12488c', normal, compile_fail, [''])
test('T12488d', normal, compile_fail, [''])
test('T26860ppr', normal, compile_fail, [''])
+test('T26860ppr_overloaded', normal, compile_fail, [''])
+test('T26860ppr_tylit', normal, compile_fail, [''])
=====================================
testsuite/tests/typecheck/should_fail/T26861.hs
=====================================
@@ -0,0 +1,14 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE NegativeLiterals #-}
+{-# LANGUAGE RequiredTypeArguments #-}
+
+module T26861 where
+
+import Data.Proxy
+import GHC.TypeLits
+
+main :: IO ()
+main = print (natVis (-42))
+
+natVis :: forall a -> KnownNat a => Integer
+natVis n = natVal (Proxy @n)
=====================================
testsuite/tests/typecheck/should_fail/T26861.stderr
=====================================
@@ -0,0 +1,6 @@
+T26861.hs:11:23: error: [GHC-93632]
+ • Illegal literal in type (type literals must not be negative): -42
+ • In the type ‘-42’
+ In the first argument of ‘print’, namely ‘(natVis (-42))’
+ In the expression: print (natVis (-42))
+
=====================================
testsuite/tests/typecheck/should_fail/all.T
=====================================
@@ -752,3 +752,4 @@ test('T23162a', normal, compile_fail, [''])
test('T23162b', normal, compile_fail, [''])
test('T23162c', normal, compile, [''])
test('T23162d', normal, compile, [''])
+test('T26861', normal, compile_fail, [''])
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/5c0cb966f3868b0084985152273f9e…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/5c0cb966f3868b0084985152273f9e…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc] Pushed new branch wip/int-index/no-no-ghc-tc
by Vladislav Zavialov (@int-index) 26 Feb '26
by Vladislav Zavialov (@int-index) 26 Feb '26
26 Feb '26
Vladislav Zavialov pushed new branch wip/int-index/no-no-ghc-tc at Glasgow Haskell Compiler / GHC
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/tree/wip/int-index/no-no-ghc-tc
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][master] Fix -fcheck-prim-bounds for non constant args (#26958)
by Marge Bot (@marge-bot) 26 Feb '26
by Marge Bot (@marge-bot) 26 Feb '26
26 Feb '26
Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC
Commits:
dde22f97 by Sylvain Henry at 2026-02-26T13:14:03-05:00
Fix -fcheck-prim-bounds for non constant args (#26958)
Previously we were only checking bounds for constant (literal)
arguments!
I've refactored the code to simplify the generation of out-of-line Cmm
code for the primop composed of some inline code + some call to an
external Cmm function.
- - - - -
3 changed files:
- compiler/GHC/StgToCmm/Prim.hs
- + testsuite/tests/codeGen/should_fail/T26958.hs
- testsuite/tests/codeGen/should_fail/all.T
Changes:
=====================================
compiler/GHC/StgToCmm/Prim.hs
=====================================
@@ -87,17 +87,27 @@ cgOpApp (StgPrimCallOp primcall) args _res_ty
; emitCall (NativeNodeCall, NativeReturn) fun cmm_args }
cmmPrimOpApp :: StgToCmmConfig -> PrimOp -> [CmmExpr] -> Maybe Type -> FCode ReturnKind
-cmmPrimOpApp cfg primop cmm_args mres_ty =
- case emitPrimOp cfg primop cmm_args of
- PrimopCmmEmit_Internal f ->
- let
- -- if the result type isn't explicitly given, we directly use the
- -- result type of the primop.
- res_ty = fromMaybe (primOpResultType primop) mres_ty
- in emitReturn =<< f res_ty
- PrimopCmmEmit_External -> do
- let fun = CmmLit (CmmLabel (mkRtsPrimOpLabel primop))
- emitCall (NativeNodeCall, NativeReturn) fun cmm_args
+cmmPrimOpApp cfg primop cmm_args mres_ty = do
+ let PrimopCmmEmit _inline f = emitPrimOp cfg primop cmm_args
+ let
+ -- if the result type isn't explicitly given, we directly use the
+ -- result type of the primop.
+ res_ty = fromMaybe (primOpResultType primop) mres_ty
+ f res_ty
+
+externalPrimop :: PrimOp -> [CmmExpr] -> PrimopCmmEmit
+externalPrimop primop args = outOfLinePrimop (callExternalPrimop primop args)
+
+outOfLinePrimop :: FCode ReturnKind -> PrimopCmmEmit
+outOfLinePrimop code = PrimopCmmEmit
+ { primopCmmInline = False
+ , primopCmmCode = \_res_ty -> code
+ }
+
+callExternalPrimop :: PrimOp -> [CmmExpr] -> FCode ReturnKind
+callExternalPrimop primop args = do
+ let fun = CmmLit (CmmLabel (mkRtsPrimOpLabel primop))
+ emitCall (NativeNodeCall, NativeReturn) fun args
-- | Interpret the argument as an unsigned value, assuming the value
@@ -121,8 +131,7 @@ asUnsigned w n = n .&. (bit (widthInBits w) - 1)
shouldInlinePrimOp :: StgToCmmConfig -> PrimOp -> [CmmExpr] -> Bool
shouldInlinePrimOp cfg op args = case emitPrimOp cfg op args of
- PrimopCmmEmit_External -> False
- PrimopCmmEmit_Internal _ -> True
+ PrimopCmmEmit inline _ -> inline
-- TODO: Several primop implementations (e.g. 'doNewByteArrayOp') use
-- ByteOff (or some other fixed width signed type) to represent
@@ -153,103 +162,135 @@ emitPrimOp cfg primop =
NewByteArrayOp_Char -> \case
[(CmmLit (CmmInt n w))]
| asUnsigned w n <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] -> doNewByteArrayOp res (fromInteger n)
- _ -> PrimopCmmEmit_External
+ -> inlinePrimop $ \ [res] -> doNewByteArrayOp res (fromInteger n)
+ args -> externalPrimop primop args
NewArrayOp -> \case
[(CmmLit (CmmInt n w)), init]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \[res] -> doNewArrayOp res (arrPtrsRep platform (fromInteger n)) mkMAP_DIRTY_infoLabel
+ -> inlinePrimop $ \[res] -> doNewArrayOp res (arrPtrsRep platform (fromInteger n)) mkMAP_DIRTY_infoLabel
[ (mkIntExpr platform (fromInteger n),
fixedHdrSize profile + pc_OFFSET_StgMutArrPtrs_ptrs (platformConstants platform))
, (mkIntExpr platform (nonHdrSizeW (arrPtrsRep platform (fromInteger n))),
fixedHdrSize profile + pc_OFFSET_StgMutArrPtrs_size (platformConstants platform))
]
(fromInteger n) init
- _ -> PrimopCmmEmit_External
+ args -> externalPrimop primop args
CopyArrayOp -> \case
[src, src_off, dst, dst_off, (CmmLit (CmmInt n _))] ->
- opIntoRegs $ \ [] -> doCopyArrayOp src src_off dst dst_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ inlinePrimop $ \ [] -> doCopyArrayOp src src_off dst dst_off (fromInteger n)
+ [src, src_off, dst, dst_off, n] ->
+ outOfLinePrimop $ do
+ profile <- getProfile
+ platform <- getPlatform
+ whenCheckBounds $ ifNonZero n $ do
+ emitRangeBoundsCheck src_off n (ptrArraySize platform profile src)
+ emitRangeBoundsCheck dst_off n (ptrArraySize platform profile dst)
+ callExternalPrimop CopyArrayOp [src, src_off, dst, dst_off, n]
+ _ -> panic "CopyArrayOp"
CopyMutableArrayOp -> \case
[src, src_off, dst, dst_off, (CmmLit (CmmInt n _))] ->
- opIntoRegs $ \ [] -> doCopyMutableArrayOp src src_off dst dst_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ inlinePrimop $ \ [] -> doCopyMutableArrayOp src src_off dst dst_off (fromInteger n)
+ [src, src_off, dst, dst_off, n] ->
+ outOfLinePrimop $ do
+ profile <- getProfile
+ platform <- getPlatform
+ whenCheckBounds $ ifNonZero n $ do
+ emitRangeBoundsCheck src_off n (ptrArraySize platform profile src)
+ emitRangeBoundsCheck dst_off n (ptrArraySize platform profile dst)
+ callExternalPrimop CopyMutableArrayOp [src, src_off, dst, dst_off, n]
+ _ -> panic "CopyMutableArrayOp"
CloneArrayOp -> \case
[src, src_off, (CmmLit (CmmInt n w))]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] -> emitCloneArray mkMAP_FROZEN_CLEAN_infoLabel res src src_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ -> inlinePrimop $ \ [res] -> emitCloneArray mkMAP_FROZEN_CLEAN_infoLabel res src src_off (fromInteger n)
+ args -> externalPrimop primop args
CloneMutableArrayOp -> \case
[src, src_off, (CmmLit (CmmInt n w))]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] -> emitCloneArray mkMAP_DIRTY_infoLabel res src src_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ -> inlinePrimop $ \ [res] -> emitCloneArray mkMAP_DIRTY_infoLabel res src src_off (fromInteger n)
+ args -> externalPrimop primop args
FreezeArrayOp -> \case
[src, src_off, (CmmLit (CmmInt n w))]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] -> emitCloneArray mkMAP_FROZEN_CLEAN_infoLabel res src src_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ -> inlinePrimop $ \ [res] -> emitCloneArray mkMAP_FROZEN_CLEAN_infoLabel res src src_off (fromInteger n)
+ args -> externalPrimop primop args
ThawArrayOp -> \case
[src, src_off, (CmmLit (CmmInt n w))]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] -> emitCloneArray mkMAP_DIRTY_infoLabel res src src_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ -> inlinePrimop $ \ [res] -> emitCloneArray mkMAP_DIRTY_infoLabel res src src_off (fromInteger n)
+ args -> externalPrimop primop args
NewSmallArrayOp -> \case
[(CmmLit (CmmInt n w)), init]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] ->
+ -> inlinePrimop $ \ [res] ->
doNewArrayOp res (smallArrPtrsRep (fromInteger n)) mkSMAP_DIRTY_infoLabel
[ (mkIntExpr platform (fromInteger n),
fixedHdrSize profile + pc_OFFSET_StgSmallMutArrPtrs_ptrs (platformConstants platform))
]
(fromInteger n) init
- _ -> PrimopCmmEmit_External
+ args -> externalPrimop primop args
CopySmallArrayOp -> \case
[src, src_off, dst, dst_off, (CmmLit (CmmInt n _))] ->
- opIntoRegs $ \ [] -> doCopySmallArrayOp src src_off dst dst_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ inlinePrimop $ \ [] -> doCopySmallArrayOp src src_off dst dst_off (fromInteger n)
+ [src, src_off, dst, dst_off, n] ->
+ outOfLinePrimop $ do
+ profile <- getProfile
+ platform <- getPlatform
+ whenCheckBounds $ ifNonZero n $ do
+ emitRangeBoundsCheck src_off n (smallPtrArraySize platform profile src)
+ emitRangeBoundsCheck dst_off n (smallPtrArraySize platform profile dst)
+ callExternalPrimop CopySmallArrayOp [src, src_off, dst, dst_off, n]
+ _ -> panic "CopySmallArrayOp"
CopySmallMutableArrayOp -> \case
[src, src_off, dst, dst_off, (CmmLit (CmmInt n _))] ->
- opIntoRegs $ \ [] -> doCopySmallMutableArrayOp src src_off dst dst_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ inlinePrimop $ \ [] -> doCopySmallMutableArrayOp src src_off dst dst_off (fromInteger n)
+ [src, src_off, dst, dst_off, n] ->
+ outOfLinePrimop $ do
+ profile <- getProfile
+ platform <- getPlatform
+ whenCheckBounds $ ifNonZero n $ do
+ emitRangeBoundsCheck src_off n (smallPtrArraySize platform profile src)
+ emitRangeBoundsCheck dst_off n (smallPtrArraySize platform profile dst)
+ callExternalPrimop CopySmallMutableArrayOp [src, src_off, dst, dst_off, n]
+ _ -> panic "CopySmallMutableArrayOp"
CloneSmallArrayOp -> \case
[src, src_off, (CmmLit (CmmInt n w))]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] -> emitCloneSmallArray mkSMAP_FROZEN_CLEAN_infoLabel res src src_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ -> inlinePrimop $ \ [res] -> emitCloneSmallArray mkSMAP_FROZEN_CLEAN_infoLabel res src src_off (fromInteger n)
+ args -> externalPrimop primop args
CloneSmallMutableArrayOp -> \case
[src, src_off, (CmmLit (CmmInt n w))]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] -> emitCloneSmallArray mkSMAP_DIRTY_infoLabel res src src_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ -> inlinePrimop $ \ [res] -> emitCloneSmallArray mkSMAP_DIRTY_infoLabel res src src_off (fromInteger n)
+ args -> externalPrimop primop args
FreezeSmallArrayOp -> \case
[src, src_off, (CmmLit (CmmInt n w))]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] -> emitCloneSmallArray mkSMAP_FROZEN_CLEAN_infoLabel res src src_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ -> inlinePrimop $ \ [res] -> emitCloneSmallArray mkSMAP_FROZEN_CLEAN_infoLabel res src src_off (fromInteger n)
+ args -> externalPrimop primop args
ThawSmallArrayOp -> \case
[src, src_off, (CmmLit (CmmInt n w))]
| wordsToBytes platform (asUnsigned w n) <= max_inl_alloc_size
- -> opIntoRegs $ \ [res] -> emitCloneSmallArray mkSMAP_DIRTY_infoLabel res src src_off (fromInteger n)
- _ -> PrimopCmmEmit_External
+ -> inlinePrimop $ \ [res] -> emitCloneSmallArray mkSMAP_DIRTY_infoLabel res src src_off (fromInteger n)
+ args -> externalPrimop primop args
-- First we handle various awkward cases specially.
- ParOp -> \[arg] -> opIntoRegs $ \[res] ->
+ ParOp -> \[arg] -> inlinePrimop $ \[res] ->
-- for now, just implement this in a C function
-- later, we might want to inline it.
emitCCall
@@ -257,7 +298,7 @@ emitPrimOp cfg primop =
(CmmLit (CmmLabel (mkForeignLabel (fsLit "newSpark") ForeignLabelInExternalPackage IsFunction)))
[(baseExpr platform, AddrHint), (arg,AddrHint)]
- SparkOp -> \[arg] -> opIntoRegs $ \[res] -> do
+ SparkOp -> \[arg] -> inlinePrimop $ \[res] -> do
-- returns the value of arg in res. We're going to therefore
-- refer to arg twice (once to pass to newSpark(), and once to
-- assign to res), so put it in a temporary.
@@ -269,24 +310,24 @@ emitPrimOp cfg primop =
[(baseExpr platform, AddrHint), ((CmmReg (CmmLocal tmp)), AddrHint)]
emitAssign (CmmLocal res) (CmmReg (CmmLocal tmp))
- GetCCSOfOp -> \[arg] -> opIntoRegs $ \[res] -> do
+ GetCCSOfOp -> \[arg] -> inlinePrimop $ \[res] -> do
let
val
| profileIsProfiling profile = costCentreFrom platform (cmmUntag platform arg)
| otherwise = CmmLit (zeroCLit platform)
emitAssign (CmmLocal res) val
- GetCurrentCCSOp -> \[_] -> opIntoRegs $ \[res] ->
+ GetCurrentCCSOp -> \[_] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (cccsExpr platform)
- MyThreadIdOp -> \[] -> opIntoRegs $ \[res] ->
+ MyThreadIdOp -> \[] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (currentTSOExpr platform)
- ReadMutVarOp -> \[mutv] -> opIntoRegs $ \[res] ->
+ ReadMutVarOp -> \[mutv] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_AtomicRead (wordWidth platform) MemOrderAcquire)
[ cmmOffsetW platform mutv (fixedHdrSizeW profile) ]
- WriteMutVarOp -> \[mutv, var] -> opIntoRegs $ \[] -> do
+ WriteMutVarOp -> \[mutv, var] -> inlinePrimop $ \[] -> do
old_val <- CmmLocal <$> newTemp (cmmExprType platform var)
emitAssign old_val (cmmLoadIndexW platform mutv (fixedHdrSizeW profile) (gcWord platform))
@@ -299,14 +340,14 @@ emitPrimOp cfg primop =
[ cmmOffsetW platform mutv (fixedHdrSizeW profile), var ]
emitDirtyMutVar mutv (CmmReg old_val)
- AtomicSwapMutVarOp -> \[mutv, val] -> opIntoRegs $ \[res] -> do
+ AtomicSwapMutVarOp -> \[mutv, val] -> inlinePrimop $ \[res] -> do
let dst = cmmOffsetW platform mutv (fixedHdrSizeW profile)
emitPrimCall [res] (MO_Xchg (wordWidth platform)) [dst, val]
emitDirtyMutVar mutv (CmmReg (CmmLocal res))
-- #define sizzeofByteArrayzh(r,a) \
-- r = ((StgArrBytes *)(a))->bytes
- SizeofByteArrayOp -> \[arg] -> opIntoRegs $ \[res] ->
+ SizeofByteArrayOp -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (byteArraySize platform profile arg)
-- #define sizzeofMutableByteArrayzh(r,a) \
@@ -315,37 +356,37 @@ emitPrimOp cfg primop =
-- #define getSizzeofMutableByteArrayzh(r,a) \
-- r = ((StgArrBytes *)(a))->bytes
- GetSizeofMutableByteArrayOp -> \[arg] -> opIntoRegs $ \[res] ->
+ GetSizeofMutableByteArrayOp -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (byteArraySize platform profile arg)
-- #define touchzh(o) /* nothing */
- TouchOp -> \args@[_] -> opIntoRegs $ \res@[] ->
+ TouchOp -> \args@[_] -> inlinePrimop $ \res@[] ->
emitPrimCall res MO_Touch args
-- #define byteArrayContentszh(r,a) r = BYTE_ARR_CTS(a)
- ByteArrayContents_Char -> \[arg] -> opIntoRegs $ \[res] ->
+ ByteArrayContents_Char -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (cmmOffsetB platform arg (arrWordsHdrSize profile))
-- #define mutableByteArrayContentszh(r,a) r = BYTE_ARR_CTS(a)
- MutableByteArrayContents_Char -> \[arg] -> opIntoRegs $ \[res] ->
+ MutableByteArrayContents_Char -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (cmmOffsetB platform arg (arrWordsHdrSize profile))
-- #define stableNameToIntzh(r,s) (r = ((StgStableName *)s)->sn)
- StableNameToIntOp -> \[arg] -> opIntoRegs $ \[res] ->
+ StableNameToIntOp -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (cmmLoadIndexW platform arg (fixedHdrSizeW profile) (bWord platform))
EqStablePtrOp -> opTranslate (mo_wordEq platform)
- ReallyUnsafePtrEqualityOp -> \[arg1, arg2] -> opIntoRegs $ \[res] ->
+ ReallyUnsafePtrEqualityOp -> \[arg1, arg2] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (CmmMachOp (mo_wordEq platform) [arg1,arg2])
-- #define addrToHValuezh(r,a) r=(P_)a
- AddrToAnyOp -> \[arg] -> opIntoRegs $ \[res] ->
+ AddrToAnyOp -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) arg
-- #define hvalueToAddrzh(r, a) r=(W_)a
- AnyToAddrOp -> \[arg] -> opIntoRegs $ \[res] ->
+ AnyToAddrOp -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) arg
{- Freezing arrays-of-ptrs requires changing an info table, for the
@@ -358,45 +399,45 @@ emitPrimOp cfg primop =
-- SET_INFO((StgClosure *)a,&stg_MUT_ARR_PTRS_FROZEN_DIRTY_info);
-- r = a;
-- }
- UnsafeFreezeArrayOp -> \[arg] -> opIntoRegs $ \[res] ->
+ UnsafeFreezeArrayOp -> \[arg] -> inlinePrimop $ \[res] ->
emit $ catAGraphs
[ setInfo arg (CmmLit (CmmLabel mkMAP_FROZEN_DIRTY_infoLabel)),
mkAssign (CmmLocal res) arg ]
- UnsafeFreezeSmallArrayOp -> \[arg] -> opIntoRegs $ \[res] ->
+ UnsafeFreezeSmallArrayOp -> \[arg] -> inlinePrimop $ \[res] ->
emit $ catAGraphs
[ setInfo arg (CmmLit (CmmLabel mkSMAP_FROZEN_DIRTY_infoLabel)),
mkAssign (CmmLocal res) arg ]
-- #define unsafeFreezzeByteArrayzh(r,a) r=(a)
- UnsafeFreezeByteArrayOp -> \[arg] -> opIntoRegs $ \[res] ->
+ UnsafeFreezeByteArrayOp -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) arg
-- #define unsafeThawByteArrayzh(r,a) r=(a)
- UnsafeThawByteArrayOp -> \[arg] -> opIntoRegs $ \[res] ->
+ UnsafeThawByteArrayOp -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) arg
-- Reading/writing pointer arrays
- ReadArrayOp -> \[obj, ix] -> opIntoRegs $ \[res] ->
+ ReadArrayOp -> \[obj, ix] -> inlinePrimop $ \[res] ->
doReadPtrArrayOp res obj ix
- IndexArrayOp -> \[obj, ix] -> opIntoRegs $ \[res] ->
+ IndexArrayOp -> \[obj, ix] -> inlinePrimop $ \[res] ->
doReadPtrArrayOp res obj ix
- WriteArrayOp -> \[obj, ix, v] -> opIntoRegs $ \[] ->
+ WriteArrayOp -> \[obj, ix, v] -> inlinePrimop $ \[] ->
doWritePtrArrayOp obj ix v
- ReadSmallArrayOp -> \[obj, ix] -> opIntoRegs $ \[res] ->
+ ReadSmallArrayOp -> \[obj, ix] -> inlinePrimop $ \[res] ->
doReadSmallPtrArrayOp res obj ix
- IndexSmallArrayOp -> \[obj, ix] -> opIntoRegs $ \[res] ->
+ IndexSmallArrayOp -> \[obj, ix] -> inlinePrimop $ \[res] ->
doReadSmallPtrArrayOp res obj ix
- WriteSmallArrayOp -> \[obj,ix,v] -> opIntoRegs $ \[] ->
+ WriteSmallArrayOp -> \[obj,ix,v] -> inlinePrimop $ \[] ->
doWriteSmallPtrArrayOp obj ix v
-- Getting the size of pointer arrays
- SizeofArrayOp -> \[arg] -> opIntoRegs $ \[res] ->
+ SizeofArrayOp -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (ptrArraySize platform profile arg)
SizeofMutableArrayOp -> emitPrimOp cfg SizeofArrayOp
- SizeofSmallArrayOp -> \[arg] -> opIntoRegs $ \[res] ->
+ SizeofSmallArrayOp -> \[arg] -> inlinePrimop $ \[res] ->
emitAssign (CmmLocal res) (smallPtrArraySize platform profile arg)
SizeofSmallMutableArrayOp -> emitPrimOp cfg SizeofSmallArrayOp
@@ -404,550 +445,550 @@ emitPrimOp cfg primop =
-- IndexXXXoffAddr
- IndexOffAddrOp_Char -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Char -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp (Just (mo_u_8ToWord platform)) b8 res args
- IndexOffAddrOp_WideChar -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_WideChar -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp (Just (mo_u_32ToWord platform)) b32 res args
- IndexOffAddrOp_Int -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Int -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing (bWord platform) res args
- IndexOffAddrOp_Word -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing (bWord platform) res args
- IndexOffAddrOp_Addr -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Addr -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing (bWord platform) res args
- IndexOffAddrOp_Float -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Float -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing f32 res args
- IndexOffAddrOp_Double -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Double -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing f64 res args
- IndexOffAddrOp_StablePtr -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_StablePtr -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing (bWord platform) res args
- IndexOffAddrOp_Int8 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Int8 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b8 res args
- IndexOffAddrOp_Int16 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Int16 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b16 res args
- IndexOffAddrOp_Int32 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Int32 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b32 res args
- IndexOffAddrOp_Int64 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Int64 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b64 res args
- IndexOffAddrOp_Word8 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b8 res args
- IndexOffAddrOp_Word16 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word16 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b16 res args
- IndexOffAddrOp_Word32 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word32 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b32 res args
- IndexOffAddrOp_Word64 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word64 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b64 res args
-- ReadXXXoffAddr, which are identical, for our purposes, to IndexXXXoffAddr.
- ReadOffAddrOp_Char -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Char -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp (Just (mo_u_8ToWord platform)) b8 res args
- ReadOffAddrOp_WideChar -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_WideChar -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp (Just (mo_u_32ToWord platform)) b32 res args
- ReadOffAddrOp_Int -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Int -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing (bWord platform) res args
- ReadOffAddrOp_Word -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing (bWord platform) res args
- ReadOffAddrOp_Addr -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Addr -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing (bWord platform) res args
- ReadOffAddrOp_Float -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Float -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing f32 res args
- ReadOffAddrOp_Double -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Double -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing f64 res args
- ReadOffAddrOp_StablePtr -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_StablePtr -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing (bWord platform) res args
- ReadOffAddrOp_Int8 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Int8 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b8 res args
- ReadOffAddrOp_Int16 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Int16 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b16 res args
- ReadOffAddrOp_Int32 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Int32 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b32 res args
- ReadOffAddrOp_Int64 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Int64 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b64 res args
- ReadOffAddrOp_Word8 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b8 res args
- ReadOffAddrOp_Word16 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word16 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b16 res args
- ReadOffAddrOp_Word32 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word32 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b32 res args
- ReadOffAddrOp_Word64 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word64 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOp Nothing b64 res args
-- IndexWord8OffAddrAsXXX
- IndexOffAddrOp_Word8AsChar -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsChar -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs (Just (mo_u_8ToWord platform)) b8 b8 res args
- IndexOffAddrOp_Word8AsWideChar -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsWideChar -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs (Just (mo_u_32ToWord platform)) b32 b8 res args
- IndexOffAddrOp_Word8AsInt -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsInt -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing (bWord platform) b8 res args
- IndexOffAddrOp_Word8AsWord -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsWord -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing (bWord platform) b8 res args
- IndexOffAddrOp_Word8AsAddr -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsAddr -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing (bWord platform) b8 res args
- IndexOffAddrOp_Word8AsFloat -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsFloat -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing f32 b8 res args
- IndexOffAddrOp_Word8AsDouble -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsDouble -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing f64 b8 res args
- IndexOffAddrOp_Word8AsStablePtr -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsStablePtr -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing (bWord platform) b8 res args
- IndexOffAddrOp_Word8AsInt16 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsInt16 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b16 b8 res args
- IndexOffAddrOp_Word8AsInt32 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsInt32 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b32 b8 res args
- IndexOffAddrOp_Word8AsInt64 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsInt64 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b64 b8 res args
- IndexOffAddrOp_Word8AsWord16 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsWord16 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b16 b8 res args
- IndexOffAddrOp_Word8AsWord32 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsWord32 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b32 b8 res args
- IndexOffAddrOp_Word8AsWord64 -> \args -> opIntoRegs $ \res ->
+ IndexOffAddrOp_Word8AsWord64 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b64 b8 res args
-- ReadWord8OffAddrAsXXX, identical to IndexWord8OffAddrAsXXX
- ReadOffAddrOp_Word8AsChar -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsChar -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs (Just (mo_u_8ToWord platform)) b8 b8 res args
- ReadOffAddrOp_Word8AsWideChar -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsWideChar -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs (Just (mo_u_32ToWord platform)) b32 b8 res args
- ReadOffAddrOp_Word8AsInt -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsInt -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing (bWord platform) b8 res args
- ReadOffAddrOp_Word8AsWord -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsWord -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing (bWord platform) b8 res args
- ReadOffAddrOp_Word8AsAddr -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsAddr -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing (bWord platform) b8 res args
- ReadOffAddrOp_Word8AsFloat -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsFloat -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing f32 b8 res args
- ReadOffAddrOp_Word8AsDouble -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsDouble -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing f64 b8 res args
- ReadOffAddrOp_Word8AsStablePtr -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsStablePtr -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing (bWord platform) b8 res args
- ReadOffAddrOp_Word8AsInt16 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsInt16 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b16 b8 res args
- ReadOffAddrOp_Word8AsInt32 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsInt32 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b32 b8 res args
- ReadOffAddrOp_Word8AsInt64 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsInt64 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b64 b8 res args
- ReadOffAddrOp_Word8AsWord16 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsWord16 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b16 b8 res args
- ReadOffAddrOp_Word8AsWord32 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsWord32 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b32 b8 res args
- ReadOffAddrOp_Word8AsWord64 -> \args -> opIntoRegs $ \res ->
+ ReadOffAddrOp_Word8AsWord64 -> \args -> inlinePrimop $ \res ->
doIndexOffAddrOpAs Nothing b64 b8 res args
-- WriteWord8ArrayAsXXX
- WriteOffAddrOp_Word8AsChar -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsChar -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp (Just (mo_WordTo8 platform)) b8 res args
- WriteOffAddrOp_Word8AsWideChar -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsWideChar -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp (Just (mo_WordTo32 platform)) b8 res args
- WriteOffAddrOp_Word8AsInt -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsInt -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsWord -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsWord -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsAddr -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsAddr -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsFloat -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsFloat -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsDouble -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsDouble -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsStablePtr -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsStablePtr -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsInt16 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsInt16 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsInt32 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsInt32 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsInt64 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsInt64 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsWord16 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsWord16 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsWord32 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsWord32 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word8AsWord64 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8AsWord64 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
-- IndexXXXArray
- IndexByteArrayOp_Char -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Char -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp (Just (mo_u_8ToWord platform)) b8 res args
- IndexByteArrayOp_WideChar -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_WideChar -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp (Just (mo_u_32ToWord platform)) b32 res args
- IndexByteArrayOp_Int -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Int -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing (bWord platform) res args
- IndexByteArrayOp_Word -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing (bWord platform) res args
- IndexByteArrayOp_Addr -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Addr -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing (bWord platform) res args
- IndexByteArrayOp_Float -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Float -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing f32 res args
- IndexByteArrayOp_Double -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Double -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing f64 res args
- IndexByteArrayOp_StablePtr -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_StablePtr -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing (bWord platform) res args
- IndexByteArrayOp_Int8 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Int8 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b8 res args
- IndexByteArrayOp_Int16 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Int16 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b16 res args
- IndexByteArrayOp_Int32 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Int32 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b32 res args
- IndexByteArrayOp_Int64 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Int64 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b64 res args
- IndexByteArrayOp_Word8 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b8 res args
- IndexByteArrayOp_Word16 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word16 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b16 res args
- IndexByteArrayOp_Word32 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word32 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b32 res args
- IndexByteArrayOp_Word64 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word64 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b64 res args
-- ReadXXXArray, identical to IndexXXXArray.
- ReadByteArrayOp_Char -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Char -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp (Just (mo_u_8ToWord platform)) b8 res args
- ReadByteArrayOp_WideChar -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_WideChar -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp (Just (mo_u_32ToWord platform)) b32 res args
- ReadByteArrayOp_Int -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Int -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing (bWord platform) res args
- ReadByteArrayOp_Word -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing (bWord platform) res args
- ReadByteArrayOp_Addr -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Addr -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing (bWord platform) res args
- ReadByteArrayOp_Float -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Float -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing f32 res args
- ReadByteArrayOp_Double -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Double -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing f64 res args
- ReadByteArrayOp_StablePtr -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_StablePtr -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing (bWord platform) res args
- ReadByteArrayOp_Int8 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Int8 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b8 res args
- ReadByteArrayOp_Int16 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Int16 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b16 res args
- ReadByteArrayOp_Int32 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Int32 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b32 res args
- ReadByteArrayOp_Int64 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Int64 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b64 res args
- ReadByteArrayOp_Word8 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b8 res args
- ReadByteArrayOp_Word16 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word16 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b16 res args
- ReadByteArrayOp_Word32 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word32 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b32 res args
- ReadByteArrayOp_Word64 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word64 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOp Nothing b64 res args
-- IndexWord8ArrayAsXXX
- IndexByteArrayOp_Word8AsChar -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsChar -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs (Just (mo_u_8ToWord platform)) b8 b8 res args
- IndexByteArrayOp_Word8AsWideChar -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsWideChar -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs (Just (mo_u_32ToWord platform)) b32 b8 res args
- IndexByteArrayOp_Word8AsInt -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsInt -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing (bWord platform) b8 res args
- IndexByteArrayOp_Word8AsWord -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsWord -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing (bWord platform) b8 res args
- IndexByteArrayOp_Word8AsAddr -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsAddr -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing (bWord platform) b8 res args
- IndexByteArrayOp_Word8AsFloat -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsFloat -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing f32 b8 res args
- IndexByteArrayOp_Word8AsDouble -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsDouble -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing f64 b8 res args
- IndexByteArrayOp_Word8AsStablePtr -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsStablePtr -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing (bWord platform) b8 res args
- IndexByteArrayOp_Word8AsInt16 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsInt16 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b16 b8 res args
- IndexByteArrayOp_Word8AsInt32 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsInt32 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b32 b8 res args
- IndexByteArrayOp_Word8AsInt64 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsInt64 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b64 b8 res args
- IndexByteArrayOp_Word8AsWord16 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsWord16 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b16 b8 res args
- IndexByteArrayOp_Word8AsWord32 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsWord32 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b32 b8 res args
- IndexByteArrayOp_Word8AsWord64 -> \args -> opIntoRegs $ \res ->
+ IndexByteArrayOp_Word8AsWord64 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b64 b8 res args
-- ReadInt8ArrayAsXXX, identical to IndexInt8ArrayAsXXX
- ReadByteArrayOp_Word8AsChar -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsChar -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs (Just (mo_u_8ToWord platform)) b8 b8 res args
- ReadByteArrayOp_Word8AsWideChar -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsWideChar -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs (Just (mo_u_32ToWord platform)) b32 b8 res args
- ReadByteArrayOp_Word8AsInt -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsInt -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing (bWord platform) b8 res args
- ReadByteArrayOp_Word8AsWord -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsWord -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing (bWord platform) b8 res args
- ReadByteArrayOp_Word8AsAddr -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsAddr -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing (bWord platform) b8 res args
- ReadByteArrayOp_Word8AsFloat -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsFloat -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing f32 b8 res args
- ReadByteArrayOp_Word8AsDouble -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsDouble -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing f64 b8 res args
- ReadByteArrayOp_Word8AsStablePtr -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsStablePtr -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing (bWord platform) b8 res args
- ReadByteArrayOp_Word8AsInt16 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsInt16 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b16 b8 res args
- ReadByteArrayOp_Word8AsInt32 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsInt32 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b32 b8 res args
- ReadByteArrayOp_Word8AsInt64 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsInt64 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b64 b8 res args
- ReadByteArrayOp_Word8AsWord16 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsWord16 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b16 b8 res args
- ReadByteArrayOp_Word8AsWord32 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsWord32 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b32 b8 res args
- ReadByteArrayOp_Word8AsWord64 -> \args -> opIntoRegs $ \res ->
+ ReadByteArrayOp_Word8AsWord64 -> \args -> inlinePrimop $ \res ->
doIndexByteArrayOpAs Nothing b64 b8 res args
-- WriteXXXoffAddr
- WriteOffAddrOp_Char -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Char -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp (Just (mo_WordTo8 platform)) b8 res args
- WriteOffAddrOp_WideChar -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_WideChar -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp (Just (mo_WordTo32 platform)) b32 res args
- WriteOffAddrOp_Int -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Int -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing (bWord platform) res args
- WriteOffAddrOp_Word -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing (bWord platform) res args
- WriteOffAddrOp_Addr -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Addr -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing (bWord platform) res args
- WriteOffAddrOp_Float -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Float -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing f32 res args
- WriteOffAddrOp_Double -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Double -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing f64 res args
- WriteOffAddrOp_StablePtr -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_StablePtr -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing (bWord platform) res args
- WriteOffAddrOp_Int8 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Int8 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Int16 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Int16 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b16 res args
- WriteOffAddrOp_Int32 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Int32 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b32 res args
- WriteOffAddrOp_Int64 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Int64 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b64 res args
- WriteOffAddrOp_Word8 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word8 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b8 res args
- WriteOffAddrOp_Word16 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word16 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b16 res args
- WriteOffAddrOp_Word32 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word32 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b32 res args
- WriteOffAddrOp_Word64 -> \args -> opIntoRegs $ \res ->
+ WriteOffAddrOp_Word64 -> \args -> inlinePrimop $ \res ->
doWriteOffAddrOp Nothing b64 res args
-- WriteXXXArray
- WriteByteArrayOp_Char -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Char -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp (Just (mo_WordTo8 platform)) b8 res args
- WriteByteArrayOp_WideChar -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_WideChar -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp (Just (mo_WordTo32 platform)) b32 res args
- WriteByteArrayOp_Int -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Int -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing (bWord platform) res args
- WriteByteArrayOp_Word -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing (bWord platform) res args
- WriteByteArrayOp_Addr -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Addr -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing (bWord platform) res args
- WriteByteArrayOp_Float -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Float -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing f32 res args
- WriteByteArrayOp_Double -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Double -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing f64 res args
- WriteByteArrayOp_StablePtr -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_StablePtr -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing (bWord platform) res args
- WriteByteArrayOp_Int8 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Int8 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Int16 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Int16 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b16 res args
- WriteByteArrayOp_Int32 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Int32 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b32 res args
- WriteByteArrayOp_Int64 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Int64 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b64 res args
- WriteByteArrayOp_Word8 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word16 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word16 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b16 res args
- WriteByteArrayOp_Word32 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word32 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b32 res args
- WriteByteArrayOp_Word64 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word64 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b64 res args
-- WriteInt8ArrayAsXXX
- WriteByteArrayOp_Word8AsChar -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsChar -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp (Just (mo_WordTo8 platform)) b8 res args
- WriteByteArrayOp_Word8AsWideChar -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsWideChar -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp (Just (mo_WordTo32 platform)) b8 res args
- WriteByteArrayOp_Word8AsInt -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsInt -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsWord -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsWord -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsAddr -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsAddr -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsFloat -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsFloat -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsDouble -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsDouble -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsStablePtr -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsStablePtr -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsInt16 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsInt16 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsInt32 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsInt32 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsInt64 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsInt64 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsWord16 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsWord16 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsWord32 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsWord32 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
- WriteByteArrayOp_Word8AsWord64 -> \args -> opIntoRegs $ \res ->
+ WriteByteArrayOp_Word8AsWord64 -> \args -> inlinePrimop $ \res ->
doWriteByteArrayOp Nothing b8 res args
-- Copying and setting byte arrays
- CopyByteArrayOp -> \[src,src_off,dst,dst_off,n] -> opIntoRegs $ \[] ->
+ CopyByteArrayOp -> \[src,src_off,dst,dst_off,n] -> inlinePrimop $ \[] ->
doCopyByteArrayOp src src_off dst dst_off n
- CopyMutableByteArrayOp -> \[src,src_off,dst,dst_off,n] -> opIntoRegs $ \[] ->
+ CopyMutableByteArrayOp -> \[src,src_off,dst,dst_off,n] -> inlinePrimop $ \[] ->
doCopyMutableByteArrayOp src src_off dst dst_off n
- CopyMutableByteArrayNonOverlappingOp -> \[src,src_off,dst,dst_off,n] -> opIntoRegs $ \[] ->
+ CopyMutableByteArrayNonOverlappingOp -> \[src,src_off,dst,dst_off,n] -> inlinePrimop $ \[] ->
doCopyMutableByteArrayNonOverlappingOp src src_off dst dst_off n
- CopyByteArrayToAddrOp -> \[src,src_off,dst,n] -> opIntoRegs $ \[] ->
+ CopyByteArrayToAddrOp -> \[src,src_off,dst,n] -> inlinePrimop $ \[] ->
doCopyByteArrayToAddrOp src src_off dst n
- CopyMutableByteArrayToAddrOp -> \[src,src_off,dst,n] -> opIntoRegs $ \[] ->
+ CopyMutableByteArrayToAddrOp -> \[src,src_off,dst,n] -> inlinePrimop $ \[] ->
doCopyMutableByteArrayToAddrOp src src_off dst n
- CopyAddrToByteArrayOp -> \[src,dst,dst_off,n] -> opIntoRegs $ \[] ->
+ CopyAddrToByteArrayOp -> \[src,dst,dst_off,n] -> inlinePrimop $ \[] ->
doCopyAddrToByteArrayOp src dst dst_off n
- CopyAddrToAddrOp -> \[src,dst,n] -> opIntoRegs $ \[] ->
+ CopyAddrToAddrOp -> \[src,dst,n] -> inlinePrimop $ \[] ->
doCopyAddrToAddrOp src dst n
- CopyAddrToAddrNonOverlappingOp -> \[src,dst,n] -> opIntoRegs $ \[] ->
+ CopyAddrToAddrNonOverlappingOp -> \[src,dst,n] -> inlinePrimop $ \[] ->
doCopyAddrToAddrNonOverlappingOp src dst n
- SetByteArrayOp -> \[ba,off,len,c] -> opIntoRegs $ \[] ->
+ SetByteArrayOp -> \[ba,off,len,c] -> inlinePrimop $ \[] ->
doSetByteArrayOp ba off len c
- SetAddrRangeOp -> \[dst,len,c] -> opIntoRegs $ \[] ->
+ SetAddrRangeOp -> \[dst,len,c] -> inlinePrimop $ \[] ->
doSetAddrRangeOp dst len c
-- Comparing byte arrays
- CompareByteArraysOp -> \[ba1,ba1_off,ba2,ba2_off,n] -> opIntoRegs $ \[res] ->
+ CompareByteArraysOp -> \[ba1,ba1_off,ba2,ba2_off,n] -> inlinePrimop $ \[res] ->
doCompareByteArraysOp res ba1 ba1_off ba2 ba2_off n
- BSwap16Op -> \[w] -> opIntoRegs $ \[res] ->
+ BSwap16Op -> \[w] -> inlinePrimop $ \[res] ->
emitBSwapCall res w W16
- BSwap32Op -> \[w] -> opIntoRegs $ \[res] ->
+ BSwap32Op -> \[w] -> inlinePrimop $ \[res] ->
emitBSwapCall res w W32
- BSwap64Op -> \[w] -> opIntoRegs $ \[res] ->
+ BSwap64Op -> \[w] -> inlinePrimop $ \[res] ->
emitBSwapCall res w W64
- BSwapOp -> \[w] -> opIntoRegs $ \[res] ->
+ BSwapOp -> \[w] -> inlinePrimop $ \[res] ->
emitBSwapCall res w (wordWidth platform)
- BRev8Op -> \[w] -> opIntoRegs $ \[res] ->
+ BRev8Op -> \[w] -> inlinePrimop $ \[res] ->
emitBRevCall res w W8
- BRev16Op -> \[w] -> opIntoRegs $ \[res] ->
+ BRev16Op -> \[w] -> inlinePrimop $ \[res] ->
emitBRevCall res w W16
- BRev32Op -> \[w] -> opIntoRegs $ \[res] ->
+ BRev32Op -> \[w] -> inlinePrimop $ \[res] ->
emitBRevCall res w W32
- BRev64Op -> \[w] -> opIntoRegs $ \[res] ->
+ BRev64Op -> \[w] -> inlinePrimop $ \[res] ->
emitBRevCall res w W64
- BRevOp -> \[w] -> opIntoRegs $ \[res] ->
+ BRevOp -> \[w] -> inlinePrimop $ \[res] ->
emitBRevCall res w (wordWidth platform)
-- Population count
- PopCnt8Op -> \[w] -> opIntoRegs $ \[res] ->
+ PopCnt8Op -> \[w] -> inlinePrimop $ \[res] ->
emitPopCntCall res w W8
- PopCnt16Op -> \[w] -> opIntoRegs $ \[res] ->
+ PopCnt16Op -> \[w] -> inlinePrimop $ \[res] ->
emitPopCntCall res w W16
- PopCnt32Op -> \[w] -> opIntoRegs $ \[res] ->
+ PopCnt32Op -> \[w] -> inlinePrimop $ \[res] ->
emitPopCntCall res w W32
- PopCnt64Op -> \[w] -> opIntoRegs $ \[res] ->
+ PopCnt64Op -> \[w] -> inlinePrimop $ \[res] ->
emitPopCntCall res w W64
- PopCntOp -> \[w] -> opIntoRegs $ \[res] ->
+ PopCntOp -> \[w] -> inlinePrimop $ \[res] ->
emitPopCntCall res w (wordWidth platform)
-- Parallel bit deposit
- Pdep8Op -> \[src, mask] -> opIntoRegs $ \[res] ->
+ Pdep8Op -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPdepCall res src mask W8
- Pdep16Op -> \[src, mask] -> opIntoRegs $ \[res] ->
+ Pdep16Op -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPdepCall res src mask W16
- Pdep32Op -> \[src, mask] -> opIntoRegs $ \[res] ->
+ Pdep32Op -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPdepCall res src mask W32
- Pdep64Op -> \[src, mask] -> opIntoRegs $ \[res] ->
+ Pdep64Op -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPdepCall res src mask W64
- PdepOp -> \[src, mask] -> opIntoRegs $ \[res] ->
+ PdepOp -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPdepCall res src mask (wordWidth platform)
-- Parallel bit extract
- Pext8Op -> \[src, mask] -> opIntoRegs $ \[res] ->
+ Pext8Op -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPextCall res src mask W8
- Pext16Op -> \[src, mask] -> opIntoRegs $ \[res] ->
+ Pext16Op -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPextCall res src mask W16
- Pext32Op -> \[src, mask] -> opIntoRegs $ \[res] ->
+ Pext32Op -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPextCall res src mask W32
- Pext64Op -> \[src, mask] -> opIntoRegs $ \[res] ->
+ Pext64Op -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPextCall res src mask W64
- PextOp -> \[src, mask] -> opIntoRegs $ \[res] ->
+ PextOp -> \[src, mask] -> inlinePrimop $ \[res] ->
emitPextCall res src mask (wordWidth platform)
-- count leading zeros
- Clz8Op -> \[w] -> opIntoRegs $ \[res] ->
+ Clz8Op -> \[w] -> inlinePrimop $ \[res] ->
emitClzCall res w W8
- Clz16Op -> \[w] -> opIntoRegs $ \[res] ->
+ Clz16Op -> \[w] -> inlinePrimop $ \[res] ->
emitClzCall res w W16
- Clz32Op -> \[w] -> opIntoRegs $ \[res] ->
+ Clz32Op -> \[w] -> inlinePrimop $ \[res] ->
emitClzCall res w W32
- Clz64Op -> \[w] -> opIntoRegs $ \[res] ->
+ Clz64Op -> \[w] -> inlinePrimop $ \[res] ->
emitClzCall res w W64
- ClzOp -> \[w] -> opIntoRegs $ \[res] ->
+ ClzOp -> \[w] -> inlinePrimop $ \[res] ->
emitClzCall res w (wordWidth platform)
-- count trailing zeros
- Ctz8Op -> \[w] -> opIntoRegs $ \[res] ->
+ Ctz8Op -> \[w] -> inlinePrimop $ \[res] ->
emitCtzCall res w W8
- Ctz16Op -> \[w] -> opIntoRegs $ \[res] ->
+ Ctz16Op -> \[w] -> inlinePrimop $ \[res] ->
emitCtzCall res w W16
- Ctz32Op -> \[w] -> opIntoRegs $ \[res] ->
+ Ctz32Op -> \[w] -> inlinePrimop $ \[res] ->
emitCtzCall res w W32
- Ctz64Op -> \[w] -> opIntoRegs $ \[res] ->
+ Ctz64Op -> \[w] -> inlinePrimop $ \[res] ->
emitCtzCall res w W64
- CtzOp -> \[w] -> opIntoRegs $ \[res] ->
+ CtzOp -> \[w] -> inlinePrimop $ \[res] ->
emitCtzCall res w (wordWidth platform)
-- Unsigned int to floating point conversions
- WordToFloatOp -> \[w] -> opIntoRegs $ \[res] ->
+ WordToFloatOp -> \[w] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_UF_Conv W32) [w]
- WordToDoubleOp -> \[w] -> opIntoRegs $ \[res] ->
+ WordToDoubleOp -> \[w] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_UF_Conv W64) [w]
-- Atomic operations
- InterlockedExchange_Addr -> \[src, value] -> opIntoRegs $ \[res] ->
+ InterlockedExchange_Addr -> \[src, value] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_Xchg (wordWidth platform)) [src, value]
- InterlockedExchange_Word -> \[src, value] -> opIntoRegs $ \[res] ->
+ InterlockedExchange_Word -> \[src, value] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_Xchg (wordWidth platform)) [src, value]
- FetchAddAddrOp_Word -> \[addr, n] -> opIntoRegs $ \[res] ->
+ FetchAddAddrOp_Word -> \[addr, n] -> inlinePrimop $ \[res] ->
doAtomicAddrRMW res AMO_Add addr (bWord platform) n
- FetchSubAddrOp_Word -> \[addr, n] -> opIntoRegs $ \[res] ->
+ FetchSubAddrOp_Word -> \[addr, n] -> inlinePrimop $ \[res] ->
doAtomicAddrRMW res AMO_Sub addr (bWord platform) n
- FetchAndAddrOp_Word -> \[addr, n] -> opIntoRegs $ \[res] ->
+ FetchAndAddrOp_Word -> \[addr, n] -> inlinePrimop $ \[res] ->
doAtomicAddrRMW res AMO_And addr (bWord platform) n
- FetchNandAddrOp_Word -> \[addr, n] -> opIntoRegs $ \[res] ->
+ FetchNandAddrOp_Word -> \[addr, n] -> inlinePrimop $ \[res] ->
doAtomicAddrRMW res AMO_Nand addr (bWord platform) n
- FetchOrAddrOp_Word -> \[addr, n] -> opIntoRegs $ \[res] ->
+ FetchOrAddrOp_Word -> \[addr, n] -> inlinePrimop $ \[res] ->
doAtomicAddrRMW res AMO_Or addr (bWord platform) n
- FetchXorAddrOp_Word -> \[addr, n] -> opIntoRegs $ \[res] ->
+ FetchXorAddrOp_Word -> \[addr, n] -> inlinePrimop $ \[res] ->
doAtomicAddrRMW res AMO_Xor addr (bWord platform) n
- AtomicReadAddrOp_Word -> \[addr] -> opIntoRegs $ \[res] ->
+ AtomicReadAddrOp_Word -> \[addr] -> inlinePrimop $ \[res] ->
doAtomicReadAddr res addr (bWord platform)
- AtomicWriteAddrOp_Word -> \[addr, val] -> opIntoRegs $ \[] ->
+ AtomicWriteAddrOp_Word -> \[addr, val] -> inlinePrimop $ \[] ->
doAtomicWriteAddr addr (bWord platform) val
- CasAddrOp_Addr -> \[dst, expected, new] -> opIntoRegs $ \[res] ->
+ CasAddrOp_Addr -> \[dst, expected, new] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_Cmpxchg (wordWidth platform)) [dst, expected, new]
- CasAddrOp_Word -> \[dst, expected, new] -> opIntoRegs $ \[res] ->
+ CasAddrOp_Word -> \[dst, expected, new] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_Cmpxchg (wordWidth platform)) [dst, expected, new]
- CasAddrOp_Word8 -> \[dst, expected, new] -> opIntoRegs $ \[res] ->
+ CasAddrOp_Word8 -> \[dst, expected, new] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_Cmpxchg W8) [dst, expected, new]
- CasAddrOp_Word16 -> \[dst, expected, new] -> opIntoRegs $ \[res] ->
+ CasAddrOp_Word16 -> \[dst, expected, new] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_Cmpxchg W16) [dst, expected, new]
- CasAddrOp_Word32 -> \[dst, expected, new] -> opIntoRegs $ \[res] ->
+ CasAddrOp_Word32 -> \[dst, expected, new] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_Cmpxchg W32) [dst, expected, new]
- CasAddrOp_Word64 -> \[dst, expected, new] -> opIntoRegs $ \[res] ->
+ CasAddrOp_Word64 -> \[dst, expected, new] -> inlinePrimop $ \[res] ->
emitPrimCall [res] (MO_Cmpxchg W64) [dst, expected, new]
-- SIMD primops
- (VecBroadcastOp vcat n w) -> \[e] -> opIntoRegs $ \[res] -> do
+ (VecBroadcastOp vcat n w) -> \[e] -> inlinePrimop $ \[res] -> do
checkVecCompatibility cfg vcat n w
doVecBroadcastOp ty e res
where
@@ -955,7 +996,7 @@ emitPrimOp cfg primop =
ty :: CmmType
ty = vecCmmType vcat n w
- (VecPackOp vcat n w) -> \es -> opIntoRegs $ \[res] -> do
+ (VecPackOp vcat n w) -> \es -> inlinePrimop $ \[res] -> do
checkVecCompatibility cfg vcat n w
when (es `lengthIsNot` n) $
panic "emitPrimOp: VecPackOp has wrong number of arguments"
@@ -964,7 +1005,7 @@ emitPrimOp cfg primop =
ty :: CmmType
ty = vecCmmType vcat n w
- (VecUnpackOp vcat n w) -> \[arg] -> opIntoRegs $ \res -> do
+ (VecUnpackOp vcat n w) -> \[arg] -> inlinePrimop $ \res -> do
checkVecCompatibility cfg vcat n w
when (res `lengthIsNot` n) $
panic "emitPrimOp: VecUnpackOp has wrong number of results"
@@ -973,56 +1014,56 @@ emitPrimOp cfg primop =
ty :: CmmType
ty = vecCmmType vcat n w
- (VecInsertOp vcat n w) -> \[v,e,i] -> opIntoRegs $ \[res] -> do
+ (VecInsertOp vcat n w) -> \[v,e,i] -> inlinePrimop $ \[res] -> do
checkVecCompatibility cfg vcat n w
doVecInsertOp ty v e i res
where
ty :: CmmType
ty = vecCmmType vcat n w
- (VecIndexByteArrayOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecIndexByteArrayOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doIndexByteArrayOp Nothing ty res0 args
where
ty :: CmmType
ty = vecCmmType vcat n w
- (VecReadByteArrayOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecReadByteArrayOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doIndexByteArrayOp Nothing ty res0 args
where
ty :: CmmType
ty = vecCmmType vcat n w
- (VecWriteByteArrayOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecWriteByteArrayOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doWriteByteArrayOp Nothing ty res0 args
where
ty :: CmmType
ty = vecCmmType vcat n w
- (VecIndexOffAddrOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecIndexOffAddrOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doIndexOffAddrOp Nothing ty res0 args
where
ty :: CmmType
ty = vecCmmType vcat n w
- (VecReadOffAddrOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecReadOffAddrOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doIndexOffAddrOp Nothing ty res0 args
where
ty :: CmmType
ty = vecCmmType vcat n w
- (VecWriteOffAddrOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecWriteOffAddrOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doWriteOffAddrOp Nothing ty res0 args
where
ty :: CmmType
ty = vecCmmType vcat n w
- (VecIndexScalarByteArrayOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecIndexScalarByteArrayOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doIndexByteArrayOpAs Nothing vecty ty res0 args
where
@@ -1032,7 +1073,7 @@ emitPrimOp cfg primop =
ty :: CmmType
ty = vecCmmCat vcat w
- (VecReadScalarByteArrayOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecReadScalarByteArrayOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doIndexByteArrayOpAs Nothing vecty ty res0 args
where
@@ -1042,14 +1083,14 @@ emitPrimOp cfg primop =
ty :: CmmType
ty = vecCmmCat vcat w
- (VecWriteScalarByteArrayOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecWriteScalarByteArrayOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doWriteByteArrayOp Nothing ty res0 args
where
ty :: CmmType
ty = vecCmmCat vcat w
- (VecIndexScalarOffAddrOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecIndexScalarOffAddrOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doIndexOffAddrOpAs Nothing vecty ty res0 args
where
@@ -1059,7 +1100,7 @@ emitPrimOp cfg primop =
ty :: CmmType
ty = vecCmmCat vcat w
- (VecReadScalarOffAddrOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecReadScalarOffAddrOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doIndexOffAddrOpAs Nothing vecty ty res0 args
where
@@ -1069,79 +1110,79 @@ emitPrimOp cfg primop =
ty :: CmmType
ty = vecCmmCat vcat w
- (VecWriteScalarOffAddrOp vcat n w) -> \args -> opIntoRegs $ \res0 -> do
+ (VecWriteScalarOffAddrOp vcat n w) -> \args -> inlinePrimop $ \res0 -> do
checkVecCompatibility cfg vcat n w
doWriteOffAddrOp Nothing ty res0 args
where
ty :: CmmType
ty = vecCmmCat vcat w
- VecShuffleOp vcat n w -> \ args -> opIntoRegs $ \ [res] -> do
+ VecShuffleOp vcat n w -> \ args -> inlinePrimop $ \ [res] -> do
checkVecCompatibility cfg vcat n w
doShuffleOp (vecCmmType vcat n w) args res
-- Prefetch
- PrefetchByteArrayOp3 -> \args -> opIntoRegs $ \[] ->
+ PrefetchByteArrayOp3 -> \args -> inlinePrimop $ \[] ->
doPrefetchByteArrayOp 3 args
- PrefetchMutableByteArrayOp3 -> \args -> opIntoRegs $ \[] ->
+ PrefetchMutableByteArrayOp3 -> \args -> inlinePrimop $ \[] ->
doPrefetchMutableByteArrayOp 3 args
- PrefetchAddrOp3 -> \args -> opIntoRegs $ \[] ->
+ PrefetchAddrOp3 -> \args -> inlinePrimop $ \[] ->
doPrefetchAddrOp 3 args
- PrefetchValueOp3 -> \args -> opIntoRegs $ \[] ->
+ PrefetchValueOp3 -> \args -> inlinePrimop $ \[] ->
doPrefetchValueOp 3 args
- PrefetchByteArrayOp2 -> \args -> opIntoRegs $ \[] ->
+ PrefetchByteArrayOp2 -> \args -> inlinePrimop $ \[] ->
doPrefetchByteArrayOp 2 args
- PrefetchMutableByteArrayOp2 -> \args -> opIntoRegs $ \[] ->
+ PrefetchMutableByteArrayOp2 -> \args -> inlinePrimop $ \[] ->
doPrefetchMutableByteArrayOp 2 args
- PrefetchAddrOp2 -> \args -> opIntoRegs $ \[] ->
+ PrefetchAddrOp2 -> \args -> inlinePrimop $ \[] ->
doPrefetchAddrOp 2 args
- PrefetchValueOp2 -> \args -> opIntoRegs $ \[] ->
+ PrefetchValueOp2 -> \args -> inlinePrimop $ \[] ->
doPrefetchValueOp 2 args
- PrefetchByteArrayOp1 -> \args -> opIntoRegs $ \[] ->
+ PrefetchByteArrayOp1 -> \args -> inlinePrimop $ \[] ->
doPrefetchByteArrayOp 1 args
- PrefetchMutableByteArrayOp1 -> \args -> opIntoRegs $ \[] ->
+ PrefetchMutableByteArrayOp1 -> \args -> inlinePrimop $ \[] ->
doPrefetchMutableByteArrayOp 1 args
- PrefetchAddrOp1 -> \args -> opIntoRegs $ \[] ->
+ PrefetchAddrOp1 -> \args -> inlinePrimop $ \[] ->
doPrefetchAddrOp 1 args
- PrefetchValueOp1 -> \args -> opIntoRegs $ \[] ->
+ PrefetchValueOp1 -> \args -> inlinePrimop $ \[] ->
doPrefetchValueOp 1 args
- PrefetchByteArrayOp0 -> \args -> opIntoRegs $ \[] ->
+ PrefetchByteArrayOp0 -> \args -> inlinePrimop $ \[] ->
doPrefetchByteArrayOp 0 args
- PrefetchMutableByteArrayOp0 -> \args -> opIntoRegs $ \[] ->
+ PrefetchMutableByteArrayOp0 -> \args -> inlinePrimop $ \[] ->
doPrefetchMutableByteArrayOp 0 args
- PrefetchAddrOp0 -> \args -> opIntoRegs $ \[] ->
+ PrefetchAddrOp0 -> \args -> inlinePrimop $ \[] ->
doPrefetchAddrOp 0 args
- PrefetchValueOp0 -> \args -> opIntoRegs $ \[] ->
+ PrefetchValueOp0 -> \args -> inlinePrimop $ \[] ->
doPrefetchValueOp 0 args
-- Atomic read-modify-write
- FetchAddByteArrayOp_Int -> \[mba, ix, n] -> opIntoRegs $ \[res] ->
+ FetchAddByteArrayOp_Int -> \[mba, ix, n] -> inlinePrimop $ \[res] ->
doAtomicByteArrayRMW res AMO_Add mba ix (bWord platform) n
- FetchSubByteArrayOp_Int -> \[mba, ix, n] -> opIntoRegs $ \[res] ->
+ FetchSubByteArrayOp_Int -> \[mba, ix, n] -> inlinePrimop $ \[res] ->
doAtomicByteArrayRMW res AMO_Sub mba ix (bWord platform) n
- FetchAndByteArrayOp_Int -> \[mba, ix, n] -> opIntoRegs $ \[res] ->
+ FetchAndByteArrayOp_Int -> \[mba, ix, n] -> inlinePrimop $ \[res] ->
doAtomicByteArrayRMW res AMO_And mba ix (bWord platform) n
- FetchNandByteArrayOp_Int -> \[mba, ix, n] -> opIntoRegs $ \[res] ->
+ FetchNandByteArrayOp_Int -> \[mba, ix, n] -> inlinePrimop $ \[res] ->
doAtomicByteArrayRMW res AMO_Nand mba ix (bWord platform) n
- FetchOrByteArrayOp_Int -> \[mba, ix, n] -> opIntoRegs $ \[res] ->
+ FetchOrByteArrayOp_Int -> \[mba, ix, n] -> inlinePrimop $ \[res] ->
doAtomicByteArrayRMW res AMO_Or mba ix (bWord platform) n
- FetchXorByteArrayOp_Int -> \[mba, ix, n] -> opIntoRegs $ \[res] ->
+ FetchXorByteArrayOp_Int -> \[mba, ix, n] -> inlinePrimop $ \[res] ->
doAtomicByteArrayRMW res AMO_Xor mba ix (bWord platform) n
- AtomicReadByteArrayOp_Int -> \[mba, ix] -> opIntoRegs $ \[res] ->
+ AtomicReadByteArrayOp_Int -> \[mba, ix] -> inlinePrimop $ \[res] ->
doAtomicReadByteArray res mba ix (bWord platform)
- AtomicWriteByteArrayOp_Int -> \[mba, ix, val] -> opIntoRegs $ \[] ->
+ AtomicWriteByteArrayOp_Int -> \[mba, ix, val] -> inlinePrimop $ \[] ->
doAtomicWriteByteArray mba ix (bWord platform) val
- CasByteArrayOp_Int -> \[mba, ix, old, new] -> opIntoRegs $ \[res] ->
+ CasByteArrayOp_Int -> \[mba, ix, old, new] -> inlinePrimop $ \[res] ->
doCasByteArray res mba ix (bWord platform) old new
- CasByteArrayOp_Int8 -> \[mba, ix, old, new] -> opIntoRegs $ \[res] ->
+ CasByteArrayOp_Int8 -> \[mba, ix, old, new] -> inlinePrimop $ \[res] ->
doCasByteArray res mba ix b8 old new
- CasByteArrayOp_Int16 -> \[mba, ix, old, new] -> opIntoRegs $ \[res] ->
+ CasByteArrayOp_Int16 -> \[mba, ix, old, new] -> inlinePrimop $ \[res] ->
doCasByteArray res mba ix b16 old new
- CasByteArrayOp_Int32 -> \[mba, ix, old, new] -> opIntoRegs $ \[res] ->
+ CasByteArrayOp_Int32 -> \[mba, ix, old, new] -> inlinePrimop $ \[res] ->
doCasByteArray res mba ix b32 old new
- CasByteArrayOp_Int64 -> \[mba, ix, old, new] -> opIntoRegs $ \[res] ->
+ CasByteArrayOp_Int64 -> \[mba, ix, old, new] -> inlinePrimop $ \[res] ->
doCasByteArray res mba ix b64 old new
-- The rest just translate straightforwardly
@@ -1671,7 +1712,7 @@ emitPrimOp cfg primop =
-- tagToEnum# is special: we need to pull the constructor
-- out of the table, and perform an appropriate return.
- TagToEnumOp -> \[amode] -> PrimopCmmEmit_Internal $ \res_ty -> do
+ TagToEnumOp -> \[amode] -> PrimopCmmEmit True $ \res_ty -> do
-- If you're reading this code in the attempt to figure
-- out why the compiler panic'ed here, it is probably because
-- you used tagToEnum# in a non-monomorphic setting, e.g.,
@@ -1680,7 +1721,7 @@ emitPrimOp cfg primop =
let tycon = fromMaybe (pprPanic "tagToEnum#: Applied to non-concrete type" (ppr res_ty)) (tyConAppTyCon_maybe res_ty)
massert (isEnumerationTyCon tycon)
platform <- getPlatform
- pure [tagToClosure platform tycon amode]
+ emitReturn [tagToClosure platform tycon amode]
-- Out of line primops.
-- TODO compiler need not know about these
@@ -1791,24 +1832,24 @@ emitPrimOp cfg primop =
result_info = getPrimOpResultInfo primop
opNop :: [CmmExpr] -> PrimopCmmEmit
- opNop args = opIntoRegs $ \[res] -> emitAssign (CmmLocal res) arg
+ opNop args = inlinePrimop $ \[res] -> emitAssign (CmmLocal res) arg
where [arg] = args
opNarrow
:: [CmmExpr]
-> (Width -> Width -> MachOp, Width)
-> PrimopCmmEmit
- opNarrow args (mop, rep) = opIntoRegs $ \[res] -> emitAssign (CmmLocal res) $
+ opNarrow args (mop, rep) = inlinePrimop $ \[res] -> emitAssign (CmmLocal res) $
CmmMachOp (mop rep (wordWidth platform)) [CmmMachOp (mop (wordWidth platform) rep) [arg]]
where [arg] = args
-- These primops are implemented by CallishMachOps, because they sometimes
-- turn into foreign calls depending on the backend.
opCallish :: CallishMachOp -> [CmmExpr] -> PrimopCmmEmit
- opCallish prim args = opIntoRegs $ \[res] -> emitPrimCall [res] prim args
+ opCallish prim args = inlinePrimop $ \[res] -> emitPrimCall [res] prim args
opTranslate :: MachOp -> [CmmExpr] -> PrimopCmmEmit
- opTranslate mop args = opIntoRegs $ \[res] -> do
+ opTranslate mop args = inlinePrimop $ \[res] -> do
let stmt = mkAssign (CmmLocal res) (CmmMachOp mop args)
emit stmt
@@ -1830,28 +1871,36 @@ emitPrimOp cfg primop =
:: Either CallishMachOp GenericOp
-> [CmmExpr]
-> PrimopCmmEmit
- opCallishHandledLater callOrNot args = opIntoRegs $ \res0 -> case callOrNot of
+ opCallishHandledLater callOrNot args = inlinePrimop $ \res0 -> case callOrNot of
Left op -> emit $ mkUnsafeCall (PrimTarget op) res0 args
Right gen -> gen res0 args
- opIntoRegs
- :: ([LocalReg] -- where to put the results
+ inlinePrimopWithReturnType
+ :: (Type -- return type
+ -> [LocalReg] -- where to put the results
-> FCode ())
-> PrimopCmmEmit
- opIntoRegs f = PrimopCmmEmit_Internal $ \res_ty -> do
- regs <- case result_info of
- ReturnsVoid -> pure []
- ReturnsPrim rep
- -> do reg <- newTemp (primRepCmmType platform rep)
- pure [reg]
-
- ReturnsTuple
- -> do (regs, _hints) <- newUnboxedTupleRegs res_ty
- pure regs
- f regs
- pure $ map (CmmReg . CmmLocal) regs
-
- alwaysExternal = \_ -> PrimopCmmEmit_External
+ inlinePrimopWithReturnType f = PrimopCmmEmit
+ { primopCmmInline = True
+ , primopCmmCode = \res_ty -> do
+ regs <- case result_info of
+ ReturnsVoid -> pure []
+ ReturnsPrim rep
+ -> do reg <- newTemp (primRepCmmType platform rep)
+ pure [reg]
+
+ ReturnsTuple
+ -> do (regs, _hints) <- newUnboxedTupleRegs res_ty
+ pure regs
+ f res_ty regs
+ emitReturn (map (CmmReg . CmmLocal) regs)
+ }
+
+ inlinePrimop :: ([LocalReg] -> FCode ()) -> PrimopCmmEmit
+ inlinePrimop f = inlinePrimopWithReturnType (const f)
+
+ alwaysExternal = externalPrimop primop
+
-- Note [QuotRem optimization]
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- `quot` and `rem` with constant divisor can be implemented with fast bit-ops
@@ -1898,7 +1947,7 @@ emitPrimOp cfg primop =
= case signs of
-- For fused multiply-add x * y + z, we fall back to the C implementation.
- FMAdd -> opIntoRegs $ \ [res] -> fmaCCall w res arg_x arg_y arg_z
+ FMAdd -> inlinePrimop $ \ [res] -> fmaCCall w res arg_x arg_y arg_z
-- Other fused multiply-add operations are implemented in terms of fmadd
-- This is sound: it does not lose any precision.
@@ -1913,13 +1962,17 @@ emitPrimOp cfg primop =
= CmmMachOp (MO_VF_Neg l w) [x]
fmaOp _ _ _ _ = panic "fmaOp: wrong number of arguments (expected 3)"
-data PrimopCmmEmit
- -- | Out of line fake primop that's actually just a foreign call to other
- -- (presumably) C--.
- = PrimopCmmEmit_External
- -- | Real primop turned into inline C--.
- | PrimopCmmEmit_Internal (Type -- the return type, some primops are specialized to it
- -> FCode [CmmExpr]) -- just for TagToEnum for now
+data PrimopCmmEmit = PrimopCmmEmit
+ { primopCmmInline :: !Bool
+ -- ^ Is the primop code fully inline
+ -- See Note [Inlining out-of-line primops and heap checks]
+ -- in GHC.StgToCmm.Expr
+ , primopCmmCode :: Type -> FCode ReturnKind
+ -- ^ Code for the primop.
+ -- May call external C-- functions if inline=false above.
+ -- The return type is passed, some primops are specialized to it (just
+ -- TagToEnum for now)
+ }
type GenericOp = [CmmFormal] -> [CmmActual] -> FCode ()
=====================================
testsuite/tests/codeGen/should_fail/T26958.hs
=====================================
@@ -0,0 +1,15 @@
+{-# LANGUAGE MagicHash, UnboxedTuples #-}
+module Main where
+import GHC.Exts
+import GHC.IO (IO(..))
+
+-- Test that -fcheck-prim-bounds catches OOB access in copySmallArray#
+-- when the length argument is a non-literal (variable). See #26958.
+main :: IO ()
+main = IO $ \s0 ->
+ case newSmallArray# 1# () s0 of { (# s1, srcm #) ->
+ case unsafeFreezeSmallArray# srcm s1 of { (# s2, src #) ->
+ case sizeofSmallArray# src of { n# ->
+ case newSmallArray# 1# () s2 of { (# s3, dst #) ->
+ case copySmallArray# src 0# dst 5# n# s3 of
+ s4 -> (# s4, () #) }}}}
=====================================
testsuite/tests/codeGen/should_fail/all.T
=====================================
@@ -24,3 +24,4 @@ check_bounds_test('CheckBoundsCompareByteArray2') # Check first byte, 1st array
check_bounds_test('CheckBoundsCompareByteArray3') # Check negative length
check_bounds_test('CheckOverlapCopyByteArray')
check_bounds_test('CheckOverlapCopyAddrToByteArray')
+check_bounds_test('T26958')
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/dde22f97c9246b838c43a794e4e07ad…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/dde22f97c9246b838c43a794e4e07ad…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][master] wasm: add /assets endpoint to serve user-specified assets
by Marge Bot (@marge-bot) 26 Feb '26
by Marge Bot (@marge-bot) 26 Feb '26
26 Feb '26
Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC
Commits:
c951fef1 by Cheng Shao at 2026-02-25T20:58:28+00:00
wasm: add /assets endpoint to serve user-specified assets
This patch adds an `/assets` endpoint to the wasm dyld http server, so
that users can also fetch assets from the same host with sensible
default MIME types, without needing a separate http server for assets
that also introduces CORS headaches:
- A `-fghci-browser-assets-dir` driver flag is added to specify the
assets root directory (defaults to `$PWD`)
- The dyld http server fetches `mime-db` on demand and uses it as
source of truth for mime types.
Closes #26951.
- - - - -
8 changed files:
- compiler/GHC/Driver/Config/Interpreter.hs
- compiler/GHC/Driver/DynFlags.hs
- compiler/GHC/Driver/Session.hs
- compiler/GHC/Runtime/Interpreter/Init.hs
- compiler/GHC/Runtime/Interpreter/Types.hs
- compiler/GHC/Runtime/Interpreter/Wasm.hs
- docs/users_guide/wasm.rst
- utils/jsffi/dyld.mjs
Changes:
=====================================
compiler/GHC/Driver/Config/Interpreter.hs
=====================================
@@ -30,6 +30,7 @@ initInterpOpts dflags = do
, interpBrowser = gopt Opt_GhciBrowser dflags
, interpBrowserHost = ghciBrowserHost dflags
, interpBrowserPort = ghciBrowserPort dflags
+ , interpBrowserAssetsDir = ghciBrowserAssetsDir dflags
, interpBrowserRedirectWasiConsole = gopt Opt_GhciBrowserRedirectWasiConsole dflags
, interpBrowserPuppeteerLaunchOpts = ghciBrowserPuppeteerLaunchOpts dflags
, interpBrowserPlaywrightBrowserType = ghciBrowserPlaywrightBrowserType dflags
@@ -43,4 +44,3 @@ initInterpOpts dflags = do
, interpCcConfig = configureCc dflags
, interpExecutableLinkOpts = initExecutableLinkOpts dflags Dynamic
}
-
=====================================
compiler/GHC/Driver/DynFlags.hs
=====================================
@@ -426,6 +426,7 @@ data DynFlags = DynFlags {
-- wasm ghci browser mode
ghciBrowserHost :: !String,
ghciBrowserPort :: !Int,
+ ghciBrowserAssetsDir :: !(Maybe FilePath),
ghciBrowserPuppeteerLaunchOpts :: !(Maybe String),
ghciBrowserPlaywrightBrowserType :: !(Maybe String),
ghciBrowserPlaywrightLaunchOpts :: !(Maybe String),
@@ -727,6 +728,7 @@ defaultDynFlags mySettings =
ghciBrowserHost = "127.0.0.1",
ghciBrowserPort = 0,
+ ghciBrowserAssetsDir = Nothing,
ghciBrowserPuppeteerLaunchOpts = Nothing,
ghciBrowserPlaywrightBrowserType = Nothing,
ghciBrowserPlaywrightLaunchOpts = Nothing,
=====================================
compiler/GHC/Driver/Session.hs
=====================================
@@ -1896,6 +1896,8 @@ dynamic_flags_deps = [
$ hasArg $ \f d -> d { ghciBrowserHost = f }
, make_ord_flag defGhciFlag "fghci-browser-port"
$ intSuffix $ \n d -> d { ghciBrowserPort = n }
+ , make_ord_flag defGhciFlag "fghci-browser-assets-dir"
+ $ hasArg $ \f d -> d { ghciBrowserAssetsDir = Just f }
, make_ord_flag defGhciFlag "fghci-browser-puppeteer-launch-opts"
$ hasArg $ \f d -> d { ghciBrowserPuppeteerLaunchOpts = Just f }
, make_ord_flag defGhciFlag "fghci-browser-playwright-browser-type"
=====================================
compiler/GHC/Runtime/Interpreter/Init.hs
=====================================
@@ -49,6 +49,7 @@ data InterpOpts = InterpOpts
, interpBrowser :: Bool
, interpBrowserHost :: String
, interpBrowserPort :: Int
+ , interpBrowserAssetsDir :: !(Maybe FilePath)
, interpBrowserRedirectWasiConsole :: Bool
, interpBrowserPuppeteerLaunchOpts :: Maybe String
, interpBrowserPlaywrightBrowserType :: Maybe String
@@ -89,6 +90,7 @@ initInterpreter dflags tmpfs logger platform finder_cache unit_env opts = do
, wasmInterpBrowser = interpBrowser opts
, wasmInterpBrowserHost = interpBrowserHost opts
, wasmInterpBrowserPort = interpBrowserPort opts
+ , wasmInterpBrowserAssetsDir = interpBrowserAssetsDir opts
, wasmInterpBrowserRedirectWasiConsole = interpBrowserRedirectWasiConsole opts
, wasmInterpBrowserPuppeteerLaunchOpts = interpBrowserPuppeteerLaunchOpts opts
, wasmInterpBrowserPlaywrightBrowserType = interpBrowserPlaywrightBrowserType opts
=====================================
compiler/GHC/Runtime/Interpreter/Types.hs
=====================================
@@ -220,6 +220,7 @@ data WasmInterpConfig = WasmInterpConfig
, wasmInterpBrowser :: !Bool
, wasmInterpBrowserHost :: !String
, wasmInterpBrowserPort :: !Int
+ , wasmInterpBrowserAssetsDir :: !(Maybe FilePath)
, wasmInterpBrowserRedirectWasiConsole :: !Bool
, wasmInterpBrowserPuppeteerLaunchOpts :: !(Maybe String)
, wasmInterpBrowserPlaywrightBrowserType :: !(Maybe String)
=====================================
compiler/GHC/Runtime/Interpreter/Wasm.hs
=====================================
@@ -52,6 +52,7 @@ spawnWasmInterp WasmInterpConfig {..} = do
let dyld_env =
[("GHCI_BROWSER", "1") | wasmInterpBrowser]
++ [("GHCI_BROWSER_HOST", wasmInterpBrowserHost), ("GHCI_BROWSER_PORT", show wasmInterpBrowserPort)]
+ ++ [("GHCI_BROWSER_ASSETS_DIR", f) | f <- maybeToList wasmInterpBrowserAssetsDir]
++ [("GHCI_BROWSER_REDIRECT_WASI_CONSOLE", "1") | wasmInterpBrowserRedirectWasiConsole]
++ [("GHCI_BROWSER_PUPPETEER_LAUNCH_OPTS", f) | f <- maybeToList wasmInterpBrowserPuppeteerLaunchOpts]
++ [("GHCI_BROWSER_PLAYWRIGHT_BROWSER_TYPE", f) | f <- maybeToList wasmInterpBrowserPlaywrightBrowserType]
=====================================
docs/users_guide/wasm.rst
=====================================
@@ -193,6 +193,18 @@ See below for other optional GHC flags of wasm ghci browser mode:
Specify the port that the ``dyld`` HTTP server should listen on.
Defaults to a random idle port.
+.. ghc-flag:: -fghci-browser-assets-dir
+ :shortdesc: User-specified assets root directory
+ :type: dynamic
+
+ :default: ``$PWD``
+
+ The HTTP server also exposes an ``/assets`` endpoint that allows
+ the users to fetch custom assets with sensible default MIME type,
+ e.g. `http://127.0.0.1:8080/assets/index.html` would fetch
+ `index.html` in the assets root directory with ``text/html`` MIME
+ type.
+
.. ghc-flag:: -fghci-browser-redirect-wasi-console
:shortdesc: Redirect wasi console stdout/stderr back to host ghci.
:type: dynamic
=====================================
utils/jsffi/dyld.mjs
=====================================
@@ -560,6 +560,7 @@ export class DyLDRPC {
// Actual implementation of endpoints used by DyLDRPC
class DyLDRPCServer {
+ #mimeDb;
#dyldHost;
#server;
#wss;
@@ -567,6 +568,7 @@ class DyLDRPCServer {
constructor({
host,
port,
+ assetsDir,
dyldPath,
searchDirs,
mainSoPath,
@@ -575,6 +577,20 @@ class DyLDRPCServer {
args,
redirectWasiConsole,
}) {
+ this.#mimeDb = fetch("https://cdn.jsdelivr.net/npm/mime-db@1.54.0/db.json")
+ .then((resp) => resp.json())
+ .then((db) => {
+ const ext2mime = {};
+ for (const mime in db) {
+ if (db[mime].extensions) {
+ for (const ext of db[mime].extensions) {
+ ext2mime[`.${ext}`] = mime;
+ }
+ }
+ }
+ return ext2mime;
+ });
+
this.#dyldHost = new DyLDHost({ outFd, inFd });
this.#server = http.createServer(async (req, res) => {
@@ -634,6 +650,33 @@ args.rpc.opened.then(() => main(args));
return;
}
+ if (req.url.startsWith("/assets")) {
+ const p = path.resolve(
+ assetsDir,
+ new URL(req.url, origin).pathname.replace("/assets/", ""),
+ );
+ try {
+ await fs.promises.access(p, fs.promises.constants.R_OK);
+
+ res.setHeader(
+ "Content-Type",
+ (await this.#mimeDb)[path.extname(p)] || "application/octet-stream",
+ );
+
+ res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
+
+ res.writeHead(200);
+ fs.createReadStream(p).pipe(res);
+ } catch {
+ res.writeHead(404, {
+ "Content-Type": "text/plain",
+ });
+ res.end("not found");
+ }
+
+ return;
+ }
+
if (req.url.startsWith("/rpc")) {
const endpoint = req.url.replace("/rpc/", "");
@@ -1373,6 +1416,7 @@ async function nodeMain({ searchDirs, mainSoPath, outFd, inFd, args }) {
const server = new DyLDRPCServer({
host: process.env.GHCI_BROWSER_HOST || "127.0.0.1",
port: process.env.GHCI_BROWSER_PORT || 0,
+ assetsDir: process.env.GHCI_BROWSER_ASSETS_DIR || process.cwd(),
dyldPath: import.meta.filename,
searchDirs,
mainSoPath,
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/c951fef11c9cac9c43c6520905103e3…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/c951fef11c9cac9c43c6520905103e3…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][wip/fix-26953] Decoupling 'L.H.S' from 'GHC.Types.SourceText'.
by recursion-ninja (@recursion-ninja) 26 Feb '26
by recursion-ninja (@recursion-ninja) 26 Feb '26
26 Feb '26
recursion-ninja pushed to branch wip/fix-26953 at Glasgow Haskell Compiler / GHC
Commits:
eed253c8 by Recursion Ninja at 2026-02-26T13:00:27-05:00
Decoupling 'L.H.S' from 'GHC.Types.SourceText'.
* Migrated 'IntegralLit' to 'L.H.S.Lit'.
* Migrated 'FractionalLit' to 'L.H.S.Lit'.
* Migrated 'StringLiteral' to 'L.H.S.Lit'.
* Added TTG extension points to the types above.
* Added nice export list to 'GHC.Hs.Lit'.
* Added 'rnOverLitVal' and 'tcOverLitVal' functions to 'GHC.Hs.Lit'.
* Moved [Notes] about 'SourceText' from 'L.H.S.*' to 'GHC.*'.
* Removed all references to 'SourceText' from 'L.H.S'.
* Renamed exported functions for nomenclature consistency.
Resolves issue #26953
- - - - -
45 changed files:
- compiler/GHC/Builtin/Utils.hs
- compiler/GHC/Hs/Binds.hs
- compiler/GHC/Hs/Decls.hs
- compiler/GHC/Hs/Expr.hs
- compiler/GHC/Hs/Instances.hs
- compiler/GHC/Hs/Lit.hs
- compiler/GHC/Hs/Utils.hs
- compiler/GHC/HsToCore/Expr.hs
- compiler/GHC/HsToCore/Match.hs
- compiler/GHC/HsToCore/Match/Literal.hs
- compiler/GHC/HsToCore/Pmc/Desugar.hs
- compiler/GHC/HsToCore/Pmc/Solver/Types.hs
- compiler/GHC/HsToCore/Quote.hs
- compiler/GHC/Iface/Syntax.hs
- compiler/GHC/Iface/Warnings.hs
- compiler/GHC/Parser.y
- compiler/GHC/Parser/HaddockLex.x
- compiler/GHC/Parser/Lexer.x
- compiler/GHC/Parser/PostProcess.hs
- compiler/GHC/Rename/Bind.hs
- compiler/GHC/Rename/Expr.hs
- compiler/GHC/Rename/Module.hs
- compiler/GHC/Rename/Names.hs
- compiler/GHC/Rename/Pat.hs
- compiler/GHC/Rename/Utils.hs
- compiler/GHC/Tc/Gen/App.hs
- compiler/GHC/Tc/Gen/Bind.hs
- compiler/GHC/Tc/Gen/Head.hs
- compiler/GHC/Tc/Gen/HsType.hs
- compiler/GHC/Tc/Utils/Instantiate.hs
- compiler/GHC/Tc/Utils/TcMType.hs
- compiler/GHC/ThToHs.hs
- compiler/GHC/Types/ForeignCall.hs
- compiler/GHC/Types/PkgQual.hs
- compiler/GHC/Types/SourceText.hs
- compiler/GHC/Unit/Module/Warnings.hs
- compiler/Language/Haskell/Syntax/Binds.hs
- compiler/Language/Haskell/Syntax/Binds/InlinePragma.hs
- compiler/Language/Haskell/Syntax/Decls.hs
- compiler/Language/Haskell/Syntax/Decls/Foreign.hs
- compiler/Language/Haskell/Syntax/Expr.hs
- compiler/Language/Haskell/Syntax/Extension.hs
- compiler/Language/Haskell/Syntax/Lit.hs
- utils/check-exact/ExactPrint.hs
- utils/haddock/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/eed253c8af535aead0096305e5ab3a6…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/eed253c8af535aead0096305e5ab3a6…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][wip/fix-26953] Decoupling 'L.H.S' from 'GHC.Types.SourceText'.
by recursion-ninja (@recursion-ninja) 26 Feb '26
by recursion-ninja (@recursion-ninja) 26 Feb '26
26 Feb '26
recursion-ninja pushed to branch wip/fix-26953 at Glasgow Haskell Compiler / GHC
Commits:
b1fcb8d3 by Recursion Ninja at 2026-02-26T12:48:59-05:00
Decoupling 'L.H.S' from 'GHC.Types.SourceText'.
* Migrated 'IntegralLit' to 'L.H.S.Lit'.
* Migrated 'FractionalLit' to 'L.H.S.Lit'.
* Migrated 'StringLiteral' to 'L.H.S.Lit'.
* Added TTG extension points to the types above.
* Added nice export list to 'GHC.Hs.Lit'.
* Added 'rnOverLitVal' and 'tcOverLitVal' functions to 'GHC.Hs.Lit'.
* Moved [Notes] about 'SourceText' from 'L.H.S.*' to 'GHC.*'.
* Removed all references to 'SourceText' from 'L.H.S'.
* Renamed exported functions for nomenclature consistency.
Resolves issue #26953
- - - - -
45 changed files:
- compiler/GHC/Builtin/Utils.hs
- compiler/GHC/Hs/Binds.hs
- compiler/GHC/Hs/Decls.hs
- compiler/GHC/Hs/Expr.hs
- compiler/GHC/Hs/Instances.hs
- compiler/GHC/Hs/Lit.hs
- compiler/GHC/Hs/Utils.hs
- compiler/GHC/HsToCore/Expr.hs
- compiler/GHC/HsToCore/Match.hs
- compiler/GHC/HsToCore/Match/Literal.hs
- compiler/GHC/HsToCore/Pmc/Desugar.hs
- compiler/GHC/HsToCore/Pmc/Solver/Types.hs
- compiler/GHC/HsToCore/Quote.hs
- compiler/GHC/Iface/Syntax.hs
- compiler/GHC/Iface/Warnings.hs
- compiler/GHC/Parser.y
- compiler/GHC/Parser/HaddockLex.x
- compiler/GHC/Parser/Lexer.x
- compiler/GHC/Parser/PostProcess.hs
- compiler/GHC/Rename/Bind.hs
- compiler/GHC/Rename/Expr.hs
- compiler/GHC/Rename/Module.hs
- compiler/GHC/Rename/Names.hs
- compiler/GHC/Rename/Pat.hs
- compiler/GHC/Rename/Utils.hs
- compiler/GHC/Tc/Gen/App.hs
- compiler/GHC/Tc/Gen/Bind.hs
- compiler/GHC/Tc/Gen/Head.hs
- compiler/GHC/Tc/Gen/HsType.hs
- compiler/GHC/Tc/Utils/Instantiate.hs
- compiler/GHC/Tc/Utils/TcMType.hs
- compiler/GHC/ThToHs.hs
- compiler/GHC/Types/ForeignCall.hs
- compiler/GHC/Types/PkgQual.hs
- compiler/GHC/Types/SourceText.hs
- compiler/GHC/Unit/Module/Warnings.hs
- compiler/Language/Haskell/Syntax/Binds.hs
- compiler/Language/Haskell/Syntax/Binds/InlinePragma.hs
- compiler/Language/Haskell/Syntax/Decls.hs
- compiler/Language/Haskell/Syntax/Decls/Foreign.hs
- compiler/Language/Haskell/Syntax/Expr.hs
- compiler/Language/Haskell/Syntax/Extension.hs
- compiler/Language/Haskell/Syntax/Lit.hs
- utils/check-exact/ExactPrint.hs
- utils/haddock/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/b1fcb8d3408450813e186fff76e337e…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/b1fcb8d3408450813e186fff76e337e…
You're receiving this email because of your account on gitlab.haskell.org.
1
0
[Git][ghc/ghc][wip/fix-26953] 7 commits: Add optional `SrcLoc` to `StackAnnotation` class
by recursion-ninja (@recursion-ninja) 26 Feb '26
by recursion-ninja (@recursion-ninja) 26 Feb '26
26 Feb '26
recursion-ninja pushed to branch wip/fix-26953 at Glasgow Haskell Compiler / GHC
Commits:
4c40df3d by fendor at 2026-02-20T10:24:48-05:00
Add optional `SrcLoc` to `StackAnnotation` class
`StackAnnotation`s give access to an optional `SrcLoc` field that
user-added stack annotations can use to provide better backtraces in both error
messages and when decoding the callstack.
We update builtin stack annotations such as `StringAnnotation` and
`ShowAnnotation` to also capture the `SrcLoc` of the current `CallStack`
to improve backtraces by default (if stack annotations are used).
This change is backwards compatible with GHC 9.14.1.
- - - - -
fd9aaa28 by Simon Hengel at 2026-02-20T10:25:33-05:00
docs: Fix grammar in explicit_namespaces.rst
- - - - -
44354255 by Vo Minh Thu at 2026-02-20T18:53:06-05:00
GHCi: add a :version command.
This looks like:
ghci> :version
GHCi, version 9.11.20240322
This closes #24576.
Co-Author: Markus Läll <markus.l2ll(a)gmail.com>
- - - - -
eab3dbba by Andreas Klebinger at 2026-02-20T18:53:51-05:00
hadrian/build-cabal: Better respect and utilize -j
* We now respect -j<n> for the cabal invocation to build hadrian rather
than hardcoding -j
* We use the --semaphore flag to ensure cabal/ghc build the hadrian
executable in parallel using the -jsem mechanism.
Saves 10-15s on fresh builds for me.
Fixes #26876
- - - - -
17839248 by Teo Camarasu at 2026-02-24T08:36:03-05:00
ghc-internal: avoid depending on GHC.Internal.Control.Monad.Fix
This module contains the definition of MonadFix, since we want an
instance for IO, that instance requires a lot of machinery and we want
to avoid an orphan instance, this will naturally be quite high up in the
dependency graph.
So we want to avoid other modules depending on it as far as possible.
On Windows, the IO manager depends on the RTSFlags type, which
transtively depends on MonadFix. We refactor things to avoid this
dependency, which would have caused a regression.
Resolves #26875
Metric Decrease:
T12227
- - - - -
fa88d09a by Wolfgang Jeltsch at 2026-02-24T08:36:47-05:00
Refine the imports of `System.IO.OS`
Commit 68bd08055594b8cbf6148a72d108786deb6c12a1 replaced the
`GHC.Internal.Data.Bool` import by a `GHC.Internal.Base` import.
However, while the `GHC.Internal.Data.Bool` import was conditional and
partial, the `GHC.Internal.Base` import is unconditional and total. As a
result, the import list is not tuned to import only the necessary bits
anymore, and furthermore GHC emits a lot of warnings about redundant
imports.
This commit makes the `GHC.Internal.Base` import conditional and partial
in the same way that the `GHC.Internal.Data.Bool` import was.
- - - - -
31a38ea0 by Recursion Ninja at 2026-02-26T11:34:35-05:00
Decoupling 'L.H.S' from 'GHC.Types.SourceText'.
* Migrated 'IntegralLit' to 'L.H.S.Lit'.
* Migrated 'FractionalLit' to 'L.H.S.Lit'.
* Migrated 'StringLiteral' to 'L.H.S.Lit'.
* Added TTG extension points to the types above.
* Added nice export list to 'GHC.Hs.Lit'.
* Added 'rnOverLitVal' and 'tcOverLitVal' functions to 'GHC.Hs.Lit'.
* Moved [Notes] about 'SourceText' from 'L.H.S.*' to 'GHC.*'.
* Removed all references to 'SourceText' from 'L.H.S'.
Resolves issue #26953
- - - - -
91 changed files:
- compiler/GHC/Builtin/Names.hs
- compiler/GHC/Builtin/Utils.hs
- compiler/GHC/Hs/Binds.hs
- compiler/GHC/Hs/Decls.hs
- compiler/GHC/Hs/Expr.hs
- compiler/GHC/Hs/Instances.hs
- compiler/GHC/Hs/Lit.hs
- compiler/GHC/Hs/Utils.hs
- compiler/GHC/HsToCore/Expr.hs
- compiler/GHC/HsToCore/Match.hs
- compiler/GHC/HsToCore/Match/Literal.hs
- compiler/GHC/HsToCore/Pmc/Desugar.hs
- compiler/GHC/HsToCore/Pmc/Solver/Types.hs
- compiler/GHC/HsToCore/Quote.hs
- compiler/GHC/Iface/Syntax.hs
- compiler/GHC/Iface/Warnings.hs
- compiler/GHC/Parser.y
- compiler/GHC/Parser/HaddockLex.x
- compiler/GHC/Parser/Lexer.x
- compiler/GHC/Parser/PostProcess.hs
- compiler/GHC/Rename/Bind.hs
- compiler/GHC/Rename/Expr.hs
- compiler/GHC/Rename/Module.hs
- compiler/GHC/Rename/Names.hs
- compiler/GHC/Rename/Pat.hs
- compiler/GHC/Rename/Utils.hs
- compiler/GHC/Tc/Gen/App.hs
- compiler/GHC/Tc/Gen/Bind.hs
- compiler/GHC/Tc/Gen/Head.hs
- compiler/GHC/Tc/Gen/HsType.hs
- compiler/GHC/Tc/Utils/Instantiate.hs
- compiler/GHC/Tc/Utils/TcMType.hs
- compiler/GHC/ThToHs.hs
- compiler/GHC/Types/ForeignCall.hs
- compiler/GHC/Types/PkgQual.hs
- compiler/GHC/Types/SourceText.hs
- compiler/GHC/Unit/Module/Warnings.hs
- compiler/Language/Haskell/Syntax/Binds.hs
- compiler/Language/Haskell/Syntax/Binds/InlinePragma.hs
- compiler/Language/Haskell/Syntax/Decls.hs
- compiler/Language/Haskell/Syntax/Decls/Foreign.hs
- compiler/Language/Haskell/Syntax/Expr.hs
- compiler/Language/Haskell/Syntax/Extension.hs
- compiler/Language/Haskell/Syntax/Lit.hs
- + docs/users_guide/10.0.1-notes.rst
- docs/users_guide/exts/explicit_namespaces.rst
- docs/users_guide/ghci.rst
- ghc/GHCi/UI.hs
- hadrian/build-cabal
- libraries/base/src/Control/Arrow.hs
- libraries/base/src/System/IO.hs
- libraries/ghc-experimental/CHANGELOG.md
- libraries/ghc-experimental/src/GHC/Stack/Annotation/Experimental.hs
- + libraries/ghc-experimental/tests/Makefile
- + libraries/ghc-experimental/tests/all.T
- + libraries/ghc-experimental/tests/backtraces/Makefile
- + libraries/ghc-experimental/tests/backtraces/T26806a.hs
- + libraries/ghc-experimental/tests/backtraces/T26806a.stderr
- + libraries/ghc-experimental/tests/backtraces/T26806b.hs
- + libraries/ghc-experimental/tests/backtraces/T26806b.stderr
- + libraries/ghc-experimental/tests/backtraces/T26806c.hs
- + libraries/ghc-experimental/tests/backtraces/T26806c.stderr
- + libraries/ghc-experimental/tests/backtraces/all.T
- libraries/ghc-internal/src/GHC/Internal/Control/Arrow.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad/Fix.hs
- libraries/ghc-internal/src/GHC/Internal/Control/Monad/ST/Lazy/Imp.hs
- libraries/ghc-internal/src/GHC/Internal/Data/Functor/Identity.hs
- libraries/ghc-internal/src/GHC/Internal/Event/Windows/ManagedThreadPool.hs
- libraries/ghc-internal/src/GHC/Internal/RTS/Flags/Test.hsc
- libraries/ghc-internal/src/GHC/Internal/Stack/Annotation.hs
- libraries/ghc-internal/src/GHC/Internal/System/IO.hs
- libraries/ghc-internal/src/GHC/Internal/System/IO/OS.hs
- libraries/ghc-internal/src/GHC/Internal/TH/Monad.hs
- libraries/ghc-internal/tests/stack-annotation/ann_frame001.stdout
- libraries/ghc-internal/tests/stack-annotation/ann_frame002.stdout
- libraries/ghc-internal/tests/stack-annotation/ann_frame003.stdout
- libraries/ghc-internal/tests/stack-annotation/ann_frame004.stdout
- libraries/ghc-internal/tests/stack-annotation/ann_frame005.stdout
- testsuite/tests/ghci/scripts/ListTuplePunsPpr.stdout
- testsuite/tests/ghci/scripts/T10963.stderr
- testsuite/tests/ghci/scripts/T4175.stdout
- 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/interface-stability/ghc-experimental-exports.stdout
- testsuite/tests/interface-stability/ghc-experimental-exports.stdout-mingw32
- testsuite/tests/interface-stability/template-haskell-exports.stdout
- testsuite/tests/mdo/should_fail/mdofail006.stderr
- utils/check-exact/ExactPrint.hs
- utils/haddock/haddock-api/src/Haddock/Backends/Hyperlinker/Parser.hs
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/bebd1343d33b67816c3f8e9d059cf6…
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/bebd1343d33b67816c3f8e9d059cf6…
You're receiving this email because of your account on gitlab.haskell.org.
1
0