LLVM 13.0 kompilyatorlar to'plamining chiqarilishi

Olti oylik ishlab chiqishdan so'ng, LLVM 13.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 13.0-dagi yaxshilanishlar:

  • Kafolatlangan qo'ng'iroqlarni qo'llab-quvvatlash amalga oshirildi (funktsiyaning eng oxirida pastki dasturni chaqirish, agar pastki dastur o'zini chaqirsa, quyruq rekursiyasini shakllantirish). Kafolatlangan qo'ng'iroqlarni qo'llab-quvvatlash C++ da "[[clang::musttail]]" atributi va "qaytish" iborasida qo'llaniladigan Cda "__attribute__((musttail))" atributlari tomonidan ta'minlanadi. Bu xususiyat stek sarfini tejash uchun kodni tekis iteratsiyaga joylashtirish orqali optimallashtirishni amalga oshirish imkonini beradi.
  • "foydalanish" deklaratsiyasi va clang kengaytmalari "[[]]" formatidan foydalangan holda C++ 11 uslubidagi atributlarni aniqlashni qo'llab-quvvatlaydi.
  • Foydalanuvchi kodida zaxiralangan identifikatorlarni ko'rsatganingizda ogohlantirishni ko'rsatish uchun "-Wreserved-identifier" bayrog'i qo'shildi.
  • Agar parametr yoki oʻzgaruvchi oʻrnatilgan boʻlsa, lekin foydalanilmasa, ogohlantirishni koʻrsatish uchun “-Wunused-but-set-parameter” va “-Wunused-but-set-variable” bayroqlari qoʻshildi.
  • Agar kod ayirish operatsiyalarida null ko'rsatgichdan foydalanish tufayli aniqlanmagan xatti-harakatlarni keltirib chiqarishi mumkin bo'lsa, ogohlantirish uchun "-Wnull-pointer-subtraction" bayrog'i qo'shildi.
  • Har bir kod fayli uchun qayta ishlanayotgan faylda belgilangan har bir funktsiya uchun stek freymlari hajmi haqidagi ma'lumotlarni o'z ichiga olgan qo'shimcha ".su" faylini yaratish uchun "-fstack-usage" bayrog'i qo'shildi.
  • Statik analizatorga yangi chiqish turi qo'shildi - "sarif-html" bu HTML va Sarif formatlarida bir vaqtning o'zida hisobotlarni yaratishga olib keladi. Yangi allocClassWithName tekshiruvi qo‘shildi. “-analizator-displey-progress” opsiyasini belgilashda har bir funktsiyaning tahlil vaqti ko'rsatiladi. Smart pointer analizatori (alpha.cplusplus.SmartPtr) deyarli tayyor.
  • OpenCL qo'llab-quvvatlashi bilan bog'liq imkoniyatlar kengaytirildi. Yangi cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields va __cl_clang_non_portable_kernel_param_types kengaytmalari uchun qo‘shimcha yordam qo‘shildi. OpenCL 3.0 spetsifikatsiyasini amalga oshirish davom ettirildi. C uchun, agar boshqa versiya aniq tanlanmagan bo'lsa, OpenCL 1.2 spetsifikatsiyasi sukut bo'yicha ishlatiladi. C++ uchun “.clcpp” kengaytmali fayllarni qo‘llab-quvvatlash qo‘shildi.
  • OpenMP 5.1 spetsifikatsiyasida aniqlangan tsiklni o'zgartirish direktivalarini ("#pragma omp unrol" va "#pragma omp tile") qo'llab-quvvatlash amalga oshirildi.
  • Clang formati yordam dasturiga qo'shilgan imkoniyatlar: izohlar oldidagi bo'shliqlar sonini aniqlash uchun SpacesInLineCommentPrefix, yozuvlar, lambda ifodalari va preprotsessor ko'rsatmalarini tekislashni nazorat qilish uchun IndentAccessModifiers, LambdaBodyIndentation va PPIndentWidth. Sarlavha fayllari (SortIncludes) ro'yxatini saralash imkoniyatlari kengaytirildi. JSON fayllarini formatlash uchun qo'shimcha yordam.
  • Yangi cheklarning katta qismi linter clang-tidy-ga qo'shildi.

LLVM 13.0 dagi asosiy yangiliklar:

  • Istisnolarni qayta ishlash bosqichida Qaytishga yo'naltirilgan dasturlash (ROP) usullaridan foydalangan holda yaratilgan ekspluatatsiyalarning bajarilishidan himoya qilish uchun CET (Windows Control-flow Enforcement Technology) texnologiyasidan foydalanish uchun "-ehcontguard" opsiyasi qo'shildi.
  • Debuginfo-test loyihasi o'zaro loyihalar testlari deb o'zgartirildi va disk raskadrovka ma'lumotlari bilan cheklanib qolmasdan, turli loyihalarning komponentlarini sinab ko'rish uchun mo'ljallangan.
  • Yig'ish tizimi bir nechta distribyutsiyalarni yaratishni qo'llab-quvvatlaydi, masalan, biri yordamchi dasturlar bilan, ikkinchisi esa ishlab chiquvchilar uchun kutubxonalar bilan.
  • AArch64 arxitekturasining orqa tomonida Armv9-A RME (Realm Management Extension) va SME (Scalable Matrix Extension) kengaytmalarini qo'llab-quvvatlash assemblerda amalga oshiriladi.
  • Hexagon arxitekturasi uchun backendga ISA V68/HVX qo'llab-quvvatlashi qo'shildi.
  • x86 backend AMD Zen 3 protsessorlari uchun yaxshilangan qo'llab-quvvatlashga ega.
  • AMDGPU backendiga GFX1013 RDNA2 APU qo‘llab-quvvatlashi qo‘shildi.
  • Libc++ C++20 va C++2b standartlarining yangi xususiyatlarini, jumladan “kontseptsiyalar” kutubxonasini to‘ldirishni amalga oshirishda davom etmoqda. MinGW-ga asoslangan Windows platformasi uchun std :: fayl tizimi uchun qo'shimcha yordam. Sarlavha fayllari , va ajratilgan. Funksionalligi toʻliq amalga oshirilmagan sarlavha fayllarini oʻchirish uchun LIBCXX_ENABLE_INCOMPLETE_FEATURES qurish opsiyasi qoʻshildi.
  • LLD bog'lovchisining imkoniyatlari kengaytirildi, unda Big-endian Aarch64 protsessorlarini qo'llab-quvvatlash amalga oshirildi va Mach-O backend oddiy dasturlarni ulash imkonini beradigan holatga keltirildi. Glibc-ni LLD yordamida ulash uchun zarur bo'lgan yaxshilanishlar kiritilgan.
  • Llvm-mca (Machine Code Analyzer) yordam dasturi ARM Cortex-A55 kabi ko'rsatmalarni tartibda bajaradigan protsessorlarni (tartibdagi superskalar quvur liniyasi) qo'llab-quvvatladi.
  • AArch64 platformasi uchun LLDB tuzatuvchisi Pointer autentifikatsiyasi, MTE (MemTag, Memory Tagging Extension) va SVE registrlarini to'liq qo'llab-quvvatlaydi. Har bir xotira ajratish operatsiyasiga teglarni bog'lash va xotiraga kirishda to'g'ri teg bilan bog'langan bo'lishi kerak bo'lgan ko'rsatgichni tekshirishni tashkil qilish imkonini beruvchi qo'shilgan buyruqlar.
  • LLDB tuzatuvchisi va Fortran tili uchun frontend - Flang loyiha tomonidan yaratilgan ikkilik yig'ilishlarga qo'shildi.

Manba: opennet.ru

a Izoh qo'shish