Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解Haskell LLVM绑定中的CodeGen*_Haskell_Language Design_Llvm - Fatal编程技术网

了解Haskell LLVM绑定中的CodeGen*

了解Haskell LLVM绑定中的CodeGen*,haskell,language-design,llvm,Haskell,Language Design,Llvm,背景:我正在用Haskell编写一个玩具Lisp interperter/编译器,以供自己娱乐/启发。我正在尝试添加编译LLVM字节码的功能 上下文:我一直在阅读文档和代码示例(),试图理解Haskell LLVM绑定中使用的组合方式和抽象方式(如中所述)。有很多小部分,我不清楚它们是如何协同工作的。在基本的LLVM机器指令之上似乎有一个抽象层次,这对于有着丰富LLVM经验的人来说是显而易见的,但对于像我这样的刚刚起步的人来说,这并没有记录在案 > >什么是“代码>代码模块>代码> >代码>

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

上下文:我一直在阅读文档和代码示例(),试图理解Haskell LLVM绑定中使用的组合方式和抽象方式(如中所述)。有很多小部分,我不清楚它们是如何协同工作的。在基本的LLVM机器指令之上似乎有一个抽象层次,这对于有着丰富LLVM经验的人来说是显而易见的,但对于像我这样的刚刚起步的人来说,这并没有记录在案


<> > <强> >什么是“代码>代码模块>代码> >代码>代码函数>代码>它们是如何用来建立<代码>函数< /> >和>代码>模块< /C> >

< P> <代码>模块< /> >和代码>函数>代码>类型,它们只是指向相应C++对象指针的薄薄包装。(即,
模块*
值*
):

CodeGenModule
CodeGenFunction
类型是构建在
LLVM.FFI.
模块之上的EDSL的一部分。它们在内部使用
Function
Module
LLVM.FFI.
中的函数,并允许您使用do符号(示例取自):


我还建议您熟悉,因为它们也在Haskell API中显示出来。

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

-- 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
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
-- 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 ()