GCC 10 derleyici paketinin yayınlanması

Bir yıllık geliştirmenin ardından yayınlanan ücretsiz bir derleyici setinin piyasaya sürülmesi GCC 10.1, yeni GCC 10.x şubesindeki ilk büyük sürüm. Uyarınca yeni şema sürüm numaraları, geliştirme sürecinde sürüm 10.0 kullanıldı ve GCC 10.1'in yayınlanmasından kısa bir süre önce, GCC 11.0 şubesi zaten dallara ayrılmıştı ve bir sonraki önemli sürüm olan GCC 11.1 buna göre oluşturulacaktı.

GCC 10.1, C++20 standardı için geliştirilen C++ dilindeki birçok yeniliğin uygulanması, gelecekteki C dili standardına (C2x) ilişkin iyileştirmeler, derleyici arka uçlarındaki yeni optimizasyonlar ve deneysel destek ile dikkat çekiyor. statik analiz modu. Ayrıca yeni şubenin hazırlanması sırasında proje, depoyu SVN'den Git'e aktardı.

Ana değişiklikler:

  • Katma Statik analizin deneysel modu "-analizörBir programdaki kod yürütme yollarının ve veri akışlarının kaynak yoğun prosedürler arası analizini gerçekleştiren. Mod, bir bellek alanı için free() işlevine çift çağrı, dosya tanımlayıcı sızıntıları, referans kaldırma ve boş işaretçileri geçirme, boş bellek bloklarına erişim, başlatılmamış değerler kullanma vb. gibi derleme aşamasındaki sorunları tespit etme yeteneğine sahiptir. OpenSSL kodu için yeni modun kullanılması, tanımlamayı zaten mümkün kılmıştır. tehlikeli güvenlik açığı.
  • İyileştirilmiş prosedürler arası optimizasyonlar. IPA-SRA (Prosedürlerarası Skaler Paylaşımlı Değiştirme) geçişi, bağlama zamanında çalışacak şekilde yeniden tasarlandı ve diğer şeylerin yanı sıra, artık hesaplanan ve döndürülen kullanılmayan değerleri kaldırıyor. "-O2" optimizasyon modunda, yürütme performansından ziyade daha kompakt kodu tercih edecek şekilde yeniden ayarlanan "-finline-functions" seçeneği etkinleştirilir. Satır içi işlev dağıtımına yönelik buluşsal yöntemin çalışması hızlandırıldı. Satır içi genişletme ve işlev klonlama buluşsal yöntemleri artık bireysel dönüşümlerin etkinliğini tahmin etmek için değer aralıkları hakkındaki bilgileri kullanabilir. C++ için türe dayalı takma ad ayrıştırmanın doğruluğu iyileştirildi.
  • Gelişmiş Bağlantı Süresi Optimizasyonları (LTO). Yeni yürütülebilir dosya eklendi lto-dump LTO bayt koduna sahip nesne dosyaları hakkındaki bilgileri sıfırlamak için. Paralel LTO geçişleri, eşzamanlı olarak çalıştırılan yapım görevlerinin sayısını otomatik olarak belirler ve bunlar belirlenemiyorsa paralelleştirme faktörü olarak CPU çekirdeği sayısı hakkındaki bilgileri kullanır. Zstd algoritmasını kullanarak LTO bayt kodunu sıkıştırma yeteneği eklendi.
  • Kod profili oluşturma (PGO - Profil kılavuzlu optimizasyon) sonuçlarına dayanan optimizasyon mekanizması iyileştirildi ve bu, kod yürütme özelliklerinin analizine dayalı olarak daha optimum kod üretiyor. Derleme ve sıcak/soğuk kod ayrımı sırasında iyileştirilmiş profil bakımı. "Seçenek aracılığıyla-fprofile-değerleri» Artık örneğin dolaylı aramalar ve daha kesin profil bilgileri sağlamak için 4'e kadar profil değerini izleyebilir.
  • C, C++ ve Fortran dilleri için uygulanan paralel programlama spesifikasyonu OpenACC 2.6GPU'lardaki ve NVIDIA PTX gibi özel işlemcilerdeki yük boşaltma işlemlerine yönelik araçları tanımlayan. Standardın uygulanması neredeyse tamamlandı OpenMP 5.0 (Açık Çoklu İşleme), paylaşılan belleğe ve vektörleştirme birimlerine (SIMD) sahip çok çekirdekli ve hibrit (CPU+GPU/DSP) sistemlerde paralel programlama yöntemlerinin uygulanmasına yönelik API'yi ve yöntemleri tanımlar. Lastprivate koşullar, tarama ve döngü direktifleri, order ve use_device_addr ifadeleri gibi özellikler eklendi. OpenMP ve OpenACC için, dördüncü nesil (Fiji) ve beşinci nesil AMD Radeon (GCN) GPU'larda (VEGA 10/VEGA 20) boşaltma işlemlerine yönelik destek eklendi.
  • C ailesi dilleri için, fonksiyonun referans veya işaretçi tarafından iletilen nesnelere erişimini tanımlamak ve bu tür nesneleri, nesnelerin boyutu hakkında bilgi içeren tamsayı argümanlarıyla ilişkilendirmek için “erişim” işlevi eklenmiştir. "Erişim" ile birlikte çalışmak için "type" özelliği, örneğin dizinin sınırları dışındaki bir alana değer yazarken kullanıcı işlevlerinden gelen hatalı erişimi tespit etmek için uygulanır. Ayrıca bir ELF dosyasındaki sembolleri belirli sürüm numaralarıyla ilişkilendirmek için "symver" özelliği de eklenmiştir.
  • Yeni uyarılar eklendi:
    • “-Wstring-compare” (“-Wextra” ile etkindir) - sıfırın, uzunluk nedeniyle bir sabite eşdeğer olan strcmp ve strncmp işlevlerinin çağrılmasının sonucuyla karşılaştırıldığı ifadelerin varlığı konusunda uyarır. bir argümanın boyutu ikinci argümandaki dizinin boyutundan daha büyük.
    • "-Wzero-length-bounds" ("-Warray-bounds" ile etkinleştirilir) - sıfır uzunluktaki dizi öğelerine erişim konusunda uyarır; bu, diğer verilerin üzerine yazılmasına neden olabilir.
    • “-Warray-bounds”, “-Wformat-overflow”, “-Wrestrict”, “-Wreturn-local-addr” ve “-Wstringop-overflow” uyarıları, sınır dışı durumların sayısını artırmak için genişletildi bunlar ele alınır.
  • UCN gösterimi (\uNNNN veya \UNNNNNNNN) yerine geçerli kodlamayı (varsayılan olarak UTF-8) kullanarak tanımlayıcılardaki geniş karakterleri doğrudan belirtme yeteneği uygulandı. Örneğin:

    statik sabit int π = 3;
    int get_naïve_pi() {
    π'yi döndür;
    }

  • C dili için, C2X standardı dahilinde geliştirilen yeni özelliklerin bir kısmı uygulanmıştır (-std=c2x ve -std=gnu2x belirtilerek etkinleştirilmiştir): niteliklerin tanımlanması için aşağıdaki gibi “[[]]” sözdizimi desteği ortaya çıkmıştır: C++ (örneğin, [[gnu ::const]], [[deprecated]], [[fallthrough]] ve [[maybe_unused]]. Sabitleri UTF-8 karakterleriyle tanımlamak için "u8" sözdizimi desteği eklendi.
    Yeni makrolar eklendi . strftime'a "%OB" ve "%Ob" değişiklikleri eklendi.

  • C için varsayılan mod "-fno-common"dur ve bu, bazı platformlarda global değişkenlere daha verimli erişime olanak tanır.
  • C++ için C++16 standardında geliştirilen yaklaşık 20 değişiklik ve yenilik uygulanmıştır. Eklenen “continit” anahtar sözcüğü dahil
    ve şablon uzantıları için destek uygulandı "kavram". 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.

  • G++ constexpr aracılığıyla sabit nesnelerin değiştirilmesinden kaynaklanan tanımsız davranışların tespit edilmesini sağlar. Constexpr hesaplanırken derleyicinin bellek tüketimi azaltıldı. Yeni uyarılar "-Wmismatched-tags" ve "-Wredundant-tags" eklendi.
  • Yeni komut satırı seçenekleri önerildi:
    • Gereksiz "yeni" ve "sil" operatör çiftlerini kaldırmak için "-fallocation-dce".
    • Eğitim çalıştırması olmayan kod için boyut optimizasyonunu devre dışı bırakmak için "-fprofile-partial-training".
    • "-fprofile-profilin tekrarlanabilirlik düzeyini kontrol etmek için tekrarlanabilir.
    • Ayrı profil oluşturmak için kullanılan temel kaynak derleme dizinini tanımlamak için "-fprofile-prefix-path" ("-fprofile-generate=profile_dir" ve "-fprofile-use=profile_dir" için).
  • Bahsedilen seçeneklere ait uyarı metninde bu seçeneklere ait dokümantasyona gitmenizi sağlayan köprüler bulunmaktadır. URL değişimi "-fdiagnostics-urls" seçeneği kullanılarak kontrol edilir.
  • Önişlemci operatörü eklendi "__has_builtin", yerleşik işlevleri kontrol etmek için kullanılabilir.
  • ISO/IEC TS 18661 spesifikasyonunda tanımlanan yuvarlama işlevinin uygulanmasıyla yeni bir yerleşik işlev "__builtin_roundeven" eklendi; "yuvarlak"a benzer, ancak yuvarlama kısmı 0.5'ten büyük (daha büyük bir değere), 0.5'ten küçük - aşağı (sıfıra) ve 0.5'e eşit - sondan bir önceki rakamın paritesinden başlayarak.
  • AArch64 mimarisi için, SVE2 uzantısı desteği eklendi ve yerleşik SVE ACLE işlevleri ve türleri için eklenen destek ve vektörleştirme kullanımı da dahil olmak üzere SVE (Ölçeklenebilir Vektör Uzantısı) desteği iyileştirildi. LSE (Büyük Sistem Uzantıları) ve TME (İşlemsel Bellek Uzantısı) desteği genişletildi. Armv8.5-A ve Armv8.6-A'da önerilen yeni talimatlar eklendi; bunlar arasında rastgele sayı oluşturma, yuvarlama, bellek etiketi bağlama,
    bfloat16 ve matris çarpımı. İşlemci desteği eklendi
    Kol Cortex-A77,
    Kol Cortex-A76AE,
    Kol Cortex-A65,
    Kol Cortex-A65AE,
    Kol Cortex-A34 ve
    Marvell ThunderX3.

  • ARM32 için ABI FDPIC (64 bit işlev işaretçileri) desteği eklendi. 64 bit tamsayı işlemlerinin yeniden tasarlanması ve optimize edilmesi. CPU desteği eklendi
    Kol Cortex-A77,
    Kol Cortex-A76AE ve
    Kol Cortex-M35P. 32 bit SIMD, 16 bit çarpma, mandal aritmetiği ve diğer DSP algoritma optimizasyonları da dahil olmak üzere ACLE veri işleme talimatları için genişletilmiş destek. ACLE CDE (Özel Veri Yolu Uzantısı) talimatları için deneysel destek eklendi.

  • GCN mikro mimarisini temel alan AMD GPU'lar için arka uçta önemli ölçüde iyileştirilmiş kod oluşturma ve vektörleştirme.
  • AVR mimarisi için XMEGA benzeri cihazlara yönelik destek eklendi
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209 4808, ATmega4809 ve ATmegaXNUMX.

  • IA-32/x86-64 mimarileri için yeni bir Intel ENQCMD komut seti mimari uzantısı (-menqcmd) eklendi. Intel Cooperlake (-march=cooperlake, AVX512BF16 ISA uzantısını içerir) ve Tigerlake (-march=tigerlake, MOVDIRI, MOVDIR64B ve AVX512VP2INTERSECT ISA uzantılarını içerir) CPU'ları için destek eklendi.
  • HSA mimarisine dayalı heterojen bilgi işlem sistemleri için HSAIL'in (Heterojen Sistem Mimarisi Ara Dili) uygulanması kullanımdan kaldırılmıştır ve muhtemelen gelecekteki bir sürümde kaldırılacaktır.

Kaynak: opennet.ru

Yorum ekle