的Module
和Function
類型是圍繞指針只是薄包裝到相應的C++的對象(即,Module*
和Value*
):
-- LLVM.Core.Util
newtype Module = Module {
fromModule :: FFI.ModuleRef
}
deriving (Show, Typeable)
type Function a = Value (Ptr a)
newtype Value a = Value { unValue :: FFI.ValueRef }
deriving (Show, Typeable)
-- LLVM.FFI.Core
data Module
deriving (Typeable)
type ModuleRef = Ptr Module
data Value
deriving (Typeable)
type ValueRef = Ptr Value
的CodeGenModule
和CodeGenFunction
類型是建立在頂部的EDSL的部件LLVM.FFI.*
模塊。他們使用Function
,Module
和LLVM.FFI.*
內部的功能,讓你寫LLVM IR在Haskell簡明使用DO-符號(例如,從Lennart Augustsson's blog拍攝):
mFib :: CodeGenModule (Function (Word32 -> IO Word32))
mFib = do
fib <- newFunction ExternalLinkage
defineFunction fib $ \ arg -> do
-- Create the two basic blocks.
recurse <- newBasicBlock
exit <- newBasicBlock
[...]
ret r
return fib
你能想到的CodeGenModule
作爲AST代表解析LLVM彙編文件(.ll
)。給定CodeGenModule
,您可以其寫入.bc
文件:
-- newModule :: IO Module
mod <- newModule
-- defineModule :: Module -> CodeGenModule a -> IO a
defineModule mod $ do [...]
-- writeBitcodeToFile :: FilePath -> Module -> IO()
writeBitcodeToFile "mymodule.bc" mod
--- Alternatively, just use this function from LLVM.Util.File:
writeCodeGenModule :: FilePath -> CodeGenModule a -> IO()
我也建議你自己熟悉core classes of LLVM,因爲它們也Haskell的API中顯示出來。