llvm

2012-11-19 9 views
17

के साथ मशीन कोड कैसे उत्पन्न करें मैं वर्तमान में llvm का उपयोग कर एक कंपाइलर प्रोजेक्ट पर काम कर रहा हूं। मैंने उस बिंदु पर विभिन्न ट्यूटोरियल्स का पालन किया है जहां मेरे पास सिंटैक्स पेड़ बनाने के लिए एक पार्सर है और फिर पेड़ प्रदान किए गए आईआरबिल्डर का उपयोग करके एक एलएलएमएम मॉड्यूल में परिवर्तित हो जाता है।llvm

मेरा लक्ष्य निष्पादन योग्य बनाना है, और मैं उलझन में हूं कि आगे क्या करना है। मैंने पाया है कि सभी ट्यूटोरियल सिर्फ llvm मॉड्यूल बनाते हैं और Module.dump() का उपयोग करके असेंबली प्रिंट करते हैं। इसके अतिरिक्त, एकमात्र दस्तावेज जो मैं पा सकता हूं वह एलएलवीएम डेवलपर्स के लिए है, और परियोजना के उपयोगकर्ताओं को समाप्त नहीं करता है।

यदि मैं मशीन कोड जेनरेट करना चाहता हूं, तो अगले चरण क्या हैं? Llvm-mc प्रोजेक्ट ऐसा लगता है कि यह वही कर सकता है जो मैं चाहता हूं, लेकिन मुझे इस पर कोई भी दस्तावेज नहीं मिल रहा है।

शायद मैं llvm ऐसा कुछ करने की उम्मीद कर रहा हूं जो ऐसा नहीं करता है। मेरी उम्मीद है कि मैं एक मॉड्यूल बना सकता हूं, फिर एक एपीआई होगा जिसे मैं मॉड्यूल के साथ कॉल कर सकता हूं और एक लक्ष्य ट्रिपल और ऑब्जेक्ट फ़ाइल का उत्पादन किया जाएगा। मुझे एक जेआईटी बनाने पर दस्तावेज और उदाहरण मिल गए हैं, और मुझे इसमें रूचि नहीं है। मैं संकलित बाइनरी का उत्पादन कैसे कर रहा हूं।

मैं ओएस एक्स पर काम कर रहा हूं, अगर इसका कोई प्रभाव पड़ता है।

उत्तर

13

अपने आईआर से एक लिंक करने योग्य ऑब्जेक्ट फ़ाइल को उत्सर्जित करने के लिए llc -filetype=obj का उपयोग करें। आप एलएलवीएम एपीआई कॉल को देखने के लिए llc के कोड को देख सकते हैं जो इस तरह के कोड को उत्सर्जित करता है। कम से कम मैक ओएस एक्स और लिनक्स के लिए, इस तरह से उत्सर्जित वस्तुएं बहुत अच्छी होनी चाहिए (यानी यह अब तक "अल्फा गुणवत्ता" विकल्प नहीं है)।

एलएलवीएम में एक लिंकर (अभी तक!) नहीं है, हालांकि। इसलिए वास्तव में इस ऑब्जेक्ट फ़ाइल को कुछ निष्पादन योग्य या साझा लाइब्रेरी में लिंक करने के लिए, आपको सिस्टम लिंकर का उपयोग करने की आवश्यकता होगी। ध्यान दें कि यहां तक ​​कि यदि आपके पास एक ऑब्जेक्ट फ़ाइल है जिसमें एक ऑब्जेक्ट फ़ाइल शामिल है, तो बाद वाले को किसी भी तरह से लिंक करना होगा। एलएलवीएम समुदाय में डेवलपर एलएलवीएम के लिए एक वास्तविक लिंकर पर काम कर रहे हैं, जिसे lld कहा जाता है। आप its page पर जा सकते हैं या इसकी प्रगति का पालन करने के लिए मेलिंग सूची अभिलेखागार खोज सकते हैं।

14

जैसा कि आप the llc guide पर पढ़ सकते हैं, यह वास्तव में केवल असेंबली उत्पन्न करने का इरादा है, और फिर "असेंबली भाषा आउटपुट को मूल देशी असेंबलर और लिंकर के माध्यम से देशी निष्पादन योग्य उत्पन्न करने के लिए पारित किया जा सकता है" - उदा। gnu assembler (as) और लिंकर (ld)।

तो यहां मुख्य उत्तर को जोड़ने और जोड़ने के लिए मूल उपकरण का उपयोग करना है।

हालांकि, वहाँ एक आईआर फ़ाइल से सीधे देशी वस्तु पैदा करने के लिए प्रयोगात्मक समर्थन है, llc के माध्यम से:

-filetype  - Choose a file type (not all types are supported by all targets): 
    =asm   - Emit an assembly ('.s') file 
    =obj   - Emit a native object ('.o') file [experimental] 

या आप llvm-mc का उपयोग .s फ़ाइल से यह इकट्ठा करने के लिए कर सकते हैं:

-filetype  - Choose an output file type: 
    =asm   - Emit an assembly ('.s') file 
    =null  - Don't emit anything (for timing purposes) 
    =obj   - Emit a native object ('.o') file 

हालांकि, मुझे लिंकर्स के बारे में पता नहीं है।

इसके अलावा, मैं tools/bugpoint/ToolRunner.h फ़ाइल की जांच करने की अनुशंसा करता हूं, जो llc और प्लेटफ़ॉर्म के मूल सी टूलचेन को मशीन कोड उत्पन्न करने के लिए एक रैपर का खुलासा करता है। इसके शीर्षलेख टिप्पणी से:

यह फ़ाइल सी प्लेटफार्म सी कंपाइलर के चारों ओर एक अमूर्तता का खुलासा करती है, जो सी और असेंबली कोड को संकलित करने के लिए उपयोग की जाती है।

1

उदाहरण BrainF कार्यक्रम चलाने के लिए, यह संकलन और चलाएँ:

echo ,. > test.bf 
./BrainF test.bf -o test.bc 
llc -filetype=obj test.bc 
gcc test.o -o a.out 
./a.out 

तो टाइप एक भी पत्र और Enter दबाएं। यह आपको उस पत्र को वापस गूंजना चाहिए। (यही ,. करता है।)

उपर्युक्त एलएलवीएम संस्करण 3.5.0 के साथ परीक्षण किया गया था।

4

llvm-c/TargetMachine.h में बाहर इन कार्यों की जांच:

/** Emits an asm or object file for the given module to the filename. This 
    wraps several c++ only classes (among them a file stream). Returns any 
    error in ErrorMessage. Use LLVMDisposeMessage to dispose the message. */ 
LLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M, 
    char *Filename, LLVMCodeGenFileType codegen, char **ErrorMessage); 

/** Compile the LLVM IR stored in \p M and store the result in \p OutMemBuf. */ 
LLVMBool LLVMTargetMachineEmitToMemoryBuffer(LLVMTargetMachineRef T, LLVMModuleRef M, 
    LLVMCodeGenFileType codegen, char** ErrorMessage, LLVMMemoryBufferRef *OutMemBuf); 
संबंधित मुद्दे