1 puan yazan GN⁺ 1 시간 전 | Henüz yorum yok. | WhatsApp'ta paylaş
  • GNU Compiler Collection’ın yeni sürümü, varsayılan C++ standardını gnu++20’ye değiştirerek C++20 uygulamasını artık deneysel görmeyen önemli bir dönüm noktası oluyor
  • C++26 reflection, contracts ve constexpr özellikleri, C++23 özellikleri ve deneysel C++23·C++26 library desteği eklendi; template hataları ile type trait constraint failure tanıları katmanlı mesajlarla daha ayrıntılı hale geldi
  • OpenMP ve OpenACC; GPU bellek ayırma, target memset ve device memcpy API’lerini genişletti; Ada, Fortran, Modula-2 ve Algol 68 front end’lerine de yeni dil özellikleri ve deneysel derleyiciler geldi
  • x86-64; AMD Zen6, Intel Wildcat Lake ve Intel Nova Lake desteği kazandı; AMD GPU, LoongArch, IBM z Systems, Solaris ve Windows tarafında da hedefe özgü özellikler ve ABI değişiklikleri eklendi
  • JSON tanı biçiminin kaldırılması, SARIF ve HTML tanılarının güçlendirilmesi, static analyzer iyileştirmeleri ve libgdiagnostics’e 37 entrypoint eklenmesiyle araç entegrasyonu ve tanı altyapısı önemli ölçüde genişledi

Uyumluluk değişiklikleri ve ortak iyileştirmeler

  • Solaris’te int8_t vb., C99 standardına uyum için signed char oldu; bu geriye dönük uyumlu olmayan bir değişiklik
  • Solaris’te -pthread seçeneği artık _REENTRANT değerini önceden tanımlamıyor
  • -fdiagnostics-format= için json biçimi kaldırıldı; makine tarafından okunabilir tanılar için SARIF kullanılmalı
  • Link-Time Optimization, -flto-toplevel-asm-heuristics ile üst düzey asm ifadelerini daha iyi ele alıyor
  • speculative devirtualization, genel dolaylı fonksiyon çağrılarını işliyor ve birden fazla hedef tahminini destekliyor
  • vectorizer, reduction için döngü içi paralelliği belirlemede daha esnek hale geldi; yineleme sayısı bilinmeyen döngüler ile uncounted loop vektörleştirmesini destekliyor
    • Ayrıca masking kullanan vector length agnostic loop’larda hizalama için peeling, mutual peeling for alignment ve early break döngülerinde vector induction hesaplamasının kaldırılmasını da destekliyor
  • GCC Command Options ve option index, daha önce eksik olan çok sayıda seçeneği içerecek şekilde düzeltildi
  • GCC-specific attributes belgeleri, GCC’nin desteklediği tüm C/C++ dialect’lerinde geçerli olan standart attribute sözdizimini daha fazla vurgulayacak şekilde modernize edildi
    • attribute materyali tekrarları azaltacak şekilde yeniden düzenlendi ve yeni bir attribute index eklendi
    • parameter ve option spec file belgeleri, GCC geliştiricileri ile özel GCC yapılandırmalarına ihtiyaç duyan kullanıcılar için GCC internals manual içine taşındı

