LLVM 11.0 derleyici paketinin yayınlanması

Altı aylık geliştirmeden sonra gönderilen proje sürümü LLVM 11.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.

Yeni sürümdeki en önemli değişiklik şunların dahil edilmesiydi: Yan taraf, Fortran dili için ön uç. Flang, Fortran 2018, OpenMP 4.5 ve OpenACC 3.0'ı desteklemektedir, ancak projenin geliştirilmesi henüz tamamlanmamıştır ve ön uç, kod ayrıştırma ve doğruluk kontrolü ile sınırlıdır. LLVM ara kodunun oluşturulması henüz desteklenmemektedir ve yürütülebilir dosyalar oluşturmak için kanonik kod oluşturulur ve harici bir Fortran derleyicisine aktarılır.

İyileştirmeler Clang 11.0'da:

  • Soyut sözdizimi ağacını geri yükleme yeteneği eklendi (AST) kırık C++ kodu için, hataları teşhis etmeye yardımcı olmak için kullanılabilir ve clang-tidy ve clangd gibi harici yardımcı programlara ek bilgi sağlar. Bu özellik, C++ kodu için varsayılan olarak etkindir ve "-Xclang -f[no-]recovery-ast" seçenekleri aracılığıyla kontrol edilir.
  • Yeni teşhis modları eklendi:
    • "-Wpointer-to-int-cast", işaretçilerin olası tüm değerleri karşılamayan bir int tamsayı türüne dönüştürülmesine ilişkin bir uyarı grubudur.
    • “-Wuninitialized-const-reference” - “const” özniteliğine sahip referans argümanlarını kabul eden işlev parametrelerinde başlatılmamış değişkenlerin iletilmesine ilişkin uyarı.
    • "-Wimplicit-const-int-float-conversion" - gerçek bir sabitin bir tamsayı türüne örtülü dönüşümü hakkında varsayılan uyarı olarak etkindir.
  • ARM platformu için derleyicide yerleşik C işlevleri sağlanır (intrinsics), etkin vektör talimatları Arm v8.1-M MVE ve CDE ile değiştirildi. Kullanılabilir işlevler arm_mve.h ve arm_cde.h başlık dosyalarında tanımlanmıştır.
  • Katma FPGA/HLS'de verimli bir şekilde işlenebilen, ikinin katı olmayan türler oluşturmanıza olanak tanıyan bir dizi genişletilmiş _ExtInt(N) tamsayı türü. Örneğin_ExtInt(7), 7 bitten oluşan bir tamsayı tipini tanımlar.
  • ARM SVE (Ölçeklenebilir Vektör Uzantısı) talimatlarına dayalı olarak yerleşik C işlevlerine yönelik desteği tanımlayan makrolar eklendi:
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4. Örneğin, __ARM_FEATURE_SVE makrosu, "-march=armv64-a+sve" komut satırı seçeneği ayarlanarak AArch8 kodu oluşturulurken tanımlanır.

  • "-O" bayrağı artık "-O1" yerine "-O2" optimizasyon moduyla tanımlanıyor.
  • Yeni derleyici bayrakları eklendi:
    • "-fstack-clash-protection" - karşı korumayı etkinleştirir yığın ve yığının kesişimleri.
    • "-ffp-istisna-behavior={ignore,maytrap,strict}" - kayan noktalı sayılar için istisna işleyici modunu seçmenizi sağlar.
    • "-ffp-model={precise,strict,fast}" - Kayan nokta sayılarına yönelik bir dizi özel seçeneğe erişimi kolaylaştırır.
    • Kod ve hata ayıklama bilgisi için ayrı nesne dosyalarıyla önceden derlenmiş bir başlık (PCH) oluşturmak için "-fpch-codegen" ve "-fpch-debuginfo".
    • Kapsam testi beyaz ve kara listelerini kontrol etmek için "-fsanitize-coverage-allowlist" ve "-fsanitize-coverage-blocklist".
    • TLS (yerel iş parçacığı depolama) boyutunu seçmek için "-mtls-size={12,24,32,48}".
    • Deneysel RISC-V uzantılarını etkinleştirmek için "-menable-experimental-extension".
  • C için varsayılan mod "-fno-common"dur ve bu, bazı platformlarda global değişkenlere daha verimli erişime olanak tanır.
  • Varsayılan modül önbelleği /tmp'den ~/.cache dizinine taşındı. Geçersiz kılmak için “-fmodules-cache-path=” bayrağını kullanabilirsiniz.
  • Varsayılan C dili standardı gnu11'den gnu17'ye güncellendi.
  • GNU C uzantısı için ön destek eklendi "asm satır içi» montajcı ek parçaları eklemek için. Uzantı hâlâ analiz ediliyor ancak hiçbir şekilde işlenmiyor.
  • OpenCL ve CUDA desteğiyle ilişkili yetenekler genişletildi. OpenCL 2.0 blok teşhisi için destek eklendi ve yeni OpenMP 5.0 özellikleri uygulandı.
  • Harici "C" ve harici "C++" blokları içinde hizalama için clang formatı yardımcı programına IndentExternBlock seçeneği eklendi.
  • Statik analizör, C++'da devralınan oluşturucuların işlenmesini geliştirdi. Kilitleri kontrol etmek için yeni alpha.core.C11Lock ve alpha.fuchsia.Lock kontrolleri, putenv, webkit.NoUncountedMemberChecker ve webkit.RefCntblBaseVirtualDtor'un güvensiz kullanımını tespit etmek için alpha.security.cert.pos.34c eklendi ve sayılamayan türlerdeki sorunları tespit etmek için alpha eklendi .cplusplus .SmartPtr boş akıllı işaretçi başvurusunu kontrol etmek için.
  • Linter'de çıngırak-düzenli katma yeni çeklerin büyük bir kısmı.
  • Clangd önbellekleme sunucusu (Clang Sunucusu) performansı artırdı ve yeni teşhis yetenekleri ekledi.

