LLVM 9.0 derleyici paketinin yayınlanması

Altı aylık geliştirmeden sonra gönderilen proje sürümü LLVM 9.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 9.0'ın yeni özellikleri arasında deneysel tasarım etiketinin hedef RISC-V platformundan kaldırılması, OpenCL için C++ desteği, bir programı LLD'de dinamik olarak yüklenen parçalara bölme yeteneği ve "aslına bak", Linux çekirdek kodunda kullanılır. libc++, WASI (WebAssembly Sistem Arayüzü) desteğini ekledi ve LLD, WebAssembly dinamik bağlantısı için başlangıç ​​desteğini ekledi.

İyileştirmeler Clang 9.0'da:

  • Katma GCC'ye özgü ifadenin uygulanması "aslına bakBu, bir montajcı satır içi bloğundan C kodundaki bir etikete geçmenizi sağlar. Bu özellik, x86_64 mimarisine sahip sistemlerde Clang kullanarak Linux çekirdeğini “CONFIG_JUMP_LABEL=y” modunda oluşturmak için gereklidir. Önceki sürümlerde eklenen değişiklikler dikkate alındığında, Linux çekirdeği artık x86_64 mimarisi için Clang'da oluşturulabilir (daha önce yalnızca kol için oluşturma, aarch64, ppc32, ppc64le ve mips mimarileri destekleniyordu). Dahası, Android ve ChromeOS projeleri halihazırda çekirdek oluşturma için Clang'ı kullanacak şekilde dönüştürüldü ve Google, üretim Linux sistemleri için çekirdek oluşturmada ana platform olarak Clang'ı test ediyor. Gelecekte, LLD, llvm-objcopy, llvm-ar, llvm-nm ve llvm-objdump dahil olmak üzere diğer LLVM bileşenleri çekirdek oluşturma sürecinde kullanılabilir;
  • OpenCL'de C++17'yi kullanmak için deneysel destek eklendi. Spesifik özellikler arasında adres alanı öznitelikleri desteği, tür atama operatörleri tarafından adres alanı dönüşümünün engellenmesi, C için OpenCL'de olduğu gibi vektör türlerinin sağlanması, görüntüler, olaylar, kanallar vb. için belirli OpenCL türlerinin varlığı yer alır.
  • Ön ucun (ayrıştırma, başlatma) ve arka ucun (optimizasyon aşamaları) çeşitli aşamalarının yürütme süresi hakkında bir rapor oluşturmak için yeni derleyici işaretleri "-ftime-trace" ve "-ftime-trace-granarity=N" eklendi. Rapor, chrome://tracing ve speedscope.app ile uyumlu, json biçiminde kaydedilir;
  • Visual Studio ortamında bellek tüketimini izlemenize olanak tanıyan "__declspec(allocator)" belirticisinin işlenmesi ve eşlik eden hata ayıklama bilgilerinin oluşturulması eklendi;
  • C dili için, “__FILE__” makrosuna benzeyen ancak tam yol olmadan yalnızca dosya adını içeren “__FILE_NAME__” makrosu için destek eklenmiştir;
  • C++, parametre ve bağımsız değişken kalıpları, referans türleri, dönüş türü çıkarımı, nesneler, otomatik olarak oluşturulan işlevler, yerleşik işleçler ve daha fazlası dahil olmak üzere çeşitli C++ özelliklerini kapsayacak şekilde adres alanı niteliklerine yönelik desteği genişletmiştir.
  • OpenCL, OpenMP ve CUDA desteğiyle ilgili yetenekler genişletildi. Bu, yerleşik OpenCL işlevlerinin örtülü olarak dahil edilmesine yönelik ilk desteği ("-fdeclare-opencl-builtins" bayrağı eklenmiştir), cl_arm_integer_dot_product uzantısının uygulanmasını ve tanılama araçlarının genişletilmesini içerir;
  • Statik analizörün çalışması iyileştirildi ve statik analizin gerçekleştirilmesine ilişkin belgeler eklendi. Mevcut kontrol modüllerini ve desteklenen seçenekleri görüntülemek için bayraklar eklendi (“-analyzer-checker[-option]-help”, “-analyzer-checker[-option]-help-alpha” ve “-analyzer-checker[-option]-help) ”-geliştirici"). Uyarıları hata olarak değerlendirmek için "-analyzer-werror" bayrağı eklendi.
    Yeni doğrulama modları eklendi:

    • arabelleklerle çalışmaya yönelik güvenli olmayan uygulamaları belirlemek için Security.insecureAPI.DeprecatedOrUnsafeBufferHandling;
    • osx.MIGChecker, MIG (Mach Interface Generator) çağrı kurallarının ihlallerini aramak için;
    • hatalı XNU libkern nesne dönüşümlerini bulmak için optin.osx.OSObjectCStyleCast;
    • LLVM kod tabanındaki hataları tespit etmek için bir dizi modelleme kontrol işlevine sahip apiModeling.llvm;
    • Başlatılmamış C++ nesnelerini kontrol etmek için kararlı kod (optin.cplusplus paketindeki UninitializedObject);
  • clang-format yardımcı programı, C# dilinde kodu biçimlendirmek için destek ekledi ve Microsoft tarafından kullanılan kod biçimlendirme stili için destek sağlar;
  • Visual Studio'da bulunan cl.exe derleyicisiyle seçenek düzeyinde uyumluluk sağlayan alternatif bir komut satırı arayüzü olan clang-cl, var olmayan dosyaları komut satırı seçenekleri olarak ele almak ve ilgili bir uyarı görüntülemek için buluşsal yöntem ekledi (örneğin, "clang-cl /diagnostic :caret /c test.cc"); çalıştırırken
  • OpenMP API'ye özel eklenen kontroller de dahil olmak üzere, linter clang-tidy'e yeni kontrollerin büyük bir kısmı eklendi;
  • Genişletilmiş sunucu yetenekleri çıngırak Arka plan dizin oluşturma modunun varsayılan olarak etkinleştirildiği (Clang Sunucusu), kodlu bağlamsal eylemler için destek eklenmiştir (değişken alımı, otomatik ve makro tanımlarının genişletilmesi, çıkışlı dizelerin çıkışsız dizelere dönüştürülmesi), görüntüleme yeteneği Clang-tidy'den gelen uyarılar, başlık dosyalarındaki hataların genişletilmiş teşhisi ve tür hiyerarşisi hakkındaki bilgileri görüntüleme yeteneği eklendi;

