LLVM 16.0 kompilyatorlar to'plamining chiqarilishi

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

  • Standart C++/ObjC++ standarti gnu++17 (ilgari gnu++14) bo‘lib, ya’ni GNU kengaytmalari bilan C++17 funksiyalari sukut bo‘yicha qo‘llab-quvvatlanadi. Oldingi xatti-harakatni qaytarish uchun siz "-std=gnu++14" opsiyasidan foydalanishingiz mumkin.
  • C++ 20 standarti bilan bog'liq qo'shimcha funktsiyalar joriy etildi:
    • Shartli ravishda ahamiyatsiz maxsus a'zo funktsiyalari,
    • lambda funktsiyalarida tuzilgan bog'lanishlarni olish,
    • Ifodalar ichidagi tenglik operatori,
    • Ba'zi kontekstlarda typename kalit so'zini o'tkazib yuborish imkoniyati,
    • Qavslar ichida yaroqli agregatni ishga tushirish (“Aggr(val1, val2)”).
  • Kelajakda C++ 2b standartida belgilangan xususiyatlar amalga oshirildi:
    • Murakkab iboralar oxirida teg qo'yishga ruxsat beriladi,
    • statik operator(),
    • statik operator[],
    • char8_t turi bilan muvofiqligi ta'minlanadi,
    • “\N{...}”da foydalanishga ruxsat berilgan belgilar doirasi kengaytirildi
    • Constexpr sifatida e'lon qilingan funksiyalarda "statik konstexpr" deb e'lon qilingan o'zgaruvchilardan foydalanish imkoniyati qo'shildi.
  • Kelajakda C-standart C2xda belgilangan xususiyatlar amalga oshirildi:
    • "-Wunused-label" ogohlantirishini o'chirish uchun teglarga "[[maybe_unused]]" atributini qo'llashga ruxsat beriladi
    • Yorliqlarni qo'shma iboralar ichida istalgan joyga joylashtirishga ruxsat beriladi,
    • typeof va typeof_unqual operatorlari qo‘shildi,
    • Yangi turdagi nullptr_t va nullptr konstantasi har qanday ko'rsatkich turiga aylantira oladigan null ko'rsatkichlarni aniqlash uchun va butun va void* turlariga bog'lanmagan NULL variantini ifodalaydi.
    • C2x rejimida va_start makrosini o'zgaruvchan sonli argumentlar (variadic) bilan chaqirishga ruxsat beriladi.
  • C99, C11 va C17 muvofiqlik rejimlarida standart "-Wimplicit-function-declaration" va "-Wimplicit-int" opsiyalari endi ogohlantirish o'rniga xatolikni keltirib chiqaradi.
  • C++ rejimida "void *" dan bilvosita foydalanish (masalan, "void func(void *p) { *p; }") endi ISO C++, GCC, ICC va MSVC ga o'xshash xatolikni keltirib chiqaradi.
  • Microsoft uslubidagi inline montaj bloklarida bit maydonlarini buyruq operandlari sifatida belgilash (masalan, "__asm  { mov eax, s.bf }") endi xatolikka olib keladi.
  • Turli xil modullarda bir xil nomdagi turli tuzilmalar va birlashmalarning mavjudligi uchun qo'shilgan diagnostika.
  • OpenCL va OpenMP-ni qo'llab-quvvatlash bilan bog'liq imkoniyatlar kengaytirildi. OpenCL yadro argumentlarida ishlatiladigan C++ shablonlari uchun yaxshilangan diagnostika. AMDGPU uchun yaxshilangan navbat bloklarini qo'llab-quvvatlash. Nounwind atributi barcha funktsiyalarga bevosita qo'shiladi. O'rnatilgan funktsiyalar uchun yaxshilangan qo'llab-quvvatlash.
  • Buzilish diagnostikasi ma'lumotlari saqlanadigan katalogni aniqlash uchun CLANG_CRASH_DIAGNOSTICS_DIR muhit o'zgaruvchisidan foydalanish imkoniyati qo'shildi.
  • Unicode qo'llab-quvvatlashi Unicode 15.0 spetsifikatsiyasiga yangilandi. Identifikatorlarda ba'zi matematik belgilarga ruxsat berilgan, masalan, "₊" (masalan, "ikki xₖ₊₁").
  • Bir nechta konfiguratsiya fayllarini yuklash uchun qoʻshimcha qoʻllab-quvvatlash (birinchi navbatda standart konfiguratsiya fayllari yuklanadi, soʻngra “--config=” bayrogʻi orqali koʻrsatilganlar, endi ular bir necha marta koʻrsatilishi mumkin). Konfiguratsiya fayllarini standart yuklash tartibi oʻzgartirildi: clang avval faylni yuklashga harakat qiladi - .cfg va agar topilmasa, u ikkita faylni yuklashga harakat qiladi .cfg va .cfg. Sukut bo'yicha konfiguratsiya fayllarini yuklashni o'chirish uchun "--no-default-config" bayrog'i qo'shilgan.
  • Takroriy tuzilmalarni ta'minlash uchun __DATE__, __TIME__ va __TIMESTAMP__ makroslaridagi joriy sana va vaqt qiymatlarini SOURCE_DATE_EPOCH muhit o'zgaruvchisida ko'rsatilgan vaqt bilan almashtirish mumkin.
  • Konstantalar kontekstida ishlatilishi mumkin bo'lgan o'rnatilgan funktsiyalar (o'rnatilgan) mavjudligini tekshirish uchun "__has_constexpr_builtin" makros qo'shildi.
  • Tegishli koroutin ramkalar ajratish uchun yangi kompilyatsiya bayrog'i "-fcoro-aligned-allocation" qo'shildi.
  • “-fstrict-flex-arrays=” bayrog‘i tuzilmalardagi moslashuvchan massiv elementlarini tekshirishning uchinchi darajasini qo‘llab-quvvatlaydi (Moslashuvchan massiv a’zolari, strukturaning oxiridagi noaniq o‘lchamdagi massiv). Uchinchi darajada, faqat "[]" o'lchami (masalan, "int b[]") moslashuvchan massiv sifatida ko'rib chiqiladi, lekin "[0]" o'lchami (masalan, "int b[0]") emas.
  • Standart C++ modullari uchun bir fazali kompilyatsiya modelini yoqish uchun "-fmodule-output" bayrog'i qo'shildi.
  • Stek ramkasi joylashuvi bilan bog'liq muammolarni aniqlashga yordam berish uchun "-Rpass-analysis=stek-frame-layout" rejimi qo'shildi.
  • Yangi __atribut__((target_version("cpu_features"))) atributi qoʻshildi va AArch1 tomonidan taqdim etilgan funksiyalarning muayyan versiyalarini tanlash uchun __attribute__((target_clones("cpu_features2","cpu_features64",...))) atributining funksionalligi kengaytirildi. CPUlar.
  • Diagnostika vositalari kengaytirildi:
    • Bitta bitli imzolangan bit maydoniga bittasini tayinlashda yashirin qisqartirishni aniqlash uchun "-Wsingle-bit-bit-bitfield-constant-conversion" ogohlantirish qo'shildi.
    • Boshlanmagan constexpr o'zgaruvchilari diagnostikasi kengaytirildi.
    • Funktsiya turini taqsimlash bilan bog'liq mumkin bo'lgan muammolarni aniqlash uchun "-Wcast-function-type-strict" va "-Wincompatible-function-pointer-types-strict" ogohlantirishlari qo'shildi.
    • Eksport bloklarida noto'g'ri yoki ajratilgan modul nomlaridan foydalanish uchun diagnostika qo'shildi.
    • Ta'riflarda etishmayotgan "avtomatik" kalit so'zlarni aniqlash yaxshilandi.
    • "-Winteger-overflow" ogohlantirishining amalga oshirilishi toshib ketishga olib keladigan qo'shimcha holatlar uchun tekshiruvlarni qo'shdi.
  • Loongson 64 464 protsessorlarida qo'llaniladigan va MIPS va RISC-V ga o'xshash yangi RISC ISA ni amalga oshiruvchi LoongArch ko'rsatmalar to'plami arxitekturasini qo'llab-quvvatlash (-march=loongarch3 yoki -march=la5000) amalga oshirildi.

LLVM 16.0 dagi asosiy yangiliklar:

  • LLVM kodiga C++ 17 standartida belgilangan elementlardan foydalanishga ruxsat beriladi.
  • LLVM qurish uchun atrof-muhit talablari oshirildi. Qurilish vositalari endi C++ 17 standartini qo'llab-quvvatlashi kerak, ya'ni. Qurilish uchun sizga kamida GCC 7.1, Clang 5.0, Apple Clang 10.0 yoki Visual Studio 2019 16.7 kerak bo'ladi.
  • AArch64 arxitekturasi uchun backend Cortex-A715, Cortex-X3 va Neoverse V2 protsessorlari, RME MEC uchun assembler (Xotirani shifrlash kontekstlari), Armv8.3 kengaytmalari (Murakkab raqam) va Function Multi Versioning uchun qo'llab-quvvatlaydi.
  • ARM arxitekturasi uchun backendda Armv2, Armv2A, Armv3 va Armv3M maqsadli platformalarini qo'llab-quvvatlash to'xtatildi, ular uchun to'g'ri kod yaratish kafolatlanmagan. Murakkab raqamlar bilan ishlash bo'yicha ko'rsatmalar uchun kod yaratish imkoniyati qo'shildi.
  • X86 arxitekturasi uchun backend AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT ko'rsatmalar to'plami arxitekturasini (ISA) qo'llab-quvvatladi. RDMSRLIST, RMSRLIST va WRMSRNS ko'rsatmalarini qo'llab-quvvatlash qo'shildi. Amalga oshirilgan “-mcpu=raptorlake”, “-mcpu=meteorlake”, “-mcpu=emeraldrapids”, “-mcpu=sierraforest”, “-mcpu=graniterapids” va “-mcpu=grandridge”.
  • LoongArch platformasi uchun rasmiy yordam qo'shildi.
  • MIPS, PowerPC va RISC-V arxitekturalari uchun yaxshilangan backends
  • LLDB tuzatuvchisiga LoongArch arxitekturasi uchun 64-bitli bajariladigan fayllarni disk raskadrovka qilish uchun qo'shimcha yordam qo'shildi. COFF disk raskadrovka belgilaridan foydalanish yaxshilandi. Yuklangan Windows modullari ro'yxatida ikki nusxadagi DLL fayllarini filtrlash ta'minlangan.
  • Libc++ kutubxonasida asosiy ish C++20 va C++23 standartlarining yangi funksiyalarini qo‘llab-quvvatlashni amalga oshirishga qaratildi.
  • LDD bog'lovchisi manzilni ko'chirishni skanerlash va bo'limni ishga tushirish operatsiyalarini parallellashtirish orqali ulanish vaqtini sezilarli darajada qisqartiradi. ZSTD algoritmidan foydalangan holda bo'limlarni siqish uchun qo'shimcha yordam.

Manba: opennet.ru

a Izoh qo'shish