2011-02-27 8 views
22

मैं अपने सी कोड के लिए क्लैंग एएसटी का उपयोग करने और एएसटी पर कुछ विश्लेषण करने के लिए देख रहा हूं। कहां से शुरू करना है, इस बारे में कुछ पॉइंटर्स, क्लैंग के एएसटी, ट्यूटोरियल या इस संबंध में कुछ भी कैसे प्राप्त करें, बहुत मददगार होंगे !!!क्लैंग एएसटी का उपयोग कैसे करें?

मैं कुछ खोजने की कोशिश कर रहा हूं और मुझे यह link मिला जो 2 साल पहले बनाया गया था। लेकिन किसी कारण से, यह मेरे लिए काम नहीं कर रहा है। ट्यूटोरियल में नमूना कोड, मुझे बहुत सारी त्रुटियां देता है। तो मुझे यकीन नहीं है, अगर मैं कोड को सही तरीके से बनाता हूं या ट्यूटोरियल के साथ कुछ चीज गलत है। लेकिन मुझे किसी अन्य पेज से भी शुरुआत करने में खुशी होगी।

उत्तर

14
प्रारंभ ट्यूटोरियल sharth से जुड़े हुए साथ

। फिर क्लैंग के डॉक्सीजन से गुज़रें। SemaConsumer से शुरू करें।

बहुत सारे स्रोत कोड पढ़ें। क्लैंग एक चलती लक्ष्य है। यदि आप क्लैंग के आधार पर उपकरण लिख रहे हैं, तो आपको यह पहचानने की आवश्यकता है कि क्लैंग दैनिक सुविधाओं को जोड़ रहा है और ठीक कर रहा है, इसलिए आपको बहुत सारे कोड पढ़ने के लिए तैयार रहना चाहिए!

5

शायद यह उदाहरण मदद करेगा?

http://www.llvm.org/svn/llvm-project/cfe/trunk/examples/PrintFunctionNames/

+1

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

1

मुझे एएसटी बनाने के सबसे आसान तरीके के रूप में यह एस्टूनीट :: लोडफ्रॉम कॉम्पलर इनवोकेशन() एफएन लगता है।

इस लिंक से आपको कुछ विचार http://comments.gmane.org/gmane.comp.compilers.clang.devel/12471

9

आप शायद libclang पुस्तकालय में उपलब्ध कराई गई स्थिर सी एपीआई चाहते हैं, के रूप में अस्थिर सी ++ आंतरिक एपीआई है कि दूसरों का उल्लेख किया है करने के लिए विरोध दे सकता है।

वर्तमान में शुरू करने के लिए सबसे अच्छा प्रलेखन LLVM Developers Meeting website पर उपलब्ध "libclang: कंपाइलर से परे सोच" है।

हालांकि, ध्यान दें कि एपीआई की स्थिरता व्यापकता की लागत पर आती है। आप इस एपीआई के साथ सब कुछ करने में सक्षम नहीं होंगे, लेकिन इसका उपयोग करना बहुत आसान है।

0

एएसटी प्राप्त करने के साथ-साथ फ्रंटेंड के चरणों को जानने के लिए, "एलएलवीएम कोर पुस्तकालय" पुस्तक में एक अग्रभाग अध्याय है। मूल रूप से यह इस तरह के एक प्रवाह है (LLVM-4.0.1 के मामले में और बाद के संस्करणों के लिए समान होना चाहिए):

  • cc1_main.cpp:cc1_main (ExecuteCompilerInvocation)
  • CompilerInstance.cpp:CompilerInstance::ExecuteAction
  • ParseAST.cpp:clang::ParseAST (Consumer>HandleTranslationUnit(S.getASTContext())
  • CodeGenAction.cpp:HandleTranslationUnit

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

एएसटी में हेरफेर करने के तरीके के संदर्भ में, क्लैंग पर कुछ बुनियादी ट्यूटोरियल है: http://clang.llvm.org/docs/RAVFrontendAction.html

ASTDumper.cpp पर भी देखें। यह एएसटी का दौरा करने का सबसे अच्छा उदाहरण है।

एक और अच्छा ट्यूटोरियल: https://jonasdevlieghere.com/understanding-the-clang-ast/ आपको एएसटी में तीन अलग-अलग दृष्टिकोणों के माध्यम से एक विशिष्ट कॉल एक्सप्रप्रो कैसे ढूंढना सिखाता है।

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