2011-06-15 38 views
22

背景:我正在为Haskell编写一个玩具Lisp插入器/编译器用于我自己的娱乐/教育。我正在尝试添加编译为LLVM字节码的功能。朝着理解CodeGen *的Haskell LLVM绑定

上下文:我已阅读LLVM.Core试图理解在Haskell的LLVM使用组合的装置和抽象(如在Abelson and Sussman Structure and Interpretation of Computer Programs说明。)的装置的文件和一个代码示例(here)绑定。有很多小件,我不清楚它们是如何一起工作的。看起来像LLVM机器指令之上的抽象层次似乎对于LLVM有很多经验的人来说是显而易见的,但对于像我这样刚刚开始行动的人来说没有记录。

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

回答

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类型是建立在顶部的EDSL的部件LLVM.FFI.*模块。他们使用FunctionModuleLLVM.FFI.*内部的功能,让你写LLVM IR在Haskell简明使用DO-符号(例如,从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作为AST代表解析LLVM汇编文件(.ll)。给定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中显示出来。

0

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