LLVM 22 kompilyator dəstinin buraxılışı

Altı aylıq inkişafdan sonra LLVM 22.1.0 buraxıldı. Proqramları RISC-yə bənzər virtual təlimatların (çoxsəviyyəli optimallaşdırma sistemi olan aşağı səviyyəli virtual maşın) aralıq bit koduna kompilyasiya edən alətlər (kompilyatorlar, optimallaşdırıcılar və kod generatorları) hazırlayır. Yaradılan psevdokod müəyyən bir hədəf platforması üçün maşın koduna çevrilə bilər və ya proqramın icrası zamanı birbaşa maşın təlimatları yaratmaq üçün vaxtında (JIT) kompilyator tərəfindən istifadə edilə bilər. LLVM texnologiyalarına əsaslanaraq, layihə C, C++ və Objective-C proqramlaşdırma dillərini dəstəkləyən Clang kompilyatorunu hazırlayır. 18.x filialından başlayaraq, layihə yeni versiya nömrələmə sxeminə keçdi, buna görə də inkişaf zamanı 0 buraxılışı ("N.0") istifadə olunur və ilk sabit versiya "N.1" nömrələnir.

Clang 22-da təkmilləşdirmələrə aşağıdakılar daxildir:

  • Malloc kimi funksiyalardan istifadə edərək yerinə yetirilən yaddaş ayırma əməliyyatlarını unikal identifikatorla işarələmək üçün yaddaş ayırma tokenləri (Ayrılma Tokenləri) üçün dəstək əlavə edildi. Ayrılma tokenləri yığın məlumatlarının strukturlaşdırılmasına, yaddaş sızmasının aşkarlanmasını sadələşdirməyə və obyektlərin məqsədlərinə və ya modifikasiya nümunələrinə əsasən qruplaşdırılmasına imkan verir (məsələn, "isti" məlumatları "soyuq" məlumatlardan ayırmaq). Aktivləşdirmək üçün "-fsanitize=alloc-token" bayrağından istifadə edin.
  • C dili ilə əlaqəli xüsusiyyətlər:
    • Cari əhatə dairəsindən çıxdıqda hərəkətlərin yerinə yetirilməsinə imkan verən "təxirə salınmış" icra mexanizmini müəyyən edən layihə spesifikasiyası tətbiq edilmişdir. "Təxirə salınmış" dəstəyini təmin etmək üçün "-fdefer-ts" bayrağı əlavə edilmişdir.
    • GCC-də oxşar funksiyanı əks etdirən daxili __builtin_stack_address() funksiyası əlavə edildi. Bu funksiya, __builtin_stack_address() funksiyasını çağıran cari funksiyanın və onun çağırdığı sonrakı funksiyaların yığma sahəsini ayıran yığma ünvanını qaytarır.
  • Gələcək C2y standartı üçün inkişaf etdirilən imkanlar:
    • Adlandırılmış döngələr üçün dəstək əlavə edildi, bu da döngələrə adlar təyin etməyə və çıxacağı döngəni açıq şəkildə təyin etmək üçün break və continue ifadələrində göstərilə bilən switch operatorlarına imkan verir. 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 }
    • Unikal identifikator adları yaratmaq üçün hazırlanmış daxili "__COUNTER__" makrosunun tətbiqi genişləndirilmiş və standarta daxil edilmişdir. Bu makroya 2147483647 çağırış limiti müəyyən edilmişdir; bu limiti aşmaq xəta yaradacaq.
    • "extern inline" kimi elan edilən funksiyaların içərisində statik funksiyalar və ya dəyişənlər istifadə edilərkən xəbərdarlıq (-Wstatic-in-line) silindi.
  • C23 C standartında müəyyən edilmiş imkanlar:
    • float.h başlıq faylı artıq float, double və long double növləri üçün siqnallı (arifmetik əməliyyatlarda istifadə edildikdə istisnaya səbəb olan) NaN dəyərlərini tətbiq edən FLT_SNAN, DBL_SNAN və LDBL_SNAN makroslarını dəstəkləyir.
    • Eyni sahələrə malik olduqları təqdirdə, fərqli adsız növlərin eyni tərcümə vahidi daxilində uyğun hesab edildiyi bir xəta düzəldildi.
    • Asılılıq skanlaması zamanı itkin başlıq fayllarını görməməzlikdən gəlmək üçün istifadə edilən "-MG" bayrağı "#embed" direktivlərinə genişləndirilib və indi "#embed" direktivində göstərilən fayl itkin olduqda "fayl tapılmadı" xətasını aradan qaldırır.
  • C++ ilə əlaqəli xüsusiyyətlər:
    • C++2c (C++26) spesifikasiyasında inkişaf etdirildiyi kimi, "constexpr" kontekstində strukturlaşdırılmış bağlamalardan istifadə etmək imkanı əlavə edildi. Bu o deməkdir ki, sabit ifadələrə istinadlar artıq özləri sabit ifadələr ola bilər. Dəstək massivlər və sadə strukturlar üçün tətbiq olunur (kortejlər hələ dəstəklənmir). constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;
    • C++20 standartının tələb etdiyi kimi, məhdudiyyətlər artıq yoxlanılmadan əvvəl standart formaya çevrilir və bu da daha dəqiq diaqnostik mesajlar əldə etməyə və yalnız konsept-id-lərində istifadə olunan şablon arqumentlərində əvəzetmə səhvlərinin düzgün işlənməsini təmin edir.
    • "<", ">", "<=" və ">=" müqayisə operatorlarının "<=>" operatorundan sintez edilib-edilmədiyini öyrənmək üçün "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" daxili funksiyalar ailəsi əlavə edildi.
    • "-Wincompatible-pointer-types" parametri xəbərdarlıq əvəzinə xəta çıxarmaq üçün dəyişdirilib. Əvvəlki davranışa qayıtmaq üçün "-Wno-error=incompatible-pointer-types" seçimindən istifadə edin.
  • Daxili funksiyalar __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 və __builtin_dedup_pack əlavə edildi. Məsələn, builtin_dedup_pack, MyTypeList = TypeList<__builtin_dedup_pack əmrindən istifadə edərək, dublikatları növlər siyahısından silməyə imkan verir. …>; // nəticədə alınan tip TypeList olacaq
  • UBSan ilə təyin olunmamış davranışı ayıklayarkən (-fsanitize=undefined -fsanitize-trap=undefined), xəta səbəbi məlumatı artıq yaradılan ayıklama məlumatına daxil edilir. Xəta məlumatındakı detal səviyyəsini göstərmək üçün "-fsanitize-debug-trap-reasons" bayrağı əlavə edilib. Ümumi təsvirlər üçün "əsas" (məsələn, "Tam ədəd əlavəsi aşıb") və ətraflı məlumatı daxil etmək üçün "ətraflı" (məsələn, "'a + b'-də imzalı tam ədəd əlavəsi aşıb") olaraq təyin edilə bilər.
  • Yeni kompilyator bayraqları əlavə edildi:
    • "-f[no-]sanitize-debug-trap-reasons" əmri "-fsanitize-trap" rejimi ilə kompilyasiya edilərkən istisna tələsi səbəblərinin ayıklama məlumatlarına daxil edilib-edilmədiyini idarə etmək üçündür.
    • Yaddaş ayırma tokenlərini idarə etmək üçün "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi" və "-fsanitize-alloc-token-extended" əmrlərindən istifadə edin.
    • Matris növlərinin yaddaş düzülüşünü idarə etmək üçün "-fmatrix-memory-layout" əmri istifadə olunur (məsələn, sütun böyük üçün sütun böyük, sətir böyük üçün sətir böyük).
  • Funksiyalar artıq malloc atributuna bənzər, lakin blokun sonuna ölçüsü və ya göstəricisi olan göstərici və sahə ehtiva edən span kimi strukturları qaytaran funksiyalara tətbiq olunan "malloc_span" atributuna malikdir.
  • Link zamanı printf funksiyasının tələb olunan statik şəkildə əlaqəli tətbiqini dinamik olaraq seçmək üçün "modular_format" atributu əlavə edildi.
  • Diaqnostik və statik analiz alətləri genişləndirilmiş, yeni yoxlamalar əlavə edilmişdir (diaqnostika ilə əlaqəli bir neçə düzəliş).
  • X86 arxa planına SSE, AVX və AVX512 uzantıları üçün əlavə daxili xüsusiyyətlər əlavə edilmişdir. Wildcat Lake (-march=wildcatlake) və Nova Lake (-march=novalake) mikroarxitekturalarına əsaslanan Intel CPU-ları üçün qurulma rejimləri əlavə edilmişdir.
  • AArch64 arxa planı artıq Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) və Arm C1-Ultra (c1-ultra) prosessorlarını dəstəkləyir. FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] və FCVTA[US] təlimatları üçün əlavə daxili funksiyalar əlavə edilib. Funksiya Çoxversiyalı (FMV) dəstəyi sabitləşdirilib. İstifadəçilər artıq müxtəlif funksiya versiyalarının prioritetini ləğv edə bilərlər.
  • LoongArch32 (LA32R, LA32S) arxitekturası üçün dəstək əlavə edildi.
  • ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly və PowerPC arxitekturaları üçün təkmilləşdirilmiş arxa planlar.

Mənbə: opennet.ru

DDoS mühafizəsi, VPS VDS serverləri olan saytlar üçün etibarlı hostinq alın 🔥 DDoS qorunması, VPS VDS serverləri ilə etibarlı veb sayt hostinqi alın | ProHoster