Dillere göre başlıca değişiklikler

  • OpenMP ve OpenACC

    • OpenMP bellek ayırma desteği güçlendirildi; pinned trait allocator ve ompx_gnu_pinned_mem_alloc, kullanılabildiğinde CUDA API kullanıyor ve Nvidia GPU'larda ilgili bellek erişim performansını iyileştiriyor
    • GNU uzantısı olan ompx_gnu_managed_mem_alloc allocator ve ompx_gnu_managed_mem_space, host üzerinde device tarafından erişilebilir bellek ayırıyor
      • unified-shared memory desteklenmese bile device erişimi mümkün oluyor ve tüm host belleğinin device-accessible olduğu sistemlerde de diğer belleklerden farklı page-migration davranışı gösterebiliyor
    • OpenMP 5.0, C/C++ için sınırlı declare mapper desteği ekledi; uses_allocators clause ise OpenMP 5.2 söz dizimi değişikliklerini ve OpenMP 6.0 semicolon desteğini de içeriyor
    • OpenMP 5.1, C/C++ için map clause ve target update construct içindeki iterator modifier'a ilk desteği ekliyor
    • OpenMP 5.2, C/C++ için begin declare variant directive desteği sunuyor
    • OpenMP 6.0, omp_target_memset ve omp_target_memset_async API routine'lerini ekledi; ayrıca no_openmp_constructs assumptions clause da kullanılabiliyor
    • OpenMP 5.0, 5.1 ve 5.2'de deprecated olan directive ve clause'lar varsayılan olarak deprecation warning üretir; bu davranış -Wno-deprecated-openmp ile kapatılabilir
      • deprecated named constant veya API routine kullanıldığında da warning verilir; bu da -Wno-deprecated-declarations ile kapatılabilir
    • OpenACC, C/C++/Fortran için acc_memcpy_device ve acc_memcpy_device_async API routine'lerini ekledi
    • OpenACC 3.0'ın wait directive'i if clause alabiliyor; OpenACC 3.3'ün Fortran API routine'leri acc_attach ve acc_detach, OpenACC 2.6 C/C++ karşılıklarını tamamlıyor
    • OpenACC 3.4'te Fortran data clause içinde named constant PARAMETER kullanımı hem spesifikasyonda hem de GCC'de izinli, ancak GCC'de derleme zamanı ve çalışma zamanı davranışını etkilemiyor
  • Ada, Fortran, Modula-2, Algol 68

    • Ada GNAT uzantılarına Constructor ve Destructor eklendi; böylece standart Ada'dan oldukça farklı bir construction/finalization mekanizması sağlanıyor
    • Ada için Implicit with, Structural Generic instantiation ve Extended_Access aspect'leri eklendi
      • Extended_Access, unconstrained array subtype'ını işaret eden general access type declaration üzerinde belirtilebiliyor; pointer representation'ı değiştiriyor ve Ada'nın ayırmadığı belleğin foreign language ile birlikte kullanılmasını kolaylaştırıyor
    • Ada, -gnatd_V veya verbose mode'daki -gnatd_W ile derleyici hata ayıklaması için VAST kullanabiliyor; ayrıca Ada 2022 Reduction Expressions semantic analysis, Ada.Containers.Bounded_Indefinite_Holders, accessibility rule uygulaması ve Android desteği iyileştirildi
    • Fortran, single node machine üzerinde native shared memory multithreading kullanan coarray'leri ve Fortran 2018 TEAM özelliğini ele alıyor
    • Fortran 2003 Parameterized Derived Types desteği iyileştirildi ve LEN parameter işleme çalışıyor, ancak PR82649 nedeniyle gelecekte representation değişikliği gerekiyor
    • Fortran 2018, IMPORT statement genişletmeleri, REDUCE intrinsic ve yeni GENERIC statement desteği sunuyor
    • Fortran 2023, sinpi gibi ek trigonometrik fonksiyonları, split intrinsic subroutine'ini ve opsiyonel lower bound argümanı alabilen c_f_pointer desteğini getiriyor
    • -fexternal-blas64 seçeneği, MATMUL içinde 64-bit integer argümanlarla external BLAS routine çağırır; yalnızca 64-bit sistemlerde ve -ffrontend-optimize etkin olduğunda geçerlidir
    • Modula-2, import list, module name ve nested scope symbol işleme sırasında spelling hint veriyor; ayrıca yeni bir wide set uygulaması ve M2WIDESET library module'ü sunuyor
      • wide set değişikliği ABI'yi değiştiriyor ve önceki GCC sürümlerinden object file'larla link-time error oluşturabiliyor
    • Modula-2'nin varsayılan library'sine BinDict binary dictionary module'ü eklendi; çeşitli module'lere Write ve WriteLn procedure'leri sağlandı ve -fm2-pathname-root= seçeneğiyle external library module erişimi iyileştirildi
    • GCC, deneysel Algol 68 derleyicisi ga68'i içeriyor ve Revised Report ile IFIP WG2.1 Algol 68 Support alt komitesince onaylanan errata'yı uygulamayı hedefliyor
      • Bazı GNU extension'ları ve POSIX prelude da uygulanıyor; dil bilgisi için Algol 68 website, front end bilgisi için wiki incelenebilir

