LLVM 12.0 derleyici paketinin yayınlanması

Altı aylık geliştirme sürecinin ardından, programları RISC benzeri sanal talimatların ara bit kodu (düşük seviyeli bir sanal makine) halinde derleyen GCC uyumlu bir araç seti (derleyiciler, optimize ediciler ve kod oluşturucular) olan LLVM 12.0 projesinin piyasaya sürülmesi sunuldu. çok seviyeli optimizasyon sistemi). 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.

Clang 12.0'daki iyileştirmeler:

  • C++20 standardında önerilen "olası" ve "olası olmayan" niteliklere yönelik destek varsayılan olarak uygulanmış ve etkinleştirilmiştir; bu, optimize edicinin koşullu yapının tetiklenme olasılığı hakkında bilgilendirilmesine olanak sağlar (örneğin, "[[muhtemelen ]] eğer (rastgele > 0) {“).
  • AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) ve Intel Sapphire Rapids (-march=sapphirerapids) işlemcileri için destek eklendi.
  • X86-64 mimari seviyelerini seçmek için "-march=x234-86-v[64]" bayrakları desteği eklendi (v2 - SSE4.2, SSSE3, POPCNT ve CMPXCHG16B uzantılarını kapsar; v3 - AVX2 ve MOVBE; v4 - AVX-512 ).
  • Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) ve Fujitsu A64FX (a64fx) işlemcileri için destek eklendi. Örneğin Neoverse-V1 CPU'lara yönelik optimizasyonları etkinleştirmek için “-mcpu=neoverse-v1” belirtebilirsiniz.
  • AArch64 mimarisi için, "__aarch64_cas8_relax" gibi atomik işlem yardımcı işlevlerini etkinleştirmek veya devre dışı bırakmak için "-moutline-atomics" ve "-mno-outline-atomics" yeni derleyici bayrakları eklendi. Bu tür işlevler, çalışma zamanında LSE (Büyük Sistem Uzantıları) desteğinin mevcut olup olmadığını algılar ve sağlanan atomik işlemci talimatlarını kullanır veya senkronizasyon için LL/SC (Yükleme bağlantısı/depolama-koşullu) talimatlarını kullanmaya geri döner.
  • Eski bağlayıcı ve birleştirici davranışıyla uyumluluk amacıyla binutils paketinin hedef sürümünü seçmek için "-fbinutils-version" seçeneği eklendi.
  • ELF yürütülebilir dosyaları için, “-gz” bayrağı belirtildiğinde, zlib kitaplığı kullanılarak hata ayıklama bilgilerinin sıkıştırılması varsayılan olarak etkinleştirilir (gz=zlib). Ortaya çıkan nesne dosyalarının bağlanması için lld veya GNU binutils 2.26+ gerekir. Binutils'in eski sürümleriyle uyumluluğu geri yüklemek için "-gz=zlib-gnu" belirtebilirsiniz.
  • 'This' işaretçisi artık boş olmayan ve referansı alınamayan(N) kontrollerle işleniyor. Nonnull niteliğini kaldırmak için NULL değerleri kullanmanız gerekiyorsa "-fdelete-null-pointer-checks" seçeneğini kullanabilirsiniz.
  • Linux platformunda, AArch64 ve PowerPC mimarilerinin GCC'deki gibi geri alma çağrı tabloları oluşturması için "-fasynchronous-unwind-tables" modu etkinleştirilmiştir.
  • "#pragma clang loop Vectorize_width" bölümüne, vektörleştirme yöntemini seçmek için "sabit" (varsayılan) ve "ölçeklenebilir" seçenekleri belirtme yeteneği eklendi. Vektör uzunluğundan bağımsız "ölçeklenebilir" mod deneyseldir ve ölçeklenebilir vektörleştirmeyi destekleyen donanımlarda kullanılabilir.
  • Windows platformu için geliştirilmiş destek: Clang derleyicisi, LLD bağlayıcısı ve derleyici-rt çalışma zamanı kitaplıkları dahil olmak üzere Arm64 sistemlerinde Windows için resmi ikili derlemeler hazırlanmıştır. MinGW hedef platformları için derleme yaparken, çapraz derleme sırasında bile .exe son eki eklenir.
  • OpenCL, OpenMP ve CUDA desteğiyle ilgili yetenekler genişletildi. OpenCL 3.0 ve OpenCL 1.0 için makro seçeneklerini seçmek üzere "-cl-std=CL3.0" ve "-cl-std=CL1.0" seçenekleri eklendi. Teşhis araçları genişletildi.
  • Bazı x86 tabanlı işlemcilerde uygulanan HRESET, UINTR ve AVXVNNI talimatları için destek eklendi.
  • X86 sistemlerinde "-mtune=" seçeneği desteği etkindir ", "-march= değerinden bağımsız olarak seçilen mikro mimari optimizasyonları etkinleştirir "
  • Statik analizör, bazı POSIX işlevlerinin işlenmesini iyileştirdi ve karşılaştırmada birkaç sembolik değer olduğunda koşullu işlemlerin sonucunun belirlenmesini önemli ölçüde iyileştirdi. Yeni kontroller eklendi: fuchia.HandleChecker (yapılardaki tanıtıcıları tanımlar), webkit.UncountedLambdaCapturesChecker webkit ve alpha.webkit.UncountedLocalVarsChecker (WebKit motor kodundaki işaretçilerle çalışmanın özelliklerini dikkate alır).
  • Sabitler bağlamında kullanılan ifadelerde, __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd, __bsrq, __bswap, __bswapd, __bswap64, yerleşik fonksiyonların kullanımı, izin verilir. __bswapq , _castf*, __rol* ve __ror*.
  • Tanımlayıcıların, sütunların ve alan tanımlarının etrafındaki boşluğu seçmek için clang-format yardımcı programına bir BitFieldColonSpacing seçeneği eklendi.
  • Linux platformundaki clangd önbellekleme sunucusu (Clang Sunucusu), uzun süreli çalışma sırasında bellek tüketimini önemli ölçüde azaltmıştır (boş bellek sayfalarını işletim sistemine döndürmek için malloc_trim'e periyodik çağrılar sağlanır).

LLVM 12.0'daki önemli yenilikler:

  • Python'da yazılan llvm-build derleme aracı desteği durduruldu ve bunun yerine proje tamamen CMake derleme sistemini kullanmaya geçti.
  • AArch64 mimarisinin arka ucunda, Windows platformu desteği iyileştirildi: hedef Windows sistemleri için doğru derleyici çıktısı oluşturulması sağlandı, geri alma çağrılarında veri üretimi optimize edildi (bu tür verilerin boyutu 60 oranında azaltıldı) %), assembler kullanarak geri alma verileri oluşturma yeteneği .seh_* direktifleri eklendi.
  • PowerPC mimarisinin arka ucu, döngüler ve satır içi dağıtım için yeni optimizasyonlar, Power10 işlemciler için genişletilmiş destek, matris manipülasyonu için MMA talimatları için ek destek ve AIX işletim sistemi için geliştirilmiş destek içerir.
  • X86 arka ucu, AMD Zen 3, Intel Alder Lake ve Intel Sapphire Rapids işlemcilerin yanı sıra HRESET, UINTR ve AVXVNNI işlemci talimatları için destek sağlar. Bellek sınırlarının artık desteklenmediğinden emin olmak için işaretçileri kontrol etmeye yönelik MPX (Bellek Koruma Uzantıları) desteği (bu teknoloji yaygın değildir ve GCC ve clang'dan zaten kaldırılmıştır). İşlenen uzaklıklarının ve atlamalarının boyutunu kontrol etmek amacıyla birleştiriciye {disp32} ve {disp8} önekleri ile .d32 ve .d8 son ekleri için destek eklendi. Mikro mimari optimizasyonların dahil edilmesini kontrol etmek için yeni bir "tune-cpu" özelliği eklendi.
  • Tamsayı sorun dedektörüne (integer sanitizer, "-fsanitize=integer") yeni bir "-fsanitize=unsigned-shift-base" modu, sola doğru bir bit kaydırma sonrasında işaretsiz tamsayıların taşmalarını tespit etmek için eklendi.
  • Çeşitli dedektörlerde (asan, cfi, lsan, msan, tsan, ubsan sanitizer) standart Musl kütüphanesi ile Linux dağıtımlarına destek eklendi.
  • LLD bağlayıcının yetenekleri genişletildi. Eklenen “--dependency-file”, “-error-handling-script”, “-lto-pseudo-probe-for-profiling”, “-no-lto-whole-program” seçenekleri de dahil olmak üzere ELF formatı için geliştirilmiş destek -görünürlük” " Geliştirilmiş MinGW desteği. Mach-O formatı (macOS) için arm64, arm ve i386 mimarileri desteği, bağlantı süresi optimizasyonları (LTO) ve istisna yönetimi için yığın çözme uygulanmıştır.
  • Libc++, C++20 standardının yeni özelliklerini uygular ve C++2b spesifikasyonunun özelliklerini geliştirmeye başlamıştır. Yerelleştirme desteğini ("-DLIBCXX_ENABLE_LOCALIZATION=OFF") ve sözde rastgele sayılar oluşturmaya yönelik cihazları ("-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF") devre dışı bırakarak oluşturma desteği eklendi.

Kaynak: opennet.ru

Yorum ekle