Olti oylik ishlab chiqishdan so'ng, LLVM 22.1.0 chiqarildi. U dasturlarni RISCga o'xshash virtual ko'rsatmalarning oraliq bit kodiga (ko'p darajali optimallashtirish tizimiga ega past darajadagi virtual mashina) kompilyatsiya qiladigan vositalarni (kompilyatorlar, optimizatorlar va kod generatorlari) ishlab chiqadi. Yaratilgan psevdokod berilgan maqsadli platforma uchun mashina kodiga aylantirilishi yoki dasturni bajarish paytida mashina ko'rsatmalarini to'g'ridan-to'g'ri yaratish uchun "just-in-time" (JIT) kompilyatori tomonidan ishlatilishi mumkin. LLVM texnologiyalariga asoslanib, loyiha C, C++ va Objective-C dasturlash tillarini qo'llab-quvvatlaydigan Clang kompilyatorini ishlab chiqmoqda. 18.x filialidan boshlab, loyiha yangi versiya raqamlash sxemasiga o'tdi, unga ko'ra ishlab chiqish paytida 0 ("N.0") versiyasi ishlatiladi va birinchi barqaror versiya "N.1" raqamiga ega.
Clang 22-dagi yaxshilanishlarga quyidagilar kiradi:
- Malloc kabi funksiyalar yordamida bajariladigan xotira ajratish operatsiyalarini noyob identifikator bilan belgilash uchun xotira ajratish tokenlarini (Allocation Tokens) qo'llab-quvvatlash qo'shildi. Ajratish tokenlari uyum ma'lumotlarini tuzish, xotira oqishini aniqlashni soddalashtirish va obyektlarni ularning maqsadi yoki modifikatsiya naqshlari asosida guruhlash imkonini beradi (masalan, "issiq" ma'lumotlarni "sovuq" ma'lumotlardan ajratish). Yoqish uchun "-fsanitize=alloc-token" bayrog'idan foydalaning.
- C tiliga tegishli xususiyatlar:
- Joriy doiradan chiqqanda amallarni bajarishga imkon beruvchi "kechiktirish" kechiktirilgan ijro mexanizmini belgilovchi loyiha spetsifikatsiyasi joriy etildi. "Kechiktirish" qo'llab-quvvatlashini yoqish uchun "-fdefer-ts" bayrog'i qo'shildi.
- GCCdagi shunga o'xshash funksiyani aks ettiruvchi o'rnatilgan __builtin_stack_address() funksiyasi qo'shildi. Bu funksiya __builtin_stack_address() deb nomlangan joriy funksiyaning va u chaqiradigan keyingi funksiyalarning stek maydonini ajratib turuvchi stek manzilini qaytaradi.
- Kelajakdagi C2y standarti uchun ishlab chiqilayotgan imkoniyatlar:
- Nomlangan sikllar uchun qo'llab-quvvatlash qo'shildi, bu sizga sikllarga nomlar berish va switch operatorlarini qo'llash imkonini beradi, ular break va continue operatorlarida ko'rsatilishi mumkin, bu esa sikldan chiqishni aniq belgilash uchun amalga oshiriladi. outer: for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // go to CONT1 continue outer; // go to CONT2 // CONT1 } // CONT2 }
- Noyob identifikator nomlarini yaratish uchun mo'ljallangan o'rnatilgan "__COUNTER__" makrosining joriy etilishi kengaytirildi va standartga kiritildi. Ushbu makroga 2147483647 ta chaqiruv chegarasi o'rnatildi; bu chegaradan oshib ketish xatolikka olib keladi.
- "extern inline" deb e'lon qilingan funksiyalar ichidagi statik funksiyalar yoki o'zgaruvchilardan foydalanilganda ogohlantirish (-Wstatic-in-line) olib tashlandi.
- C23 C standartida belgilangan imkoniyatlar:
- float.h sarlavha fayli endi FLT_SNAN, DBL_SNAN va LDBL_SNAN makroslarini qo'llab-quvvatlaydi, ular float, double va long double turlari uchun signallangan (arifmetik amallarda ishlatilganda istisno keltirib chiqaradigan) NaN qiymatlarini amalga oshiradi.
- Turli nomlanmagan turlar, agar ular bir xil maydonlarga ega bo'lsa, bir xil tarjima birligida mos keladigan deb hisoblangan xato tuzatildi.
- Bog'liqlikni skanerlash paytida yo'qolgan sarlavha fayllarini e'tiborsiz qoldirish uchun ishlatiladigan "-MG" bayrog'i "#embed" direktivalariga kengaytirildi va endi "#embed" direktivasida ko'rsatilgan fayl yo'q bo'lganda "fayl topilmadi" xatosini bostiradi.
- C++ bilan bog'liq xususiyatlar:
- C++2c (C++26) spetsifikatsiyasida ishlab chiqilganidek, "constexpr" kontekstida strukturaviy bog'lanishlardan foydalanish imkoniyati qo'shildi. Bu shuni anglatadiki, endi doimiy ifodalarga havolalar o'zlari doimiy ifodalar bo'lishi mumkin. Qo'llab-quvvatlash massivlar va oddiy tuzilmalar uchun amalga oshiriladi (kortejlar hali qo'llab-quvvatlanmaydi). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
- C++20 standarti talab qilganidek, cheklovlar endi tekshirilishidan oldin standart shaklga o'tkaziladi, bu esa aniqroq diagnostika xabarlarini olish va faqat kontsept-idlarda ishlatiladigan shablon argumentlaridagi almashtirish xatolarini to'g'ri hal qilish imkonini beradi.
- Taqqoslash operatorlari "<", ">", "<=" va ">=" ning "<=>" operatoridan sintez qilinganligini aniqlash uchun o'rnatilgan "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" funksiyalar oilasi qo'shildi.
- "-Wincompatible-pointer-types" parametri ogohlantirish o'rniga xatolik haqida xabar berish uchun o'zgartirildi. Avvalgi holatga qaytish uchun "-Wno-error=incompatible-pointer-types" parametridan foydalaning.
- O'rnatilgan funksiyalar qo'shildi: __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 va __builtin_dedup_pack. Masalan, builtin_dedup_pack sizga turlar ro'yxatidan dublikatlarni olib tashlash imkonini beradi: MyTypeList = TypeList<__builtin_dedup_pack yordamida. β¦>; // natijada olingan tur TypeList bo'ladi
- UBSan yordamida aniqlanmagan xatti-harakatlarni tuzatishda (-fsanitize=undefined -fsanitize-trap=undefined), xato sababi haqidagi ma'lumot endi yaratilgan tuzatish ma'lumotlariga kiritiladi. Xato haqidagi ma'lumotlarning batafsil darajasini belgilash uchun "-fsanitize-debug-trap-reasons" bayrog'i qo'shildi. Uni umumiy tavsiflar uchun "asosiy" ga (masalan, "Butun son qo'shilishi toshib ketdi") va batafsil ma'lumotlarni kiritish uchun "batafsil" ga (masalan, "'a + b' da imzolangan butun son qo'shilishi toshib ketdi") o'rnatish mumkin.
- Yangi kompilyator bayroqlari qo'shildi:
- "-f[no-]sanitize-debug-trap-reasons" "-fsanitize-trap" rejimida kompilyatsiya qilishda nosozlik ma'lumotlariga istisno tuzoq sabablari kiritilganligini boshqarish uchun.
- Xotira ajratish tokenlarini boshqarish uchun "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" va "-fsanitize-alloc-token-extended" buyruqlari qo'llaniladi.
- Matritsa turlarining xotira tartibini boshqarish uchun "-fmatrix-memory-layout" (masalan, ustun-katta uchun ustun-katta, qator-katta uchun qator-katta).
- Endi funksiyalar malloc atributiga o'xshash "malloc_span" atributiga ega, ammo blokning oxiriga o'lcham yoki ko'rsatkichga ega ko'rsatkich va maydonni o'z ichiga olgan spanga o'xshash tuzilmalarni qaytaradigan funksiyalarga tegishli.
- Bog'lanish vaqtida printf funktsiyasining kerakli statik bog'langan amalga oshirilishini dinamik ravishda tanlash uchun "modular_format" atributi qo'shildi.
- Diagnostika va statik tahlil vositalari kengaytirildi, yangi tekshiruvlar qo'shildi (diagnostika bilan bog'liq bir necha o'nlab yaxshilanishlar).
- X86 orqa tomoniga SSE, AVX va AVX512 kengaytmalari uchun qo'shimcha ichki xususiyatlar qo'shildi. Wildcat Lake (-march=wildcatlake) va Nova Lake (-march=novalake) mikroarxitekturalariga asoslangan Intel protsessorlari uchun tuzilish rejimlari qo'shildi.
- AArch64 orqa tomoni endi Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) va Arm C1-Ultra (c1-ultra) protsessorlarini qo'llab-quvvatlaydi. FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] va FCVTA[US] ko'rsatmalari uchun qo'shimcha o'rnatilgan funksiyalar qo'shildi. Funksiyaning ko'p versiyali (FMV) qo'llab-quvvatlashi barqarorlashtirildi. Foydalanuvchilar endi turli funksiya versiyalarining ustuvorligini bekor qilishlari mumkin.
- LoongArch32 (LA32R, LA32S) arxitekturasi uchun qo'llab-quvvatlash qo'shildi.
- ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly va PowerPC arxitekturalari uchun takomillashtirilgan orqa panellar.
Manba: opennet.ru