C++ ve libstdc++

  • C++ derlemesinin varsayılan dil sürümü -std=gnu++17 yerine -std=gnu++20 oldu
    • Önceki C++ standartlarına bağımlı kodların build flag’ine -std= eklemesi veya kodu port etmesi gerekiyor; ayrıntılar için porting notes bölümüne bakın
    • C++20 modules desteği hâlâ experimental ve -fmodules ile etkinleştirilmeli
  • C++26 özellikleri arasında reflection, annotations for reflection, base class subobject splicing, function parameter reflection, contracts, constexpr exceptions, constexpr virtual inheritance gibi birçok özellik implemente edildi
    • P2996R13 Reflection -std=c++26 -freflection ile etkinleştiriliyor
    • P2686R4 için kısmi destek var; structured binding constexpr olabilir, ancak constexpr automatic variable referanslarına henüz izin verilmiyor
  • C++23 özelliklerinden P2036R3, P2590R2 ve P2246R1 implemente edildi
  • C++ hata mesajları, template ile ilgili sorunlar gibi durumlarda artık hiyerarşik bir yapı kullanıyor; message nesting, girinti ve bullet point’lerle gösteriliyor
  • experimental C++20 modules desteği, source file derlenmeden önce <bits/stdc++.h> header unit’i ile std ve std.compat module’larını build etmek için --compile-std-module seçeneğini ekliyor
    • <bits/stdc++.h> header unit’i build edilmişse, import edilebilir standard library header’larının #include kullanımları şeffaf biçimde <bits/stdc++.h> import’una dönüştürülüyor
    • Bildirilen birçok bug düzeltildi
  • Standard library type trait’lerindeki constraint failure diagnostics, is_constructible_v, is_invocable_v gibi trait’lerin neden false döndüğünü daha ayrıntılı açıklıyor
  • libstdc++ içinde 128-bit integer destekleyen target’larda std::is_integral<__int128> ve benzeri trait’ler artık her zaman true oluyor
    • Önceden GNU dialect’te true iken strict dialect’te böyle değildi
  • P0952R2: A new specification for std::generate_canonical, C++11 sonrası etkilenen tüm mode’larda implemente edildi ve gözlemlenen output’u etkiliyor
    • Eski davranış _GLIBCXX_USE_OLD_GENERATE_CANONICAL tanımıyla geri getirilebilir
  • std::variant ABI’si, C++20 ve üzeri mode’larla tutarlı olacak şekilde güncellendi ve belirli C++17 mode class layout’larını etkiliyor
    • Eski davranış _GLIBCXX_USE_VARIANT_CXX17_OLD_ABI tanımıyla geri getirilebilir; etki yalnızca C++17 mode için geçerli
  • std::regex execution, system stack yerine heap-based stack kullanacak şekilde yeniden yazıldı; böylece daha büyük string matching işlemlerinde stack overflow önleniyor
  • C++20 implementasyonu artık experimental değil ve Windows üzerinde std::chrono::current_zone() çalışıyor
  • GCC 16 öncesindeki C++20 desteği experimental olduğundan, C++20 bileşenlerini kullanan programların older release’lerle uyumlu olmadığı varsayılmalı
    • ABI değişiklikleri arasında <atomic> waiting/notifying function’ları, <semaphore> semaphore türü, <syncstream> synchronization, std::format args ve std::formatter representation’ı, <compare> içindeki std::partial_ordering ve bazı <ranges> adaptor representation’ları yer alıyor
  • experimental C++23 library desteği; std::mdspan, ranges::starts_with, ranges::ends_with, ranges::shift_left, ranges::shift_right ve std::allocator_traits::allocate_at_least özelliklerini içeriyor
  • experimental C++26 library desteği; std::simd, std::inplace_vector, std::optional<T&>, std::copyable_function, std::function_ref, std::indirect, std::polymorphic, shared pointer için std::owner_equal ve <debugging> header’ını içeriyor

