LLVM 15.0 kompilyatorlar to'plamining chiqarilishi

Olti oylik ishlab chiqishdan so'ng, LLVM 15.0 loyihasining chiqarilishi taqdim etildi - dasturlarni RISC-ga o'xshash virtual ko'rsatmalarning oraliq bitkodiga (past darajadagi virtual mashina) kompilyatsiya qiluvchi GCC-mos keladigan asboblar to'plami (kompilyatorlar, optimallashtiruvchilar va kod generatorlari). ko'p darajali optimallashtirish tizimi). Yaratilgan psevdokod JIT kompilyatori yordamida to'g'ridan-to'g'ri dasturni bajarish vaqtida mashina ko'rsatmalariga aylantirilishi mumkin.

Clang 15.0-dagi asosiy yaxshilanishlar:

  • X86 arxitekturasiga asoslangan tizimlar uchun "-fzero-call-used-regs" bayrog'i qo'shildi, bu funksiyada ishlatiladigan barcha CPU registrlari funksiyadan boshqarishni qaytarishdan oldin nolga qaytarilishini ta'minlaydi. Ushbu parametr sizga funktsiyalardan ma'lumot sizib chiqishidan himoya qilish va ekspluatatsiyalarda ROP (Qaytishga yo'naltirilgan dasturlash) gadjetlarini yaratish uchun mos bo'lgan bloklar sonini taxminan 20% ga kamaytirish imkonini beradi.
  • S-kod uchun tuzilmalarni xotirada joylashtirishni tasodifiylashtirish amalga oshirildi, bu zaifliklardan foydalanish holatlarida tuzilmalardan ma'lumotlarni ajratib olishni qiyinlashtiradi. Tasodifiylashtirish randomize_layout va no_randomize_layout atributlari yordamida yoqiladi va o'chiriladi va "-frandomize-layout-seed" yoki "-frandomize-layout-seed-file" bayrog'i yordamida urug'ni o'rnatishni talab qiladi.
  • "-fstrict-flex-arrays=" bayrog'i qo'shildi, uning yordamida siz tuzilmalardagi moslashuvchan massiv elementi chegaralarini boshqarishingiz mumkin (Moslashuvchan massiv a'zolari, strukturaning oxiridagi noaniq o'lchamdagi massiv). 0 (standart) ga o'rnatilganda, massivli strukturaning oxirgi elementi har doim moslashuvchan massiv sifatida qayta ishlanadi, 1 - faqat o'lchamlar [], [0] va [1] moslashuvchan massiv sifatida qayta ishlanadi, 2 - faqat o'lchamlar [] va [0] moslashuvchan massiv kabi qayta ishlanadi.
  • DirectX-da shaderlarni yozish uchun ishlatiladigan C-ga o'xshash HLSL (High-Level Shader Language) tiliga eksperimental yordam qo'shildi.
  • Ruxsat etilgan va oʻzgarmaydigan uzunlikdagi massivlar bilan bogʻliq mos kelmaydigan argument deklaratsiyasi bilan funksiyalarni bekor qilish haqida ogohlantirish uchun “-Warray-parameter” qoʻshildi.
  • MSVC bilan yaxshilangan muvofiqlik. MSVC-da taqdim etilgan "#pragma funktsiyasi" (kompilyatorga inline kengaytirish o'rniga funksiya chaqiruvini yaratishni buyuradi) va "#pragma alloc_text" (funksiya kodi bilan bo'lim nomini belgilaydi) uchun qo'shimcha qo'llab-quvvatlash. MSVC-mos keladigan /JMC va /JMC bayroqlari uchun qo'shimcha qo'llab-quvvatlash.
  • Kelajakdagi C2X va C++23 standartlarini qo'llab-quvvatlash bo'yicha ishlar davom etmoqda. C tili uchun quyidagilar amalga oshiriladi: noreturn atributi, false va true kalit so'zlari, berilgan bit chuqurligining butun sonlari uchun _BitInt(N) turi, *_WIDTH makroslari, UTF-8 kodlangan belgilar uchun u8 prefiksi.

    C++ uchun quyidagilar amalga oshiriladi: modullarni birlashtirish, funktsiya a'zolarini ABI izolyatsiyasi, modullarda mahalliy bo'lmagan o'zgaruvchilarni tartiblangan dinamik ishga tushirish, ko'p o'lchovli indeks operatorlari, auto(x), harfiy bo'lmagan o'zgaruvchilar, constexpr deb e'lon qilingan funksiyalardagi goto va teglar. , ajratilgan qochish ketma-ketliklari, nomli qochish belgilari.

  • OpenCL va OpenMP-ni qo'llab-quvvatlash bilan bog'liq imkoniyatlar kengaytirildi. OpenCL kengaytmasi cl_khr_subgroup_rotate uchun qo'shilgan yordam.
  • X86 arxitekturasi uchun shartsiz oldinga o'tish operatsiyalaridan keyin ko'rsatmalarning spekulyativ bajarilishi natijasida yuzaga keladigan protsessorlardagi zaifliklardan himoya qo'shildi. Muammo xotiradagi filial ko'rsatmalaridan (SLS, Straight Line Speculation) so'ng darhol ko'rsatmalarni oldindan qayta ishlash tufayli yuzaga keladi. Himoyani yoqish uchun “-mharden-sls=[none|all|return|indirect-jmp]” varianti taklif etiladi.
  • SSE2 kengaytmasini qo'llab-quvvatlaydigan platformalar uchun AVX16-FP512 ko'rsatmalarini qo'llab-quvvatlamagan taqdirda float turidan foydalangan holda taqlid qilinadigan _Float16 turi qo'shildi.
  • AMD Zen2 protsessorlaridan boshlab qo'llab-quvvatlanadigan RDPRU yo'riqnomasidan foydalanishni nazorat qilish uchun "-m[no-]rdpru" bayrog'i qo'shildi.
  • RETBLEED zaifligidan himoya qilish uchun "-mfunction-return=thunk-extern" bayrog'i qo'shildi, bu bilvosita tarmoqlar uchun spekulyativ ijro mexanizmini jalb qilishni istisno qiladigan ko'rsatmalar ketma-ketligini qo'shish orqali ishlaydi.

LLVM 15.0 dagi asosiy yangiliklar:

  • Cortex-M85 CPU, Armv9-A, Armv9.1-A va Armv9.2-A arxitekturalari, Armv8.1-M PACBTI-M kengaytmalari uchun qo'shimcha qo'llab-quvvatlash.
  • DirectX shaderlari uchun ishlatiladigan DXIL (DirectX Intermediate Language) formatini qo'llab-quvvatlaydigan DirectX uchun eksperimental backend qo'shildi. Backend montaj vaqtida “-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX” parametrini belgilash orqali yoqiladi.
  • Libc++ C++20 va C++2b standartlarining yangi xususiyatlarini, jumladan “format” kutubxonasini joriy etishni yakunlashni va “diapazonlar” kutubxonasining tavsiya etilgan eksperimental versiyasini joriy etishda davom etmoqda.
  • X86, PowerPC va RISC-V arxitekturalari uchun yaxshilangan backends.
  • LLD bog'lovchisi va LLDB tuzatuvchisining imkoniyatlari yaxshilandi.

Manba: opennet.ru

a Izoh qo'shish