Ana yenilikler LLVM11.0:

  • Derleme sistemi Python 3 kullanımına geçirildi. Python 3 mevcut değilse Python 2 kullanımına geri dönmek mümkündür.
  • Go dili (llgo) için derleyiciye sahip ön uç, gelecekte yeniden yapılandırılabilecek sürümden hariç tutulmuştur.
  • Çağrıları vektörleştirmek için skaler ve vektör işlevleri arasındaki eşlemeyi tanımlamak üzere ara gösterime (IR) vektör işlevi-abi-varyant özelliği eklenmiştir. llvm::VectorType'tan iki ayrı vektör türü vardır: llvm::FixedVectorType ve llvm::ScalableVectorType.
  • Udef değerlerine göre dallanma ve undef değerlerinin standart kütüphane fonksiyonlarına aktarılması tanımsız davranış olarak kabul edilmektedir. İÇİNDE
    memset/memcpy/memmove undef işaretçilerinin iletilmesine izin verir, ancak boyutu olan parametre sıfırsa.

  • LLJIT, LLJIT::initialize ve LLJIT::deinitialize yöntemleri aracılığıyla statik başlatmaların gerçekleştirilmesi için destek ekledi. StaticLibraryDefinitionGenerator sınıfını kullanarak JITDylib'e statik kitaplıklar ekleme yeteneği uygulandı. Şunun için C API eklendi: ORCv2 (JIT derleyicileri oluşturmak için API).
  • AArch64 mimarisinin arka ucuna Cortex-A34, Cortex-A77, Cortex-A78 ve Cortex-X1 işlemci desteği eklendi. RMv8.2-ECV (Gelişmiş Sayaç Sanallaştırma), ARMv16-FGT (İnce Taneli Tuzaklar), ARMv16-AMU (Etkinlik Monitörleri sanallaştırması) dahil olmak üzere ARMv8.6-BF8.6 (BFloat8.6) ve ARMv8.6-A uzantıları uygulandı ve ARMv8.0-DGH (Veri toplama ipucu). SVE vektör talimatlarına yerleşik işlev bağlamaları için kod oluşturma yeteneği sağlanır.
  • ARM mimarisinin arka ucuna Cortex-M55, Cortex-A77, Cortex-A78 ve Cortex-X1 işlemci desteği eklendi. Uzantılar uygulandı
    Armv8.6-A Matris Çarpması ve RMv8.2-AA32BF16 BFloat16.

  • PowerPC mimarisinin arka ucuna POWER10 işlemcileri için kod oluşturma desteği eklendi. Döngü optimizasyonları genişletildi ve kayan nokta desteği iyileştirildi.
  • RISC-V mimarisinin arka ucu, henüz resmi olarak onaylanmamış deneysel genişletilmiş talimat setlerini destekleyen yamaların kabulüne olanak tanır.
  • AVR mimarisinin arka ucu deneysel kategoriden kararlı kategoriye aktarılarak temel dağıtıma dahil edildi.
  • X86 mimarisinin arka ucu Intel AMX ve TSXLDTRK talimatlarını destekler. Saldırılara karşı ek koruma LVI (Yük Değeri Enjeksiyonu) ve ayrıca CPU üzerindeki işlemlerin spekülatif olarak yürütülmesinden kaynaklanan saldırıları engellemek için genel bir Spekülatif Yürütme Yan Etki Bastırma mekanizması uygular.
  • SystemZ mimarisinin arka ucuna MemorySanitizer ve LeakSanitizer desteği eklendi.
  • Libc++'a matematiksel sabitleri içeren başlık dosyası desteği eklendi .
  • Genişletilmiş LLD bağlayıcı yetenekleri. "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " gibi eklenen seçenekler de dahil olmak üzere ELF formatı için geliştirilmiş destek -thinlto- tek modül", "-benzersiz", "-rosegment", "-threads=N". İzlemeyi bir dosyaya kaydetmek için "--time-trace" seçeneği eklendi; bu dosya daha sonra Chrome'daki chrome://tracing arayüzü aracılığıyla analiz edilebilir.

Kaynak: opennet.ru

Yorum ekle