Hedef ve işletim sistemi desteği

  • IA-32/x86-64

    • AMD Zen6 tabanlı CPU'lar -march=znver6 ile destekleniyor ve Zen5'te etkin olan ISA extension'larının üzerine AVX512_BMM, AVX_NE_CONVERT, AVX_IFMA, AVX_VNNI_INT8, AVX512_FP16 etkinleştiriliyor
    • AVX512 desteği açıkken ve znver4, znver5, znver6 tuning kullanıldığında, auto-vectorization code size'ı azaltmak ve performansı iyileştirmek için masked vector epilog kullanımını deniyor
    • Intel Wildcat Lake -march=wildcatlake, Intel Nova Lake ise -march=novalake ile destekleniyor
      • -march=novalake, Panther Lake tabanlı ISA extension'larına ek olarak APX_F, AVX10.1, AVX10.2, PREFETCHI'yi etkinleştiriyor
    • GCC 16'dan itibaren çeşitli -march= switch'lerinde AMX-TRANSPOSE, USER_MSR, CLDEMOTE, KL, WIDEKL, PREFETCHI etkinleştirmesi kaldırıldı
    • -mavx10.1-256, -mavx10.1-512, -mevex512 kaldırıldı; -mavx10.1 behavior change warning de birlikte ortadan kalktı
    • AMX-TRANSPOSE desteği GCC 16'da kaldırıldı ve GCC artık -mamx-transpose seçeneğini kabul etmiyor
    • Yeni --enable-x86-64-mfentry configure seçeneği, x86-64 profillemede mcount yerine __fentry__ kullanan -mfentry'yi etkinleştiriyor; glibc hedeflerinde varsayılan olarak açık geliyor
    • --enable-tls=DIALECT, varsayılan TLS dialect kontrolünü destekliyor; varsayılan değer gnu, izin verilen değerler ise gnu ve TLS descriptor için gnu2
  • AMD GPU, LoongArch, IBM z Systems

    • AMD GPU offloading'de OpenMP target region ve OpenACC compute region başlatma ek yükü önemli ölçüde azaltıldı
    • AMD Instinct MI300 gfx942 cihazı için deneysel destek eklendi; buna generic gfx9-4-generic ile büyük ölçüde uyumlu gfx950 de dahil
    • AMD GPU varsayılan multilib build set'i gfx908, gfx90a, gfx9-generic, gfx9-4-generic, gfx10-3-generic, gfx11-generic olarak değiştirildi
      • Generic arch varsa, specific device için multilib artık varsayılan olarak derlenmiyor
      • Generic architecture, ROCm 6.4.0 ve üzerini gerektiriyor
      • Yeni varsayılan multilib set'i, LLVM 20 ve üzeri assembler ile linker gerektiriyor
      • GCC'nin AMD kurulum notlarına ve yapılandırma notlarına bakın
    • LoongArch, _BitInt (N) ve unsigned _BitInt (N) gibi bit hassasiyetli tamsayı türlerini destekliyor
    • LoongArch, CPU özelliğine göre function version oluşturup çalışma anında en uygun sürümü otomatik seçen Function Multi-Versioning'i target_clones attribute'u ile destekliyor
    • LoongArch32 architecture desteği eklendi; buna varsayılan ilp32d ABI ile ilp32f ve ilp32s ABI'leri de dahil
      • Standart 32-bit sürüm LA32 ile azaltılmış 32-bit sürüm LA32R'nin ikisini de kapsıyor ve embedded uygulamalar için 32-bit target code üretimini mümkün kılıyor
      • Bu özellik Binutils ve glibc desteğine bağlı
    • S/390, System z ve IBM z Systems, bit hassasiyetli tamsayı türleri ile _Float16 floating-point türünü destekliyor
      • _Float16 işlemleri yazılımla veya float instruction'larıyla gerçekleştiriliyor
    • S/390 ailesine, Linux kernel'in canary address loading runtime patching desteği için -mstack-protector-guard=global ile global stack protector eklendi; ayrıca -mstack-protector-guard-record da eklendi
    • S/390 ailesindeki -m31 desteği deprecated oldu ve gelecekteki bir sürümde kaldırılacak
  • İşletim sistemi

    • Solaris, -gsctf seçeneğiyle Solaris CTF yani Compact C Type Format üretimini kolayca destekliyor
    • Windows, native TLS yani Thread-Local Storage desteği sunuyor
      • Etkinleştirmek için configure sırasında --enable-tls belirtilmesi ve GNU binutils 2.44 veya üzeri gerekiyor

