LLVM 12.0 kompilyatorlar to'plamining chiqarilishi

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

  • C++20 standartida taklif qilingan “ehtimol” va “ehtimol” atributlarini qo‘llab-quvvatlash sukut bo‘yicha joriy qilingan va yoqilgan bo‘lib, optimallashtiruvchiga shartli konstruksiyaning ishga tushish ehtimoli haqida ma’lumot olish imkonini beradi (masalan, “[[ehtimol ]] agar (tasodifiy > 0) {“).
  • AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) va Intel Sapphire Rapids (-march=sapphirerapids) protsessorlarini qo‘llab-quvvatlash qo‘shildi.
  • X86-64 arxitektura darajalarini tanlash uchun “-march=x234-86-v[64]” bayroqlari uchun qoʻshimcha yordam qoʻshildi (v2 - SSE4.2, SSSE3, POPCNT va CMPXCHG16B kengaytmalarini qamrab oladi; v3 - AVX2 va MOVBE; v4 - AVX-512 ).
  • Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (korteks-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) va Fujitsu A64FX (a64fx) protsessorlari uchun qo'shimcha qo'llab-quvvatlash. Masalan, Neoverse-V1 protsessorlari uchun optimallashtirishni yoqish uchun siz “-mcpu=neoverse-v1” ni belgilashingiz mumkin.
  • AArch64 arxitekturasi uchun yangi kompilyator bayroqlari "-moutline-atomics" va "-mno-outline-atomics" "__aarch64_cas8_relax" kabi atom operatsiyalari yordamchi funktsiyalarini yoqish yoki o'chirish uchun qo'shildi. Bunday funktsiyalar ish vaqtida LSE (Katta tizim kengaytmalari) qo'llab-quvvatlashi mavjudligini aniqlaydi va taqdim etilgan atom protsessor ko'rsatmalaridan foydalanadi yoki sinxronizatsiya uchun LL/SC (Load-link/store-shart) ko'rsatmalaridan foydalanishga qaytadi.
  • Eski bog'lovchi va assembler harakati bilan mosligi uchun binutils to'plamining maqsadli versiyasini tanlash uchun "-fbinutils-version" opsiyasi qo'shildi.
  • ELF bajariladigan fayllar uchun "-gz" bayrog'i ko'rsatilganda, zlib kutubxonasi yordamida disk raskadrovka ma'lumotlarini siqish sukut bo'yicha yoqilgan (gz=zlib). Olingan obyekt fayllarini ulash uchun lld yoki GNU binutils 2.26+ talab qilinadi. Binautillarning eski versiyalari bilan moslikni tiklash uchun siz "-gz=zlib-gnu" ni belgilashingiz mumkin.
  • "Bu" ko'rsatgich endi null bo'lmagan va dereferenceable(N) tekshiruvlar bilan qayta ishlanadi. NULL qiymatlardan foydalanish kerak bo'lganda null bo'lmagan atributni olib tashlash uchun "-fdelete-null-pointer-checks" variantidan foydalanishingiz mumkin.
  • Linux platformasida AArch64 va PowerPC arxitekturalarida GCCdagi kabi chaqiruv jadvallarini yaratish uchun "-fasinxron-unwind-jadvallar" rejimi yoqilgan.
  • "#pragma clang loop vectorize_width" da vektorizatsiya usulini tanlash uchun "fikrlangan" (standart) va "miqyoslanishi" parametrlarini belgilash imkoniyati qo'shildi. Vektor uzunligidan bog'liq bo'lmagan "miqyoslash" rejimi eksperimental bo'lib, masshtabli vektorlashtirishni qo'llab-quvvatlaydigan apparatda qo'llanilishi mumkin.
  • Windows platformasi uchun takomillashtirilgan qo'llab-quvvatlash: Arm64 tizimlarida Windows uchun rasmiy ikkilik yig'ilishlar, jumladan Clang kompilyatori, LLD bog'lovchisi va compiler-rt ish vaqti kutubxonalari tayyorlangan. MinGW maqsadli platformalarini yaratishda, hatto o'zaro kompilyatsiya qilishda ham .exe qo'shimchasi qo'shiladi.
  • OpenCL, OpenMP va CUDA-ni qo'llab-quvvatlash bilan bog'liq imkoniyatlar kengaytirildi. OpenCL 3.0 va OpenCL 1.0 uchun makro-opsiyalarni tanlash uchun “-cl-std=CL3.0” va “-cl-std=CL1.0” opsiyalari qo‘shildi. Diagnostika vositalari kengaytirildi.
  • Ba'zi x86-ga asoslangan protsessorlarda qo'llaniladigan HRESET, UINTR va AVXVNNI ko'rsatmalariga qo'shimcha yordam.
  • X86 tizimlarida "-mtune=" opsiyasini qo'llab-quvvatlash yoqilgan ", "-march= qiymatidan qat'i nazar, tanlangan mikroarxitektura optimallashtirishlarini faollashtiradi. "
  • Statik analizator ba'zi POSIX funktsiyalarini qayta ishlashni yaxshiladi va taqqoslashda bir nechta ramziy qiymatlar mavjud bo'lganda shartli operatsiyalar natijasini aniqlashni sezilarli darajada yaxshiladi. Yangi tekshiruvlar qo'shildi: fuchia.HandleChecker (tuzilmalardagi tutqichlarni belgilaydi), webkit.UncountedLambdaCapturesChecker webkit va alpha.webkit.UncountedLocalVarsChecker (WebKit dvigatel kodidagi ko'rsatkichlar bilan ishlashning o'ziga xos xususiyatlarini hisobga oladi).
  • Konstantalar kontekstida qoʻllaniladigan iboralarda oʻrnatilgan __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __revers,_verse_bs,_rs_bs,_bit_s, funksiyalaridan foydalanish. __bswapd, __bswap64, ruxsat berilgan. __bswapq , _castf*, __rol* va __ror*.
  • Identifikatorlar, ustunlar va maydon ta'riflari atrofidagi oraliqlarni tanlash uchun clang formati yordam dasturiga BitFieldColonSpacing opsiyasi qo'shildi.
  • Linux platformasidagi clangd keshlash serveri (Clang Server) uzoq muddatli ish paytida xotira sarfini sezilarli darajada kamaytirdi (malloc_trim-ga davriy qo'ng'iroqlar bo'sh xotira sahifalarini operatsion tizimga qaytarish uchun taqdim etiladi).

LLVM 12.0 dagi asosiy yangiliklar:

  • Python-da yozilgan llvm-build qurish vositasini qo'llab-quvvatlash to'xtatildi va buning o'rniga loyiha butunlay CMake qurish tizimidan foydalanishga o'tdi.
  • AArch64 arxitekturasi uchun backendda Windows platformasini qoʻllab-quvvatlash yaxshilandi: maqsadli Windows tizimlari uchun assembler chiqishini toʻgʻri ishlab chiqarish taʼminlandi, qoʻngʻiroqlarni bekor qilish boʻyicha maʼlumotlar ishlab chiqarish optimallashtirildi (bunday maʼlumotlar hajmi 60 ga kamaydi). %), assembler yordamida ma'lumotlarni ochish qobiliyatiga .seh_* direktivalari qo'shildi.
  • PowerPC arxitekturasi uchun backend looplar va inline joylashtirish uchun yangi optimallashtirish, Power10 protsessorlari uchun kengaytirilgan qo'llab-quvvatlash, matritsalarni manipulyatsiya qilish uchun MMA ko'rsatmalarini qo'shimcha qo'llab-quvvatlash va AIX operatsion tizimi uchun yaxshilangan yordamni o'z ichiga oladi.
  • X86 backend AMD Zen 3, Intel Alder Lake va Intel Sapphire Rapids protsessorlarini, shuningdek, HRESET, UINTR va AVXVNNI protsessor ko'rsatmalarini qo'llab-quvvatlaydi. Xotira chegaralari endi qo'llab-quvvatlanmasligiga ishonch hosil qilish uchun ko'rsatkichlarni tekshirish uchun MPX (Xotirani himoya qilish kengaytmalari) ni qo'llab-quvvatlash (bu texnologiya keng tarqalmagan va allaqachon GCC va clangdan olib tashlangan). Operand ofsetlari va sakrashlar hajmini boshqarish uchun {disp32} va {disp8} prefikslari hamda .d32 va .d8 qo'shimchalari uchun assemblerga qo'shimcha yordam qo'shildi. Mikroarxitekturani optimallashtirishni qo'shishni nazorat qilish uchun yangi "tune-cpu" atributi qo'shildi.
  • Chapga biroz siljigandan so‘ng belgisiz butun sonlarning to‘lib ketishini aniqlash uchun butun son muammosi detektoriga (integer sanitizer, “-fsanitize=integer”) yangi “-fsanitize=unsigned-shift-base” rejimi qo‘shildi.
  • Turli detektorlarda (asan, cfi, lsan, msan, tsan, ubsan sanitizer) standart Musl kutubxonasi bilan Linux distributivlarini qo'llab-quvvatlash qo'shilgan.
  • LLD bog'lovchining imkoniyatlari kengaytirildi. ELF formatini qoʻllab-quvvatlash yaxshilandi, jumladan “--dependency-file”, “-error-handling-script”, “-lto-pseudo-probe-for-profiling”, “-no-lto-whole-dastur” qoʻshilgan. -ko'rinish"" Yaxshilangan MinGW yordami. Mach-O formati (macOS) uchun arm64, arm va i386 arxitekturalarini qo'llab-quvvatlash, ulanish vaqtini optimallashtirish (LTO) va istisnolardan foydalanish uchun stekni ochish amalga oshirildi.
  • Libc++ C++20 standartining yangi funksiyalarini amalga oshiradi va C++2b spetsifikatsiyasining xususiyatlarini ishlab chiqishni boshladi. Lokalizatsiyani qoʻllab-quvvatlashni oʻchirib qoʻyish (“-DLIBCXX_ENABLE_LOCALIZATION=OFF”) va psevdo-tasodifiy raqamlarni yaratish uchun qurilmalar (“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”) bilan qurish uchun qoʻshimcha yordam qoʻshildi.

Manba: opennet.ru

a Izoh qo'shish