2012-01-20 25 views
5

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

foo = a && (b || c); 

की तरह कुछ हो जाएगा:

foo = EXPR_AND(a, EXPR_OR(b, c)); 

और इस तरह मैं है कि हो की स्थिति के सभी संयोजनों ट्रैक कर सकते हैं।

मुझे लगता है कि एक रिकर्सिवएस्टविजिटर का उपयोग करना सबसे अच्छा तरीका होगा, लेकिन क्या प्रत्येक नोड के लिए सी कोड आउटपुट करने का कोई आसान तरीका है?

इस तरह कुछ हासिल करने के लिए क्या देखना है इसके बारे में कोई सुझाव सबसे सराहना की जाएगी!

नोट: कुछ और जांच के बाद, मैंने अभी libclang की खोज की जो ऐसा लगता है कि यह मेरा सबसे अच्छा दोस्त हो सकता है। एक पुनरावर्तक के साथ मिलकर, मुझे बस वही चाहिए जो मुझे चाहिए। अच्छे उदाहरणों के लिए कोई संकेतक (मुझे बस उत्कृष्ट ऐप्पल डेवलपर्स को libclang पर वीडियो मिल रहा है) बहुत अच्छा होगा।

+0

आपका प्रस्तावित बहुत परिणत कोड के शब्दों में परिवर्तन 'अगर b' या' c' कोई साइड इफेक्ट होते हैं ... –

+0

वास्तव में, EXPR_AND और EXPR_OR मैक्रो विस्तार है कि कुछ इस तरह दिखाई हैं: #define EXPR_AND (ए, बी) (ए? instr [0] = 1: instr [1] = 1,0) && (बी? instr [2] = 0: instr [3] = 1,0) –

उत्तर

2

एक अच्छे उदाहरण के लिए this project देखें।

यह कॉल कॉल फ़ंक्शन में प्रवेश करने और बाहर निकलने के लिए क्लैंग का उपयोग करता है, और यह पास किए गए तर्कों के प्रकारों का भी निरीक्षण करता है।

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