GCC 16 yayımlandı
(gcc.gnu.org)- 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_tvb., C99 standardına uyum içinsigned charoldu; bu geriye dönük uyumlu olmayan bir değişiklik- Ayrıntılar için Porting to GCC 16 içindeki Solaris bölümü
- Solaris’te
-pthreadseçeneği artık_REENTRANTdeğerini önceden tanımlamıyor- Ayrıntılar için Porting to GCC 16 içindeki Solaris bölümü
-fdiagnostics-format=içinjsonbiçimi kaldırıldı; makine tarafından okunabilir tanılar için SARIF kullanılmalı- Link-Time Optimization,
-flto-toplevel-asm-heuristicsile ü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;
pinnedtrait allocator veompx_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_allocallocator veompx_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 mapperdesteği ekledi;uses_allocatorsclause 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 updateconstruct içindekiiteratormodifier'a ilk desteği ekliyor - OpenMP 5.2, C/C++ için
begin declare variantdirective desteği sunuyor - OpenMP 6.0,
omp_target_memsetveomp_target_memset_asyncAPI routine'lerini ekledi; ayrıcano_openmp_constructsassumptions 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-openmpile kapatılabilir- deprecated named constant veya API routine kullanıldığında da warning verilir; bu da
-Wno-deprecated-declarationsile kapatılabilir
- deprecated named constant veya API routine kullanıldığında da warning verilir; bu da
- OpenACC, C/C++/Fortran için
acc_memcpy_deviceveacc_memcpy_device_asyncAPI routine'lerini ekledi - OpenACC 3.0'ın
waitdirective'iifclause alabiliyor; OpenACC 3.3'ün Fortran API routine'leriacc_attachveacc_detach, OpenACC 2.6 C/C++ karşılıklarını tamamlıyor - OpenACC 3.4'te Fortran data clause içinde named constant
PARAMETERkullanımı hem spesifikasyonda hem de GCC'de izinli, ancak GCC'de derleme zamanı ve çalışma zamanı davranışını etkilemiyor
- OpenMP bellek ayırma desteği güçlendirildi;
-
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_Vveya verbose mode'daki-gnatd_Wile 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,
IMPORTstatement genişletmeleri,REDUCEintrinsic ve yeniGENERICstatement desteği sunuyor - Fortran 2023,
sinpigibi ek trigonometrik fonksiyonları,splitintrinsic subroutine'ini ve opsiyonel lower bound argümanı alabilenc_f_pointerdesteğini getiriyor -fexternal-blas64seçeneği,MATMULiçinde 64-bit integer argümanlarla external BLAS routine çağırır; yalnızca 64-bit sistemlerde ve-ffrontend-optimizeetkin 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
M2WIDESETlibrary 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
BinDictbinary dictionary module'ü eklendi; çeşitli module'lereWriteveWriteLnprocedure'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 -freflectionile etkinleştiriliyor - P2686R4 için kısmi destek var; structured binding
constexprolabilir, ancakconstexprautomatic variable referanslarına henüz izin verilmiyor
- P2996R13 Reflection
- 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
- Eski davranış
-fno-diagnostics-show-nestingveya-fdiagnostics-plain-outputile geri getirilebilir
- Eski davranış
- experimental C++20 modules desteği, source file derlenmeden önce
<bits/stdc++.h>header unit’i ilestdvestd.compatmodule’larını build etmek için--compile-std-moduleseçeneğini ekliyor<bits/stdc++.h>header unit’i build edilmişse, import edilebilir standard library header’larının#includekullanı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_vgibi trait’lerin nedenfalsedö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_CANONICALtanımıyla geri getirilebilir
- Eski davranış
std::variantABI’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_ABItanımıyla geri getirilebilir; etki yalnızca C++17 mode için geçerli
- Eski davranış
std::regexexecution, 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::formatargs vestd::formatterrepresentation’ı,<compare>içindekistd::partial_orderingve bazı<ranges>adaptor representation’ları yer alıyor
- ABI değişiklikleri arasında
- experimental C++23 library desteği;
std::mdspan,ranges::starts_with,ranges::ends_with,ranges::shift_left,ranges::shift_rightvestd::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çinstd::owner_equalve<debugging>header’ını içeriyor
Hedef ve işletim sistemi desteği
-
IA-32/x86-64
- AMD Zen6 tabanlı CPU'lar
-march=znver6ile 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,znver6tuning 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=novalakeile 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,-mevex512kaldırıldı;-mavx10.1behavior change warning de birlikte ortadan kalktı- AMX-TRANSPOSE desteği GCC 16'da kaldırıldı ve GCC artık
-mamx-transposeseçeneğini kabul etmiyor - Yeni
--enable-x86-64-mfentryconfigure seçeneği, x86-64 profillemedemcountyerine__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ğergnu, izin verilen değerler isegnuve TLS descriptor içingnu2
- AMD Zen6 tabanlı CPU'lar
-
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
gfx942cihazı için deneysel destek eklendi; buna genericgfx9-4-genericile büyük ölçüde uyumlugfx950de dahil - AMD GPU varsayılan multilib build set'i
gfx908,gfx90a,gfx9-generic,gfx9-4-generic,gfx10-3-generic,gfx11-genericolarak 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)veunsigned _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_clonesattribute'u ile destekliyor - LoongArch32 architecture desteği eklendi; buna varsayılan
ilp32dABI ileilp32fveilp32sABI'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
_Float16floating-point türünü destekliyor_Float16işlemleri yazılımla veyafloatinstruction'larıyla gerçekleştiriliyor
- S/390 ailesine, Linux kernel'in canary address loading runtime patching desteği için
-mstack-protector-guard=globalile global stack protector eklendi; ayrıca-mstack-protector-guard-recordda eklendi - S/390 ailesindeki
-m31desteği deprecated oldu ve gelecekteki bir sürümde kaldırılacak
-
İşletim sistemi
- Solaris,
-gsctfseç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-tlsbelirtilmesi ve GNU binutils 2.44 veya üzeri gerekiyor
- Etkinleştirmek için configure sırasında
- Solaris,
Tanılama, eklentiler, statik analiz
- GCC,
-fdiagnostics-add-output=experimental-htmlile 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'ibuild-dir/foo.c.sarifdosyasına yazıyor- GCC 15 aynı örnekte
foo.c.sarifdosyasına yazıyordu
- GCC 15 aynı örnekte
- SARIF çıktısı logical location nesting'i yakalıyor ve birçok durumda
fixobject'i içindedescriptionproperty'sini içeriyor - SARIF
threadFlowLocationöğesininkindsproperty alanı, standart dışı control flow gösterimi için yeni olarakthrow,catch,unwind,setjmp,longjmpdeğ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-htmlise bunu dot kullanarak SVG tabanlı olarak render ediyor - SARIF veya HTML diagnostic sink üzerinde
cfgs=yesayarlanırsa, tüm optimization pass'lerdeki tüm function'lar için GCC intermediate representation yakalama özelliği etkinleşiyor
- graph, text sink içinde yok sayılıyor ancak SARIF sink içinde yakalanıyor;
- GCC diagnostics, XML ve JSON dosyaları içindeki logical location'lara referans verebiliyor
sarif-replayaracı bunu kullanarak SARIF input issue raporlamasında JSON pointer sağlıyor
GCC_DIAGNOSTICS_LOGenvironment 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_SOCKETenvironment 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,
finalizerhook'una sahip birextensionobject'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.hkullanan 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,-fexceptionsetkin olduğundanothrowattribute'u olmayan external function call'ların exception fırlatabileceğini varsayıyor- Yeni
-fanalyzer-assume-nothrowseçeneği bu varsayımı devre dışı bırakıyor - Bu, C++ birlikte çalışabilirliği için C kodunda
-fexceptionskullanan ancak kullanılan C API'sinin exception fırlatma olasılığı düşük olan projelerde uyarı artışını önlemek için tasarlandı
- Yeni
-fanalyzeriç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ı
-fanalyzeriç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_rangemachinery'sini kullanmaya başlayarak bazı false positive'leri ortadan kaldırıyor
libgdiagnostics ve düzeltilen sorunlar
- libgdiagnostics toplam 37 yeni entrypoint kazandı
- mantıksal konumlarla çalışmak için 5 entrypoint eklendi
- komut satırı seçenekleri ve SARIF playback desteği için 2 entrypoint eklendi
- yönlendirilmiş grafiklerle çalışmak için 12 entrypoint eklendi; bunlar grafik oluşturmayı, global grafik aktarmayı, diagnostic grafiği bağlamayı, node ve edge ekleme/sorgulamayı ve node label ile location ayarlamayı destekliyor
- diagnostic metnini bir buffer içinde oluşturmak için 17 entrypoint eklendi
- message buffer oluşturma/serbest bırakma, string/text/byte/printf append, event id append, URL/quote/color aralıklarını işleme, dump, buffer tabanlı diagnostic finish ve location label/event eklemeyi içeriyor
diagnostic_manager_set_debug_physical_locations()de eklendi- GCC bug tracking system'de 16.1 sürümü için fixed olarak işaretlenen problem report listesi PR list üzerinden görülebilir
- bu liste eksiksiz olmayabilir ve düzeltilen bazı PR'ler yer almıyor olabilir
Henüz yorum yok.