2012-02-08 22 views
8

क्या उन कार्यों की सूची प्राप्त करने का कोई तरीका है जो कहीं भी इनलाइन नहीं हैं? या तो जीसीसी के लिए या बाइनरी का निरीक्षण करके एक विकल्प पारित करके?यह पता लगाने के लिए कि कौन से फ़ंक्शंस को रेखांकित नहीं किया गया था

संपादित करें: मुझे पता है कि जीसीसी की बिल्टिन विशेषता निनलाइन का उपयोग करके एक फ़ंक्शन के लिए स्पष्ट रूप से पूछना नहीं है।

उत्तर

3

जीसीसी के -fdump-tree-all का उपयोग करें और "इनलाइन" के लिए डंप फ़ाइलों को खोजें।

0

आप बाइनरी में प्रतीकों की सूची प्राप्त करने के लिए यूनिक्स/लिनक्स में nm command का उपयोग कर सकते हैं।
यदि फ़ंक्शन को रेखांकित नहीं किया गया है तो इसका प्रतीक नाम बाइनरी में मौजूद होगा।

+5

यह सही नहीं है। गैर स्थैतिक कार्यों को इस पर ध्यान दिए बिना छोड़ा जाएगा कि वे रेखांकित हैं या नहीं। – Mat

+0

@Mat, नहीं। सी ++ के लिए इनलाइनिंग मॉडल शायद थोड़ा अधिक जटिल है, लेकिन सी (सी 99 और सी 11) के लिए एक प्रतीक केवल एक अनुवाद इकाई में उत्सर्जित होता है जिसने प्रतीक के "तत्काल" का अनुरोध किया है, यानी सी के लिए जिसमें एक इनलाइन * परिभाषा है * और एक बाहरी घोषणा। –

+0

@ एएलएस, +1, लेकिन आप शायद थोड़ा और सटीक हो सकता है। एक प्रतीक नाम एक अनिर्धारित प्रतीक के रूप में या प्रतीक को परिभाषित करने के लिए उपस्थित हो सकता है। चाहे यह प्रतीक परिभाषित करता है या नहीं, तात्कालिकता मॉडल पर निर्भर करता है, मुझे लगता है कि वे अलग-अलग सी ++ कार्यान्वयन में काफी अलग हो सकते हैं (सी ++ के बारे में मेरा ज्ञान थोड़ा सा जंगली है) और सी –

0

'इनलाइन' फ़ंक्शन की विशेषता नहीं है, एक फ़ंक्शन दोनों रेखांकित और गैर-रेखांकित हो सकता है। जब आप कोई फ़ंक्शन कॉल करते हैं, तो संकलक यह तय करता है कि क्या इनलाइन हैं या नहीं, यदि एकाधिक कॉल हैं, तो कंपाइलर अलग-अलग कॉल के लिए अलग-अलग विकल्प चुन सकता है। यदि कम से कम एक गैर-रेखांकित कॉल है, तो फ़ंक्शन प्रतीक तालिका में दिखाई देगा। और यदि इसे निर्यात किया जाता है तो यह प्रतीक तालिका में भी दिखाई देगा।

इसलिए फ़ंक्शन को रेखांकित करने का कोई तरीका नहीं है या नहीं, आप केवल एक विशिष्ट कॉल को रेखांकित इंजीनियर द्वारा रेखांकित या नहीं देख सकते हैं।

+0

मैं समझता हूं कि इनलाइन "प्रति कॉल" है, मेरा सवाल यह है कि सभी कॉल कैसे रेखांकित नहीं हैं। –

+1

आप सिर्फ सवाल का जवाब नहीं देते हैं। –

5

अपने संकलक विकल्पों में -fdump-ipa-inline जोड़ें।

Grep फ़ाइल yoursourcefile.inline जो वस्तु फ़ाइल के आगे "इनलाइन उम्मीदवार को ध्यान में रखते" सभी कार्यों कि संकलक माना इनलाइनिंग पता लगाने के लिए के लिए बनाया जाता है।

संकलक अंततः इनलाइन में किए गए सभी कार्यों को खोजने के लिए "इनलाइन इन" के लिए फ़ाइल Grep।
"इनलाइन_फेल:" के लिए Grep यदि आप इस कारण के इच्छुक हैं कि संकलक ने उम्मीदवार को क्यों बंद कर दिया है (उदाहरण के लिए "कॉल की संभावना नहीं है और कोड आकार बढ़ेगा")।

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

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