Ana yenilikler LLVM9.0:

  • LLD bağlayıcıya, bir programı her biri ayrı bir ELF dosyasında bulunan birkaç parçaya bölmenize olanak tanıyan deneysel bir bölümleme özelliği eklenmiştir. Bu özellik, çalışma sırasında gerektiğinde diğer bileşenleri yükleyecek olan programın ana bölümünü başlatmanıza olanak tanır (örneğin, yerleşik PDF görüntüleyiciyi, yalnızca kullanıcı PDF'yi açtığında yüklenecek olan ayrı bir dosyaya ayırabilirsiniz) dosya).

    LLD Bağlayıcı bildirilmemiş arm32_7, arm64, ppc64le ve x86_64 mimarileri için Linux çekirdeğini bağlamaya uygun bir duruma.
    Yeni seçenekler "-" (stdout'a çıktı), "-[no-]allow-shlib-untanımlanmaktadır", "-untanımsız-glob", "-nmagic", "-omagic", "-bağımlı-kütüphane", " - z ifunc-noplt" ve "-z ortak sayfa boyutu". AArch64 mimarisi için BTI (Şube Hedef Göstergesi) ve PAC (İşaretçi Kimlik Doğrulama Kodu) talimatları desteği eklendi. MIPS, RISC-V ve PowerPC platformlarına yönelik destek önemli ölçüde iyileştirildi. WebAssembly için dinamik bağlantıya yönelik başlangıç ​​desteği eklendi;

  • libc++'da uygulandı ssize, std::is_constant_evaluated, std::midpoint ve std::lerp işlevleri, std::span'a "front" ve "back" yöntemleri eklendi, std::is_unbounded_array ve std::is_bounded_array türlerinin nitelikleri eklendi , std yetenekleri genişletildi: :atomic. GCC 4.9 desteği durduruldu (GCC 5.1 ve daha yeni sürümlerle kullanılabilir). Destek eklendi ÖYLE MİYDİM (WebAssembly Sistem Arayüzü, WebAssembly'ı tarayıcı dışında kullanmaya yönelik bir arayüz);
  • Yeni optimizasyonlar eklendi. Bazı durumlarda memcmp çağrılarının bcmp'ye dönüştürülmesi etkinleştirildi. Alttaki anahtar bloklarına erişilemeyen veya talimatların kullanılmadığı atlama tabloları için (örneğin void tipindeki işlevler çağrılırken) aralık denetiminin atlanması uygulandı;
  • Artık deneysel olarak konumlandırılmayan ve varsayılan olarak oluşturulan RISC-V mimarisinin arka ucu stabilize edilmiştir. MAFDC uzantılarına sahip RV32I ve RV64I komut seti çeşitleri için tam kod oluşturma desteği sağlar;
  • X86, AArch64, ARM, SystemZ, MIPS, AMDGPU ve PowerPC mimarileri için arka uçlarda çok sayıda iyileştirme yapıldı. Örneğin mimarlık için
    AArch64, SVE2 (Ölçeklenebilir Vektör Uzantısı 2) ve MTE (Bellek Etiketleme Uzantıları) talimatları için destek ekledi; ARM arka ucunda Armv8.1-M mimarisi ve MVE (M-Profil Vektör Uzantısı) uzantısı desteği eklendi. AMDGPU arka ucuna GFX10 (Navi) mimarisi desteği eklendi, işlev çağırma özellikleri varsayılan olarak etkinleştirildi ve birleşik geçiş etkinleştirildi DPP (Veri Paralel İlkelleri).

  • LLDB hata ayıklayıcı artık geri izlemeler için renk vurgulamasına sahip ve DWARF4 debug_types ve DWARF5 debug_info blokları için destek eklendi;
  • llvm-objcopy ve llvm-strip yardımcı programlarına COFF formatındaki nesne ve yürütülebilir dosyalar için destek eklenmiştir.

Kaynak: opennet.ru

Yorum ekle