2011-06-15 55 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綁定包中有一個帶有工作代碼的示例目錄。