2009-10-24 5 views
52

प्रश्न मुझे लगता है कि काफी स्पष्ट है। मैं एक कंपाइलर पहचान हेडर लिखने की कोशिश कर रहा हूं ताकि एप्लिकेशन जानकारी में शामिल हो सकें जिस पर संकलक का उपयोग किया गया था और कौन सा संस्करण।#define निर्देशों के माध्यम से LLVM और उसके संस्करण का पता कैसे लगाएं?

इस कोड मैं उपयोग कर रहा हूँ का हिस्सा है:

/* GNU C Compiler Detection */ 
#elif defined __GNUC__ 
    #ifdef __MINGW32__ 
     #define COMPILER "MinGW GCC %d.%d.%d" 
    #else 
     #define COMPILER "GCC %d.%d.%d" 
    #endif 
    #define COMP_VERSION __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__ 
#endif 

कौन इस तरह इस्तेमाल किया जा सकता:

printf(" Compiled using " COMPILER "\n", COMP_VERSION); 

वहाँ LLVM और उसके संस्करण का पता लगाने में कोई तरीका है? और क्लैंग?

+0

बड़ा सवाल, मैं नहीं किसी भी doco उस पर बिल्कुल भी –

+0

भी आप कभी-कभी, जानना चाहते हैं कि बजना के एकीकृत असेंबलर किया जा रहा है की जरूरत है पा सकते हैं। उपयोग का मामला आधुनिक जीसीसी है, और कंपाइलर एएएसएनआई, एवीएक्स, बीएमआई इत्यादि को इकट्ठा करने के लिए पुराने जीएएस की बजाय क्लैंग को असेंबलर के रूप में उपयोग करता है। आप इंटीग्रेटेड असेंबलर का उपयोग करते हैं क्योंकि ऐप्पल के एएस और एलडी फ्रंट द्वारा उत्पादित असेंबली का उपभोग करने के लिए बहुत पुराने हैं -ends। – jww

उत्तर

64

__llvm__ और __clang__ मैक्रोज़ क्रमश: एलएलवीएम कंपाइलर (llvm-gcc या clang) या clang की जांच करने का आधिकारिक तरीका है।

__has_feature और __has_builtin क्लैंग का उपयोग करते समय वैकल्पिक कंपाइलर सुविधाओं की जांच करने का अनुशंसित तरीका है, उन्हें here दस्तावेज किया गया है।

ध्यान दें कि आप उपयोग कर जीसीसी, LLVM-जीसीसी, और बजना के लिए निर्मित संकलक मैक्रो की एक सूची प्राप्त कर सकते हैं:

echo | clang -dM -E - 

यह कोई खाली स्ट्रिंग preprocesses और सभी मैक्रो संकलक द्वारा परिभाषित बाहर थूक।

+22

ध्यान दें कि '__GNUC__' को क्लैंग और llvm-gcc के लिए भी परिभाषित किया गया है। – pqnet

10

InitPreprocessor.cpp से स्निपेट:

// Compiler version introspection macros. 
    DefineBuiltinMacro(Buf, "__llvm__=1"); // LLVM Backend 
    DefineBuiltinMacro(Buf, "__clang__=1"); // Clang Frontend 

    // Currently claim to be compatible with GCC 4.2.1-5621. 
    DefineBuiltinMacro(Buf, "__GNUC_MINOR__=2"); 
    DefineBuiltinMacro(Buf, "__GNUC_PATCHLEVEL__=1"); 
    DefineBuiltinMacro(Buf, "__GNUC__=4"); 
    DefineBuiltinMacro(Buf, "__GXX_ABI_VERSION=1002"); 
    DefineBuiltinMacro(Buf, "__VERSION__=\"4.2.1 Compatible Clang Compiler\""); 

मैं LLVM और बजना ही है, हालांकि के संस्करण प्राप्त करने के लिए किसी भी तरह नहीं मिला ..

+0

मुझे लगता है कि अब किसी के लिए सुविधाओं के लिए समर्थित दावा किए गए जीसीसी संस्करण पर भरोसा किया जा सकता है, और –

