GCC 12 хөрвүүлэгчийн багцыг гаргасан

Жилийн турш хөгжүүлсний дараа GCC 12.1 үнэгүй хөрвүүлэгчийн багц гарсан нь GCC 12.x-ийн шинэ салбар дахь анхны чухал хувилбар юм. Шинэ хувилбарын дугаарлалтын схемийн дагуу 12.0 хувилбарыг боловсруулах явцад ашигласан бөгөөд GCC 12.1 гарахаас өмнөхөн GCC 13.0 салбар аль хэдийн салбарласан байсан бөгөөд үүний үндсэн дээр дараагийн томоохон хувилбар болох GCC 13.1 гарах болно. үүсэх. 23-р сарын 35-нд уг төсөл нь GCC-ийн анхны хэвлэл байгуулагдсаны XNUMX жилийн ойг тэмдэглэх болно.

Үндсэн өөрчлөлтүүд:

  • C-төрлийн тухай мэдээлэл, функц хоорондын холболт, дибаг хийх тэмдгүүдийн талаарх мэдээллийг авсаархан хадгалах боломжийг олгодог CTF (Compact Type Format) дибаг хийх форматын дэмжлэгийг нэмсэн. ELF объектуудад суулгагдсан тохиолдолд энэ формат нь өгөгдөл давхардахаас зайлсхийхийн тулд EFL тэмдэгтийн хүснэгтийг ашиглах боломжийг олгодог.
  • 1980-аад онд бүтээгдсэн "STABS" дибаг хийх мэдээлэл хадгалах форматын дэмжлэгийг хуучирсан.
  • C, C++ хэлний ирээдүйн C2X болон C++23 стандартын дэмжлэгийг өргөжүүлэх ажил үргэлжилж байна. Жишээ нь, "if consteval" илэрхийлэлд дэмжлэг нэмсэн; функцийн аргументуудад auto-г ашиглахыг зөвшөөрсөн (“f(auto(g()))”); constexpr гэж зарласан функцүүдэд шууд утгагүй хувьсагч, goto болон шошго ашиглахыг зөвшөөрдөг; Олон хэмжээст индексийн операторын операторын дэмжлэгийг нэмсэн[]; Хэрэв, for болон switch, эхлүүлэх блокуудын боломжуудыг өргөтгөсөн бол (“for (T = int; T e : v) ашиглан)”).
  • C++ стандарт номын сан нь C++20 болон C++23 стандартуудын туршилтын хэсгүүдэд зориулсан дэмжлэгийг сайжруулсан. std::move_only_function, , std::basic_string::resize_and_overwrite, , болон std::invoke_r-д зориулсан дэмжлэг нэмэгдсэн. std::unique_ptr, std::vector, std::basic_string, std::optional болон std::variant-г constexpr функцэд ашиглахыг зөвшөөрсөн.
  • Fortran урд тал нь TS 29113 техникийн үзүүлэлтийг бүрэн дэмждэг бөгөөд энэ нь Fortran болон C кодын хооронд зөөвөрлөх чадварыг тодорхойлдог.
  • Clang-д өмнө нь нэмсэн __builtin_shufflevector(vec1, vec2, index1, index2, ...) өргөтгөлийн дэмжлэгийг нэмсэн бөгөөд энэ нь нийтлэг вектор холих болон холих үйлдлүүдийг гүйцэтгэхэд нэг дуудлага санал болгодог.
  • "-O2" оновчлолын түвшинг ашиглах үед векторжуулалтыг анхдагчаар идэвхжүүлдэг (-ftree-vectorize болон -fvect-cost-model=маш хямд горимууд идэвхжсэн). Маш хямд загвар нь вектор код нь векторжуулж буй скаляр кодыг бүрэн орлож чадах тохиолдолд л векторжуулалтыг зөвшөөрдөг.
  • "-ftrivial-auto-var-init" горимыг нэмсэн бөгөөд сттек дээрх хувьсагчдыг тодорхой эхлүүлэх боломжийг идэвхжүүлж, эхлээгүй хувьсагчдыг ашиглахтай холбоотой эмзэг байдлыг блоклосон.
  • C болон C++ хэлний хувьд Clang-ийн ижил төстэй функцтэй нийцтэй объектын хэмжээг тодорхойлох __builtin_dynamic_object_size функцийг нэмсэн.
  • C болон C++ хэлний хувьд "боломжгүй" шинж чанарын дэмжлэг нэмэгдсэн (жишээлбэл, хэрэв та тэдгээрийг ашиглахыг оролдвол алдаа гаргах функцийг тэмдэглэж болно).
  • C болон C++ хэлний хувьд “#elifdef” болон “#elifndef” урьдчилан боловсруулах удирдамжийн дэмжлэгийг нэмсэн.
  • UTF-8 тэмдэгтийг буруу ашигласан тохиолдолд анхааруулга харуулахын тулд "-Wbidi-chars" дарцаг нэмж, хоёр чиглэлтэй текстийг харуулах дарааллыг өөрчилсөн.
  • Массивтай холбоотой хоёр операндыг харьцуулах гэж оролдох үед анхааруулга харуулахын тулд "-Warray-харьцуулах" тэмдгийг нэмсэн.
  • Дундын санах ой, векторжуулалтын нэгж (SIMD) бүхий олон цөмт болон эрлийз (CPU+GPU/DSP) системүүд дээр зэрэгцээ програмчлалын аргуудыг хэрэглэх API болон аргуудыг тодорхойлсон OpenMP 5.0 ба 5.1 (Нээлттэй олон боловсруулалт) стандартын хэрэгжилт. , үргэлжилсэн.
  • GPU болон NVIDIA PTX зэрэг тусгай процессорууд дээрх ачааллыг буулгах ажиллагааг тодорхойлдог OpenACC 2.6 зэрэгцээ програмчлалын тодорхойлолтыг сайжруулсан.
  • Intel AVX86-FP512 болон _Float16 төрлийн өргөтгөсөн зааврын дэмжлэгийг x16 архитектурын код үүсгэх арын хэсэгт нэмсэн.
  • X86 архитектурын хувьд болзолгүй урагшлах үйлдлүүдийн дараа зааврын таамаглалаар гүйцэтгэсэн процессоруудын эмзэг байдлаас хамгаалах хамгаалалт нэмэгдсэн. Санах ой дахь салбар зааврын (SLS, Шулуун шугамын таамаглал) нэн даруй зааврыг урьдчилан боловсруулсны улмаас асуудал үүсдэг. Хамгаалалтыг идэвхжүүлэхийн тулд "-mharden-sls" сонголтыг санал болгож байна.
  • Туршилтын статик анализаторт эхлээгүй хувьсагчийн ашиглалтын илрүүлэлтийг нэмсэн. Дотор оруулга дахь угсралтын кодыг шинжлэх анхны дэмжлэгийг нэмсэн. Сайжруулсан санах ойн хяналт. Шилжүүлэгч илэрхийллийг боловсруулах кодыг дахин бичсэн.
  • Код үүсгэгчийг бусад процессуудад суулгаж, JIT нь байт кодыг машины код болгон хөрвүүлэхэд ашиглах дундын номын сан болох libgccjit-д 30 шинэ дуудлага нэмсэн.
  • CO-RE (Нэг удаа эмхэтгэх - хаа сайгүй ажиллуулах) механизмын дэмжлэгийг BPF байт код үүсгэх арын хэсэгт нэмсэн бөгөөд энэ нь Линукс цөмд зориулсан eBPF програмын кодыг зөвхөн нэг удаа эмхэтгэх боломжийг олгодог бөгөөд тусгай бүх нийтийн дуудагчийг ашиглах боломжийг олгодог. програмыг одоогийн цөм болон BPF төрлийн формат руу ачаалсан. CO-RE нь хөрвүүлсэн eBPF програмын зөөврийн асуудлыг шийддэг бөгөөд үүнийг өмнө нь зөвхөн хөрвүүлсэн цөмийн хувилбарт ашиглах боломжтой байсан, учир нь өгөгдлийн бүтэц дэх элементүүдийн байрлал хувилбараас хувилбар руу өөрчлөгддөг.
  • RISC-V арын хэсэг нь zba, zbb, zbc болон zbs гэсэн шинэ зааврын багц архитектурын өргөтгөлүүдийг, мөн вектор болон скаляр криптографийн үйлдлүүдэд зориулсан ISA өргөтгөлүүдийг дэмждэг. Анхдагч байдлаар, RISC-V ISA 20191213 техникийн үзүүлэлтийг дэмждэг. T-HEAD c906 цөмийн оновчлолыг идэвхжүүлэхийн тулд -mtune=thead-c906 тугийг нэмсэн.
  • __int128_t/integer(kind=16) төрлийн дэмжлэгийг GCN микроархитектур дээр суурилсан AMD GPU-д зориулсан код үүсгэх арын хэсэгт нэмсэн. Тооцооллын нэгж (CU) тутамд 40 хүртэлх ажлын хэсэг, нэг бүлэгт 16 хүртэлх зааварчилгааны фронт (долгионы фронт, SIMD хөдөлгүүрийн зэрэгцээ гүйцэтгэсэн хэлхээний багц) ашиглах боломжтой. Өмнө нь CU-д зөвхөн нэг зааврын ирмэгийг зөвшөөрдөг байсан.
  • NVIDIA PTX (Parallel Thread Execution) зааврын багц архитектурыг ашиглан код үүсгэх зорилготой NVPTX backend нь “-march”, “-mptx” болон “-march-map” тугуудыг ашиглах боломжийг нэмсэн. PTX ISA sm_53, sm_70, sm_75 болон sm_80-ийн дэмжлэгийг хэрэгжүүлсэн. Өгөгдмөл архитектур нь sm_30 юм.
  • PowerPC / PowerPC64 / RS6000 процессоруудын арын хэсэгт суулгасан функцүүдийн хэрэгжилтийг дахин бичсэн болно. __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_texasru, __builtin_set_f_sett_-д суулгагдсан функцууд.
  • Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cotex-a510), Arm Cortex-A510 (cotex-a710) болон Arm Cortex-X710 (cotex-x2)-ийн дэмжлэг. Armv2-a, armv8-a, armv8.7-a "-march" сонголттой ашиглах шинэ ARMv8.8 архитектурын сонголтуудын дэмжлэгийг нэмсэн. Өргөтгөсөн ARM зааврыг (ls9) ашиглах үндсэн дээр атомаар ачаалах, санах ойд өгөгдлийг хадгалахад зориулагдсан хөрвүүлэгчид (Intrinsics) суулгасан C функцүүдийн хэрэгжилт нэмэгдсэн. mopsoption ARM өргөтгөлийг ашиглан memcpy, memmove болон memset функцуудыг хурдасгах дэмжлэг нэмэгдсэн.
  • "-fsanitize=shadow-call-stack" (ShadowCallStack) шалгах шинэ горимыг нэмсэн бөгөөд энэ нь одоогоор зөвхөн AArch64 архитектурт ашиглах боломжтой бөгөөд "-ffixed-r18" сонголтоор код үүсгэх үед ажилладаг. Уг горим нь стек дээр буфер дүүрсэн тохиолдолд функцээс буцах хаягийг дарж бичихээс хамгаална. Хамгаалалтын мөн чанар нь функц руу хяналтыг шилжүүлж, функцээс гарахын өмнө энэ хаягийг сэргээсний дараа буцах хаягийг тусдаа "сүүдэр" стек болгон хадгалах явдал юм.

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх