LLVM 9.0 kompilyatorlar to'plamining chiqarilishi

Olti oylik rivojlanishdan keyin taqdim etildi loyiha chiqarilishi LLVM 9.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.

LLVM 9.0 ning yangi xususiyatlari qatoriga maqsadli RISC-V platformasidan eksperimental dizayn yorlig‘ini olib tashlash, OpenCL uchun C++ qo‘llab-quvvatlash, dasturni LLDda dinamik yuklangan qismlarga bo‘lish imkoniyati va “asm ketdi", Linux yadro kodida ishlatiladi. libc++ WASI (WebAssembly System Interface) uchun qo‘llab-quvvatlashni qo‘shdi va LLD WebAssembly dinamik ulanishi uchun dastlabki yordamni qo‘shdi.

Yaxshilash Clang 9.0 da:

  • Qo'shilgan GCCga xos ifodani amalga oshirish "asm ketdi“, bu sizga assemblerning inline blokidan C kodidagi tegga o'tish imkonini beradi. Bu xususiyat x86_64 arxitekturali tizimlarda Clang yordamida “CONFIG_JUMP_LABEL=y” rejimida Linux yadrosini yaratish uchun talab qilinadi. Oldingi nashrlarda qo'shilgan o'zgarishlarni hisobga olgan holda, Linux yadrosi endi x86_64 arxitekturasi uchun Clang-da qurilishi mumkin (ilgari faqat arm, aarch64, ppc32, ppc64le va mips arxitekturalari uchun qurilish qo'llab-quvvatlangan). Bundan tashqari, Android va ChromeOS loyihalari allaqachon yadro yaratish uchun Clang-dan foydalanishga aylantirilgan va Google Clang-ni Linux tizimlarini ishlab chiqarish uchun yadrolarni yaratish uchun asosiy platforma sifatida sinovdan o'tkazmoqda. Kelajakda yadro yaratish jarayonida LLD, llvm-objcopy, llvm-ar, llvm-nm va llvm-objdump kabi boshqa LLVM komponentlaridan foydalanish mumkin;
  • OpenCL da C++ 17 dan foydalanish uchun tajribaviy yordam qoʻshildi. O'ziga xos xususiyatlarga manzillar maydoni atributlarini qo'llab-quvvatlash, turdagi translatsiya operatorlari tomonidan manzillar maydonini konvertatsiya qilishni bloklash, C uchun OpenCL kabi vektor turlarini taqdim etish, tasvirlar, hodisalar, kanallar va boshqalar uchun maxsus OpenCL turlarining mavjudligi kiradi.
  • “-ftime-trace” va “-ftime-trace-granularity=N” yangi kompilyator bayroqlari frontendning turli bosqichlari (tahlil qilish, ishga tushirish) va backend (optimallashtirish bosqichlari) bajarilish vaqti haqida hisobot yaratish uchun qo'shildi. Hisobot json formatida saqlanadi, chrome://tracing va speedscope.app bilan mos keladi;
  • “__declspec(allocator)” spetsifikatsiyasini qayta ishlash va Visual Studio muhitida xotira sarfini kuzatish imkonini beruvchi nosozliklarni tuzatish ma’lumotlarini yaratish qo‘shildi;
  • C tili uchun "__FILE_NAME__" makrosini qo'llab-quvvatlash qo'shildi, u "__FILE__" makrosiga o'xshaydi, lekin to'liq yo'lsiz faqat fayl nomini o'z ichiga oladi;
  • C++ turli xil C++ funksiyalarini, jumladan parametrlar va argumentlar naqshlarini, mos yozuvlar turlarini, qaytish turini xulosa qilish, ob'ektlar, avtomatik yaratilgan funktsiyalar, o'rnatilgan operatorlar va boshqalarni qamrab olish uchun manzil maydoni atributlarini qo'llab-quvvatlashni kengaytirdi.
  • OpenCL, OpenMP va CUDA-ni qo'llab-quvvatlash bilan bog'liq imkoniyatlar kengaytirildi. Bunga o'rnatilgan OpenCL funksiyalarini ("-fdeclare-opencl-builtins" bayrog'i qo'shildi), cl_arm_integer_dot_product kengaytmasi amalga oshirildi va diagnostika vositalari kengaytirildi;
  • Statik analizatorning ishi takomillashtirildi va statik tahlilni amalga oshirish bo'yicha hujjatlar qo'shildi. Mavjud tekshirgich modullari va qoʻllab-quvvatlanadigan variantlarni (“-analizator-tekshiruvchi[-option]-yordam”, “-analizator-tekshiruvchi[-option]-yordam-alfa” va “-analizator-tekshiruvchi[-option]-yordam” koʻrsatish uchun bayroqlar qoʻshildi. "-ishlab chiquvchi"). Ogohlantirishlarni xato deb hisoblash uchun "-analyzer-werror" belgisi qo'shildi.
    Yangi tekshirish rejimlari qo‘shildi:

    • buferlar bilan ishlashda xavfli amaliyotlarni aniqlash uchun security.insecureAPI.DeprecatedOrUnsafeBufferHandling;
    • osx.MIGChecker MIG (Mach Interface Generator) qo'ng'iroq qoidalarining buzilishini qidirish uchun;
    • noto'g'ri XNU libkern ob'ekt konvertatsiyalarini topish uchun optin.osx.OSObjectCStyleCast;
    • apiModeling.llvm LLVM kod bazasidagi xatolarni aniqlash uchun modellashtirishni tekshirish funktsiyalari to'plami bilan;
    • Boshlanmagan C++ obyektlarini tekshirish uchun barqarorlashtirilgan kod (optin.cplusplus paketidagi UninitializedObject);
  • Clang-format yordam dasturi C# tilida kodni formatlash uchun qo'shimcha qo'llab-quvvatladi va Microsoft tomonidan qo'llaniladigan kod formatlash uslubini qo'llab-quvvatlaydi;
  • Visual Studio-ga kiritilgan cl.exe kompilyatori bilan opsiya darajasida muvofiqlikni ta'minlaydigan muqobil buyruq qatori interfeysi clang-cl mavjud bo'lmagan fayllarni buyruq qatori opsiyalari sifatida ko'rib chiqish va tegishli ogohlantirishni ko'rsatish uchun evristikani qo'shdi (masalan, "clang-cl /diagnostic :caret /c test.cc" ishga tushganda);
  • Yangi cheklarning katta qismi linter clang-tidy-ga qo'shildi, shu jumladan OpenMP API-ga xos bo'lgan tekshiruvlar;
  • Kengaytirilgan server imkoniyatlari clangd Fon indekslarini yaratish rejimi sukut bo'yicha yoqilgan (Clang Server), kod bilan kontekstli harakatlarni qo'llab-quvvatlash qo'shildi (o'zgaruvchini qidirish, avtomatik va makro ta'riflarni kengaytirish, qochib ketgan satrlarni qochib qutulmaganlarga aylantirish), ko'rsatish qobiliyati Clang-tidy-dan ogohlantirishlar, sarlavha fayllaridagi xatolar diagnostikasi kengaytirildi va turdagi ierarxiya haqida ma'lumotni ko'rsatish imkoniyati qo'shildi;

asosiy yangiliklar LLVM 9.0:

  • LLD bog'lovchisiga eksperimental bo'linish xususiyati qo'shildi, bu sizga bitta dasturni bir nechta qismlarga bo'lish imkonini beradi, ularning har biri alohida ELF faylida joylashgan. Bu xususiyat sizga dasturning asosiy qismini ishga tushirish imkonini beradi, u ish paytida kerak bo'lganda boshqa komponentlarni yuklaydi (masalan, siz o'rnatilgan PDF ko'ruvchini alohida faylga ajratishingiz mumkin, u faqat foydalanuvchi PDF-ni ochganda yuklanadi. fayl).

    LLD bog'lovchisi oldinga olib chiqdi arm32_7, arm64, ppc64le va x86_64 arxitekturalari uchun Linux yadrosini ulash uchun mos holatga.
    Yangi variantlar "-" (stdout-ga chiqish), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" va "-z umumiy sahifa hajmi". AArch64 arxitekturasi uchun BTI (Branch Target Indicator) va PAC (Pointer Authentication Code) ko'rsatmalarini qo'llab-quvvatlash qo'shildi. MIPS, RISC-V va PowerPC platformalarini qo‘llab-quvvatlash sezilarli darajada yaxshilandi. WebAssembly uchun dinamik ulanish uchun dastlabki yordam qo'shildi;

  • libc++ da amalga oshirildi ssize, std::is_constant_evaluated, std::midpoint va std::lerp funktsiyalari, std::span ga “front” va “back” usullari qo‘shildi, std::is_unbounded_array va std::is_bounded_array turlarining atributlari qo‘shildi , std imkoniyatlari kengaytirildi: :atomic. GCC 4.9 ni qo‘llab-quvvatlash to‘xtatildi (GCC 5.1 va undan keyingi versiyalarda foydalanish mumkin). Qo'shilgan qo'llab-quvvatlash WASI (WebAssembly System Interface, WebAssembly-dan brauzerdan tashqari foydalanish uchun interfeys);
  • Yangi optimallashtirishlar qo'shildi. Ba'zi holatlarda memcmp qo'ng'iroqlarini bcmp ga aylantirish yoqilgan. Pastki kalit bloklari mavjud bo'lmagan yoki ko'rsatmalar ishlatilmaganda, masalan, void tipidagi funktsiyalarni chaqirganda, o'tish jadvallari uchun diapazonni tekshirish amalga oshirildi;
  • RISC-V arxitekturasi uchun backend barqarorlashtirildi, u endi eksperimental sifatida joylashtirilmaydi va sukut bo'yicha qurilgan. MAFDC kengaytmalari bilan RV32I va RV64I ko'rsatmalar to'plami variantlari uchun to'liq kod ishlab chiqarishni qo'llab-quvvatlaydi;
  • X86, AArch64, ARM, SystemZ, MIPS, AMDGPU va PowerPC arxitekturalari uchun backendlarda koʻplab yaxshilanishlar amalga oshirildi. Masalan, arxitektura uchun
    AArch64 SVE2 (Scalable Vector Extension 2) va MTE (Memory Tagging Extensions) koʻrsatmalarini qoʻllab-quvvatladi; ARM backendida Armv8.1-M arxitekturasi va MVE (M-Profile Vector Extension) kengaytmasi qoʻshildi. GFX10 (Navi) arxitekturasini qo'llab-quvvatlash AMDGPU backendiga qo'shildi, funksiyalarni chaqirish imkoniyatlari sukut bo'yicha yoqilgan va birlashtirilgan o'tish faollashtirilgan DPP (Ma'lumotlarga parallel primitivlar).

  • LLDB tuzatuvchisi endi orqa izlar uchun ranglarni ajratib ko'rsatish va DWARF4 debug_types va DWARF5 debug_info bloklari uchun qo'shimcha yordamga ega;
  • COFF formatidagi ob'ekt va bajariladigan fayllarni qo'llab-quvvatlash llvm-objcopy va llvm-strip yordam dasturlariga qo'shildi.

Manba: opennet.ru

a Izoh qo'shish