Paglabas ng GCC 10 compiler suite

Pagkatapos ng isang taon ng pag-unlad nalathala paglabas ng isang libreng hanay ng mga compiler GCC 10.1, ang unang pangunahing release sa bagong sangay ng GCC 10.x. Alinsunod sa bagong scheme mga numero ng release, bersyon 10.0 ay ginamit sa proseso ng pag-develop, at ilang sandali bago ang paglabas ng GCC 10.1, ang sangay ng GCC 11.0 ay nagsanga na, batay sa kung saan ang susunod na makabuluhang release, ang GCC 11.1, ay mabubuo.

Ang GCC 10.1 ay kapansin-pansin para sa pagpapatupad ng maraming inobasyon sa wikang C++ na binuo para sa pamantayang C++20, mga pagpapahusay na nauugnay sa hinaharap na pamantayan ng wikang C (C2x), mga bagong pag-optimize sa mga backend ng compiler at pang-eksperimentong suporta static analysis mode. Bilang karagdagan, sa panahon ng paghahanda ng isang bagong sangay, inilipat ng proyekto ang repositoryo mula sa SVN patungo sa Git.

Ang pangunahing pagbabago:

  • Idinagdag pang-eksperimentong mode ng static na pagsusuri "-fanalyzerβ€œ, na nagsasagawa ng resource-intensive interprocedural analysis ng code execution path at data flows sa isang program. Ang mode ay may kakayahang mag-detect ng mga problema sa yugto ng compilation, tulad ng mga dobleng tawag sa free() function para sa isang memory area, file descriptor leaks, dereferencing at pagpasa ng mga null pointer, pag-access sa mga nabakanteng bloke ng memorya, gamit ang mga uninitialized na halaga, atbp. Ang paggamit ng bagong mode para sa OpenSSL code ay naging posible na makilala mapanganib na kahinaan.
  • Mga pinahusay na interprocedural optimization. Ang IPA-SRA (Interprocedural Scalar Shared Replacement) pass ay muling idinisenyo upang gumana sa oras ng pagkakatali at, bukod sa iba pang mga bagay, ngayon ay nag-aalis ng nakalkula at nagbabalik ng mga hindi nagamit na halaga. Sa "-O2" optimization mode, ang "-finline-functions" na opsyon ay naka-enable, na muling binago upang paboran ang mas compact na code kaysa sa pagganap ng pagpapatupad. Ang gawain ng heuristic para sa inline na pag-deploy ng function ay pinabilis. Ang inline expansion at function cloning heuristics ay maaari na ngayong gumamit ng impormasyon tungkol sa mga hanay ng halaga upang mahulaan ang pagiging epektibo ng mga indibidwal na pagbabago. Para sa C++, napabuti ang katumpakan ng pag-parse ng alias na nakabatay sa uri.
  • Pinahusay na Linking Time Optimizations (LTO). Nagdagdag ng bagong executable lto-dump upang i-reset ang impormasyon tungkol sa mga object file na may LTO bytecode. Awtomatikong tinutukoy ng mga parallel LTO pass ang bilang ng sabay-sabay na pagpapatakbo ng mga gawain sa paggawa at, kung hindi matukoy ang mga ito, gumamit ng impormasyon tungkol sa bilang ng mga core ng CPU bilang parallelization factor. Nagdagdag ng kakayahang i-compress ang LTO bytecode gamit ang zstd algorithm.
  • Ang mekanismo ng optimization batay sa mga resulta ng code profiling (PGO - Profile-guided optimization) ay napabuti, na bumubuo ng mas pinakamainam na code batay sa pagsusuri ng mga katangian ng code execution. Pinahusay na pagpapanatili ng profile sa panahon ng compilation at hot/cold code separation. Sa pamamagitan ng opsyon "-fprofile-mga halagaΒ» maaari na ngayong subaybayan ang hanggang 4 na halaga ng profile, halimbawa para sa mga hindi direktang tawag at pagbibigay ng mas tumpak na impormasyon ng profile.
  • Ipinatupad ang parallel programming specification para sa C, C++ at Fortran na mga wika OpenACC 2.6, na tumutukoy sa mga tool para sa pag-offload ng mga operasyon sa mga GPU at mga dalubhasang processor gaya ng NVIDIA PTX. Ang pagpapatupad ng pamantayan ay halos kumpleto na Buksan ang MP 5.0 (Open Multi-Processing), na tumutukoy sa API at mga paraan ng 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). Nagdagdag ng mga feature gaya ng lastprivate conditional, scan at loop directives, order at use_device_addr expression. Para sa OpenMP at OpenACC, idinagdag ang suporta para sa pag-offload ng mga operasyon sa ikaapat na henerasyon (Fiji) at ikalimang henerasyong AMD Radeon (GCN) GPU (VEGA 10/VEGA 20).
  • Para sa mga wika ng pamilyang C, idinagdag ang function na "access" upang ilarawan ang pag-access ng function sa mga bagay na ipinasa sa pamamagitan ng reference o pointer, at upang iugnay ang mga naturang bagay sa mga argumentong integer na naglalaman ng impormasyon tungkol sa laki ng mga bagay. Upang gumana kasabay ng "access", ang "uri" na katangian ay ipinatupad upang makita ang maling pag-access mula sa mga function ng user, halimbawa, kapag nagsusulat ng mga halaga sa isang lugar sa labas ng mga hangganan ng array. Idinagdag din ang katangiang "symver" upang iugnay ang mga simbolo sa isang ELF file na may mga partikular na numero ng bersyon.
  • Idinagdag ang mga bagong babala:
    • "-Wstring-compare" (pinagana sa "-Wextra") - nagbabala tungkol sa pagkakaroon ng mga expression kung saan ang zero ay inihambing sa resulta ng pagtawag sa strcmp at strncmp function, na katumbas ng isang pare-pareho dahil sa katotohanan na ang haba ng isang argumento ay mas malaki kaysa sa laki ng array sa pangalawang argumento .
    • "-Wzero-length-bounds" (enabled with "-Warray-bounds") - nagbabala tungkol sa pag-access sa mga elemento ng array na zero ang haba, na maaaring humantong sa pag-overwrit ng iba pang data.
    • Ang "-Warray-bounds", "-Wformat-overflow", "-Wrestrict", "-Wreturn-local-addr" at "-Wstringop-overflow" na mga babala ay pinalawak upang mapalawak ang bilang ng mga out-of-bounds na sitwasyon na hinahawakan.
  • Ipinatupad ang kakayahang direktang tukuyin ang malalawak na character sa mga identifier gamit ang kasalukuyang pag-encode (UTF-8 bilang default) sa halip na UCN notation (\uNNNN o \UNNNNNNNNN). Halimbawa:

    static const int Ο€ = 3;
    int get_naΓ―ve_pi() {
    ibalik Ο€;
    }

  • Para sa wikang C, ang isang bahagi ng mga bagong tampok na binuo sa loob ng pamantayan ng C2X ay ipinatupad (pinagana sa pamamagitan ng pagtukoy -std=c2x at -std=gnu2x): lumitaw ang suporta para sa syntax na "[[]]" para sa pagtukoy ng mga katangian tulad ng sa C++ (halimbawa, [[gnu ::const]], [[deprecated]], [[fallthrough]] at [[maybe_unused]]. Nagdagdag ng suporta para sa "u8" syntax para sa pagtukoy ng mga constant na may mga UTF-8 na character.
    Nagdagdag ng mga bagong macro sa . Nagdagdag ng "%OB" at "%Ob" na mga pamalit sa strftime.

  • Ang default na mode para sa C ay "-fno-common", na nagbibigay-daan para sa mas mahusay na pag-access sa mga pandaigdigang variable sa ilang mga platform.
  • Para sa C++, humigit-kumulang 16 na pagbabago at inobasyon ang ipinatupad, na binuo sa pamantayang C++20. Kasama ang idinagdag na keyword na "consinit"
    at ang suporta para sa mga extension ng template ay ipinatupad "ang konsepto". Binibigyang-daan ka ng mga konsepto na tukuyin ang isang hanay ng mga kinakailangan ng parameter ng template na, sa oras ng pag-compile, nililimitahan ang hanay ng mga argumento na maaaring tanggapin bilang mga parameter ng template. Maaaring gamitin ang mga konsepto upang maiwasan ang mga lohikal na hindi pagkakapare-pareho sa pagitan ng mga katangian ng mga uri ng data na ginamit sa loob ng template at mga katangian ng uri ng data ng mga parameter ng input.

  • Nagbibigay ang G++ ng pagtuklas ng hindi natukoy na gawi na dulot ng pagbabago ng mga pare-parehong bagay sa pamamagitan ng constexpr. Nabawasan ang pagkonsumo ng memorya ng compiler kapag kinakalkula ang constexpr. Nagdagdag ng mga bagong babala na "-Wmismatched-tags" at "-Wredundant-tags".
  • Ang mga bagong opsyon sa command line ay iminungkahi:
    • "-fallocation-dce" upang alisin ang mga hindi kinakailangang pares ng "bago" at "tanggalin" na mga operator.
    • "-fprofile-partial-training" para i-disable ang size optimization para sa code na walang training run.
    • "-fprofile-reproducible upang kontrolin ang antas ng reproducibility ng profile.
    • "-fprofile-prefix-path" para tukuyin ang base source build directory na ginagamit para sa hiwalay na pagbuo ng profile (para sa "-fprofile-generate=profile_dir" at "-fprofile-use=profile_dir").
  • Sa text ng babala para sa mga nabanggit na opsyon, mayroong mga hyperlink na nagbibigay-daan sa iyong pumunta sa dokumentasyon para sa mga opsyong ito. Ang pagpapalit ng URL ay kinokontrol gamit ang opsyong "-fdiagnostics-urls".
  • Nagdagdag ng preprocessor operator "__may_builtin", na maaaring magamit upang suriin ang mga built-in na function.
  • Nagdagdag ng bagong built-in na function na "__builtin_roundeven" na may pagpapatupad ng rounding function na tinukoy sa ISO/IEC TS 18661 na detalye, katulad ng "round", ngunit ang rounding na bahagi ay mas malaki sa 0.5 pataas (sa mas malaking halaga), mas mababa sa 0.5 - pababa (sa zero), at katumbas ng 0.5 - simula sa parity ng penultimate digit.
  • Para sa arkitektura ng AArch64, idinagdag ang suporta para sa extension ng SVE2 at napabuti ang suporta para sa SVE (Scalable Vector Extension), kabilang ang karagdagang suporta para sa mga built-in na function at uri ng SVE ACLE, at ang paggamit ng vectorization. Ang suporta para sa LSE (Large System Extension) at TME (Transactional Memory Extension) ay pinalawak. Nagdagdag ng mga bagong tagubilin na iminungkahi sa Armv8.5-A at Armv8.6-A, kabilang ang mga tagubilin para sa random na pagbuo ng numero, pag-ikot, pag-binding ng memory tag,
    bfloat16 at matrix multiplication. Nagdagdag ng suporta sa processor
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 at
    Marvell ThunderX3.

  • Nagdagdag ng suporta para sa ABI FDPIC (32-bit function pointer) para sa ARM64. Muling idinisenyo at na-optimize na pagproseso ng 64-bit integer operations. Nagdagdag ng suporta sa CPU
    Arm Cortex-A77,
    Arm Cortex-A76AE at
    Arm Cortex-M35P. Pinalawak na suporta para sa mga tagubilin sa pagpoproseso ng data ng ACLE, kabilang ang 32-bit SIMD, 16-bit multiplication, latch arithmetic, at iba pang DSP algorithm optimizations. Nagdagdag ng pang-eksperimentong suporta para sa mga tagubilin ng ACLE CDE (Custom Datapath Extension).

  • Kapansin-pansing pinahusay ang pagbuo ng code at vectorization sa backend para sa mga AMD GPU batay sa GCN microarchitecture.
  • Nagdagdag ng suporta para sa mga device na tulad ng XMEGA para sa arkitektura ng AVR
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208 3209, ATmega4808 at ATmega4809.

  • Isang bagong Intel ENQCMD instruction set architecture extension (-menqcmd) ay idinagdag para sa IA-32/x86-64 architecture. Idinagdag na suporta para sa Intel Cooperlake (-march=cooperlake, kasama ang AVX512BF16 ISA extension) at Tigerlake (-march=tigerlake, kasama ang MOVDIRI, MOVDIR64B at AVX512VP2INTERSECT ISA extension) na mga CPU.
  • Ang pagpapatupad ng HSAIL (Heterogeneous System Architecture Intermediate Language) para sa mga heterogenous na computing system na batay sa HSA architecture ay hindi na ginagamit at malamang na maalis sa isang release sa hinaharap.

Pinagmulan: opennet.ru

Magdagdag ng komento