LLVM 11.0 kompilyatorlar to'plamining chiqarilishi

Olti oylik rivojlanishdan keyin taqdim etildi loyiha chiqarilishi LLVM 11.0 — GCC-mos keluvchi vositalar (kompilyatorlar, optimallashtiruvchilar va kod generatorlari), dasturlarni RISC-ga o'xshash virtual ko'rsatmalarning oraliq bitkodlariga kompilyatsiya qilish (ko'p darajali optimallashtirish tizimiga ega past darajadagi virtual mashina). Yaratilgan psevdokod JIT kompilyatori yordamida to'g'ridan-to'g'ri dasturni bajarish vaqtida mashina ko'rsatmalariga aylantirilishi mumkin.

Yangi nashrdagi asosiy o'zgarish shu edi Flanj, Fortran tili uchun frontend. Flang Fortran 2018, OpenMP 4.5 va OpenACC 3.0 ni qo'llab-quvvatlaydi, ammo loyihani ishlab chiqish hali tugallanmagan va oldingi qism kodni tahlil qilish va to'g'riligini tekshirish bilan cheklangan. LLVM oraliq kodini yaratish hali qo'llab-quvvatlanmaydi va bajariladigan fayllarni yaratish uchun kanonik kod yaratiladi va tashqi Fortran kompilyatoriga uzatiladi.

Yaxshilash Clang 11.0 da:

  • Mavhum sintaksis daraxtini tiklash imkoniyati qo'shildi (AST) xatolarni tashxislashda yordam beradigan va clang-tidy va clangd kabi tashqi yordam dasturlariga qo'shimcha ma'lumot beradigan buzilgan C++ kodi uchun. Bu funksiya C++ kodi uchun sukut boʻyicha yoqilgan va “-Xclang -f[no-]recovery-ast” opsiyalari orqali boshqariladi.
  • Yangi diagnostika rejimlari qo'shildi:
    • “-Wpointer-to-int-cast” barcha mumkin bo'lgan qiymatlarni sig'dira olmaydigan int tipidagi ko'rsatkichlarni o'tkazish haqida ogohlantirishlar guruhidir.
    • "-Wuninitialized-const-reference" - "const" atributi bilan mos yozuvlar argumentlarini qabul qiluvchi funktsiya parametrlarida ishga tushirilmagan o'zgaruvchilarni o'tkazish haqida ogohlantirish.
    • "-Wimplicit-const-int-float-conversion" - haqiqiy konstantani butun son turiga yashirin konvertatsiya qilish haqida sukut bo'yicha ogohlantirish yoqilgan.
  • ARM platformasi uchun kompilyatorga o'rnatilgan C funktsiyalari taqdim etiladi (Intrinsics), samarali vektor ko'rsatmalari Arm v8.1-M MVE va CDE bilan almashtirildi. Mavjud funksiyalar arm_mve.h va arm_cde.h sarlavha fayllarida aniqlanadi.
  • Qo'shilgan _ExtInt(N) kengaytirilgan butun son turlari to'plami bo'lib, FPGA/HLS da samarali qayta ishlanishi mumkin bo'lgan ikki darajaning ko'paytmasi bo'lmagan turlarni yaratishga imkon beradi. Misol uchun, _ExtInt(7) 7 bitdan iborat butun son turini belgilaydi.
  • ARM SVE (Scalable Vector Extension) ko'rsatmalari asosida o'rnatilgan C funksiyalarini qo'llab-quvvatlashni belgilaydigan qo'shilgan makroslar:
    __ARM_FATURE_SVE, __ARM_FATURE_SVE_BF16,
    __ARM_FATURE_SVE_MATMUL_FP32, __ARM_FATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FATURE_SVE2, __ARM_FATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4. Masalan, __ARM_FEATURE_SVE makrosi AArch64 kodini yaratishda "-march=armv8-a+sve" buyruq qatori opsiyasini o'rnatish orqali aniqlanadi.

  • Endi "-O" bayrog'i "-O1" o'rniga "-O2" optimallashtirish rejimi bilan belgilanadi.
  • Yangi kompilyator bayroqlari qo'shildi:
    • "-fstack-clash-protection" - himoya qilishni ta'minlaydi stack va to'pning kesishuvlari.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - suzuvchi nuqta raqamlari uchun istisnolarni qayta ishlash rejimini tanlash imkonini beradi.
    • "-ffp-model={aniq, qat'iy, tezkor}" - suzuvchi nuqta raqamlari uchun bir qator maxsus variantlardan foydalanishni osonlashtiradi.
    • "-fpch-codegen" va "-fpch-debuginfo" kod va disk raskadrovka ma'lumotlari uchun alohida obyekt fayllari bilan oldindan kompilyatsiya qilingan sarlavhani (PCH) yaratish uchun.
    • "-fsanitize-coverage-allowlist" va "-fsanitize-coverage-blocklist" qamrov sinovini oq va qora ro'yxatlarni tekshirish uchun.
    • TLS (mavzu-mahalliy xotira) hajmini tanlash uchun “-mtls-size={12,24,32,48}”.
    • Eksperimental RISC-V kengaytmalarini yoqish uchun "-menable-experimental-extension".
  • C uchun standart rejim "-fno-common" bo'lib, ba'zi platformalarda global o'zgaruvchilarga yanada samarali kirish imkonini beradi.
  • Standart modul keshi /tmp dan ~/.cache katalogiga ko'chirildi. Bekor qilish uchun siz “-fmodules-cache-path=” belgisidan foydalanishingiz mumkin.
  • Standart C tili standarti gnu11 dan gnu17 ga yangilandi.
  • GNU C kengaytmasi uchun dastlabki yordam qo'shildi "asm inline» assembler qo'shimchalarini qo'shish uchun. Kengaytma hali ham tahlil qilinmoqda, lekin hech qanday tarzda qayta ishlanmagan.
  • OpenCL va CUDA qo'llab-quvvatlashi bilan bog'liq imkoniyatlar kengaytirildi. OpenCL 2.0 blok diagnostikasini qo‘llab-quvvatlash qo‘shildi va yangi OpenMP 5.0 funksiyalarini joriy qildi.
  • Extern "C" va extern "C++" bloklari ichida tekislash uchun clang formatidagi yordam dasturiga IndentExternBlock opsiyasi qo'shildi.
  • Statik analizator C++ da meros qilib olingan konstruktorlar bilan ishlashni yaxshilagan. Bloklarni tekshirish uchun alpha.core.C11Lock va alpha.fuchsia.Lock, putenv dan xavfli foydalanishni aniqlash uchun alpha.security.cert.pos.34c, webkit.NoUncountedMemberChecker va webkit.RefCntblBaseVirtualDtor, unha bilan bog'liq muammolarni aniqlash uchun yangi cheklar qo'shildi. .cplusplus .SmartPtr null smart pointer dereferentligini tekshirish uchun.
  • In linter clang-toza qo'shildi yangi cheklarning katta qismi.
  • Clangd keshlash serveri (Clang Server) ish faoliyatini yaxshiladi va yangi diagnostika imkoniyatlarini qo'shdi.

asosiy yangiliklar LLVM 11.0:

  • Qurilish tizimi Python 3 dan foydalanishga o'tkazildi. Agar Python 3 mavjud bo'lmasa, Python 2 dan foydalanishga qaytish mumkin.
  • Go tili (llgo) uchun kompilyatorga ega bo'lgan old qism kelajakda qayta tuzilishi mumkin bo'lgan versiyadan chiqarib tashlangan.
  • Vektor-funksiya-abi-variant atributi qo'ng'iroqlarni vektorlashtirish uchun skalar va vektor funktsiyalari o'rtasidagi xaritalashni tasvirlash uchun oraliq ko'rinishga (IR) qo'shildi. llvm::VectorType dan ikkita alohida vektor turi llvm::FixedVectorType va llvm::ScalableVectorType mavjud.
  • Udef qiymatlariga asoslangan tarmoqlanish va undef qiymatlarini standart kutubxona funktsiyalariga o'tkazish aniqlanmagan xatti-harakatlar sifatida tan olinadi. IN
    memset/memcpy/memmove undef ko'rsatkichlarini o'tkazishga imkon beradi, lekin o'lchamli parametr nolga teng bo'lsa.

  • LLJIT LLJIT::initialize va LLJIT::deinitialize usullari orqali statik ishga tushirishni amalga oshirish uchun qo'shimcha yordam berdi. StaticLibraryDefinitionGenerator sinfidan foydalangan holda JITDylib-ga statik kutubxonalar qo'shish imkoniyati amalga oshirildi. uchun C API qo'shildi ORCv2 (JIT kompilyatorlarini yaratish uchun API).
  • Cortex-A64, Cortex-A34, Cortex-A77 va Cortex-X78 protsessorlarini qo'llab-quvvatlash AArch1 arxitekturasi uchun orqa qismga qo'shildi. Amalga oshirilgan ARMv8.2-BF16 (BFloat16) va ARMv8.6-A kengaytmalari, shu jumladan RMv8.6-ECV (Kengaytirilgan hisoblagich virtualizatsiyasi), ARMv8.6-FGT (Yuqorli tuzoqlar), ARMv8.6-AMU (Faoliyat monitorlarini virtualizatsiya qilish) va ARMv8.0-DGH (Ma'lumotlarni yig'ish bo'yicha maslahat). SVE vektor ko'rsatmalariga o'rnatilgan funktsiyalar-bog'lash uchun kod yaratish imkoniyati taqdim etiladi.
  • Cortex-M55, Cortex-A77, Cortex-A78 va Cortex-X1 protsessorlarini qo'llab-quvvatlash ARM arxitekturasi uchun backendga qo'shildi. Amalga oshirilgan kengaytmalar
    Armv8.6-A Matritsani ko'paytirish va RMv8.2-AA32BF16 BFloat16.

  • PowerPC arxitekturasi uchun backendga POWER10 protsessorlari uchun kod ishlab chiqarishni qo'llab-quvvatlash qo'shildi. Loop optimallashtirish kengaytirildi va suzuvchi nuqta qo'llab-quvvatlash yaxshilandi.
  • RISC-V arxitekturasi uchun backend hali rasman tasdiqlanmagan eksperimental kengaytirilgan ko'rsatmalar to'plamlarini qo'llab-quvvatlaydigan yamoqlarni qabul qilishga imkon beradi.
  • AVR arxitekturasi uchun backend eksperimental toifadan asosiy taqsimotga kiritilgan barqarorga o'tkazildi.
  • X86 arxitekturasi uchun backend Intel AMX va TXLDTRK ko'rsatmalarini qo'llab-quvvatlaydi. Hujumlarga qarshi qo'shimcha himoya LVI (Load Value Injection), shuningdek, protsessorda operatsiyalarning spekulyativ bajarilishi natijasida kelib chiqadigan hujumlarni blokirovka qilish uchun umumiy spekulyativ bajarilishning yon ta'sirini bostirish mexanizmini amalga oshiradi.
  • SystemZ arxitekturasi uchun backendda MemorySanitizer va LeakSanitizer qo'llab-quvvatlandi.
  • Libc++ matematik konstantalarga ega sarlavha faylini qo'llab-quvvatlaydi .
  • Kengaytirilgan LLD bog'lovchi qobiliyatlari. “--lto-emit-asm”, “--lto-whole-program-visibility”, “-print-arxive-stats”, “-shaffle-sections”, “ qoʻshilgan opsiyalarni oʻz ichiga olgan ELF formatini qoʻllab-quvvatlash yaxshilandi. -thinlto- yagona-modul", "-noyob", "-rozegment", "-threads=N". Izni faylga saqlash uchun "--time-trace" opsiyasi qo'shildi, keyin uni Chrome'dagi chrome://tracing interfeysi orqali tahlil qilish mumkin.

Manba: opennet.ru

a Izoh qo'shish