Altı aylık geliştirme sürecinin ardından LLVM 22.1.0 yayınlandı. Bu sürüm, programları RISC benzeri sanal talimatların (çok seviyeli optimizasyon sistemine sahip düşük seviyeli bir sanal makine) ara bit koduna derleyen araçlar (derleyiciler, optimize ediciler ve kod üreteçleri) geliştiriyor. Üretilen sözde kod, belirli bir hedef platform için makine koduna dönüştürülebilir veya program yürütülmesi sırasında doğrudan makine talimatları üretmek için anlık (JIT) bir derleyici tarafından kullanılabilir. LLVM teknolojilerine dayalı olarak, proje C, C++ ve Objective-C programlama dillerini destekleyen Clang derleyicisini geliştiriyor. 18.x dalından başlayarak, proje yeni bir sürüm numaralandırma şemasına geçti; buna göre geliştirme sırasında 0 ("N.0") sürümü kullanılırken, ilk kararlı sürüm "N.1" olarak numaralandırılıyor.
Clang 22'daki iyileştirmeler şunları içerir:
- `malloc` gibi fonksiyonlar kullanılarak gerçekleştirilen bellek ayırma işlemlerini benzersiz bir tanımlayıcıyla işaretlemek için bellek ayırma belirteçleri (Allocation Tokens) desteği eklendi. Ayırma belirteçleri, yığın bilgilerini yapılandırmaya, bellek sızıntısı tespitini basitleştirmeye ve nesnelerin amaçlarına veya değiştirme modellerine göre gruplandırılmasına (örneğin, "sıcak" verileri "soğuk" verilerden ayırmaya) olanak tanır. Etkinleştirmek için "-fsanitize=alloc-token" bayrağını kullanın.
- C diline ilişkin özellikler:
- Geçerli kapsam sona erdiğinde eylemlerin yürütülmesine olanak tanıyan "ertelemeli yürütme" mekanizmasını tanımlayan bir taslak spesifikasyon uygulanmıştır. "Ertelemeli yürütme" desteğini etkinleştirmek için "-fdefer-ts" bayrağı eklenmiştir.
- GCC'deki benzer fonksiyona paralel olarak, __builtin_stack_address() adlı yerleşik bir fonksiyon eklendi. Bu fonksiyon, __builtin_stack_address() fonksiyonunu çağıran mevcut fonksiyon ile bu fonksiyonun çağırdığı sonraki fonksiyonların yığın alanlarını ayıran yığın adresini döndürür.
- Gelecekteki C2y standardı için geliştirilmekte olan yetenekler:
- Adlandırılmış döngüler için destek eklendi; bu sayede döngülere ve switch ifadelerine ad atayabilirsiniz. Bu adlar, break ve continue ifadelerinde belirtilerek hangi döngüden çıkılacağını açıkça tanımlayabilir. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // CONT1'e git continue outer; // CONT2'ye git // CONT1 } // CONT2 }
- Benzersiz tanımlayıcı adları oluşturmak için tasarlanmış yerleşik "__COUNTER__" makrosunun uygulaması genişletildi ve standarda dahil edildi. Bu makroya 2147483647 çağrı sınırı getirildi; bu sınırın aşılması hataya neden olacaktır.
- "extern inline" olarak tanımlanmış fonksiyonların içinde statik fonksiyonlar veya değişkenler kullanıldığında verilen uyarı (-Wstatic-in-inline) kaldırıldı.
- C23 C standardında tanımlanan yetenekler:
- float.h başlık dosyası artık float, double ve long double türleri için sinyalli (aritmetik işlemlerde kullanıldığında istisna oluşturan) NaN değerlerini uygulayan FLT_SNAN, DBL_SNAN ve LDBL_SNAN makrolarını desteklemektedir.
- Aynı çeviri birimi içinde, aynı alanlara sahip farklı isimsiz türlerin uyumlu olarak değerlendirilmesine neden olan bir hata düzeltildi.
- Bağımlılık taraması sırasında eksik başlık dosyalarını yok saymak için kullanılan "-MG" bayrağı, "#embed" yönergelerine de genişletildi ve artık "#embed" yönergesinde belirtilen bir dosya eksik olduğunda "dosya bulunamadı" hatasını bastırıyor.
- C++ ile ilgili özellikler:
- C++2c (C++26) spesifikasyonunda geliştirilen "constexpr" bağlamında yapılandırılmış bağlamaları kullanma yeteneği eklendi. Bu, sabit ifadelere yapılan referansların artık kendilerinin de sabit ifadeler olabileceği anlamına gelir. Diziler ve basit yapılar için destek uygulanmıştır (tuple'lar henüz desteklenmemektedir). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- C++20 standardının gerektirdiği gibi, kısıtlamalar artık kontrol edilmeden önce standart forma dönüştürülüyor; bu da daha doğru teşhis mesajlarına ve yalnızca kavram kimliklerinde kullanılan şablon argümanlarındaki ikame hatalarının düzgün bir şekilde ele alınmasına olanak tanıyor.
- "<", ">", "<=" ve ">=" karşılaştırma operatörlerinin "<=>" operatöründen sentezlenip sentezlenmediğini bulmak için "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" adlı yerleşik fonksiyon ailesi eklendi.
- "-Wincompatible-pointer-types" parametresi, uyarı yerine hata verecek şekilde değiştirilmiştir. Önceki davranışa geri dönmek için "-Wno-error=incompatible-pointer-types" seçeneğini kullanın.
- __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter ve __builtin_dedup_pack gibi yerleşik fonksiyonlar eklendi. Örneğin, builtin_dedup_pack fonksiyonu, bir tür listesinden yinelenenleri kaldırmanıza olanak tanır: MyTypeList = TypeList<__builtin_dedup_pack kullanımıyla. …>; // Sonuç olarak elde edilen tür TypeList olacaktır.
- UBSan ile tanımsız davranışları hata ayıklarken (-fsanitize=undefined -fsanitize-trap=undefined), artık oluşturulan hata ayıklama bilgilerine hata nedeni bilgileri de dahil ediliyor. Hata bilgilerindeki ayrıntı düzeyini belirtmek için "-fsanitize-debug-trap-reasons" bayrağı eklendi. Genel açıklamalar için "basic" (örneğin, "Tamsayı toplama taşması") ve ayrıntılı bilgiler için "detailed" (örneğin, "'a + b'de işaretli tamsayı toplama taşması") olarak ayarlanabilir.
- Yeni derleyici bayrakları eklendi:
- "-f[no-]sanitize-debug-trap-reasons" seçeneği, "-fsanitize-trap" moduyla derleme yapılırken istisna yakalama nedenlerinin hata ayıklama bilgilerine eklenip eklenmeyeceğini kontrol eder.
- Bellek tahsis belirteçlerini yönetmek için "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" ve "-fsanitize-alloc-token-extended" seçenekleri kullanılır.
- "-fmatrix-memory-layout" seçeneği, matris türlerinin bellek düzenini kontrol etmek için kullanılır (örneğin, sütun öncelikli için column-major, satır öncelikli için row-major).
- Fonksiyonlar artık, malloc özniteliğine benzer ancak bir işaretçi ve bloğun boyutunu veya bloğun sonuna işaret eden bir işaretçi içeren span benzeri yapılar döndüren fonksiyonlar için geçerli olan bir "malloc_span" özniteliğine sahiptir.
- Bağlantı zamanında printf fonksiyonunun gerekli statik olarak bağlantılı uygulamasını dinamik olarak seçmek için "modular_format" özniteliği eklendi.
- Tanısal ve statik analiz araçları genişletildi, yeni kontroller eklendi (tanı ile ilgili onlarca iyileştirme).
- X86 arka ucuna SSE, AVX ve AVX512 uzantıları için ek içsel fonksiyonlar eklendi. Wildcat Lake (-march=wildcatlake) ve Nova Lake (-march=novalake) mikro mimarilerine dayalı Intel CPU'lar için derleme modları eklendi.
- AArch64 arka ucu artık Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) ve Arm C1-Ultra (c1-ultra) işlemcilerini desteklemektedir. FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] ve FCVTA[US] komutları için ek yerleşik işlevler eklendi. İşlev Çoklu Sürümleme (FMV) desteği kararlı hale getirildi. Kullanıcılar artık farklı işlev sürümlerinin önceliğini geçersiz kılabilirler.
- LoongArch32 (LA32R, LA32S) mimarisi için destek eklendi.
- ARM, AMDGPU, RISC-V, LongArch64, MIPS, WebAssembly ve PowerPC mimarileri için geliştirilmiş arka uçlar.
Kaynak: opennet.ru