21

बजना के लिए, आप उसकी संस्करण संख्या का परीक्षण नहीं करना चाहिए , आपको feature checking macros के साथ अपनी इच्छित सुविधाओं की जांच करनी चाहिए।

+1

एचएम एक्सटेंशन के लिए क्लैंग/एलएलवीएम, यह एक अच्छा बिंदु है। क्या आप इसके बारे में कुछ आधिकारिक सामग्री के लिए एक लिंक प्रदान कर सकते हैं? –

+1

@ मैट जॉइनर, मुझे लगता है, क्रिस खुद कुछ आधिकारिक है। अपने होमपेज से उद्धृत http://nondot.org/sabre/: "मैं एलएलवीएम कंपाइलर इंफ्रास्ट्रक्चर का प्राथमिक लेखक हूं"। – osgx

+2

@osgx: फिर भी वह लिंक प्रदान कर सकता है और अपनी परियोजना की प्रयोज्यता बढ़ाने के लिए दस्तावेज जोड़ सकता है। –

4

Pre-defined Compiler Macros page पर एक नज़र डालें, Compilers->Clang चुनें। मानकों, कंपाइलर्स, पुस्तकालयों, ओएस, आर्किटेक्चर आदि के लिए कई अन्य मैक्रोज़ पर जानकारी है।

+0

बहुत बढ़िया। बस मेरे बेकन को भी बचाओ :) –

30

मैं एक जवाब यहाँ नहीं मिल रहा है, केवल, जवाब के लिए लिंक तो संपूर्णता के लिए, यहाँ जवाब है:

__clang__    // set to 1 if compiler is clang 
__clang_major__  // integer: major marketing version number of clang 
__clang_minor__  // integer: minor marketing version number of clang 
__clang_patchlevel__ // integer: marketing patch level of clang 
__clang_version__  // string: full version number 

मैं वर्तमान में मिलती है:

__clang__=1 
__clang_major__=3 
__clang_minor__=2 
__clang_patchlevel__=0 
__clang_version__="3.2 (tags/RELEASE_32/final)" 
2

मैं मानता हूँ कि सबसे अच्छा विकल्प है का उपयोग करने के लिए मैक्रोज़ है, संस्करण मैक्रोज़ नहीं। boost साथ उदाहरण:

#include <boost/config.hpp> 

#if defined(BOOST_NO_CXX11_NOEXCEPT) 
#if defined(BOOST_MSVC) 
    #define MY_NOEXCEPT throw() 
#else 
    #define MY_NOEXCEPT 
#endif 
#else 
#define MY_NOEXCEPT noexcept 
#endif 

void my_noexcept_function() MY_NOEXCEPT; // it's example, use BOOST_NOEXCEPT (: 

लेकिन boost.predef वैसे भी, आप संकलक संस्करण जरूरत है, आप का उपयोग कर सकते हैं:

#include <iostream> 
#include <boost/predef.h> 

int main() { 
#if (BOOST_COMP_CLANG) 
    std::cout << BOOST_COMP_CLANG_NAME << "-" << BOOST_COMP_CLANG << std::endl; 
#else 
    std::cout << "Unknown compiler" << std::endl; 
#endif 
    return 0; 
} 

आउटपुट उदाहरण:

Clang-30400000 
Clang-50000000 
0

ध्यान दें कि अगर आप ' बाइटकोड पर हैक करने के लिए llvm का उपयोग कर रहे हैं, और इस प्रकार #include आईएनजी llvm फ़ाइलें शामिल हैं, आप ca n llvm/Config/llvm-config.h में मैक्रोज़ की जांच करें।और वस्तुतः:

/* Major version of the LLVM API */ 
#define LLVM_VERSION_MAJOR 3 

/* Minor version of the LLVM API */ 
#define LLVM_VERSION_MINOR 8 

/* Patch version of the LLVM API */ 
#define LLVM_VERSION_PATCH 0 

/* LLVM version string */ 
#define LLVM_VERSION_STRING "3.8.0" 
संबंधित मुद्दे