2014-11-03 4 views
13

मुझे बताया गया था कि क्लैंग एक ड्राइवर है जो प्री-प्रोसेसिंग, संकलन और लिंकेज काम करने के लिए जीसीसी की तरह काम करता है। संकलन और जुड़ाव के दौरान, जहां तक ​​मुझे पता है, यह वास्तव में llvm है जो अनुकूलन करता है ("-O1", "-O2", "-O3", "-Os", "-flto")।क्लैंग सी/सी ++ कोड अनुकूलन को चलाने में सक्षम कैसे है?

लेकिन मैं सिर्फ नहीं समझ सकता कैसे LLVM शामिल है।

ऐसा लगता है कि स्रोत कोड संकलन भी एक स्थिर पुस्तकालय ऐसे libLLVMCore.a के रूप में, बजाय डेबियन बजना पैकेज के लिए की जरूरत नहीं है libllvm-3.4 नामक एक और पैकेज पर निर्भर करता है (बजना संस्करण 3.4 है) है, जो libLLVM-3.4.so(.1) होता है, करता है बजना उपयोग इस शेयर की गई लाइब्रेरी अनुकूलन के लिए?

मैं थोड़ी देर के लिए बजना स्रोत कोड की जाँच की है और पाया कि include/clang/Driver/Options.td संबंधित विकल्पों में शामिल है, लेकिन दुर्भाग्य से मैं स्रोत फ़ाइलों को खोजने के लिए कि शामिल कि फाइल में विफल रहा है, इसलिए मैं अभी भी तंत्र के बारे में पता नहीं कर रहा हूँ।

मुझे उम्मीद है कि कोई मुझे कुछ संकेत दे सकता है।

+1

यह अभी तक एक और XY समस्या हो सकती है। यदि आपको इस प्रश्न का उत्तर मिलता है तो आप किस समस्या का समाधान करना चाहते हैं? – MSalters

+0

@MSalters मैं बस यह जानना चाहता हूं कि क्लेंग ऑप्टिमाइज़ेशन कार्य करने के लिए llvm कैसे चला सकता है। मैं एक प्रोजेक्ट पर काम कर रहा हूं जो * लगता है * दोनों क्लैंग सैनिटाइजर और एलवीएम आईआर पास विश्लेषण की आवश्यकता है, इसलिए मैं यह जानना चाहता हूं कि क्लैंग कैसे काम करता है। असल में हम एक (बहुत हल्का) ड्राइवर लागू करना चाहते हैं जो क्लैंग की तरह काम करता है लेकिन एंड-टू-एंड कोड भेद्यता जांच पर लक्ष्य करता है। –

+0

ठीक है, मैं पहले से ही महसूस कर रहा था कि कहीं वास्तविक समस्या थी। क्या आप एलएलवीएम के लिए लक्षित भाषा विवरण लिखने और उससे संकलित करने से बेहतर नहीं होंगे? एलएलवीएम कंपाइलर x86 या एआरएम को लक्षित करने के लिए प्रतिबंधित नहीं है, यह विस्तार योग्य है। परिभाषित उपयुक्त लक्ष्य भाषा के साथ, आपकी कमजोरियां अंतिम आउटपुट में खड़ी होंगी। – MSalters

उत्तर

18

(टी एल; DontWannaRead - इस उत्तर के अंत तक छोड़)

अपने सवाल का जवाब देने को ठीक से आप के बीच के अंतर को समझने के लिए पहले की जरूरत एक संकलक के front-end और back-end (विशेष रूप से पहले एक)।

