GCC 12 kompilyatorlar to'plamining chiqarilishi

Bir yillik rivojlanishdan so'ng, GCC 12.1 bepul kompilyator to'plami chiqarildi, bu yangi GCC 12.x filialidagi birinchi muhim nashr. Yangi nashrlarni raqamlash sxemasiga muvofiq, ishlab chiqish jarayonida 12.0 versiyasidan foydalanilgan va GCC 12.1 chiqarilishidan biroz oldin GCC 13.0 filiali allaqachon tarmoqlangan edi, uning asosida keyingi yirik reliz GCC 13.1 chiqadi. shakllantiriladi. 23 may kuni loyiha GCCning birinchi nashri tashkil topganiga 35 yil to'ladi.

Asosiy o'zgarishlar:

  • C tiplari, funksiyalar orasidagi ulanishlar va disk raskadrovka belgilari haqidagi ma'lumotlarni ixcham saqlashni ta'minlovchi CTF (Compact Type Format) disk raskadrovka formati uchun qo'shimcha qo'llab-quvvatlash. ELF obyektlariga o'rnatilganda, format ma'lumotlarning takrorlanishini oldini olish uchun EFL belgilar jadvallaridan foydalanishga imkon beradi.
  • 1980-yillarda yaratilgan "STABS" disk raskadrovka ma'lumotlarini saqlash formatini qo'llab-quvvatlash eskirgan.
  • C va C++ tillari uchun kelajakdagi C2X va C++23 standartlarini qo‘llab-quvvatlashni kengaytirish bo‘yicha ishlar davom etmoqda. Misol uchun, "if consteval" iborasini qo'llab-quvvatlash qo'shilgan; funktsiya argumentlarida auto dan foydalanishga ruxsat berilgan (“f(auto(g()))”); constexpr deb e'lon qilingan funksiyalarda harfiy bo'lmagan o'zgaruvchilar, goto va teglardan foydalanishga ruxsat beriladi; ko'p o'lchovli indeks operatorlari operatori uchun qo'shimcha yordam []; agar, for va switch, ishga tushirish bloklarining imkoniyatlari kengaytirilgan bo'lsa (“for (T = int; T e : v) yordamida”).
  • C++ standart kutubxonasi C++20 va C++23 standartlarining eksperimental bo‘limlarini qo‘llab-quvvatlashni yaxshilagan. std::move_only_function uchun qo'shimcha qo'llab-quvvatlash, , std::basic_string::regize_va_overwrite, , va std::invoke_r. Constexpr funksiyalarida std::unique_ptr, std::vector, std::basic_string, std::optional va std::variantdan foydalanishga ruxsat berilgan.
  • Fortran frontend TS 29113 spetsifikatsiyasini to'liq qo'llab-quvvatlaydi, bu Fortran va C kodlari o'rtasida portativlikni ta'minlash imkoniyatlarini tavsiflaydi.
  • Ilgari Clang-ga qo'shilgan __builtin_shufflevector(vec1, vec2, index1, index2, ...) kengaytmasini qo'llab-quvvatlash qo'shildi, bu umumiy vektor aralashtirish va aralashish operatsiyalarini bajarish uchun bitta qo'ng'iroqni taklif qiladi.
  • "-O2" optimallashtirish darajasidan foydalanilganda vektorizatsiya sukut bo'yicha yoqilgan (-ftree-vectorize va -fvect-cost-model=juda arzon rejimlari yoqilgan). Juda arzon model vektorlash faqat vektor kodi vektorlashtirilayotgan skaler kodni to'liq almashtira olsagina imkon beradi.
  • Muammolarni kuzatish va ishga tushirilmagan oʻzgaruvchilardan foydalanish bilan bogʻliq zaifliklarni bloklash uchun stekdagi oʻzgaruvchilarni aniq ishga tushirishni yoqish uchun “-ftrivial-auto-var-init” rejimi qoʻshildi.
  • C va C++ tillari uchun ob'ektning o'lchamini aniqlash uchun o'rnatilgan __builtin_dynamic_object_size funksiyasi qo'shilgan, u Clang-dan shunga o'xshash funksiya bilan mos keladi.
  • C va C++ tillari uchun “mavjud emas” atributini qo‘llab-quvvatlash qo‘shilgan (masalan, agar siz ulardan foydalanmoqchi bo‘lsangiz, xatolikka olib keladigan funksiyalarni belgilashingiz mumkin).
  • C va C++ tillari uchun “#elifdef” va “#elifndef” oldindan ishlov berish direktivalarini qo‘llab-quvvatlash qo‘shildi.
  • UTF-8 belgilari noto'g'ri ishlatilsa, ogohlantirishni ko'rsatish uchun "-Wbidi-chars" bayrog'i qo'shildi, bu ikki tomonlama matnni ko'rsatish tartibini o'zgartiradi.
  • Massivlarga tegishli ikkita operandni solishtirishga urinayotganda ogohlantirishni ko‘rsatish uchun “-Warray-compare” belgisi qo‘shildi.
  • Umumiy xotira va vektorlashtirish birliklari (SIMD) bilan ko'p yadroli va gibrid (CPU+GPU/DSP) tizimlarda parallel dasturlash usullarini qo'llash API va usullarini belgilaydigan OpenMP 5.0 va 5.1 (Ochiq Multi-Processing) standartlarini joriy etish. , davom etdi.
  • OpenACC 2.6 parallel dasturlash spetsifikatsiyasining takomillashtirilgan joriy etilishi, u GPU va NVIDIA PTX kabi ixtisoslashtirilgan protsessorlarda yuk tushirish operatsiyalari vositalarini belgilaydi.
  • Kengaytirilgan ko'rsatmalarni qo'llab-quvvatlash Intel AVX86-FP512 va _Float16 turi x16 arxitekturasi uchun kod yaratish backendiga qo'shildi.
  • X86 arxitekturasi uchun shartsiz oldinga o'tish operatsiyalaridan keyin ko'rsatmalarning spekulyativ bajarilishi natijasida yuzaga keladigan protsessorlardagi zaifliklardan himoya qo'shildi. Muammo xotiradagi filial yo'riqnomasidan (SLS, Straight Line Speculation) keyin darhol ko'rsatmalarni oldindan qayta ishlash tufayli yuzaga keladi. Himoyani yoqish uchun "-mharden-sls" opsiyasi taklif etiladi.
  • Eksperimental statik analizatorga ishga tushirilmagan o'zgaruvchilardan foydalanishni aniqlash qo'shildi. Inline qo'shimchalardagi montaj kodini tahlil qilish uchun dastlabki yordam qo'shildi. Xotirani kuzatish yaxshilandi. Kommutator ifodalarini qayta ishlash uchun kod qayta yozildi.
  • Kod generatorini boshqa jarayonlarga joylashtirish va JIT tomonidan bayt kodini mashina kodiga kompilyatsiya qilishda foydalanish uchun umumiy kutubxona bo'lgan libgccjit-ga 30 ta yangi qo'ng'iroqlar qo'shildi.
  • Linux yadrosi uchun eBPF dasturlari kodini faqat bir marta kompilyatsiya qilish va uni moslashtiradigan maxsus universal yuklagichdan foydalanish imkonini beruvchi BPF baytkodini yaratish uchun orqa qismga CO-RE (Bir marta kompilyatsiya qilish - hamma joyda ishga tushirish) mexanizmi qo'shildi. joriy yadro va BPF turlari formatiga yuklangan dastur). CO-RE kompilyatsiya qilingan eBPF dasturlarining portativligi muammosini hal qiladi, ular ilgari faqat ular tuzilgan yadro versiyasida ishlatilishi mumkin edi, chunki ma'lumotlar tuzilmalaridagi elementlarning pozitsiyasi versiyadan versiyaga o'zgaradi.
  • RISC-V backend yangi ko'rsatmalar to'plami arxitektura kengaytmalari zba, zbb, zbc va zbs, shuningdek vektor va skaler kriptografik operatsiyalar uchun ISA kengaytmalarini qo'llab-quvvatlaydi. Odatiy boʻlib, RISC-V ISA 20191213 spetsifikatsiyasi qoʻllab-quvvatlanadi.T-HEAD c906 yadrolari uchun optimallashtirishni yoqish uchun -mtune=thead-c906 bayrogʻi qoʻshilgan.
  • __int128_t/integer(tur=16) turini qoʻllab-quvvatlash GCN mikroarxitekturasi asosidagi AMD GPU’lari uchun kod yaratish backendiga qoʻshildi. Har bir hisoblash bloki (CU) uchun 40 tagacha ishchi guruhlardan va har bir guruh uchun 16 tagacha ko'rsatma jabhasidan (to'lqinli front, SIMD Dvigatel tomonidan parallel ravishda bajariladigan iplar to'plami) foydalanish mumkin. Ilgari, har bir CU uchun faqat bitta ko'rsatma chetiga ruxsat berilgan.
  • NVIDIA PTX (Parallel Thread Execution) ko'rsatmalar to'plami arxitekturasidan foydalangan holda kod yaratish uchun mo'ljallangan NVPTX backend "-march", "-mptx" va "-march-map" bayroqlaridan foydalanish imkoniyatini qo'shdi. PTX ISA sm_53, sm_70, sm_75 va sm_80 uchun qo'llab-quvvatlandi. Standart arxitektura sm_30.
  • PowerPC / PowerPC64 / RS6000 protsessorlari uchun backendda o'rnatilgan funktsiyalarni amalga oshirish qayta yozilgan. __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_texasru, __builtin_set_texasru va documented_builtin_set_bu oʻrnatilgan funksiyalar.
  • Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (korteks-a510), Arm Cortex-A510 (korteks-a710) va Arm Cortex-X710 (korteks-x2) uchun qo'llab-quvvatlash. "-march" opsiyasi bilan foydalanish uchun yangi ARMv2 arxitektura opsiyalari uchun qoʻshimcha qoʻllab-quvvatlandi: armv8-a, armv8.7-a, armv8.8-a. Kengaytirilgan ARM ko'rsatmalaridan (ls9) foydalanish asosida atomik yuklash va ma'lumotlarni xotiraga saqlash uchun kompilyatorga (Intrinsics) o'rnatilgan C funktsiyalarini amalga oshirish qo'shildi. Mopsoption ARM kengaytmasi yordamida memcpy, memmove va memset funktsiyalarini tezlashtirish uchun qo'shimcha yordam qo'shildi.
  • “-fsanitize=shadow-call-stack” (ShadowCallStack) yangi tekshirish rejimi qo‘shildi, u hozirda faqat AArch64 arxitekturasi uchun mavjud va “-ffixed-r18” opsiyasi bilan kod yaratishda ishlaydi. Tartib stekda bufer to'lib ketgan taqdirda funksiyadan qaytish manzilini qayta yozishdan himoya qiladi. Himoyaning mohiyati boshqaruvni funktsiyaga o'tkazgandan so'ng va funktsiyadan chiqishdan oldin ushbu manzilni olgandan so'ng, qaytarish manzilini alohida "soya" stekida saqlashdir.

Manba: opennet.ru

a Izoh qo'shish