如何解决希望了解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绑定包中,有一个包含工作代码的示例目录。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。