#Define 지시문을 통해 LLVM 및 해당 버전을 감지하는 방법은 무엇입니까?
-
06-07-2019 - |
문제
질문은 내가 생각합니다. 컴파일러 감지 헤더를 작성하여 사용 된 컴파일러 및 버전에 대한 응용 프로그램 정보에 포함시킬 수 있습니다.
이것은 내가 사용하는 코드의 일부입니다.
/* 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 또는 Clang) 또는 Clang을 확인하는 공식적인 방법입니다.
__has_feature
그리고 __has_builtin
Clang을 사용할 때 옵션 컴파일러 기능을 확인하는 권장 방법은 문서화됩니다. 여기.
다음을 사용하여 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 자체의 버전을 얻을 방법을 찾지 못했습니다.
살펴보십시오 사전 정의 된 컴파일러 매크로 페이지, 고르다 컴파일러-> 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 (:
그러나 어쨌든 필요하다면 컴파일러 버전, 당신이 사용할 수있는 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
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"