Paglabas ng GCC 11 compiler suite

Pagkatapos ng isang taon ng pag-unlad, inilabas ang libreng GCC 11.1 compiler suite, ang unang makabuluhang release sa bagong sangay ng GCC 11.x. Sa ilalim ng bagong release numbering scheme, ang bersyon 11.0 ay ginamit sa panahon ng pag-develop, at ilang sandali bago ang release ng GCC 11.1, ang GCC 12.0 branch ay na-forked na, kung saan ang susunod na makabuluhang release ng GCC 12.1 ay bubuo.

Ang GCC 11.1 ay kapansin-pansin sa paglipat nito sa paggamit ng DWARF 5 debug file format bilang default, ang default na pagsasama ng C++17 standard (β€œ-std=gnu++17”), makabuluhang mga pagpapabuti sa suporta para sa C++20 standard, pang-eksperimentong suporta para sa C++23, mga pagpapahusay na nauugnay sa hinaharap na pamantayan ng wikang C (C2x), mga bagong pag-optimize ng pagganap.

Pangunahing pagbabago:

  • Ang default na mode para sa wikang C++ ay inilipat upang gamitin ang pamantayang C++17 (-std=gnu++17) sa halip na ang dating inaalok na C++14. Posibleng piliing i-disable ang bagong C++17 na gawi kapag nagpoproseso ng mga template na gumagamit ng iba pang mga template bilang parameter (-fno-new-ttp-matching).
  • Idinagdag ang suporta para sa pagpapabilis ng hardware ng tool na AddressSanitizer, na nagbibigay-daan sa iyong matukoy ang mga katotohanan ng pag-access sa mga nabakanteng lugar ng memorya, paglampas sa mga hangganan ng inilalaang buffer, at ilang iba pang mga uri ng mga error kapag nagtatrabaho sa memorya. Kasalukuyang available lang ang hardware acceleration para sa AArch64 architecture at nakatutok sa paggamit kapag kino-compile ang Linux kernel. Upang paganahin ang AddressSanitizer hardware acceleration kapag bumubuo ng mga bahagi ng espasyo ng user, ang flag na "-fsanitize=hwaddress" ay idinagdag, at ang kernel na flag na "-fsanitize=kernel-hwaddress".
  • Kapag bumubuo ng impormasyon sa pag-debug, ang format na DWARF 5 ay ginagamit bilang default, na, kumpara sa mga nakaraang bersyon, ay nagbibigay-daan sa pagbuo ng 25% na mas compact na data ng pag-debug. Ang buong suporta para sa DWARF 5 ay nangangailangan ng hindi bababa sa mga binutil na bersyon 2.35.2. Ang format na DWARF 5 ay suportado sa mga tool sa pag-debug mula noong GDB 8.0, valgrind 3.17.0, elfutils 0.172 at dwz 0.14. Upang bumuo ng mga debug file gamit ang iba pang mga bersyon ng DWARF, maaari mong gamitin ang mga opsyon na "-gdwarf-2", "-gdwarf-3" at "-gdwarf-4".
  • Ang mga kinakailangan para sa mga compiler na maaaring magamit sa pagbuo ng GCC ay nadagdagan. Ang compiler ay dapat na ngayong suportahan ang C++11 standard (dating C++98 ay kinakailangan), i.e. Kung sapat na ang GCC 10 para buuin ang GCC 3.4, kinakailangan na ngayon ang hindi bababa sa GCC 11 para buuin ang GCC 4.8.
  • Ang pangalan at lokasyon ng mga file para sa pag-save ng mga dump, pansamantalang mga file at karagdagang impormasyon na kinakailangan para sa pag-optimize ng LTO ay binago. Ang ganitong mga file ay palaging naka-save sa kasalukuyang direktoryo maliban kung ang landas ay tahasang binago sa pamamagitan ng "-dumpbase", "-dumpdir" at "-save-temps=*" na mga opsyon.
  • Ang suporta para sa binary na format na BRIG para gamitin sa HSAIL (Heterogenous System Architecture Intermediate Language) na wika ay hindi na ginagamit at malapit nang alisin.
  • Ang mga kakayahan ng ThreadSanitizer mode (-fsanitize=thread) ay pinalawak, na idinisenyo upang makita ang mga kondisyon ng lahi kapag nagbabahagi ng parehong data mula sa iba't ibang mga thread ng isang multi-threaded na application. Ang bagong release ay nagdaragdag ng suporta para sa mga alternatibong runtime at environment, pati na rin ang suporta para sa KCSAN (Kernel Concurrency Sanitizer) na tool sa pag-debug, na idinisenyo upang dynamic na makita ang mga kondisyon ng lahi sa loob ng Linux kernel. Nagdagdag ng mga bagong opsyon na "-param tsan-distinguish-volatile" at "-param tsan-instrument-func-entry-exit".
  • Ang mga numero ng column sa mga diagnostic na mensahe ay hindi na sumasalamin sa bilang ng byte mula sa simula ng linya, ngunit ang aktwal na mga numero ng column na isinasaalang-alang ang mga multi-byte na character at mga character na sumasakop sa ilang mga posisyon sa linya (halimbawa, ang character na πŸ™‚ ay sumasakop sa dalawang posisyon at ay naka-encode sa 4 bytes). Gayundin, ang mga character sa tab ay itinuturing na ngayon bilang isang tiyak na bilang ng mga puwang (mako-configure sa pamamagitan ng opsyong -ftabstop, default 8). Upang ibalik ang lumang gawi, ang opsyong β€œ-fdiagnostics-column-unit=byte” ay iminungkahi, at upang matukoy ang paunang halaga (pagnunumero mula 0 o 1) - ang opsyong β€œ-fdiagnostics-column-origin=”.
  • Isinasaalang-alang ng vectorizer ang buong nilalaman ng function at nagdaragdag ng mga kakayahan sa pagproseso na nauugnay sa mga intersection at mga sanggunian sa mga nakaraang bloke sa control-flow graph (CFG, control-flow graph).
  • Ipinapatupad ng optimizer ang kakayahang mag-convert ng isang serye ng mga conditional operation na naghahambing sa parehong variable sa isang switch expression. Sa hinaharap, ang switch expression ay maaaring i-encode gamit ang bit testing na mga tagubilin (ang "-fbit-tests" na opsyon ay idinagdag upang kontrolin ang naturang conversion).
  • Mga pinahusay na interprocedural optimization. Nagdagdag ng bagong IPA-modref pass (-fipa-modref) para subaybayan ang mga side effect kapag tumatawag sa mga function at pagbutihin ang katumpakan ng pagsusuri. Pinahusay na pagpapatupad ng IPA-ICF pass (-fipa-icf), na binabawasan ang pagkonsumo ng memory sa panahon ng compilation at pinatataas ang bilang ng mga pinag-isang function kung saan pinagsama-sama ang magkaparehong mga bloke ng code. Sa pass ng IPA-CP (Interprocedural constant propagation), ang prediction heuristics ay napabuti, na isinasaalang-alang ang mga kilalang hangganan at tampok ng mga loop.
  • Sa Linking Time Optimizations (LTO), ang format ng bytecode ay na-optimize upang bawasan ang laki at pahusayin ang bilis ng pagproseso. Nabawasan ang peak memory consumption sa panahon ng binding phase.
  • Sa mekanismo ng pag-optimize batay sa mga resulta ng code profiling (PGO - Profile-guided optimization), na nagbibigay-daan sa pagbuo ng mas pinakamainam na code batay sa pagsusuri ng mga feature ng execution, ang laki ng mga file na may data ng GCOV ay nababawasan dahil sa mas compact na packaging ng mga zero counter . Pinahusay na "-fprofile-values" mode sa pamamagitan ng pagsubaybay sa higit pang mga parameter sa mga hindi direktang tawag.
  • Ang pagpapatupad ng pamantayang OpenMP 5.0 (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 may patuloy. Nagdagdag ng paunang suporta para sa paglalaan ng direktiba at ang kakayahang gumamit ng magkakaibang mga loop sa mga konstruksyon ng OpenMP. Ipinatupad ang suporta para sa OMP_TARGET_OFFLOAD na variable ng kapaligiran.
  • Ang pagpapatupad ng OpenACC 2.6 parallel programming specification na ibinigay para sa C, C++ at Fortran na mga wika ay napabuti, na tumutukoy sa mga tool para sa pag-offload ng mga operasyon sa mga GPU at dalubhasang processor, tulad ng NVIDIA PTX.
  • Para sa mga wikang C, isang bagong attribute na "no_stack_protector" ay ipinatupad, na idinisenyo upang markahan ang mga function kung saan ang stack protection ay hindi dapat paganahin ("-fstack-protector"). Ang katangiang "malloc" ay pinalawak upang suportahan ang pagkakakilanlan ng mga pares ng mga tawag para sa paglalaan at pagpapalaya ng memorya (allocator/deallocator), na ginagamit sa static na analyzer upang tukuyin ang mga tipikal na error sa pagtatrabaho sa memory (mga pagtagas ng memorya, paggamit pagkatapos ng pagpapalaya, dobleng tawag sa libreng function, atbp.) at sa mga babala ng compiler na "-Wmismatched-dealloc", "-Wmismatched-new-delete" at "-Wfree-nonheap-object", na nagpapaalam tungkol sa hindi pagkakapare-pareho sa pagitan ng memory deallocation at memory allocation operations.
  • Ang mga bagong babala ay naidagdag para sa wikang C:
    • "-Wmismatched-dealloc" (pinagana bilang default) - nagbabala tungkol sa mga pagpapatakbo ng memory deallocation na gumagamit ng pointer na hindi tugma sa mga function ng memory allocation.
    • "-Wsizeof-array-div" (pinagana kapag ang "-Wall" ay tinukoy) - Nagbabala tungkol sa paghahati ng dalawang sukat ng mga operator kung ang divisor ay hindi tumutugma sa laki ng elemento ng array.
    • "-Wstringop-overread" (pinagana bilang default) - nagbabala tungkol sa pagtawag sa isang string function na nagbabasa ng data mula sa isang lugar sa labas ng hangganan ng array.
    • "-Wtsan" (pinagana bilang default) - Nagbabala tungkol sa paggamit ng mga feature (tulad ng std::atomic_thread_fence) na hindi sinusuportahan sa ThreadSanitizer.
    • "-Warray-parameter" at "-Wvla-parameter" (naka-enable kapag tinutukoy ang "-Wall") - nagbabala tungkol sa mga overriding na function na may mga hindi tugmang deklarasyon ng mga argumento na nauugnay sa fixed- at variable-length arrays.
    • Nakikita na ngayon ng babala na "-Wuninitialized" ang mga pagtatangka na magbasa mula sa hindi nasimulang dynamically allocated memory.
    • Ang babala na "-Wfree-nonheap-object" ay nagpapalawak ng kahulugan ng mga kaso kung saan ang mga function ng memory deallocation ay tinatawag na may pointer na hindi nakuha sa pamamagitan ng dynamic na memory allocation function.
    • Ang babala na "-Wmaybe-uninitialized" ay nagpalawak ng pagtuklas ng mga pagpasa ng mga pointer sa mga function na tumutukoy sa hindi nasimulang mga lokasyon ng memorya.
  • Para sa wikang C, ang isang bahagi ng mga bagong feature na binuo sa loob ng balangkas ng pamantayan ng C2X ay ipinatupad (pinagana sa pamamagitan ng pagtukoy -std=c2x at -std=gnu2x): mga macro BOOL_MAX at BOOL_WIDTH, opsyonal na indikasyon ng mga pangalan ng hindi nagamit na mga parameter sa function mga kahulugan (tulad ng sa C++), attribute na β€œ[ [nodiscard]]", preprocessor operator "__has_c_attribute", macros FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_60559, FLT_IS_IEC_XNUMX, DBL_IS_IEC_XNUMX. NAN, DEC_INFINITY at DEC _NAN, NaN=macros para sa FloatN, _FloatNx at _DecimalN, kakayahang tukuyin ang mga jump mark bago ang mga deklarasyon at sa dulo ng tambalang pahayag.
  • Para sa C++, ang isang bahagi ng mga pagbabago at inobasyon na iminungkahi sa pamantayan ng C++20 ay ipinatupad, kabilang ang mga virtual na function na "consteval virtual", pseudo-destructors para sa pagtatapos ng ikot ng buhay ng mga bagay, ang paggamit ng enum class at pagkalkula ng laki ng isang array sa "bagong" expression.
  • Para sa C++, ang pang-eksperimentong suporta ay idinagdag para sa ilang mga pagpapahusay na binuo para sa hinaharap na pamantayan ng C++23 (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Halimbawa, mayroon na ngayong suporta para sa literal na suffix na "zu" para sa mga nilagdaang size_t na halaga.
  • Pinahusay ng libstdc++ ang suporta para sa pamantayang C++17, kabilang ang pagpapakilala ng mga pagpapatupad ng std::from_chars at std::to_chars para sa mga uri ng floating point. Ipinatupad ang mga bagong elemento ng pamantayan ng C++20, kabilang ang std::bit_cast, std::source_location, atomic operations wait and notify, , , , , pati na rin ang mga elemento ng hinaharap na pamantayan ng C++ 23 (std::to_underlying, std::is_scoped_enum). Nagdagdag ng pang-eksperimentong suporta para sa mga uri para sa parallel data processing (SIMD, Data-Parallel Types). Ang pagpapatupad ng std::uniform_int_distribution ay pinabilis.
  • Inalis ang alpha quality flag mula sa libgccjit, isang shared library para sa pag-embed ng code generator sa iba pang mga proseso at paggamit nito upang ayusin ang JIT compilation ng bytecode sa machine code. Nagdagdag ng kakayahang bumuo ng libgccjit para sa MinGW.
  • Nagdagdag ng suporta para sa arkitektura ng AArch64 Armv8-R (-march=armv8-r). Para sa mga arkitektura ng AArch64 at ARM, idinagdag ang suporta para sa mga processor (mga parameter -mcpu at -mtune): Arm Cortex-A78 (cortex-a78), Arm Cortex-A78AE (cortex-a78ae), Arm Cortex-A78C (cortex-a78c) , Arm Cortex- X1 (cortex-x1), Arm Neoverse V1 (neoverse-v1) at Arm Neoverse N2 (neoverse-n2). Ang mga Fujitsu A64FX (a64fx) at Arm Cortex-R82 (cortex-r82) na mga CPU ay naidagdag din, na sumusuporta lamang sa arkitektura ng AArch64.
  • Nagdagdag ng suporta para sa paggamit ng Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) at MVE (AArch32 M-profile) na mga tagubilin sa SIMD upang i-autovectorize ang mga operasyong nagsasagawa ng pagdaragdag, pagbabawas, pagpaparami at mga variant ng pagdaragdag/pagbabawas. kumplikadong mga numero. Nagdagdag ng paunang suporta para sa autovectorization para sa ARM gamit ang set ng pagtuturo ng MVE.
  • Para sa mga ARM platform, isang buong set ng compiler-integrated C function (Intrinsics) ang ibinibigay, na pinalitan ng extended vector instructions (SIMD), na sumasaklaw sa lahat ng NEON na tagubilin na nakadokumento sa ACLE Q3 2020 na detalye.
  • Ang suporta para sa gfx908 GPU ay idinagdag sa backend para sa pagbuo ng code para sa mga AMD GPU batay sa GCN microarchitecture.
  • Nagdagdag ng suporta para sa mga bagong processor at mga bagong extension ng set ng pagtuturo na ipinatupad sa mga ito:
    • Ang Intel Sapphire Rapids (-march=sapphirerapids, ay nagbibigay-daan sa suporta para sa MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-BF-VN na pagtuturo
    • Intel Alderlake (-march=alderlake, nagbibigay-daan sa suporta para sa CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI at HRESET na mga tagubilin).
    • Intel Rocketlake (-march=rocketlake, katulad ng Rocket Lake na walang suporta sa SGX).
    • AMD Zen 3 (-march=znver3).
  • Para sa mga sistema ng IA-32/x86-64 na batay sa mga processor ng Intel, idinagdag ang suporta para sa mga bagong tagubilin ng processor TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI.
  • Nagdagdag ng suporta para sa mga flag na "-march=x86-64-v[234]" para pumili ng mga antas ng arkitektura ng x86-64 (v2 - sumasaklaw sa mga extension ng SSE4.2, SSSE3, POPCNT at CMPXCHG16B; v3 - AVX2 at MOVBE; v4 - AVX-512 ).
  • Nagdagdag ng suporta para sa RISC-V system na may big-endian byte order. Idinagdag ang "-misa-spec=*" na opsyon para piliin ang bersyon ng RISC-V instruction set architecture specification. Nagdagdag ng suporta para sa AddressSanitizer at proteksyon ng stack gamit ang mga canary tag.
  • Patuloy na pagpapabuti ng "-fanalyzer" static analysis mode, na nagsasagawa ng resource-intensive interprocedural analysis ng mga path execution ng code at mga daloy ng data sa 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. Sa bagong bersyon:
    • Ang code para sa pagsubaybay sa estado ng programa ay ganap na muling naisulat. Ang mga problema sa pag-scan ng napakalaking C file ay nalutas na.
    • Nagdagdag ng paunang suporta sa C++.
    • Ang paglalaan ng memorya at pagtatasa ng deallocation ay na-abstract mula sa mga partikular na malloc at libreng function, at ngayon ay sumusuporta sa bago/tanggal at bagong[]/tanggal [].
    • Nagdagdag ng mga bagong babala: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const at -Wanalyzer-write-to-string-literal.
    • Nagdagdag ng mga bagong opsyon sa pag-debug -fdump-analyzer-json at -fno-analyzer-feasibility.
    • Naipatupad na ang kakayahang palawigin ang analyzer sa pamamagitan ng mga plugin para sa GCC (halimbawa, isang plugin ang inihanda upang suriin ang maling paggamit ng global locking (GIL) sa CPython).

Pinagmulan: opennet.ru

Magdagdag ng komento