सबसे पहले, एक गलत गलतफहमी को ठीक करने के लिए: एलएलवीएम आईआर प्रारूप में कोड में हेरफेर करने के लिए एक ढांचा है। दृष्टि में कोई एएसटी नहीं है (*) - आप आईआर पढ़ते हैं, ट्रांसफॉर्म/हेरफेर/इसका विश्लेषण करते हैं, और आप आईआर वापस लिखते हैं।
पढ़ना आईआर वास्तव में सरल है:
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;
यह है कि।
अब, आप आप आईआर कोड के लिए क्या करना चाहते हैं विशिष्ट संशोधनों के बारे में कोई विशिष्ट प्रश्न हैं, तो आप वास्तव में और अधिक ध्यान केंद्रित कुछ पूछना चाहिए। मुझे उम्मीद है कि यह जवाब आपको दिखाता है कि आईआर को कैसे पार्स करें और इसे वापस लिखें।
(*) आईआर में एलएलवीएम के अंदर एएसटी प्रतिनिधित्व नहीं है, क्योंकि यह एक साधारण असेंबली जैसी भाषा है। यदि आप सी या सी ++ में एक कदम ऊपर जाते हैं, तो आप एएसटी में पार्स करने के लिए क्लैंग का उपयोग कर सकते हैं और फिर एएसटी स्तर पर हेरफेर कर सकते हैं। क्लैंग तब जानता है कि एलएसवीएम आईआर को अपने एएसटी से कैसे उत्पादन किया जाए। हालांकि, आपको यहां सी/सी ++ से शुरुआत करना है, न कि एलएलवीएम आईआर। यदि एलएलवीएम आईआर आप की परवाह है, तो एएसटी के बारे में भूल जाओ।
स्रोत
2012-02-07 06:11:15
धन्यवाद एली। आपका जवाब बहुत उपयोगी था। – MetallicPriest
हेड्स, मुझे लगता है कि यह लोअरकेस पी के साथ "parseIRFile" होना चाहिए। http://llvm.org/docs/doxygen/html/IRReader_2IRReader_8h_source.html – user2027722
@ user2027722: हाँ, एलएलवीएम एपीआई इतनी बार बदलती है कि नमूने अद्यतित रखना चुनौतीपूर्ण है। मेरे पास इसके लिए एक गिथब रेपो है: https://github.com/eliben/llvm-clang-samples जो मैं जितना संभव हो सके सिंक किया जाता है, और यह यादृच्छिक SO उत्तर –