2011-06-15 9 views
22

पृष्ठभूमि: मैं अपने स्वयं के मनोरंजन/संपादन के लिए हास्केल में खिलौना लिस्प इंटरपरेटर/कंपाइलर लिख रहा हूं। मैं एलएलवीएम बाइटकोड को संकलित करने की क्षमता जोड़ने की कोशिश कर रहा हूं।हास्केल एलएलवीएम बाइंडिंग में कोडजेन * को समझने के लिए

प्रसंग: मैं LLVM.Core के लिए दस्तावेज और एक कोड उदाहरण (here) संयोजन की साधन और अमूर्त (। Abelson and Sussman Structure and Interpretation of Computer Programs में वर्णित है) के साधन हास्केल LLVM में इस्तेमाल को समझने का प्रयास पढ रहा हूं बाइंडिंग। बहुत सारे छोटे टुकड़े हैं और मैं स्पष्ट नहीं हूं कि वे एक साथ काम करने का इरादा रखते हैं। ऐसा लगता है कि बुनियादी एलएलवीएम मशीन निर्देशों के ऊपर अमूर्तता का एक स्तर है जो एलएलवीएम के साथ बहुत से अनुभव वाले किसी व्यक्ति के लिए स्पष्ट है, लेकिन मेरे लिए उन लोगों के लिए दस्तावेज नहीं है, जो सिर्फ अपने पैरों को गीला कर रहे हैं।

प्रश्न:CodeGenModule और CodeGenFunction क्या हैं और कैसे वे Functions और Modules का निर्माण करने के लिए इस्तेमाल कर रहे हैं?

उत्तर

16

Module और Function प्रकार (अर्थात, 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 प्रकार के ऊपर एक बने EDSL के हिस्से हैं LLVM.FFI.* मॉड्यूल। वे Function, Module और LLVM.FFI.* आंतरिक रूप से कार्यों का उपयोग और आप हास्केल में LLVM आईआर लिखने के लिए संक्षेप में कर-अंकन (उदाहरण के 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 के बारे में सोच सकते हैं कि एक एएसटी प्रतिनिधित्व के रूप में एक पार्स एलएलवीएम असेंबली फ़ाइल (.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 के साथ खुद को परिचित कराने के लिए, क्योंकि वे भी हास्केल एपीआई में के माध्यम से दिखाने की सलाह देते हैं।

0

कोडजेनफंक्शन एक समारोह के लिए एलएलवीएम असेंबली कोड बनाए रखता है। CodeGenModule ऐसे कई कार्यों को बनाए रखता है। हास्केल llvm बाइंडिंग पैकेज में वर्किंग कोड के साथ एक उदाहरण निर्देशिका है।

संबंधित मुद्दे