2011-06-23 8 views
7

पृष्ठभूमि: मैंने खिलौना लिस्प दुभाषिया लिखा है कि मैं एलएलवीएम जेआईटी कार्यक्षमता को जोड़ने की कोशिश कर रहा हूं। क्षण के लिए, निम्न सीमाओं लगाया हैएलएलवीएम (हैकेल बाइंडिंग) में एक फ़ंक्शन जोड़ना जब पैरामीटर की संख्या संकलन समय

  • केवल पूर्णांक मूल्यों कार्यों में अनुमति दी जाती
  • चर केवल औपचारिक पैरामीटर

को देखते हुए संदर्भ दे सकते हैं:

compile :: [Value] -- List of Formal Parameters 
     -> [Value] -- Body of function 
     -> CodeGenModule(Function a)` 

प्रश्न: मैं एक फ़ंक्शन कैसे उत्पन्न करूं जहां पी की संख्या arameters औपचारिक पैरामीटर्स सूची की लंबाई के बराबर है?

+0

एक अच्छी शुरुआत या तो मुझे समझने में मदद कर सकती है 'fall f g r। FunctionArgs f g (CodeGenFunction r()) ' –

+0

क्या आप एलएलवीएम के हैकेल बाइंडिंग का उपयोग करने का अनुभव साझा करना चाहते हैं? आप किस संस्करण का उपयोग करते हैं? :) – Nybble

+0

@Wu: एलएलवीएम 2.9 [729514 प्रतिबद्ध] से llvm बाध्यकारी के साथ (https://github.com/bos/llvm/commit/72951414d7b7b377ee1a040fae2b043b7747ceff)। [यह भी देखें] (http://stackoverflow.com/questions/6406067/haskell-llvm- बाइंडिंग- लिंकर- आतंक) –

उत्तर

6

मैं अगर यह LLVM.Core से सिर्फ EDSL के साथ ऐसा करना (प्रकार वास्तव में बहुत बालों कर रहे हैं) संभव है पता नहीं है, लेकिन अगर आप LLVM.FFI.Core देखेंगे, तो आपको manipulating LLVM function types और creating LLVM functions के लिए निचले स्तर कार्यक्षमता मिल जाएगा । यह क्रिया के निम्नलिखित योजना की ओर जाता है:

  • functionType के साथ अपने समारोह के लिए एक TypeRef बनाएँ।
  • addFunction का उपयोग करके इस फ़ंक्शन को अपने मॉड्यूल में जोड़ें।
  • appendBasicBlock/insertBasicBlock का उपयोग करके इसे मूलभूत ब्लॉक के साथ पॉप्युलेट करें। अपने मूल ब्लॉक के अंदर फ़ंक्शन तर्कों के संदर्भ में getParam का उपयोग करें।

बुनियादी ब्लॉक बनाने के लिए अच्छा monadic ईडीएसएल वाक्यविन्यास का उपयोग करना संभव होना चाहिए। इसके अलावा, LLVM.Core.Util देखें, इसमें एफएफआई परत के साथ काम करने के लिए कुछ सहायक कार्य शामिल हैं।

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

  • कोई संबंधित समस्या नहीं^_^