Tanılama, eklentiler, statik analiz

  • GCC, -fdiagnostics-add-output=experimental-html ile HTML biçiminde tanılama çıktısını destekliyor
  • SARIF çıktısı dump directory ayarını takip ediyor; build-dir/foo.o çıktı örneğinde GCC 16, SARIF'i build-dir/foo.c.sarif dosyasına yazıyor
    • GCC 15 aynı örnekte foo.c.sarif dosyasına yazıyordu
  • SARIF çıktısı logical location nesting'i yakalıyor ve birçok durumda fix object'i içinde description property'sini içeriyor
  • SARIF threadFlowLocation öğesinin kinds property alanı, standart dışı control flow gösterimi için yeni olarak throw, catch, unwind, setjmp, longjmp değerlerini kazanıyor
  • GCC diagnostics, directed graph bağlayabiliyor ve global directed graph da raporlayabiliyor
    • graph, text sink içinde yok sayılıyor ancak SARIF sink içinde yakalanıyor; experimental-html ise bunu dot kullanarak SVG tabanlı olarak render ediyor
    • SARIF veya HTML diagnostic sink üzerinde cfgs=yes ayarlanırsa, tüm optimization pass'lerdeki tüm function'lar için GCC intermediate representation yakalama özelliği etkinleşiyor
  • GCC diagnostics, XML ve JSON dosyaları içindeki logical location'lara referans verebiliyor
    • sarif-replay aracı bunu kullanarak SARIF input issue raporlamasında JSON pointer sağlıyor
  • GCC_DIAGNOSTICS_LOG environment içinde ayarlanırsa, diagnostic subsystem stderr'e veya adlandırılmış bir dosyaya metin günlük çıktısı veriyor
    • Bu, tanılamaların tam olarak ne zaman ve neden reddedildiği gibi iç kararların izlenmesi için kullanılıyor
  • EXPERIMENTAL_SARIF_SOCKET environment içinde ayarlanırsa, GCC başlangıçta bu socket'e bağlanmayı deniyor ve oluşan her tanılama için JSON-RPC notification gönderiyor
  • Eklenti geliştiricileri için, loosely-coupled sender ve receiver arasında strongly-typed message ileten bir publish/subscribe framework eklendi
    • Bu sürümde eklentilerin subscribe olabildiği topic'ler yalnızca belirli function'ların optimization pass başlangıç/duruş event'leri ve static analyzer ile ilgili event'ler
  • GCC diagnostic sink, finalizer hook'una sahip bir extension object'ine sahip olabiliyor; eklentiler bunu SARIF output file içine ek bilgi yakalamak için kullanabiliyor
  • GCC 16'da diagnostic machinery büyük ölçüde yeniden düzenlendi ve yalnızca diagnostic-core.h kullanan eklentilerin etkilenmemesi gerekiyor
    • Tanılamaları daha karmaşık kullanan eklenti bakımcılarının porting guide belgesine bakması gerekiyor
  • Static analyzer, C++ Named Return Value Optimization ve exception için ilk desteği ele alıyor; böylece basit C++ örneklerinde kullanılabiliyor
    • Ancak ölçeklenme sorunları nedeniyle bu sürümde production C++ kodunda kullanılması muhtemelen zor
  • -fanalyzer, -fexceptions etkin olduğunda nothrow attribute'u olmayan external function call'ların exception fırlatabileceğini varsayıyor
    • Yeni -fanalyzer-assume-nothrow seçeneği bu varsayımı devre dışı bırakıyor
    • Bu, C++ birlikte çalışabilirliği için C kodunda -fexceptions kullanan ancak kullanılan C API'sinin exception fırlatma olasılığı düşük olan projelerde uyarı artışını önlemek için tasarlandı
  • -fanalyzer için user code representation veri yapıları, anlaşılmasını ve debugging'i kolaylaştırmak için yeniden yazıldı; diagnostic location da bir miktar iyileştirildi
    • Buna karşılık analyzer'ın memory usage'ı arttı
  • -fanalyzer içindeki memory contents simulation veri yapıları yeniden uygulandı; böylece daha hızlı ve bakımı daha kolay hale geldi
  • analyzer, GCC'nin value_range machinery'sini kullanmaya başlayarak bazı false positive'leri ortadan kaldırıyor

libgdiagnostics ve düzeltilen sorunlar

Henüz yorum yok.

Henüz yorum yok.