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

Altı aylıq inkişafdan sonra LLVM 15.0 layihəsinin buraxılışı təqdim edildi - proqramları RISC-yə bənzər virtual təlimatların aralıq bit koduna (aşağı səviyyəli virtual maşın) tərtib edən GCC-ə uyğun alətlər dəsti (tərtibçilər, optimallaşdırıcılar və kod generatorları). çoxsəviyyəli optimallaşdırma sistemi). Yaradılmış psevdokod JIT kompilyatorundan istifadə edərək proqramın icrası zamanı birbaşa maşın təlimatlarına çevrilə bilər.

Clang 15.0-da əsas təkmilləşdirmələr:

  • X86 arxitekturasına əsaslanan sistemlər üçün “-fzero-call-used-regs” bayrağı əlavə edilmişdir ki, bu da funksiyada istifadə edilən bütün CPU registrlərinin funksiyadan idarəetməni qaytarmazdan əvvəl sıfıra sıfırlanmasını təmin edir. Bu seçim funksiyalardan məlumat sızmasından qorunmağa və ekspluatlarda ROP (Geriyə Yönlü Proqramlaşdırma) qadcetlərinin yaradılması üçün uyğun olan blokların sayını təxminən 20% azaltmağa imkan verir.
  • C kodu üçün strukturların yaddaşda yerləşdirilməsinin təsadüfiləşdirilməsi həyata keçirilib ki, bu da zəifliklərin istismarı zamanı strukturlardan məlumatların çıxarılmasını çətinləşdirir. Təsadüfiləşdirmə randomize_layout və no_randomize_layout atributlarından istifadə etməklə aktiv və söndürülür və "-frandomize-layout-seed" və ya "-frandomize-layout-seed-file" bayrağından istifadə edərək toxum təyin etməyi tələb edir.
  • "-fstrict-flex-arrays=" bayrağı əlavə edildi ", bununla siz strukturlardakı çevik massiv elementi üçün sərhədləri idarə edə bilərsiniz (Flexible Array Members, strukturun sonunda qeyri-müəyyən ölçülü massiv). 0 (standart) olaraq təyin edildikdə, strukturun massivi olan sonuncu elementi həmişə çevik massiv kimi işlənir, 1 - yalnız ölçülər [], [0] və [1] çevik massiv kimi işlənir, 2 - yalnız ölçülər [] və [0] çevik massiv kimi işlənir.
  • DirectX-də şeyderlərin yazılması üçün istifadə edilən C-bənzər dil HLSL (Yüksək Səviyyəli Şader Dili) üçün eksperimental dəstək əlavə edilib.
  • Sabit və dəyişən uzunluqlu massivlərlə əlaqəli uyğun gəlməyən arqument bəyannamələri ilə funksiyaları ləğv etmək barədə xəbərdarlıq etmək üçün "-Warray-parameter" əlavə edildi.
  • MSVC ilə təkmilləşdirilmiş uyğunluq. MSVC-də təqdim edilən "#pragma funksiyası" (tərtibçiyə daxili genişləndirmə əvəzinə funksiya çağırışı yaratmağı tapşırır) və "#pragma alloc_text" (funksiya kodu ilə bölmənin adını müəyyən edir) üçün əlavə dəstək. MSVC uyğun /JMC və /JMC bayraqları üçün əlavə dəstək.
  • Gələcək C2X və C++ 23 standartlarını dəstəkləmək üçün işlər davam edir. C dili üçün aşağıdakılar həyata keçirilir: noreturn atributu, yalan və doğru açar sözlər, verilmiş bit dərinliyinin tam ədədləri üçün _BitInt(N) növü, *_WIDTH makroları, UTF-8 kodlu simvollar üçün u8 prefiksi.

    C++ üçün aşağıdakılar həyata keçirilir: modul birləşməsi, funksiya üzvlərinin ABI izolyasiyası, modullarda yerli olmayan dəyişənlərin sifarişli dinamik işə salınması, çoxölçülü indeks operatorları, auto(x), qeyri-hərfi dəyişənlər, constexpr kimi elan edilmiş funksiyalarda goto və etiketlər , ayrılmış qaçış ardıcıllığı, adlı qaçış simvolları.

  • OpenCL və OpenMP dəstəyi ilə əlaqəli imkanlar genişləndirilib. OpenCL genişləndirilməsi cl_khr_subgroup_rotate üçün əlavə dəstək.
  • X86 arxitekturası üçün qeyd-şərtsiz irəli atlama əməliyyatlarından sonra təlimatların spekulyativ icrası nəticəsində prosessorlarda yaranan zəifliklərə qarşı qoruma əlavə edilmişdir. Problem yaddaşdakı filial təlimatından dərhal sonra təlimatların qabaqcadan işlənməsi səbəbindən baş verir (SLS, Straight Line Speculation). Qorunmanı aktivləşdirmək üçün “-mharden-sls=[none|all|return|indirect-jmp]” seçimi təklif olunur.
  • SSE2 genişləndirilməsini dəstəkləyən platformalar üçün AVX16-FP512 təlimatları üçün dəstək olmadıqda float növündən istifadə etməklə emulyasiya edilən _Float16 növü əlavə edilmişdir.
  • AMD Zen2 prosessorlarından başlayaraq dəstəklənən RDPRU təlimatının istifadəsinə nəzarət etmək üçün "-m[no-]rdpru" bayrağı əlavə edildi.
  • Dolayı filiallar üçün spekulyativ icra mexanizminin iştirakını istisna edən təlimatlar ardıcıllığını əlavə etməklə işləyən RETBLEED zəifliyindən qorunmaq üçün "-mfunction-return=thunk-extern" bayrağı əlavə edildi.

LLVM 15.0-da əsas yeniliklər:

  • Cortex-M85 CPU, Armv9-A, Armv9.1-A və Armv9.2-A arxitekturaları, Armv8.1-M PACBTI-M uzantıları üçün əlavə dəstək.
  • DirectX şeyderləri üçün istifadə olunan DXIL (DirectX Intermediate Language) formatını dəstəkləyən DirectX üçün eksperimental backend əlavə edilmişdir. Arxa uç montaj zamanı “-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX” parametrini təyin etməklə aktivləşdirilir.
  • Libc++ C++20 və C++2b standartlarının yeni funksiyalarını, o cümlədən “format” kitabxanasının tətbiqinin tamamlanması və “aralıqlar” kitabxanasının təklif olunan eksperimental versiyasını tətbiq etməyə davam edir.
  • x86, PowerPC və RISC-V arxitekturaları üçün təkmilləşdirilmiş arxa uçlar.
  • LLD əlaqələndiricisinin və LLDB sazlayıcısının imkanları təkmilləşdirilmişdir.

Mənbə: opennet.ru

Добавить комментарий