Как определить LLVM и его версию с помощью директив #define? - PullRequest
61 голосов
/ 24 октября 2009

Вопрос вполне понятен, я думаю. Я пытаюсь написать заголовок обнаружения компилятора, чтобы иметь возможность включать в приложение информацию о том, какой компилятор использовался и какая версия.

Это часть кода, который я использую:

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

Ответы [ 7 ]

72 голосов
/ 24 декабря 2009

Макросы __llvm__ и __clang__ являются официальным способом проверки компилятора LLVM (llvm-gcc или clang) или clang соответственно.

__has_feature и __has_builtin являются рекомендуемым способом проверки дополнительных функций компилятора при использовании clang, они задокументированы здесь .

Обратите внимание, что вы можете найти список макросов встроенного компилятора для gcc, llvm-gcc и clang, используя:

echo | clang -dM -E -

Это предварительно обрабатывает пустую строку и выплевывает все макросы, определенные компилятором.

38 голосов
/ 02 мая 2013

Я не могу найти ответ здесь, только ссылки на ответы, поэтому для полноты вот ответ:

__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)"
21 голосов
/ 07 ноября 2009

Для clang вам не нужно проверять номер версии, вы должны проверить наличие нужных вам функций с помощью макроса проверки функций .

10 голосов
/ 24 октября 2009

Фрагмент из 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 и сам лязнуть, хотя ..

6 голосов
/ 24 февраля 2011

Посмотрите на страницу предопределенных макросов компилятора , выберите Компиляторы-> Clang . Существует информация о многих других макросах для стандартов, компиляторов, библиотек, ОС, архитектур и т. Д.

2 голосов
/ 16 августа 2013

Я согласен, что лучше всего использовать с функцией макросов, а не версией макросов. Пример с boost :

#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
1 голос
/ 22 мая 2017

Обратите внимание, что если вы используете llvm для взлома байт-кода и, следовательно, #include включаете файлы 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"
...