2013-02-15 55 views
8

मैं क्लैंग के साथ अंतर-प्रक्रियात्मक डेटा-प्रवाह विश्लेषण कर रहा हूं। वर्तमान में मैं स्रोत फ़ाइलों को पार्स करने और एएसटी आगंतुक को कॉल करने के लिए libtooling का उपयोग कर रहा हूँ। प्रश्न यह है कि मैं कई .c फ़ाइलों के लिए एक एकल एएसटी कैसे बना सकता हूं?एएसटी कई स्रोत फ़ाइलों के लिए क्लैंग

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

एक बहुत ही समान विकल्प ASTImportAction था, लेकिन यह मेरे लिए बिल्कुल स्पष्ट नहीं है कि इस मामले में कमांड लाइन पैरामीटर क्लैंगटूल को पास किया जाना चाहिए।

तीसरा विकल्प प्रत्येक .c फ़ाइल के लिए ASTUnits बनाने और उनमें से प्रत्येक में परिभाषाओं को देखने के लिए था, यह स्पष्ट नहीं है कि उपयोगकर्ता-परिभाषित प्रकारों के बीच पत्राचार कैसे प्राप्त करें, उदा। रिकॉर्ड। एएसटीआईपोर्ट में वे IsStructurallyEquivalent() फ़ंक्शन का उपयोग करते हैं लेकिन इसे अज्ञात नेमस्पेस में घोषित किया गया है, इसलिए मैं केवल इस प्रोग्राम को अपने प्रोग्राम में कॉपी कर सकता हूं। और फिर यह सभी एएसटी नोड्स का समर्थन नहीं करता है।

इंटरनेट से यह लिंक http://lists.cs.uiuc.edu/pipermail/cfe-dev/2012-August/023865.html सबसे उपयुक्त लगता है लेकिन मेरे लिए समाधान का तकनीकी विवरण स्पष्ट नहीं है।

कोई सुझाव स्वागत है। बहुत धन्यवाद।

+1

आप कई फाइलों के लिए "एक" एएसटी क्यों तैयार करना चाहते हैं? आप बस प्रत्येक फ़ाइल के लिए एक एएसटी क्यों संभाल नहीं सकते? –

+1

मेरी इच्छा है कि किसी के पास इसका जवाब हो: \ मैं अभी वही काम करने की कोशिश कर रहा हूं। –

उत्तर

0

मैं कुछ ऐसा करने की कोशिश कर रहा था। हालांकि मैंने एक एएसटी बनाने की कोशिश नहीं की थी। मैं कई एएसटी पार्स कर रहा था और अपने कार्यों को मैप करने की कोशिश कर रहा था। मैं फ़ंक्शन कॉल प्राप्त करने के लिए एएसटी मैचर्स का उपयोग कर रहा हूं और फिर उन्हें अन्य एएसटी में जांच रहा हूं।

मैं स्रोत फ़ाइल सूची प्रदान करने के लिए compile_commands.json फ़ाइल का उपयोग कर रहा हूं। OptionsParser.getCompilations()। GetAllFiles() compile_commands.json में निर्दिष्ट सभी स्रोत फ़ाइलों को प्राप्त कर सकते हैं।

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

ऐसा करने का अधिक इष्टतम तरीका हो सकता है। अगर कुछ इसके बारे में जानते हैं तो कृपया इसे इंगित करें।