gpt4 book ai didi

haskell - 了解 Haskell LLVM 绑定(bind)中的 CodeGen*

转载 作者:行者123 更新时间:2023-12-03 11:29:17 25 4
gpt4 key购买 nike

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

上下文:我一直在阅读 LLVM.Core 的文档和一个代码示例( here )试图理解 Haskell LLVM 绑定(bind)中使用的组合方式和抽象方式(如 Abelson and Sussman Structure and Interpretation of Computer Programs 中所述)。有很多小块,我不清楚它们是如何一起工作的。似乎在基本的 LLVM 机器指令之上有一个抽象级别,这对于具有丰富 LLVM 经验的人来说是显而易见的,但对于像我这样刚开始涉足的人来说,却没有记录。

问题:什么是CodeGenModuleCodeGenFunction以及它们是如何用来建立 FunctionsModules ?

最佳答案

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 的一部分。模块。他们使用 Function , Module以及来自 LLVM.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 中显示出来。

关于haskell - 了解 Haskell LLVM 绑定(bind)中的 CodeGen*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6362810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com