#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、アーキテクチャなどの多くの他のマクロに関する情報があります。
最良の選択は、バージョンマクロではなく、機能を持つマクロを使用することです。 boost :<の例/ p>
#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を使用してバイトコードをハックし、llvmインクルードファイルを #include
する場合は、 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"