2012-02-06 14 views
11

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

हालांकि मुझे आईआर कोड को पढ़ने और संशोधित करने की आवश्यकता है, लेकिन अगर कोई मुझे कुछ उदाहरण प्रदान कर सकता है या मुझे संदर्भित कर सकता है तो मुझे बहुत सराहना होगी जो इसे पढ़ता है (पार्स)।

उत्तर

24

सबसे पहले, एक गलत गलतफहमी को ठीक करने के लिए: एलएलवीएम आईआर प्रारूप में कोड में हेरफेर करने के लिए एक ढांचा है। दृष्टि में कोई एएसटी नहीं है (*) - आप आईआर पढ़ते हैं, ट्रांसफॉर्म/हेरफेर/इसका विश्लेषण करते हैं, और आप आईआर वापस लिखते हैं।

पढ़ना आईआर वास्तव में सरल है:

int main(int argc, char** argv) 
{ 
    if (argc < 2) { 
     errs() << "Expected an argument - IR file name\n"; 
     exit(1); 
    } 

    LLVMContext &Context = getGlobalContext(); 
    SMDiagnostic Err; 
    Module *Mod = ParseIRFile(argv[1], Err, Context); 

    if (!Mod) { 
     Err.print(argv[0], errs()); 
     return 1; 
    } 

    [...] 
    } 

इस कोड को एक फ़ाइल नाम स्वीकार करता है। यह एक एलएलवीएम आईआर फ़ाइल (पाठ) होना चाहिए। इसके बाद यह Module में पार्स करने के लिए चला जाता है, जो एलएलवीएम के आंतरिक इन-मेमोरी प्रारूप में आईआर के मॉड्यूल का प्रतिनिधित्व करता है। इसके बाद एलएलवीएम के विभिन्न पासों के साथ छेड़छाड़ की जा सकती है या आप स्वयं को जोड़ सकते हैं। एलएलवीएम कोड बेस (जैसे lib/Transforms/Hello/Hello.cpp) में कुछ उदाहरणों पर नज़र डालें और इसे पढ़ें - http://llvm.org/docs/WritingAnLLVMPass.html

आईआर को एक फ़ाइल में वापस थूकना भी आसान है। Module वर्ग सिर्फ एक धारा में ही लिखते हैं:

some_stream << *Mod; 

यह है कि।

अब, आप आप आईआर कोड के लिए क्या करना चाहते हैं विशिष्ट संशोधनों के बारे में कोई विशिष्ट प्रश्न हैं, तो आप वास्तव में और अधिक ध्यान केंद्रित कुछ पूछना चाहिए। मुझे उम्मीद है कि यह जवाब आपको दिखाता है कि आईआर को कैसे पार्स करें और इसे वापस लिखें।


(*) आईआर में एलएलवीएम के अंदर एएसटी प्रतिनिधित्व नहीं है, क्योंकि यह एक साधारण असेंबली जैसी भाषा है। यदि आप सी या सी ++ में एक कदम ऊपर जाते हैं, तो आप एएसटी में पार्स करने के लिए क्लैंग का उपयोग कर सकते हैं और फिर एएसटी स्तर पर हेरफेर कर सकते हैं। क्लैंग तब जानता है कि एलएसवीएम आईआर को अपने एएसटी से कैसे उत्पादन किया जाए। हालांकि, आपको यहां सी/सी ++ से शुरुआत करना है, न कि एलएलवीएम आईआर। यदि एलएलवीएम आईआर आप की परवाह है, तो एएसटी के बारे में भूल जाओ।

+0

धन्यवाद एली। आपका जवाब बहुत उपयोगी था। – MetallicPriest

+0

हेड्स, मुझे लगता है कि यह लोअरकेस पी के साथ "parseIRFile" होना चाहिए। http://llvm.org/docs/doxygen/html/IRReader_2IRReader_8h_source.html – user2027722

+0

@ user2027722: हाँ, एलएलवीएम एपीआई इतनी बार बदलती है कि नमूने अद्यतित रखना चुनौतीपूर्ण है। मेरे पास इसके लिए एक गिथब रेपो है: https://github.com/eliben/llvm-clang-samples जो मैं जितना संभव हो सके सिंक किया जाता है, और यह यादृच्छिक SO उत्तर –

1

ऐसा करने का सबसे आसान तरीका मौजूदा उपकरणों में से एक को देखना और इससे कोड चोरी करना है। इस मामले में, आप llc के स्रोत को देखना चाहेंगे। यह इनपुट के रूप में या तो बिटकोड या .ll फ़ाइल ले सकता है। आप इनपुट फ़ाइल को किसी भी तरह से संशोधित कर सकते हैं और फिर यदि आप टेक्स्ट फ़ाइल चाहते हैं तो llvm-dis में कोड के समान कुछ फ़ाइल का उपयोग करके फ़ाइल लिखें।

2

यह आमतौर पर एलएलवीएम पास/ट्रांसफॉर्म को लागू करके किया जाता है। इस तरह आपको आईआर को बिल्कुल पार्स करने की ज़रूरत नहीं है क्योंकि एलएलवीएम आपके लिए यह करेगा और आप आईआर के ओओ-ओरिएंटेड इन-मेमोरी प्रस्तुति पर काम करेंगे।

This एलएलवीएम पास लिखने के लिए प्रवेश बिंदु है। फिर आप एलएलवीएम के साथ बंडल किए गए पहले से लागू मानक पासों में से किसी एक को देख सकते हैं (lib/Transforms देखें)।

+0

यही वह होगा जो मैं अंततः करूँगा। लेकिन इस पल में, क्योंकि मैं सीखने के चरण में हूं, मैं पाठ फ़ाइलों में आईआर देखने में सक्षम होना चाहता हूं। – MetallicPriest

+3

मुझे समस्या नहीं दिखाई दे रही है। अधिकांश एलएलवीएम उपकरण आईआर के पाठपरक प्रतिनिधित्व को पढ़/लिख सकते हैं। विशेष रूप से, पाठपरक प्रतिनिधित्व को उत्सर्जित करने के लिए, -एस स्विच को अपनी कमांड लाइन में जोड़ें। (साथ ही, हमेशा याद रखें कि द्विआधारी और पाठपरक प्रतिनिधित्व बिल्कुल समकक्ष हैं)। – CAFxX

1

ऑप्ट टूल llvm आईआर कोड लेता है, उस पर एक पास चलाता है, और फिर दूसरी तरफ परिवर्तित एलवीएम आईआर बाहर थूकता है।

हैकिंग शुरू करने के लिए सबसे आसान lib \ Transforms \ Hello \ Hello.cpp है। इसे हैक करें, अपनी स्रोत फ़ाइल के साथ इनपुट के रूप में ऑप्ट आउट करें, आउटपुट का निरीक्षण करें।

इसके अलावा, लेखन के लिए दस्तावेज़ वास्तव में काफी अच्छे हैं।

1

जैसा ऊपर बताया गया है कि यह पास लिखने का सबसे अच्छा तरीका है। लेकिन अगर आप निर्देशों के माध्यम से बस पुन: प्रयास करना चाहते हैं और एलएलवीएम के साथ कुछ करना चाहते हैं तो एक इंस्टीविजिटर क्लास प्रदान करें। यह एक वर्ग है जो निर्देशों के लिए आगंतुक पैटर्न लागू करता है। यह उपयोगकर्ता के लिए बहुत सीधी अग्रेषित है, इसलिए यदि आप पास को कार्यान्वित करने के तरीके सीखने से बचना चाहते हैं, तो आप इसका सहारा ले सकते हैं।

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