在Haskell LLVM绑定中理解CodeGen *

时间:2011-06-15 18:56:00

标签: haskell language-design llvm

背景:我正在Haskell写一个玩具Lisp interperter /编译器,供我自己娱乐/启发。我正在尝试添加编译为LLVM字节码的功能。

上下文:我一直在阅读LLVM.Core的文档和一个代码示例(here),试图了解组合方式抽象方法(如Abelson and Sussman Structure and Interpretation of Computer Programs中所述。)在Haskell LLVM绑定中使用。有很多小件,我不清楚他们打算如何合作。看起来基本的LLVM机器指令之上有一定程度的抽象,这对于那些有很多LLVM经验的人来说是显而易见的,但对于那些像我这样只是沾沾自喜的人来说并没有记录。

问题:什么是CodeGenModuleCodeGenFunction以及它们如何用于构建FunctionsModules

2 个答案:

答案 0 :(得分:16)

ModuleFunction类型只是指向相应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

CodeGenModuleCodeGenFunction类型是构建在LLVM.FFI.*模块之上的EDSL的一部分。他们在内部使用FunctionModuleLLVM.FFI.*中的函数,并允许您使用do-notation简单地在Haskell中编写LLVM IR(示例来自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视为代表已解析的LLVM程序集文件(.ll)的AST。给定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中显示出来。

答案 1 :(得分:0)

CodeGenFunction维护一个函数的LLVM汇编代码。 CodeGenModule维护了几个这样的功能。 在Haskell llvm绑定包中,有一个带有工作代码的示例目录。