कार्यक्रम को चलाने के बिना बाधा प्राप्त करें

Dec 04 2020

मेरे पास एक पुस्तकालय है (स्रोत और संकलित दोनों के रूप में) और मैं एक कार्यक्रम लिख रहा हूं (इस पुस्तकालय से जुड़ा हुआ नहीं) जो यह जानना आवश्यक है कि पुस्तकालय में कुछ प्रकार उदात्त रूप से प्रतिलिपि योग्य हैं या नहीं।

मैं अपने प्रोग्राम को फाइल में निम्नलिखित लिख सकता हूँ। सीपीसी:

#include "mylibrary.hpp"
int main()
{
    std::cout << std::is_trivially_copyable<A>::value << '\n';
    std::cout << std::is_trivially_copyable<B>::value << '\n';
    std::cout << std::is_trivially_copyable<C>::value << '\n';
    std::cout << std::is_trivially_copyable<D>::value << '\n';
}

फिर इस कोड को संकलित करें और आउटपुट को पार्स करें। क्या यह जानकारी प्राप्त करने का एक बेहतर तरीका है? (प्रदर्शन महत्वपूर्ण है)। क्या लिबक्लैंग ऐसा कर सकता है?

टिप्पणियों के कारण अद्यतन करें:

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

इसलिए मेरे पास C ++ हैडर फ़ाइल का एक रास्ता है और मुझे यह जानना होगा कि क्या उस हेडर फ़ाइल में परिभाषित किया गया प्रकार तुच्छ रूप से प्रतिलिपि योग्य है। ऊपर काम करता है, लेकिन धीमी गति से है, क्योंकि इसमें फ़ाइल फ़ाइल संकलित करना शामिल है।

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

जवाब

2 ecatmur Dec 04 2020 at 04:56

आपको कोड संकलित करने की आवश्यकता है, कम से कम आईआर को। ऐसा इसलिए है क्योंकि C ++ वर्ग की तुच्छता एक मनमाने ढंग से जटिल संगणना पर निर्भर हो सकती है, जिसके इनपुट में प्लेटफॉर्म विशेषताएँ, उपलब्ध हेडर, प्रीप्रोसेसर डिफ्लेयर, कंपाइलर विकल्प आदि शामिल हो सकते हैं, जो कि केवल C ++ कंपाइलर द्वारा ही किए जा सकते हैं।

यदि आप एक बाइनरी के रूप में क्लैंग को आमंत्रित कर रहे हैं, clang -S -emit-llvmतो आईआर का उत्सर्जन करने का विकल्प है और फिर आप एलएलवीएम आईआर आउटपुट को पार्स करना चाहते हैं; उदाहरण के लिए

#include <type_traits>
struct A {};
struct B { B(B const&); };
struct C { ~C(); };
struct D { D(D const&) = default; };
int a = std::is_trivially_copyable<A>::value;
int b = std::is_trivially_copyable<B>::value;
int c = std::is_trivially_copyable<C>::value;
int d = std::is_trivially_copyable<D>::value;

उनका है:

@a = dso_local local_unnamed_addr global i32 1, align 4, !dbg !0
@b = dso_local local_unnamed_addr global i32 0, align 4, !dbg !6
@c = dso_local local_unnamed_addr global i32 0, align 4, !dbg !10
@d = dso_local local_unnamed_addr global i32 1, align 4, !dbg !12
 ^ variable name                             ^ initializer

यदि आप libclang का उपयोग करना चाहते हैं, तो आपको EmitLLVMOnlyAction को एक मॉड्यूल देने की आवश्यकता होगी जिसे आप तब GlobalVariable परिभाषाएँ निकाल सकते हैं। देखें: एलएलवीएम आईआर बनाने की विधि