module LLVM.Internal.CommandLine where

import LLVM.Prelude

import Control.Monad.AnyCont
import Control.Monad.IO.Class

import Foreign.Ptr

import qualified LLVM.Internal.FFI.CommandLine as FFI

import LLVM.Internal.Coding
import LLVM.Internal.String ()

-- | <http://llvm.org/doxygen/namespacellvm_1_1cl.html#a992a39dae9eb8d4e54ffee5467902803>
-- Sadly, there is occasionally some configuration one would like to control
-- in LLVM which are accessible only as command line flags setting global state,
-- as if the command line tools were the only use of LLVM. Very sad.
parseCommandLineOptions :: [ShortByteString] -> Maybe ShortByteString -> IO ()
parseCommandLineOptions :: [ShortByteString] -> Maybe ShortByteString -> IO ()
parseCommandLineOptions args :: [ShortByteString]
args overview :: Maybe ShortByteString
overview = (AnyContT IO () -> (() -> IO ()) -> IO ())
-> (() -> IO ()) -> AnyContT IO () -> IO ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip AnyContT IO () -> (() -> IO ()) -> IO ()
forall (m :: * -> *) a. AnyContT m a -> forall r. (a -> m r) -> m r
runAnyContT () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return (AnyContT IO () -> IO ()) -> AnyContT IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
  (CUInt, Ptr (Ptr CChar))
args <- [ShortByteString] -> AnyContT IO (CUInt, Ptr (Ptr CChar))
forall (e :: * -> *) h c. EncodeM e h c => h -> e c
encodeM [ShortByteString]
args
  Ptr CChar
overview <- AnyContT IO (Ptr CChar)
-> (ShortByteString -> AnyContT IO (Ptr CChar))
-> Maybe ShortByteString
-> AnyContT IO (Ptr CChar)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Ptr CChar -> AnyContT IO (Ptr CChar)
forall (m :: * -> *) a. Monad m => a -> m a
return Ptr CChar
forall a. Ptr a
nullPtr) ShortByteString -> AnyContT IO (Ptr CChar)
forall (e :: * -> *) h c. EncodeM e h c => h -> e c
encodeM Maybe ShortByteString
overview
  IO () -> AnyContT IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> AnyContT IO ()) -> IO () -> AnyContT IO ()
forall a b. (a -> b) -> a -> b
$ (CUInt, Ptr (Ptr CChar)) -> Ptr CChar -> IO ()
FFI.parseCommandLineOptions (CUInt, Ptr (Ptr CChar))
args Ptr CChar
overview