-- | Effect analysis.
--
-- See <https://github.com/WebAssembly/binaryen/blob/master/src/binaryen-c.h>
-- for API documentation.
--
-- This module is intended to be imported qualified.

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Binaryen.SideEffects where

import Binaryen.Expression
import Binaryen.Features
import Data.Word (Word32)
import Foreign (Storable)

newtype SideEffects = SideEffects Word32
  deriving (SideEffects -> SideEffects -> Bool
(SideEffects -> SideEffects -> Bool)
-> (SideEffects -> SideEffects -> Bool) -> Eq SideEffects
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SideEffects -> SideEffects -> Bool
$c/= :: SideEffects -> SideEffects -> Bool
== :: SideEffects -> SideEffects -> Bool
$c== :: SideEffects -> SideEffects -> Bool
Eq, Int -> SideEffects -> ShowS
[SideEffects] -> ShowS
SideEffects -> String
(Int -> SideEffects -> ShowS)
-> (SideEffects -> String)
-> ([SideEffects] -> ShowS)
-> Show SideEffects
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SideEffects] -> ShowS
$cshowList :: [SideEffects] -> ShowS
show :: SideEffects -> String
$cshow :: SideEffects -> String
showsPrec :: Int -> SideEffects -> ShowS
$cshowsPrec :: Int -> SideEffects -> ShowS
Show, Ptr b -> Int -> IO SideEffects
Ptr b -> Int -> SideEffects -> IO ()
Ptr SideEffects -> IO SideEffects
Ptr SideEffects -> Int -> IO SideEffects
Ptr SideEffects -> Int -> SideEffects -> IO ()
Ptr SideEffects -> SideEffects -> IO ()
SideEffects -> Int
(SideEffects -> Int)
-> (SideEffects -> Int)
-> (Ptr SideEffects -> Int -> IO SideEffects)
-> (Ptr SideEffects -> Int -> SideEffects -> IO ())
-> (forall b. Ptr b -> Int -> IO SideEffects)
-> (forall b. Ptr b -> Int -> SideEffects -> IO ())
-> (Ptr SideEffects -> IO SideEffects)
-> (Ptr SideEffects -> SideEffects -> IO ())
-> Storable SideEffects
forall b. Ptr b -> Int -> IO SideEffects
forall b. Ptr b -> Int -> SideEffects -> IO ()
forall a.
(a -> Int)
-> (a -> Int)
-> (Ptr a -> Int -> IO a)
-> (Ptr a -> Int -> a -> IO ())
-> (forall b. Ptr b -> Int -> IO a)
-> (forall b. Ptr b -> Int -> a -> IO ())
-> (Ptr a -> IO a)
-> (Ptr a -> a -> IO ())
-> Storable a
poke :: Ptr SideEffects -> SideEffects -> IO ()
$cpoke :: Ptr SideEffects -> SideEffects -> IO ()
peek :: Ptr SideEffects -> IO SideEffects
$cpeek :: Ptr SideEffects -> IO SideEffects
pokeByteOff :: Ptr b -> Int -> SideEffects -> IO ()
$cpokeByteOff :: forall b. Ptr b -> Int -> SideEffects -> IO ()
peekByteOff :: Ptr b -> Int -> IO SideEffects
$cpeekByteOff :: forall b. Ptr b -> Int -> IO SideEffects
pokeElemOff :: Ptr SideEffects -> Int -> SideEffects -> IO ()
$cpokeElemOff :: Ptr SideEffects -> Int -> SideEffects -> IO ()
peekElemOff :: Ptr SideEffects -> Int -> IO SideEffects
$cpeekElemOff :: Ptr SideEffects -> Int -> IO SideEffects
alignment :: SideEffects -> Int
$calignment :: SideEffects -> Int
sizeOf :: SideEffects -> Int
$csizeOf :: SideEffects -> Int
Storable)

foreign import ccall unsafe "BinaryenSideEffectNone" none :: SideEffects
foreign import ccall unsafe "BinaryenSideEffectBranches" branches :: SideEffects
foreign import ccall unsafe "BinaryenSideEffectCalls" calls :: SideEffects
foreign import ccall unsafe "BinaryenSideEffectReadsLocal" readsLocal :: SideEffects
foreign import ccall unsafe "BinaryenSideEffectWritesLocal" writesLocal :: SideEffects
foreign import ccall unsafe "BinaryenSideEffectReadsGlobal" readsGlobal :: SideEffects
foreign import ccall unsafe "BinaryenSideEffectWritesGlobal" writesGlobal :: SideEffects
foreign import ccall unsafe "BinaryenSideEffectReadsMemory" readsMemory :: SideEffects
foreign import ccall unsafe "BinaryenSideEffectWritesMemory" writesMemory :: SideEffects
foreign import ccall unsafe "BinaryenSideEffectImplicitTrap" implicitTrap :: SideEffects
foreign import ccall unsafe "BinaryenSideEffectIsAtomic" isAtomic :: SideEffects
foreign import ccall unsafe "BinaryenSideEffectThrows" throws :: SideEffects
foreign import ccall unsafe "BinaryenSideEffectAny" any :: SideEffects

foreign import ccall unsafe "BinaryenExpressionGetSideEffects"
  getSideEffects ::
    Expression -> Features -> IO SideEffects