क्लैंग एक कंपाइलर फ्रंट-एंड (http://en.wikipedia.org/wiki/Clang) सी, सी ++, उद्देश्य सी और उद्देश्य सी ++ भाषाओं के लिए है।

enter image description here

यानी C++ स्रोत कोड (या सी, या उद्देश्य सी, आदि ..) अनुवाद LLVM IR करने के लिए, क्या करना चाहिए इस बात का एक शाब्दिक निचले स्तर प्रतिनिधित्व:

बजना का कर्तव्य निम्नलिखित है कोड करो ऐसा करने के लिए क्लैंग कई उप-मॉड्यूल का उपयोग करता है जिनके वर्णन आप किसी भी सभ्य कंपाइलर निर्माण पुस्तक में पा सकते हैं: लेक्सर, पार्सर + एक अर्थशास्त्री विश्लेषक (सेमा), आदि।

LLVM पुस्तकालयों जिसका प्राथमिक कार्य का एक सेट है निम्नलिखित है: ++ समारोह लगता है हम निम्नलिखित सी के LLVM आईआर प्रतिनिधित्व

int double_this_number(int num) { 
    int result = 0; 
    result = num; 
    result = result * 2; 
    return result; 
} 

LLVM के मुख्य गुजरता चाहिए अनुकूलन LLVM आईआर कोड:

enter image description here

क्या अनुकूलित LLVM आईआर कोड के साथ क्या करना पूरी तरह से आप पर निर्भर है: आप x86_64 executab इसका अनुवाद कर सकते हैं ले कोड या इसे संशोधित करें और फिर इसे एआरएम निष्पादन योग्य कोड या जीपीयू निष्पादन योग्य कोड के रूप में थूक दें। यह आपकी परियोजना के लक्ष्य पर निर्भर करता है।

शब्द "बैक-एंड" अक्सर भ्रमित होता है क्योंकि कई कागजात हैं जो एलएलवीएम पुस्तकालयों को एक कंपाइलर श्रृंखला में "मध्य अंत" परिभाषित करते हैं और अंतिम पीढ़ी के रूप में "बैक एंड" को परिभाषित करते हैं जो कोड जनरेशन करता है (एलएलवीएम आईआर निष्पादन योग्य कोड या कुछ और जो अब संकलक द्वारा प्रसंस्करण की आवश्यकता नहीं है)। अन्य स्रोत क्लैंग के पीछे के अंत के रूप में एलएलवीएम को संदर्भित करते हैं। किसी भी तरह से, उनकी भूमिका स्पष्ट है और वे एक शक्तिशाली तंत्र प्रदान करते हैं: जो भी भाषा आप लक्षित कर रहे हैं (सी ++, सी, उद्देश्य सी, पायथन, आदि ..) यदि आपके पास फ्रंट-एंड है जो इसे एलएलवीएम आईआर में अनुवाद करता है, तो आप इसे अनुकूलित करने के लिए एलएलवीएम पुस्तकालयों के एक ही सेट का उपयोग कर सकते हैं और, जब तक आपके लक्षित आर्किटेक्चर के लिए बैक-एंड हो, आप अनुकूलित निष्पादन योग्य कोड उत्पन्न कर सकते हैं।

को याद करते हुए कि LLVM पुस्तकालयों का एक सेट है (न सिर्फ अनुकूलन गुजरता लेकिन यह भी data structures, उपयोगिता मॉड्यूल, नैदानिक ​​मॉड्यूल, आदि ..), बजना भी कई LLVM पुस्तकालयों अपने सामने न खत्म होने वाली प्रक्रिया के दौरान लाभ उठाता है। आप वास्तव में प्रत्येक एलएलवीएम मॉड्यूल को क्लैंग से दूर नहीं कर सकते क्योंकि बाद वाले सेट को पूर्व सेट पर बनाया गया है।

क्लैंग को "संकलन चालक" कहा जाता है, इस कारण से: क्लैंग कमांड लाइन पैरामीटर (विवरण और कई घोषणाएं TableGen 'डी की व्याख्या करने का प्रबंधन करती हैं और उन्हें एक साधारण grep से तैरने की आवश्यकता हो सकती है सूत्र), तय करता है कि Jobs और चरणों को निष्पादित किया जाना है, वांछित/संभावित अनुकूलन और परिवर्तन स्तर के अनुसार CodeGenOptions सेट करें और उपयुक्त मॉड्यूल (clangCodeGenBackendUtil.cpp में आमंत्रित करता है जो ऑप्टिमाइज़ेशन के साथ मॉड्यूल पास मैनेजर को पॉप्युलेट करता है आवेदन करें) और उपकरण (जैसे विंडोज ld लिंकर)। यह संकलन प्रक्रिया को बहुत शुरुआत से अंत तक चलाता है।

अंत में मैं पढ़ बजना और LLVM प्रलेखन सुझाव है, वे बहुत अर्थप्रकाशक हैं और अपने सवालों के अधिकांश पहली जगह में वहाँ एक जवाब के लिए दिखना चाहिए।

+1

मुझे लगता है कि मेरा प्रश्न कुछ हद तक संदिग्ध है, लेकिन आप मुझे इतना अच्छा * जवाब देते हैं कि मुझे आईआर पीढ़ी में गहराई से कैसे जाना है, खासतौर से पिछले तीन अनुच्छेदों के लिए; आपको बहुत - बहुत धन्यवाद! –

+2

बीटीडब्ल्यू, क्या आप बता सकते हैं कि चित्र उत्पन्न करने के लिए टूल क्या है? –

+0

@ हांगक्सुचेन मैंने प्रकाशक का उपयोग किया –

9

यह बिल्कुल जीसीसी की तरह नहीं है, इसलिए दो सटीक मिलान करने की कोशिश करने में बहुत अधिक समय व्यतीत न करें।

एलएलवीएम कंपाइलर एक विशिष्ट भाषा, एलएलवीएम के लिए एक कंपाइलर है। क्लेंग क्या अनुकूलन के बिना, एलएलवीएम को सी ++ कोड संकलित करता है। क्लैंग फिर एलएलवीएम संकलक को संकलित करने के लिए एलएमवीएम कोड को अनुकूलित असेंबली के लिए बुला सकता है।

+1

मुझे पता है कि वे हैं बिल्कुल वही नहीं, लेकिन मुझे आशा है कि * कैसे * क्लैंग ऑप्टिमाइज़ेशन कार्य करने के लिए एलएलएमएम कंपाइलर का आह्वान करें * के बारे में * अधिक जानकारी प्राप्त करने की उम्मीद है। –

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