如何通过#define指令检测LLVM及其版本?(How to detect LLVM and it

2019-08-31 23:41发布

现在的问题是很清楚,我认为。 我试图写一个编译器探测头能在其上使用的编译器和版本的应用程序信息包括。

这是我使用的代码的一部分:

/* 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及其版本? 和CLANG?

Answer 1:

__llvm____clang__宏,分别检查了LLVM编译器(LLVM-GCC或铛)或铛的正式方法。

__has_feature__has_builtin使用铛当可选的编译器功能检查的推荐方式,它们都记录在这里 。

需要注意的是,你可以找到内置的编译器宏GCC,LLVM-GCC,以及使用铿锵的列表:

echo | clang -dM -E -

这预处理一个空字符串,并吐出了由编译器定义的所有宏。



Answer 2:

我不能在这里找到答案,只是链接到的答案,所以对于完整,这里是答案:

__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)"


Answer 3:

对于铛,你不应该测试它的版本号,你应该检查你想要的功能与特征对照宏 。



Answer 4:

从片断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和铛本身的版本,虽然..



Answer 5:

看看在预定义的编译器宏页面 ,选择Compilers->锵 。 还有许多其他的宏标准,编译器,库,操作系统,架构和详细信息。



Answer 6:

我认为,最好的选择是使用具有功能 macroses,不是版本macroses。 例如与提升 :

#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


Answer 7:

请注意,如果你使用LLVM搞出字节码,这样#include ING LLVM包括文件,你可以检查宏在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"


文章来源: How to detect LLVM and its version through #define directives?