LLVM 10.0 derleyici paketinin yayınlanması

Altı aylık geliştirmeden sonra gönderilen proje sürümü LLVM 10.0 — Programları RISC benzeri sanal talimatların ara bit kodu halinde derleyen GCC uyumlu araçlar (derleyiciler, optimize ediciler ve kod oluşturucular) (çok seviyeli optimizasyon sistemine sahip düşük seviyeli sanal makine). Oluşturulan sözde kod, bir JIT derleyicisi kullanılarak doğrudan programın yürütülmesi sırasında makine talimatlarına dönüştürülebilir.

LLVM 10.0'daki yeni özellikler arasında C++ Concepts desteği, artık Clang'ı ayrı bir işlem olarak çalıştırmama, Windows için CFG (kontrol akışı koruması) kontrolleri desteği ve yeni CPU yetenekleri desteği yer alıyor.

İyileştirmeler Clang 10.0'da:

  • " için destek eklendikavram", kod adı C++2a olan (-std=c++2a bayrağıyla etkinleştirilen) bir sonraki standarda dahil edilecek bir C++ şablon uzantısı.
    Kavramlar, derleme zamanında şablon parametreleri olarak kabul edilebilecek bağımsız değişken kümesini sınırlayan bir dizi şablon parametresi gereksinimi tanımlamanıza olanak tanır. Kavramlar, şablonda kullanılan veri türlerinin özellikleri ile giriş parametrelerinin veri türü özellikleri arasındaki mantıksal tutarsızlıkları önlemek için kullanılabilir.

    şablon
    EşitlikKarşılaştırılabilir kavramı = gerektirir(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Varsayılan olarak, derlemenin gerçekleştirildiği ayrı bir işlemin (“clang -cc1”) başlatılması durdurulur. Derleme artık ana süreçte yapılıyor ve eski davranışı geri yüklemek için "-fno-integrated-cc1" seçeneği kullanılabilir.
  • Yeni teşhis modları:
    • "-Wc99-designator" ve "-Wreorder-init-list", C99 başlatıcılarının C99'da doğru olduğu ancak C++20'de olmadığı durumlarda C++ modunda kullanılmasına karşı uyarıda bulunur.
    • "-Wsizeof-array-div" - "int arr[10]; gibi durumları yakalar; …sizeof(arr) / sizeof(short)…” (“sizeof(arr) / sizeof(int)” olmalıdır).
    • "-Wxor-used-as-po" - üstel alma (2^16) ile karıştırılabilecek işlemlerde "^" (xor) operatörünün kullanımı gibi yapıların kullanımına karşı uyarıda bulunur.
    • "-Wfinal-dtor-non-final-class" - "final" belirticisiyle işaretlenmemiş ancak "final" niteliğine sahip bir yıkıcıya sahip olan sınıflar hakkında uyarır.
    • "-Wtautolojik-bitsel-karşılaştırma", bitsel bir işlem ile bir sabit arasındaki totolojik karşılaştırmaları teşhis etmeye ve bitsel VEYA işleminin negatif olmayan bir sayıya uygulandığı her zaman doğru karşılaştırmaları tanımlamaya yönelik bir uyarı grubudur.
    • "-Wbitwise-conditional-parentheses", mantıksal operatörler AND (&) ve OR (|) ile koşullu operatör (?:) karıştırıldığında ortaya çıkan sorunlara karşı uyarıda bulunur.
    • “-Wmisleading-indentation”, GCC'den aynı adı taşıyan kontrolün bir analogudur; girintili ifadeler hakkında sanki bir if/else/for/while bloğunun parçasıymış gibi uyarı verir, ancak aslında bu bloğa dahil edilmezler .
    • “-Wextra” belirtildiğinde, “-Wdeprecated-copy” kontrolü etkinleştirilir ve yapıcıların kullanımı hakkında uyarı verilir
      Açık bir yıkıcı tanımıyla sınıflarda "taşı" ve "kopyala".

    • "-Wtautolojik-örtüşme-karşılaştırma", "-Wsizeof-pointer-div", "-Wtautolojik-karşılaştırma", "-Wrange-döngü-analizi" kontrolleri genişletildi.
    • "-Wbitwise-op-parentheses" ve "-Wological-op-parentheses" kontrolleri varsayılan olarak devre dışıdır.
  • C ve C++ kodunda işaretçi aritmetik işlemlerine yalnızca dizilerde izin verilir. "-fsanitize=pointer-overflow" modundaki Tanımsız Davranış Temizleyici artık boş bir işaretçiye sıfır olmayan bir uzaklık ekleme veya boş olmayan bir işaretçiden bir tamsayı çıkarırken boş bir işaretçi oluşturma gibi durumları yakalıyor.
  • "-fsanitize=implicit-conversion" (Örtülü Dönüştürme Temizleyici) modu, bit boyutu "int" türünden daha küçük olan türler için artırma ve azaltma işlemleriyle ilgili sorunları tanımlamak üzere uyarlanmıştır.
  • X86 hedef mimarileri seçildiğinde varsayılan olarak vektörleştirilmiş olarak "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" ve "-march=cooperlake" kod, kaynak kodunda doğrudan belirtilmesi dışında 512 bitlik zmm kayıtlarını kullanmayı durdurdu. Bunun nedeni, 512 bit işlemler gerçekleştirilirken CPU frekansının azalmasıdır ve bu da genel performansı olumsuz yönde etkileyebilir. Yeni davranışı değiştirmek için "-mprefer-vector-width=512" seçeneği sağlanır.
  • "-Flax-vector-conversions" bayrağının davranışı GCC'ye benzer: tam sayı ve kayan nokta vektörleri arasındaki örtülü vektör bit dönüşümleri yasaktır. Bu sınırlamayı ortadan kaldırmak için bayrağın kullanılması önerilmektedir.
    Varsayılan olan "-flax-vector-conversions=all".

  • Octeon ailesinin MIPS CPU'ları için geliştirilmiş destek. Geçerli CPU türleri listesine "octeon+" eklendi.
  • WebAssembly ara koduna montaj yapılırken, sistemde mevcutsa wasm-opt optimizer otomatik olarak çağrılır.
  • RISC-V mimarisini temel alan sistemler için, kayan nokta değerlerini saklayan kayıtların kullanımına, derleyici satır içi eklerinin koşullu bloklarında izin verilir.
  • Yeni derleyici işaretleri eklendi: "__GNUC__" ve benzer makroların sürüm değerini ayarlamak için "-fgnuc-version"; "-fmacro-prefix-map=ESKİ=YENİ", "__FILE__" gibi makrolarda ESKİ dizin önekini YENİ ile değiştirmek için; İşlev giriş noktasından önce ve sonra belirli sayıda NOP talimatı oluşturmak için "-fpatchable-function-entry=N[,M]". RISC-V için
    "-ffixed-xX", "-mcmodel=medany" ve "-mcmodel=medlow" bayrakları için destek eklendi.

  • Etkisi seçeneğe benzer olan ‘__attribute__((target(“branch-protection=..."))) özelliği için destek eklendi -mdal koruması.
  • Windows platformunda, “-cfguard” bayrağını belirtirken, dolaylı işlev çağrıları yerine yürütme akışı bütünlüğü kontrollerinin (Kontrol Akışı Koruması) değiştirilmesi uygulanır. Kontrol değiştirmeyi devre dışı bırakmak için “-cfguard-nochecks” bayrağını veya “__declspec(guard(nocf))” değiştiricisini kullanabilirsiniz.
  • gnu_inline niteliğinin davranışı, "extern" anahtar sözcüğü olmadan kullanıldığı durumlarda GCC'ye benzer.
  • OpenCL ve CUDA desteğiyle ilişkili yetenekler genişletildi. Yeni OpenMP 5.0 özellikleri için destek eklendi.
  • Clang-format yardımcı programına, kodu ayrıştırırken ve biçimlendirirken kullanılan C++ standardının sürümünü belirlemenize olanak tanıyan bir Standart seçeneği eklenmiştir (En Son, Otomatik, c++03, c++11, c++14, c++17, c++20).
  • Statik analiz cihazına yeni kontroller eklendi: Yeterli depolama alanı olup olmadığını belirlemek için alpha.cplusplus.PlacementNew, Fuchsia işleyicileriyle ilgili sızıntıları tespit etmek için fuchsia.HandleChecker, [NSCoder decodeValueOfObjCType kullanılırken olası arabellek taşmalarını tespit etmek için Security.insecureAPI.decodeValueOfObjCType :at:] .
  • Tanımsız Davranış Temizleyici (UBSan), NULL işaretçilerine sıfır olmayan uzaklıkların uygulanmasını veya bunun sonucunda bir NULL işaretçi uzaklığının eklenmesini yakalamak için işaretçi taşma kontrollerini genişletti.
  • Linter'de çıngırak-düzenli katma yeni çeklerin büyük bir kısmı.

Ana yenilikler LLVM10.0:

  • çerçeveye Atıfta bulunan Yeni prosedürler arası optimizasyonlar ve analizörler eklendi. 19 özellik 12 LLVM IR ve canlılık gibi 12 soyut özellik dahil olmak üzere 7 farklı özelliğin durumu tahmin edilmektedir.
  • Derleyiciye yerleşik yeni matris matematik işlevleri eklendi (intrinsics), derleme sırasında etkili vektör talimatlarıyla değiştirilir.
  • X86, AArch64, ARM, SystemZ, MIPS, AMDGPU ve PowerPC mimarileri için arka uçlarda çok sayıda iyileştirme yapıldı. CPU desteği eklendi
    Cortex-A65, Cortex-A65AE, Neoverse E1 ve Neoverse N1. ARMv8.1-M için kod oluşturma süreci optimize edildi (örneğin, minimum ek yüke sahip döngüler için destek ortaya çıktı) ve MVE uzantısı kullanılarak otomatik vektörleştirme desteği eklendi. Geliştirilmiş CPU MIPS Octeon desteği. PowerPC için, MASSV (Matematiksel Hızlandırma Alt Sistemi) kitaplığı kullanılarak matematiksel alt rutinlerin vektörleştirilmesi etkinleştirilir, kod üretimi iyileştirilir ve döngülerden belleğe erişim optimize edilir. x86 için v2i32, v4i16, v2i16, v8i8, v4i8 ve v2i8 vektör türlerinin işlenmesi değiştirildi.

  • WebAssembly için geliştirilmiş kod oluşturucu. TLS (İş Parçacığı Yerel Depolama) ve atom.fence talimatları için destek eklendi. SIMD desteği önemli ölçüde genişletildi. WebAssembly nesne dosyaları artık çok değerli işlev imzalarını kullanma yeteneğine sahiptir.
  • Analizör döngüleri işlerken kullanılır BellekSSAfarklı bellek işlemleri arasındaki bağımlılıkları tanımlamanıza olanak tanır. MemorySSA, derleme ve yürütme süresini azaltabilir veya performans kaybı olmadan AliasSetTracker'ın yerine kullanılabilir.
  • LLDB hata ayıklayıcısı, DWARF v5 formatına yönelik desteği önemli ölçüde geliştirdi. MinGW ile bina için geliştirilmiş destek
    ve ARM ve ARM64 mimarileri için Windows çalıştırılabilir dosyalarında hata ayıklamaya yönelik başlangıç ​​yeteneği eklendi. Sekmeye basılarak giriş otomatik tamamlanırken sunulan seçeneklerin açıklamaları eklendi.

  • Genişletilmiş LLD bağlayıcı yetenekleri. Glob şablonlarının GNU bağlayıcıyla tam uyumluluğunun sağlanması, sıkıştırılmış hata ayıklama bölümleri ".zdebug" için destek eklenmesi, .note.gnu.property bölümünü tanımlamak için PT_GNU_PROPERTY özelliğinin eklenmesi (gelecekte kullanılabilir) dahil olmak üzere ELF formatı için iyileştirilmiş destek Linux çekirdekleri),
    "-z burun ayırma kodu", "-z ayrı kod" ve "-z ayrı yüklenebilir segmentler" modları uygulandı. MinGW ve WebAssembly için geliştirilmiş destek.

Kaynak: opennet.ru

Yorum ekle