Development Tip

#define 지시문을 통해 LLVM 및 해당 버전을 감지하는 방법은 무엇입니까?

yourdevel 2020. 11. 26. 19:56
반응형

#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 및 해당 버전을 감지하는 방법이 있습니까? 그리고 CLANG?


__llvm____clang__매크로는 각 옵션에 LLVM 컴파일러 (LLVM-GCC 또는 연타) 또는 그 소리를 확인하는 공식적인 방법이다.

__has_feature그리고 __has_builtin, 그들은 문서화되어 연타를 사용할 때 옵션 컴파일러 기능 검사의 권장되는 방법입니다 여기 .

다음을 사용하여 gcc, llvm-gcc 및 clang에 대한 내장 컴파일러 매크로 목록을 찾을 수 있습니다.

echo | clang -dM -E -

이것은 빈 문자열을 전처리하고 컴파일러가 정의한 모든 매크로를 뱉어냅니다.


여기에서 답을 찾을 수없고 답에 대한 링크 만 있으므로 완전성을 위해 여기에 답이 있습니다.

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

clang의 경우 버전 번호를 테스트해서는 안되며 기능 검사 매크로를 사용 하여 원하는 기능을 확인해야합니다 .


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과 clang의 버전을 얻을 수있는 방법을 찾지 못했습니다 ..


Pre-defined Compiler Macros 페이지를 살펴보고 Compilers-> Clang을 선택하십시오 . 표준, 컴파일러, 라이브러리, OS, 아키텍처 등에 대한 다른 많은 매크로에 대한 정보가 있습니다.


최선의 선택은 버전 매크로가 아닌 기능 매크로 를 사용하는 것임을 동의합니다 . 부스트를 사용한 예 :

#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 (:

But anyway, if you need compiler version, you can use 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;
}

Output examples:

Clang-30400000
Clang-50000000

Note that if you're using llvm to hack on bytecode, and thus #includeing llvm include files, you can check the macros in llvm/Config/llvm-config.h. And concretely:

/* 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"

참고URL : https://stackoverflow.com/questions/1617877/how-to-detect-llvm-and-its-version-through-define-directives

반응형