#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__ // 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)"
그__llvm__
그리고.__clang__
매크로는 LLVM 컴파일러(llvm-gcc 또는 clang) 또는 clang을 각각 확인하는 공식 방법입니다.
__has_feature
그리고.__has_builtin
는 clang을 사용할 때 옵션 컴파일러 기능을 확인하는 권장 방법입니다.이것에 대해서는, 여기를 참조해 주세요.
gcc, llvm-gcc 및 clang용 내장 컴파일러 매크로 목록은 다음 명령을 사용하여 확인할 수 있습니다.
echo | clang -dM -E -
그러면 빈 문자열이 처리되어 컴파일러에 의해 정의된 모든 매크로가 출력됩니다.
llvm을 사용하여 바이트 코드를 해킹하는 경우#include
inglvm include files, 에서 매크로를 확인할 수 있습니다.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"
사전 정의된 컴파일러 매크로 페이지를 보고 컴파일러 -> Clang 을 선택합니다.표준, 컴파일러, 라이브러리, OS, 아키텍처 등의 다른 매크로에 대한 정보가 많이 있습니다.
clang의 경우 버전 번호를 테스트하지 말고 기능 확인 매크로를 사용하여 원하는 기능을 확인해야 합니다.
버전 매크로가 아닌 기능 매크로를 사용하는 것이 최선의 선택이라는 것에 동의합니다.부스트의 예:
#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
// 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 버전을 가져와 그 자체를 쾅하는 방법은 찾지 못했습니다.
올바른 일이라고 대답한 모든 사용자는 다음과 같은 기능 검출 매크로를 사용하는 것입니다.__has_feature
,__has_builtin
등입니다.사용 사례에 이것이 가능하다면 그렇게 해야 합니다.
단, 확인하려는 내용에 대해 특정 내용이 표시되지 않을 수 있습니다.예를 들어 특정 SSE/AVX 또는 NEON 기능을 사용할 수 있는지 여부를 확인할 수 있는 방법은 없습니다(또한 CPU가 지원하는 명령은 고정되어 있지만 API의 구멍을 막기 위해 기존 명령을 사용하는 새로운 기능이 추가되는 경우도 있습니다).또는 버그가 발생하여 쨍그랑 소리가 잘못된 기계 코드를 생성했을 수도 있습니다.실제로 SIMDe 프로젝트에서는 이러한 유형의 문제에 자주 부딪힙니다.
수 .__clang_major__
/__clang_minor__
/__clang_patchlevel__
벤더는 을 가져와서 으로는 Apple의 "clang"도 됩니다.또한 일반적으로 버전 번호가 바뀌면__clang_*__
컴파일러 버전과 일치하는 버전입니다.업스트림의 clang 버전이 아닙니다.예를 들어 Apple clang 4.0은 실제로는 리패키지된 clang 3.1이지만__clang_major__
와 4로__clang_minor__
0
제가 찾은 최고의 솔루션은 기능 검출 코드를 사용하여 전혀 관련이 없는 기능을 검출하는 것입니다.이 기능은 실제로 검출하고 싶은 버전과 같은 버전에 추가되어 있습니다.이 모든 논리를 한 곳에 보관하기 위해 오늘 아침 헤더를 조립했습니다.SIMDe의 일부이지만 종속성이 없으며 퍼블릭 도메인(CC0)입니다.향후의 개선으로 이 답변을 갱신하는 것을 잊어버릴 수 있으므로, 현재의 버전의 레포에 대해 확인해 주세요.하지만, 이것은 다음과 같습니다.
#if !defined(SIMDE_DETECT_CLANG_H)
#define SIMDE_DETECT_CLANG_H 1
#if defined(__clang__) && !defined(SIMDE_DETECT_CLANG_VERSION)
# if __has_warning("-Wimplicit-const-int-float-conversion")
# define SIMDE_DETECT_CLANG_VERSION 110000
# elif __has_warning("-Wmisleading-indentation")
# define SIMDE_DETECT_CLANG_VERSION 100000
# elif defined(__FILE_NAME__)
# define SIMDE_DETECT_CLANG_VERSION 90000
# elif __has_warning("-Wextra-semi-stmt") || __has_builtin(__builtin_rotateleft32)
# define SIMDE_DETECT_CLANG_VERSION 80000
# elif __has_warning("-Wc++98-compat-extra-semi")
# define SIMDE_DETECT_CLANG_VERSION 70000
# elif __has_warning("-Wpragma-pack")
# define SIMDE_DETECT_CLANG_VERSION 60000
# elif __has_warning("-Wasm-ignored-qualifier")
# define SIMDE_DETECT_CLANG_VERSION 50000
# elif __has_attribute(diagnose_if)
# define SIMDE_DETECT_CLANG_VERSION 40000
# elif __has_warning("-Wcomma")
# define SIMDE_DETECT_CLANG_VERSION 30900
# elif __has_warning("-Wmicrosoft")
# define SIMDE_DETECT_CLANG_VERSION 30800
# else
# define SIMDE_DETECT_CLANG_VERSION 1
# endif
#endif /* defined(__clang__) && !defined(SIMDE_DETECT_CLANG_VERSION) */
#if defined(SIMDE_DETECT_CLANG_VERSION)
# define SIMDE_DETECT_CLANG_VERSION_CHECK(major, minor, revision) (SIMDE_DETECT_CLANG_VERSION >= ((major * 10000) + (minor * 1000) + (revision)))
# define SIMDE_DETECT_CLANG_VERSION_NOT(major, minor, revision) SIMDE_DETECT_CLANG_VERSION_CHECK(major, minor, revision)
#else
# define SIMDE_DETECT_CLANG_VERSION_CHECK(major, minor, revision) (0)
# define SIMDE_DETECT_CLANG_VERSION_NOT(major, minor, revision) (1)
#endif
#endif /* !defined(SIMDE_DETECT_CLANG_H) */
언급URL : https://stackoverflow.com/questions/1617877/how-to-detect-llvm-and-its-version-through-define-directives
'programing' 카테고리의 다른 글
Java에서 & & &의 차이점은 무엇입니까? (0) | 2022.05.31 |
---|---|
npm 설치 미달 의존 관계 (0) | 2022.05.31 |
Vuejs에서 vuex Store로 데이터를 전달하는 방법 (0) | 2022.05.31 |
Larabel 5 - 조건부로 변수 추가 (0) | 2022.05.31 |
maven에서 Java 버전 지정 - 속성과 컴파일러 플러그인의 차이점 (0) | 2022.05.31 |