希望了解Haskell LLVM绑定中的CodeGen *

问题描述

|| 背景:我正在为自己的娱乐/娱乐活动在Haskell中编写一个玩具Lisp交互器/编译器。我正在尝试增加对LLVM字节码进行编译的功能。 上下文:我一直在阅读LLVM.Core文档和一个代码示例(此处),试图了解组合的手段和抽象的手段(如Abelson和Sussman的《结构与解释》中所述) 在Haskell LLVM绑定中使用。有很多小片段,我不清楚它们是如何协同工作的。似乎在基本的LLVM机器指令之上有一个抽象层次,这对于拥有LLVM丰富经验的人来说是显而易见的,但是对于像我这样刚站起来的人来说却没有记录。 问题:What0ѭ和
CodeGenFunction
是什么,以及它们如何用来构成
Functions
Modules
?     

解决方法

        
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
类型是在
LLVM.FFI.*
模块之上构建的EDSL的一部分。它们内部使用
Function
Module
和from11ѭ中的函数,并允许您使用do标记简洁地在Haskell中编写LLVM IR(示例摘自Lennart Augustsson的博客):
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
您可以将“ 0”视为表示已解析的LLVM程序集文件(“ 17”)的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 () 
我还建议您熟悉LLVM的核心类,因为它们也可以在Haskell API中显示出来。     ,        CodeGenFunction维护一个功能的LLVM汇编代码。 CodeGenModule维护一些此类功能。 在Haskell llvm绑定包中,有一个包含工作代码的示例目录。