2013-07-11 3 views
10

से कॉल सी/सी ++ फ़ंक्शन मैं llvm सीख रहा हूं और मेरे पास एक विचार की अवधारणा का सबूत करना चाहता था।ExecutionEngine

असल में, मैं अपने कंपाइलर और मेरे रनटाइम को विभाजित करना चाहता हूं। कंपाइलर एक .bc देगा और रनटाइम इसे ParseBitcodeFile के माध्यम से लोड करेगा और इसे चलाने के लिए ExecutionEngine का उपयोग करेगा। यह हिस्सा काम कर रहा है।

अब, सिस्टम को आसानी से कॉल करने के लिए, मैं अपने रनटाइम सी/सी ++ फ़ंक्शंस में कार्यान्वित करने में सक्षम होना चाहता हूं जो सभी सिस्टम कॉल (फ़ाइल io, stdout प्रिंटिंग इत्यादि) करते हैं। मेरा सवाल यह है कि, मैं इन कार्यों को अपने खिलौने कंपाइलर से कोड से कैसे कॉल कर सकता हूं, जिसे एलएलवीएम द्वारा एक अलग चरण में संकलित किया गया है, और इसे निष्पादित होने पर उपयोग करने की अनुमति देता है।

उत्तर

9

अच्छी खबर: JIT ExecutionEngine का उपयोग करते समय, यह केवल काम करेगा। जब जेआईटी-एर को आईआर द्वारा उपयोग किया जाने वाला बाहरी प्रतीक मिलता है जो आईआर में स्वयं नहीं पाया जाता है, तो यह जेआईटी-आईएनजी प्रक्रिया में ही दिखता है, इसलिए आपके मेजबान कार्यक्रम से दिखाई देने वाले किसी भी प्रतीक को बुलाया जा सकता है।

यह part 4 of the LLVM tutorial में सीधे समझाया गया है:

वाह, कैसे JIT पाप और क्योंकि के बारे में पता है? जवाब आश्चर्यजनक रूप से सरल है: इस उदाहरण में, जेआईटी ने फ़ंक्शन का निष्पादन शुरू किया और फ़ंक्शन कॉल पर पहुंचा। यह एहसास हुआ कि समारोह था, अभी तक जेआईटी संकलित नहीं हुआ और दिनचर्या के मानक सेट को पर हल किया गया। इस मामले में, फ़ंक्शन के लिए कोई भी शरीर परिभाषित नहीं किया गया है, इसलिए जेआईटी ने कैलिडोस्कोप प्रक्रिया पर "dlsym (" sin ")" को कॉल करना समाप्त कर दिया। चूंकि "पाप" को जेआईटी के पता स्थान के भीतर परिभाषित किया गया है, इसलिए यह सीधे पाप के libm संस्करण को कॉल करने के लिए मॉड्यूल में कॉल को पैच करता है। DynamicLibrary के इसके उपयोग विशेष रूप से -

रक्तमय जानकारी के लिए lib/ExecutionEngine/JIT/JIT.cpp को देखो।

8

एली का जवाब बहुत अच्छा है और आपको इसे स्वीकार करना चाहिए। एक और विकल्प है, हालांकि, जो आपके रनटाइम की स्रोत फ़ाइलों को अलग-अलग एलएलवीएम मॉड्यूल (उदा। क्लैंग के साथ) में संकलित करना है और उन्हें जोड़ने के लिए ExecutionEngine::addModule() का उपयोग करना है।

यह कम सुविधाजनक है, और इसका मतलब है कि एक ही फाइल को दो बार संकलित करना (एक बार आपके होस्ट प्रोग्राम के लिए, दूसरा Module एस प्राप्त करने के लिए), लेकिन इसका फायदा यह है कि यह आपके JITted कोड से इनलाइनिंग और अन्य क्रॉस-फ़ंक्शन ऑप्टिमाइज़ेशन को सक्षम बनाता है ।

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

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