(टी एल; DontWannaRead - इस उत्तर के अंत तक छोड़)
अपने सवाल का जवाब देने को ठीक से आप के बीच के अंतर को समझने के लिए पहले की जरूरत एक संकलक के front-end और back-end (विशेष रूप से पहले एक)।
क्लैंग एक कंपाइलर फ्रंट-एंड (http://en.wikipedia.org/wiki/Clang) सी, सी ++, उद्देश्य सी और उद्देश्य सी ++ भाषाओं के लिए है।
यानी C++ स्रोत कोड (या सी, या उद्देश्य सी, आदि ..) अनुवाद LLVM IR करने के लिए, क्या करना चाहिए इस बात का एक शाब्दिक निचले स्तर प्रतिनिधित्व:
बजना का कर्तव्य निम्नलिखित है कोड करो ऐसा करने के लिए क्लैंग कई उप-मॉड्यूल का उपयोग करता है जिनके वर्णन आप किसी भी सभ्य कंपाइलर निर्माण पुस्तक में पा सकते हैं: लेक्सर, पार्सर + एक अर्थशास्त्री विश्लेषक (सेमा), आदि।
LLVM पुस्तकालयों जिसका प्राथमिक कार्य का एक सेट है निम्नलिखित है: ++ समारोह लगता है हम निम्नलिखित सी के LLVM आईआर प्रतिनिधित्व
int double_this_number(int num) {
int result = 0;
result = num;
result = result * 2;
return result;
}
LLVM के मुख्य गुजरता चाहिए अनुकूलन LLVM आईआर कोड:
क्या अनुकूलित LLVM आईआर कोड के साथ क्या करना पूरी तरह से आप पर निर्भर है: आप x86_64 executab इसका अनुवाद कर सकते हैं ले कोड या इसे संशोधित करें और फिर इसे एआरएम निष्पादन योग्य कोड या जीपीयू निष्पादन योग्य कोड के रूप में थूक दें। यह आपकी परियोजना के लक्ष्य पर निर्भर करता है।
शब्द "बैक-एंड" अक्सर भ्रमित होता है क्योंकि कई कागजात हैं जो एलएलवीएम पुस्तकालयों को एक कंपाइलर श्रृंखला में "मध्य अंत" परिभाषित करते हैं और अंतिम पीढ़ी के रूप में "बैक एंड" को परिभाषित करते हैं जो कोड जनरेशन करता है (एलएलवीएम आईआर निष्पादन योग्य कोड या कुछ और जो अब संकलक द्वारा प्रसंस्करण की आवश्यकता नहीं है)। अन्य स्रोत क्लैंग के पीछे के अंत के रूप में एलएलवीएम को संदर्भित करते हैं। किसी भी तरह से, उनकी भूमिका स्पष्ट है और वे एक शक्तिशाली तंत्र प्रदान करते हैं: जो भी भाषा आप लक्षित कर रहे हैं (सी ++, सी, उद्देश्य सी, पायथन, आदि ..) यदि आपके पास फ्रंट-एंड है जो इसे एलएलवीएम आईआर में अनुवाद करता है, तो आप इसे अनुकूलित करने के लिए एलएलवीएम पुस्तकालयों के एक ही सेट का उपयोग कर सकते हैं और, जब तक आपके लक्षित आर्किटेक्चर के लिए बैक-एंड हो, आप अनुकूलित निष्पादन योग्य कोड उत्पन्न कर सकते हैं।
को याद करते हुए कि LLVM पुस्तकालयों का एक सेट है (न सिर्फ अनुकूलन गुजरता लेकिन यह भी data structures, उपयोगिता मॉड्यूल, नैदानिक मॉड्यूल, आदि ..), बजना भी कई LLVM पुस्तकालयों अपने सामने न खत्म होने वाली प्रक्रिया के दौरान लाभ उठाता है। आप वास्तव में प्रत्येक एलएलवीएम मॉड्यूल को क्लैंग से दूर नहीं कर सकते क्योंकि बाद वाले सेट को पूर्व सेट पर बनाया गया है।
क्लैंग को "संकलन चालक" कहा जाता है, इस कारण से: क्लैंग कमांड लाइन पैरामीटर (विवरण और कई घोषणाएं TableGen 'डी की व्याख्या करने का प्रबंधन करती हैं और उन्हें एक साधारण grep से तैरने की आवश्यकता हो सकती है सूत्र), तय करता है कि Jobs
और चरणों को निष्पादित किया जाना है, वांछित/संभावित अनुकूलन और परिवर्तन स्तर के अनुसार CodeGenOptions
सेट करें और उपयुक्त मॉड्यूल (clangCodeGen
BackendUtil.cpp
में आमंत्रित करता है जो ऑप्टिमाइज़ेशन के साथ मॉड्यूल पास मैनेजर को पॉप्युलेट करता है आवेदन करें) और उपकरण (जैसे विंडोज ld
लिंकर)। यह संकलन प्रक्रिया को बहुत शुरुआत से अंत तक चलाता है।
अंत में मैं पढ़ बजना और LLVM प्रलेखन सुझाव है, वे बहुत अर्थप्रकाशक हैं और अपने सवालों के अधिकांश पहली जगह में वहाँ एक जवाब के लिए दिखना चाहिए।
यह अभी तक एक और XY समस्या हो सकती है। यदि आपको इस प्रश्न का उत्तर मिलता है तो आप किस समस्या का समाधान करना चाहते हैं? – MSalters
@MSalters मैं बस यह जानना चाहता हूं कि क्लेंग ऑप्टिमाइज़ेशन कार्य करने के लिए llvm कैसे चला सकता है। मैं एक प्रोजेक्ट पर काम कर रहा हूं जो * लगता है * दोनों क्लैंग सैनिटाइजर और एलवीएम आईआर पास विश्लेषण की आवश्यकता है, इसलिए मैं यह जानना चाहता हूं कि क्लैंग कैसे काम करता है। असल में हम एक (बहुत हल्का) ड्राइवर लागू करना चाहते हैं जो क्लैंग की तरह काम करता है लेकिन एंड-टू-एंड कोड भेद्यता जांच पर लक्ष्य करता है। –
ठीक है, मैं पहले से ही महसूस कर रहा था कि कहीं वास्तविक समस्या थी। क्या आप एलएलवीएम के लिए लक्षित भाषा विवरण लिखने और उससे संकलित करने से बेहतर नहीं होंगे? एलएलवीएम कंपाइलर x86 या एआरएम को लक्षित करने के लिए प्रतिबंधित नहीं है, यह विस्तार योग्य है। परिभाषित उपयुक्त लक्ष्य भाषा के साथ, आपकी कमजोरियां अंतिम आउटपुट में खड़ी होंगी। – MSalters