Soru LLVM ve sürümü #define direktifleri aracılığıyla nasıl tespit edilir?


Soru oldukça açık bence. Derleyicinin kullanıldığı uygulama bilgisine ve hangi sürüme eklenebileceğine dair bir derleyici algılama başlığını yazmaya çalışıyorum.

Bu kullanıyorum kodun bir parçasıdır:

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

Hangi şekilde kullanılabilir:

printf("  Compiled using " COMPILER "\n", COMP_VERSION);

LLVM ve onun sürümünü tespit etmek için herhangi bir yolu var mı? Ve CLANG?


53
2017-10-24 12:23


Menşei


Harika bir soru, üzerinde herhangi bir doco bulamıyorum - Matt Joiner
Bazen Clang'ın Entegre Assembler'ın da kullanılıyor olup olmadığını bilmelisiniz. Kullanım durumu modern GCC'dir ve derleyici Clang'ı AESNI, AVX, BMI vb. Montajı için eski bir GAS yerine montajcı olarak kullanır. Entegre Assembler'ı kullanırsınız çünkü Apple'ın AS ve LD'si ön tarafından üretilen montajı tüketmek için çok eskidir -ends. - jww


Cevaplar:


__llvm__ ve __clang__ Makrolar, sırasıyla bir LLVM derleyicisini (llvm-gcc veya clang) veya clang'ı kontrol etmenin resmi yoludur.

__has_feature ve __has_builtin clang kullanırken isteğe bağlı derleyici özelliklerini kontrol etmek için önerilen yoldur, bunlar belgelenmiştir İşte.

Gcc, llvm-gcc ve clang için yerleşik derleyici makrolarının listesini aşağıdakileri kullanarak bulabileceğinizi unutmayın:

echo | clang -dM -E -

Bu, boş bir dize ön işlem yapar ve derleyici tarafından tanımlanan tüm makroları tükürür.


67
2017-12-24 20:15



Bunu not et __GNUC__ clang ve llvm-gcc için bile tanımlanmıştır. - pqnet


Burada bir cevap bulamıyorum, sadece cevaplara bağlantılar, tamlık için, işte cevap:

__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

Ben şu anda olsun:

__clang__=1
__clang_major__=3
__clang_minor__=2
__clang_patchlevel__=0
__clang_version__="3.2 (tags/RELEASE_32/final)"

32
2018-05-02 15:46





Clang için, sürüm numarasını test etmemelisiniz, istediğiniz özellikleri kontrol etmelisiniz özellik kontrol makroları.


21
2017-11-07 05:13



hm, bu iyi bir nokta. Bununla ilgili bazı resmi materyallere link verebilir misiniz? - Matt Joiner
@Matt Joiner, bence, Chris'in kendisi bir yetkili. Ana sayfasından alıntı yapıldı nondot.org/sabre: "LLVM Derleyici Altyapısının birincil yazarıyım". - osgx
@osgx: Yine de, projesinin kullanılabilirliğini arttırmak için bağlantılar sağlayabilir ve dokümantasyon ekleyebilir. - Matt Joiner
Bu LLVM hataları etrafında çalışırken size yardımcı olmaz. 2335 yapımı kırılmış ve 2336 yılında sabitlenmiş olan fastcall desteğindeki hata gibi. - pnkfelix
Hala ihtiyacın var __clang__ derleyiciyi bilmek aslında Clang'dı. - rubenvb


Snippet 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\"");

Yine de, llvm ve clang versiyonunu almanın bir yolunu bulamadım.


10
2017-10-24 14:06



Sanırım, şu anda özellikler için desteklenen talep edilen GCC'ye ve uzantılar için clang / llvm'ye güvenebileceğini düşünüyorum. - Matt Joiner


Bir göz atın Ön tanımlı Derleyici Makroları sayfasıseçin Compilers-> Clang. Standartlar, derleyiciler, kütüphaneler, işletim sistemleri, mimariler ve daha fazlası için birçok başka makro hakkında bilgi vardır.


6
2018-02-24 01:53



Muhteşem. Sadece pastamı da kurtarırım :) - Dirk Eddelbuettel


En iyi seçimin kullanılması gerektiğine katılıyorum özelliği var Makrolar, sürüm makrosları değil. İle örnek artırmak:

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

Ama neyse, ihtiyacın olursa derleyici sürümü, kullanabilirsiniz 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;
}

Çıkış örnekleri:

Clang-30400000
Clang-50000000

2
2017-08-16 19:36





Bayt kodu kesmek için llvm kullanıyorsanız ve #includellvm dosyaları dahil, makroları kontrol edebilirsiniz llvm/Config/llvm-config.h. Ve somut olarak:

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

0
2018-05-21 23:18