Paglabas ng GCC 12 compiler suite

Pagkatapos ng isang taon ng pagbuo, ang libreng compiler suite na GCC 12.1 ay inilabas, ang unang makabuluhang release sa bagong sangay ng GCC 12.x. Alinsunod sa bagong release numbering scheme, ang bersyon 12.0 ay ginamit sa proseso ng pag-develop, at ilang sandali bago ang release ng GCC 12.1, ang GCC 13.0 branch ay nagsanga na, kung saan ang susunod na major release, ang GCC 13.1, ay magsa-sanga na. mabuo. Sa Mayo 23, ipagdiriwang ng proyekto ang 35 taon mula nang mabuo ang unang edisyon ng GCC.

Pangunahing pagbabago:

  • Nagdagdag ng suporta para sa format ng pag-debug ng CTF (Compact Type Format), na nagbibigay ng compact storage ng impormasyon tungkol sa mga uri ng C, mga koneksyon sa pagitan ng mga function at mga simbolo ng pag-debug. Kapag naka-embed sa mga ELF object, pinapayagan ng format ang paggamit ng mga EFL character table upang maiwasan ang pagdoble ng data.
  • Ang suporta para sa "STABS" na format ng pag-debug ng impormasyon sa storage, na nilikha noong 1980s, ay hindi na ginagamit.
  • Patuloy na pinapalawak ng trabaho ang suporta para sa hinaharap na mga pamantayan ng C2X at C++23 para sa mga wikang C at C++. Halimbawa, idinagdag ang suporta para sa ekspresyong "kung consteval"; pinapayagang gumamit ng auto sa mga argumento ng function ("f(auto(g()))"); ang paggamit ng mga di-literal na variable, goto at mga label ay pinapayagan sa mga function na idineklara bilang constexpr; nagdagdag ng suporta para sa multidimensional index operator operator[]; sa kung, para sa at lumipat, ang mga kakayahan ng mga bloke sa pagsisimula ay pinalawak ("para sa (gamit ang T = int; T e : v)").
  • Pinahusay ng C++ Standard Library ang suporta para sa mga pang-eksperimentong seksyon ng mga pamantayang C++20 at C++23. Nagdagdag ng suporta para sa std::move_only_function, , std::basic_string::resize_and_overwrite, , at std::invoke_r. Pinapayagan na gumamit ng std::unique_ptr, std::vector, std::basic_string, std::opsyonal at std::variant sa mga function ng constexpr.
  • Ang frontend ng Fortran ay nagbibigay ng buong suporta para sa detalye ng TS 29113, na naglalarawan ng mga kakayahan para sa pagtiyak ng portability sa pagitan ng Fortran at C code.
  • Nagdagdag ng suporta para sa extension na __builtin_shufflevector(vec1, vec2, index1, index2, ...) na dati nang idinagdag sa Clang, na nag-aalok ng isang tawag para magsagawa ng mga karaniwang vector shuffle at shuffle na operasyon.
  • Kapag ginagamit ang "-O2" na antas ng pag-optimize, ang vectorization ay pinagana bilang default (ang -ftree-vectorize at -fvect-cost-model=very-cheap mode ay pinagana). Ang napakamurang modelo ay nagpapahintulot lamang sa vectorization kung ang vector code ay maaaring ganap na palitan ang scalar code na ini-vector.
  • Idinagdag ang mode na "-ftrivial-auto-var-init" upang paganahin ang tahasang pagsisimula ng mga variable sa stack upang subaybayan ang mga isyu at harangan ang mga kahinaan na nauugnay sa paggamit ng mga hindi nasimulang variable.
  • Para sa mga wikang C at C++, isang built-in na function na __builtin_dynamic_object_size ay idinagdag upang matukoy ang laki ng isang bagay, na tugma sa isang katulad na function mula sa Clang.
  • Para sa mga wikang C at C++, idinagdag ang suporta para sa attribute na "unavailable" (halimbawa, maaari mong markahan ang mga function na bubuo ng error kung susubukan mong gamitin ang mga ito).
  • Para sa mga wikang C at C++, idinagdag ang suporta para sa preprocessing na mga direktiba na β€œ#elifdef” at β€œ#elifndef”.
  • Idinagdag ang flag na "-Wbidi-chars" upang magpakita ng babala kung ang mga UTF-8 na character ay ginamit nang hindi tama, binabago ang pagkakasunud-sunod kung saan ipinapakita ang bidirectional na teksto.
  • Idinagdag ang flag na "-Warray-compare" upang magpakita ng babala kapag sinusubukang ihambing ang dalawang operand na tumutukoy sa mga array.
  • Ang pagpapatupad ng mga pamantayan ng OpenMP 5.0 at 5.1 (Open Multi-Processing), na tumutukoy sa API at mga pamamaraan para sa paglalapat ng mga parallel programming method sa multi-core at hybrid (CPU+GPU/DSP) na mga system na may shared memory at vectorization units (SIMD) , ay nagpatuloy.
  • Pinahusay na pagpapatupad ng OpenACC 2.6 parallel programming specification, na tumutukoy sa mga tool para sa pag-offload ng mga operasyon sa mga GPU at dalubhasang processor gaya ng NVIDIA PTX.
  • Suporta para sa mga pinahabang tagubilin Intel AVX86-FP512 at ang uri ng _Float16 ay idinagdag sa code generation backend para sa x16 architecture.
  • Para sa arkitektura ng x86, idinagdag ang proteksyon laban sa mga kahinaan sa mga processor na dulot ng speculative execution ng mga tagubilin pagkatapos ng walang kondisyong forward jump operations. Ang problema ay nangyayari dahil sa pre-emptive na pagpoproseso ng mga tagubilin kaagad kasunod ng pagtuturo ng sangay sa memorya (SLS, Straight Line Speculation). Upang paganahin ang proteksyon, ang opsyon na "-mharden-sls" ay iminungkahi.
  • Idinagdag ang pagtuklas ng paggamit ng mga hindi nasimulang variable sa pang-eksperimentong static analyzer. Nagdagdag ng paunang suporta para sa pagsusuri ng assembly code sa mga inline na pagsingit. Pinahusay na pagsubaybay sa memorya. Ang code para sa pagproseso ng mga expression ng switch ay muling isinulat.
  • Nagdagdag ng 30 bagong tawag sa libgccjit, isang shared library para sa pag-embed ng code generator sa ibang mga proseso at paggamit nito sa JIT compile bytecode sa machine code.
  • Ang suporta para sa mekanismo ng CO-RE (Compile Once - Run Everywhere) ay idinagdag sa backend para sa pagbuo ng BPF bytecode, na nagbibigay-daan sa iyong i-compile ang code ng mga programang eBPF para sa Linux kernel nang isang beses lang at gumamit ng isang espesyal na unibersal na loader na umaangkop sa na-load ang programa sa kasalukuyang kernel at BPF Types Format). Nilulutas ng CO-RE ang problema sa portability ng pinagsama-samang mga programa ng eBPF, na dati ay magagamit lamang sa bersyon ng kernel kung saan sila ay pinagsama-sama, dahil ang posisyon ng mga elemento sa mga istruktura ng data ay nagbabago mula sa bersyon patungo sa bersyon.
  • Ang backend ng RISC-V ay nagdaragdag ng suporta para sa mga bagong extension ng architecture set ng pagtuturo na zba, zbb, zbc at zbs, pati na rin ang mga extension ng ISA para sa vector at scalar cryptographic na mga operasyon. Bilang default, ibinibigay ang suporta para sa detalye ng RISC-V ISA 20191213. Ang -mtune=thead-c906 na flag ay idinagdag upang paganahin ang mga pag-optimize para sa mga T-HEAD c906 core.
  • Ang suporta para sa uri ng __int128_t/integer(kind=16) ay naidagdag sa backend ng pagbuo ng code para sa mga AMD GPU batay sa GCN microarchitecture. Posibleng gumamit ng hanggang 40 work group bawat computing unit (CU) at hanggang 16 instruction fronts (wavefront, isang set ng mga thread na pinaandar nang kahanay ng SIMD Engine) bawat grupo. Dati, isang gilid ng pagtuturo lamang sa bawat CU ang pinapayagan.
  • Ang backend ng NVPTX, na idinisenyo upang bumuo ng code gamit ang arkitektura ng set ng pagtuturo ng NVIDIA PTX (Parallel Thread Execution), ay nagdagdag ng kakayahang gamitin ang mga flag na "-march", "-mptx" at "-march-map". Ipinatupad ang suporta para sa PTX ISA sm_53, sm_70, sm_75 at sm_80. Ang default na arkitektura ay sm_30.
  • Sa backend para sa mga processor ng PowerPC / PowerPC64 / RS6000, ang mga pagpapatupad ng mga built-in na function ay muling isinulat. Ang mga built-in na function ay __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar at __builtin_seted.
  • Suporta para sa Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) at Arm Cortex-X710 (cortex- x2). Nagdagdag ng suporta para sa mga bagong opsyon sa arkitektura ng ARMv2 para gamitin sa opsyong "-march": armv8-a, armv8.7-a, armv8.8-a. Idinagdag ang pagpapatupad ng mga C function na nakapaloob sa compiler (Intrinsics) para sa atomic loading at pag-save ng data sa memorya, batay sa paggamit ng mga pinahabang ARM na tagubilin (ls9). Nagdagdag ng suporta para sa pagpapabilis ng memcpy, memmove at memset function gamit ang mopsoption ARM extension.
  • Nagdagdag ng bagong checking mode na "-fsanitize=shadow-call-stack" (ShadowCallStack), na kasalukuyang available lang para sa AArch64 architecture at gumagana kapag bumubuo ng code gamit ang opsyong "-ffixed-r18". Ang mode ay nagbibigay ng proteksyon laban sa pag-overwrite ng return address mula sa isang function kung sakaling magkaroon ng buffer overflow sa stack. Ang esensya ng proteksyon ay i-save ang return address sa isang hiwalay na "shadow" stack pagkatapos ilipat ang kontrol sa isang function at makuha ang address na ito bago lumabas sa function.

Pinagmulan: opennet.ru

Magdagdag ng komento